| | |
| | | <result property="updateBy" column="update_by" /> |
| | | <result property="updateTime" column="update_time" /> |
| | | <result property="remark" column="remark" /> |
| | | <result property="jobTitle" column="job_title" /> |
| | | <result property="serviceQrcodeUrl" column="service_qrcode_url" /> |
| | | <!-- role_names 是 selectUserList 里 group_concat 出来的派生列,只有列表查询会带; |
| | | 详情/登录链路没有这一列,此处留着不影响(无列即不赋值) --> |
| | | <result property="roleNames" column="role_names" /> |
| | | <association property="dept" javaType="SysDept" resultMap="deptResult" /> |
| | | <collection property="roles" javaType="java.util.List" resultMap="RoleResult" /> |
| | | </resultMap> |
| | |
| | | </resultMap> |
| | | |
| | | <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.pwd_update_date, u.create_by, u.create_time, u.update_by, u.update_time, u.remark, |
| | | 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.pwd_update_date, u.create_by, u.create_time, u.update_by, u.update_time, u.job_title, u.service_qrcode_url, u.remark, |
| | | d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.status as dept_status, |
| | | r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status |
| | | from sys_user u |
| | |
| | | </sql> |
| | | |
| | | <select id="selectUserList" parameterType="SysUser" resultMap="SysUserResult"> |
| | | select u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, d.dept_name, d.leader from sys_user u |
| | | select u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, |
| | | u.job_title, u.service_qrcode_url, |
| | | <!-- |
| | | 角色列:只能用标量子查询聚合,不能改成 left join sys_user_role。 |
| | | 本项目列表走 PageHelper 分页,join 关联表会让多角色用户的行翻倍, |
| | | count 与 limit 同时出错(AccountUserMapper.xml 里有同样的踩坑记录)。 |
| | | 标量子查询写在 select 列表里是安全的:count 优化会把整个 select 列表换成 count(0), |
| | | 子查询随之被丢弃,不影响总数。 |
| | | order by 补 role_id 兜底,role_sort 相同时顺序才稳定。 |
| | | --> |
| | | (select group_concat(r2.role_name order by r2.role_sort, r2.role_id separator '、') |
| | | from sys_user_role ur2 |
| | | join sys_role r2 on r2.role_id = ur2.role_id |
| | | where ur2.user_id = u.user_id) as role_names, |
| | | d.dept_name, d.leader from sys_user u |
| | | <!-- join 与别名 d/u 都不能删:下面 ${params.dataScope} 由 Service 的 |
| | | @DataScope(deptAlias = "d", userAlias = "u") 拼出,里面硬编码 d.dept_id / u.user_id。 |
| | | 页面不再显示部门列,但数据权限过滤仍然依赖这个 join。 --> |
| | | left join sys_dept d on u.dept_id = d.dept_id |
| | | where u.del_flag = '0' |
| | | <if test="userId != null and userId != 0"> |
| | |
| | | </if> |
| | | <if test="deptId != null and deptId != 0"> |
| | | AND (u.dept_id = #{deptId} OR u.dept_id IN ( SELECT t.dept_id FROM sys_dept t WHERE find_in_set(#{deptId}, ancestors) )) |
| | | </if> |
| | | <!-- 按角色筛选:用 exists 而非 join,理由同上面 role_names 的注释。 |
| | | sys_user_role 主键是 (user_id, role_id),这里的条件能走主键前缀。 --> |
| | | <if test="roleId != null and roleId != 0"> |
| | | AND exists(select 1 from sys_user_role ur where ur.user_id = u.user_id and ur.role_id = #{roleId}) |
| | | </if> |
| | | <!-- 数据范围过滤 --> |
| | | ${params.dataScope} |
| | |
| | | <if test="pwdUpdateDate != null">pwd_update_date,</if> |
| | | <if test="createBy != null and createBy != ''">create_by,</if> |
| | | <if test="remark != null and remark != ''">remark,</if> |
| | | <!-- 以下两列刻意用 != null 而非 != '':清空二维码(置空串)也要能写进库, |
| | | 照抄同排其它列的 != '' 会让"删除二维码"永远删不掉 --> |
| | | <if test="jobTitle != null">job_title,</if> |
| | | <if test="serviceQrcodeUrl != null">service_qrcode_url,</if> |
| | | create_time |
| | | )values( |
| | | <if test="userId != null and userId != ''">#{userId},</if> |
| | |
| | | <if test="pwdUpdateDate != null">#{pwdUpdateDate},</if> |
| | | <if test="createBy != null and createBy != ''">#{createBy},</if> |
| | | <if test="remark != null and remark != ''">#{remark},</if> |
| | | <if test="jobTitle != null">#{jobTitle},</if> |
| | | <if test="serviceQrcodeUrl != null">#{serviceQrcodeUrl},</if> |
| | | sysdate() |
| | | ) |
| | | </insert> |
| | |
| | | <if test="loginDate != null">login_date = #{loginDate},</if> |
| | | <if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if> |
| | | <if test="remark != null">remark = #{remark},</if> |
| | | <if test="jobTitle != null">job_title = #{jobTitle},</if> |
| | | <if test="serviceQrcodeUrl != null">service_qrcode_url = #{serviceQrcodeUrl},</if> |
| | | update_time = sysdate() |
| | | </set> |
| | | where user_id = #{userId} |