编辑 | blame | 历史 | 原始文档

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 <resultMap type="SysUser" id="SysUserResult"> <!-- ... 其他字段 --> <result property="oaUserId" column="oa_user_id" /> </resultMap>

查询SQL包含oaUserId:
xml <sql id="selectUserVo"> 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 <!-- ... --> </sql>

插入操作:
xml <insert id="insertUser" parameterType="SysUser" useGeneratedKeys="true" keyProperty="userId"> insert into sys_user( <!-- ... 其他字段 --> <if test="oaUserId != null">oa_user_id,</if> <!-- ... --> )values( <!-- ... 其他字段值 --> <if test="oaUserId != null">#{oaUserId},</if> <!-- ... --> ) </insert>

更新操作:
xml <update id="updateUser" parameterType="SysUser"> update sys_user <set> <!-- ... 其他字段 --> <if test="oaUserId != null">oa_user_id = #{oaUserId},</if> <!-- ... --> </set> where user_id = #{userId} </update>

3. 登录接口扩展

文件: ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java

getInfo()方法中返回oaUserId:

@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 <el-table-column label="OA用户ID" align="center" key="oaUserId" prop="oaUserId" v-if="columns[1].visible" width="120"> <template slot-scope="scope"> <span v-if="scope.row.oaUserId">{{ scope.row.oaUserId }}</span> <span v-else style="color: #909399;">-</span> </template> </el-table-column>

表单编辑

在新增/修改用户对话框中添加OA用户ID输入框:
html <el-row> <el-col :span="12"> <el-form-item label="OA用户ID" prop="oaUserId"> <el-input v-model="form.oaUserId" placeholder="OA系统的用户ID" type="number" /> </el-form-item> </el-col> </el-row>

注意
- 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,会显示数字
  • 如果没有,显示"-"
  1. 创建用户
  • 点击"新增"按钮
  • 在表单中填写"OA用户ID"(可选)
  • 点击"确定"保存
  1. 修改用户
  • 点击用户的"修改"按钮
  • 可以修改"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
  1. 创建用户测试
  • 创建新用户时填写OA用户ID
  • 保存后查看数据库中是否正确保存
  • 在用户列表中查看是否正确显示
  1. 修改用户测试
  • 修改已有用户的OA用户ID
  • 保存后查看数据库中是否正确更新
  • 在用户列表中查看是否正确显示
  1. 空值测试
  • 创建用户时不填写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是否已被其他用户使用
  1. OA系统集成
  • 实现与OA系统的单点登录(SSO)
  • 通过OA用户ID自动同步用户信息
  1. 数据同步功能
  • 定时从OA系统同步用户数据
  • 根据OA用户ID更新本地用户信息

十、版本历史

  • v1.0 (2025-10-19): 初始版本,支持OA用户ID的显示、创建和修改
  • 后端getInfo接口返回oaUserId
  • 前端store保存oaUserId
  • 后台管理支持编辑oaUserId
  • 移动端支持访问oaUserId