基于 Team A 需求规格(spec.md) 嵌入 Team A 关键信息
┌─────────────────────────────────────────────────────────────┐
│ 客户端层 │
├─────────────────────────┬───────────────────────────────────┤
│ 微信小程序 (wxapp) │ 后台管理系统 (wxbackstage) │
│ - 原生微信开发 │ - Vue 2 + Element UI │
│ - 面向四类用户 │ - 面向政府管理部门 │
└───────────┬─────────────┴───────────────┬───────────────────┘
│ │
▼ ▼
┌─────────────────────────────────────────────────────────────┐
│ API 网关层 │
│ - JWT Token 认证 │
│ - 权限拦截器(RBAC) │
│ - 接口路径:/api/wx/* (小程序) /api/admin/* (后台) │
└───────────────────────────┬─────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 业务逻辑层 │
├──────────┬──────────┬──────────┬──────────┬────────────────┤
│ 用户模块 │ 系统模块 │ 审核模块 │ 首页模块 │ 通用模块 │
│ AuthService│ SysService│ AuditService│ HomeService│ CommonService│
└──────┬───┴──────┬───┴──────┬───┴──────┬───┴────────┬───────┘
│ │ │ │ │
▼ ▼ ▼ ▼ ▼
┌─────────────────────────────────────────────────────────────┐
│ 数据访问层 │
│ - MyBatis XML 映射 │
│ - Mapper 接口 │
└───────────────────────────┬─────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 数据存储层 │
├─────────────────────────┬───────────────────────────────────┤
│ MySQL (crrc 库) │ Redis (缓存) │
│ - 15 张业务表 │ - Token 黑名单 │
│ - AES 加密字段 │ - 验证码缓存 │
│ - SHA256 哈希索引 │ - 数据大屏统计 │
└─────────────────────────┴───────────────────────────────────┘
| 模块 | 包名 | 职责 |
|---|---|---|
| 用户模块 | com.fenzhitech.crrc.service | 用户认证、身份管理、权限控制 |
| 系统模块 | com.fenzhitech.crrc.service | 角色管理、账号管理、字典管理、操作日志 |
| 审核模块 | com.fenzhitech.crrc.service | 审核流程、审核列表、审核日志 |
| 首页模块 | com.fenzhitech.crrc.service | 首页数据、行情展示 |
| 通用模块 | com.fenzhitech.crrc.util | 工具类、常量、异常处理 |
Controller 层(API 入口)
↓
Service 层(业务逻辑)
↓
Mapper 层(数据访问)
↓
Entity/DTO/VO 层(数据模型)
职责划分:
sys_user (用户基础表)
│
├── 1:N ──→ user_identity (身份关联表)
│ │
│ ├── 1:1 ──→ grower_profile (果农档案)
│ ├── 1:1 ──→ worker_profile (工人档案)
│ ├── 1:1 ──→ buyer_profile (客商档案)
│ └── 1:1 ──→ supplier_shop (农资店铺)
│
└── 1:N ──→ operation_log (操作日志)
audit_log (审核日志)
│
└── 关联 → user_identity
sys_role (角色表)
│
└── N:M ──→ sys_permission (权限表)
| 字段 | 类型 | 约束 | 说明 |
|---|---|---|---|
| id | BIGINT | PK, AUTO_INCREMENT | 用户ID |
| openid | VARCHAR(64) | UNIQUE, INDEX | 微信 openid |
| username | VARCHAR(50) | UNIQUE | 后台登录用户名 |
| password | VARCHAR(100) | BCrypt 加密密码 | |
| phone | VARCHAR(100) | AES 加密手机号 | |
| phone_hash | VARCHAR(64) | UNIQUE, INDEX | SHA256 手机号哈希 |
| real_name | VARCHAR(50) | 真实姓名 | |
| status | TINYINT | INDEX | 状态:0正常 1禁用 2锁定 |
| lock_reason | VARCHAR(200) | 锁定原因 | |
| login_fail_count | INT | 连续登录失败次数 | |
| lock_time | DATETIME | 锁定时间 | |
| created_at | DATETIME | 创建时间 | |
| updated_at | DATETIME | 更新时间 |
| 字段 | 类型 | 约束 | 说明 |
|---|---|---|---|
| id | BIGINT | PK, AUTO_INCREMENT | 身份ID |
| user_id | BIGINT | INDEX | 关联用户ID |
| identity_type | VARCHAR(20) | INDEX | 身份类型:GROWER/WORKER/BUYER/SUPPLIER |
| status | TINYINT | 状态:0正常 1禁用 | |
| created_at | DATETIME | 创建时间 |
| 字段 | 类型 | 约束 | 说明 |
|---|---|---|---|
| id | BIGINT | PK, AUTO_INCREMENT | 角色ID |
| role_name | VARCHAR(50) | UNIQUE | 角色名称 |
| role_code | VARCHAR(50) | UNIQUE | 角色编码 |
| description | VARCHAR(200) | 角色描述 | |
| status | TINYINT | 状态:0正常 1禁用 | |
| is_system | TINYINT | 是否系统预置:0否 1是 | |
| created_at | DATETIME | 创建时间 |
| 字段 | 类型 | 约束 | 说明 |
|---|---|---|---|
| id | BIGINT | PK, AUTO_INCREMENT | 权限ID |
| parent_id | BIGINT | 父权限ID | |
| perm_name | VARCHAR(50) | 权限名称 | |
| perm_code | VARCHAR(100) | UNIQUE | 权限编码 |
| perm_type | VARCHAR(20) | 类型:MENU/BUTTON | |
| path | VARCHAR(200) | 菜单路径 | |
| icon | VARCHAR(100) | 菜单图标 | |
| sort_order | INT | 排序号 | |
| status | TINYINT | 状态:0正常 1禁用 |
| 字段 | 类型 | 约束 | 说明 |
|---|---|---|---|
| id | BIGINT | PK, AUTO_INCREMENT | 主键 |
| role_id | BIGINT | INDEX | 角色ID |
| permission_id | BIGINT | INDEX | 权限ID |
| 字段 | 类型 | 约束 | 说明 |
|---|---|---|---|
| id | BIGINT | PK, AUTO_INCREMENT | 字典ID |
| dict_type | VARCHAR(50) | INDEX | 字典类型 |
| dict_code | VARCHAR(50) | UNIQUE | 字典编码 |
| dict_name | VARCHAR(100) | 字典名称 | |
| sort_order | INT | 排序号 | |
| is_system | TINYINT | 是否系统内置:0否 1是 | |
| status | TINYINT | 状态:0正常 1禁用 |
| 字段 | 类型 | 约束 | 说明 |
|---|---|---|---|
| id | BIGINT | PK, AUTO_INCREMENT | 日志ID |
| target_type | VARCHAR(50) | 审核对象类型 | |
| target_id | BIGINT | 审核对象ID | |
| operator_id | BIGINT | INDEX | 审核人ID |
| action | VARCHAR(20) | 审核动作:APPROVE/REJECT | |
| reason | VARCHAR(500) | 审核原因 | |
| created_at | DATETIME | 审核时间 |
| 字段 | 类型 | 约束 | 说明 |
|---|---|---|---|
| id | BIGINT | PK, AUTO_INCREMENT | 日志ID |
| operator_id | BIGINT | INDEX | 操作人ID |
| operator_name | VARCHAR(50) | 操作人姓名 | |
| operation_type | VARCHAR(50) | 操作类型 | |
| operation_module | VARCHAR(50) | 操作模块 | |
| operation_content | VARCHAR(500) | 操作内容 | |
| ip_address | VARCHAR(50) | IP地址 | |
| result | TINYINT | 操作结果:0失败 1成功 | |
| created_at | DATETIME | 操作时间 |
-- sys_user 表索引
CREATE UNIQUE INDEX idx_phone_hash ON sys_user(phone_hash);
CREATE UNIQUE INDEX idx_openid ON sys_user(openid);
CREATE INDEX idx_status ON sys_user(status);
-- user_identity 表索引
CREATE INDEX idx_user_id ON user_identity(user_id);
CREATE INDEX idx_identity_type ON user_identity(identity_type);
-- audit_log 表索引
CREATE INDEX idx_operator_id ON audit_log(operator_id);
-- operation_log 表索引
CREATE INDEX idx_operator_id ON operation_log(operator_id);
请求参数:
{
"code": "wx_login_code"
}
响应参数:
{
"code": 200,
"message": "success",
"data": {
"token": "jwt_token",
"userId": 1,
"identities": [
{
"identityId": 1,
"identityType": "GROWER",
"identityName": "果农"
}
]
}
}
业务逻辑:
请求参数:
{
"username": "admin",
"password": "admin123"
}
响应参数:
{
"code": 200,
"message": "success",
"data": {
"token": "jwt_token",
"userId": 1,
"username": "admin",
"realName": "管理员",
"roleId": 1,
"roleName": "超级管理员"
}
}
业务逻辑:
请求参数:
{
"identityId": 1
}
响应参数:
{
"code": 200,
"message": "success",
"data": {
"token": "new_jwt_token_with_identity"
}
}
响应参数:
{
"code": 200,
"message": "success",
"data": {
"userId": 1,
"realName": "张三",
"phone": "138****8888",
"identities": [...],
"currentIdentity": {
"identityId": 1,
"identityType": "GROWER"
}
}
}
请求参数:
{
"userId": 1,
"status": 0,
"lockReason": "违规操作"
}
响应参数:
{
"code": 200,
"message": "success",
"data": {
"total": 8,
"list": [
{
"id": 1,
"roleName": "超级管理员",
"roleCode": "ADMIN",
"status": 0,
"isSystem": 1
}
]
}
}
请求参数:
{
"username": "newadmin",
"password": "Admin123",
"realName": "新管理员",
"phone": "13800138000",
"roleId": 2
}
请求参数:
?dictType=apple_variety
响应参数:
{
"code": 200,
"message": "success",
"data": [
{
"id": 1,
"dictType": "apple_variety",
"dictCode": "red_fuji",
"dictName": "红富士",
"sortOrder": 1
}
]
}
请求参数:
?page=1&pageSize=10&operatorId=1&startTime=2026-05-01&endTime=2026-05-30
请求参数:
?page=1&pageSize=10&targetType=GROWER_PROFILE&status=PENDING
请求参数:
{
"action": "APPROVE",
"reason": ""
}
响应参数:
{
"code": 200,
"message": "success",
"data": {
"greeting": "早安,张三!",
"marketPrices": [
{
"variety": "红富士",
"priceMin": 3.5,
"priceMax": 4.2,
"trend": "up",
"updateTime": "2026-05-30 08:00"
}
],
"quickEntries": [
{"name": "找工人", "icon": "worker", "path": "/pages/worker/list"},
{"name": "找客商", "icon": "buyer", "path": "/pages/buyer/list"},
{"name": "买农资", "icon": "supplier", "path": "/pages/supplier/list"},
{"name": "发布需求", "icon": "publish", "path": "/pages/recruit/publish"}
]
}
}
响应参数:
{
"code": 200,
"message": "success",
"data": {
"recommendedRecruits": [
{
"id": 1,
"workType": "采摘",
"price": 150,
"priceUnit": "元/天",
"days": 5,
"peopleCount": 3,
"growerName": "李四",
"distance": 2.5
}
]
}
}
客户端请求
│
▼
拦截器检查 Token
│
├── 无 Token → 401 未认证
│
├── Token 无效 → 401 未认证
│
├── Token 过期 → 401 未认证
│
└── Token 有效 → 解析用户信息
│
▼
检查权限(RBAC)
│
├── 无权限 → 403 禁止访问
│
└── 有权限 → 执行业务逻辑
用户 (sys_user)
│
└── N:M ──→ 角色 (sys_role)
│
└── N:M ──→ 权限 (sys_permission)
权限检查流程:
| 技术 | 版本 | 用途 |
|---|---|---|
| Java | 1.8 | 开发语言 |
| Spring Boot | 1.5.9 | 应用框架 |
| MyBatis | 1.3.2 | ORM 框架 |
| MySQL | 5.7+ | 数据库 |
| Redis | 3.0+ | 缓存 |
| JWT (jjwt) | 0.9.1 | Token 认证 |
| 阿里云 OSS | 3.15.1 | 文件存储 |
| 阿里云短信 | 2.1.0 | 短信服务 |
| Apache POI | 3.17 | Excel 处理 |
| 技术 | 版本 | 用途 |
|---|---|---|
| 微信小程序 | 基础库 ≥2.0 | 移动端 |
| Vue | 2.6.14 | 后台前端框架 |
| Element UI | 2.15.9 | UI 组件库 |
| ECharts | 5.4.3 | 数据可视化 |
| Axios | 0.27.2 | HTTP 客户端 |
| 工具 | 用途 |
|---|---|
| Maven | 构建工具 |
| Git | 版本控制 |
| Gogs | 代码仓库 |
| Navicat/DBeaver | 数据库客户端 |
| 微信开发者工具 | 小程序开发 |
本地开发机
├── JDK 1.8
├── Maven 3.6.3
├── MySQL 5.7
├── Redis 3.0
└── 微信开发者工具
云服务器
├── Nginx(反向代理)
├── Spring Boot 应用(8080 端口)
├── MySQL 数据库
├── Redis 缓存
└── 阿里云 OSS(文件存储)
决策: 采用 JWT Token 认证
原因:
权衡:
决策: 采用 RBAC(Role-Based Access Control)
原因:
权衡:
决策: AES 加密存储 + SHA256 哈希索引
原因:
权衡: