backend)mvn clean packagemvn testmvn -Dtest=ApprovalApplicationServiceTest testmvn -Dtest=ApprovalApplicationServiceTest#handleActionApprovePublishesApprovedEventWhenFlowCompletes testmvn spring-boot:runmvn spring-boot:run -Dspring-boot.run.profiles=localfrontend-admin)npm installnpm run devnpm run buildnpm run previewfrontend-h5)npm installnpm run devnpm run buildnpm run previewyuyueMiniProgram)pnpm installpnpm dev:mp-weixinpnpm dev:h5pnpm build:mp-weixinpnpm build:h5pnpm type-checkpnpm lintpnpm lint:fixpnpm alova-genbackend: Spring Boot 3 modular monolith for admin APIs and mini-program APIsfrontend-admin: Vue 3 + Vite admin consolefrontend-h5: separate Vite/Vue H5 clientyuyueMiniProgram: separate uni-app/Wot UI client with its own toolchain and conventionsThe backend is organized around Controller -> ApplicationService -> Mapper/Mapper XML:
*ApplicationServicesrc/main/resources/mapper/*.xmlThe core backend business flow is reservation and approval orchestration:
MiniAppointmentApplicationService creates reservationsApprovalEngineService resolves approval node chains, assignees, and task transitionsApprovalApplicationService and MiniHandlerApprovalApplicationService process approvalsAppointmentLifecycleEventListenerPostApprovalOrchestrationService performs post-approval work such as QR-code generation and notificationsThere are two auth systems sharing the Authorization header but not the same login/session logic:
StpUtil with /api/auth/**StpLogic("mini") via /api/mini/**mp_user, not sys_userBackend responses use a uniform Result envelope. Admin and mini-program clients both expect that wrapper rather than raw DTOs.
Backend persistence has a few important cross-cutting behaviors:
BaseEntity with id, uuid, version, audit fields, and delFlagMybatisPlusConfig auto-fills uuid, timestamps, default version, and default delFlagAppointmentOrderMapper.xml, ApprovalTaskMapper.xml) instead of only wrapper queriesbackend/src/main/resources/db/migration/ are applied manually in version order; the app is not set up to auto-run themThe admin frontend is permission-driven:
src/router/index.ts uses route meta.permissionsrc/stores/auth.ts persists token/display info/permissions in localStoragepagePermissionOrdersrc/api/http.ts injects the token and expects backend Result semantics for auth/error handlingThe admin login flow is coupled across frontend and backend:
frontend-admin/src/utils/loginCrypto.ts AES-encrypts username/password with a timestampbackend/.../AdminLoginCryptoService.java decrypts and validates the same payloadVITE_ADMIN_LOGIN_AES_* and backend security.admin-login-crypto.* alignedThe uni-app client is a separate application, not just a skin on the admin frontend:
src/pages and src/layoutssrc/storesrc/apiDo not inject Mapper directly into controllers. This repository expects business logic in *ApplicationService.
Preserve the dual-auth split. Admin and mini-program endpoints may both read Authorization, but they are validated by different Sa-Token logics and should not be merged casually.
When updating existing backend entities, keep uuid and version in mind. BaseEntity validation groups and optimistic locking assume updates carry the current record identity/version.
Use the existing async executors for new async work. The backend now has named thread pools in AsyncConfig:
applicationTaskExecutor for general async/event/logging workexportTaskExecutor for export jobsFor admin list pages, check mapper XML before rewriting queries in Java. Pagination, approval-status filtering, and visitor keyword filtering are already encoded in XML mappers.
If you add or rename admin pages, update both routing and permission fallbacks. pagePermissionOrder and each route's meta.permission must stay aligned with backend permission codes.
Keep admin HTTP calls compatible with the Result wrapper. The axios layer treats code === 401 and success === false specially.
Do not bypass admin login encryption. Changes to login requests usually require coordinated edits in both loginCrypto.ts and AdminLoginCryptoService.
For the uni-app app, follow the local project rules rather than the admin frontend style.
pnpm, not npmsrc/store and src/apiuni.showToastCurrent local ports are code-driven, not README-driven.
8880 (application.yml)frontend-admin proxies /api and /uploads to http://localhost:8880