1. システムアーキテクチャの概要
本システムは、効率的な在庫管理を実現するために、堅牢なバックエンド、リアクティブなWebフロントエンド、およびクロスプラットフォーム対応のモバイルアプリケーションを組み合わせた多階層アーキテクチャを採用しています。
バックエンド:Spring Boot
サーバーサイドにはSpring Bootを採用し、Tomcatの内蔵サーバーを利用することでデプロイの簡素化を図っています。オートコンフィグレーション機能を活用し、設定ファイルの記述を最小限に抑えつつ、Spring SecurityやSpring Dataといった強力なエコシステムと統合しています。これにより、拡張性と保守性の高いRESTful APIを提供します。
フロントエンド:Vue.js と uniapp
PCブラウザ向けの管理画面はVue.jsで構築され、仮想DOMによる高速なUI更新とコンポーネントベースの開発を実現しています。一方、現場での操作を想定したモバイル端末向けにはuniappを採用しました。一つのコードベースからiOS、Android、そして各種ミニプログラムへの出力が可能であり、開発コストを抑えつつ現場の機動力向上を支援します。
データアクセス:MyBatis-Plus
ORMレイヤーにはMyBatis-Plusを導入しています。標準的なCRUD処理を自動化し、SQLの記述量を大幅に削減することで、ビジネスロジックの開発に集中できる環境を整えています。また、ページネーションや動的クエリの生成も容易であり、大量の在庫データを効率的に処理できます。
2. システムテストと品質保証
システムの信頼性を確保するため、機能テストを中心に多角的な検証を実施しました。特にユーザー体験に直結するログイン処理や権限管理については、詳細なテストケースを設定しています。
機能テストケース:認証処理
| 入力データ | 期待される動作 | 実際の結果 |
|---|---|---|
| 正しいID、正しいパスワード | ログイン成功、管理画面へ遷移 | 正常終了 |
| 誤ったパスワード | エラーメッセージ「認証失敗」を表示 | 正常終了 |
| 存在しないユーザーID | エラーメッセージ「アカウントが存在しません」を表示 | 正常終了 |
ユーザー管理の検証
新規ユーザーの登録、情報の更新、および削除機能において、データベースとの整合性が保たれているかを確認しました。特に、重複するユーザー名の登録禁止や、必須項目のバリデーションチェックが仕様通りに動作することを検証済みです。
3. 主要機能の実装コード
以下に、認証処理およびトークン管理のコアロジックを示します。従来の方式を改良し、Java 8以降のLocalDateTimeを活用したモダンな実装としています。
// 認証コントローラー
@RestController
@RequestMapping("/auth")
public class AuthenticationController {
@Autowired
private AccountService accountService;
@Autowired
private SessionTokenService tokenService;
@PostMapping("/executeLogin")
public ResultResponse login(@RequestBody LoginRequest loginRequest) {
AccountInfo account = accountService.selectByUsername(loginRequest.getUserName());
if (account == null || !account.getCredential().equals(loginRequest.getPassword())) {
return ResultResponse.error("ユーザー名またはパスワードが正しくありません。");
}
// トークンの生成と保存
String sessionToken = tokenService.createSessionToken(account.getGuid(), account.getUserName(), account.getAccessLevel());
return ResultResponse.success().put("x-auth-token", sessionToken);
}
}
// トークン生成ロジック
@Service
public class SessionTokenServiceImpl implements SessionTokenService {
@Override
public String createSessionToken(Long userId, String name, String role) {
String secureToken = UUID.randomUUID().toString().replace("-", "");
LocalDateTime expiryDate = LocalDateTime.now().plusHours(2);
TokenRecord existingToken = this.selectOne(new QueryWrapper<TokenRecord>().eq("user_id", userId));
if (existingToken != null) {
existingToken.setTokenString(secureToken);
existingToken.setDeadline(expiryDate);
this.updateById(existingToken);
} else {
TokenRecord newToken = new TokenRecord(userId, name, secureToken, expiryDate, role);
this.insert(newToken);
}
return secureToken;
}
}
4. データベース設計(認証基盤)
セッション管理に使用するトークン保持用テーブルの定義です。セキュリティ向上のため、有効期限(deadline)を設定し、定期的なクリーンアップが可能な構造にしています。
-- トークン管理テーブル
CREATE TABLE `sys_session_token` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`user_id` bigint(20) NOT NULL COMMENT 'ユーザー識別子',
`username` varchar(100) NOT NULL COMMENT 'ログイン名',
`token_string` varchar(255) NOT NULL COMMENT 'アクセストークン',
`user_role` varchar(50) DEFAULT NULL COMMENT '権限ロール',
`created_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '発行日時',
`deadline` datetime NOT NULL COMMENT '有効期限',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='認証トークン管理';