目录团队信息本期核心任务模块一需求分析和方案设计一.功能分析二.库表设计1.核心设计2.几个注意事项三.MyBatisFlex 技术选型与应用1.MyBatisFlex框架优势2.构造代码生成器四.数据模型开发1.实体类2.枚举类模块二用户注册用户登录一.用户注册1.数据模型2.服务开发3.接口开发与验证二.用户登录1.流程2.数据模型3.数据脱敏4.服务开发5.接口开发模块三会话管理与用户管理一.会话管理1. 核心设计思路2. 服务开发3. 接口开发二.用户管理1.数据模型2.数据脱敏3.服务开发4.接口开发模块四权限控制一、权限等级划分二、权限校验注解设计三、AOP 切面实现统一校验模块五前端开发一、页面与路由构建二、基于 Pinia 的全局状态管理开发总结后续计划团队信息组号69组项目AI零代码应用生成平台负责人樊伟彤小组成员者亚杰、蒋宇轩、张旭、李重昊本期核心任务聚焦用户模块的全流程设计与实现覆盖需求分析、库表设计、数据层开发、业务逻辑实现、会话管理、权限控制及前端对接完成用户体系从 0 到 1 的构建为平台后续业务模块开发奠定基础。模块一需求分析和方案设计一.功能分析用户模块作为系统核心基础模块需实现完整的用户生命周期管理与身份认证能力核心功能如下1用户注册支持通过账号、密码、确认密码完成账号创建。2用户登录支持通过账号密码完成身份校验与登录态建立。3获取当前登录用户无需重复登录可直接获取当前有效登录用户信息。4用户注销支持主动清除登录状态终止当前会话。5用户权限控制划分普通用户与管理员两类角色管理员具备系统最高管理权限。6用户管理仅限管理员操作支持用户检索、删除等全量用户管控能力。通过上述功能规划我们确保用户模块覆盖身份认证、状态管理、权限控制、后台管理四大核心场景满足平台现阶段与未来扩展需求。二.库表设计库名ai_code_mother表名user1.核心设计-- 用户表 create table if not exists user ( id bigint auto_increment comment id primary key, userAccount varchar(256) not null comment 账号, userPassword varchar(512) not null comment 密码, userName varchar(256) null comment 用户昵称, userAvatar varchar(1024) null comment 用户头像, userProfile varchar(512) null comment 用户简介, userRole varchar(256) default user not null comment 用户角色user/admin, editTime datetime default CURRENT_TIMESTAMP not null comment 编辑时间, createTime datetime default CURRENT_TIMESTAMP not null comment 创建时间, updateTime datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment 更新时间, isDelete tinyint default 0 not null comment 是否删除, UNIQUE KEY uk_userAccount (userAccount), INDEX idx_userName (userName) ) comment 用户 collate utf8mb4_unicode_ci;2.几个注意事项时间戳字段区分editTime为用户主动编辑个人信息的时间需业务代码主动更新updateTime为数据记录任意字段变更时间由数据库自动维护。唯一性约束对userAccount账号字段建立唯一索引实现数据库级防重复注册同时提升查询效率。索引优化对高频查询字段userName建立普通索引优化用户检索性能。三.MyBatisFlex 技术选型与应用我们在数据访问层选择MyBatisFlex作为核心框架以提升开发效率与系统性能。1.MyBatisFlex框架优势作为轻量级数据访问层框架具备显著技术优势轻量化仅依赖 MyBatis 核心无额外第三方依赖系统稳定性更高。灵活性提供强大的 QueryWrapper支持关联查询、逻辑删除、乐观锁、数据脱敏等能力。高性能无 MyBatis 拦截器与 SQL 解析开销执行效率显著提升。此外Mybatis Flex 提供了可以通过数据库表生成代码的功能。当我们把数据库表设计完成后 就可以使用其快速生成 Entity、Mapper、Service、Controller 代码能大幅提高我们的开发效率。2.构造代码生成器基于项目配置完成代码生成器开发实现数据源自动读取、生成包路径配置、逻辑删除字段指定、Lombok 集成、JDK 版本适配等能力执行生成器后可快速输出标准化工程代码最后在项目启动类添加 Mapper 扫描注解完成数据层整合。1引入 MyBatis Flex 依赖dependency groupIdcom.mybatis-flex/groupId artifactIdmybatis-flex-spring-boot3-starter/artifactId version1.11.0/version /dependency2开发生成器// MyBatis Flex 代码生成器 (实际开发代码) public class MyBatisCodeGenerator { // 要生成的表名 private static final String[] TABLE_NAMES {表名}; public static void main(String[] args) { // 获取数据元信息 Dict dict YamlUtil.loadByPath(application.yml); MapString, Object dataSourceConfig dict.getByPath(spring.datasource); String url String.valueOf(dataSourceConfig.get(url)); String username String.valueOf(dataSourceConfig.get(username)); String password String.valueOf(dataSourceConfig.get(password)); // 配置数据源 HikariDataSource dataSource new HikariDataSource(); dataSource.setJdbcUrl(url); dataSource.setUsername(username); dataSource.setPassword(password); // 创建配置内容 GlobalConfig globalConfig createGlobalConfig(); // 通过 datasource 和 globalConfig 创建代码生成器 Generator generator new Generator(dataSource, globalConfig); // 生成代码 generator.generate(); } // 详细配置见https://mybatis-flex.com/zh/others/codegen.html public static GlobalConfig createGlobalConfig() { // 创建配置内容 GlobalConfig globalConfig new GlobalConfig(); // 设置根包建议先生成到一个临时目录下生成代码之后再移动到对应的项目目录 globalConfig.getPackageConfig() .setBasePackage(根包); // 设置表前缀和只生成哪些表setGenerateTable 未配置时生成所有表 globalConfig.getStrategyConfig() .setGenerateTable(TABLE_NAMES) // 设置逻辑删除的默认字段名称 .setLogicDeleteColumn(isDelete); // 设置生成 entity 并启用 Lombok globalConfig.enableEntity() .setWithLombok(true) .setJdkVersion(21); // 设置生成 mapper globalConfig.enableMapper(); globalConfig.enableMapperXml(); // 设置生成 Service globalConfig.enableService(); globalConfig.enableServiceImpl(); // 设置生成 Controller globalConfig.enableController(); // 设置生成注释比如生成的时间和作者避免后续多余的代码改动 globalConfig.getJavadocConfig() .setAuthor() .setSince(); return globalConfig; } }上述代码中 我们从配置文件中获取数据库连接信息 用来初始化数据源 。然后自定义了一些生成配置包括指定逻辑删除字段使用的 JDK 版本生成的代码放到哪个包要生成哪些文件生成什么代码注释4执行代码生成器5主类添加扫描 Mapper 文件的注解// 主类 (实际开发代码) SpringBootApplication MapperScan(com.pt.aicodeformal.mapper) public class AiCodeFormalApplication { public static void main(String[] args) { SpringApplication.run(AiCodeFormalApplication.class, args); } }四.数据模型开发1.实体类我们将默认自增主键改为雪花算法生成避免连续 ID 带来的信息泄露风险提升系统安全性。Id(keyType KeyType.Generator,value KeyGenerators.snowFlakeId) private Long id;2.枚举类为统一管理普通用户与管理员两种角色我们构建了用户角色枚举类提供根据值匹配枚举的方法减少硬编码提升代码可维护性。//UserRoleEnum (实际开发代码) Getter public enum UserRoleEnum { USER(用户, user), ADMIN(管理员, admin); private final String text; private final String value; UserRoleEnum(String text, String value) { this.text text; this.value value; } /** * 根据 value 获取枚举 * * param value 枚举值的value * return 枚举值 */ public static UserRoleEnum getEnumByValue(String value) { if (ObjUtil.isEmpty(value)) { return null; } for (UserRoleEnum anEnum : UserRoleEnum.values()) { if (anEnum.value.equals(value)) { return anEnum; } } return null; } }模块二用户注册用户登录一.用户注册1.数据模型在model.dto.user下新建用于接受请求参数的类UserRegisterRequest在 Java 接口开发中为每个接口定义一个专门的类来接收请求参数可以提高代码的可读性和维护性便于对参数进行统一验证和扩展同时减少接口方法参数过多导致的复杂性有助于在复杂场景下更清晰地管理和传递数据。2.服务开发在service包的UserService中增加方法声明/** * 用户注册 * * param userAccount 用户账户 * param userPassword 用户密码 * param checkPassword 校验密码 * return 新用户 id */ long userRegister(String userAccount, String userPassword, String checkPassword);在UserServiceImpl中增加实现代码校验参数查询用户是否已存在加密密码创建用户插入数据库上述过程中我们需要将用户密码加密后进行存储。可以封装一个方法便于后续复用 :Override public String getEncryptPassword(String userPassword) { // 盐值混淆密码 final String SALT aicodemother; return DigestUtils.md5DigestAsHex((userPassword SALT).getBytes(StandardCharsets.UTF_8)); }3.接口开发与验证在controller包中新建UserController并通过 Swagger 进行功能、异常、参数合法性等多维度测试确保注册流程稳定可靠。二.用户登录1.流程建立初始会话 前端与服务器建立连接后服务器会为该客户端创建一个初始的匿名Session并将其状态保存下来。这个 Session 的 ID 会作为唯一标识返回给前端。登录成功更新会话信息当用户在前端输入正确的账号密码并提交到后端验证成功后后端会更新该用户的 Session将用户的登录信息如用户 ID、用户名等保存到与该 Session 关联的存储中。同时服务器会生成一个 Set-Cookie 的响应头指示前端保存该用户的 Session ID。前端保存 Cookie前端接收到后端的响应后浏览器会自动根据 Set-Cookie 指令将 Session ID 存储到浏览器的 Cookie 中与该域名绑定。带 Cookie 的后续请求当前端再次向相同域名的服务器发送请求时浏览器会自动在请求头中附带之前保存的 Cookie其中包含 Session ID。后端验证会话服务器接收到请求后从请求头中提取 Session ID找到对应的 Session 数据。获取会话中存储的信息后端通过该 Session 获取之前存储的用户信息如登录名、权限等从而识别用 户身份并执行相应的业务逻辑。2.数据模型在model.dto.user下新建用于接受请求参数的类UserLoginRequest3.数据脱敏无论是用户注册还是用户登录接口都应该返回已登录的用户信息而且一定要对返回结果进行脱敏处理不能直接将数据库查到的所有信息都返回给了前端包括密码。在model.vo包下新建LoginUserVO类表示脱敏后的登录用户信息在UserService中新增获取脱敏后的已登录用户信息方法编写方法对应的实现类其实就是将User类的属性复制到LoginUserVO中不存在的字段就被过滤掉了4.服务开发在service包的UserService中增加方法声明在UserServiceImpl中增加实现代码校验参数加密查询用户是否存在如果用户存在记录用户的登录态返回脱敏的用户信息5.接口开发在UserController中新增用户登录接口模块三会话管理与用户管理一.会话管理我们在实现获取当前登录用户与用户注销两项功能时采用高度一致的会话处理机制均基于HttpServletRequest获取当前会话Session直接读取已保存的用户登录态无需前端传入额外参数整体设计统一、简洁且安全。1. 核心设计思路获取当前登录用户与用户注销均依赖服务端会话完成身份识别与状态操作无需前端传递用户 ID、账号等敏感 / 冗余参数统一从request对象绑定的Session中读取登录信息全程由服务端控制会话状态保证登录态可信、安全。2. 服务开发我们在UserService中统一声明会话相关方法并在UserServiceImpl中完成对应实现获取当前登录用户为保证返回数据始终与数据库一致我们先从Session中取出已登录用户的 ID再根据 ID 查询数据库最新数据并对结果进行脱敏后返回。用户注销直接从当前Session中移除用户登录态信息使会话失效实现安全、彻底的退出。两项功能逻辑结构相近均围绕Session进行状态读取与修改代码复用性高、维护成本低。3. 接口开发我们在UserController中统一提供会话相关接口提供获取当前登录用户接口前端携带有效 Cookie 即可调用返回当前登录人脱敏信息提供用户注销接口调用后服务端清除登录态前端同步重置全局状态。接口设计保持风格统一无多余参数便于前端对接与权限控制。二.用户管理用户管理需求具体可以拆分为【管理员】创建用户【管理员】根据 id 删除用户【管理员】更新用户【管理员】分页获取用户列表需要脱敏【管理员】根据 id 获取用户未脱敏根据 id 获取用户脱敏1.数据模型每个操作都需要提供一个请求类都放在dto.user包下。用户创建请求UserAddRequest用户更新请求UserUpdateRequest用户查询请求需要继承公共包中的PageRequest来支持分页查询UserQueryRequest2.数据脱敏由于要提供获取用户信息的接口需要和获取当前登录用户接口一样对用户信息进行脱敏避免密码等敏感字段泄露区分普通用户与管理员的数据可见范围。在model.vo包下新建UserVO表示脱敏后的用户3.服务开发在UserService中编写获取脱敏后的单个用户信息、 获取脱敏后的用户列表方法对于分页查询接口需要根据用户传入的参数来构造 SQL 查询。我们借助 MyBatis Flex 的QueryWrapper实现动态条件拼接这样可以无需手动编写复杂 SQL支持按账号、昵称、角色等多维度筛选提升开发效率与代码可读性。4.接口开发按照 RESTful 风格完成管理员用户管理接口开发模块四权限控制一、权限等级划分如何对用户权限进行控制我们结合平台实际使用场景将所有接口划分为四类权限完全公开未登录即可访问如首页、公开文档、注册接口。登录可用用户必须登录才能调用如生成应用、查看个人中心。登录增强未登录可使用基础功能登录后解锁完整能力。管理员专属仅管理员角色可访问如用户管理、系统配置、数据监控。传统的权限控制方法是在每个接口内单独编写逻辑 先获取到当前登录用户信息然后判断用户的权限是否符合要求。这种方法最灵活但是会写很多重复的代码而且其他开发者无法一眼得知接口所需要的权限 。权限校验其实是一个比较通用的业务需求一般会通过Spring AOP 切面 自定义权限校验注解实现统一的接口拦截和权限校验如果有特殊的权限校验逻辑再单独在接口中编码。二、权限校验注解设计我们在 annotation 包下定义了AuthCheck注解作为权限标识的统一载体。该注解支持配置权限等级必须登录必须为管理员支持自定义角色例如可以设置 mustRole 为管理员这样仅管 理员才能使用该接口 AuthCheck(mustRole UserConstant.ADMIN_ROLE)三、AOP 切面实现统一校验我们编写 AuthInterceptor 切面使用环绕通知对所有标记 AuthCheck 的接口进行统一拦截在方法执行前获取当前登录用户信息。判断用户是否登录未登录直接抛出未登录异常。如果接口要求管理员权限判断用户角色是否为 admin不满足则抛出权限不足异常。校验通过后继续执行目标方法校验失败直接返回标准错误信息。模块五前端开发一、页面与路由构建我们完成三大核心页面开发用户注册页表单校验、密码确认、错误提示。用户登录页账号密码输入、登录状态跳转。用户管理页表格展示、分页、查询、新增、编辑、删除。并配置对应路由注执行openapi 工具生成接口对应的请求代码二、基于 Pinia 的全局状态管理由之后很多页面都需要获取到当前登录用户信息需要把这个数据作为全局状态来管理而不是每个页面分别编写获取逻辑。我们使用Pinia 构建全局登录用户状态2.1.引入Pinia创建项目时已引入2.2.定义状态在src/stores目录下新建loginUser.ts文件定义登录用户的存储、远程获取、修改逻辑// Pinia状态(实际开发代码) import { defineStore } from pinia import { ref } from vue import { getLoginUser } from /api/userController.ts export const useLoginUserStore defineStore(loginUser, () { // 默认值 const loginUser refAPI.LoginUserVO({ userName: 未登录, }) // 获取登录用户信息 async function fetchLoginUser() { const res await getLoginUser() if (res.data.code 0 res.data.data) { loginUser.value res.data.data } } // 更新登录用户信息 function setLoginUser(newLoginUser: any) { loginUser.value newLoginUser } return { loginUser, setLoginUser, fetchLoginUser } })2.3.使用状态直接使用 store 中导出的状态变量和函数。开发总结1.全流程研发实践我们完成用户模块需求分析、库表设计、后端实现、权限控制、前端对接的完整研发闭环构建安全、规范、可扩展、易维护的用户体系实现注册、登录、会话、权限、管理五大核心能力。2.关键工程问题解决我们攻克跨域处理、全局异常捕获、统一响应格式、数据脱敏、代码复用等关键问题保障模块稳定运行与数据安全。3.高效工具链落地我们运用 MyBatisFlex、AOP、Pinia、OpenAPI 等工具提升开发效率实现代码生成、统一权限拦截、全局状态管理、接口自动对接显著提升团队协作与工程化水平。后续计划1.持续完善用户认证安全机制优化登录态过期策略、密码加密强度、单点登录能力进一步提升账号与会话安全性。2.推进 AI 零代码应用生成平台核心业务模块开发完成核心功能原型验证与前后端联调支撑平台业务落地。3.持续优化前端界面、交互体验与页面性能完善操作流程与视觉体验提升平台整体使用感受。