xiaodai2017 2 yıl önce
ebeveyn
işleme
94f75de12e

+ 4 - 1
package.json

@@ -18,7 +18,10 @@
     "lint:pretty": "pretty-quick --staged",
     "lint": "pnpm lint:eslint && pnpm lint:prettier && pnpm lint:stylelint",
     "prepare": "husky install",
-    "preinstall": "npx only-allow pnpm"
+    "preinstall": "npx only-allow pnpm",
+    "new:comp": "node ./scripts/generateComponent",
+    "new:view": "node ./scripts/generateView",
+    "new:page": "node ./scripts/generatePage"
   },
   "browserslist": [
     "> 1%",

+ 93 - 0
scripts/generateComponent.js

@@ -0,0 +1,93 @@
+// generateComponent.js 文件,放置生成组件的代码
+const chalk = require("chalk");
+const path = require("path");
+const fs = require("fs");
+const resolve = (...file) => path.resolve(__dirname, ...file);
+// const log = message => console.log(chalk.green(`${message}`));
+// const successLog = message => console.log(chalk.blue(`${message}`));
+const log = message => console.log(chalk.yellow(`${message}`));
+const successLog = message => console.log(chalk.green(`${message}`));
+const errorLog = error => console.log(chalk.red(`${error}`));
+const { vueTemplate, entryTemplate } = require("./template");
+
+const generateFile = (path, data) => {
+  if (fs.existsSync(path)) {
+    errorLog(`${path}文件已存在`);
+    return;
+  }
+  return new Promise((resolve, reject) => {
+    fs.writeFile(path, data, "utf8", err => {
+      if (err) {
+        errorLog(err.message);
+        reject(err);
+      } else {
+        resolve(true);
+      }
+    });
+  });
+};
+log("请输入要生成的组件名称、如需生成全局组件,请加 global/ 前缀");
+let componentName = "";
+process.stdin.on("data", async chunk => {
+  const inputName = String(chunk)
+    .trim()
+    .toString();
+  // 组件目录路径
+  const componentDirectory = resolve("../src/components", inputName);
+
+  // vue组件路径
+  const componentVueName = resolve(componentDirectory, "main.vue");
+  // 入口文件路径
+  const entryComponentName = resolve(componentDirectory, "index.js");
+
+  const hasComponentDirectory = fs.existsSync(componentDirectory);
+  if (hasComponentDirectory) {
+    errorLog(`${inputName}组件目录已存在,请重新输入`);
+    return;
+  } else {
+    log(`正在生成 component 目录 ${componentDirectory}`);
+    await dotExistDirectoryCreate(componentDirectory);
+    // fs.mkdirSync(componentDirectory);
+  }
+  try {
+    if (inputName.includes("/")) {
+      const inputArr = inputName.split("/");
+      componentName = inputArr[inputArr.length - 1];
+    } else {
+      componentName = inputName;
+    }
+    log(`正在生成 vue 文件 ${componentVueName}`);
+    await generateFile(componentVueName, vueTemplate(componentName));
+    log(`正在生成 entry 文件 ${entryComponentName}`);
+    await generateFile(entryComponentName, entryTemplate);
+    successLog("生成成功");
+  } catch (e) {
+    errorLog(e.message);
+  }
+
+  process.stdin.emit("end");
+});
+process.stdin.on("end", () => {
+  log("exit");
+  process.exit();
+});
+function dotExistDirectoryCreate(directory) {
+  return new Promise(resolve => {
+    mkdirs(directory, function() {
+      resolve(true);
+    });
+  });
+}
+
+// 递归创建目录
+function mkdirs(directory, callback) {
+  var exists = fs.existsSync(directory);
+  if (exists) {
+    callback();
+  } else {
+    mkdirs(path.dirname(directory), function() {
+      fs.mkdirSync(directory);
+      callback();
+    });
+  }
+}

+ 103 - 0
scripts/generatePage.js

@@ -0,0 +1,103 @@
+// generatePage.js 文件,放置生成组件的代码
+const chalk = require("chalk");
+const path = require("path");
+const fs = require("fs");
+const resolve = (...file) => path.resolve(__dirname, ...file);
+const log = message => console.log(chalk.yellow(`${message}`));
+const successLog = message => console.log(chalk.green(`${message}`));
+const errorLog = error => console.log(chalk.red(`${error}`));
+const { indexPage, addEditPage, servicePage } = require("./template");
+
+const generateFile = (path, data) => {
+  if (fs.existsSync(path)) {
+    errorLog(`${path}文件已存在`);
+    return;
+  }
+  return new Promise((resolve, reject) => {
+    fs.writeFile(path, data, "utf8", err => {
+      if (err) {
+        errorLog(err.message);
+        reject(err);
+      } else {
+        resolve(true);
+      }
+    });
+  });
+};
+log("请输入要生成的页面名称:");
+let componentName = "";
+process.stdin.on("data", async chunk => {
+  const inputName = String(chunk).trim().toString();
+  // 页面组件目录路径
+  const componentDirectory = resolve("../src/views", inputName);
+  // apis-service 目录路径
+  const apisServiceDirectory = resolve("../src/apis/service", inputName);
+  // // apis-model 目录路径
+  // const apisModelDirectory = resolve("../src/apis/model", inputName);
+  // vue组件路径--首页--列表页
+  const listTablePath = resolve(componentDirectory, "index.vue");
+  // vue组件路径--添加修改详情
+  const addEditPath = resolve(componentDirectory, "addEdit.vue");
+  // service文件路径
+  const servicePath = resolve(apisServiceDirectory, "index.js");
+  // views页面文件目录
+  const hasComponentDirectory = fs.existsSync(componentDirectory);
+  if (hasComponentDirectory) {
+    errorLog(`${inputName}组件目录已存在,请重新输入`);
+    return;
+  } else {
+    log(`正在生成 component 目录 ${componentDirectory}`);
+    await dotExistDirectoryCreate(componentDirectory);
+  }
+  // service文件目录
+  const hasService = fs.existsSync(apisServiceDirectory);
+  if (hasService) {
+    errorLog(`${inputName}service目录已存在,请重新输入`);
+    return;
+  } else {
+    log(`正在生成 apis/service 目录 ${apisServiceDirectory}`);
+    await dotExistDirectoryCreate(apisServiceDirectory);
+  }
+  try {
+    if (inputName.includes("/")) {
+      const inputArr = inputName.split("/");
+      componentName = inputArr[inputArr.length - 1];
+    } else {
+      componentName = inputName;
+    }
+    log(`正在生成 views-列表 文件 ${listTablePath}`);
+    await generateFile(listTablePath, indexPage(componentName));
+    log(`正在生成 views-添加修改详情 文件 ${addEditPath}`);
+    await generateFile(addEditPath, addEditPage(componentName));
+    log(`正在生成 apis-service 文件 ${servicePath}`);
+    await generateFile(servicePath, servicePage);
+    successLog("生成成功");
+  } catch (e) {
+    errorLog(e.message);
+  }
+  process.stdin.emit("end");
+});
+process.stdin.on("end", () => {
+  log("exit");
+  process.exit();
+});
+function dotExistDirectoryCreate(directory) {
+  return new Promise(resolve => {
+    mkdirs(directory, function () {
+      resolve(true);
+    });
+  });
+}
+
+// 递归创建目录
+function mkdirs(directory, callback) {
+  var exists = fs.existsSync(directory);
+  if (exists) {
+    callback();
+  } else {
+    mkdirs(path.dirname(directory), function () {
+      fs.mkdirSync(directory);
+      callback();
+    });
+  }
+}

+ 93 - 0
scripts/generateView.js

@@ -0,0 +1,93 @@
+// generateView.js 文件,放置生成页面组件的代码
+const chalk = require("chalk");
+const path = require("path");
+const fs = require("fs");
+const resolve = (...file) => path.resolve(__dirname, ...file);
+const log = message => console.log(chalk.green(`${message}`));
+const successLog = message => console.log(chalk.blue(`${message}`));
+const errorLog = error => console.log(chalk.red(`${error}`));
+const { vueTemplate } = require("./template");
+
+const generateFile = (path, data) => {
+  if (fs.existsSync(path)) {
+    errorLog(`${path}文件已存在`);
+    return;
+  }
+  return new Promise((resolve, reject) => {
+    fs.writeFile(path, data, "utf8", err => {
+      if (err) {
+        errorLog(err.message);
+        reject(err);
+      } else {
+        resolve(true);
+      }
+    });
+  });
+};
+log("请输入要生成的页面组件名称、会生成在 views/目录下");
+let componentName = "";
+process.stdin.on("data", async chunk => {
+  const inputName = String(chunk)
+    .trim()
+    .toString();
+  /**
+   * Vue页面组件路径
+   */
+  let componentVueName = resolve("../src/views", inputName);
+  // 如果不是以 .vue 结尾的话,自动加上
+  if (!componentVueName.endsWith(".vue")) {
+    componentVueName += ".vue";
+  }
+  /**
+   * vue组件目录路径
+   */
+  const componentDirectory = path.dirname(componentVueName);
+
+  const hasComponentExists = fs.existsSync(componentVueName);
+  if (hasComponentExists) {
+    errorLog(`${inputName}页面组件已存在,请重新输入`);
+    return;
+  } else {
+    log(`正在生成 component 目录 ${componentDirectory}`);
+    await dotExistDirectoryCreate(componentDirectory);
+  }
+  try {
+    if (inputName.includes("/")) {
+      const inputArr = inputName.split("/");
+      componentName = inputArr[inputArr.length - 1];
+    } else {
+      componentName = inputName;
+    }
+    log(`正在生成 vue 文件 ${componentVueName}`);
+    await generateFile(componentVueName, vueTemplate(componentName));
+    successLog("生成成功");
+  } catch (e) {
+    errorLog(e.message);
+  }
+
+  process.stdin.emit("end");
+});
+process.stdin.on("end", () => {
+  log("exit");
+  process.exit();
+});
+function dotExistDirectoryCreate(directory) {
+  return new Promise(resolve => {
+    mkdirs(directory, function() {
+      resolve(true);
+    });
+  });
+}
+
+// 递归创建目录
+function mkdirs(directory, callback) {
+  var exists = fs.existsSync(directory);
+  if (exists) {
+    callback();
+  } else {
+    mkdirs(path.dirname(directory), function() {
+      fs.mkdirSync(directory);
+      callback();
+    });
+  }
+}

+ 275 - 0
scripts/page/addEditPage.js

@@ -0,0 +1,275 @@
+module.exports = function(compoenntName) {
+  return `<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/${compoenntName}";
+
+   export default {
+    name: '${compoenntName}',
+    props: ["showModel", "id", "isDetail"],
+    data() {
+      let validatePass = (rule, value, callback) => {
+        if (value === "" || value === undefined) {
+          callback(new Error("请输入新密码"));
+        } else {
+          if (value.length < 6 || value.length > 15) {
+            callback(new Error("必须是6到15位,支持数字、字母、符号组合"));
+          } else {
+            if (this.ruleForm.password2 !== "") {
+              this.$refs.ruleForm.validateField("password2");
+            }
+            callback();
+          }
+        }
+      };
+      let validatePass2 = (rule, value, callback) => {
+        if (value === "" || value === undefined) {
+          callback(new Error("请再次输入密码"));
+        } else if (value !== this.ruleForm.password) {
+          callback(new Error("两次输入密码不一致!"));
+        } else {
+          if (value.length < 6 || value.length > 15) {
+            callback(new Error("必须是6到15位,支持数字、字母、符号组合"));
+          } else {
+            callback();
+          }
+        }
+      };
+      return {
+        loading: false,
+        title: "添加管理人员",
+        showModelThis: this.showModel,
+        ruleForm: {
+          tel: "",
+          fullName: "",
+          loginName: "",
+          passport: ""
+          // isAdmin: 0
+        },
+        rulesThis: this.rules,
+        rules: {
+          loginName: [
+            {
+              required: true,
+              message: "请输入登录名",
+              trigger: "blur"
+            },
+            {
+              min: 2,
+              max: 30,
+              message: "长度在 2 到 30 个字符",
+              trigger: "blur"
+            }
+          ],
+          fullName: [
+            {
+              required: true,
+              message: "请输入姓名",
+              trigger: "blur"
+            },
+            {
+              min: 2,
+              max: 30,
+              message: "长度在 2 到 30 个字符",
+              trigger: "blur"
+            }
+          ],
+          password: [
+            {
+              required: true,
+              validator: validatePass,
+              trigger: "blur"
+            }
+          ],
+          password2: [
+            {
+              required: true,
+              validator: validatePass2,
+              trigger: "blur"
+            }
+          ],
+          tel: [
+            {
+              required: true,
+              message: "请输入手机号码",
+              trigger: "blur"
+            },
+            {
+              validator: this.$rulesPhone,
+              trigger: "blur"
+            }
+          ]
+        }
+      };
+    },
+    methods: {
+      closeModel() {
+        console.log("closeModel!!");
+      },
+      async initForm() {
+        if (this.id === "add") {
+          this.title = "添加管理人员";
+          // this.ruleForm.isAdmin = 0;
+          this.loading = false;
+          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();
+          await this.initData();
+        }
+      },
+      async initData() {
+        this.loading = true;
+        let res = await asyncRequest.detail({id:this.id});
+        this.loading = false;
+        if (res.code === 0) {
+          this.ruleForm = res.data;
+        }
+      },
+      async resetForm() {
+        // 重置
+        await this.$nextTick(() => {
+          if (this.$refs.ruleForm) {
+            this.$refs.ruleForm.resetFields();
+            this.$refs.ruleForm.clearValidate();
+            this.ruleForm = {
+              tel: "",
+              fullName: "",
+              loginName: "",
+              passport: ""
+              // isAdmin: 0
+            };
+          }
+        });
+      },
+      async submitForm() {
+        await this.$refs.ruleForm.validate(async valid => {
+          if (valid) {
+            this.loading = true;
+            let obj = JSON.parse(JSON.stringify(this.ruleForm));
+            let res = {};
+            if (this.id === "add") {
+              obj.passport = obj.password;
+              res = await asyncRequest.add(obj);
+            } else {
+              res = await asyncRequest.update(obj);
+            }
+            this.loading = false;
+            if (res.code === 0) {
+              let title = this.id === "add" ? "添加成功" : "修改成功";
+              this.$notify.success({
+                title,
+                message: ""
+              });
+              this.showModelThis = false;
+              // 刷新
+              this.$emit("refresh");
+            }
+          } 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>
+
+   <style lang="scss" scoped>
+   .${compoenntName} {
+    
+   }
+   </style>
+   `;
+};

+ 301 - 0
scripts/page/indexPage.js

@@ -0,0 +1,301 @@
+module.exports = function (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>
+      <add-edit
+        :showModel="showModel"
+        :id="modelId"
+        :isDetail="isDetail"
+        @refresh="searchList"
+        @cancel="showModel = false"
+      ></add-edit>
+    </div>
+   </template>
+   <script>
+    import mixinPage from "@/mixins/elPaginationHandle";
+    import asyncRequest from "@/apis/service/${compoenntName}";
+    import addEdit from "./addEdit";
+    import { mapGetters } from "vuex";
+   export default {
+    name: '${compoenntName}',
+    computed: {
+      ...mapGetters(["tablebtnSize", "searchSize", "size"]),
+    },
+    data() {
+      return {
+        loading: true,
+        showModel: false,
+        isDetail: false,
+        modelId: 0,
+        parmValue: {
+          loginName: "", // 账户
+          fullName: "", // 姓名
+          type: 2, // 用户类型(1运营人员 2物业人员)
+          page: 1, // 页码
+          size: 10 // 每页显示条数
+        },
+        count: 0, // 总条数
+        tableData: []
+      };
+    },
+    mixins: [mixinPage],
+    mounted() {
+      this.searchList();
+    },
+    components: {
+      addEdit
+    },
+    methods: {
+      restSearch() {
+        this.parmValue = {
+          loginName: "", // 账户
+          fullName: "", // 姓名
+          type: 2, // 用户类型(1运营人员 2物业人员)
+          page: 1, // 页码
+          size: 10 // 每页显示条数
+        };
+        this.searchList();
+      },
+      openModal(id, isDetail) {
+        this.showModel = true;
+        this.modelId = id;
+        this.isDetail = isDetail;
+      },
+      async deleteById(id) {
+        await this.$confirm("确定要删除?", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        })
+          .then(async () => {
+            let res = await asyncRequest.delete({ id });
+            if (res.code === 0) {
+              this.$notify.success({
+                title: "删除成功",
+                message: ""
+              });
+              this.searchList();
+            }
+          })
+          .catch(() => {
+            console.log("取消");
+          });
+      },
+      async searchList() {
+        this.loading = true;
+        let res = await asyncRequest.list(this.parmValue);
+        if (res.code === 0 && res.data) {
+          this.tableData = res.data.list;
+          this.count = Number(res.data.count);
+        } else {
+          this.tableData = [];
+          this.count = 0;
+        }
+        this.loading = false;
+      },
+      async statusConfirm(id, status) {
+        console.log(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.code === 0) {
+              this.loading = false;
+              this.$notify.success({
+                title: "状态修改成功!",
+                message: "",
+              });
+              await this.searchList();
+            } else {
+              this.loading = false;
+            }
+          })
+          .catch(() => {
+            console.log("取消");
+          });
+      },
+    }
+   }
+   </script>
+   <style lang="scss" scoped>
+   .${compoenntName} {
+    
+   }
+   </style>
+   `;
+};

+ 23 - 0
scripts/page/modelPage.js

@@ -0,0 +1,23 @@
+module.exports = function(compoenntName) {
+  return `import asyncService from "@/apis/service/${compoenntName}/index";
+
+    const asyncFn = async (name, data) => {
+      let res = await asyncService[name](data);
+      return res;
+    };
+    export default {
+      // 添加
+      add: async data => await asyncFn("add", data),
+      // 删除
+      delete: async data => await asyncFn("delete", data),
+      // 分页查询
+      list: async data => await asyncFn("list", data),
+      // 详情
+      detail: async data => await asyncFn("detail", data),
+      // 更新
+      update: async data => await asyncFn("update", data),
+      //修改状态
+      status: async data => await asyncFn("accountstatus", data),
+    };
+     `;
+};

+ 18 - 0
scripts/page/servicePage.js

@@ -0,0 +1,18 @@
+module.exports = `// 物业管理员
+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),
+};
+   `;

+ 27 - 0
scripts/template.js

@@ -0,0 +1,27 @@
+// template.js 文件,放置组件模板的代码
+module.exports = {
+  indexPage: require("./page/indexPage"),
+  addEditPage: require("./page/addEditPage"),
+  servicePage: require("./page/servicePage"),
+  // modelPage: require("./page/modelPage"),
+  vueTemplate: compoenntName => {
+    return `<template>
+    <div class="${compoenntName}">
+    ${compoenntName}组件
+    </div>
+   </template>
+   <script>
+   export default {
+    name: '${compoenntName}'
+   }
+   </script>
+   <style lang="scss" scoped>
+   .${compoenntName} {
+    
+   }
+   </style>
+   `;
+  },
+  entryTemplate: `import Main from './main.vue'
+   export default Main`
+};

+ 12 - 44
src/views/system/menuOperator/addEdit.vue

@@ -5,9 +5,8 @@ import { reactive, ref, watch, nextTick } from "vue";
 import menuType from "./types";
 import { menuTypeList, menuPrivateList } from "/@/utils/status";
 import { useNav } from "/@/layout/hooks/nav";
-// import { IconSelect } from "/@/components/ReIcon";
+import { IconSelect } from "/@/components/ReIcon";
 const { logout } = useNav();
-const formSize = ref("default");
 const ruleFormRef = ref<FormInstance>();
 
 const props = defineProps({
@@ -116,36 +115,14 @@ const submitForm = async (formEl: FormInstance | undefined) => {
       } else {
         ElMessage.error(message);
       }
-      console.log(code);
-      console.log(data);
-      console.log(message);
       loading.value = false;
       closeDialog();
-      // console.log("submit!");
     } else {
       console.log("error submit!", fields);
     }
   });
 };
-const resetForm = async (formEl: FormInstance | undefined, item) => {
-  if (!formEl) return;
-  formEl.clearValidate();
-  formEl.resetFields();
-  await nextTick(() => {
-    for (let key in ruleForm) {
-      if (key === "weight") {
-        ruleForm[key] = parseInt(item[key]);
-      } else if (key === "private") {
-        ruleForm[key] = item["is_private"] ? item["private"] : "";
-      } else {
-        ruleForm[key] = item[key];
-      }
-    }
-    ruleForm.menu_img = "eidt";
-    console.log(item);
-    menu_type_change();
-  });
-};
+
 const closeDialog = () => {
   showModelThis.value = false;
   emit("cancel");
@@ -153,7 +130,7 @@ const closeDialog = () => {
 
 const loading = ref(true);
 const titleType = ref("");
-const initForm = async (item: Object) => {
+const initForm = async () => {
   loading.value = true;
   switch (editType.value) {
     case "add":
@@ -168,11 +145,10 @@ const initForm = async (item: Object) => {
     default:
       titleType.value = "新建菜单";
   }
-  await resetForm(ruleFormRef.value, item);
   if (id.value !== "" && editType.value === "add") {
     ruleForm.pid = id.value;
   }
-  console.log(ruleForm);
+
   loading.value = false;
 };
 const handleChange = (value: number) => {
@@ -189,15 +165,15 @@ watch(
   () => {
     const { showModel, itemId, isDetails, sitem } = props;
     showModelThis.value = showModel;
-    console.log(props);
+
     if (showModelThis.value) {
+      console.log(props);
       id.value = itemId;
       editType.value = isDetails;
-      if (isDetails !== "add") {
-        initForm(sitem);
-      } else {
-        initForm(formModel);
-      }
+      Object.keys(sitem).forEach(key => {
+        ruleForm[key] = sitem[key];
+      });
+      initForm();
     }
   }
 );
@@ -221,7 +197,6 @@ watch(
       label-width="90px"
       style="margin-top: -10px"
       class="demo-ruleForm"
-      :size="formSize"
       status-icon
     >
       <el-row>
@@ -252,9 +227,8 @@ watch(
         ></el-col>
         <el-col :span="12">
           <el-form-item label="菜单图标" prop="menu_img">
-            <!-- <IconSelect v-model="ruleForm.menu_img" />  -->
-          </el-form-item></el-col
-        >
+            <IconSelect v-model="ruleForm.menu_img" /> </el-form-item
+        ></el-col>
         <el-col :span="12">
           <el-form-item label="菜单路由" prop="menu_route">
             <el-input
@@ -313,12 +287,6 @@ watch(
           @click="submitForm(ruleFormRef)"
           >保存</el-button
         >
-        <el-button
-          class="fr"
-          style="margin: 0 0 0 16px"
-          @click="resetForm(ruleFormRef, {})"
-          >重置</el-button
-        >
       </el-col>
     </el-form>
   </el-dialog>

+ 26 - 46
src/views/system/menuOperator/index.vue

@@ -2,32 +2,16 @@
 import { useColumns } from "./columns";
 import { handleTree } from "@pureadmin/utils";
 import { httpList, httpStatus, httpDelete } from "/@/api/system/menuOperator";
-import { ElMessage } from "element-plus";
-import { reactive, ref, onMounted } from "vue";
+import { ref, onMounted } from "vue";
 import { TableProBar } from "/@/components/ReTable";
 import { useRenderIcon } from "/@/components/ReIcon/src/hooks";
 import menuType from "./types";
 import { useNav } from "/@/layout/hooks/nav";
 import addEdit from "./addEdit.vue";
+import { actionWithSuccess } from "/@/utils/actionWithSuccess";
 const { logout } = useNav();
 
-const sitem = reactive<menuType>({
-  addtime: "",
-  child: [],
-  id: "",
-  is_private: 0,
-  is_show: "",
-  menu_code: "",
-  menu_img: "",
-  menu_name: "",
-  menu_route: "",
-  menu_type: "",
-  menu_url: "",
-  pid: "",
-  status: "",
-  updatetime: "",
-  weight: 0
-});
+const sitem = {};
 const dataList = ref([]);
 const loading = ref(true);
 const showModel = ref(false);
@@ -43,13 +27,12 @@ const handleUpdate = async row => {
     id,
     status: status + "" === "1" ? "0" : "1"
   });
-  if (code === 0) {
-    onSearch();
-  } else if (code > 100 && code < 140) {
-    logout();
-  } else {
-    ElMessage.error(message);
-  }
+  actionWithSuccess({
+    code,
+    message,
+    logout,
+    handler: () => onSearch()
+  });
 };
 
 const handleDelete = async row => {
@@ -57,13 +40,12 @@ const handleDelete = async row => {
   const { code, message } = await httpDelete({
     id
   });
-  if (code === 0) {
-    onSearch();
-  } else if (code > 100 && code < 140) {
-    logout();
-  } else {
-    ElMessage.error(message);
-  }
+  actionWithSuccess({
+    code,
+    message,
+    logout,
+    handler: () => onSearch()
+  });
 };
 
 function handleSelectionChange(val) {
@@ -78,29 +60,27 @@ function editItem(id, type, item) {
   showModel.value = true;
 }
 
-const submitRefresh = e => {
+const submitRefresh = () => {
   showModel.value = false;
-  console.log("弹窗关闭!");
-  console.log(e);
   onSearch();
 };
 const submitCancel = () => {
-  console.log("弹窗关闭!");
   showModel.value = false;
 };
 
-async function onSearch() {
+const onSearch = async () => {
   loading.value = true;
   const { code, data, message } = await httpList({});
-  if (code === 0) {
-    dataList.value = handleTree(data ?? []);
-  } else if (code > 100 && code < 140) {
-    logout();
-  } else {
-    ElMessage.error(message);
-  }
+  actionWithSuccess({
+    code,
+    message,
+    logout,
+    handler: () => {
+      dataList.value = handleTree(data ?? []);
+    }
+  });
   loading.value = false;
-}
+};
 
 const resetForm = () => {
   onSearch();