From 6da4d2776923a1b26f51db1fac846a06d84819d4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E8=B5=B5=E5=95=B8=E9=9D=9E?= <13281114856@qq.com>
Date: Fri, 8 Apr 2022 16:23:07 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9pom=E6=96=87=E4=BB=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 device-manager-ui/admin/.env.stage            |   9 +
 .../src/assets/utils/export2vmFunction.js     |  39 ++
 .../src/views/system/menu/dialogshow.vue      | 228 +++++++++
 .../src/views/system/param/dialogshow.vue     | 141 +++++
 .../src/views/system/resource/dialogshow.vue  | 201 ++++++++
 .../src/views/system/role/dialogshow.vue      | 126 +++++
 .../src/views/system/site/dialogshow.vue      | 218 ++++++++
 .../src/views/system/site/dialogshowbak.vue   | 196 +++++++
 .../admin/src/views/system/site/indexbak.vue  | 482 ++++++++++++++++++
 .../admin/src/views/system/site/indexbak1.vue | 139 +++++
 .../admin/src/views/system/site/list.vue      | 205 ++++++++
 .../src/views/system/task/dialogshow.vue      | 178 +++++++
 .../src/views/system/user/dialogshow.vue      | 194 +++++++
 13 files changed, 2356 insertions(+)
 create mode 100644 device-manager-ui/admin/.env.stage
 create mode 100644 device-manager-ui/admin/src/assets/utils/export2vmFunction.js
 create mode 100644 device-manager-ui/admin/src/views/system/menu/dialogshow.vue
 create mode 100644 device-manager-ui/admin/src/views/system/param/dialogshow.vue
 create mode 100644 device-manager-ui/admin/src/views/system/resource/dialogshow.vue
 create mode 100644 device-manager-ui/admin/src/views/system/role/dialogshow.vue
 create mode 100644 device-manager-ui/admin/src/views/system/site/dialogshow.vue
 create mode 100644 device-manager-ui/admin/src/views/system/site/dialogshowbak.vue
 create mode 100644 device-manager-ui/admin/src/views/system/site/indexbak.vue
 create mode 100644 device-manager-ui/admin/src/views/system/site/indexbak1.vue
 create mode 100644 device-manager-ui/admin/src/views/system/site/list.vue
 create mode 100644 device-manager-ui/admin/src/views/system/task/dialogshow.vue
 create mode 100644 device-manager-ui/admin/src/views/system/user/dialogshow.vue

diff --git a/device-manager-ui/admin/.env.stage b/device-manager-ui/admin/.env.stage
new file mode 100644
index 0000000..dbe4887
--- /dev/null
+++ b/device-manager-ui/admin/.env.stage
@@ -0,0 +1,9 @@
+# 娴嬭瘯鐜閰嶇疆
+NODE_ENV = 'production'
+
+# 鍦板潃
+VUE_APP_BASE_API = http://192.168.0.98:11021/m
+
+# websocket鍦板潃
+VUE_APP_WEBSOCKET_API =192.168.0.98:18211/m
+
diff --git a/device-manager-ui/admin/src/assets/utils/export2vmFunction.js b/device-manager-ui/admin/src/assets/utils/export2vmFunction.js
new file mode 100644
index 0000000..5443ee6
--- /dev/null
+++ b/device-manager-ui/admin/src/assets/utils/export2vmFunction.js
@@ -0,0 +1,39 @@
+exports.install = function (Vue) {
+    // 鎶婇渶瑕佹毚闇插嚭鍘荤殑鏂规硶鎸傝浇鍒癡ue鍘熷瀷涓婏紝閬垮厤浜嗗叏灞€鍙橀噺杩囧鐨勯棶棰�
+    Vue.prototype.refreshData = function () {
+
+      console.log("鍒锋柊璁惧鍒楄〃")
+      const component = findComponentDownward(this, 'Device')
+      console.log("component",component)
+      if(component){
+        component.getData()
+      }
+  
+    }
+  }
+  
+  /**
+   * 鐢变竴涓粍浠讹紝鍚戜笅鎵惧埌鏈€杩戠殑鎸囧畾缁勪欢
+   * @param {*} context 褰撳墠涓婁笅鏂囷紝姣斿浣犺鍩轰簬鍝釜缁勪欢鏉ュ悜涓婂鎵撅紝涓€鑸兘鏄熀浜庡綋鍓嶇殑缁勪欢锛屼篃灏辨槸浼犲叆 this
+   * @param {*} componentName 瑕佹壘鐨勭粍浠剁殑 name
+   */
+  function findComponentDownward(context, componentName) {
+    const childrens = context.$children
+    let children = null
+  
+    if (childrens.length) {
+      for (const child of childrens) {
+        const name = child.$options.name
+  
+        if (name === componentName) {
+          children = child
+          break
+        } else {
+          children = findComponentDownward(child, componentName)
+          if (children) break
+        }
+      }
+    }
+    return children
+  }
+  
\ No newline at end of file
diff --git a/device-manager-ui/admin/src/views/system/menu/dialogshow.vue b/device-manager-ui/admin/src/views/system/menu/dialogshow.vue
new file mode 100644
index 0000000..00d1506
--- /dev/null
+++ b/device-manager-ui/admin/src/views/system/menu/dialogshow.vue
@@ -0,0 +1,228 @@
+// 娣诲姞锛岀紪杈戣澶�
+<template>
+  <!-- 寮瑰嚭妗嗚〃鍗� -->
+  <el-dialog :title="title" :visible.sync="open" width="35%" append-to-body>
+    <el-form
+      ref="form"
+      :model="form"
+      :rules="rules"
+      label-width="110px"
+      label-position="right"
+    >
+      <el-row>
+        <Field
+          :span="22"
+          label="ID"
+          prop="id"
+          v-model="form.id"
+          v-if="pageInfo.type !== 'add'"
+          disabled
+        />
+        <Field :span="22" label="鍚嶇О" prop="name" v-model="form.name" />
+        <Field
+          :span="22"
+          label="鏉冮檺绫诲瀷"
+          prop="authType"
+          v-model="form.authType"
+          :enumData="dict.authType"
+          type="select"
+        />
+        <Field
+          :span="22"
+          label="鐖剁骇鑿滃崟"
+          prop="parentId"
+          v-model="form.parentId"
+          :enumData="menu"
+          type="select"
+        />
+        <Field :span="22" label="璁块棶鍦板潃" prop="url" v-model="form.url" />
+        <Field
+          :span="22"
+          label="鐘舵€�"
+          prop="status"
+          v-model="form.status"
+          :enumData="dict.status"
+          type="radio"
+        />
+
+        <Field
+          :span="22"
+          label="鍥炬爣"
+          placeholder="璇疯緭鍏ュ浘鏍囧悕绉�"
+          prop="imgPath"
+          v-model="form.imgPath"
+        />
+        <!-- <Field v-else :span="22" label="鍥炬爣" prop="imgPath">
+          <el-radio-group v-model="form.imgPath" class="form-el-radio-group">
+            <el-radio-button label="">涓嶉渶瑕佸浘鏍�</el-radio-button>
+            <el-radio-button
+              v-for="(icon, index) in icons"
+              :key="index"
+              :label="icon"
+            >
+              <i :class="'el-icon-' + icon"></i>
+              {{ icon }}
+            </el-radio-button>
+          </el-radio-group>
+        </Field> -->
+      </el-row>
+    </el-form>
+    <div slot="footer" class="dialog-footer">
+      <el-button
+        type="primary"
+        v-if="pageInfo.type !== 'view'"
+        @click="submitForm"
+        >纭� 瀹�</el-button
+      >
+      <el-button @click="cancel">鍙� 娑�</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import form from "@/assets/mixins/formdialog";
+import dialogShow from "./dialogshow";
+export default {
+  mixins: [form],
+  components: {
+    dialogShow,
+  },
+  computed: {
+    menu() {
+      let menu = { 0: "鏃�" };
+      this.$store.state.userData.barList.forEach((item) => {
+        menu[item.id + ""] = item.name;
+      });
+      return menu;
+    },
+  },
+
+  methods: {
+    afterSubmit() {
+      this.$store.dispatch("login");
+      this.$router.go(-1);
+    },
+    /** 缂栬緫 */
+    edit(row) {
+      this.reset();
+      this.query = { id: row.id };
+      this.urls.currUrl = this.pageInfo.editUrl;
+      this.getData();
+      this.pageInfo.type = "edit";
+      this.title = "淇敼鑿滃崟";
+    },
+    /** 鏂板 */
+    add(row) {
+      this.reset();
+      this.query = { id: row.id };
+      this.urls.currUrl = this.pageInfo.addUrl;
+      this.getData();
+      this.pageInfo.type = "add";
+      this.open = true;
+      this.title = "鏂板鑿滃崟";
+    },
+    /** 鏌ョ湅*/
+    view(row) {
+      this.reset();
+      this.query = { id: row.id };
+      this.urls.currUrl = this.pageInfo.viewUrl;
+      this.getData();
+      this.pageInfo.type = "view";
+      this.open = true;
+      this.title = "鑿滃崟璇︾粏";
+    },
+    /**鍙栨秷鎸夐挳 */
+    cancel() {
+      this.open = false;
+    },
+    /**鑾峰彇鏁版嵁鍚庡脊妗� */
+    afterRender(data) {
+      this.open = true;
+    },
+
+    afterSubmit(data) {
+      this.open = false;
+      this.$emit("ok");
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      // this.form={}
+      this.resetForm("form");
+    },
+    resetForm(refName) {
+      if (this.$refs[refName]) {
+        this.$refs[refName].resetFields();
+      }
+    },
+  },
+
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 寮瑰嚭灞傛爣棰�
+      title: "鑿滃崟",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      toString: ["parentId", "authType", "status"],
+      icons: [
+        "info",
+        "error",
+        "success",
+        "warning",
+        "question",
+        "tickets",
+        "document",
+        "goods",
+        "sold-out",
+        "news",
+        "message",
+        "date",
+        "printer",
+        "time",
+        "bell",
+        "mobile-phone",
+        "service",
+        "view",
+        "menu",
+        "star-on",
+        "location",
+        "phone",
+        "picture",
+        "delete",
+        "search",
+        "edit",
+        "rank",
+        "refresh",
+        "share",
+        "setting",
+        "upload",
+        "upload2",
+        "download",
+        "loading",
+        "reading",
+      ],
+      rules: {
+        name: [{ required: true, message: "璇疯緭鍏ュ悕绉�", trigger: "blur" }],
+      },
+    };
+  },
+};
+</script>
+
+<style lang="less">
+.el-select {
+  width: 100%;
+}
+.el-date-editor.el-input {
+  width: 100%;
+}
+.form-el-radio-group.label {
+  width: 160px;
+}
+.el-radio-button__inner {
+  border: 0;
+}
+</style>
+
+
diff --git a/device-manager-ui/admin/src/views/system/param/dialogshow.vue b/device-manager-ui/admin/src/views/system/param/dialogshow.vue
new file mode 100644
index 0000000..a3fbf50
--- /dev/null
+++ b/device-manager-ui/admin/src/views/system/param/dialogshow.vue
@@ -0,0 +1,141 @@
+<template>
+  <!-- 寮瑰嚭妗嗚〃鍗� -->
+  <el-dialog :title="title" :visible.sync="open" width="70%" append-to-body>
+    <el-form
+      :model="form"
+      :rules="rules"
+      size="small"
+      label-width="100px"
+      ref="form"
+    >
+      <el-row>
+        <Field label="鍙傛暟鍚嶇О" prop="name" v-model="form.name" />
+        <Field
+          label="涓€绾х粍缁�"
+          prop="firstOrganize"
+          v-model="form.firstOrganize"
+        />
+        <Field
+          label="浜岀骇缁勭粐"
+          prop="secondOrganize"
+          v-model="form.secondOrganize"
+        />
+        <Field
+          label="鍙傛暟鏈夋晥鐘舵€�"
+          prop="validStatus"
+          v-model="form.validStatus"
+          :enumData="dict.validStatus"
+          type="select"
+        />
+        <Field
+          label="鍙傛暟淇敼鐘舵€�"
+          prop="modStatus"
+          v-model="form.modStatus"
+          :enumData="dict.modStatus"
+          type="select"
+        />
+        <Field
+          label="灞曠幇绫诲瀷"
+          prop="displayType"
+          v-model="form.displayType"
+          :enumData="dict.displayType"
+          type="select"
+        />
+        <Field
+          label="鍙傛暟閿�"
+          prop="paramKey"
+          v-model="form.paramKey"
+          :span="24"
+        />
+        <Field
+          label="鍙傛暟鍊�"
+          prop="paramValue"
+          v-model="form.paramValue"
+          :span="24"
+          type="textarea"
+        />
+        <Field label="澶囨敞" prop="remark" v-model="form.remark" :span="24" />
+      </el-row>
+    </el-form>
+    <div slot="footer" class="dialog-footer">
+      <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+      <el-button @click="cancel">鍙� 娑�</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import form from "@/assets/mixins/form";
+export default {
+  mixins: [form],
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 寮瑰嚭灞傛爣棰�
+      title: "绔欑偣淇℃伅",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      toString: ["validStatus", "modStatus", "displayType"],
+      rules: {
+        name: [{ required: true, message: "璇疯緭鍏ュ弬鏁板悕绉�", trigger: "blur" }],
+        paramKey: [{ required: true, message: "璇疯緭鍏ュ弬鏁伴敭", trigger: "blur" }],
+        paramValue: [{ required: true, message: "璇疯緭鍏ュ弬鏁板€�", trigger: "blur" }],
+      },
+    };
+  },
+
+  methods: {
+    /** 缂栬緫 */
+    edit(row) {
+      this.reset();
+      this.query = { id: row.id };
+      this.urls.currUrl = this.pageInfo.editUrl;
+      this.getData();
+      this.open = true;
+      this.title = "淇敼绔欑偣淇℃伅";
+    },
+    /** 鏂板 */
+    add(row) {
+      this.reset();
+      this.query = { id: row.id };
+      this.urls.currUrl = this.pageInfo.addUrl;
+      this.getData();
+      this.open = true;
+      this.title = "鏂板绔欑偣淇℃伅";
+    },
+    /** 鏌ョ湅*/
+    view(row) {
+      this.reset();
+      this.query = { id: row.id };
+      this.urls.currUrl = this.pageInfo.viewUrl;
+      this.getData();
+      this.open = true;
+      this.title = "绔欑偣淇℃伅璇︾粏";
+    },
+    /**鍙栨秷鎸夐挳 */
+    cancel() {
+      this.reset();
+      this.open = false;
+    },
+
+    afterSubmit(data) {
+      this.open = false;
+      this.$emit("ok");
+    },
+
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+
+      };
+      this.resetForm("form");
+    },
+    resetForm(refName) {
+      if (this.$refs[refName]) {
+        this.$refs[refName].resetFields();
+      }
+    },
+  },
+};
+</script>
diff --git a/device-manager-ui/admin/src/views/system/resource/dialogshow.vue b/device-manager-ui/admin/src/views/system/resource/dialogshow.vue
new file mode 100644
index 0000000..9b721ff
--- /dev/null
+++ b/device-manager-ui/admin/src/views/system/resource/dialogshow.vue
@@ -0,0 +1,201 @@
+<template>
+  <!-- 寮瑰嚭妗嗚〃鍗� -->
+  <el-dialog :title="title" :visible.sync="open" width="40%" append-to-body>
+    <el-form
+      ref="form"
+      :model="form"
+      :rules="rules"
+      label-width="110px"
+      label-position="right"
+    >
+      <el-row>
+        <Field :span="20" label="鍚嶇О" prop="name" v-model="form.name" />
+        <Field
+          :span="20"
+          label="鏉冮檺绫诲瀷"
+          prop="authType"
+          v-model="form.authType"
+          :enumData="dict.authType"
+          type="select"
+        />
+        <!-- <Field label="鐢ㄦ埛绫诲瀷" prop="userType" v-model="form.userType" :enumData='dict.userType' type='select' /> -->
+        <Field label="閾炬帴鍦板潃" prop="url" :span="20">
+          <el-button
+            icon="el-icon-plus"
+            circle
+            size="mini"
+            @click="addResource"
+            v-if="!form.urls.length"
+          ></el-button>
+          <el-row
+            v-for="(url, index) in form.urls"
+            :key="index"
+            style="width: 400px"
+          >
+            <el-col :span="16">
+              <el-form-item
+                label-width="0"
+                :prop="'urls.' + index + '.value'"
+                :rules="[
+                  { required: true, message: '鍦板潃涓嶈兘涓虹┖', trigger: 'blur' },
+                  { validator: validatorUrl, trigger: 'blur' },
+                ]"
+              >
+                <el-input size="mini" v-model="url.value"></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              &nbsp;
+              <el-button
+                icon="el-icon-minus"
+                circle
+                size="mini"
+                @click="del(index)"
+              ></el-button>
+              <el-button
+                icon="el-icon-plus"
+                circle
+                size="mini"
+                @click="addResource"
+                v-if="index === form.urls.length - 1"
+              ></el-button>
+            </el-col>
+          </el-row>
+        </Field>
+      </el-row>
+    </el-form>
+    <div slot="footer" class="dialog-footer">
+      <el-button
+        type="primary"
+        v-if="pageInfo.type !== 'view'"
+        @click="submitForm"
+        >纭� 瀹�</el-button
+      >
+      <el-button @click="cancel">鍙� 娑�</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import form from "@/assets/mixins/formdialog";
+import dialogShow from "./dialogshow";
+import FormButtons from "@/components/tools/FormButtons";
+export default {
+  mixins: [form],
+  components: {
+    dialogShow,
+    FormButtons,
+  },
+  methods: {
+    beforeRender(data) {
+      data.entity.urls = (data.entity.url || "").split(",").map((i) => {
+        return { value: i };
+      });
+      return data;
+    },
+    beforeSubmit(form) {
+      form.url = this.form.urls.map((item) => item.value).join(",");
+      return form;
+    },
+    del(index) {
+      this.form.urls.splice(index, 1);
+    },
+    addResource(index) {
+      const urls = this.form.urls;
+      const values = urls.map((i) => i.value);
+      // 鏂板鍓嶆鏌ュ墠鏂规槸鍚︽湁绌鸿
+      if (urls.some((i) => !i.value)) {
+        return this.$message.warning("璇峰厛瀹屾垚涓婁竴涓湴鍧€鐨勫~鍐�");
+      }
+      urls.push({ value: "" });
+      console.log("urls", urls);
+    },
+    isRepeat(value) {
+      return this.form.urls.filter((i) => value == i.value).length > 1;
+    },
+    validatorUrl(rule, value, cb) {
+      if (this.isRepeat(value)) {
+        return cb(new Error(`閲嶅鐨剈rl鍦板潃`));
+      }
+      cb();
+    },
+    /** 缂栬緫 */
+    edit(row) {
+      this.reset();
+      this.query = { id: row.id };
+      this.urls.currUrl = this.pageInfo.editUrl;
+      this.getData();
+      this.pageInfo.type = "edit";
+      this.title = "淇敼璧勬簮";
+    },
+    /** 鏂板 */
+    add(row) {
+      this.reset();
+      this.query = { id: row.id };
+      this.urls.currUrl = this.pageInfo.addUrl;
+      this.getData();
+      this.pageInfo.type = "add";
+      this.title = "鏂板璧勬簮";
+    },
+    /** 鏌ョ湅*/
+    view(row) {
+      this.reset();
+      this.query = { id: row.id };
+      this.urls.currUrl = this.pageInfo.viewUrl;
+      this.getData();
+      this.pageInfo.type = "view";
+      this.title = "璧勬簮璇︾粏";
+    },
+    /**鍙栨秷鎸夐挳 */
+    cancel() {
+      this.open = false;
+    },
+    /**鑾峰彇鏁版嵁鍚庡脊妗� */
+    afterRender(data) {
+      // this.form.urls = (data.entity.url || "").split(",").map((i) => {
+      //   return { value: i };
+      // });
+      this.open = true;
+    },
+
+    afterSubmit(data) {
+      this.open = false;
+      this.$emit("ok");
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        urls: [],
+      };
+      //this.resetForm("form");
+    },
+    resetForm(refName) {
+      if (this.$refs[refName]) {
+        this.$refs[refName].resetFields();
+      }
+    },
+  },
+
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 寮瑰嚭灞傛爣棰�
+      title: "璧勬簮",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      toString: ["userType", "authType"],
+
+      form: {
+        urls: [],
+      },
+
+      rules: {
+        name: [{ required: true, message: "璇疯緭鍏ュ悕绉�", trigger: "blur" }],
+      },
+    };
+  },
+};
+</script>
+
+
diff --git a/device-manager-ui/admin/src/views/system/role/dialogshow.vue b/device-manager-ui/admin/src/views/system/role/dialogshow.vue
new file mode 100644
index 0000000..f8b26d3
--- /dev/null
+++ b/device-manager-ui/admin/src/views/system/role/dialogshow.vue
@@ -0,0 +1,126 @@
+<template>
+  <!-- 寮瑰嚭妗嗚〃鍗� -->
+  <el-dialog :title="title" :visible.sync="open" width="40%" append-to-body>
+    <el-form
+      ref="form"
+      :model="form"
+      :rules="rules"
+      label-width="110px"
+      label-position="right"
+    >
+      <el-row>
+        <Field :span="20" label="瑙掕壊鍚�" prop="name" v-model="form.name" />
+        <!-- <Field
+        :span="20"
+          label="瑙掕壊绫诲瀷"
+          prop="roleType"
+          v-model="form.roleType"
+          :enumData="dict.roleType"
+          type="select"
+        /> -->
+        <Field
+          label="澶囨敞"
+          prop="remark"
+          v-model="form.remark"
+          type="textarea"
+          :span="20"
+        />
+      </el-row>
+    </el-form>
+    <div slot="footer" class="dialog-footer">
+      <el-button
+        type="primary"
+        v-if="pageInfo.type !== 'view'"
+        @click="submitForm"
+        >纭� 瀹�</el-button
+      >
+      <el-button @click="cancel">鍙� 娑�</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import form from "@/assets/mixins/formdialog";
+import dialogShow from "./dialogshow";
+export default {
+  mixins: [form],
+  components: {
+    dialogShow,
+  },
+
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 寮瑰嚭灞傛爣棰�
+      title: "鐢ㄦ埛",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      toString: ["roleType"],
+      rules: {
+        name: [{ required: true, message: "璇疯緭鍏ュ悕绉�", trigger: "blur" }],
+        roleType: [
+          { required: true, message: "璇烽€夋嫨鐢ㄦ埛绫诲瀷", trigger: "blur" },
+        ],
+      },
+    };
+  },
+  methods: {
+    /** 缂栬緫 */
+    edit(row) {
+      this.reset();
+      this.query = { id: row.id };
+      this.urls.currUrl = this.pageInfo.editUrl;
+      this.getData();
+      this.pageInfo.type = "edit";
+      this.open = true;
+      this.title = "淇敼瑙掕壊";
+    },
+    /** 鏂板 */
+    add(row) {
+      this.reset();
+      this.query = { id: row.id };
+      this.urls.currUrl = this.pageInfo.addUrl;
+      this.getData();
+      this.pageInfo.type = "add";
+      this.open = true;
+      this.title = "鏂板瑙掕壊";
+    },
+    /** 鏌ョ湅*/
+    view(row) {
+      this.reset();
+      this.query = { id: row.id };
+      this.urls.currUrl = this.pageInfo.viewUrl;
+      this.getData();
+      this.pageInfo.type = "view";
+      this.open = true;
+      this.title = "瑙掕壊璇︾粏";
+    },
+    /**鍙栨秷鎸夐挳 */
+    cancel() {
+      this.open = false;
+    },
+    /**鑾峰彇鏁版嵁鍚庡脊妗� */
+    afterRender(data) {
+      this.open = true;
+    },
+
+    afterSubmit(data) {
+      this.open = false;
+      this.$emit("ok");
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+       this.form = {};
+      this.resetForm("form");
+    },
+    resetForm(refName) {
+      if (this.$refs[refName]) {
+        this.$refs[refName].resetFields();
+      }
+    },
+  },
+};
+</script>
+
+
diff --git a/device-manager-ui/admin/src/views/system/site/dialogshow.vue b/device-manager-ui/admin/src/views/system/site/dialogshow.vue
new file mode 100644
index 0000000..40d582e
--- /dev/null
+++ b/device-manager-ui/admin/src/views/system/site/dialogshow.vue
@@ -0,0 +1,218 @@
+<template>
+    <!-- 寮瑰嚭妗嗚〃鍗� -->
+    <el-dialog :title="title" :visible.sync="open" width="70%" append-to-body>
+        <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+            <el-row>
+                <el-col :span="24" v-if="form.parentId !== 0">
+                    <el-form-item label="涓婄骇绔欑偣" prop="parentId">
+                        <treeselect
+                                v-model="form.parentId"
+                                :options="siteOptions"
+                                :normalizer="normalizer"
+                                placeholder="閫夋嫨涓婄骇绔欑偣淇℃伅"
+                        />
+                    </el-form-item>
+                </el-col>
+
+
+                            <Field label="绔欑偣鍚�" prop="siteName" v-model="form.siteName" placeholder="璇疯緭鍏ョ珯鐐瑰悕"/>
+
+                            <Field label="鐖剁骇id" prop="parentId" v-model="form.parentId" placeholder="璇疯緭鍏ョ埗绾d"/>
+
+                            <Field label="绁栫骇鍒楄〃锛岄€楀彿鍒嗛殧" prop="ancestors" v-model="form.ancestors" placeholder="璇疯緭鍏ョ绾у垪琛紝閫楀彿鍒嗛殧"/>
+
+                            <Field label="鍦板潃" prop="address" v-model="form.address" placeholder="璇疯緭鍏ュ湴鍧€"/>
+
+                            <Field label="鐢佃瘽" prop="mobile" v-model="form.mobile" placeholder="璇疯緭鍏ョ數璇�"/>
+
+                            <Field label="鍗曚綅浠嬬粛" prop="introduce" v-model="form.introduce" type="textarea" placeholder="璇疯緭鍏ュ崟浣嶄粙缁�"/>
+
+                            <Field label="鍛ㄤ竴 1涓婄彮 0涓嶄笂" prop="workday1" v-model="form.workday1" type="select" :enumData="dict.workday1" placeholder="璇烽€夋嫨鍛ㄤ竴 1涓婄彮 0涓嶄笂"/>
+
+                            <Field label="鍛ㄤ簩 1涓婄彮 0涓嶄笂" prop="workday2" v-model="form.workday2" type="select" :enumData="dict.workday2" placeholder="璇烽€夋嫨鍛ㄤ簩 1涓婄彮 0涓嶄笂"/>
+
+                            <Field label="鍛ㄤ笁 1涓婄彮 0涓嶄笂" prop="workday3" v-model="form.workday3" type="select" :enumData="dict.workday3" placeholder="璇烽€夋嫨鍛ㄤ笁 1涓婄彮 0涓嶄笂"/>
+
+                            <Field label="鍛ㄥ洓 1涓婄彮 0涓嶄笂" prop="workday4" v-model="form.workday4" type="select" :enumData="dict.workday4" placeholder="璇烽€夋嫨鍛ㄥ洓 1涓婄彮 0涓嶄笂"/>
+
+                            <Field label="鍛ㄤ簲 1涓婄彮 0涓嶄笂" prop="workday5" v-model="form.workday5" type="select" :enumData="dict.workday5" placeholder="璇烽€夋嫨鍛ㄤ簲 1涓婄彮 0涓嶄笂"/>
+
+                            <Field label="鍛ㄥ叚 1涓婄彮 0涓嶄笂" prop="workday6" v-model="form.workday6" type="select" :enumData="dict.workday6" placeholder="璇烽€夋嫨鍛ㄥ叚 1涓婄彮 0涓嶄笂"/>
+
+                            <Field label="鍛ㄦ棩 1涓婄彮 0涓嶄笂" prop="workday7" v-model="form.workday7" type="select" :enumData="dict.workday7" placeholder="璇烽€夋嫨鍛ㄦ棩 1涓婄彮 0涓嶄笂"/>
+
+                            <Field label="绔欑偣缂栧彿" prop="number" v-model="form.number" placeholder="璇疯緭鍏ョ珯鐐圭紪鍙�"/>
+
+                            <Field label="涓績浠嬬粛" prop="summary" v-model="form.summary" type="textarea" placeholder="璇疯緭鍏ヤ腑蹇冧粙缁�"/>
+
+                            <Field label="鎺掑簭瀛楁" prop="orderNum" v-model="form.orderNum" placeholder="璇疯緭鍏ユ帓搴忓瓧娈�"/>
+
+                            <Field label="绔欑偣鐘舵€� 锛�0锛屽仠鐢紝1锛屾甯� 榛樿1" prop="status" v-model="form.status" type="select" :enumData="dict.status" placeholder="璇烽€夋嫨绔欑偣鐘舵€� 锛�0锛屽仠鐢紝1锛屾甯� 榛樿1"/>
+
+            </el-row>
+        </el-form>
+        <div slot="footer" class="dialog-footer">
+            <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+            <el-button @click="cancel">鍙� 娑�</el-button>
+        </div>
+    </el-dialog>
+</template>
+
+<script>
+    import form from "@/assets/mixins/form";
+    import Treeselect from "@riophae/vue-treeselect";
+    import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+    export default {
+        mixins: [form],
+        components: {
+            Treeselect,
+        },
+        data() {
+            return {
+                siteOptions: [],
+                // 閬僵灞�
+                loading: true,
+                // 寮瑰嚭灞傛爣棰�
+                title: "绔欑偣淇℃伅",
+                // 鏄惁鏄剧ず寮瑰嚭灞�
+                open: false,
+                toString:[
+                    "workday1",
+                    "workday2",
+                    "workday3",
+                    "workday4",
+                    "workday5",
+                    "workday6",
+                    "workday7",
+                    "status",
+                ],
+                // 琛ㄥ崟鏍¢獙
+                rules: {
+                    siteName: [
+                        {required: true, trigger: "blur" },
+                    ],
+                    ancestors: [
+                        { trigger: "blur" },
+                    ],
+                    address: [
+                        {required: true, trigger: "blur" },
+                    ],
+                    mobile: [
+                        {required: true, trigger: "blur" },
+                    ],
+                    introduce: [
+                        {required: true, trigger: "blur" },
+                    ],
+                    workday1: [
+                        { type: 'integer',trigger: "blur" },
+                    ],
+                    workday2: [
+                        { type: 'integer',trigger: "blur" },
+                    ],
+                    workday3: [
+                        { type: 'integer',trigger: "blur" },
+                    ],
+                    workday4: [
+                        { type: 'integer',trigger: "blur" },
+                    ],
+                    workday5: [
+                        { type: 'integer',trigger: "blur" },
+                    ],
+                    workday6: [
+                        { type: 'integer',trigger: "blur" },
+                    ],
+                    workday7: [
+                        { type: 'integer',trigger: "blur" },
+                    ],
+                    number: [
+                        {required: true, trigger: "blur" },
+                    ],
+                    summary: [
+                        {required: true, trigger: "blur" },
+                    ],
+                    orderNum: [
+                        { type: 'integer',trigger: "blur" },
+                    ],
+                    status: [
+                        { type: 'integer',trigger: "blur" },
+                    ],
+                }
+            };
+        },
+
+        methods: {
+            /** 缂栬緫 */
+            edit(row, siteOptions) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl =this.pageInfo.editUrl;;
+                this.getData();
+                this.siteOptions = siteOptions;
+                this.open = true;
+                this.title = "淇敼绔欑偣淇℃伅";
+            },
+            /** 鏂板 */
+            add(row, siteOptions) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl = this.pageInfo.addUrl;
+                this.getData();
+                this.siteOptions = siteOptions;
+                this.open = true;
+                this.title = "鏂板绔欑偣淇℃伅";
+            },
+            /** 鏌ョ湅*/
+            view(row, siteOptions) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl =this.pageInfo.viewUrl;;
+                this.getData();
+                this.siteOptions = siteOptions;
+                this.open = true;
+                this.title = "绔欑偣淇℃伅璇︾粏";
+            },
+            /**鍙栨秷鎸夐挳 */
+            cancel() {
+                this.open = false;
+            },
+
+            afterSubmit(data) {
+                this.open = false;
+                this.$emit("ok");
+            },
+
+            /** 杞崲绔欑偣淇℃伅鏁版嵁缁撴瀯 */
+            normalizer(node) {
+                if (node.children && !node.children.length) {
+                    delete node.children;
+                }
+                return {
+                    id: node.id,
+                    label: node.siteName,
+                    children: node.children,
+                };
+            },
+            // 琛ㄥ崟閲嶇疆
+            reset() {
+                this.form = {
+                    siteName : null,
+                    parentId : null,
+                    ancestors : "",
+                    address : null,
+                    mobile : null,
+                    introduce : null,
+                    number : null,
+                    summary : null,
+                    orderNum : 0,
+                    status : 1,
+                };
+                this.resetForm("form");
+            },
+            resetForm(refName) {
+                if (this.$refs[refName]) {
+                    this.$refs[refName].resetFields();
+                }
+            },
+        },
+    };
+</script>
diff --git a/device-manager-ui/admin/src/views/system/site/dialogshowbak.vue b/device-manager-ui/admin/src/views/system/site/dialogshowbak.vue
new file mode 100644
index 0000000..bf6c67f
--- /dev/null
+++ b/device-manager-ui/admin/src/views/system/site/dialogshowbak.vue
@@ -0,0 +1,196 @@
+<template>
+  <!-- 寮瑰嚭妗嗚〃鍗� -->
+  <el-dialog :title="title" :visible.sync="open" width="70%" append-to-body>
+    <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+      <el-row>
+        <el-col :span="24" v-if="form.parentId !== 0">
+          <el-form-item label="涓婄骇绔欑偣" prop="parentId">
+            <treeselect
+              v-model="form.parentId"
+              :options="siteOptions"
+              :normalizer="normalizer"
+              placeholder="閫夋嫨涓婄骇绔欑偣"
+            />
+          </el-form-item>
+        </el-col>
+          <el-form-item label="绔欑偣鍚嶇О" prop="siteName">
+            <el-input v-model="form.siteName" placeholder="璇疯緭鍏ョ珯鐐瑰悕绉�" />
+          </el-form-item>
+          <el-form-item label="鏄剧ず鎺掑簭" prop="orderNum">
+            <el-input-number
+              v-model="form.orderNum"
+              controls-position="right"
+              :min="0"
+            />
+          </el-form-item>
+          <el-form-item label="鍦板潃" prop="address">
+            <el-input
+              v-model="form.address"
+              placeholder="璇疯緭鍏ュ湴鍧€"
+              maxlength="20"
+            />
+          </el-form-item>
+          <el-form-item label="鑱旂郴鐢佃瘽" prop="mobile">
+            <el-input
+              v-model="form.mobile"
+              placeholder="璇疯緭鍏ヨ仈绯荤數璇�"
+              maxlength="11"
+            />
+          </el-form-item>
+          <el-form-item label="绔欑偣缂栧彿" prop="number">
+            <el-input
+              v-model="form.number"
+              placeholder="璇疯緭鍏ョ珯鐐圭紪鍙�"
+              maxlength="50"
+            />
+          </el-form-item>
+          <el-form-item label="绔欑偣鐘舵€�">
+            <el-radio-group v-model="form.status">
+              <el-radio
+                v-for="(label, value) in dict.status"
+                :key="value"
+                :label="value"
+                >{{ label }}</el-radio
+              >
+            </el-radio-group>
+          </el-form-item>
+
+        <el-col :span="24">
+          <el-form-item label="鍗曚綅浠嬬粛" prop="introduce">
+            <el-input
+              v-model="form.introduce"
+              placeholder="璇疯緭鍏ュ崟浣嶄粙缁�"
+              type="textarea"
+              :rows="2"
+            />
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="24">
+          <el-form-item label="涓績浠嬬粛" prop="summary">
+            <el-input
+              v-model="form.summary"
+              placeholder="璇疯緭鍏ヤ腑蹇冧粙缁�"
+              type="textarea"
+              :rows="2"
+            />
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <div slot="footer" class="dialog-footer">
+      <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+      <el-button @click="cancel">鍙� 娑�</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import form from "@/assets/mixins/form";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+export default {
+  mixins: [form],
+  components: { Treeselect },
+  data() {
+    return {
+      siteOptions: [],
+      // 閬僵灞�
+      loading: true,
+      // 绔欑偣鏍戦€夐」
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      toString: ["status"],
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        parentId: [
+          { required: true, message: "涓婄骇绔欑偣涓嶈兘涓虹┖", trigger: "blur" },
+        ],
+        siteName: [
+          { required: true, message: "绔欑偣鍚嶇О涓嶈兘涓虹┖", trigger: "blur" },
+        ],
+        orderNum: [
+          { required: true, message: "鏄剧ず鎺掑簭涓嶈兘涓虹┖", trigger: "blur" },
+        ],
+      },
+    };
+  },
+
+  methods: {
+    //缂栬緫
+    edit(row, siteOptions) {
+      this.reset()
+      this.query = { id: row.id };
+      this.urls.currUrl =this.pageInfo.editUrl;;
+      this.getData();
+      this.siteOptions = siteOptions;
+      this.open = true;
+      this.title = "淇敼绔欑偣";
+    },
+    //鏂板
+    add(row, siteOptions) {
+      this.reset()
+      this.query = { id: row.id };
+      this.urls.currUrl = this.pageInfo.addUrl;
+      this.getData();
+      this.siteOptions = siteOptions;
+      this.open = true;
+      this.title = "鏂板绔欑偣";
+    },
+    //鏌ョ湅
+    view(row, siteOptions) {
+      this.reset()
+      this.query = { id: row.id };
+      this.urls.currUrl =this.pageInfo.viewUrl;;
+      this.getData();
+      this.siteOptions = siteOptions;
+      this.open = true;
+      this.title = "绔欑偣璇︾粏";
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+    },
+
+    afterSubmit(data) {
+      this.open = false;
+      this.$emit("ok");
+    },
+
+    /** 杞崲绔欑偣鏁版嵁缁撴瀯 */
+    normalizer(node) {
+      if (node.children && !node.children.length) {
+        delete node.children;
+      }
+      return {
+        id: node.id,
+        label: node.siteName,
+        children: node.children,
+      };
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        id: null,
+        parentId: 0,
+        siteName: "",
+        orderNum: 0,
+        address: "",
+        mobile: "",
+        introduce: "",
+        summary: "",
+        ancestors: "",
+        status: "1",
+      };
+      this.resetForm("form");
+    },
+    resetForm(refName) {
+      if (this.$refs[refName]) {
+        this.$refs[refName].resetFields();
+      }
+    },
+  },
+};
+</script>
diff --git a/device-manager-ui/admin/src/views/system/site/indexbak.vue b/device-manager-ui/admin/src/views/system/site/indexbak.vue
new file mode 100644
index 0000000..c1c36c8
--- /dev/null
+++ b/device-manager-ui/admin/src/views/system/site/indexbak.vue
@@ -0,0 +1,482 @@
+<template>
+  <div class="page">
+    <el-form
+      :model="queryParams"
+      ref="queryForm"
+      :inline="true"
+      v-show="showSearch"
+    >
+      <el-form-item label="绔欑偣鍚嶇О" prop="siteName">
+        <el-input
+          v-model="queryParams['query.siteName']"
+          placeholder="璇疯緭鍏ョ珯鐐瑰悕绉�"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+
+      <el-form-item>
+        <el-button
+          type="primary"
+          icon="el-icon-search"
+          size="mini"
+          @click="handleQuery"
+          >鎼滅储</el-button
+        >
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
+          >閲嶇疆</el-button
+        >
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          >鏂板</el-button
+        >
+      </el-col>
+      <right-toolbar
+        :showSearch.sync="showSearch"
+        @queryTable="getList"
+      ></right-toolbar>
+    </el-row>
+
+    <el-table
+      v-loading="loading"
+      :data="siteList"
+      row-key="id"
+      border
+      default-expand-all
+      :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
+    >
+      <el-table-column
+        prop="siteName"
+        label="绔欑偣鍚嶇О"
+        width="400"
+      ></el-table-column>
+      <el-table-column
+        prop="number"
+        label="绔欑偣缂栧彿"
+        width="200"
+      ></el-table-column>
+  <el-table-column
+        prop="address"
+        label="绔欑偣鍦板潃"
+        width="200"
+      ></el-table-column>
+     
+      <el-table-column
+        prop="status"
+        label="鐘舵€�"
+        :formatter="statusFormat"
+        width="100"
+      ></el-table-column>
+      <el-table-column
+        label="鍒涘缓鏃堕棿"
+        align="center"
+        prop="createTime"
+        width="200"
+      >
+        <template slot-scope="scope">
+          <span>{{ formatterDate(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="鎿嶄綔"
+       
+      >
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            >淇敼</el-button
+          >
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-plus"
+            @click="handleAdd(scope.row)"
+            >鏂板</el-button
+          >
+          <el-button
+            v-if="scope.row.parentId != 0"
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            >鍒犻櫎</el-button
+          >
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <!-- 娣诲姞鎴栦慨鏀圭珯鐐瑰璇濇 -->
+    <el-dialog :title="title" :visible.sync="open" width="70%" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-row>
+          <el-col :span="24" v-if="form.parentId !== 0">
+            <el-form-item label="涓婄骇绔欑偣" prop="parentId">
+              <treeselect
+                v-model="form.parentId"
+                :options="siteOptions"
+                :normalizer="normalizer"
+                placeholder="閫夋嫨涓婄骇绔欑偣"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="绔欑偣鍚嶇О" prop="siteName">
+              <el-input v-model="form.siteName" placeholder="璇疯緭鍏ョ珯鐐瑰悕绉�" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鏄剧ず鎺掑簭" prop="orderNum">
+              <el-input-number
+                v-model="form.orderNum"
+                controls-position="right"
+                :min="0"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鍦板潃" prop="address">
+              <el-input
+                v-model="form.address"
+                placeholder="璇疯緭鍏ュ湴鍧€"
+                maxlength="20"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鑱旂郴鐢佃瘽" prop="mobile">
+              <el-input
+                v-model="form.mobile"
+                placeholder="璇疯緭鍏ヨ仈绯荤數璇�"
+                maxlength="11"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="绔欑偣缂栧彿" prop="number">
+              <el-input
+                v-model="form.number"
+                placeholder="璇疯緭鍏ョ珯鐐圭紪鍙�"
+                maxlength="50"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="绔欑偣鐘舵€�">
+             <el-radio-group v-model="form.status">
+                <el-radio
+                  v-for="(label, value) in dict.status"
+                  :key="value"
+                  :label="value"
+                  >{{ label }}</el-radio
+                >
+              </el-radio-group> 
+
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="24">
+            <el-form-item label="鍗曚綅浠嬬粛" prop="introduce">
+              <el-input
+                v-model="form.introduce"
+                placeholder="璇疯緭鍏ュ崟浣嶄粙缁�"
+                type="textarea"
+                :rows="2"
+              />
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="24">
+            <el-form-item label="涓績浠嬬粛" prop="summary">
+              <el-input
+                v-model="form.summary"
+                placeholder="璇疯緭鍏ヤ腑蹇冧粙缁�"
+                type="textarea"
+                :rows="2"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { handleTree, formatterDate } from "@/assets/utils";
+
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+
+export default {
+  name: "Dept",
+  components: { Treeselect },
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 鏄剧ず鎼滅储鏉′欢
+      showSearch: true,
+      // 琛ㄦ牸鏍戞暟鎹�
+      siteList: [],
+      // 绔欑偣鏍戦€夐」
+      siteOptions: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鐘舵€佹暟鎹瓧鍏�
+      statusOptions: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        "query.siteName": null,
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      dict: {},
+      toString: ["status"],
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        parentId: [
+          { required: true, message: "涓婄骇绔欑偣涓嶈兘涓虹┖", trigger: "blur" },
+        ],
+        siteName: [
+          { required: true, message: "绔欑偣鍚嶇О涓嶈兘涓虹┖", trigger: "blur" },
+        ],
+        orderNum: [
+          { required: true, message: "鏄剧ず鎺掑簭涓嶈兘涓虹┖", trigger: "blur" },
+        ],
+        email: [
+          {
+            type: "email",
+            message: "'璇疯緭鍏ユ纭殑閭鍦板潃",
+            trigger: ["blur", "change"],
+          },
+        ],
+        mobile: [
+          {
+            pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
+            message: "璇疯緭鍏ユ纭殑鎵嬫満鍙风爜",
+            trigger: "blur",
+          },
+        ],
+      },
+    };
+  },
+  created() {
+    this.getList();
+    
+  },
+  methods: {
+    formatterDate(time) {
+      return formatterDate(time);
+    },
+    /** 鏌ヨ绔欑偣鍒楄〃 */
+    getList() {
+      this.loading = true;
+
+      let query = {};
+      //鍒ゆ柇杩藉姞鐧惧垎鍙�
+      Object.assign(query, this.queryParams);
+
+      if (query["query.siteName"] != null) {
+        query["query.siteName"] = "%" + query["query.siteName"] + "%";
+      }
+      this.$post("/site/list", query)
+        .then((res) => {
+          if (res && res.code && res.code == 1) {
+            this.siteList = handleTree(res.data.result, "id");
+            this.dict = Object.assign({}, this.dict, res.data.dict);
+            this.loading = false;
+          }
+        })
+        .catch((error) => {
+          this.$message.error(error.message);
+        });
+    },
+    /** 杞崲绔欑偣鏁版嵁缁撴瀯 */
+    normalizer(node) {
+      console.log("normalizer", node);
+      if (node.children && !node.children.length) {
+        delete node.children;
+      }
+      return {
+        id: node.id,
+        label: node.siteName,
+        children: node.children,
+      };
+    },
+    // 瀛楀吀鐘舵€佸瓧鍏哥炕璇�
+    statusFormat(row, column) {
+      try {
+        return this.dict["status"][row.status];
+      } catch (error) {
+        return row.status;
+      }
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    resetForm(refName) {
+      if (this.$refs[refName]) {
+        this.$refs[refName].resetFields();
+      }
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        id: null,
+        parentId: 0,
+        siteName: "",
+        orderNum: 0,
+        address: "",
+        mobile: "",
+        introduce: "",
+        summary: "",
+        ancestors: "",
+        status: "1",
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd(row) {
+      this.reset();
+      if (row.id != undefined) {
+        this.form.parentId = row.id;
+      }
+      this.open = true;
+      this.title = "娣诲姞绔欑偣";
+      this.loading = true;
+      this.$post("/site/list", {})
+        .then((res) => {
+          if (res && res.code && res.code == 1) {
+            this.siteOptions = handleTree(res.data.result);
+            this.loading = false;
+          }
+        })
+        .catch((error) => {
+          this.$message.error(error.message);
+        });
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+
+      this.loading = true;
+      this.$post("/site/edit", { id: [row.id] })
+        .then((res) => {
+          if (res && res.code && res.code == 1) {
+            res.data.entity = this.util_toString(
+              res.data.entity,
+              this.toString
+            );
+
+            Object.assign(this.form, res.data.entity);
+
+            this.open = true;
+            this.title = "淇敼绔欑偣";
+            this.loading = false;
+          }
+        })
+        .catch((error) => {
+          this.$message.error(error.message);
+        });
+
+      this.$post("/site/list/exclude", { id: [row.id] })
+        .then((res) => {
+          if (res && res.code && res.code == 1) {
+            this.siteOptions = handleTree(res.data.result);
+          }
+        })
+        .catch((error) => {
+          this.$message.error(error.message);
+        });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function () {
+      this.loading = true;
+      const el = this.$refs.form;
+      el.validate((valid) => {
+        if (!valid) return;
+        this.$post("/site/save", {
+          entity: this.form,
+        })
+          .then((res) => {
+            if (res && res.code && res.code == 1) {
+              this.loading = false;
+              this.reset();
+              this.open = false;
+              this.getList();
+            }
+          })
+          .catch((error) => {
+            this.loading = false;
+            this.$message.error(error.message);
+          });
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      let _this=this
+      this.$confirm(
+        '鏄惁纭鍒犻櫎鍚嶇О涓�"' + row.siteName + '"鐨勬暟鎹」?',
+        "璀﹀憡",
+        {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning",
+        }
+      ).then(function () {
+        _this.$post("/site/delete", { id: [row.id] })
+          .then((res) => {
+            if (res && res.code && res.code == 1) {
+              _this.getList();
+              _this.$message.success("鍒犻櫎鎴愬姛");
+            }
+          })
+          .catch((error) => {
+            _this.$message.error(error.message);
+          });
+      });
+    },
+
+    // 宸ュ叿鏂规硶锛屾妸鏁板瓧杞寲涓哄瓧绗︿覆
+    util_toString(data, array) {
+      const dataCopy = Object.assign({}, data);
+
+      array.forEach((item) => {
+        dataCopy[item] =
+          dataCopy[item] === undefined ? "" : dataCopy[item] + "";
+      });
+      return dataCopy;
+    },
+  },
+};
+</script>
\ No newline at end of file
diff --git a/device-manager-ui/admin/src/views/system/site/indexbak1.vue b/device-manager-ui/admin/src/views/system/site/indexbak1.vue
new file mode 100644
index 0000000..6ab7202
--- /dev/null
+++ b/device-manager-ui/admin/src/views/system/site/indexbak1.vue
@@ -0,0 +1,139 @@
+<template>
+  <div class="page">
+    <LayoutTable ref="layoutTable" :data="tableData" :config="tableConfig"  />
+    <dialog-show ref="dialogform" @ok="getData" />
+  </div>
+</template>
+
+<script>
+import dialogShow from "./dialogshow";
+import { handleTree } from "@/assets/utils/table";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+import table from "@/assets/mixins/table";
+export default {
+  name: "Site",
+  mixins: [table],
+  components: { Treeselect, dialogShow },
+  data() {
+    return {
+      config: {
+        expand:true,
+        search: [
+          {
+            name: "name",
+            type: "text",
+            label: "鍙傛暟鍚嶇О",
+          },
+        ],
+        columns: [
+          {
+            prop: "siteName",
+            label: "siteName",
+          },
+
+          {
+            prop: "number",
+            label: "绔欑偣缂栧彿",
+            width: 200,
+          },
+
+          {
+            prop: "address",
+            label: "绔欑偣鍦板潃",
+            width: 200,
+          },
+          {
+            prop: "status",
+            label: "鐘舵€�",
+            width: 100,
+            formatter: this.formatter,
+          },
+          {
+            label: "鍒涘缓鏃堕棿",
+            prop: "createTime",
+            formatter: this.formatterDate,
+          },
+          {
+            label: "鎿嶄綔",
+            width: 280,
+            formatter: (row) => {
+              return (
+              
+                <div>
+                  <el-button
+                    size="mini"
+                    type="text"
+                    icon="el-icon-edit"
+                    onClick={() => {
+                      this.toEdit(row);
+                    }}
+                  >
+                    淇敼
+                  </el-button>
+                  <el-button
+                    size="mini"
+                    type="text"
+                    icon="el-icon-plus"
+                    onClick={() => {
+                      this.toAdd(row);
+                    }}
+                  >
+                    鏂板
+                  </el-button>
+                  <el-button
+                    size="mini"
+                    type="text"
+                    icon="el-icon-delete"
+                    onClick={() => {
+                      this.handleDelete(row);
+                    }}
+                  >
+                    鍒犻櫎
+                  </el-button>
+                </div>
+              );
+            },
+          },
+        ],
+      },
+    };
+  },
+  created() {
+    
+  },
+  methods: {
+    afterRender(data) {
+      data.result = handleTree(data.result, "id","parentId");
+      this.siteOptions = data.result;
+      this.$refs.layoutTable.showType="treetable"
+      console.log(this.$refs.layoutTable)
+    },
+
+    // 鏂板
+    toAdd(row) {
+      this.$refs.dialogform.add(row, this.siteOptions);
+    },
+    // 缂栬緫
+    toEdit(row,query) {
+      this.loading = true;
+      this.$post(this.pageInfo.exclude, { id: [row.id] })
+        .then((res) => {
+          if (res && res.code && res.code == 1) {
+            this.siteOptions = handleTree(res.data.result);
+            this.$refs.dialogform.edit(row, this.siteOptions);
+            this.loading = false;
+          }
+        })
+        .catch((error) => {
+          this.$message.error(error.message);
+        });
+    },
+    // 鏌ョ湅
+    toView(row,) {
+       this.$refs.dialogform.view(row, this.siteOptions);
+    },
+
+  },
+};
+</script>
\ No newline at end of file
diff --git a/device-manager-ui/admin/src/views/system/site/list.vue b/device-manager-ui/admin/src/views/system/site/list.vue
new file mode 100644
index 0000000..30aaece
--- /dev/null
+++ b/device-manager-ui/admin/src/views/system/site/list.vue
@@ -0,0 +1,205 @@
+<template>
+    <div class="page">
+        <LayoutTable ref="layoutTable" :data="tableData" :config="tableConfig"  />
+        <dialog-show ref="dialogform" @ok="getData" />
+                    </LayoutTable>
+
+    </div>
+</template>
+
+<script>
+import dialogShow from "./dialogshow";
+import { handleTree } from "@/assets/utils/table";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+import table from "@/assets/mixins/table";
+export default {
+  name: "Site",
+  mixins: [table],
+  components: { Treeselect, dialogShow },
+  created() {},
+  methods: {
+    afterRender(data) {
+      data.result = handleTree(data.result, "id", "parentId");
+      this.siteOptions = data.result;
+      this.$refs.layoutTable.showType = "treetable";
+    },
+
+    // 鏂板
+    toAdd(row) {
+      this.$refs.dialogform.add(row, this.siteOptions);
+    },
+    // 缂栬緫
+    toEdit(row) {
+      this.loading = true;
+      this.$post(this.pageInfo.exclude, { id: [row.id] })
+        .then((res) => {
+          if (res && res.code && res.code == 1) {
+            this.siteOptions = handleTree(res.data.result);
+            this.$refs.dialogform.edit(row, this.siteOptions);
+            this.loading = false;
+          }
+        })
+        .catch((error) => {
+          this.$message.error(error.message);
+        });
+    },
+    // 鏌ョ湅
+    toView(row) {
+      this.$refs.dialogform.view(row, this.siteOptions);
+    },
+  },
+  data() {
+    return {
+      /** 鏍戣〃鏄惁榛樿灞曞紑 */
+      expand: true,
+
+      config: {
+        search: [
+          {
+            name: "siteName",
+            type: "text",
+            label: "绔欑偣鍚�",
+            fuzzy: true,
+          },
+          {
+            name: "parentId",
+            type: "text",
+            label: "鐖剁骇id",
+            fuzzy: true,
+          },
+          {
+            name: "ancestors",
+            type: "text",
+            label: "绁栫骇鍒楄〃锛岄€楀彿鍒嗛殧",
+            fuzzy: true,
+          },
+          {
+            name: "address",
+            type: "text",
+            label: "鍦板潃",
+            fuzzy: true,
+          },
+          {
+            name: "mobile",
+            type: "text",
+            label: "鐢佃瘽",
+            fuzzy: true,
+          },
+          {
+            name: "workday1",
+            type: "text",
+            label: "鍛ㄤ竴 1涓婄彮 0涓嶄笂",
+            fuzzy: true,
+          },
+          {
+            name: "workday2",
+            type: "text",
+            label: "鍛ㄤ簩 1涓婄彮 0涓嶄笂",
+            fuzzy: true,
+          },
+          {
+            name: "workday3",
+            type: "text",
+            label: "鍛ㄤ笁 1涓婄彮 0涓嶄笂",
+            fuzzy: true,
+          },
+          {
+            name: "workday4",
+            type: "text",
+            label: "鍛ㄥ洓 1涓婄彮 0涓嶄笂",
+            fuzzy: true,
+          },
+          {
+            name: "workday5",
+            type: "text",
+            label: "鍛ㄤ簲 1涓婄彮 0涓嶄笂",
+            fuzzy: true,
+          },
+          {
+            name: "workday6",
+            type: "text",
+            label: "鍛ㄥ叚 1涓婄彮 0涓嶄笂",
+            fuzzy: true,
+          },
+          {
+            name: "workday7",
+            type: "text",
+            label: "鍛ㄦ棩 1涓婄彮 0涓嶄笂",
+            fuzzy: true,
+          },
+          {
+            name: "number",
+            type: "text",
+            label: "绔欑偣缂栧彿",
+            fuzzy: true,
+          },
+          {
+            name: "orderNum",
+            type: "text",
+            label: "鎺掑簭瀛楁",
+            fuzzy: true,
+          },
+          {
+            name: "status",
+            type: "checkbox",
+            label: "绔欑偣鐘舵€� 锛�0锛屽仠鐢紝1锛屾甯� 榛樿1",
+            fuzzy: true,
+          },
+        ],
+        columns: [
+          { label: "绔欑偣鍚�", prop: "siteName" },
+          {
+            label: "鐖剁骇id",
+            prop: "parentId",
+            formatter: this.formatterString,
+          },
+          { label: "绁栫骇鍒楄〃锛岄€楀彿鍒嗛殧", prop: "ancestors" },
+          { label: "鍦板潃", prop: "address" },
+          { label: "鐢佃瘽", prop: "mobile" },
+          { label: "鍗曚綅浠嬬粛", prop: "introduce" },
+          { label: "鍛ㄤ竴 1涓婄彮 0涓嶄笂", prop: "workday1" },
+          { label: "鍛ㄤ簩 1涓婄彮 0涓嶄笂", prop: "workday2" },
+          { label: "鍛ㄤ笁 1涓婄彮 0涓嶄笂", prop: "workday3" },
+          { label: "鍛ㄥ洓 1涓婄彮 0涓嶄笂", prop: "workday4" },
+          { label: "鍛ㄤ簲 1涓婄彮 0涓嶄笂", prop: "workday5" },
+          { label: "鍛ㄥ叚 1涓婄彮 0涓嶄笂", prop: "workday6" },
+          { label: "鍛ㄦ棩 1涓婄彮 0涓嶄笂", prop: "workday7" },
+          { label: "绔欑偣缂栧彿", prop: "number" },
+          { label: "涓績浠嬬粛", prop: "summary" },
+          { label: "鎺掑簭瀛楁", prop: "orderNum" },
+          { label: "绔欑偣鐘舵€� 锛�0锛屽仠鐢紝1锛屾甯� 榛樿1", prop: "status" },
+
+          {
+            label: "鎿嶄綔",
+            width: 280,
+            formatter: (row) => {
+              return (
+                <div>
+                  <el-button
+                    size="mini"
+                    type="text"
+                    icon="el-icon-edit-outline"
+                    onClick={() => {
+                      this.handleAdd(row);
+                    }}
+                  >
+                    鏂板
+                  </el-button>
+                  <table-buttons
+                    noAdd
+                    row={row}
+                    onEdit={this.toEdit}
+                    onView={this.toView}
+                    onDel={this.toDel}
+                  />
+                </div>
+              );
+            },
+          },
+        ],
+      },
+    };
+  },
+};
+</script>
\ No newline at end of file
diff --git a/device-manager-ui/admin/src/views/system/task/dialogshow.vue b/device-manager-ui/admin/src/views/system/task/dialogshow.vue
new file mode 100644
index 0000000..ef20f88
--- /dev/null
+++ b/device-manager-ui/admin/src/views/system/task/dialogshow.vue
@@ -0,0 +1,178 @@
+// 娣诲姞锛岀紪杈戣澶�
+<template>
+  <!-- 寮瑰嚭妗嗚〃鍗� -->
+  <el-dialog :title="title" :visible.sync="open" width="80%" append-to-body>
+    <el-form
+      ref="form"
+      :model="form"
+      :rules="rules"
+      label-width="110px"
+      label-position="right"
+    >
+      <el-row>
+        <Field label="浠诲姟鍚嶇О" prop="name" v-model="form.name"/>
+        <Field label="鍏抽敭瀛�" prop="taskKey" v-model="form.taskKey"/>
+        <Field label="鎵ц鏈嶅姟" prop="excuteService" v-model="form.excuteService" :enumData='dict.excuteService' type='select' />
+        
+        <Field label="鎵ц绛栫暐" prop="excuteStrategy" @change='excuteStrategyChange' v-model="form.excuteStrategy" :enumData='dict.excuteStrategy' type='select' />
+        <Field :label="form.excuteStrategy == 4 ? '鎵ц闂撮殧鏃堕棿' : '鎵ц鏃ユ湡'" prop="excuteDate">
+
+          <el-input disabled value='姣忓ぉ' v-if='form.excuteStrategy == 1'></el-input>
+
+          <el-select v-model="form.excuteDate" v-if='form.excuteStrategy == 2'>
+            <el-option 
+              v-for='($label, $value) in dict.week' 
+              :key='$value' 
+              :label="$label" 
+              :value="$value"
+            ></el-option>
+          </el-select>
+
+          <el-select v-model="form.excuteDate" v-if='form.excuteStrategy == 3'>
+            <el-option 
+              v-for='($label, $value) in dict.days' 
+              :key='$value' 
+              :label="$label" 
+              :value="$value"
+            ></el-option>
+          </el-select>
+
+          <el-input v-model="form.excuteDate" v-if='form.excuteStrategy == 4'>
+            <template slot="append">绉�</template>
+          </el-input>
+        </Field>
+        <Field label="鎵ц鏃堕棿" prop="excuteTime" v-if='form.excuteStrategy != 4'>
+          <el-time-select
+            v-model="form.excuteTime"
+            :picker-options="{
+              start: '00:00',
+              step: '00:5',
+              end: '23:45'
+            }"
+            placeholder="閫夋嫨鏃堕棿">
+          </el-time-select>
+        </Field>
+
+        <Field :span="24" label="鎵ц涓绘満" prop="excuteHost" v-model="form.excuteHost"/>
+        <Field :span="24" label="鎵ц鍙傛暟" prop="excuteParam" v-model="form.excuteParam"  type='textarea' textareaSize/>
+        <Field :span="24" label="澶囨敞" prop="remark" v-model="form.remark"  type='textarea' textareaSize/>
+      </el-row>
+    </el-form>
+    <div slot="footer" class="dialog-footer">
+      <el-button
+        type="primary"
+        v-if="pageInfo.type !== 'view'"
+        @click="submitForm"
+        >纭� 瀹�</el-button
+      >
+      <el-button @click="cancel">鍙� 娑�</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import form from "@/assets/mixins/formdialog";
+import dialogShow from "./dialogshow";
+export default {
+  mixins: [form],
+  components: {
+    dialogShow,
+  },
+
+
+  methods: {
+    beforeRender(data) {
+      data.dict = data.dict || {};
+      const days = {};
+      [...new Array(31)].forEach((i,index)=>{
+        let key = index+1;
+        days[key] = `${key}鍙穈;
+      })
+      data.dict.days = days;
+      data.dict.week = {
+        1: '鏄熸湡涓€',
+        2: '鏄熸湡浜�',
+        3: '鏄熸湡涓�',
+        4: '鏄熸湡鍥�',
+        5: '鏄熸湡浜�',
+        6: '鏄熸湡鍏�',
+        7: '鏄熸湡澶�',
+      };
+      data.dict.excuteService = data.excuteService;
+      return data;
+    },
+    excuteStrategyChange(val) {
+      this.form.excuteDate = val == 1 ? '0' : '1';
+    },
+    /** 缂栬緫 */
+    edit(row) {
+      this.reset();
+      this.query = { id: row.id };
+      this.urls.currUrl = this.pageInfo.editUrl;
+      this.getData();
+      this.pageInfo.type = "edit";
+      this.title = "淇敼浠诲姟";
+    },
+    /** 鏂板 */
+    add(row) {
+      this.reset();
+      this.query = { id: row.id };
+      this.urls.currUrl = this.pageInfo.addUrl;
+      this.getData();
+      this.pageInfo.type = "add";
+      this.title = "鏂板浠诲姟";
+    },
+    /** 鏌ョ湅*/
+    view(row) {
+      this.reset();
+      this.query = { id: row.id };
+      this.urls.currUrl = this.pageInfo.viewUrl;
+      this.getData();
+      this.pageInfo.type = "view";
+      this.title = "浠诲姟璇︾粏";
+    },
+    /**鍙栨秷鎸夐挳 */
+    cancel() {
+      this.open = false;
+    },
+    /**鑾峰彇鏁版嵁鍚庡脊妗� */
+    afterRender(data) {
+      console.log(this.form)
+      this.open = true;
+    },
+
+    afterSubmit(data) {
+      this.open = false;
+      this.$emit("ok");
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+       this.form = {};
+      this.resetForm("form");
+    },
+    resetForm(refName) {
+      if (this.$refs[refName]) {
+        this.$refs[refName].resetFields();
+      }
+    },
+  },
+    data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 寮瑰嚭灞傛爣棰�
+      title: "鐢ㄦ埛",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+       toString: ['excuteService', 'excuteStrategy', 'excuteDate'],
+      rules: {
+        name: [{ required: true, message: '璇疯緭鍏ヤ换鍔″悕绉�', trigger: 'blur' },],
+        taskKey: [{ required: true, message: '璇疯緭鍏ヤ换鍔″叧閿瓧', trigger: 'blur' },],
+        excuteService: [{ required: true, message: '璇烽€夋嫨浠诲姟鎵ц鏈嶅姟', trigger: 'blur' },],
+      },
+    };
+  },
+};
+</script>
+
+
diff --git a/device-manager-ui/admin/src/views/system/user/dialogshow.vue b/device-manager-ui/admin/src/views/system/user/dialogshow.vue
new file mode 100644
index 0000000..5ca70d2
--- /dev/null
+++ b/device-manager-ui/admin/src/views/system/user/dialogshow.vue
@@ -0,0 +1,194 @@
+// 娣诲姞锛岀紪杈戣澶�
+<template>
+  <!-- 寮瑰嚭妗嗚〃鍗� -->
+  <el-dialog :title="title" :visible.sync="open" width="40%" append-to-body>
+    <el-form
+      ref="form"
+      :model="form"
+      :rules="rules"
+      label-width="110px"
+      label-position="right"
+    >
+      <el-row>
+        <Field
+          :span="20"
+          label="鐧诲綍鍚嶇О"
+          prop="loginName"
+          v-model="form.loginName"
+        />
+
+        <Field :span="20" label="瀵嗙爜" prop="loginPwd">
+          <el-input
+            v-model.trim="form.loginPwd"
+            placeholder="璇疯緭鍏ュ瘑鐮�"
+            :type="passw"
+            clearable
+            @blur="onBlur"
+          >
+            <!-- input涓姞鍥炬爣蹇呴』瑕佹湁slot="suffix"灞炴€э紝涓嶇劧鏃犳硶鏄剧ず鍥炬爣 -->
+            <i slot="suffix" :class="icon" @click="showPass"></i>
+          </el-input>
+        </Field>
+        <!-- <Field :span="20" label="鐧诲綍瀵嗙爜" prop="loginPwd" v-model="form.loginPwd" /> -->
+        <Field
+          :span="20"
+          label="鐢ㄦ埛鍚嶇О"
+          prop="realName"
+          v-model="form.realName"
+        />
+        <Field
+          :span="20"
+          label="鎵嬫満鍙风爜"
+          prop="mobile"
+          v-model="form.mobile"
+        />
+        <!-- <Field label="鐢ㄦ埛绫诲瀷" prop="userType" v-model="form.userType" :enumData='dict.userType' type='select' />
+        <Field label="鐢ㄦ埛鐘舵€�" prop="status" v-model="form.status" :enumData='dict.status' type='select' /> -->
+        <Field
+          label="瑙掕壊鍒嗛厤"
+          :span="24"
+          v-model="form.roleIds"
+          type="checkbox"
+          :enumData="dict.roleIds"
+        />
+      </el-row>
+    </el-form>
+    <div slot="footer" class="dialog-footer">
+      <el-button
+        type="primary"
+        v-if="pageInfo.type !== 'view'"
+        @click="submitForm"
+        >纭� 瀹�</el-button
+      >
+      <el-button @click="cancel">鍙� 娑�</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import form from "@/assets/mixins/formdialog";
+import dialogShow from "./dialogshow";
+export default {
+  mixins: [form],
+  components: {
+    dialogShow,
+  },
+
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 寮瑰嚭灞傛爣棰�
+      title: "鐢ㄦ埛",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      toString: ["status", "userType"],
+      toArrays: ["roleIds"],
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        loginName: [
+          { required: true, message: "璇疯緭鍏ヨ嫳鏂囩殑鐢ㄦ埛鍚�", trigger: "blur" },
+          {
+            validator: function (rule, value, callback) {
+              //  鏍¢獙鑻辨枃鐨勬鍒�
+              if (/[A-Za-z0-9]$/.test(value) == false) {
+                callback(new Error("璇疯緭鍏ヨ嫳鏂�"));
+              } else {
+                //鏍¢獙閫氳繃
+                callback();
+              }
+            },
+            trigger: "blur",
+          },
+        ],
+      },
+      icon: "el-input__icon el-icon-view",
+      passw: "password",
+      SPAN: "24",
+    };
+  },
+  methods: {
+    /** 缂栬緫 */
+    edit(row) {
+      this.reset();
+      this.query = { id: row.id };
+      this.urls.currUrl = this.pageInfo.editUrl;
+      this.getData();
+      this.pageInfo.type = "edit";
+      this.title = "淇敼鐢ㄦ埛";
+    },
+    /** 鏂板 */
+    add(row) {
+      this.reset();
+      this.query = { id: row.id };
+      this.urls.currUrl = this.pageInfo.addUrl;
+      this.getData();
+      this.pageInfo.type = "add";
+      this.title = "鏂板鐢ㄦ埛";
+    },
+    /** 鏌ョ湅*/
+    view(row) {
+      this.reset();
+      this.query = { id: row.id };
+      this.urls.currUrl = this.pageInfo.viewUrl;
+      this.getData();
+      this.pageInfo.type = "view";
+      this.title = "鐢ㄦ埛璇︾粏";
+    },
+    /**鍙栨秷鎸夐挳 */
+    cancel() {
+      this.open = false;
+    },
+    /**鑾峰彇鏁版嵁鍚庡脊妗� */
+    afterRender(data) {
+      this.open = true;
+    },
+
+    beforeSubmit(data) {
+      data.roleIds = data.roleIds
+        .filter((item) => {
+          return item !== "";
+        })
+        .join(",");
+
+      return data;
+    },
+    afterSubmit(data) {
+      this.open = false;
+      this.$emit("ok");
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {roleIds:""};
+      this.resetForm("form");
+    },
+
+    resetForm(refName) {
+      if (this.$refs[refName]) {
+        this.$refs[refName].resetFields();
+      }
+    },
+    showPass() {
+      //鐐瑰嚮鍥炬爣鏄瘑鐮侀殣钘忔垨鏄剧ず
+      if (this.passw == "text") {
+        this.passw = "password";
+        //鏇存崲鍥炬爣
+        this.icon = "el-input__icon el-icon-view";
+      } else {
+        this.passw = "text";
+        this.icon = "el-input__icon el-icon-loading";
+        setTimeout(() => {
+          this.icon = "";
+        }, 100);
+      }
+    },
+    //瀵嗙爜澶辩劍浜嬩欢
+    onBlur() {
+      this.passw = "password";
+      this.icon = "el-input__icon el-icon-view";
+    },
+  },
+};
+</script>
+
+
-- 
2.24.3