diff --git a/src/modules/base/service/sys/user.ts b/src/modules/base/service/sys/user.ts new file mode 100644 index 0000000..086a2d2 --- /dev/null +++ b/src/modules/base/service/sys/user.ts @@ -0,0 +1,237 @@ +import { Inject, InjectClient, Provide } from '@midwayjs/core'; +import { BaseService, CoolCommException } from '@cool-midway/core'; +import { InjectEntityModel } from '@midwayjs/typeorm'; +import { Equal, In, Repository } from 'typeorm'; +import { BaseSysUserEntity } from '../../entity/sys/user'; +import { BaseSysPermsService } from './perms'; +import * as _ from 'lodash'; +import { BaseSysUserRoleEntity } from '../../entity/sys/user_role'; +import * as md5 from 'md5'; +import { BaseSysDepartmentEntity } from '../../entity/sys/department'; +import { CachingFactory, MidwayCache } from '@midwayjs/cache-manager'; +import { BaseSysRoleEntity } from '../../entity/sys/role'; + +/** + * 系统用户 + */ +@Provide() +export class BaseSysUserService extends BaseService { + @InjectEntityModel(BaseSysUserEntity) + baseSysUserEntity: Repository; + + @InjectEntityModel(BaseSysUserRoleEntity) + baseSysUserRoleEntity: Repository; + + @InjectEntityModel(BaseSysDepartmentEntity) + baseSysDepartmentEntity: Repository; + + @InjectClient(CachingFactory, 'default') + midwayCache: MidwayCache; + + @Inject() + baseSysPermsService: BaseSysPermsService; + + @Inject() + ctx; + + /** + * 分页查询 + * @param query + */ + async page(query) { + const { keyWord, status, departmentIds = [] } = query; + const userId = this.ctx.admin.userId; + const permsDepartmentArr = await this.baseSysPermsService.departmentIds( + userId + ); // 部门权限 + const sql = ` + SELECT + a.id,a.name,a.nickName,a.headImg,a.email,a.remark,a.status,a.createTime,a.updateTime,a.username,a.phone,a.departmentId, + b.name as "departmentName" + FROM + base_sys_user a + LEFT JOIN base_sys_department b on a.departmentId = b.id + WHERE 1 = 1 + ${this.setSql( + !_.isEmpty(departmentIds), + 'and a.departmentId in (?)', + [departmentIds] + )} + ${this.setSql(status, 'and a.status = ?', [status])} + ${this.setSql(keyWord, 'and (a.name LIKE ? or a.username LIKE ?)', [ + `%${keyWord}%`, + `%${keyWord}%`, + ])} + ${this.setSql(true, 'and a.username != ?', ['admin'])} + ${this.setSql( + this.ctx.admin.username !== 'admin', + `and (a.departmentId in (?) or a.userId = ${userId})`, + [!_.isEmpty(permsDepartmentArr) ? permsDepartmentArr : [null]] + )} `; + const result = await this.sqlRenderPage(sql, query); + // 匹配角色 + if (!_.isEmpty(result.list)) { + const userIds = result.list.map(e => e.id); + const roles: BaseSysRoleEntity[] = await this.nativeQuery( + 'SELECT b.name, a.userId FROM base_sys_user_role a LEFT JOIN base_sys_role b ON a.roleId = b.id WHERE a.userId in (?) ', + [userIds] + ); + result.list.forEach(e => { + const arr = roles.filter(a => a.userId == e.id); + + e['roleIds'] = arr.map(a => a.userId); + e['roleName'] = arr.map(a => a.name).join(','); + }); + } + return result; + } + + /** + * 移动部门 + * @param departmentId + * @param userIds + */ + async move(departmentId, userIds) { + await this.baseSysUserEntity.update({ id: In(userIds) }, { departmentId }); + } + + /** + * 获得个人信息 + */ + async person(userId) { + const info = await this.baseSysUserEntity.findOneBy({ + id: Equal(userId), + }); + delete info?.password; + return info; + } + + /** + * 更新用户角色关系 + * @param user + */ + async updateUserRole(user) { + if (_.isEmpty(user.roleIdList)) { + return; + } + if (user.username === 'admin') { + throw new CoolCommException('非法操作~'); + } + await this.baseSysUserRoleEntity.delete({ userId: user.id }); + if (user.roleIdList) { + for (const roleId of user.roleIdList) { + await this.baseSysUserRoleEntity.save({ userId: user.id, roleId }); + } + } + await this.baseSysPermsService.refreshPerms(user.id); + } + + /** + * 新增 + * @param param + */ + async add(param) { + const exists = await this.baseSysUserEntity.findOneBy({ + username: param.username, + }); + if (!_.isEmpty(exists)) { + throw new CoolCommException('用户名已经存在~'); + } + param.password = md5(param.password); + await super.add(param); + await this.updateUserRole(param); + return param.id; + } + + /** + * 根据ID获得信息 + * @param id + */ + public async info(id) { + const info = await this.baseSysUserEntity.findOneBy({ id }); + const userRoles = await this.nativeQuery( + 'select a.roleId from base_sys_user_role a where a.userId = ?', + [id] + ); + const department = await this.baseSysDepartmentEntity.findOneBy({ + id: info.departmentId, + }); + if (info) { + delete info.password; + if (userRoles) { + info.roleIdList = userRoles.map(e => { + return parseInt(e.roleId); + }); + } + } + delete info.password; + if (department) { + info.departmentName = department.name; + } + return info; + } + + /** + * 修改个人信息 + * @param param + */ + public async personUpdate(param) { + param.id = this.ctx.admin.userId; + if (!_.isEmpty(param.password)) { + param.password = md5(param.password); + const oldPassword = md5(param.oldPassword); + const userInfo = await this.baseSysUserEntity.findOneBy({ id: param.id }); + if (!userInfo) { + throw new CoolCommException('用户不存在'); + } + if (oldPassword !== userInfo.password) { + throw new CoolCommException('原密码错误'); + } + param.passwordV = userInfo.passwordV + 1; + await this.midwayCache.set( + `admin:passwordVersion:${param.id}`, + param.passwordV + ); + } else { + delete param.password; + } + await this.baseSysUserEntity.save(param); + } + + /** + * 修改 + * @param param 数据 + */ + async update(param) { + if (param.id && param.username === 'admin') { + throw new CoolCommException('非法操作~'); + } + if (!_.isEmpty(param.password)) { + param.password = md5(param.password); + const userInfo = await this.baseSysUserEntity.findOneBy({ id: param.id }); + if (!userInfo) { + throw new CoolCommException('用户不存在'); + } + param.passwordV = userInfo.passwordV + 1; + await this.midwayCache.set( + `admin:passwordVersion:${param.id}`, + param.passwordV + ); + } else { + delete param.password; + } + if (param.status === 0) { + await this.forbidden(param.id); + } + await this.baseSysUserEntity.save(param); + await this.updateUserRole(param); + } + + /** + * 禁用用户 + * @param userId + */ + async forbidden(userId) { + await this.midwayCache.del(`admin:token:${userId}`); + } +}