|  |  | const {
 | 
						
						
						
							|  |  |   findUser
 | 
						
						
						
							|  |  | } = require('../../lib/utils/account')
 | 
						
						
						
							|  |  | const {
 | 
						
						
						
							|  |  |   ERROR
 | 
						
						
						
							|  |  | } = require('../../common/error')
 | 
						
						
						
							|  |  | const {
 | 
						
						
						
							|  |  |   userCollection
 | 
						
						
						
							|  |  | } = require('../../common/constants')
 | 
						
						
						
							|  |  | const PasswordUtils = require('../../lib/utils/password')
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | /**
 | 
						
						
						
							|  |  |  * 新增用户
 | 
						
						
						
							|  |  |  * @tutorial https://uniapp.dcloud.net.cn/uniCloud/uni-id-pages.html#add-user
 | 
						
						
						
							|  |  |  * @param {Object}  params
 | 
						
						
						
							|  |  |  * @param {String}  params.username       用户名
 | 
						
						
						
							|  |  |  * @param {String}  params.password       密码
 | 
						
						
						
							|  |  |  * @param {String}  params.nickname       昵称
 | 
						
						
						
							|  |  |  * @param {Array}   params.authorizedApp  允许登录的AppID列表
 | 
						
						
						
							|  |  |  * @param {Array}   params.role           用户角色列表
 | 
						
						
						
							|  |  |  * @param {String}  params.mobile         手机号
 | 
						
						
						
							|  |  |  * @param {String}  params.email          邮箱
 | 
						
						
						
							|  |  |  * @param {Array}   params.tags           用户标签
 | 
						
						
						
							|  |  |  * @param {Number}  params.status         用户状态
 | 
						
						
						
							|  |  |  * @returns
 | 
						
						
						
							|  |  |  */
 | 
						
						
						
							|  |  | module.exports = async function (params = {}) {
 | 
						
						
						
							|  |  |   const schema = {
 | 
						
						
						
							|  |  |     username: 'username',
 | 
						
						
						
							|  |  |     password: 'password',
 | 
						
						
						
							|  |  |     authorizedApp: {
 | 
						
						
						
							|  |  |       required: false,
 | 
						
						
						
							|  |  |       type: 'array<string>'
 | 
						
						
						
							|  |  |     }, // 指定允许登录的app,传空数组或不传时表示可以不可以在任何端登录
 | 
						
						
						
							|  |  |     nickname: {
 | 
						
						
						
							|  |  |       required: false,
 | 
						
						
						
							|  |  |       type: 'nickname'
 | 
						
						
						
							|  |  |     },
 | 
						
						
						
							|  |  |     role: {
 | 
						
						
						
							|  |  |       require: false,
 | 
						
						
						
							|  |  |       type: 'array<string>'
 | 
						
						
						
							|  |  |     },
 | 
						
						
						
							|  |  |     mobile: {
 | 
						
						
						
							|  |  |       required: false,
 | 
						
						
						
							|  |  |       type: 'mobile'
 | 
						
						
						
							|  |  |     },
 | 
						
						
						
							|  |  |     email: {
 | 
						
						
						
							|  |  |       required: false,
 | 
						
						
						
							|  |  |       type: 'email'
 | 
						
						
						
							|  |  |     },
 | 
						
						
						
							|  |  |     tags: {
 | 
						
						
						
							|  |  |       required: false,
 | 
						
						
						
							|  |  |       type: 'array<string>'
 | 
						
						
						
							|  |  |     },
 | 
						
						
						
							|  |  |     status: {
 | 
						
						
						
							|  |  |       required: false,
 | 
						
						
						
							|  |  |       type: 'number'
 | 
						
						
						
							|  |  |     }
 | 
						
						
						
							|  |  |   }
 | 
						
						
						
							|  |  |   this.middleware.validate(params, schema)
 | 
						
						
						
							|  |  |   const {
 | 
						
						
						
							|  |  |     username,
 | 
						
						
						
							|  |  |     password,
 | 
						
						
						
							|  |  |     authorizedApp,
 | 
						
						
						
							|  |  |     nickname,
 | 
						
						
						
							|  |  |     role,
 | 
						
						
						
							|  |  |     mobile,
 | 
						
						
						
							|  |  |     email,
 | 
						
						
						
							|  |  |     tags,
 | 
						
						
						
							|  |  |     status
 | 
						
						
						
							|  |  |   } = params
 | 
						
						
						
							|  |  |   const {
 | 
						
						
						
							|  |  |     userMatched
 | 
						
						
						
							|  |  |   } = await findUser({
 | 
						
						
						
							|  |  |     userQuery: {
 | 
						
						
						
							|  |  |       username,
 | 
						
						
						
							|  |  |       mobile,
 | 
						
						
						
							|  |  |       email
 | 
						
						
						
							|  |  |     },
 | 
						
						
						
							|  |  |     authorizedApp
 | 
						
						
						
							|  |  |   })
 | 
						
						
						
							|  |  |   if (userMatched.length) {
 | 
						
						
						
							|  |  |     throw {
 | 
						
						
						
							|  |  |       errCode: ERROR.ACCOUNT_EXISTS
 | 
						
						
						
							|  |  |     }
 | 
						
						
						
							|  |  |   }
 | 
						
						
						
							|  |  |   const passwordUtils = new PasswordUtils({
 | 
						
						
						
							|  |  |     clientInfo: this.getUniversalClientInfo(),
 | 
						
						
						
							|  |  |     passwordSecret: this.config.passwordSecret
 | 
						
						
						
							|  |  |   })
 | 
						
						
						
							|  |  |   const {
 | 
						
						
						
							|  |  |     passwordHash,
 | 
						
						
						
							|  |  |     version
 | 
						
						
						
							|  |  |   } = passwordUtils.generatePasswordHash({
 | 
						
						
						
							|  |  |     password
 | 
						
						
						
							|  |  |   })
 | 
						
						
						
							|  |  |   const data = {
 | 
						
						
						
							|  |  |     username,
 | 
						
						
						
							|  |  |     password: passwordHash,
 | 
						
						
						
							|  |  |     password_secret_version: version,
 | 
						
						
						
							|  |  |     dcloud_appid: authorizedApp || [],
 | 
						
						
						
							|  |  |     nickname,
 | 
						
						
						
							|  |  |     role: role || [],
 | 
						
						
						
							|  |  |     mobile,
 | 
						
						
						
							|  |  |     email,
 | 
						
						
						
							|  |  |     tags: tags || [],
 | 
						
						
						
							|  |  |     status
 | 
						
						
						
							|  |  |   }
 | 
						
						
						
							|  |  |   if (email) {
 | 
						
						
						
							|  |  |     data.email_confirmed = 1
 | 
						
						
						
							|  |  |   }
 | 
						
						
						
							|  |  |   if (mobile) {
 | 
						
						
						
							|  |  |     data.mobile_confirmed = 1
 | 
						
						
						
							|  |  |   }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |   // 触发 beforeRegister 钩子
 | 
						
						
						
							|  |  |   const beforeRegister = this.hooks.beforeRegister
 | 
						
						
						
							|  |  |   let userRecord = data
 | 
						
						
						
							|  |  |   if (beforeRegister) {
 | 
						
						
						
							|  |  |     userRecord = await beforeRegister({
 | 
						
						
						
							|  |  |       userRecord,
 | 
						
						
						
							|  |  |       clientInfo: this.getUniversalClientInfo()
 | 
						
						
						
							|  |  |     })
 | 
						
						
						
							|  |  |   }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |   await userCollection.add(userRecord)
 | 
						
						
						
							|  |  |   return {
 | 
						
						
						
							|  |  |     errCode: 0,
 | 
						
						
						
							|  |  |     errMsg: ''
 | 
						
						
						
							|  |  |   }
 | 
						
						
						
							|  |  | }
 |