戴艳蓉 před 3 roky
rodič
revize
19db8baffa

+ 4 - 4
scripts/generatePage.js

@@ -84,9 +84,9 @@ process.stdin.on("data", async chunk => {
       componentName = inputName;
     }
     log(`正在生成 views-列表 文件 ${listTablePath}`);
-    await generateFile(listTablePath, indexPage(componentName));
+    await generateFile(listTablePath, indexPage(inputName, componentName));
     log(`正在生成 views-添加修改详情 文件 ${addEditPath}`);
-    await generateFile(addEditPath, addEditPage(componentName));
+    await generateFile(addEditPath, addEditPage(inputName, componentName));
     log(`正在生成 apis-service 文件 ${servicePath}`);
     await generateFile(servicePath, servicePage);
     // log(`正在生成 apis-model 文件 ${moldePath}`);
@@ -103,7 +103,7 @@ process.stdin.on("end", () => {
 });
 function dotExistDirectoryCreate(directory) {
   return new Promise(resolve => {
-    mkdirs(directory, function() {
+    mkdirs(directory, function () {
       resolve(true);
     });
   });
@@ -115,7 +115,7 @@ function mkdirs(directory, callback) {
   if (exists) {
     callback();
   } else {
-    mkdirs(path.dirname(directory), function() {
+    mkdirs(path.dirname(directory), function () {
       fs.mkdirSync(directory);
       callback();
     });

+ 186 - 97
scripts/page/addEditPage.js

@@ -1,4 +1,4 @@
-module.exports = function(compoenntName) {
+module.exports = function(inputName,compoenntName) {
   return `<template>
   <el-dialog
     :title="title"
@@ -73,34 +73,78 @@ module.exports = function(compoenntName) {
   </el-dialog>
    </template>
    <script>
-   import asyncRequest from "@/apis/service/${compoenntName}";
-
+   import asyncRequest from "@/apis/service/${inputName}";
+   import resToken from "@/mixins/resToken";
+   import {
+    isnumber,
+    isMobile,
+    validEmail,
+    isAlphanumeric,
+    isChinese,
+    isEmoticon,
+    validAlphabets,
+  } from "@/utils/validate";
    export default {
     name: '${compoenntName}',
-    props: ["showModel", "id", "isDetail"],
+    props: ["showModel", "id", "isDetail","sitem"],
+    mixins: [resToken],
     data() {
-      let validatePass = (rule, value, callback) => {
-        if (value === "" || value === undefined) {
-          callback(new Error("请输入新密码"));
+      const validateusername = (rule, value, callback) => {
+        if (value === "") {
+          callback(new Error("账号不能为空!"));
         } else {
-          if (value.length < 6 || value.length > 15) {
-            callback(new Error("必须是6到15位,支持数字、字母、符号组合"));
+          if (value.length < 6 || value.length > 18) {
+            callback(new Error("账号规则为6~18位数字与字母组合!"));
           } else {
-            if (this.ruleForm.password2 !== "") {
-              this.$refs.ruleForm.validateField("password2");
+            if (isnumber(value)) {
+              callback(new Error("账号规则为6~18位数字与字母组合!"));
+            } else if (validAlphabets(value)) {
+              callback(new Error("账号规则为6~18位数字与字母组合!"));
+            } else if (!isAlphanumeric(value)) {
+              callback(new Error("账号规则为6~18位数字与字母组合!"));
+            } else {
+              callback();
+            }
+          }
+        }
+      };
+      const validatename = (rule, value, callback) => {
+        if (value === "") {
+          callback(new Error("真实姓名不能为空!"));
+        } else {
+          if (value.length < 2 || value.length > 12) {
+            callback(new Error("真实姓名规则为2~12位汉字!"));
+          } else {
+            if (!isChinese(value)) {
+              console.log(9999);
+              callback(new Error("真实姓名规则为2~12位汉字!"));
+            } else if (isEmoticon(value)) {
+              console.log(2345);
+              callback(new Error("真实姓名规则为2~12位汉字!"));
+            } else {
+              callback();
             }
+          }
+        }
+      };
+      const validatemobile = (rule, value, callback) => {
+        if (value === "") {
+          callback(new Error("手机号不能为空!"));
+        } else {
+          if (!isMobile(value)) {
+            callback(new Error("手机号格式不正确!"));
+          } else {
             callback();
           }
         }
       };
-      let validatePass2 = (rule, value, callback) => {
-        if (value === "" || value === undefined) {
-          callback(new Error("请再次输入密码"));
-        } else if (value !== this.ruleForm.password) {
-          callback(new Error("两次输入密码不一致!"));
+  
+      const validateEmail = (rule, value, callback) => {
+        if (value === "") {
+          callback();
         } else {
-          if (value.length < 6 || value.length > 15) {
-            callback(new Error("必须是6到15位,支持数字、字母、符号组合"));
+          if (!validEmail(value)) {
+            callback(new Error("邮箱格式不正确!"));
           } else {
             callback();
           }
@@ -108,161 +152,206 @@ module.exports = function(compoenntName) {
       };
       return {
         loading: false,
-        title: "添加管理人员",
+        title: "添加账号",
         showModelThis: this.showModel,
         ruleForm: {
-          tel: "",
-          fullName: "",
-          loginName: "",
-          passport: ""
-          // isAdmin: 0
+          username: "", // 账号
+          name: "", // 真实姓名
+          mobile: "",
+          email: "",
+          role_id: "",
+          status: "1",
+          item: [],
         },
         rulesThis: this.rules,
         rules: {
-          loginName: [
+          name: [
             {
               required: true,
-              message: "请输入登录名",
-              trigger: "blur"
+              validator: validatename,
+              trigger: "blur",
             },
+          ],
+          username: [
             {
-              min: 2,
-              max: 30,
-              message: "长度在 2 到 30 个字符",
-              trigger: "blur"
-            }
+              required: true,
+              validator: validateusername,
+              trigger: "blur",
+            },
           ],
-          fullName: [
+          mobile: [
             {
               required: true,
-              message: "请输入姓名",
-              trigger: "blur"
+              validator: validatemobile,
+              trigger: "blur",
             },
+          ],
+          email: [
             {
-              min: 2,
-              max: 30,
-              message: "长度在 2 到 30 个字符",
-              trigger: "blur"
-            }
+              required: false,
+              validator: validateEmail,
+              trigger: "blur",
+            },
           ],
-          password: [
+          role_id: [
             {
               required: true,
-              validator: validatePass,
-              trigger: "blur"
-            }
+              message: "请选择角色",
+              trigger: "change",
+            },
           ],
-          password2: [
+          item: [
             {
+              type: "array",
               required: true,
-              validator: validatePass2,
-              trigger: "blur"
-            }
+              message: "请选择所在部门",
+              trigger: "change",
+            },
           ],
-          tel: [
+          status: [
             {
               required: true,
-              message: "请输入手机号码",
-              trigger: "blur"
+              message: "请选择状态",
+              trigger: "change",
             },
-            {
-              validator: this.$rulesPhone,
-              trigger: "blur"
-            }
-          ]
+          ],
         }
       };
     },
+    watch: {
+      showModel: function(val) {
+        this.showModelThis = val;
+        if (val) {
+          this.initForm();
+        }
+      },
+      showModelThis(val) {
+        if (!val) {
+          this.$emit("cancel");
+        }
+      }
+    },
     methods: {
       closeModel() {
         console.log("closeModel!!");
       },
       async initForm() {
+        this.loading = true;
+        // await this.getRole();
         if (this.id === "add") {
-          this.title = "添加管理人员";
-          // this.ruleForm.isAdmin = 0;
-          this.loading = false;
+          this.title = "添加账号";
           this.rulesThis = this.rules;
           await this.resetForm();
         } else {
           if (this.isDetail) {
-            this.title = "管理人员详情";
+            this.title = "账号详情";
             this.rulesThis = {};
           } else {
-            this.title = "修改管理人员";
+            this.title = "修改账号";
             this.rulesThis = this.rules;
           }
-          await this.resetForm();
-          await this.initData();
+          await this.resetForm(this.sitem);
+          // await this.initData()
         }
+        this.loading = false;
       },
+      // async getRole() {
+      //   const model = {
+      //     status: "", // 状态
+      //     level: "", // 姓名
+      //     role_name: "",
+      //   };
+      //   const res = await asyncRequest.getRole(model);
+      //   if (res && res.code === 0 && res.data) {
+      //     this.roleList = res.data;
+      //     this.roleList.map((v1) => {
+      //       v1.id += "";
+      //       v1.status += "";
+      //       return v1;
+      //     });
+      //   }
+      // },
       async initData() {
-        this.loading = true;
-        let res = await asyncRequest.detail({id:this.id});
-        this.loading = false;
-        if (res.code === 0) {
-          this.ruleForm = res.data;
-        }
+        const res = await asyncRequest.detail({ id: this.id });
+      if (res && res.code === 0 && res.data) {
+        this.ruleForm = res.data;
+        this.ruleForm.role_id = this.ruleForm.role;
+      } else if (res && res.code >= 100 && res.code <= 104) {
+        await this.logout();
+      } else {
+        this.$message.warning(res.message);
+      }
       },
-      async resetForm() {
+      async resetForm(sitem) {
         // 重置
         await this.$nextTick(() => {
           if (this.$refs.ruleForm) {
             this.$refs.ruleForm.resetFields();
             this.$refs.ruleForm.clearValidate();
+            const { username, nickname, mobile, email, roleid, status, item } =
+              sitem;
             this.ruleForm = {
-              tel: "",
-              fullName: "",
-              loginName: "",
-              passport: ""
-              // isAdmin: 0
+              username: username || "", // 账号
+              name: nickname || "", // 真实姓名
+              mobile: mobile || "",
+              email: email || "",
+              role_id: roleid || "",
+              status: status || "",
+              item: item || [],
             };
+            if (this.id === "add" || this.isDetail) {
+              this.rules.username[0].required = false;
+            }
           }
         });
       },
+    
       async submitForm() {
-        await this.$refs.ruleForm.validate(async valid => {
+        await this.$refs.ruleForm.validate(async (valid) => {
           if (valid) {
             this.loading = true;
-            let obj = JSON.parse(JSON.stringify(this.ruleForm));
+            const { username, name, mobile, email, role_id, status } = JSON.parse(
+              JSON.stringify(this.ruleForm)
+            );
+            const model = {
+              id: this.id,
+              username: username || "", // 账号
+              nickname: name || "", // 真实姓名
+              mobile: mobile || "",
+              email: email || "",
+              role: role_id || "",
+              status: status || "",
+            };
             let res = {};
             if (this.id === "add") {
-              obj.passport = obj.password;
-              res = await asyncRequest.add(obj);
+              delete model["id"];
+              res = await asyncRequest.add(model);
             } else {
-              res = await asyncRequest.update(obj);
+              res = await asyncRequest.update(model);
             }
             this.loading = false;
-            if (res.code === 0) {
-              let title = this.id === "add" ? "添加成功" : "修改成功";
+            if (res && res.code === 0) {
+              const title = this.id === "add" ? "添加成功" : "修改成功";
               this.$notify.success({
                 title,
-                message: ""
+                message: "",
               });
               this.showModelThis = false;
               // 刷新
               this.$emit("refresh");
+            } else if (res && res.code >= 100 && res.code <= 104) {
+              await this.logout();
+            } else {
+              this.$message.warning(res.message);
             }
           } else {
             console.log("error submit!!");
             return false;
           }
         });
-      }
-    },
-    watch: {
-      showModel: function(val) {
-        this.showModelThis = val;
-        if (val) {
-          this.initForm();
-        }
       },
-      showModelThis(val) {
-        if (!val) {
-          this.$emit("cancel");
-        }
-      }
-    }
+    },
+ 
   };
   </script>
 

+ 320 - 193
scripts/page/indexPage.js

@@ -1,173 +1,206 @@
-module.exports = function (compoenntName) {
+module.exports = function (inputName, compoenntName) {
   return `<template>
     <div class="${compoenntName} pagePadding">
-      <el-row :gutter="10">
-        <el-col :span="24" style="padding:  0 0 18px 0">
-          <el-col :span="3">
-            <el-input
-            :size="searchSize"
-              v-model="parmValue.loginName"
-              :maxlength="40"
-              placeholder="账户"
-            ></el-input>
-          </el-col>
-          <el-col :span="3">
-            <el-input
-            :size="searchSize"
-              v-model="parmValue.fullName"
-              :maxlength="40"
-              placeholder="姓名"
-            ></el-input>
-          </el-col>
-          <el-col :span="3" style="width: 152px;">
-            <el-button
-              type="primary"
-              :size="searchSize"
-              @click="searchList"
-              icon="el-icon-search"
-            ></el-button>
-            <el-button type="warning" :size="searchSize" @click="restSearch">
-              重置
-            </el-button>
-          </el-col>
-          <el-col :span="3" style="width: 195px;float:right;">
-            <el-button
-              type="primary"
-              :size="searchSize"
-              style="float:right;margin-left:5px;"
-              @click="searchList"
-            >
-              刷新
-            </el-button>
-            <el-button
-              type="success"
-              :size="searchSize"
-              style="float:right;"
-              @click="openModal('add', false)"
-            >
-              添加
-            </el-button>
-          </el-col>
-        </el-col>
-      </el-row>
-      <el-table
-        :data="tableData"
-        stripe
-        v-loading="loading"
-        border
-        :size="size"
-        style="width: 100%;"
-      >
-        <el-table-column
-          prop="loginName"
-          label="账户"
-          show-overflow-tooltip
-          align="center"
-        ></el-table-column>
-        <el-table-column
-          prop="fullName"
-          label="姓名"
-          show-overflow-tooltip
-          align="center"
-        ></el-table-column>
-        <!-- <el-table-column
-          prop="userId"
-          label="所属用户"
-          show-overflow-tooltip
-          align="center"
-        ></el-table-column> -->
-        <el-table-column
-          prop="tel"
-          label="手机号"
-          show-overflow-tooltip
-          align="center"
-        ></el-table-column>
-        <el-table-column label="用户类型" show-overflow-tooltip align="center">
-          <template slot-scope="scope">
-            <el-tag type="success"   :size="tablebtnSize" v-if="scope.row.type === 1">运营人员</el-tag>
-            <el-tag type="warning"   :size="tablebtnSize" v-else>物业人员</el-tag>
-          </template>
-        </el-table-column>
-        <el-table-column label="状态" show-overflow-tooltip align="center">
-        <template slot-scope="scope">
-          <el-tooltip
-             
-            effect="dark"
-            :content="scope.row.status === '1' ? '改为禁用' : '改为启用'"
-            placement="top"
-          >
-            <el-tag
-              :size="tablebtnSize"
-              v-if="scope.row.status === '1'"
-              type="success"
-              @click="statusConfirm(scope.row.id, scope.row.status)"
-              >启用</el-tag
-            >
-            <el-tag
-              v-else
-              :size="tablebtnSize"
-              type="warning"
-              @click="statusConfirm(scope.row.id, scope.row.status)"
-              >禁用</el-tag
-            >
-          </el-tooltip>
-        </template>
-      </el-table-column>
-        <el-table-column
-          prop="createTime"
-          label="创建时间"
-          show-overflow-tooltip
-          align="center"
-        ></el-table-column>
-        <el-table-column label="是否超管" show-overflow-tooltip align="center">
-          <template slot-scope="scope">
-            <el-tag type="warning"   :size="tablebtnSize" v-if="scope.row.isAdmin === 0">否</el-tag>
-            <el-tag type="success"   :size="tablebtnSize" v-else>是</el-tag>
-          </template>
-        </el-table-column>
-        <el-table-column fixed="right" label="操作" align="center" width="250">
-          <template slot-scope="scope">
-            <el-button
-              type="success"
-              :size="tablebtnSize"
-              @click="openModal(scope.row.id, false)"
-            >
-              修改
-            </el-button>
-            <el-button
-              type="danger"
-              :size="tablebtnSize"
-              :disabled="scope.row.isAdmin === 1"
-              @click="deleteById(scope.row.id)"
-            >
-              删除
-            </el-button>
-            <el-button
-              type="warning"
-              :size="tablebtnSize"
-              @click="openModal(scope.row.id, true)"
-            >
-              详情
-            </el-button>
-          </template>
-        </el-table-column>
-      </el-table>
-      <div
-        class="Pagination"
-        style="text-align: right;margin-top: 10px;"
-        v-show="count > 0"
-      >
-      <el-pagination
-      :size="searchSize"
-       @size-change="handleSizeChange"
-       @current-change="handlePageChange"
-       :current-page="parmValue.page"
-       :page-sizes="[10, 15, 20, 30, 40]"
-       :page-size="parmValue.size"
-       layout="total, sizes, prev, pager, next, jumper"
-       :total="count"
-     ></el-pagination>
-      </div>
+    <div
+    v-if="powers && powers.length > 0 && powers.some((item) => item == '001')"
+  >
+    <ex-table
+      v-loading="loading"
+      v-if="
+        powers && powers.length > 0 && powers.some((item) => item == '001')
+      "
+      :table="table"
+      :data="tableData"
+      :columns="columns"
+      :page="pageInfo"
+      :size="size"
+      @page-curr-change="handlePageChange"
+      @page-size-change="handleSizeChange"
+      @screen-reset="
+        pageInfo.curr = 1;
+        parmValue.page = 1;
+        searchList();
+      "
+      @screen-submit="
+        pageInfo.curr = 1;
+        parmValue.page = 1;
+        searchList();
+      "
+    >
+      <template #table-header="{}">
+        <div style="width: 100%">
+          <el-row style="padding: 0 0 0 80px">
+            <el-col :span="24">
+              <el-col :span="4" style="width: 120px">
+                <el-select
+                  :size="searchSize"
+                  v-model="parmValue.status"
+                  filterable
+                  clearable
+                  placeholder="账号状态"
+                  style="width: 100%"
+                  @change="
+                    pageInfo.curr = 1;
+                    parmValue.page = 1;
+                    searchList();
+                  "
+                >
+                  <el-option
+                    v-for="item in statusList"
+                    :key="'status' + item.code"
+                    :label="item.name"
+                    :value="item.code"
+                  />
+                </el-select>
+              </el-col>
+              <el-col :span="4" style="width: 150px; padding: 0 0 0 10px">
+                <el-input
+                  :size="searchSize"
+                  v-model="parmValue.name"
+                  :maxlength="40"
+                  placeholder="业务员姓名"
+                />
+              </el-col>
+              <el-col :span="4" style="width: 160px; padding: 0 0 0 10px">
+                <el-input
+                  :size="searchSize"
+                  v-model="parmValue.username"
+                  :maxlength="40"
+                  placeholder="手机号"
+                />
+              </el-col>
+              <el-col :span="4" style="width: 54px">
+                <el-button
+                  :size="searchSize"
+                  type="primary"
+                  class="fr"
+                  icon="el-icon-search"
+                  @click="searchList"
+              /></el-col>
+              <el-col
+                :span="4"
+                style="width: 66px"
+                v-if="powers.some((item) => item == '024')"
+              >
+                <el-button
+                  type="warning"
+                  class="fr"
+                  :size="searchSize"
+                  @click="restSearch"
+                >
+                  重置
+                </el-button>
+              </el-col>
+              <el-col
+                :span="3"
+                style="width: 66px; float: right"
+                v-if="powers.some((item) => item == '002')"
+              >
+                <el-button
+                  :size="searchSize"
+                  type="primary"
+                  style="float: right; margin-left: 5px"
+                  @click="searchList"
+                >
+                  刷新
+                </el-button>
+              </el-col>
+            </el-col>
+          </el-row>
+        </div>
+      </template>
+      <template #status="{ scope }">
+        <el-tag
+          :size="tablebtnSize"
+          :type="scope.row.status == '0' ? 'warning' : ''"
+          v-text="
+            (statusOptions.find((item) => item.id == scope.row.status) || {})
+              .label || '--'
+          "
+        ></el-tag>
+      </template>
+      <template #operation="{ scope }">
+        <el-tooltip
+          v-if="powers.some((item) => item == '020')"
+           
+          effect="dark"
+          content="重置密码"
+          placement="top"
+        >
+          <i
+            class="el-icon-refresh-left tb-icon"
+            @click="openPasswordModal(scope.row.id, false)"
+          ></i>
+        </el-tooltip>
+
+        <el-tooltip
+          v-if="powers.some((item) => item == '007')"
+           
+          effect="dark"
+          content="详情"
+          placement="top"
+        >
+          <i
+            class="el-icon-view tb-icon"
+            @click="openModal(scope.row.id, true, scope.row)"
+          ></i>
+        </el-tooltip>
+        <el-tooltip
+          v-if="powers.some((item) => item == '005')"
+           
+          effect="dark"
+          content="修改"
+          placement="top"
+        >
+          <i
+            class="el-icon-edit tb-icon"
+            @click="openModal(scope.row.id, false, scope.row)"
+          ></i>
+        </el-tooltip>
+        <el-tooltip
+          v-if="
+            powers.some((item) => item == '004') && scope.row.status === '1'
+          "
+           
+          effect="dark"
+          content="禁用"
+          placement="top"
+        >
+          <i
+            class="el-icon-video-pause tb-icon"
+            @click="statusConfirm(scope.row.id, scope.row.status)"
+          ></i>
+        </el-tooltip>
+        <el-tooltip
+          v-if="
+            powers.some((item) => item == '004') && scope.row.status === '0'
+          "
+           
+          effect="dark"
+          content="启用"
+          placement="top"
+        >
+          <i
+            class="el-icon-video-play tb-icon"
+            @click="statusConfirm(scope.row.id, scope.row.status)"
+          ></i>
+        </el-tooltip>
+      </template>
+    </ex-table>
+    <add-edit
+      :id="modelId"
+      :sitem="sitem"
+      :show-model="showModel"
+      :is-detail="isDetail"
+      @refresh="searchList"
+      @cancel="showModel = false"
+    />
+  </div>
+  <div v-else>
+    <no-auth></no-auth>
+  </div>
+       
+   
       <add-edit
         :showModel="showModel"
         :id="modelId"
@@ -179,29 +212,109 @@ module.exports = function (compoenntName) {
    </template>
    <script>
     import mixinPage from "@/mixins/elPaginationHandle";
-    import asyncRequest from "@/apis/service/${compoenntName}";
+    import resToken from "@/mixins/resToken";
+    import ExTable from "@/components/ExTableNew.vue";
+    import statusList from "@/assets/js/statusList";
+    import asyncRequest from "@/apis/service/${inputName}";
     import addEdit from "./addEdit";
     import { mapGetters } from "vuex";
+   
    export default {
     name: '${compoenntName}',
+    mixins: [mixinPage, resToken],
+    components: {
+      addEdit,
+      ExTable,
+    },
     computed: {
       ...mapGetters(["tablebtnSize", "searchSize", "size"]),
+      powers() {
+        let tran =
+          this.$store.getters.btnList.find(
+            (item) => item.menu_route == "${compoenntName}"
+          ) || {};
+        if (tran && tran.action && tran.action.length > 0) {
+          return tran.action;
+        } else {
+          return [];
+        }
+      },
     },
     data() {
       return {
+        sitem: null,
+        // 状态
+        statusOptions: [
+          { id: "0", label: "禁用" },
+          { id: "1", label: "启用" },
+        ],
+        statusList: statusList,
         loading: true,
         showModel: false,
         isDetail: false,
         modelId: 0,
         parmValue: {
-          loginName: "", // 账户
-          fullName: "", // 姓名
-          type: 2, // 用户类型(1运营人员 2物业人员)
+          name: "", // 业务员名字
+          username: "", // 账号
+          status: "", //
           page: 1, // 页码
-          size: 10 // 每页显示条数
+          size: 15, // 每页显示条数
+        },
+        tableData: [],
+        passwordModel: false,
+        passwordModelId: 0,
+        isPasswordDetail: false,
+        // 表格 - 数据
+        tableData: [],
+        // 表格 - 参数
+        table: {
+          stripe: true,
+          border: true,
+          _defaultHeader_: ["setcol"],
         },
-        count: 0, // 总条数
-        tableData: []
+        // 表格 - 分页
+        pageInfo: {
+          size: 15,
+          curr: 1,
+          total: 0,
+        },
+        // 表格 - 列参数
+        columns: [
+          {
+            prop: "nickname",
+            label: "真实姓名",
+          },
+          {
+            prop: "role_name",
+            label: "角色名称",
+          },
+          {
+            prop: "mobile",
+            label: "联系电话",
+          },
+          {
+            prop: "email",
+            label: "邮箱",
+          },
+          {
+            prop: "status",
+            label: "状态",
+            _slot_: "status",
+            width: "80px",
+          },
+          {
+            prop: "addtime",
+            label: "创建时间",
+            sortable: true,
+          },
+          {
+            prop: "",
+            label: "操作",
+            fixed: "right",
+            _noset_: true,
+            _slot_: "operation",
+          },
+        ],
       };
     },
     mixins: [mixinPage],
@@ -214,33 +327,43 @@ module.exports = function (compoenntName) {
     methods: {
       restSearch() {
         this.parmValue = {
-          loginName: "", // 账户
-          fullName: "", // 姓名
-          type: 2, // 用户类型(1运营人员 2物业人员)
+          name: "", // 业务员名字
+          username: "", // 账号
+          status: "", //
           page: 1, // 页码
-          size: 10 // 每页显示条数
+          size: 10, // 每页显示条数
         };
         this.searchList();
       },
-      openModal(id, isDetail) {
+      
+      openModal(id, isDetail, sitem) {
         this.showModel = true;
         this.modelId = id;
         this.isDetail = isDetail;
+        this.sitem = sitem;
       },
-      async deleteById(id) {
+      async deleteById(id, status) {
         await this.$confirm("确定要删除?", {
           confirmButtonText: "确定",
           cancelButtonText: "取消",
-          type: "warning"
+          type: "warning",
         })
           .then(async () => {
-            let res = await asyncRequest.delete({ id });
-            if (res.code === 0) {
+            const model = {
+              id: id,
+              status: status === "1" ? "0" : "1",
+            };
+            const res = await asyncRequest.status(model);
+            if (res && res.code === 0) {
               this.$notify.success({
                 title: "删除成功",
-                message: ""
+                message: "",
               });
               this.searchList();
+            } else if (res && res.code >= 100 && res.code <= 104) {
+              await this.logout();
+            } else {
+              this.$message.warning(res.message);
             }
           })
           .catch(() => {
@@ -249,20 +372,22 @@ module.exports = function (compoenntName) {
       },
       async searchList() {
         this.loading = true;
-        let res = await asyncRequest.list(this.parmValue);
-        if (res.code === 0 && res.data) {
+        const res = await asyncRequest.list(this.parmValue);
+        if (res && res.code === 0 && res.data) {
           this.tableData = res.data.list;
-          this.count = Number(res.data.count);
+          this.pageInfo.total = Number(res.data.count);
+        } else if (res && res.code >= 100 && res.code <= 104) {
+          await this.logout();
         } else {
           this.tableData = [];
-          this.count = 0;
+          this.pageInfo.total = 0;
         }
         this.loading = false;
       },
+
       async statusConfirm(id, status) {
-        console.log(id, status);
         let str= status === "1" ? "禁用" : "启用"
-        await this.$confirm('确定要改为'+str, {
+        await this.$confirm('确定要改为'+str+'?',{
           confirmButtonText: "确定",
           cancelButtonText: "取消",
           type: "warning",
@@ -274,15 +399,17 @@ module.exports = function (compoenntName) {
               status: status === "1" ? "0" : "1",
             };
             const res = await asyncRequest.status(model);
-            if (res.code === 0) {
+            if (res && res.code === 0) {
               this.loading = false;
               this.$notify.success({
                 title: "状态修改成功!",
                 message: "",
               });
               await this.searchList();
+            } else if (res && res.code >= 100 && res.code <= 104) {
+              await this.logout();
             } else {
-              this.loading = false;
+              this.$message.warning(res.message);
             }
           })
           .catch(() => {

+ 18 - 0
src/apis/service/stock/survey/index.js

@@ -0,0 +1,18 @@
+// 物业管理员
+import http from "@/apis/axios";
+const api = "admin/";
+export default {
+  // 添加
+  add: (data, params) => http(api + "add", data, "post", params),
+  // 删除
+  delete: (data, params) => http(api + "delete", data, "post", params),
+  // 分页查询
+  list: (data, params) => http(api + "list", data, "post", params),
+  // 详情
+  detail: (data, params) => http(api + "detail", data, "post", params),
+  // 更新
+  update: (data, params) => http(api + "update", data, "post", params),
+  // 修改状态
+  status: (data, params) => http(api + "accountstatus", data, "post", params),
+};
+   

+ 1 - 0
src/views/interest/account/addEdit.vue

@@ -13,6 +13,7 @@
     element-loading-background="rgba(0, 0, 0, 0.8)"
     @close="closeModel"
   >
+  
     <el-card style="margin-top: -20px">
       <el-row :gutter="10">
         <el-col :span="24">

+ 0 - 8
src/views/interest/account/index.vue

@@ -186,14 +186,6 @@
           </el-tooltip>
         </template>
       </ex-table>
-      <!-- <el-row :gutter="10">
-        <el-col :span="24" style="padding: 0 0 18px 0">
-          
-        </el-col>
-      </el-row>
-
-      
-   -->
       <add-edit
         :id="modelId"
         :sitem="sitem"

+ 362 - 0
src/views/stock/survey/addEdit.vue

@@ -0,0 +1,362 @@
+<template>
+  <el-dialog
+    :title="title"
+    :center="true"
+    align="left"
+    top="5vh"
+    width="1040px"
+    @close="closeModel"
+    :close-on-click-modal="false"
+    :visible.sync="showModelThis"
+    v-loading="loading"
+    element-loading-text="拼命加载中"
+    element-loading-spinner="el-icon-loading"
+    element-loading-background="rgba(0, 0, 0, 0.8)"
+  >
+    <el-card>
+      <el-row :gutter="10">
+        <el-col :span="24">
+          <el-form
+            :model="ruleForm"
+            status-icon
+            :rules="rulesThis"
+            ref="ruleForm"
+            label-width="110px"
+            class="demo-ruleForm"
+          >
+            <el-form-item
+              label="登录名"
+              prop="loginName"
+              v-if="id === 'add' || isDetail"
+            >
+              <el-input
+                v-model="ruleForm.loginName"
+                :disabled="isDetail"
+              ></el-input>
+            </el-form-item>
+            <el-form-item label="姓名" prop="fullName">
+              <el-input
+                v-model="ruleForm.fullName"
+                :disabled="isDetail"
+              ></el-input>
+            </el-form-item>
+            <el-form-item label="手机号" prop="tel">
+              <el-input v-model="ruleForm.tel" :disabled="isDetail"></el-input>
+            </el-form-item>
+            <el-form-item label="密码" prop="password" v-if="id === 'add'">
+              <el-input
+                type="password"
+                placeholder="密码"
+                :maxlength="20"
+                v-model="ruleForm.password"
+              ></el-input>
+            </el-form-item>
+            <el-form-item label="确认密码" prop="password2" v-if="id === 'add'">
+              <el-input
+                type="password"
+                placeholder="再次输入密码"
+                :maxlength="20"
+                v-model="ruleForm.password2"
+              ></el-input>
+            </el-form-item>
+          </el-form>
+        </el-col>
+        <el-col :span="24" style="text-align: right;">
+          <el-button type="primary" @click="submitForm" v-if="!isDetail"
+            >保 存
+          </el-button>
+          <el-button @click="showModelThis = false">{{ isDetail ? "关 闭" : "取 消" }}</el-button>
+        </el-col>
+      </el-row>
+    </el-card>
+  </el-dialog>
+   </template>
+   <script>
+   import asyncRequest from "@/apis/service/stock/survey";
+   import resToken from "@/mixins/resToken";
+   import {
+    isnumber,
+    isMobile,
+    validEmail,
+    isAlphanumeric,
+    isChinese,
+    isEmoticon,
+    validAlphabets,
+  } from "@/utils/validate";
+   export default {
+    name: 'survey',
+    props: ["showModel", "id", "isDetail","sitem"],
+    mixins: [resToken],
+    data() {
+      const validateusername = (rule, value, callback) => {
+        if (value === "") {
+          callback(new Error("账号不能为空!"));
+        } else {
+          if (value.length < 6 || value.length > 18) {
+            callback(new Error("账号规则为6~18位数字与字母组合!"));
+          } else {
+            if (isnumber(value)) {
+              callback(new Error("账号规则为6~18位数字与字母组合!"));
+            } else if (validAlphabets(value)) {
+              callback(new Error("账号规则为6~18位数字与字母组合!"));
+            } else if (!isAlphanumeric(value)) {
+              callback(new Error("账号规则为6~18位数字与字母组合!"));
+            } else {
+              callback();
+            }
+          }
+        }
+      };
+      const validatename = (rule, value, callback) => {
+        if (value === "") {
+          callback(new Error("真实姓名不能为空!"));
+        } else {
+          if (value.length < 2 || value.length > 12) {
+            callback(new Error("真实姓名规则为2~12位汉字!"));
+          } else {
+            if (!isChinese(value)) {
+              console.log(9999);
+              callback(new Error("真实姓名规则为2~12位汉字!"));
+            } else if (isEmoticon(value)) {
+              console.log(2345);
+              callback(new Error("真实姓名规则为2~12位汉字!"));
+            } else {
+              callback();
+            }
+          }
+        }
+      };
+      const validatemobile = (rule, value, callback) => {
+        if (value === "") {
+          callback(new Error("手机号不能为空!"));
+        } else {
+          if (!isMobile(value)) {
+            callback(new Error("手机号格式不正确!"));
+          } else {
+            callback();
+          }
+        }
+      };
+  
+      const validateEmail = (rule, value, callback) => {
+        if (value === "") {
+          callback();
+        } else {
+          if (!validEmail(value)) {
+            callback(new Error("邮箱格式不正确!"));
+          } else {
+            callback();
+          }
+        }
+      };
+      return {
+        loading: false,
+        title: "添加账号",
+        showModelThis: this.showModel,
+        ruleForm: {
+          username: "", // 账号
+          name: "", // 真实姓名
+          mobile: "",
+          email: "",
+          role_id: "",
+          status: "1",
+          item: [],
+        },
+        rulesThis: this.rules,
+        rules: {
+          name: [
+            {
+              required: true,
+              validator: validatename,
+              trigger: "blur",
+            },
+          ],
+          username: [
+            {
+              required: true,
+              validator: validateusername,
+              trigger: "blur",
+            },
+          ],
+          mobile: [
+            {
+              required: true,
+              validator: validatemobile,
+              trigger: "blur",
+            },
+          ],
+          email: [
+            {
+              required: false,
+              validator: validateEmail,
+              trigger: "blur",
+            },
+          ],
+          role_id: [
+            {
+              required: true,
+              message: "请选择角色",
+              trigger: "change",
+            },
+          ],
+          item: [
+            {
+              type: "array",
+              required: true,
+              message: "请选择所在部门",
+              trigger: "change",
+            },
+          ],
+          status: [
+            {
+              required: true,
+              message: "请选择状态",
+              trigger: "change",
+            },
+          ],
+        }
+      };
+    },
+    watch: {
+      showModel: function(val) {
+        this.showModelThis = val;
+        if (val) {
+          this.initForm();
+        }
+      },
+      showModelThis(val) {
+        if (!val) {
+          this.$emit("cancel");
+        }
+      }
+    },
+    methods: {
+      closeModel() {
+        console.log("closeModel!!");
+      },
+      async initForm() {
+        this.loading = true;
+        // await this.getRole();
+        if (this.id === "add") {
+          this.title = "添加账号";
+          this.rulesThis = this.rules;
+          await this.resetForm();
+        } else {
+          if (this.isDetail) {
+            this.title = "账号详情";
+            this.rulesThis = {};
+          } else {
+            this.title = "修改账号";
+            this.rulesThis = this.rules;
+          }
+          await this.resetForm(this.sitem);
+          // await this.initData()
+        }
+        this.loading = false;
+      },
+      // async getRole() {
+      //   const model = {
+      //     status: "", // 状态
+      //     level: "", // 姓名
+      //     role_name: "",
+      //   };
+      //   const res = await asyncRequest.getRole(model);
+      //   if (res && res.code === 0 && res.data) {
+      //     this.roleList = res.data;
+      //     this.roleList.map((v1) => {
+      //       v1.id += "";
+      //       v1.status += "";
+      //       return v1;
+      //     });
+      //   }
+      // },
+      async initData() {
+        const res = await asyncRequest.detail({ id: this.id });
+      if (res && res.code === 0 && res.data) {
+        this.ruleForm = res.data;
+        this.ruleForm.role_id = this.ruleForm.role;
+      } else if (res && res.code >= 100 && res.code <= 104) {
+        await this.logout();
+      } else {
+        this.$message.warning(res.message);
+      }
+      },
+      async resetForm(sitem) {
+        // 重置
+        await this.$nextTick(() => {
+          if (this.$refs.ruleForm) {
+            this.$refs.ruleForm.resetFields();
+            this.$refs.ruleForm.clearValidate();
+            const { username, nickname, mobile, email, roleid, status, item } =
+              sitem;
+            this.ruleForm = {
+              username: username || "", // 账号
+              name: nickname || "", // 真实姓名
+              mobile: mobile || "",
+              email: email || "",
+              role_id: roleid || "",
+              status: status || "",
+              item: item || [],
+            };
+            if (this.id === "add" || this.isDetail) {
+              this.rules.username[0].required = false;
+            }
+          }
+        });
+      },
+    
+      async submitForm() {
+        await this.$refs.ruleForm.validate(async (valid) => {
+          if (valid) {
+            this.loading = true;
+            const { username, name, mobile, email, role_id, status } = JSON.parse(
+              JSON.stringify(this.ruleForm)
+            );
+            const model = {
+              id: this.id,
+              username: username || "", // 账号
+              nickname: name || "", // 真实姓名
+              mobile: mobile || "",
+              email: email || "",
+              role: role_id || "",
+              status: status || "",
+            };
+            let res = {};
+            if (this.id === "add") {
+              delete model["id"];
+              res = await asyncRequest.add(model);
+            } else {
+              res = await asyncRequest.update(model);
+            }
+            this.loading = false;
+            if (res && res.code === 0) {
+              const title = this.id === "add" ? "添加成功" : "修改成功";
+              this.$notify.success({
+                title,
+                message: "",
+              });
+              this.showModelThis = false;
+              // 刷新
+              this.$emit("refresh");
+            } else if (res && res.code >= 100 && res.code <= 104) {
+              await this.logout();
+            } else {
+              this.$message.warning(res.message);
+            }
+          } else {
+            console.log("error submit!!");
+            return false;
+          }
+        });
+      },
+    },
+ 
+  };
+  </script>
+
+   <style lang="scss" scoped>
+   .survey {
+    
+   }
+   </style>
+   

+ 419 - 0
src/views/stock/survey/index.vue

@@ -0,0 +1,419 @@
+<template>
+  <div class="survey pagePadding">
+    <div
+      v-if="powers && powers.length > 0 && powers.some((item) => item == '001')"
+    >
+      <ex-table
+        v-loading="loading"
+        v-if="
+          powers && powers.length > 0 && powers.some((item) => item == '001')
+        "
+        :table="table"
+        :data="tableData"
+        :columns="columns"
+        :page="pageInfo"
+        :size="size"
+        @page-curr-change="handlePageChange"
+        @page-size-change="handleSizeChange"
+        @screen-reset="
+          pageInfo.curr = 1;
+          parmValue.page = 1;
+          searchList();
+        "
+        @screen-submit="
+          pageInfo.curr = 1;
+          parmValue.page = 1;
+          searchList();
+        "
+      >
+        <template #table-header="{}">
+          <div style="width: 100%">
+            <el-row style="padding: 0 0 0 80px">
+              <el-col :span="24">
+                <el-col :span="4" style="width: 120px">
+                  <el-select
+                    :size="searchSize"
+                    v-model="parmValue.status"
+                    filterable
+                    clearable
+                    placeholder="账号状态"
+                    style="width: 100%"
+                    @change="
+                      pageInfo.curr = 1;
+                      parmValue.page = 1;
+                      searchList();
+                    "
+                  >
+                    <el-option
+                      v-for="item in statusList"
+                      :key="'status' + item.code"
+                      :label="item.name"
+                      :value="item.code"
+                    />
+                  </el-select>
+                </el-col>
+                <el-col :span="4" style="width: 150px; padding: 0 0 0 10px">
+                  <el-input
+                    :size="searchSize"
+                    v-model="parmValue.name"
+                    :maxlength="40"
+                    placeholder="业务员姓名"
+                  />
+                </el-col>
+                <el-col :span="4" style="width: 160px; padding: 0 0 0 10px">
+                  <el-input
+                    :size="searchSize"
+                    v-model="parmValue.username"
+                    :maxlength="40"
+                    placeholder="手机号"
+                  />
+                </el-col>
+                <el-col :span="4" style="width: 54px">
+                  <el-button
+                    :size="searchSize"
+                    type="primary"
+                    class="fr"
+                    icon="el-icon-search"
+                    @click="searchList"
+                /></el-col>
+                <el-col
+                  :span="4"
+                  style="width: 66px"
+                  v-if="powers.some((item) => item == '024')"
+                >
+                  <el-button
+                    type="warning"
+                    class="fr"
+                    :size="searchSize"
+                    @click="restSearch"
+                  >
+                    重置
+                  </el-button>
+                </el-col>
+                <el-col
+                  :span="3"
+                  style="width: 66px; float: right"
+                  v-if="powers.some((item) => item == '002')"
+                >
+                  <el-button
+                    :size="searchSize"
+                    type="primary"
+                    style="float: right; margin-left: 5px"
+                    @click="searchList"
+                  >
+                    刷新
+                  </el-button>
+                </el-col>
+              </el-col>
+            </el-row>
+          </div>
+        </template>
+        <template #status="{ scope }">
+          <el-tag
+            :size="tablebtnSize"
+            :type="scope.row.status == '0' ? 'warning' : ''"
+            v-text="
+              (statusOptions.find((item) => item.id == scope.row.status) || {})
+                .label || '--'
+            "
+          ></el-tag>
+        </template>
+        <template #operation="{ scope }">
+          <el-tooltip
+            v-if="powers.some((item) => item == '020')"
+            effect="dark"
+            content="重置密码"
+            placement="top"
+          >
+            <i
+              class="el-icon-refresh-left tb-icon"
+              @click="openPasswordModal(scope.row.id, false)"
+            ></i>
+          </el-tooltip>
+
+          <el-tooltip
+            v-if="powers.some((item) => item == '007')"
+            effect="dark"
+            content="详情"
+            placement="top"
+          >
+            <i
+              class="el-icon-view tb-icon"
+              @click="openModal(scope.row.id, true, scope.row)"
+            ></i>
+          </el-tooltip>
+          <el-tooltip
+            v-if="powers.some((item) => item == '005')"
+            effect="dark"
+            content="修改"
+            placement="top"
+          >
+            <i
+              class="el-icon-edit tb-icon"
+              @click="openModal(scope.row.id, false, scope.row)"
+            ></i>
+          </el-tooltip>
+          <el-tooltip
+            v-if="
+              powers.some((item) => item == '004') && scope.row.status === '1'
+            "
+            effect="dark"
+            content="禁用"
+            placement="top"
+          >
+            <i
+              class="el-icon-video-pause tb-icon"
+              @click="statusConfirm(scope.row.id, scope.row.status)"
+            ></i>
+          </el-tooltip>
+          <el-tooltip
+            v-if="
+              powers.some((item) => item == '004') && scope.row.status === '0'
+            "
+            effect="dark"
+            content="启用"
+            placement="top"
+          >
+            <i
+              class="el-icon-video-play tb-icon"
+              @click="statusConfirm(scope.row.id, scope.row.status)"
+            ></i>
+          </el-tooltip>
+        </template>
+      </ex-table>
+      <add-edit
+        :id="modelId"
+        :sitem="sitem"
+        :show-model="showModel"
+        :is-detail="isDetail"
+        @refresh="searchList"
+        @cancel="showModel = false"
+      />
+    </div>
+    <div v-else>
+      <no-auth></no-auth>
+    </div>
+
+    <add-edit
+      :showModel="showModel"
+      :id="modelId"
+      :isDetail="isDetail"
+      @refresh="searchList"
+      @cancel="showModel = false"
+    ></add-edit>
+  </div>
+</template>
+   <script>
+import mixinPage from "@/mixins/elPaginationHandle";
+import resToken from "@/mixins/resToken";
+import ExTable from "@/components/ExTableNew.vue";
+import statusList from "@/assets/js/statusList";
+import asyncRequest from "@/apis/service/stock/survey";
+import addEdit from "./addEdit";
+import { mapGetters } from "vuex";
+
+export default {
+  name: "survey",
+  mixins: [mixinPage, resToken],
+  components: {
+    addEdit,
+    ExTable,
+  },
+  computed: {
+    ...mapGetters(["tablebtnSize", "searchSize", "size"]),
+    powers() {
+      let tran =
+        this.$store.getters.btnList.find(
+          (item) => item.menu_route == "survey"
+        ) || {};
+      if (tran && tran.action && tran.action.length > 0) {
+        return tran.action;
+      } else {
+        return [];
+      }
+    },
+  },
+  data() {
+    return {
+      sitem: null,
+      // 状态
+      statusOptions: [
+        { id: "0", label: "禁用" },
+        { id: "1", label: "启用" },
+      ],
+      statusList: statusList,
+      loading: true,
+      showModel: false,
+      isDetail: false,
+      modelId: 0,
+      parmValue: {
+        name: "", // 业务员名字
+        username: "", // 账号
+        status: "", //
+        page: 1, // 页码
+        size: 15, // 每页显示条数
+      },
+      tableData: [],
+      passwordModel: false,
+      passwordModelId: 0,
+      isPasswordDetail: false,
+      // 表格 - 数据
+      tableData: [],
+      // 表格 - 参数
+      table: {
+        stripe: true,
+        border: true,
+        _defaultHeader_: ["setcol"],
+      },
+      // 表格 - 分页
+      pageInfo: {
+        size: 15,
+        curr: 1,
+        total: 0,
+      },
+      // 表格 - 列参数
+      columns: [
+        {
+          prop: "nickname",
+          label: "真实姓名",
+        },
+        {
+          prop: "role_name",
+          label: "角色名称",
+        },
+        {
+          prop: "mobile",
+          label: "联系电话",
+        },
+        {
+          prop: "email",
+          label: "邮箱",
+        },
+        {
+          prop: "status",
+          label: "状态",
+          _slot_: "status",
+          width: "80px",
+        },
+        {
+          prop: "addtime",
+          label: "创建时间",
+          sortable: true,
+        },
+        {
+          prop: "",
+          label: "操作",
+          fixed: "right",
+          _noset_: true,
+          _slot_: "operation",
+        },
+      ],
+    };
+  },
+  mixins: [mixinPage],
+  mounted() {
+    this.searchList();
+  },
+  components: {
+    addEdit,
+  },
+  methods: {
+    restSearch() {
+      this.parmValue = {
+        name: "", // 业务员名字
+        username: "", // 账号
+        status: "", //
+        page: 1, // 页码
+        size: 10, // 每页显示条数
+      };
+      this.searchList();
+    },
+
+    openModal(id, isDetail, sitem) {
+      this.showModel = true;
+      this.modelId = id;
+      this.isDetail = isDetail;
+      this.sitem = sitem;
+    },
+    async deleteById(id, status) {
+      await this.$confirm("确定要删除?", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(async () => {
+          const model = {
+            id: id,
+            status: status === "1" ? "0" : "1",
+          };
+          const res = await asyncRequest.status(model);
+          if (res && res.code === 0) {
+            this.$notify.success({
+              title: "删除成功",
+              message: "",
+            });
+            this.searchList();
+          } else if (res && res.code >= 100 && res.code <= 104) {
+            await this.logout();
+          } else {
+            this.$message.warning(res.message);
+          }
+        })
+        .catch(() => {
+          console.log("取消");
+        });
+    },
+    async searchList() {
+      this.loading = true;
+      const res = await asyncRequest.list(this.parmValue);
+      if (res && res.code === 0 && res.data) {
+        this.tableData = res.data.list;
+        this.pageInfo.total = Number(res.data.count);
+      } else if (res && res.code >= 100 && res.code <= 104) {
+        await this.logout();
+      } else {
+        this.tableData = [];
+        this.pageInfo.total = 0;
+      }
+      this.loading = false;
+    },
+
+    async statusConfirm(id, status) {
+      let str = status === "1" ? "禁用" : "启用";
+      await this.$confirm("确定要改为" + str + "?", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(async () => {
+          this.loading = true;
+          const model = {
+            id: id,
+            status: status === "1" ? "0" : "1",
+          };
+          const res = await asyncRequest.status(model);
+          if (res && res.code === 0) {
+            this.loading = false;
+            this.$notify.success({
+              title: "状态修改成功!",
+              message: "",
+            });
+            await this.searchList();
+          } else if (res && res.code >= 100 && res.code <= 104) {
+            await this.logout();
+          } else {
+            this.$message.warning(res.message);
+          }
+        })
+        .catch(() => {
+          console.log("取消");
+        });
+    },
+  },
+};
+</script>
+   <style lang="scss" scoped>
+.survey {
+}
+</style>
+