user_model.js 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. /**
  2. * 用户数据模型
  3. *
  4. * @author CaiAoLin
  5. * @date 2017/6/9
  6. * @version
  7. */
  8. let mongoose = require("mongoose");
  9. let dbm = require("../../../config/db/db_manager");
  10. let Request = require("request");
  11. class UserModel {
  12. /**
  13. * 表名
  14. *
  15. * @var {string}
  16. */
  17. collectionName = 'user';
  18. /**
  19. * 模型
  20. *
  21. * @var {object}
  22. */
  23. model = null;
  24. /**
  25. * db句柄
  26. *
  27. * @var {object}
  28. */
  29. db = null;
  30. /**
  31. * 最后选定的数据结构
  32. *
  33. * @var {object}
  34. */
  35. schema = null;
  36. /**
  37. * 企业所在地区
  38. *
  39. * @var {object}
  40. */
  41. province = ['广东省', '北京市'];
  42. /**
  43. * 企业类型
  44. *
  45. * @var
  46. */
  47. companyType = ['设计', '施工'];
  48. /**
  49. * 企业类型
  50. *
  51. * @var
  52. */
  53. companyScale = ['1-20', '20-50', '50-100', '100+'];
  54. /**
  55. * 默认结构
  56. *
  57. * @var {object}
  58. */
  59. defaultSchema = {
  60. username: String,
  61. email: String,
  62. mobile: String,
  63. real_name: String,
  64. company: String,
  65. province: String,
  66. area: Number,
  67. company_type: Number,
  68. company_scale: Number,
  69. last_login: Number,
  70. create_time: Number
  71. };
  72. /**
  73. * 登录验证结构
  74. *
  75. * @var {object}
  76. */
  77. loginSchema = {
  78. username: {
  79. type: String,
  80. required: true
  81. },
  82. email: {
  83. type: String,
  84. required: true
  85. },
  86. mobile: {
  87. type: String,
  88. required: true,
  89. validate: {
  90. validator: function(v) {
  91. return /^1([34578]\d)\d{8}$/.test(v);
  92. },
  93. message: '{VALUE} is not a valid phone number!'
  94. },
  95. }
  96. };
  97. /**
  98. * 保存用户详情结构
  99. *
  100. * @var {object}
  101. */
  102. saveInfoSchema = {
  103. real_name: {
  104. type: String,
  105. required: true
  106. },
  107. company: {
  108. type: String,
  109. required: true
  110. },
  111. province: {
  112. type: String,
  113. required: true
  114. },
  115. area: {
  116. type: Number,
  117. required: true
  118. },
  119. company_type: Number,
  120. company_scale: Number,
  121. };
  122. /**
  123. * 构造函数
  124. *
  125. * @return {void}
  126. */
  127. constructor() {
  128. this.db = dbm.getCfgConnection('scConstruct');
  129. this.schema = new mongoose.Schema(this.defaultSchema);
  130. }
  131. /**
  132. * 根据用户名密码调用SSO接口获取信息
  133. *
  134. * @param {string} username
  135. * @param {string} password
  136. * @return {object}
  137. */
  138. async getInfoFromSSO(username, password) {
  139. let postData = {
  140. url: 'http://sso.smartcost.com.cn/api/jzlogin',
  141. form: {username: username, userpasswd: password},
  142. encoding: 'utf8'
  143. };
  144. return new Promise(function (resolve, reject) {
  145. try {
  146. // 请求接口
  147. Request.post(postData, function (err, postResponse, body) {
  148. if (err) {
  149. throw '请求错误';
  150. }
  151. if (postResponse.statusCode !== 200) {
  152. throw '通行证验证失败!';
  153. }
  154. resolve(body);
  155. });
  156. } catch (error) {
  157. reject([]);
  158. }
  159. });
  160. }
  161. /**
  162. * 标记用户
  163. *
  164. * @param {object} userData
  165. * @return {Promise}
  166. */
  167. async markUser(userData) {
  168. let userDataFromDb = await this.findDataByName(userData.username);
  169. let result = false;
  170. // 信息是否补全
  171. let info = false;
  172. if (userDataFromDb.length <= 0) {
  173. // 不存在用户则入库
  174. this.setScene('login');
  175. result = await this.addUser(userData);
  176. } else {
  177. // 存在则更新用户信息
  178. let updateData = {last_login: new Date().getTime()};
  179. let condition = {email: userData.email};
  180. this.setScene('updateTime');
  181. result = await this.updateUser(condition, updateData);
  182. userDataFromDb = userDataFromDb[0];
  183. info = userDataFromDb.real_name !== undefined && userDataFromDb.real_name !== '';
  184. result = result.ok === 1;
  185. }
  186. return [result, info];
  187. }
  188. /**
  189. * 选择场景
  190. *
  191. * @param {string} scene
  192. */
  193. setScene(scene = '') {
  194. let schema = {};
  195. switch (scene) {
  196. case 'saveInfo':
  197. schema = this.saveInfoSchema;
  198. break;
  199. case 'updateTime':
  200. schema = {last_login: Number, real_name: String};
  201. break;
  202. case 'login':
  203. schema = this.loginSchema;
  204. break;
  205. default:
  206. schema = this.defaultSchema;
  207. break;
  208. }
  209. this.schema = new mongoose.Schema(schema);
  210. }
  211. /**
  212. * 根据用户名查找数据
  213. *
  214. * @param {string} username
  215. * @return {object}
  216. */
  217. findDataByName(username) {
  218. let userModel = this.db.model(this.collectionName, this.schema);
  219. return new Promise(function (resolve, reject) {
  220. userModel.find({username: username}, function (error, data) {
  221. if (error) {
  222. reject(error);
  223. } else {
  224. resolve(data);
  225. }
  226. });
  227. });
  228. }
  229. /**
  230. * 新增用户
  231. *
  232. * @param {object} userData
  233. * @return {Promise}
  234. */
  235. addUser(userData) {
  236. let insertData = {
  237. username: userData.username,
  238. email: userData.email,
  239. mobile: userData.mobile,
  240. real_name: '',
  241. company: '',
  242. province: -1,
  243. company_type: -1,
  244. company_scale: -1,
  245. last_login: 0,
  246. create_time: new Date().getTime()
  247. };
  248. let userModel = this.db.model(insertData, this.schema);
  249. return new Promise(function (resolve, reject) {
  250. userModel.save(function (error) {
  251. if (error) {
  252. console.log(error);
  253. reject(false);
  254. } else {
  255. resolve(true);
  256. }
  257. });
  258. });
  259. }
  260. /**
  261. * 更新用户数据
  262. *
  263. * @param {object} updateData
  264. * @return {Promise}
  265. */
  266. updateUser(condition, updateData) {
  267. if (Object.keys(condition).length <= 0 || Object.keys(updateData).length <= 0) {
  268. return null;
  269. }
  270. let userModel = this.db.model('users', this.schema);
  271. return new Promise(function(resolve, reject) {
  272. // 验证数据
  273. let model = new userModel(updateData);
  274. let validationError = model.validateSync();
  275. if (validationError) {
  276. reject(validationError);
  277. }
  278. userModel.update(condition, {$set: updateData}, function(error, result) {
  279. if (error) {
  280. reject(error);
  281. } else {
  282. resolve(result);
  283. }
  284. });
  285. });
  286. }
  287. }
  288. module.exports = UserModel;