zhangjinxing 3 роки тому
батько
коміт
a8706c5c97

+ 18 - 0
src/apis/service/stock/allot/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),
+};
+   

+ 18 - 0
src/apis/service/stock/check/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),
+};
+   

+ 362 - 0
src/views/stock/allot/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/allot";
+   import resToken from "@/mixins/resToken";
+   import {
+    isnumber,
+    isMobile,
+    validEmail,
+    isAlphanumeric,
+    isChinese,
+    isEmoticon,
+    validAlphabets,
+  } from "@/utils/validate";
+   export default {
+    name: 'allot',
+    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>
+   .allot {
+    
+   }
+   </style>
+   

+ 420 - 0
src/views/stock/allot/index.vue

@@ -0,0 +1,420 @@
+<template>
+    <div class="allot pagePadding">
+    <div
+    v-if="powers && powers.length > 0 && powers.some((item) => item == '001')"
+  >
+    <ex-table
+      v-loading="loading"
+      :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/allot";
+    import addEdit from "./addEdit";
+    import { mapGetters } from "vuex";
+   
+   export default {
+    name: 'allot',
+    mixins: [mixinPage, resToken],
+    components: {
+      addEdit,
+      ExTable,
+    },
+    computed: {
+      ...mapGetters(["tablebtnSize", "searchSize", "size"]),
+      powers() {
+        let tran =
+          this.$store.getters.btnList.find(
+            (item) => item.menu_route == "allot"
+          ) || {};
+        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",
+          },
+        ],
+      };
+    },
+    mounted() {
+      this.searchList();
+    },
+  
+    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>
+   .allot {
+    
+   }
+   </style>
+   

+ 362 - 0
src/views/stock/check/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/check";
+   import resToken from "@/mixins/resToken";
+   import {
+    isnumber,
+    isMobile,
+    validEmail,
+    isAlphanumeric,
+    isChinese,
+    isEmoticon,
+    validAlphabets,
+  } from "@/utils/validate";
+   export default {
+    name: 'check',
+    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>
+   .check {
+    
+   }
+   </style>
+   

+ 420 - 0
src/views/stock/check/index.vue

@@ -0,0 +1,420 @@
+<template>
+    <div class="check pagePadding">
+    <div
+    v-if="powers && powers.length > 0 && powers.some((item) => item == '001')"
+  >
+    <ex-table
+      v-loading="loading"
+      :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/check";
+    import addEdit from "./addEdit";
+    import { mapGetters } from "vuex";
+   
+   export default {
+    name: 'check',
+    mixins: [mixinPage, resToken],
+    components: {
+      addEdit,
+      ExTable,
+    },
+    computed: {
+      ...mapGetters(["tablebtnSize", "searchSize", "size"]),
+      powers() {
+        let tran =
+          this.$store.getters.btnList.find(
+            (item) => item.menu_route == "check"
+          ) || {};
+        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",
+          },
+        ],
+      };
+    },
+    mounted() {
+      this.searchList();
+    },
+  
+    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>
+   .check {
+    
+   }
+   </style>
+   

+ 30 - 20
src/views/stock/survey/index.vue

@@ -1,27 +1,8 @@
 <template>
-  <div class="stockWarning pagePadding clear">
+  <div class="stockWarning pagePadding">
     <div
       v-if="powers && powers.length > 0 && powers.some((item) => item == '001')"
     >
-      <div class="stock-survey clear">
-        <el-row
-          :gutter="24"
-          v-for="item in stock_list"
-          :key="item.id"
-          style="float: left"
-        >
-          <el-col :span="24">
-            <el-card
-              shadow="always"
-              style="width: 220px; height: 115px; flex: 1 1 auto; margin: 20px"
-            >
-              <i :class="item.icon" class="icon"></i>
-              <p>{{ item.label }}</p>
-            </el-card>
-          </el-col>
-        </el-row>
-      </div>
-
       <ex-table
         v-loading="false"
         :table="table"
@@ -44,6 +25,30 @@
       >
         <template #table-header="{}">
           <div style="width: 100%">
+
+              <div class="stock-survey clear">
+            <el-row
+              :gutter="24"
+              v-for="item in stock_list"
+              :key="item.id"
+              style="float: left"
+            >
+              <el-col :span="24">
+                <el-card
+                  shadow="always"
+                  style="
+                    width: 220px;
+                    height: 115px;
+                    flex: 1 1 auto;
+                    margin: 20px;
+                  "
+                >
+                  <i :class="item.icon" class="icon"></i>
+                  <p>{{ item.label }}</p>
+                </el-card>
+              </el-col>
+            </el-row>
+          </div>
             <el-row style="padding: 0 0 0 80px">
               <el-col :span="24">
                 <!-- 请选择仓库 -->
@@ -61,6 +66,7 @@
                       searchList();
                     "
                   >
+                  
                     <el-option
                       v-for="item in stock"
                       :key="item.id"
@@ -102,6 +108,9 @@
             </el-row>
           </div>
         </template>
+
+        
+
         <template #status="{ scope }">
           <el-tag
             :size="tablebtnSize"
@@ -444,6 +453,7 @@ export default {
   margin-bottom: 30px;
   padding: 30px auto;
   display: flex;
+  // position: relative;
   justify-content: center;
   text-align: center;
   .icon {