瀏覽代碼

Merge branch 'dev' of http://192.168.1.41:3000/maixinrong/Calculation into dev

Tony Kang 1 年之前
父節點
當前提交
333c493b4e

+ 8 - 1
app/controller/setting_controller.js

@@ -171,6 +171,7 @@ module.exports = app => {
                     user_total,
                     unitList,
                     company,
+                    jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.setting.user),
                     // rule: JSON.stringify(frontRule),
                 };
                 await this.layout('setting/user.ejs', renderData, 'setting/user_modal.ejs');
@@ -277,6 +278,7 @@ module.exports = app => {
                     company,
                     noticeAgainConst,
                     noticeSet,
+                    jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.setting.user),
                     // rule: JSON.stringify(frontRule),
                 };
                 await this.layout('setting/user_permission.ejs', renderData, 'setting/user_permission_modal.ejs');
@@ -323,6 +325,7 @@ module.exports = app => {
                     unitList,
                     user_total,
                     fujianOssPath: ctx.app.config.fujianOssPath,
+                    jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.setting.user),
                 };
                 await this.layout('setting/user_unit.ejs', renderData, 'setting/user_unit_modal.ejs');
             } catch (error) {
@@ -370,7 +373,7 @@ module.exports = app => {
         async userUnitSave(ctx) {
             const projectData = ctx.session.sessionProject;
             const responseData = {
-                err: 0, msg: '', data: null,
+                err: 0, msg: '', data: {},
             };
             try {
                 // 验证数据
@@ -420,6 +423,10 @@ module.exports = app => {
                         }
                         await ctx.service.constructionUnit.update({sign_path: null}, {id: info.id});
                         break;
+                    case 'import-users':
+                        const import_result = await ctx.service.projectAccount.addUsers(projectData.id, data.users);
+                        responseData.data.insertNum = import_result;
+                        break;
                     default:
                         break;
                 }

+ 96 - 0
app/public/js/setting.js

@@ -409,6 +409,102 @@ $(document).ready(() => {
             $('#delete-sign').hide();
         })
     });
+
+    // 导入账号功能
+    let importFile = null;
+    $('#upload-xls-file').change(function () {
+        const file = this.files[0];
+        importFile = file;
+    });
+
+    $('#import-bills-btn').click(function() {
+        if (!importFile) {
+            toastr.error('请选择excel文件再确定');
+            return;
+        }
+        const ext = importFile.name.toLowerCase().split('.').splice(-1)[0];
+        const imgStr = /(xls|xlsx|XLS|XLSX)$/;
+        if (!imgStr.test(ext)) {
+            toastr.error('请导入正确格式的excel文件。');
+            return
+        }
+        const fileReader = new FileReader();
+        fileReader.onload = async function(ev) {
+            try{
+                const data = ev.target.result;
+                const tree = [];
+                const includeSpec = $('#xls-spec').is(':checked');
+                if (/(xls|xlsx|XLS|XLSX)$/.test(ext)) {
+                    const workbook = XLSX.read(data, {type: 'binary'}); // 以二进制流方式读取得到整份excel表格对象
+                    const jsonData = transExcel(XLSX.utils.sheet_to_json(workbook.Sheets[workbook.SheetNames[0]], { defval: null }));
+                    console.log(jsonData);
+                    // 判断新密码的强度
+                    const reg = /^(?![0-9]+$)(?![a-zA-Z]+$).{6,16}$/;
+                    for (const j of jsonData) {
+                        if (j.account === undefined || j.account === null || j.password === undefined || j.password === null ||
+                            j.name === undefined || j.name === null || j.company === undefined || j.company === null ||
+                            j.role === undefined || j.role === null || j.mobile === undefined || j.telephone === undefined) {
+                            continue;
+                        }
+                        if (!reg.test(j.password)) {
+                            continue;
+                        }
+                        if (_.findIndex(tree, function (o) { return o.account === j.account; }) === -1) {
+                            tree.push(j);
+                        }
+                    }
+                }
+                console.log(tree);
+                if (tree.length === 0) {
+                    toastr.error('导入数据为空,请检查excel是否符合模版要求。');
+                    return
+                }
+                postData('/setting/user/unit/save', { type: 'import-users', users: tree }, function (result) {
+                    if (result.insertNum > 0) {
+                        toastr.success('成功导入了' + result.insertNum + '个账号');
+                        setTimeout(function () {
+                            window.location.reload();
+                        }, 1500);
+                    } else {
+                        toastr.warning('未能导入任何账号,请检查账号、公司是否已存在或excel是否符合模版要求。');
+                    }
+                })
+            } catch (error) {
+                console.log(error);
+                toastr.error(error);
+                return
+            }
+        };
+
+        // 以二进制方式打开文件
+        fileReader.readAsBinaryString(importFile);
+        $('#upload-xls-file').val('');
+        importFile = null;
+    });
+
+    function transExcel(results) {
+        const mapInfo = {
+            '登录账号': 'account',
+            '登录密码': 'password',
+            '姓名': 'name',
+            '单位名称': 'company',
+            '职位': 'role',
+            '手机': 'mobile',
+            '电话': 'telephone',
+        };
+        return results.map(zhObj => {
+            const enObj = {}
+            const zhKeys = Object.keys(zhObj);
+
+            zhKeys.forEach(zhKey => {
+                const enKey = mapInfo[zhKey];
+
+                enObj[enKey] = zhObj[zhKey] && _.isString(zhObj[zhKey]) ? _.trim(zhObj[zhKey]) : zhObj[zhKey];
+            });
+
+            return enObj
+        })
+    }
 });
 
 function checkPasswordForm() {

+ 40 - 0
app/service/project_account.js

@@ -452,6 +452,46 @@ module.exports = app => {
             return result;
         }
 
+        async addUsers(pid, users) {
+            const paList = await this.getAllDataByCondition({ where: { project_id: pid } });
+            const insertData = [];
+            const create_time = Date.parse(new Date()) / 1000;
+            // 判断新密码的强度
+            const reg = /^(?![0-9]+$)(?![a-zA-Z]+$).{6,16}$/;
+            for (const u of users) {
+                if (u.account === undefined || u.account === null || u.name === undefined || u.name === null ||
+                    u.password === undefined || u.password === null || u.company === undefined || u.company === null ||
+                    u.role === undefined || u.role === null) {
+                    continue;
+                }
+                if (!reg.test(u.password)) {
+                    continue;
+                }
+                const companyInfo = await this.ctx.service.constructionUnit.getDataByCondition({ pid, name: u.company });
+                if (!companyInfo) continue;
+                u.company_id = companyInfo.id;
+                u.account_group = companyInfo.type;
+                if (this._.findIndex(paList, { account: u.account }) === -1 && this._.findIndex(insertData, { account: u.account }) === -1) {
+                    insertData.push({
+                        project_id: pid,
+                        account: u.account,
+                        name: u.name,
+                        password: crypto.createHmac('sha1', u.account).update(u.password)
+                            .digest().toString('base64'),
+                        account_group: u.account_group,
+                        company: u.company,
+                        company_id: companyInfo.id,
+                        role: u.role,
+                        mobile: u.mobile || '',
+                        telephone: u.telephone || '',
+                        create_time,
+                    });
+                }
+            }
+            if (insertData.length > 0) await this.db.insert(this.tableName, insertData);
+            return insertData.length;
+        }
+
         /**
          * 修改账号资料
          *

+ 1 - 0
app/view/setting/user.ejs

@@ -8,6 +8,7 @@
                 <% } else { %>
                     <a href="#add-unpass" data-toggle="modal" data-target="#add-unpass" class="btn btn-primary btn-sm pull-right">添加账号(受限)</a>
                 <% } %>
+                <a href="#add-batch" data-toggle="modal" data-target="#add-batch" class="btn btn-primary btn-sm pull-right mr-1">批量导入账号</a>
             </h2>
         </div>
     </div>

+ 114 - 0
app/view/setting/user_add_modal.ejs

@@ -0,0 +1,114 @@
+<!--弹出添加账号-->
+<div class="modal fade" id="add-user" data-backdrop="static">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">添加账号</h5>
+            </div>
+            <form method="post" action="/setting/user/add?_csrf_j=<%= ctx.csrf %>" onsubmit="return checkUserForm('add');">
+            <div class="modal-body">
+                <!--<div class="form-group">-->
+                    <!--<label><b class="text-danger">*</b>账号组</label>-->
+                    <!--<select class="form-control form-control-sm" name="account_group">-->
+                        <!--<option value="0">请选择</option>-->
+                        <!--<% for (const dw in accountGroup) { %>-->
+                        <!--<option value="<%= dw %>"><%= accountGroup[dw] %></option>-->
+                        <!--<% } %>-->
+                    <!--</select>-->
+                <!--</div>-->
+                <div class="form-group">
+                    <label>登录账号<b class="text-danger">*</b></label>
+                    <input class="form-control form-control-sm" name="account" placeholder="支持英文数字组合" type="text">
+                    <input value="" class="account-check" type="hidden">
+                    <div class="invalid-feedback">
+                        该账号已存在。
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label>登录密码<b class="text-danger">*</b></label>
+                    <div class="input-group">
+                        <input type="text" name="password" class="form-control form-control-sm" placeholder="密码支持英文数字及符号">
+                        <div class="input-group-append">
+                            <button id="rand-password" class="btn btn-outline-secondary btn-sm" type="button">随机密码</button>
+                        </div>
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label>姓名<b class="text-danger">*</b></label>
+                    <input class="form-control form-control-sm" name="name" value="" type="text">
+                </div>
+                <div class="form-group">
+                    <label>单位名称<b class="text-danger">*</b></label>
+                    <input value="7" name="account_group" type="hidden">
+                    <select class="form-control form-control-sm" name="company" id="add_user_company">
+                        <option>请选择</option>
+                        <% for (const u of unitList) { %>
+                            <option><%- u.name %></option>
+                        <% } %>
+                    </select>
+                </div>
+                <div class="form-group">
+                    <label>职位<b class="text-danger">*</b></label>
+                    <input class="form-control form-control-sm" name="role" value="" type="text">
+                </div>
+                <div class="form-group">
+                    <label>手机</label>
+                    <input class="form-control form-control-sm" name="mobile" value="" type="number">
+                </div>
+                <div class="form-group">
+                    <label>电话</label>
+                    <input class="form-control form-control-sm" name="telephone" placeholder="格式000-0000000" type="text">
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal">关闭</button>
+                <button type="submit" class="btn btn-primary btn-sm">确定添加</button>
+            </div>
+            </form>
+        </div>
+    </div>
+</div>
+<!--弹出账号受限-->
+<div class="modal" tabindex="-1" role="dialog" id="add-unpass">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">无法添加账号</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">&times;</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <p>账号已超过最大账号数,无法添加新账号。</p>
+                <p>当前限制账号总数:<b><%= projectData.max_user %></b></p>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal">关闭</button>
+            </div>
+        </div>
+    </div>
+</div>
+<!--批量导入账号-->
+<div class="modal fade" id="add-batch" data-backdrop="static">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">批量导入账号</h5>
+            </div>
+            <div class="modal-body">
+                <div class="form-group">
+                    <label for="exampleFormControlFile1">Excel说明模板</label>
+                    <div class="form-control form-control-plaintext"><a href="https://jiliang-qa.oss-cn-shenzhen.aliyuncs.com/loginimg/%E6%89%B9%E9%87%8F%E5%AF%BC%E5%85%A5%E8%B4%A6%E5%8F%B7%E7%A4%BA%E4%BE%8B.xlsx" class="btn btn-sm btn-link">下载模板</a></div>
+                </div>
+                <div class="form-group">
+                    <label for="upload-xls-file">选择文件</label>
+                    <input type="file" class="form-control-file" id="upload-xls-file" accept=".xls,.xlsx">
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">关闭</button>
+                <button type="button" class="btn btn-sm btn-primary" id="import-bills-btn">确定</button>
+            </div>
+        </div>
+    </div>
+</div>

+ 1 - 91
app/view/setting/user_modal.ejs

@@ -1,74 +1,4 @@
-<!--弹出添加账号-->
-<div class="modal fade" id="add-user" data-backdrop="static">
-    <div class="modal-dialog" role="document">
-        <div class="modal-content">
-            <div class="modal-header">
-                <h5 class="modal-title">添加账号</h5>
-            </div>
-            <form method="post" action="/setting/user/add?_csrf_j=<%= ctx.csrf %>" onsubmit="return checkUserForm('add');">
-            <div class="modal-body">
-                <!--<div class="form-group">-->
-                    <!--<label><b class="text-danger">*</b>账号组</label>-->
-                    <!--<select class="form-control form-control-sm" name="account_group">-->
-                        <!--<option value="0">请选择</option>-->
-                        <!--<% for (const dw in accountGroup) { %>-->
-                        <!--<option value="<%= dw %>"><%= accountGroup[dw] %></option>-->
-                        <!--<% } %>-->
-                    <!--</select>-->
-                <!--</div>-->
-                <div class="form-group">
-                    <label>登录账号<b class="text-danger">*</b></label>
-                    <input class="form-control form-control-sm" name="account" placeholder="支持英文数字组合" type="text">
-                    <input value="" class="account-check" type="hidden">
-                    <div class="invalid-feedback">
-                        该账号已存在。
-                    </div>
-                </div>
-                <div class="form-group">
-                    <label>登录密码<b class="text-danger">*</b></label>
-                    <div class="input-group">
-                        <input type="text" name="password" class="form-control form-control-sm" placeholder="密码支持英文数字及符号">
-                        <div class="input-group-append">
-                            <button id="rand-password" class="btn btn-outline-secondary btn-sm" type="button">随机密码</button>
-                        </div>
-                    </div>
-                </div>
-                <div class="form-group">
-                    <label>姓名<b class="text-danger">*</b></label>
-                    <input class="form-control form-control-sm" name="name" value="" type="text">
-                </div>
-                <div class="form-group">
-                    <label>单位名称<b class="text-danger">*</b></label>
-                    <!--<input class="form-control form-control-sm" name="company" value="" type="text">-->
-                    <input value="7" name="account_group" type="hidden">
-                    <select class="form-control form-control-sm" name="company">
-                        <option>请选择</option>
-                        <% for (const u of unitList) { %>
-                            <option <% if (company && company === u.name) { %>selected<% } %>><%- u.name %></option>
-                        <% } %>
-                    </select>
-                </div>
-                <div class="form-group">
-                    <label>职位<b class="text-danger">*</b></label>
-                    <input class="form-control form-control-sm" name="role" value="" type="text">
-                </div>
-                <div class="form-group">
-                    <label>手机</label>
-                    <input class="form-control form-control-sm" name="mobile" value="" type="number">
-                </div>
-                <div class="form-group">
-                    <label>电话</label>
-                    <input class="form-control form-control-sm" name="telephone" placeholder="格式000-0000000" type="text">
-                </div>
-            </div>
-            <div class="modal-footer">
-                <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal">关闭</button>
-                <button type="submit" class="btn btn-primary btn-sm">确定添加</button>
-            </div>
-            </form>
-        </div>
-    </div>
-</div>
+<% include ./user_add_modal.ejs %>
 <!--弹出编辑账号-->
 <div class="modal fade" id="edit-user" data-backdrop="static">
     <div class="modal-dialog" role="document">
@@ -150,26 +80,6 @@
         </div>
     </div>
 </div>
-<!--弹出账号受限-->
-<div class="modal" tabindex="-1" role="dialog" id="add-unpass">
-    <div class="modal-dialog" role="document">
-        <div class="modal-content">
-            <div class="modal-header">
-                <h5 class="modal-title">无法添加账号</h5>
-                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-                    <span aria-hidden="true">&times;</span>
-                </button>
-            </div>
-            <div class="modal-body">
-                <p>账号已超过最大账号数,无法添加新账号。</p>
-                <p>当前限制账号总数:<b><%= projectData.max_user %></b></p>
-            </div>
-            <div class="modal-footer">
-                <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal">关闭</button>
-            </div>
-        </div>
-    </div>
-</div>
 <!--弹出解绑账号-->
 <div class="modal fade" id="unlink-user" data-backdrop="static">
     <div class="modal-dialog" role="document">

+ 1 - 0
app/view/setting/user_permission.ejs

@@ -9,6 +9,7 @@
                 <% } else { %>
                     <a href="#add-unpass" data-toggle="modal" data-target="#add-unpass" class="btn btn-primary btn-sm pull-right">添加账号(受限)</a>
                 <% } %>
+                <a href="#add-batch" data-toggle="modal" data-target="#add-batch" class="btn btn-primary btn-sm pull-right mr-1">批量导入账号</a>
             </h2>
         </div>
     </div>

+ 1 - 90
app/view/setting/user_permission_modal.ejs

@@ -1,93 +1,4 @@
-<!--弹出添加账号-->
-<div class="modal fade" id="add-user" data-backdrop="static">
-    <div class="modal-dialog" role="document">
-        <div class="modal-content">
-            <div class="modal-header">
-                <h5 class="modal-title">添加账号</h5>
-            </div>
-            <form method="post" action="/setting/user/add?_csrf_j=<%= ctx.csrf %>" onsubmit="return checkUserForm('add');">
-            <div class="modal-body">
-                <!--<div class="form-group">-->
-                    <!--<label><b class="text-danger">*</b>账号组</label>-->
-                    <!--<select class="form-control form-control-sm" name="account_group">-->
-                        <!--<option value="0">请选择</option>-->
-                        <!--<% for (const dw in accountGroup) { %>-->
-                        <!--<option value="<%= dw %>"><%= accountGroup[dw] %></option>-->
-                        <!--<% } %>-->
-                    <!--</select>-->
-                <!--</div>-->
-                <div class="form-group">
-                    <label>登录账号<b class="text-danger">*</b></label>
-                    <input class="form-control form-control-sm" name="account" placeholder="支持英文数字组合" type="text">
-                    <input value="" class="account-check" type="hidden">
-                    <div class="invalid-feedback">
-                        该账号已存在。
-                    </div>
-                </div>
-                <div class="form-group">
-                    <label>登录密码<b class="text-danger">*</b></label>
-                    <div class="input-group">
-                        <input type="text" name="password" class="form-control form-control-sm" placeholder="密码支持英文数字及符号">
-                        <div class="input-group-append">
-                            <button id="rand-password" class="btn btn-outline-secondary btn-sm" type="button">随机密码</button>
-                        </div>
-                    </div>
-                </div>
-                <div class="form-group">
-                    <label>姓名<b class="text-danger">*</b></label>
-                    <input class="form-control form-control-sm" name="name" value="" type="text">
-                </div>
-                <div class="form-group">
-                    <label>单位名称<b class="text-danger">*</b></label>
-                    <input value="7" name="account_group" type="hidden">
-                    <select class="form-control form-control-sm" name="company">
-                        <option>请选择</option>
-                        <% for (const u of unitList) { %>
-                            <option <% if (company && company === u.name) { %>selected<% } %>><%- u.name %></option>
-                        <% } %>
-                    </select>
-                </div>
-                <div class="form-group">
-                    <label>职位<b class="text-danger">*</b></label>
-                    <input class="form-control form-control-sm" name="role" value="" type="text">
-                </div>
-                <div class="form-group">
-                    <label>手机<b class="text-danger">*</b></label>
-                    <input class="form-control form-control-sm" name="mobile" value="" type="number">
-                </div>
-                <div class="form-group">
-                    <label>电话</label>
-                    <input class="form-control form-control-sm" name="telephone" placeholder="格式000-0000000" type="text">
-                </div>
-            </div>
-            <div class="modal-footer">
-                <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal">关闭</button>
-                <button type="submit" class="btn btn-primary btn-sm">确定添加</button>
-            </div>
-            </form>
-        </div>
-    </div>
-</div>
-<!--弹出账号受限-->
-<div class="modal" tabindex="-1" role="dialog" id="add-unpass">
-    <div class="modal-dialog" role="document">
-        <div class="modal-content">
-            <div class="modal-header">
-                <h5 class="modal-title">无法添加账号</h5>
-                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-                    <span aria-hidden="true">&times;</span>
-                </button>
-            </div>
-            <div class="modal-body">
-                <p>账号已超过最大账号数,无法添加新账号。</p>
-                <p>当前限制账号总数:<b><%= projectData.max_user %></b></p>
-            </div>
-            <div class="modal-footer">
-                <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal">关闭</button>
-            </div>
-        </div>
-    </div>
-</div>
+<% include ./user_add_modal.ejs %>
 <section class="drawer" id="edit-user2" data-drawer-target="">
     <div class="drawer__overlay" tabindex="-1"></div>
     <form class="drawer__wrapper" method="post" action="/setting/user/permission?_csrf_j=<%= ctx.csrf %>">

+ 1 - 0
app/view/setting/user_unit.ejs

@@ -9,6 +9,7 @@
                 <% } else { %>
                 <a href="#add-unpass" data-toggle="modal" data-target="#add-unpass" class="btn btn-primary btn-sm pull-right mr-2">添加账号(受限)</a>
                 <% } %>
+                <a href="#add-batch" data-toggle="modal" data-target="#add-batch" class="btn btn-primary btn-sm pull-right mr-1">批量导入账号</a>
             </h2>
         </div>
     </div>

+ 1 - 90
app/view/setting/user_unit_modal.ejs

@@ -1,93 +1,4 @@
-<!--弹出添加账号-->
-<div class="modal fade" id="add-user" data-backdrop="static">
-    <div class="modal-dialog" role="document">
-        <div class="modal-content">
-            <div class="modal-header">
-                <h5 class="modal-title">添加账号</h5>
-            </div>
-            <form method="post" action="/setting/user/add?_csrf_j=<%= ctx.csrf %>" onsubmit="return checkUserForm('add');">
-            <div class="modal-body">
-                <!--<div class="form-group">-->
-                    <!--<label><b class="text-danger">*</b>账号组</label>-->
-                    <!--<select class="form-control form-control-sm" name="account_group">-->
-                        <!--<option value="0">请选择</option>-->
-                        <!--<% for (const dw in accountGroup) { %>-->
-                        <!--<option value="<%= dw %>"><%= accountGroup[dw] %></option>-->
-                        <!--<% } %>-->
-                    <!--</select>-->
-                <!--</div>-->
-                <div class="form-group">
-                    <label>登录账号<b class="text-danger">*</b></label>
-                    <input class="form-control form-control-sm" name="account" placeholder="支持英文数字组合" type="text">
-                    <input value="" class="account-check" type="hidden">
-                    <div class="invalid-feedback">
-                        该账号已存在。
-                    </div>
-                </div>
-                <div class="form-group">
-                    <label>登录密码<b class="text-danger">*</b></label>
-                    <div class="input-group">
-                        <input type="text" name="password" class="form-control form-control-sm" placeholder="密码支持英文数字及符号">
-                        <div class="input-group-append">
-                            <button id="rand-password" class="btn btn-outline-secondary btn-sm" type="button">随机密码</button>
-                        </div>
-                    </div>
-                </div>
-                <div class="form-group">
-                    <label>姓名<b class="text-danger">*</b></label>
-                    <input class="form-control form-control-sm" name="name" value="" type="text">
-                </div>
-                <div class="form-group">
-                    <label>单位名称<b class="text-danger">*</b></label>
-                    <input value="7" name="account_group" type="hidden">
-                    <select class="form-control form-control-sm" name="company" id="add_user_company">
-                        <option>请选择</option>
-                        <% for (const u of unitList) { %>
-                            <option><%- u.name %></option>
-                        <% } %>
-                    </select>
-                </div>
-                <div class="form-group">
-                    <label>职位<b class="text-danger">*</b></label>
-                    <input class="form-control form-control-sm" name="role" value="" type="text">
-                </div>
-                <div class="form-group">
-                    <label>手机</label>
-                    <input class="form-control form-control-sm" name="mobile" value="" type="number">
-                </div>
-                <div class="form-group">
-                    <label>电话</label>
-                    <input class="form-control form-control-sm" name="telephone" placeholder="格式000-0000000" type="text">
-                </div>
-            </div>
-            <div class="modal-footer">
-                <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal">关闭</button>
-                <button type="submit" class="btn btn-primary btn-sm">确定添加</button>
-            </div>
-            </form>
-        </div>
-    </div>
-</div>
-<!--弹出账号受限-->
-<div class="modal" tabindex="-1" role="dialog" id="add-unpass">
-    <div class="modal-dialog" role="document">
-        <div class="modal-content">
-            <div class="modal-header">
-                <h5 class="modal-title">无法添加账号</h5>
-                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-                    <span aria-hidden="true">&times;</span>
-                </button>
-            </div>
-            <div class="modal-body">
-                <p>账号已超过最大账号数,无法添加新账号。</p>
-                <p>当前限制账号总数:<b><%= projectData.max_user %></b></p>
-            </div>
-            <div class="modal-footer">
-                <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal">关闭</button>
-            </div>
-        </div>
-    </div>
-</div>
+<% include ./user_add_modal.ejs %>
 <div class="modal fade" id="add-company" data-backdrop="static">
     <div class="modal-dialog" role="document">
         <form method="post" class="modal-content" action="/setting/user/unit/add?_csrf_j=<%= ctx.csrf %>" onsubmit="return checkUnitForm();">

+ 11 - 1
config/web.js

@@ -1383,7 +1383,17 @@ const JsFiles = {
                     '/public/js/project_spread.js',
                 ],
                 mergeFile: 'project_spread',
-            }
+            },
+            user: {
+                files: [
+                    '/public/js/js-xlsx/xlsx.full.min.js',
+                    '/public/js/js-xlsx/xlsx.utils.js',
+                    '/public/js/export/jschardet.min.js',
+                    '/public/js/export/iconv-lite.js',
+                ],
+                mergeFiles: [],
+                mergeFile: 'setting_user',
+            },
         },
         settle: {
             list: {