Ready for Review
作为企业用户, 我希望使用手机号和密码登录,并获取关联的企业信息, 以便能够安全访问用人方小程序的企业管理功能。
从史诗文件复制的验收标准编号列表
将故事分解为实施所需的具体任务和子任务。 在相关处引用适用的验收标准编号。
EnterpriseLoginSchema,包含手机号和密码字段enterprise-login.route.ts,路径为/api/v1/yongren/auth/loginauth.service.ts中添加enterpriseLogin方法,支持手机号密码验证company_id字段不为空,确保是企业用户enterprise-logout.route.ts,路径为/api/v1/yongren/auth/logoutauth.service.ts中扩展logout方法或创建新的enterpriseLogout方法enterprise-me.route.ts,路径为/api/v1/yongren/auth/meUserResponseSchema或创建新的EnterpriseUserResponseSchema,包含company字段详情company_id关联查询employer_company表数据users2表的company_id字段验证企业用户权限(AC:5)
auth.service.ts中添加verifyEnterpriseUser方法,验证用户是否有company_idcompany_id不为空的用户才能使用企业登录接口auth.middleware.ts中的authMiddleware函数,支持识别企业用户令牌company_id字段存在性enterpriseAuthMiddlewarecompany_id字段),用户就被标记为企业用户。没有关联企业的用户就是普通用户。enterprise-auth.integration.test.ts仅填充从docs文件夹中的实际工件提取的相关信息,与此故事相关:
故事012.001(数据库schema扩展)已完成的变更:
users2表已添加company_id字段:可为空的外键字段,引用employer_company.company_id [来源:docs/stories/012.001.story.md#数据模型]UserEntity已更新:添加了companyId字段和@ManyToOne关联到Company实体 [来源:packages/core-module/user-module/src/entities/user.entity.ts:37-42]user.schema.ts已更新:在UserSchemaMt、CreateUserDtoMt、UpdateUserDtoMt中添加了companyId字段验证 [来源:packages/core-module/user-module/src/schemas/user.schema.ts:46-49, 118-121, 158-161]@d8d/allin-company-module的依赖 [来源:docs/stories/012.001.story.md#文件列表]company_id为NULL,不影响现有功能 [来源:docs/prd/epic-012-api-supplement-for-employer-mini-program.md#兼容性要求]基于现有实体定义和架构文档:
用户实体(packages/core-module/user-module/src/entities/user.entity.ts):
users2(@Entity({ name: 'users2' }))[来源:packages/core-module/user-module/src/entities/user.entity.ts:7]id(映射到用户ID列)[来源:packages/core-module/user-module/src/entities/user.entity.ts:9-10]companyId字段:@Column({ name: 'company_id', type: 'int', unsigned: true, nullable: true, comment: '公司ID,引用employer_company.company_id' }) [来源:packages/core-module/user-module/src/entities/user.entity.ts:37-38]company关联:@ManyToOne(() => Company, { nullable: true }),@JoinColumn({ name: 'company_id', referencedColumnName: 'id' }) [来源:packages/core-module/user-module/src/entities/user.entity.ts:40-42]username、password、phone、email、isDisabled等 [来源:packages/core-module/user-module/src/entities/user.entity.ts:12-68]公司实体(allin-packages/company-module/src/entities/company.entity.ts):
employer_company(@Entity('employer_company'))[来源:allin-packages/company-module/src/entities/company.entity.ts:4]id(映射到company_id列)[来源:allin-packages/company-module/src/entities/company.entity.ts:7-13]platformId字段,关联到Platform实体 [来源:allin-packages/company-module/src/entities/company.entity.ts:15-22, 94-96]companyName:公司名称(varchar(100),必填)[来源:allin-packages/company-module/src/entities/company.entity.ts:24-31]contactPerson:联系人(varchar(50),可为空)[来源:allin-packages/company-module/src/entities/company.entity.ts:33-40]contactPhone:联系电话(varchar(20),可为空)[来源:allin-packages/company-module/src/entities/company.entity.ts:42-49]contactEmail:联系邮箱(varchar(100),可为空)[来源:allin-packages/company-module/src/entities/company.entity.ts:51-58]address:地址(varchar(200),可为空)[来源:allin-packages/company-module/src/entities/company.entity.ts:60-67]status:状态(int,默认1,1-正常,0-禁用)[来源:allin-packages/company-module/src/entities/company.entity.ts:69-75]createTime:创建时间(timestamp,默认CURRENT_TIMESTAMP)[来源:allin-packages/company-module/src/entities/company.entity.ts:77-83]updateTime:更新时间(timestamp,默认CURRENT_TIMESTAMP,onUpdate更新)[来源:allin-packages/company-module/src/entities/company.entity.ts:85-92]companyName和platformId组合唯一(@Index('idx_company_name_platform', ['companyName', 'platformId'], { unique: true }))[来源:allin-packages/company-module/src/entities/company.entity.ts:5]用户Schema验证(packages/core-module/user-module/src/schemas/user.schema.ts):
UserSchemaMt:已包含companyId字段验证(z.number().int().positive().nullable())[来源:packages/core-module/user-module/src/schemas/user.schema.ts:46-49]CreateUserDtoMt:已包含companyId字段验证(可选)[来源:packages/core-module/user-module/src/schemas/user.schema.ts:118-121]UpdateUserDtoMt:已包含companyId字段验证(可选)[来源:packages/core-module/user-module/src/schemas/user.schema.ts:158-161]认证Schema(packages/core-module/auth-module/src/schemas/auth.schema.ts):
LoginSchema:使用username和password字段 [来源:packages/core-module/auth-module/src/schemas/auth.schema.ts:3-12]EnterpriseLoginSchema:使用phone和password字段,或phone和password组合UserResponseSchema:当前不包含company字段详情,需要扩展 [来源:packages/core-module/auth-module/src/schemas/auth.schema.ts:40-117]API路径约定(来自史诗012):
api/v1/yongren 前缀 [来源:docs/prd/epic-012-api-supplement-for-employer-mini-program.md#api路径约定]POST /api/v1/yongren/auth/login [来源:docs/prd/epic-012-api-supplement-for-employer-mini-program.md#api路径约定]新增接口规范:
企业用户手机号密码登录:
POST /api/v1/yongren/auth/login{ "phone": "13800138000", "password": "password123" }{ "token": "jwt.token", "user": { ...包含企业详情 } }企业用户退出登录:
POST /api/v1/yongren/auth/logoutAuthorization: Bearer <token>{ "message": "登出成功" }获取企业用户信息:
GET /api/v1/yongren/auth/meAuthorization: Bearer <token>企业用户创建方式说明:企业用户不需要专门的注册接口。企业用户的创建是在管理后台的用户管理功能中完成的:管理员为用户配置企业关联(设置company_id字段),用户就被标记为企业用户。没有关联企业的用户就是普通用户。
现有接口保持不变:
POST /auth/login(使用username/password)GET /auth/mePOST /auth/logout不适用(后端API故事)。
基于项目结构和后端模块包规范 [来源:architecture/source-tree.md, architecture/backend-module-package-standards.md]:
核心认证模块位置:
packages/core-module/auth-module/src/routes/ - 现有路由文件位置packages/core-module/auth-module/src/services/ - 服务层文件位置packages/core-module/auth-module/src/schemas/ - Schema验证文件位置packages/core-module/auth-module/src/middleware/ - 中间件文件位置新文件建议位置:
packages/core-module/auth-module/src/routes/enterprise-login.route.ts - 企业用户登录路由packages/core-module/auth-module/src/routes/enterprise-logout.route.ts - 企业用户退出登录路由packages/core-module/auth-module/src/routes/enterprise-me.route.ts - 企业用户信息路由packages/core-module/auth-module/src/routes/enterprise-register.route.ts - 企业用户注册路由(如需要)packages/core-module/auth-module/src/schemas/enterprise-auth.schema.ts - 企业用户认证Schemapackages/core-module/auth-module/src/middleware/enterprise-auth.middleware.ts - 企业用户认证中间件测试文件位置:
packages/core-module/auth-module/tests/integration/enterprise-auth.integration.test.ts - 企业用户认证集成测试packages/core-module/auth-module/tests/unit/enterprise-auth.service.test.ts - 企业用户认证服务单元测试公司模块位置:
allin-packages/company-module/src/entities/company.entity.ts - Company实体定义allin-packages/company-module/src/services/company.service.ts - Company服务层基于技术栈和架构文档 [来源:architecture/tech-stack.md, architecture/backend-module-package-standards.md]:
技术栈约束:
API设计约束:
{ "success": false, "message": "...", "code": "..." } [来源:architecture/backend-module-package-standards.md#错误处理规范]安全约束:
UserService.verifyPassword方法)company_id验证性能约束:
向后兼容性:
/api/v1/yongren基于monorepo结构和模块化包架构 [来源:architecture/source-tree.md]:
模块化架构:
packages/core-module/ - 核心模块,包含auth-module、user-module等allin-packages/ - Allin系统移植的业务模块packages/core-module/auth-module/,是企业用户认证的基础依赖关系:
auth-module依赖user-module进行用户数据操作user-module已添加对@d8d/allin-company-module的依赖(故事012.001完成)Company实体,通过company_id关联路由结构:
/auth/login, /auth/logout, /auth/me等/api/v1/yongren/auth/login, /api/v1/yongren/auth/logout, /api/v1/yongren/auth/me代码组织:
tests/目录列出开发者需要遵循的相关测试标准:
基于测试策略文档 [来源:architecture/testing-strategy.md]:
packages/core-module/auth-module/tests/unit/**/*.test.ts [来源:architecture/testing-strategy.md#单元测试](此故事不需要)packages/core-module/auth-module/tests/integration/**/*.test.ts [来源:architecture/testing-strategy.md#集成测试]@d8d/shared-test-util提供的工具 [来源:architecture/testing-strategy.md#集成测试]基于测试策略文档 [来源:architecture/testing-strategy.md]:
hono/testing进行API端点测试 [来源:architecture/testing-strategy.md#集成测试]TestDataFactory创建测试数据 [来源:packages/core-module/auth-module/tests/integration/auth.integration.test.ts:12]基于现有认证集成测试模式 [来源:packages/core-module/auth-module/tests/integration/auth.integration.test.ts]:
集成测试模式:
setupIntegrationDatabaseHooksWithEntities设置测试数据库testClient创建Hono测试客户端TestDataFactory创建一致的测试数据测试场景覆盖:
断言模式:
expect(response.status).toBe(200)expect(responseData).toHaveProperty('token')expect(responseData.user.companyId).toBe(1)expect(responseData.message).toContain('用户名或密码错误')企业用户登录测试:
company_id为NULL)无法使用企业登录接口企业用户信息测试:
认证中间件测试:
权限验证测试:
API文档测试:
跟踪对此故事文档所做的更改
| 日期 | 版本 | 描述 | 作者 |
|---|---|---|---|
| 2025-12-14 | 1.0 | 初始故事创建 | Bob(Scrum Master) |
| 2025-12-14 | 1.1 | 添加Company实体字段详细信息 | Bob(Scrum Master) |
| 2025-12-14 | 1.2 | 澄清企业用户创建方式,移除注册接口需求 | Bob(Scrum Master) |
| 2025-12-14 | 1.3 | 更新测试要求:仅需要集成测试,移除单元测试要求 | Bob(Scrum Master) |
此部分由开发代理在实施过程中填充
Claude Sonnet (2025-12-16) - 作为James开发人员实施故事012.002的所有任务
enterpriseAuthMiddleware,验证用户是否关联企业getUserWithCompany方法,通过company_id关联查询企业详情verifyEnterpriseUser方法,基于users2表的company_id字段验证企业用户权限@d8d/allin-platform-module依赖,确保Company实体能正确关联Platform实体/api/v1/yongrenpackages/core-module/auth-module/src/schemas/auth.schema.ts - 添加了EnterpriseLoginSchema, EnterpriseUserResponseSchema, EnterpriseTokenResponseSchema等企业用户认证Schemapackages/core-module/auth-module/src/routes/enterprise-login.route.ts - 企业用户手机号密码登录路由,路径为POST /api/v1/yongren/auth/loginpackages/core-module/auth-module/src/routes/enterprise-logout.route.ts - 企业用户退出登录路由,路径为POST /api/v1/yongren/auth/logoutpackages/core-module/auth-module/src/routes/enterprise-me.route.ts - 获取企业用户信息路由,路径为GET /api/v1/yongren/auth/me,返回包含企业详情的用户信息packages/core-module/auth-module/src/middleware/enterprise-auth.middleware.ts - 企业用户认证中间件,验证用户是否是企业用户packages/core-module/auth-module/tests/integration/enterprise-auth.integration.test.ts - 企业用户认证集成测试,包含12个测试用例覆盖所有验收标准packages/core-module/auth-module/src/services/auth.service.ts - 添加enterpriseLogin和verifyEnterpriseUser方法packages/core-module/user-module/src/services/user.service.ts - 添加getUserWithCompany方法,通过company_id关联查询企业详情packages/core-module/auth-module/src/routes/index.ts - 导入并注册新的企业用户认证路由packages/core-module/auth-module/src/middleware/index.ts - 导出enterpriseAuthMiddlewarepackages/core-module/auth-module/src/schemas/index.ts - 导出企业用户认证相关的Schemapackages/core-module/package.json - 添加@d8d/allin-platform-module依赖,以支持Company实体关联Platform实体packages/core-module/package.json中添加了@d8d/allin-platform-module: "workspace:*"依赖pnpm install安装了新的依赖包来自QA代理对已完成故事实施的QA审查结果