SpringBootとVue.js/uniappを基盤とした多機能倉庫管理システムの設計と構築

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='認証トークン管理';
    

タグ: SpringBoot vue.js UniApp MyBatis-Plus Java

10月25日 16:12 投稿