user.ts 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. import * as _ from 'lodash';
  2. import BaseService from '../../base';
  3. import { Not, In } from 'typeorm';
  4. import { UpdatePersonInfoDto } from '../../../dto/admin/verify';
  5. import { CreateUserDto, UpdateUserDto } from '../../../dto/admin/sys/user';
  6. import { findIndex } from 'lodash';
  7. /**
  8. * 系统-用户
  9. */
  10. export default class SysUserService extends BaseService {
  11. /**
  12. * 查找超管的用户ID
  13. */
  14. async findRootUserId(): Promise<number> {
  15. const result = await this.getRepo().admin.sys.User.findOne({ id: this.config.rootRoleId });
  16. return result ? result.id : 0;
  17. }
  18. /**
  19. * 查询用户个人信息
  20. */
  21. async person(uid: number) {
  22. const user: any = await this.getRepo().admin.sys.User.findOne({ id: uid });
  23. if (!_.isEmpty(user)) {
  24. delete user.departmentId;
  25. delete user.status;
  26. // delete user.remark;
  27. delete user.password;
  28. }
  29. return user;
  30. }
  31. /**
  32. * 更新个人信息
  33. */
  34. async personUpdate(uid: number, param: UpdatePersonInfoDto) {
  35. const { name, nickName, email, phone, originPassword, newPassword, remark, headImg } = param;
  36. let savePassword: string | undefined;
  37. if (originPassword && newPassword) {
  38. const user = await this.getRepo().admin.sys.User.findOne({ id: uid });
  39. const decodePassword = this.getHelper().aesDecrypt(user!.password, this.config.aesSecret.admin);
  40. // const decodeOriginPassword = this.getHelper().aesDecrypt(originPassword, this.config.aesSecret.front);
  41. // const decodeNewPassword = this.getHelper().aesDecrypt(newPassword, this.config.aesSecret.front);
  42. const decodeOriginPassword = originPassword;
  43. const decodeNewPassword = newPassword;
  44. if (decodePassword === decodeOriginPassword) {
  45. // 旧密码不一致
  46. savePassword = this.getHelper().aesEncrypt(decodeNewPassword, this.config.aesSecret.admin);
  47. } else {
  48. return false;
  49. }
  50. }
  51. const obj: any = { name, nickName, email, phone, remark, headImg };
  52. if (savePassword) {
  53. await this.service.admin.sys.user.upgradePasswordV(uid);
  54. obj.password = savePassword;
  55. }
  56. await this.getRepo().admin.sys.User.update(uid, obj);
  57. return true;
  58. }
  59. /**
  60. * 增加系统用户,如果返回false则表示已存在该用户
  61. * @param param Object 对应SysUser实体类
  62. */
  63. async add(param: CreateUserDto) {
  64. // const insertData: any = { ...CreateUserDto };
  65. const exists = await this.getRepo().admin.sys.User.findOne({ username: param.username });
  66. if (!_.isEmpty(exists)) {
  67. return false;
  68. }
  69. // 所有用户初始密码为123456
  70. await this.ctx.ormManager.transaction(async manager => {
  71. const password = this.getHelper().aesEncrypt('123456', this.config.aesSecret.admin);
  72. const u = manager.create(this.getEntity().admin.sys.User, {
  73. departmentId: param.departmentId,
  74. username: param.username,
  75. password,
  76. name: param.name,
  77. nickName: param.nickName,
  78. email: param.email,
  79. phone: param.phone,
  80. remark: param.remark,
  81. status: param.status,
  82. });
  83. const result = await manager.save(u);
  84. const { roles } = param;
  85. const insertRoles = roles.map(e => {
  86. return {
  87. roleId: e,
  88. userId: result.id,
  89. };
  90. });
  91. // 分配角色
  92. await manager.insert(this.getEntity().admin.sys.UserRole, insertRoles);
  93. });
  94. return true;
  95. }
  96. /**
  97. * 更新用户信息
  98. */
  99. async update(param: UpdateUserDto) {
  100. await this.ctx.ormManager.transaction(async manager => {
  101. await manager.update(this.getEntity().admin.sys.User, param.id, {
  102. departmentId: param.departmentId,
  103. username: param.username,
  104. name: param.name,
  105. nickName: param.nickName,
  106. email: param.email,
  107. phone: param.phone,
  108. remark: param.remark,
  109. status: param.status,
  110. });
  111. // 先删除原来的角色关系
  112. await manager.delete(this.getEntity().admin.sys.UserRole, { userId: param.id });
  113. const insertRoles = param.roles.map(e => {
  114. return {
  115. roleId: e,
  116. userId: param.id,
  117. };
  118. });
  119. // 重新分配角色
  120. await manager.insert(this.getEntity().admin.sys.UserRole, insertRoles);
  121. if (param.status === 0) {
  122. // 禁用状态
  123. await this.forbidden(param.id);
  124. }
  125. });
  126. }
  127. /**
  128. * 查找用户信息
  129. * @param id 用户id
  130. */
  131. async info(id: number) {
  132. const user: any = await this.getRepo().admin.sys.User.findOne(id);
  133. if (_.isEmpty(user)) {
  134. throw new Error('unfind this user info');
  135. }
  136. const departmentRow = await this.getRepo().admin.sys.Department.findOne({ id: user!.departmentId });
  137. if (_.isEmpty(departmentRow)) {
  138. throw new Error('unfind this user info');
  139. }
  140. const roleRows = await this.getRepo().admin.sys.UserRole.find({ userId: user!.id });
  141. const roles = roleRows.map(e => {
  142. return e.roleId;
  143. });
  144. delete user!.password;
  145. return { ...user, roles, departmentName: departmentRow!.name };
  146. }
  147. /**
  148. * 查找列表里的信息
  149. */
  150. async infoList(ids: number[]) {
  151. const users = await this.getRepo().admin.sys.User.findByIds(ids);
  152. return users;
  153. }
  154. /**
  155. * 根据ID列表删除用户
  156. */
  157. async delete(userIds: number[]) {
  158. await this.getRepo().admin.sys.User.delete(userIds);
  159. await this.getRepo().admin.sys.UserRole.delete({ userId: In(userIds) });
  160. }
  161. /**
  162. * 根据部门ID列举用户条数:除去超级管理员
  163. */
  164. async count(uid: number, deptId: number) {
  165. const rootUserId = await this.findRootUserId();
  166. if (deptId === -1) {
  167. return await this.getRepo().admin.sys.User.count({ id: Not(In([ rootUserId, uid ])) });
  168. }
  169. return await this.getRepo().admin.sys.User.count({ id: Not(In([ rootUserId, uid ])), departmentId: deptId });
  170. }
  171. /**
  172. * 根据部门ID进行分页查询用户列表
  173. * deptId = -1 时查询全部
  174. */
  175. async page(uid: number, deptId: number, page: number, count: number) {
  176. const rootUserId = await this.findRootUserId();
  177. const result = await this.getRepo().admin.sys.User.createQueryBuilder('user')
  178. .innerJoinAndSelect('sys_department', 'dept', 'dept.id = user.departmentId')
  179. .innerJoinAndSelect(
  180. 'sys_user_role',
  181. 'user_role',
  182. 'user_role.user_id = user.id',
  183. )
  184. .innerJoinAndSelect('sys_role', 'role', 'role.id = user_role.role_id')
  185. .where('user.id NOT IN (:...ids)', { ids: [ rootUserId, uid ] })
  186. .andWhere(deptId === -1 ? '1 = 1' : `user.departmentId = '${deptId}'`)
  187. .offset(page * count)
  188. .limit(count)
  189. .getRawMany();
  190. // const dealResult = result.map(e => {
  191. // return {
  192. // createTime: e.user_createTime,
  193. // departmentId: e.user_department_id,
  194. // email: e.user_email,
  195. // headImg: e.user_head_img,
  196. // id: e.user_id,
  197. // name: e.user_name,
  198. // nickName: e.user_nick_name,
  199. // phone: e.user_phone,
  200. // remark: e.user_remark,
  201. // status: e.user_status,
  202. // updateTime: e.user_updateTime,
  203. // username: e.user_username,
  204. // departmentName: e.dept_name,
  205. // };
  206. // });
  207. const dealResult:any[] = [];
  208. // 过滤去重
  209. result.forEach(e => {
  210. const index = findIndex(dealResult, e2 => e2.id === e.user_id);
  211. if (index < 0) {
  212. // 当前元素不存在则插入
  213. dealResult.push({
  214. createTime: e.user_createTime,
  215. departmentId: e.user_department_id,
  216. email: e.user_email,
  217. headImg: e.user_head_img,
  218. id: e.user_id,
  219. name: e.user_name,
  220. nickName: e.user_nick_name,
  221. phone: e.user_phone,
  222. remark: e.user_remark,
  223. status: e.user_status,
  224. updateTime: e.user_updateTime,
  225. username: e.user_username,
  226. departmentName: e.dept_name,
  227. roleNames: [ e.role_name ],
  228. });
  229. } else {
  230. // 已存在
  231. dealResult[index].roleNames.push(e.role_name);
  232. }
  233. });
  234. // const result = await this.getRepo().admin.sys.User.find({
  235. // where: {
  236. // username: Not('root'),
  237. // departmentId: deptId,
  238. // },
  239. // order: {
  240. // id: 'ASC',
  241. // },
  242. // take: count,
  243. // skip: page * count,
  244. // });
  245. return dealResult;
  246. }
  247. /**
  248. * 禁用用户
  249. */
  250. async forbidden(uid: number) {
  251. await this.getAdminRedis().del(`admin:passwordVersion:${uid}`);
  252. await this.getAdminRedis().del(`admin:token:${uid}`);
  253. await this.getAdminRedis().del(`admin:perms:${uid}`);
  254. }
  255. /**
  256. * 禁用多个用户
  257. */
  258. async multiForbidden(uids: number[]) {
  259. if (uids) {
  260. const pvs: string[] = [];
  261. const ts: string[] = [];
  262. const ps: string[] = [];
  263. uids.forEach(e => {
  264. pvs.push(`admin:passwordVersion:${e}`);
  265. ts.push(`admin:token:${e}`);
  266. ps.push(`admin:perms:${e}`);
  267. });
  268. await this.getAdminRedis().del(pvs);
  269. await this.getAdminRedis().del(ts);
  270. await this.getAdminRedis().del(ps);
  271. }
  272. }
  273. /**
  274. * 升级用户版本密码
  275. */
  276. async upgradePasswordV(id: number) {
  277. // admin:passwordVersion:${param.id}
  278. const v = await this.getAdminRedis().get(`admin:passwordVersion:${id}`);
  279. if (!_.isEmpty(v)) {
  280. await this.getAdminRedis().set(`admin:passwordVersion:${id}`, parseInt(v!) + 1);
  281. }
  282. }
  283. }