Two independent subsystems in one repo:
crm/ — Smart campus management (CRM / 智慧校园)
crm/backend/ — Java 17+ backend, RuoYi-Vue-Plus 5.4.0 (Spring Boot 3.4.6, MyBatis-Plus, Sa-Token)crm/web/ — Vue 3 + TypeScript + Element Plus + Vite admin frontendcrm/py-backend/ — Python FastAPI auxiliary servicebx/ — Expense reimbursement system (报销系统)
bx/bx-backend/ — Python >=3.11, FastAPI + SQLAlchemy + Alembicbx/bx-web/ — Vue 3 + TypeScript + Vite admin frontendbx/bx-mobile/ — Vue 3 + Vant 4 mobile frontendDo not assume web/ or backend/ exist at repo root — they are always under crm/ or bx/.
crm/backend/)# Hot-start (dev, default profile: dev, port 8080)
./hot-start.sh
# Multi-service start
./start-all.sh # all services
./start-main.sh # main app only
./start-job.sh # job scheduler
./start-monitor.sh # monitor admin
# Maven (tests skipped by default via <skipTests>true</skipTests>)
mvn -DskipTests validate
mvn -DskipTests package
Entry class: ruoyi-admin/src/main/java/org/dromara/DromaraApplication.java
crm/web/)npm run dev # Vite dev server
npm run build:prod # production build (8 GB heap)
npm run lint:eslint # ESLint check
npm run lint:eslint:fix # ESLint auto-fix
npm run prettier # format all files
bx/bx-backend/)# Dev (uses .venv)
./start.sh
# Prod
./start_prod.sh
# Tests
python run_tests.py
python run_e2e_tests.py
bx/bx-web/)npm run dev # Vite dev server
npm run build # vue-tsc typecheck + vite build
npm run build:prod:fast # vite build only (no typecheck)
bx/bx-mobile/)npm run dev
npm run build # vue-tsc --noEmit + vite build
Multi-module Maven project under crm/backend/:
| Module | Purpose |
|---|---|
ruoyi-admin |
App entrypoint, Spring Boot main |
ruoyi-common/ |
Shared libs (core, mybatis, redis, satoken, web, excel, etc.) |
ruoyi-modules/ruoyi-xg |
学工管理 — primary business module |
ruoyi-modules/ruoyi-crm |
CRM business |
ruoyi-modules/ruoyi-system |
System management |
ruoyi-modules/ruoyi-workflow |
Workflow (Warm-Flow engine) |
ruoyi-modules/ruoyi-job |
Scheduled tasks (SnailJob) |
ruoyi-extend/ |
Monitor admin, SnailJob server |
controller/ → REST endpoints (@SaCheckPermission, @Log, @RepeatSubmit)
service/ → IXgXxxService interface
impl/ → XgXxxServiceImpl (uses LambdaQueryWrapper, MapstructUtils.convert)
mapper/ → extends BaseMapperPlus<Entity, Vo> (not plain BaseMapper)
domain/ → Entity (@TableName, extends TenantEntity, @TableId ASSIGN_ID, @TableLogic)
bo/ → BO (extends BaseEntity, @AutoMapper, validation groups: AddGroup/EditGroup)
vo/ → VO (@AutoMapper, @ExcelProperty for export)
module:entity:action (e.g., xg:student:list)xg module prefixed xg_@TableId(type = IdType.ASSIGN_ID)) and logical delete (@TableLogic)MapstructUtils.convert(source, Target.class) — not manual settersPageQuery in, TableDataInfo<T> out; use baseMapper.selectVoPage()ExcelUtil.exportExcel(list, title, VoClass, response)@Validated(AddGroup.class) / @Validated(EditGroup.class) on controller methodsAuto-import is enabled via unplugin-auto-import — ref, reactive, onMounted, computed, watch, nextTick, toRefs, useRouter, useRoute, etc. are available without explicit import.
Common framework utilities (auto-provided via proxy or global):
useDict('dict_type') — load dictionary datav-hasPermi="['xg:xxx:add']" — button permission directiveproxy?.$modal.msgSuccess() / proxy?.$modal.confirm() — message dialogsproxy?.$download(url, params, filename) — file export downloadparseTime(date) — date formatting<dict-tag :options="dict" :value="val" /> — dictionary display<pagination> / <right-toolbar> — standard table pagination & toolbar componentsAPI files go in src/api/xg/ (or src/api/crm/), pages in src/views/xg/ (or src/views/crm/). Routes are configured via backend menu management — no manual frontend route files needed.
bx/bx-backend/app/
main.py → FastAPI app factory (create_app())
config.py → pydantic-settings
database.py → SQLAlchemy setup
models/ → SQLAlchemy models
schemas/ → Pydantic schemas
routers/ → API route modules (auth, user, role, expense_item, workflow, advance, reimburse, attachment, payment)
services/ → Business logic
utils/ → Shared utilities
Uses .venv/ (not managed by poetry/pipenv). Install: pip install -e ".[dev]".
BX web and mobile follow the Fresh Mint design system:
#10b981bx/docs/web-admin-ui-spec-fresh-mint.md and bx/docs/mobile-ui-spec-fresh-mint.mdbx/bx-web/src/ CSS and bx/bx-mobile/src/styles/index.css.cursorrules — comprehensive code generation templates (1387 lines), covers CRM backend/frontend patterns in detail including full code scaffolds. Consult it for exact boilerplate when generating new CRUD modules.