# 阶段2a约束条件 — 果农核心功能 > 继承阶段一全部约束 + 阶段2a新增约束 --- ## 一、技术约束(继承阶段一) ### 1.1 开发环境 - **JDK**: 1.8.0_291 - **Maven**: 3.6.3 - **Spring Boot**: 1.5.9.RELEASE - **数据库**: MySQL 5.7+(sayu 库) - **缓存**: Redis 3.0+(可选) - **ORM**: MyBatis(XML 映射) ### 1.2 代码规范 - **包名**: com.sayu - **Controller 路径**: - 小程序端: /api/wx/* - 后台管理端: /api/admin/* - **MyBatis XML**: 必须使用 `#{}` 语法,禁止 `${}` - **文件行数**: ≤ 500 行/文件 ### 1.3 构建与部署 - **构建工具**: Maven - **编译命令**: `mvn compile` - **测试命令**: `mvn test` - **启动命令**: `mvn spring-boot:run` --- ## 二、安全约束(继承阶段一 + 新增) ### 2.1 数据安全(继承) - **手机号**: AES 加密存储,phone_hash (SHA256) 唯一索引 - **Token**: JWT,payload 包含 userId, identityId, identityType, exp - **密钥管理**: 配置在 application.properties,禁止硬编码 ### 2.2 接口安全(继承) - **认证**: JWT Token 认证 - **授权**: RBAC 权限控制,默认拒绝,显式授权 - **防注入**: MyBatis #{} 参数化 - **敏感数据**: 接口返回脱敏(手机号 138****8888) ### 2.3 文件上传安全(新增) - **格式白名单**: 图片(jpg,jpeg,png,gif)、视频(mp4,mov,avi) - **大小限制**: 图片≤5MB/张,视频≤50MB - **EXIF清除**: 前端必须清除EXIF元数据(防止位置泄露) - **文件存储**: 本地存储目录 `./uploads/`,禁止路径穿越 ### 2.4 内容安全(新增) - **敏感词检测**: 正则匹配,色情/赌博/政治等明确违规词 - **不阻塞发布**: keyword_flag=1 进入待复核,招工仍可见 - **人工复核**: 审核员定时处理待复核列表 --- ## 三、业务约束(继承阶段一 + 新增) ### 3.1 用户体系(继承) - **一人多职**: 一个用户可绑定多个身份 - **数据隔离**: 所有业务表带 user_identity_id 字段 - **身份路由**: 0个→提示联系村委会,1个→直接进入,N个→选择页 ### 3.2 审核机制(继承 + 扩展) - **审核对象**: 果农名片(阶段2a新增) - **审核状态**: 待审(0)、已通过(1)、被驳回(2) - **审核 SLA**: ≤24小时提醒,48小时升级给超级管理员 - **驳回要求**: 必须填写驳回原因 - **待复核**: 敏感关键词标记的招工信息 ### 3.3 招工发布规则(新增) - **免审核直接发布**: recruit_info.status=1 - **敏感词标记**: keyword_flag=1 不阻塞发布 - **下架**: 逻辑删除(status=0) - **编辑**: 可编辑价格、人数、天数、备注 ### 3.4 文件上传规则(新增) - **视频**: 仅限1个,≤50MB,MP4/MOV,异步压缩720p/2Mbps - **照片**: ≤9张,单张≤5MB,JPG/JPEG/PNG/GIF - **存储**: 本地文件存储,数据库存URL --- ## 四、性能约束(继承阶段一 + 新增) ### 4.1 响应时间(继承) - **接口响应**: ≤500ms(95%请求) - **页面加载**: ≤3s ### 4.2 文件上传性能(新增) - **上传时间**: ≤50MB文件,局域网环境≤30s - **视频压缩**: 异步处理,不影响用户操作 - **压缩重试**: 失败自动重试3次 ### 4.3 距离计算性能(新增) - **Haversine公式**: 实时计算,不缓存 - **经纬度精度**: DECIMAL(10,7) - **排序**: 按距离升序,分页查询 --- ## 五、兼容性约束(继承阶段一) ### 5.1 小程序端 - **微信基础库**: ≥2.0 - **适老化**: - 正文≥18px(rem) - 按钮≥88×88px - 高对比度 - 语音输入支持 ### 5.2 后台管理端 - **浏览器**: Chrome/Firefox/Edge 最新版 - **分辨率**: ≥1280×720 --- ## 六、数据约束(继承阶段一 + 新增) ### 6.1 数据库设计(继承) - **字符集**: utf8mb4 - **排序规则**: utf8mb4_unicode_ci - **表引擎**: InnoDB - **主键**: 自增ID ### 6.2 索引设计(新增) - **grower_profile**: latitude+longitude 复合索引(距离查询) - **recruit_info**: latitude+longitude 复合索引 - **recruit_info**: keyword_flag INDEX(待复核查询) - **call_log**: caller_identity_id INDEX, callee_identity_id INDEX ### 6.3 JSON字段规范(新增) - **varieties**: JSON数组,如 `["红富士","嘎啦"]` - **work_types**: JSON数组,如 `["采摘工","分拣工"]` - **photos**: JSON数组,如 `["http://localhost:8080/files/image/xxx.jpg"]` - **skills**: JSON数组,如 `["采摘","套袋"]` --- ## 七、接口约束(继承阶段一) ### 7.1 接口格式(继承) - **请求格式**: JSON - **响应格式**: JSON - **响应结构**: ```json { "code": 200, "message": "success", "data": {} } ``` ### 7.2 错误码规范(继承) - **200**: 成功 - **400**: 请求参数错误 - **401**: 未认证 - **403**: 无权限 - **404**: 资源不存在 - **500**: 服务器内部错误 ### 7.3 分页规范(继承) - **请求参数**: page(页码,从1开始)、pageSize(每页数量,默认20) - **响应参数**: ```json { "total": 100, "page": 1, "pageSize": 20, "list": [] } ``` --- ## 八、测试约束(继承阶段一 + 新增) ### 8.1 测试框架(继承) - **单元测试**: JUnit 4 - **集成测试**: Spring Boot Test - **测试目录**: src/test/java/ ### 8.2 测试覆盖(继承) - **核心接口**: 测试覆盖率 ≥80% - **测试独立性**: 每个测试方法独立运行 - **测试可重复**: 同一测试多次运行结果一致 ### 8.3 阶段2a测试重点(新增) - **文件上传**: 50MB边界、格式异常、EXIF清除验证 - **招工发布**: 敏感词标记、免审核发布、下架/编辑 - **找工人**: 工种筛选、距离排序准确性、拨号日志 - **审核**: 名片通过/驳回、待复核处理、SLA提醒 --- ## 九、约束继承清单 | 约束类别 | 阶段一约束 | 阶段2a新增 | |---------|-----------|-----------| | 技术约束 | 全部继承 | 无新增 | | 安全约束 | 全部继承 | 文件上传安全、内容安全 | | 业务约束 | 全部继承 | 招工发布规则、文件上传规则 | | 性能约束 | 全部继承 | 文件上传性能、距离计算性能 | | 兼容性约束 | 全部继承 | 无新增 | | 数据约束 | 全部继承 | 索引设计、JSON字段规范 | | 接口约束 | 全部继承 | 无新增 | | 测试约束 | 全部继承 | 阶段2a测试重点 |