# OA用户ID字段支持说明 ## 需求背景 为了与OA系统进行用户数据同步和关联,需要在系统中支持OA_UserID字段: 1. 用户登录成功后,在用户信息中加载OA_UserID 2. 在后台创建用户时,可以输入并保存OA_UserID 3. 在后台修改用户时,可以修改OA_UserID ## 实现方案 ### 一、后端实现 #### 1. 实体类(已完成) **文件**: `ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java` SysUser实体类已包含oaUserId字段: ```java /** SQL Server中的OA用户ID */ private Integer oaUserId; public Integer getOaUserId() { return oaUserId; } public void setOaUserId(Integer oaUserId) { this.oaUserId = oaUserId; } ``` #### 2. Mapper配置(已完成) **文件**: `ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml` **ResultMap映射:** ```xml ``` **查询SQL包含oaUserId:** ```xml select u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.oa_user_id, u.create_by, u.create_time, u.remark, from sys_user u ``` **插入操作:** ```xml insert into sys_user( oa_user_id, )values( #{oaUserId}, ) ``` **更新操作:** ```xml update sys_user oa_user_id = #{oaUserId}, where user_id = #{userId} ``` #### 3. 登录接口扩展 **文件**: `ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java` 在`getInfo()`方法中返回oaUserId: ```java @GetMapping("getInfo") public AjaxResult getInfo() { LoginUser loginUser = SecurityUtils.getLoginUser(); SysUser user = loginUser.getUser(); // ... 其他代码 AjaxResult ajax = AjaxResult.success(); ajax.put("user", user); ajax.put("roles", roles); ajax.put("permissions", permissions); ajax.put("branchCompanyId", branchCompanyId); ajax.put("branchCompanyName", branchCompanyName); ajax.put("oaUserId", user.getOaUserId()); // 新增:返回OA用户ID return ajax; } ``` ### 二、前端实现 #### 1. 后台管理页面(Vue) **文件**: `ruoyi-ui/src/views/system/user/index.vue` ##### 列表显示 在用户列表中显示OA用户ID列: ```html ``` ##### 表单编辑 在新增/修改用户对话框中添加OA用户ID输入框: ```html ``` **注意**: - `type="number"` 确保只能输入数字 - 移除了 `:disabled="true"` 属性,允许编辑 - 在创建和修改时都可以输入OA用户ID ##### 表单初始化 在`reset()`方法中包含oaUserId: ```javascript reset() { this.form = { userId: undefined, deptId: undefined, userName: undefined, nickName: undefined, oaUserId: undefined, // 初始化OA用户ID password: undefined, phonenumber: undefined, email: undefined, sex: undefined, status: "0", remark: undefined, postIds: [], roleIds: [] }; this.resetForm("form"); } ``` ##### 列信息配置 添加OA用户ID列到columns配置: ```javascript columns: [ { key: 0, label: `用户编号`, visible: true }, { key: 1, label: `OA用户ID`, visible: true }, // 新增列 { key: 2, label: `用户名称`, visible: true }, { key: 3, label: `用户昵称`, visible: true }, { key: 4, label: `部门`, visible: true }, { key: 5, label: `手机号码`, visible: true }, { key: 6, label: `状态`, visible: true }, { key: 7, label: `创建时间`, visible: true } ] ``` #### 2. 移动端(UniApp) **文件**: `app/store/modules/user.js` ##### 常量定义 **文件**: `app/utils/constant.js` 添加oaUserId常量: ```javascript const constant = { userId: 'vuex_userId', avatar: 'vuex_avatar', name: 'vuex_name', roles: 'vuex_roles', permissions: 'vuex_permissions', deptId: 'vuex_deptId', branchCompanyId: 'vuex_branchCompanyId', branchCompanyName: 'vuex_branchCompanyName', oaUserId: 'vuex_oaUserId' // 新增 } ``` ##### State定义 在store中添加oaUserId状态: ```javascript state: { token: getToken(), userId: storage.get(constant.userId), name: storage.get(constant.name), avatar: storage.get(constant.avatar), roles: storage.get(constant.roles), permissions: storage.get(constant.permissions), deptId: storage.get(constant.deptId), branchCompanyId: storage.get(constant.branchCompanyId), branchCompanyName: storage.get(constant.branchCompanyName), oaUserId: storage.get(constant.oaUserId) // 新增 } ``` ##### Mutation定义 添加SET_OA_USER_ID mutation: ```javascript mutations: { // ... 其他mutations SET_OA_USER_ID: (state, oaUserId) => { state.oaUserId = oaUserId storage.set(constant.oaUserId, oaUserId) } } ``` ##### Action实现 在GetInfo action中保存oaUserId: ```javascript GetInfo({ commit, state }) { return new Promise((resolve, reject) => { getInfo().then(res => { const user = res.user // ... 其他代码 commit('SET_USER_ID', userId) commit('SET_NAME', username) commit('SET_AVATAR', avatar) commit('SET_DEPT_ID', deptId) commit('SET_BRANCH_COMPANY_ID', res.branchCompanyId) commit('SET_BRANCH_COMPANY_NAME', res.branchCompanyName) commit('SET_OA_USER_ID', res.oaUserId) // 新增:保存OA用户ID resolve(res) }).catch(error => { reject(error) }) }) } ``` ### 三、数据流程 #### 1. 用户登录流程 ``` 用户登录 ↓ 调用 /login 接口 ↓ 返回 token ↓ 调用 /getInfo 接口 ↓ 返回用户信息(包含oaUserId) ↓ 保存到 Vuex store ↓ 存储到 localStorage ↓ 在应用中使用 this.$store.state.user.oaUserId 访问 ``` #### 2. 创建用户流程 ``` 点击"新增"按钮 ↓ 打开对话框 ↓ 填写用户信息(包括OA用户ID) ↓ 点击"确定"提交 ↓ 调用 addUser() 接口 ↓ 后端保存到数据库(oa_user_id字段) ↓ 返回成功 ↓ 刷新用户列表 ``` #### 3. 修改用户流程 ``` 点击"修改"按钮 ↓ 加载用户信息(包含OA用户ID) ↓ 修改OA用户ID ↓ 点击"确定"提交 ↓ 调用 updateUser() 接口 ↓ 后端更新数据库(oa_user_id字段) ↓ 返回成功 ↓ 刷新用户列表 ``` ### 四、数据库字段 **表名**: `sys_user` **字段**: `oa_user_id` - **类型**: `INT` - **可空**: `YES` - **默认值**: `NULL` - **说明**: 存储OA系统中的用户ID,用于与外部OA系统进行用户数据关联 SQL创建语句(已存在): ```sql ALTER TABLE sys_user ADD COLUMN oa_user_id INT NULL COMMENT 'OA系统用户ID'; ``` ### 五、使用示例 #### 1. 后台管理 1. **查看用户列表** - 在用户管理页面,可以看到"OA用户ID"列 - 如果用户有OA用户ID,会显示数字 - 如果没有,显示"-" 2. **创建用户** - 点击"新增"按钮 - 在表单中填写"OA用户ID"(可选) - 点击"确定"保存 3. **修改用户** - 点击用户的"修改"按钮 - 可以修改"OA用户ID" - 点击"确定"保存 #### 2. 移动端 在移动端应用中访问OA用户ID: ```javascript // 在组件中 export default { computed: { ...mapState({ oaUserId: state => state.user.oaUserId }) }, mounted() { console.log('当前用户的OA用户ID:', this.oaUserId) } } ``` ### 六、测试建议 #### 功能测试 1. **登录测试** - 使用已有OA用户ID的账号登录 - 检查登录后是否能正确获取OA用户ID - 在开发者工具中查看localStorage中是否保存了oaUserId 2. **创建用户测试** - 创建新用户时填写OA用户ID - 保存后查看数据库中是否正确保存 - 在用户列表中查看是否正确显示 3. **修改用户测试** - 修改已有用户的OA用户ID - 保存后查看数据库中是否正确更新 - 在用户列表中查看是否正确显示 4. **空值测试** - 创建用户时不填写OA用户ID - 确认系统能正常保存(oaUserId为NULL) - 在列表中显示为"-" #### 数据一致性测试 1. 检查新增用户后,oaUserId是否正确保存 2. 检查修改用户后,oaUserId是否正确更新 3. 检查登录后,oaUserId是否正确从数据库加载 4. 检查移动端和PC端的oaUserId是否一致 ### 七、相关文件 #### 后端文件 - `ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java` - 用户实体类 - `ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml` - 用户Mapper配置 - `ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java` - 登录控制器 #### 前端文件(PC端) - `ruoyi-ui/src/views/system/user/index.vue` - 用户管理页面 #### 前端文件(移动端) - `app/utils/constant.js` - 常量定义 - `app/store/modules/user.js` - 用户状态管理 #### 数据库 - `sys_user` 表 - `oa_user_id` 字段 ### 八、注意事项 1. **数据类型**:OA用户ID使用Integer类型,对应数据库的INT类型 2. **可空性**:字段允许为NULL,用户可以不绑定OA账号 3. **唯一性**:目前没有唯一性约束,如需要可添加UNIQUE索引 4. **安全性**:OA用户ID不应该暴露给普通用户,仅在后台管理系统中可见 5. **同步逻辑**:如果实现了OA数据同步功能,需要确保oaUserId的一致性 ### 九、后续扩展建议 1. **添加唯一性约束** ```sql ALTER TABLE sys_user ADD UNIQUE INDEX idx_oa_user_id (oa_user_id); ``` 2. **添加OA用户ID验证** - 在后台添加验证规则,确保OA用户ID的有效性 - 检查OA用户ID是否已被其他用户使用 3. **OA系统集成** - 实现与OA系统的单点登录(SSO) - 通过OA用户ID自动同步用户信息 4. **数据同步功能** - 定时从OA系统同步用户数据 - 根据OA用户ID更新本地用户信息 ### 十、版本历史 - **v1.0** (2025-10-19): 初始版本,支持OA用户ID的显示、创建和修改 - 后端getInfo接口返回oaUserId - 前端store保存oaUserId - 后台管理支持编辑oaUserId - 移动端支持访问oaUserId