# 物业AI人力资源系统 MVP 本地启动 ## 当前仓库 - 后端:`backend`,来自 `dromara/RuoYi-Vue-Plus` 的 `5.X` 分支 - 管理端前端:`frontend`,来自 `CrazyLionCat/plus-ui` 的 `5.X` 分支 - 移动端前端:`mobile`,独立 Vue/Vite 工程 ## 本地端口 - 管理端前端:`http://127.0.0.1:5173/` - 移动端前端:`http://127.0.0.1:5174/h5/user` - 后端:`http://127.0.0.1:8080/` - MySQL:`127.0.0.1:13306`,数据库 `ry-vue`,账号 `root/root` - Redis:`127.0.0.1:16379`,密码 `ruoyi123` - MinIO API:`http://127.0.0.1:9000`,Console:`http://127.0.0.1:9001`,账号 `ruoyi / ruoyi123`,默认 bucket `ruoyi` - Qdrant REST:`http://127.0.0.1:6333`,默认 collection `aihr_knowledge` - 服务端资料导入根目录:`./.data/import` Qdrant 默认本地无需配置;远端或自定义 collection 可用 `AIHR_QDRANT_URL`、`AIHR_QDRANT_COLLECTION`、`AIHR_QDRANT_API_KEY` 覆盖。服务端资料导入根目录可用 `AIHR_IMPORT_ROOT` 或 `-Daihr.import.root` 覆盖。移动端手机号登录的短信模板 ID、阿里云 AccessKey、Secret 和短信签名都通过环境变量注入;本地放根目录 `.env.local`,`scripts/dev-backend.sh` 会自动加载。 本地 `.env.local` 示例: ```bash AIHR_SMS_LOGIN_TEMPLATE_ID=SMS_xxxxxx ALIYUN_SMS_ACCESS_KEY_ID=xxx ALIYUN_SMS_ACCESS_KEY_SECRET=xxx ALIYUN_SMS_SIGN_NAME=物业AI助手 # 演示兜底:非空则不真发短信,验证码固定为该值;dev 默认 123456,prod profile 代码级强制失效 AIHR_SMS_DEV_FIXED_CODE=123456 ``` `application-dev.yml` 只保留占位和默认值,不提交真实短信密钥。dev 环境不配阿里云短信也能登录移动端:验证码固定 `123456`。 ## 启动步骤 在项目根目录执行: ```bash ./scripts/dev.sh ``` 首次启动或需要重建本地 `ry-vue` MVP 数据库时执行: ```bash ./scripts/dev.sh --reset ``` `--reset` 会删除并重建本地 MVP 数据库,只用于本地开发环境。 ## 默认登录 - 租户:`000000` - 管理员:`admin / admin123` - 测试账号:`test / 666666`、`test1 / 666666` ## 品牌资源 - 页面标题:`物业AI人力资源系统` - 侧栏 Logo:`frontend/src/assets/logo/logo.png` ## 已验证的基础链路 - MySQL、Redis 与 MinIO 容器健康检查通过 - Qdrant 容器随本地开发编排启动,供 SOP 知识库向量召回使用 - `ry_vue_5.X.sql`、`ry_job.sql`、`ry_workflow.sql` 已导入 - `aihr_knowledge_mysql8.sql`、`aihr_model_mysql8.sql` 已导入;本地库含住宅 SOP seed 片段与模型配置表 - `aihr_practice_mysql8.sql` 已导入;移动端员工训练记录落 `aihr_practice_session`,用于训练历史、主管待复盘列表和能力画像聚合 - `aihr_org_snapshot_mysql8.sql` 已纳入 reset 脚本;组织人员静态快照(2 个住宅项目 22 人,项目经理/主管/一线三层),支撑按项目看人数演示叙事 - SOP 知识库支持 `.txt/.md/.markdown/.pdf/.doc/.docx/.xls/.xlsx/.ppt/.pptx` 上传到 MinIO 后解析入库,接口为 `POST /api/knowledge/doc/upload`,单文件上限 100MB;管理端上传请求单独放宽到 180s,PDF 解析/归类/向量化较慢时不要改全局 axios 超时 - 服务端目录导入接口为 `POST /api/knowledge/doc/import-local-task`,只读取导入根目录下的相对目录,后台逐文件复用同一上传解析链路;`POST /api/knowledge/doc/import-tasks/{id}/cancel` 可取消运行中任务;`POST /api/knowledge/doc/import-local` 保留为同步调试接口。 - 启用 `aihr_model_config.category='vector'` 的模型配置后,上传会同步写入片段 embedding,并尽力 upsert 到 Qdrant;模型配置页可查看 Qdrant 维度、点数和片段向量数,并在维度不一致时重建索引;未配置或 Qdrant 不可用时只走 MySQL Fulltext/seed fallback,不影响检索。 - 后端 `ruoyi-admin` 已完成 Maven 打包并启动在 `8080` - 前端依赖已安装,Vite 已启动在 `5173` - 移动端依赖已安装,Vite 已启动在 `5174` - 移动端手机号登录页已接 `/resource/sms/code` 与 `/auth/mobile/sms-login`;未配置真实 `ALIYUN_SMS_ACCESS_KEY_ID`、`ALIYUN_SMS_ACCESS_KEY_SECRET`、`ALIYUN_SMS_SIGN_NAME`、`AIHR_SMS_LOGIN_TEMPLATE_ID` 时不会发送阿里云短信;手机号不存在时会自动注册为 `app_user` - 移动端员工端“开始训练”已复用 `/api/train/practice/start`、`/turn`、`/finish`;移动端请求需带登录返回的 `Authorization` 与 `clientid`;完成后主管端完训人数、“待复盘对练”计数、复盘列表、复盘详情、员工训练历史和能力画像会变化 - `/dev-api/auth/tenant/list` 与 `/dev-api/auth/code` 已通过前端代理返回 `200` - `000000 / admin / admin123` 已通过真实加密登录接口返回 `access_token` Qdrant 单独检查: ```bash curl -fsS http://127.0.0.1:6333/ ``` 登录后可检查向量索引状态: ```bash TOKEN=<登录后 access_token> curl -fsS http://127.0.0.1:8080/api/knowledge/doc/vector-index-status -H "Authorization: Bearer $TOKEN" ``` ## MVP 页面验证 登录后侧栏应只展示以下入口: - 首页:`/index` - AI面试:`/recruit/interview` - 三角色对练:`/train/practice` - 案例沉淀:`/knowledge/cases` - SOP知识库:`/knowledge/sop` - 资料处理:`/knowledge/processing` - 系统设置-模型配置:`/system/model` 若依默认菜单如“系统管理 / 租户管理 / 系统监控 / 系统工具 / 测试菜单”在当前 MVP 阶段应保持隐藏。 ## MVP 演示流验证 当前已跑通管理端五个本地演示流和移动端员工训练闭环: - AI面试:进入 `/recruit/interview`,点击“生成题目” → “填满 seed 回答” → “完成评分”,应看到“已完成闭环”“建议复试”和新增面试记录。 - 三角色对练:进入 `/train/practice`,点击“开始对练” → 两次“填入 seed 回复 / 继续一轮” → “结束并评分”,应看到“已完成闭环”“导师改写”和新增对练记录。 - 案例沉淀:进入 `/knowledge/cases`,点击“选择样例录音” → “AI 整理” → “送审” → “入库”,应看到“已完成闭环”和新增 `seed入库` 记录。 - SOP知识库:进入 `/knowledge/sop`,可上传 txt/md/PDF/Word/Excel/PPT 文档入库;点击“检索” → “生成训练题”,应看到“已完成闭环”、命中数据库 SOP 原文片段和训练题;数据库不可用时页面回退 seed。 - 资料处理:进入 `/knowledge/processing`,应看到资料总量、解析任务表、处理链路、规则与风险;可用少量文件验证“批量导入/选择目录/服务端导入”。服务端导入读取 `./.data/import` 下的相对目录,启动后台任务并在页面显示进度,运行中任务可点“取消”;当前重试粒度是同目录重新导入,不是单失败文件重试。若浏览器上传 PDF 约 50s 后后端出现 `Broken pipe`,先确认前端是否已使用 `uploadKnowledgeDoc` 的 180s timeout。 - 移动端员工训练:进入 `http://127.0.0.1:5174/h5/user`,手机号登录(dev 验证码固定 `123456`)→ “开始训练” → 两次“填入建议回复 / 提交本轮”,应看到评分、导师改写、训练历史和能力画像;切到主管端后完训人数与“待复盘对练”计数增加,并展示待复盘列表;点进单条可看评分、话术、导师改写,并可标记已复盘。训练页有“语音输入”和“播报”按钮,需启用 asr/tts 模型后生效,否则降级文本。 - 真 LLM 激活:在 `/system/model` 给供应商填 api_host/api_key 并启用 `category=chat` 模型后,三角色对练的客户回复与评分即为真实 LLM 生成;再启用 `category=asr/tts`(如硅基流动 SenseVoice/CosyVoice2)语音路径生效。未配置时全链路自动回退 seed。 演示前可先跑最小预检: ```bash ./scripts/demo-check.sh ``` 完整演示脚本与录屏兜底见 [DEMO_ACCEPTANCE.md](DEMO_ACCEPTANCE.md)。