Selaa lähdekoodia

个人用户导入

lrf 3 vuotta sitten
vanhempi
commit
ea684c95ab
3 muutettua tiedostoa jossa 154 lisäystä ja 77 poistoa
  1. 79 75
      app/controller/users/.personal.js
  2. 1 0
      app/router/users/personal.js
  3. 74 2
      app/service/users/personal.js

+ 79 - 75
app/controller/users/.personal.js

@@ -1,113 +1,117 @@
 module.exports = {
   create: {
     requestBody: [
-      "!name",
-      "!password",
-      "!phone",
-      "email",
-      "addr",
-      "office_phone",
-      "profession",
-      "code",
-      "openid",
-      "status",
-      "remark",
-      "juris",
-      "create_time",
-      "is_expert",
-      "school",
-      "major",
-      "card",
-      "zwzc",
+      '!name',
+      '!password',
+      '!phone',
+      'email',
+      'addr',
+      'office_phone',
+      'profession',
+      'code',
+      'openid',
+      'status',
+      'remark',
+      'juris',
+      'create_time',
+      'is_expert',
+      'school',
+      'major',
+      'card',
+      'zwzc',
     ],
   },
   destroy: {
-    params: ["!id"],
-    service: "delete",
+    params: ['!id'],
+    service: 'delete',
   },
   update: {
-    params: ["!id"],
+    params: ['!id'],
     requestBody: [
-      "name",
-      "phone",
-      "email",
-      "addr",
-      "office_phone",
-      "profession",
-      "code",
-      "openid",
-      "status",
-      "remark",
-      "juris",
-      "create_time",
-      "is_expert",
-      "school",
-      "major",
-      "card",
-      "zwzc",
+      'name',
+      'phone',
+      'email',
+      'addr',
+      'office_phone',
+      'profession',
+      'code',
+      'openid',
+      'status',
+      'remark',
+      'juris',
+      'create_time',
+      'is_expert',
+      'school',
+      'major',
+      'card',
+      'zwzc',
     ],
   },
   show: {
     parameters: {
-      params: ["!id"],
+      params: ['!id'],
     },
-    service: "fetch",
+    service: 'fetch',
   },
   index: {
     parameters: {
       query: {
-        name: "%name%",
-        phone: "phone",
-        code: "code",
-        juris: "juris",
-        status: "status",
-        profession: "profession",
-        "create_time@start": "create_time@start",
-        "create_time@end": "create_time@end",
+        name: '%name%',
+        phone: 'phone',
+        code: 'code',
+        juris: 'juris',
+        status: 'status',
+        profession: 'profession',
+        'create_time@start': 'create_time@start',
+        'create_time@end': 'create_time@end',
       },
       options: {
-        isdel: "0", // 默认条件
+        isdel: '0', // 默认条件
       },
     },
-    service: "query",
+    service: 'query',
     options: {
-      query: ["skip", "limit"],
-      sort: ["meta.createdAt"],
+      query: ['skip', 'limit'],
+      sort: ['meta.createdAt'],
       desc: true,
       count: true,
     },
   },
   //修改密码
   password: {
-    params: ["!id"],
-    requestBody: ["password"],
-    service: "password",
+    params: ['!id'],
+    requestBody: ['password'],
+    service: 'password',
   },
   // 登陆
   login: {
-    requestBody: ["phone", "password"],
-    service: "login",
+    requestBody: ['phone', 'password'],
+    service: 'login',
   },
   upgrade: {
     requestBody: [
-      "education",
-      "school",
-      "birthDate",
-      "qqwx",
-      "email",
-      "company",
-      "zwzc",
-      "expertise",
-      "img_path",
-      "workexperience",
-      "scientific",
-      "undertakingproject",
-      "scienceaward",
-      "social",
-      "status",
-      "remark",
-      "!id",
+      'education',
+      'school',
+      'birthDate',
+      'qqwx',
+      'email',
+      'company',
+      'zwzc',
+      'expertise',
+      'img_path',
+      'workexperience',
+      'scientific',
+      'undertakingproject',
+      'scienceaward',
+      'social',
+      'status',
+      'remark',
+      '!id',
     ],
-    service: "upgrade",
+    service: 'upgrade',
+  },
+
+  import: {
+    requestBody: ['uri'],
   },
 };

+ 1 - 0
app/router/users/personal.js

@@ -7,6 +7,7 @@ module.exports = app => {
   const vision = 'v0';
   const index = 'users';
   const target = 'personal';
+  router.post(target, `${profix}${vision}/${index}/${target}/import`, controller[index][target].import);
   router.post(target, `${profix}${vision}/${index}/${target}/upgrade`, controller[index][target].upgrade);
   router.post(target, `${profix}${vision}/${index}/${target}/login`, controller[index][target].login);
   router.post(target, `${profix}${vision}/${index}/${target}/password/:id`, controller[index][target].password);

+ 74 - 2
app/service/users/personal.js

@@ -5,6 +5,7 @@ const { ObjectId } = require('mongoose').Types;
 const _ = require('lodash');
 const jwt = require('jsonwebtoken');
 const assert = require('assert');
+const Excel = require('exceljs');
 
 // 个人用户
 class PersonalService extends CrudService {
@@ -48,7 +49,7 @@ class PersonalService extends CrudService {
     const { secret } = op;
     if (status !== '1') throw new BusinessError(ErrorCode.ACCESS_DENIED, '拒绝访问!');
     if (secret !== password) throw new BusinessError(ErrorCode.BAD_PASSWORD, '密码错误');
-    const data = _.omit(JSON.parse(JSON.stringify(object)), [ 'meta', 'password', '__v' ]);
+    const data = _.omit(JSON.parse(JSON.stringify(object)), ['meta', 'password', '__v']);
     const { secret: secrets } = this.config.jwt;
     const token = jwt.sign(data, secrets);
     // 记录登陆
@@ -73,7 +74,7 @@ class PersonalService extends CrudService {
     assert(id, '缺少个人用户ID');
     const user = await this.model.findOne({ _id: ObjectId(id) }, '+password');
     if (!user) throw new BusinessError(ErrorCode.DATA_NOT_EXIST, '未找到用户的信息');
-    data = _.omit(data, [ 'meta', '__v' ]);
+    data = _.omit(data, ['meta', '__v']);
     data.user_id = id;
     // 创建专家
     const is_expert = await this.ctx.model.Expert.count({ user_id: ObjectId(id) });
@@ -82,6 +83,77 @@ class PersonalService extends CrudService {
     user.is_expert = true;
     await user.save();
   }
+
+  async import({ uri }) {
+    assert(uri, '未获取到文件地址');
+    let domain = 'http://127.0.0.1';
+    const file = await this.ctx.curl(`${domain}${uri}`);
+    if (!(file && file.data)) {
+      throw new BusinessError(ErrorCode.DATA_NOT_EXIST, '未找到指定文件');
+    }
+    const workbook = new Excel.Workbook();
+    await workbook.xlsx.load(file.data);
+    const sheet = workbook.getWorksheet(1);
+    let meta = this.importMeta();
+    // 根据excel,将列序号加入meta中
+    const head = sheet.getRow(1)?.values;
+    for (let i = 0; i < head.length; i++) {
+      const e = head[i];
+      if (!e) continue;
+      const r = meta.find((f) => f.column === e);
+      if (r) r.index = i;
+    }
+    // 过滤出列表中不必要且不存在的字段
+    meta = meta.filter((f) => f.required || f.index);
+    const errorList = [];
+    const dataList = [];
+    sheet.eachRow(async (row, index) => {
+      if (index !== 1) {
+        const values = row.values;
+        const obj = {};
+        for (const m of meta) {
+          const { required, key, index, method } = m;
+          const value = values[index];
+          if (required && !value) {
+            // 必填且没值的情况
+            errorList.push({ message: `第${index}行数据,缺少必填项;` });
+            continue;
+          }
+          if (_.isFunction(method)) obj[key] = method(value);
+          else obj[key] = value;
+        }
+        dataList.push(obj);
+      }
+    });
+    if (errorList.length > 0) return errorList;
+    for (const i of dataList) {
+      try {
+        await this.create(i);
+      } catch (error) {
+        errorList.push(error);
+      }
+    }
+
+    return errorList;
+  }
+
+  importMeta() {
+    return [
+      { required: true, column: '用户名', key: 'name' },
+      { required: true, column: '手机号', key: 'phone' },
+      { required: true, column: '登录密码', key: 'password' },
+      { required: true, column: '邀请码', key: 'code' },
+      { required: true, column: '身份证号', key: 'card' },
+      { column: '电子邮箱', key: 'email' },
+      { column: '联系地址', key: 'addr' },
+      { column: '办公电话', key: 'office_phone' },
+      { column: '所属辖区', key: 'juris' },
+      { column: '院校', key: 'school' },
+      { column: '专业', key: 'major' },
+      { column: '职务职称', key: 'zwzc' },
+      { column: '审核状态', key: 'status' },
+    ];
+  }
 }
 
 module.exports = PersonalService;