user.js 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. var express = require('express');
  2. var createError = require('http-errors')
  3. const bcrypt = require('bcryptjs');
  4. const models = require('../../../models');
  5. const utils = require('../../../libs/utils');
  6. const auth = require('../../../libs/auth');
  7. const router = express.Router();
  8. router.get('/pager/headers', auth.need('read:own', 'user'), utils.pager.getHeadersBuilder(models.User));
  9. router.get('/pager', auth.need('read:own', 'user'), (req, res, next) => {
  10. (async () => {
  11. if (!req.ac) throw createError(403, 'NO AC');
  12. /**@type {AccessControl} */
  13. let ac = req.ac;
  14. let readAny = ac.can('user').readAny('user').granted;
  15. if (readAny) next()
  16. else {
  17. req.query.base = { createBy: req.session.user._id };
  18. next();
  19. }
  20. })().catch(next);
  21. }, utils.pager.getListBuilder(models.User, [
  22. { path: 'createBy', select: 'username' },
  23. { path: 'roles', select: 'name' },
  24. ], (item, req) => { return item.createBy && (item.createBy._id == req.session.user._id) }
  25. ));
  26. /**
  27. * user-create
  28. */
  29. router.post('/', auth.need('create:own', 'user'), function (req, res, next) {
  30. (async function () {
  31. let { username, password, name, phone, email, roles } = req.body;
  32. if (!username || !password || !phone || !email || !name) throw createError(400, '缺少参数');
  33. utils.validators.validatePhone(phone);
  34. utils.validators.validateUsername(username);
  35. utils.validators.validatePassword(password);
  36. let doc = await models.User.findOne({ $or: [{ username }, { phone }, { email }] }).select('username phone')
  37. .lean()
  38. .exec();
  39. if (doc) throw createError(400, '用户名或手机号或邮箱已被占用');
  40. let salt = await bcrypt.genSalt(10);
  41. password = await bcrypt.hash(password, salt);
  42. let createBy = req.session.user._id;
  43. let ipLastSignin = req.ip;
  44. let user = new models.User({ username, password, name, phone, email, roles, createBy, ipLastSignin });
  45. await user.save();
  46. res.json({
  47. msg: 'ok',
  48. })
  49. })().catch(next)
  50. });
  51. router.get('/select/options', function (req, res, next) {
  52. (async function () {
  53. let docs = await models.User.find().select('username').lean();
  54. docs = docs.map(u => ({ label: u.username, value: u._id }));
  55. res.json(docs);
  56. })().catch(next)
  57. });
  58. router.get('/:id', auth.need('read:own', 'user'), function (req, res, next) {
  59. (async function () {
  60. utils.validators.validateId(req.params.id);
  61. let doc = await models.User.findById(req.params.id).select('-password').lean();
  62. if (!doc) throw createError(404, 'Not found!');
  63. if (!auth.can.readAny(req, 'user') && doc.createBy != req.session.user._id) throw createError(403, '权限不足');
  64. res.json(doc);
  65. })().catch(next)
  66. });
  67. router.patch('/:id', auth.need('update:own', 'user'), function (req, res, next) {
  68. (async function () {
  69. utils.validators.validateId(req.params.id);
  70. let doc = await models.User.findById(req.params.id);
  71. if (!doc) throw createError(404, 'Not found!');
  72. let updates = {};
  73. let editableFields = ['name', 'email', 'roles', 'epgs', 'phone', 'disabled'];
  74. Object.keys(req.body).filter(key => editableFields.includes(key)).forEach(key => {
  75. updates[key] = req.body[key];
  76. })
  77. doc.set(updates);
  78. console.log('user update:', doc.getChanges());
  79. await doc.save();
  80. if (doc.disabled === true) {
  81. await utils.session.destroyUser(req, doc._id); //清空用户session
  82. }
  83. //await utils.async.delay(1000);
  84. res.json({ msg: 'ok' });
  85. })().catch(next)
  86. });
  87. /** patch-password */
  88. router.patch('/:id/password', auth.need('update:own', 'user'), function (req, res, next) {
  89. (async function () {
  90. utils.validators.validateId(req.params.id);
  91. let doc = await models.User.findById(req.params.id);
  92. if (!doc) throw createError(404, 'Not found!');
  93. let password = randomPassword();
  94. let salt = await bcrypt.genSalt(10);
  95. doc.password = await bcrypt.hash(password, salt);
  96. await utils.session.destroyUser(req, doc._id);
  97. await doc.save();
  98. res.json({
  99. name: doc.name,
  100. username: doc.username,
  101. password,
  102. });
  103. })().catch(next)
  104. });
  105. /**
  106. * 检查username占用
  107. */
  108. router.post('/check/username', auth.need('create:own', 'user'), function (req, res, next) {
  109. (async function () {
  110. let { id, username } = req.body;
  111. if (!username) throw createError(400, 'Invalid request');
  112. let doc = await models.User.findOne({ username }).select('username').lean().exec();
  113. if (doc && doc._id != id) throw createError(400, '已占用');
  114. res.json({ msg: 'ok' })
  115. })().catch(next)
  116. });
  117. /**
  118. * 检查手机号占用
  119. */
  120. router.post('/check/phone', auth.need('create:own', 'user'), function (req, res, next) {
  121. (async function () {
  122. let { id, phone } = req.body;
  123. if (!phone) throw createError(400, 'Invalid request');
  124. let doc = await models.User.findOne({ phone }).select('phone').lean().exec();
  125. if (doc && doc._id != id) throw createError(400, '已占用');
  126. res.json({ msg: 'ok' })
  127. })().catch(next)
  128. });
  129. /**
  130. * 检查邮箱占用
  131. */
  132. router.post('/check/email', auth.need('create:own', 'user'), function (req, res, next) {
  133. (async function () {
  134. let { id, email } = req.body;
  135. if (!email) throw createError(400, 'Invalid request');
  136. let doc = await models.User.findOne({ email }).select('email').lean().exec();
  137. if (doc && doc._id != id) throw createError(400, '已占用');
  138. res.json({ msg: 'ok' })
  139. })().catch(next)
  140. });
  141. router.get('/session/list', auth.need('read:any', 'user'), function (req, res, next) {
  142. (async function () {
  143. let sessions = await utils.session.all(req);
  144. let data = sessions.map(s => {
  145. s.user.sesid = s.id;
  146. return s.user;
  147. });
  148. res.json({ data });
  149. })().catch(next)
  150. });
  151. router.delete('/session/:id', auth.need('delete:any', 'user'), function (req, res, next) {
  152. (async function () {
  153. /**@type {any[]} */
  154. let sessions = await utils.session.all(req);
  155. let ses = sessions.find(s => s.id == req.params.id);
  156. if (!ses) throw createError(404, 'session不存在');
  157. //await utils.async.delay(1000);
  158. if (ses.id == req.session.id) throw createError(400, '不能删除你自己的session');
  159. await utils.session.destroy(req, req.params.id);
  160. res.json({ msg: 'ok' });
  161. })().catch(next)
  162. });
  163. function randomPassword() {
  164. let wishlist = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz~!@-#$';
  165. let pass = Array(20).fill(0).map(() => {
  166. return wishlist.charAt(Math.floor(Math.random() * wishlist.length))
  167. }).join('');
  168. console.log('pass', pass);
  169. return pass;
  170. }
  171. module.exports = router;