Explorar o código

修复了一波问题

002201 %!s(int64=2) %!d(string=hai) anos
pai
achega
80bde14435

+ 37 - 64
src/views/login.vue

@@ -9,11 +9,7 @@
           auto-complete="off"
           placeholder="账号"
         >
-          <svg-icon
-            slot="prefix"
-            icon-class="user"
-            class="el-input__icon input-icon"
-          />
+          <svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" />
         </el-input>
       </el-form-item>
       <el-form-item prop="password">
@@ -24,11 +20,7 @@
           placeholder="密码"
           @keyup.enter.native="handleLogin"
         >
-          <svg-icon
-            slot="prefix"
-            icon-class="password"
-            class="el-input__icon input-icon"
-          />
+          <svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon" />
         </el-input>
       </el-form-item>
       <el-form-item prop="code" v-if="captchaEnabled">
@@ -39,36 +31,26 @@
           style="width: 63%"
           @keyup.enter.native="handleLogin"
         >
-          <svg-icon
-            slot="prefix"
-            icon-class="validCode"
-            class="el-input__icon input-icon"
-          />
+          <svg-icon slot="prefix" icon-class="validCode" class="el-input__icon input-icon" />
         </el-input>
         <div class="login-code">
-          <img :src="codeUrl" @click="getCode" class="login-code-img" />
+          <img :src="codeUrl" @click="getCode" class="login-code-img"/>
         </div>
       </el-form-item>
-      <el-checkbox
-        v-model="loginForm.rememberMe"
-        style="margin: 0px 0px 25px 0px"
-        >记住密码</el-checkbox
-      >
-      <el-form-item style="width: 100%">
+      <el-checkbox v-model="loginForm.rememberMe" style="margin:0px 0px 25px 0px;">记住密码</el-checkbox>
+      <el-form-item style="width:100%;">
         <el-button
           :loading="loading"
           size="medium"
           type="primary"
-          style="width: 100%"
+          style="width:100%;"
           @click.native.prevent="handleLogin"
         >
           <span v-if="!loading">登 录</span>
           <span v-else>登 录 中...</span>
         </el-button>
-        <div style="float: right" v-if="register">
-          <router-link class="link-type" :to="'/register'"
-            >立即注册</router-link
-          >
+        <div style="float: right;" v-if="register">
+          <router-link class="link-type" :to="'/register'">立即注册</router-link>
         </div>
       </el-form-item>
     </el-form>
@@ -82,7 +64,7 @@
 <script>
 import { getCodeImg } from "@/api/login";
 import Cookies from "js-cookie";
-import { encrypt, decrypt } from "@/utils/jsencrypt";
+import { encrypt, decrypt } from '@/utils/jsencrypt'
 
 export default {
   name: "Login",
@@ -94,32 +76,32 @@ export default {
         password: "drp0330",
         rememberMe: false,
         code: "",
-        uuid: "",
+        uuid: ""
       },
       loginRules: {
         username: [
-          { required: true, trigger: "blur", message: "请输入您的账号" },
+          { required: true, trigger: "blur", message: "请输入您的账号" }
         ],
         password: [
-          { required: true, trigger: "blur", message: "请输入您的密码" },
+          { required: true, trigger: "blur", message: "请输入您的密码" }
         ],
-        code: [{ required: true, trigger: "change", message: "请输入验证码" }],
+        code: [{ required: true, trigger: "change", message: "请输入验证码" }]
       },
       loading: false,
       // 验证码开关
       captchaEnabled: true,
       // 注册开关
       register: false,
-      redirect: undefined,
+      redirect: undefined
     };
   },
   watch: {
     $route: {
-      handler: function (route) {
+      handler: function(route) {
         this.redirect = route.query && route.query.redirect;
       },
-      immediate: true,
-    },
+      immediate: true
+    }
   },
   created() {
     this.getCode();
@@ -127,9 +109,8 @@ export default {
   },
   methods: {
     getCode() {
-      getCodeImg().then((res) => {
-        this.captchaEnabled =
-          res.captchaEnabled === undefined ? true : res.captchaEnabled;
+      getCodeImg().then(res => {
+        this.captchaEnabled = res.captchaEnabled === undefined ? true : res.captchaEnabled;
         if (this.captchaEnabled) {
           this.codeUrl = "data:image/gif;base64," + res.img;
           this.loginForm.uuid = res.uuid;
@@ -139,46 +120,38 @@ export default {
     getCookie() {
       const username = Cookies.get("username");
       const password = Cookies.get("password");
-      const rememberMe = Cookies.get("rememberMe");
+      const rememberMe = Cookies.get('rememberMe')
       this.loginForm = {
         username: username === undefined ? this.loginForm.username : username,
-        password:
-          password === undefined ? this.loginForm.password : decrypt(password),
-        rememberMe: rememberMe === undefined ? false : Boolean(rememberMe),
+        password: password === undefined ? this.loginForm.password : decrypt(password),
+        rememberMe: rememberMe === undefined ? false : Boolean(rememberMe)
       };
     },
     handleLogin() {
-      this.$refs.loginForm.validate((valid) => {
+      this.$refs.loginForm.validate(valid => {
         if (valid) {
           this.loading = true;
           if (this.loginForm.rememberMe) {
             Cookies.set("username", this.loginForm.username, { expires: 30 });
-            Cookies.set("password", encrypt(this.loginForm.password), {
-              expires: 30,
-            });
-            Cookies.set("rememberMe", this.loginForm.rememberMe, {
-              expires: 30,
-            });
+            Cookies.set("password", encrypt(this.loginForm.password), { expires: 30 });
+            Cookies.set('rememberMe', this.loginForm.rememberMe, { expires: 30 });
           } else {
             Cookies.remove("username");
             Cookies.remove("password");
-            Cookies.remove("rememberMe");
+            Cookies.remove('rememberMe');
           }
-          this.$store
-            .dispatch("Login", this.loginForm)
-            .then(() => {
-              this.$router.push({ path: this.redirect || "/" }).catch(() => {});
-            })
-            .catch(() => {
-              this.loading = false;
-              if (this.captchaEnabled) {
-                this.getCode();
-              }
-            });
+          this.$store.dispatch("Login", this.loginForm).then(() => {
+            this.$router.push({ path: this.redirect || "/" }).catch(()=>{});
+          }).catch(() => {
+            this.loading = false;
+            if (this.captchaEnabled) {
+              this.getCode();
+            }
+          });
         }
       });
-    },
-  },
+    }
+  }
 };
 </script>
 

+ 27 - 22
src/views/system/table-template/add-dialog.vue

@@ -112,16 +112,14 @@ export default {
       });
     },
     //
-    onMoveRow(direction, index1) {
-      let index2 = 0;
+    onMoveRow(index1, index2) {
       let swapArr = (arr, index1, index2) => {
         arr[index1] = arr.splice(index2, 1, arr[index1])[0];
         return arr;
       };
-      index2 = direction === "top" ? index1 - 1 : index1 + 1;
       this.form.sysTemplateItemList = swapArr(
         this.form.sysTemplateItemList,
-        index1,
+        index1 - 1,
         index2
       );
     },
@@ -137,9 +135,10 @@ export default {
       this.loading = true;
       this.form.id = "";
       this.form.sysTemplateItemList = this.form.sysTemplateItemList.map(
-        (item) => ({
+        (item, index) => ({
           ...item,
           id: "",
+          sort: String(index),
           isEdit: item.isEdit === true ? "1" : "0",
           isShow: item.isShow === true ? "1" : "0",
           isRequired: item.isRequired === true ? "1" : "0",
@@ -167,8 +166,9 @@ export default {
 
 <template>
   <el-dialog
+    fullscreen
     destroy-on-close
-    title="编辑"
+    title="复制"
     width="75%"
     :visible.sync="dialogFormVisible"
   >
@@ -185,6 +185,7 @@ export default {
             <el-select
               v-if="column.type === 'select'"
               v-model="form[column.prop]"
+              style="width: 100%"
             >
               <el-option label="启用" value="0"></el-option>
               <el-option label="停用" value="2"></el-option>
@@ -202,7 +203,7 @@ export default {
               >
               </el-button>
             </template>
-            <el-table :data="form.sysTemplateItemList">
+            <el-table height="450" :data="form.sysTemplateItemList">
               <el-table-column type="index" width="50"> </el-table-column>
               <el-table-column prop="code" label="字段编码" width="200">
                 <template slot-scope="scope">
@@ -259,22 +260,26 @@ export default {
               </el-table-column>
               <el-table-column fixed="right" label="操作" width="150">
                 <template slot-scope="scope">
-                  <el-button
-                    :disabled="scope.$index === 0"
-                    @click.native.prevent="onMoveRow('top', scope.$index)"
-                    icon="el-icon-top"
-                    circle
+                  <el-popover
+                    placement="left"
+                    width="200"
+                    trigger="click"
+                    style="margin-right: 8px"
                   >
-                  </el-button>
-                  <el-button
-                    :disabled="
-                      scope.$index === form.sysTemplateItemList.length - 1
-                    "
-                    @click.native.prevent="onMoveRow('bottom', scope.$index)"
-                    icon="el-icon-bottom"
-                    circle
-                  >
-                  </el-button>
+                    <el-input-number
+                      v-model="scope.row.sort"
+                      controls-position="right"
+                      @change="onMoveRow($event, scope.$index)"
+                      :min="1"
+                      :max="form.sysTemplateItemList.length"
+                    ></el-input-number>
+                    <el-button
+                      slot="reference"
+                      icon="el-icon-watermelon"
+                      circle
+                    >
+                    </el-button>
+                  </el-popover>
                   <el-button
                     @click.native.prevent="onRemoveRow(scope.row)"
                     icon="el-icon-remove"

+ 17 - 1
src/views/system/table-template/auth-dialog.vue

@@ -16,6 +16,7 @@ export default {
     //
     fetchItem(prop) {
       let { id } = prop;
+      this.form.id = id;
       this.loading = true;
       this.dialogFormVisible = true;
       listRole({ id })
@@ -39,7 +40,22 @@ export default {
         });
     },
     //
-    onSubmit() {},
+    onSubmit() {
+      auth({ templateId: this.form.id, roleIdList: this.authRoleList })
+        .then((res) => {
+          let { code } = res;
+          if (code == 200) {
+            this.dialogFormVisible = false;
+            this.$message.success("授权成功");
+            this.$parent.$children
+              .find((el) => el.$vnode.tag.indexOf("SearchTable") > -1)
+              .fetchList();
+          }
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
   },
   created() {},
 };

+ 41 - 24
src/views/system/table-template/edit-dialog.vue

@@ -112,16 +112,14 @@ export default {
       });
     },
     //
-    onMoveRow(direction, index1) {
-      let index2 = 0;
+    onMoveRow(index1, index2) {
       let swapArr = (arr, index1, index2) => {
         arr[index1] = arr.splice(index2, 1, arr[index1])[0];
         return arr;
       };
-      index2 = direction === "top" ? index1 - 1 : index1 + 1;
       this.form.sysTemplateItemList = swapArr(
         this.form.sysTemplateItemList,
-        index1,
+        index1 - 1,
         index2
       );
     },
@@ -136,9 +134,10 @@ export default {
     onSubmit() {
       this.loading = true;
       this.form.sysTemplateItemList = this.form.sysTemplateItemList.map(
-        (item) => ({
+        (item, index) => ({
           ...item,
           id: "",
+          sort: String(index),
           isEdit: item.isEdit === true ? "1" : "0",
           isShow: item.isShow === true ? "1" : "0",
           isRequired: item.isRequired === true ? "1" : "0",
@@ -166,8 +165,9 @@ export default {
 
 <template>
   <el-dialog
+    fullscreen
     destroy-on-close
-    title="更新"
+    title="编辑"
     width="75%"
     :visible.sync="dialogFormVisible"
   >
@@ -184,6 +184,7 @@ export default {
             <el-select
               v-if="column.type === 'select'"
               v-model="form[column.prop]"
+              style="width: 100%"
             >
               <el-option label="启用" value="0"></el-option>
               <el-option label="停用" value="2"></el-option>
@@ -195,13 +196,13 @@ export default {
             <template #label>
               <span style="margin-right: 12px">模板配置</span>
               <el-button
-                @click.native.prevent="onAdd"
+                @click.native.prevent="onAddRow"
                 icon="el-icon-plus"
                 circle
               >
               </el-button>
             </template>
-            <el-table :data="form.sysTemplateItemList">
+            <el-table height="450" :data="form.sysTemplateItemList">
               <el-table-column type="index" width="50"> </el-table-column>
               <el-table-column prop="code" label="字段编码" width="200">
                 <template slot-scope="scope">
@@ -258,22 +259,26 @@ export default {
               </el-table-column>
               <el-table-column fixed="right" label="操作" width="150">
                 <template slot-scope="scope">
-                  <el-button
-                    :disabled="scope.$index === 0"
-                    @click.native.prevent="onMoveRow('top', scope.$index)"
-                    icon="el-icon-top"
-                    circle
-                  >
-                  </el-button>
-                  <el-button
-                    :disabled="
-                      scope.$index === form.sysTemplateItemList.length - 1
-                    "
-                    @click.native.prevent="onMoveRow('bottom', scope.$index)"
-                    icon="el-icon-bottom"
-                    circle
+                  <el-popover
+                    placement="left"
+                    width="200"
+                    trigger="click"
+                    style="margin-right: 8px"
                   >
-                  </el-button>
+                    <el-input-number
+                      v-model="scope.row.sort"
+                      controls-position="right"
+                      @change="onMoveRow($event, scope.$index)"
+                      :min="1"
+                      :max="form.sysTemplateItemList.length"
+                    ></el-input-number>
+                    <el-button
+                      slot="reference"
+                      icon="el-icon-watermelon"
+                      circle
+                    >
+                    </el-button>
+                  </el-popover>
                   <el-button
                     @click.native.prevent="onRemoveRow(scope.row)"
                     icon="el-icon-remove"
@@ -298,4 +303,16 @@ export default {
   </el-dialog>
 </template>
 
-<style scoped></style>
+<style>
+.el-dialog.is-fullscreen {
+  height: 100vh;
+  display: flex;
+  flex-direction: column;
+  overflow: hidden;
+}
+
+.el-dialog.is-fullscreen .el-dialog__body {
+  flex: 1;
+  overflow-y: auto;
+}
+</style>

+ 6 - 1
src/views/system/table-template/index.vue

@@ -36,7 +36,12 @@ export default {
   --padding: var(--size);
 }
 .container {
-  width: calc(100% - calc(var(--size)));
+  width: 100%;
+  height: calc(100vh - 50px);
   margin-right: var(--padding);
 }
+.hasTagsView .container {
+  height: calc(100vh - 84px);
+  overflow: hidden;
+}
 </style>

+ 94 - 91
src/views/system/table-template/search-table.vue

@@ -9,9 +9,6 @@ export default {
         { label: "停用", value: "2" },
       ],
     };
-    const formatter = function (row, { property }, cellValue, index) {
-      return dict[property].find((item) => item.value === row[property]).label;
-    };
     const columns = [
       {
         type: "text",
@@ -42,7 +39,7 @@ export default {
         prop: "status",
         label: "启用状态",
         showOverflowTooltip: true,
-        formatter: formatter,
+        formatter: true,
       },
       {
         type: "text",
@@ -73,6 +70,7 @@ export default {
         readonly: true,
       },
     ];
+    const initDict = () => dict;
     const initColumns = () => columns;
     const initOptions = () =>
       initColumns().map((item) => ({ label: item.label, value: item.prop }));
@@ -83,80 +81,94 @@ export default {
     };
     return {
       loading: false,
+      dict: initDict(),
+      columns: initColumns(),
       form: initForm(),
       options: initOptions(),
-      columns: initColumns(),
       tableData: [],
-      selectionTableData: [],
+      currentData: {},
       page: { pageNum: 1, pageSize: 25 },
       total: 0,
     };
   },
   methods: {
     //
+    formatter({ row, column: { property } }) {
+      return this.dict[property].find((item) => item.value === row[property])
+        .label;
+    },
+    // 请求
     fetchList() {
       this.loading = true;
       list(this.from, this.page)
         .then((res) => {
           let { code, total, rows } = res;
           if (code === 200) {
-            this.tableData = rows;
             this.total = total;
-            this.$message.success("success");
+            this.tableData = rows;
+            this.currentData = rows[0];
+            this.$message.success("查询成功");
           }
         })
         .finally(() => {
           this.loading = false;
         });
     },
-    //
-    onSearch() {
+    // 搜索
+    handleSearch() {
       this.pageNum = 1;
       this.fetchList();
     },
-    //
-    onReset() {
+    // 重置
+    handleReset() {
       this.pageNum = 1;
       this.pageSize = 25;
       this.fetchList();
     },
-    //
-    onSizeChnage() {
+    // 个数
+    handleSize() {
       this.pageNum = 1;
       this.fetchList();
     },
-    //
-    onCurrentChange() {
+    // 页数
+    handleCurrent() {
       this.fetchList();
     },
-    //
-    onCopy(prop) {
+    // 高亮
+    handleRowClass({ row }) {
+      if (row.id === this.currentData.id) return "current-row";
+    },
+    // 选择
+    handleCurrentRowSelect(row) {
+      this.currentData = row;
+    },
+    // 复制
+    handleCopy(prop) {
       this.$parent.$children
         .find((el) => el.$vnode.tag.indexOf("AddDialog") > -1)
         .fetchItem(prop);
     },
-    //
-    onEdit(prop) {
+    // 编辑
+    handleEdit(prop) {
       this.$parent.$children
         .find((el) => el.$vnode.tag.indexOf("EditDialog") > -1)
         .fetchItem(prop);
     },
-    //
-    onAuth(prop) {
+    // 授权
+    handleAuth(prop) {
       this.$parent.$children
         .find((el) => el.$vnode.tag.indexOf("AuthDialog") > -1)
         .fetchItem(prop);
     },
-    //
-    onDelete(prop) {
-      let { id } = prop;
+    // 删除
+    handleDelete(prop) {
       this.loading = true;
-      remove(id)
+      remove(prop.id)
         .then((res) => {
           let { code } = res;
           if (code === 200) {
-            this.$message.success("删除成功");
             this.fetchList();
+            this.$message.success("删除成功");
           }
         })
         .finally(() => {
@@ -165,57 +177,66 @@ export default {
     },
   },
   created() {
-    this.onSearch();
+    this.handleSearch();
   },
 };
 </script>
 
 <template>
-  <el-container class="table-template-table">
+  <el-container class="table-template">
     <el-header>
-      <div class="table-header-top">
-        <span>查询条件</span>
-        <div>
-          <el-select v-model="form.select" size="small" placeholder="请选择">
-            <el-option
-              v-for="item in options"
-              :key="item.value"
-              :label="item.label"
-              :value="item.value"
-            >
-            </el-option>
-          </el-select>
-          <el-input
-            v-model="form.input"
-            size="small"
-            placeholder="请输入内容"
-            :readonly="loading"
-          >
-            <template #suffix>
-              <i v-show="loading" class="el-input__icon el-icon-loading"></i>
-              <i v-show="!loading" class="el-input__icon el-icon-search"></i>
-            </template>
-          </el-input>
-          <el-button size="small" @click="onSearch">搜索</el-button>
-          <el-button size="small" @click="onReset">重置</el-button>
-        </div>
-      </div>
-      <!-- <div class="table-header-bottom">
+      <div>
+        <el-button @click.native.prevent="handleCopy(currentData)" size="small">
+          复制
+        </el-button>
+        <el-button @click.native.prevent="handleEdit(currentData)" size="small">
+          修改
+        </el-button>
+        <el-button @click.native.prevent="handleAuth(currentData)" size="small">
+          授权
+        </el-button>
         <el-button
+          @click.native.prevent="handleDelete(currentData)"
+          size="small"
+        >
+          删除
+        </el-button>
+      </div>
+      <div>
+        <el-select v-model="form.select" size="small" placeholder="请选择">
+          <el-option
+            v-for="item in options"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          >
+          </el-option>
+        </el-select>
+        <el-input
+          v-model="form.input"
           size="small"
-          :disabled="selectionTableData.length !== 1"
-          @click="onCopy(selectionTableData[0])"
-          >复制</el-button
+          placeholder="请输入内容"
+          :readonly="loading"
         >
-      </div> -->
+          <template #suffix>
+            <i v-show="loading" class="el-input__icon el-icon-loading"></i>
+            <i v-show="!loading" class="el-input__icon el-icon-search"></i>
+          </template>
+        </el-input>
+        <el-button size="small" @click="handleSearch">搜索</el-button>
+        <el-button size="small" @click="handleReset">重置</el-button>
+      </div>
     </el-header>
     <el-main>
       <el-table
         v-loading="loading"
-        stripe
         highlight-current-row
+        height="100%"
         :data="tableData"
+        @row-click="handleCurrentRowSelect"
+        :row-class-name="handleRowClass"
       >
+        <el-table-column type="index" width="50"> </el-table-column>
         <el-table-column
           width="200"
           v-for="column in columns"
@@ -223,31 +244,18 @@ export default {
           :prop="column.prop"
           :label="column.label"
           :show-overflow-tooltip="column.showOverflowTooltip"
-          :formatter="column.formatter"
         >
-        </el-table-column>
-        <el-table-column fixed="right" label="操作" width="300">
           <template slot-scope="scope">
-            <el-button @click.native.prevent="onCopy(scope.row)" size="small">
-              复制
-            </el-button>
-            <el-button @click.native.prevent="onEdit(scope.row)" size="small">
-              修改
-            </el-button>
-            <el-button @click.native.prevent="onAuth(scope.row)" size="small">
-              授权
-            </el-button>
-            <el-button @click.native.prevent="onDelete(scope.row)" size="small">
-              删除
-            </el-button>
+            <span v-if="column.formatter">{{ formatter(scope) }}</span>
+            <span v-else>{{ scope.row[column.prop] }}</span>
           </template>
         </el-table-column>
       </el-table>
     </el-main>
     <el-footer>
       <el-pagination
-        @size-change="onSizeChnage"
-        @current-change="onCurrentChange"
+        @size-change="handleSize"
+        @current-change="handleCurrent"
         :current-page="page.pageNum"
         :page-sizes="[25, 50, 100]"
         :page-size="page.pageSize"
@@ -260,34 +268,29 @@ export default {
 </template>
 
 <style scoped>
-.table-template-table .el-header {
-  height: fit-content !important;
-  padding-top: var(--padding);
-  padding-bottom: var(--padding);
+.table-template .el-header {
   border-bottom: 1px solid #dcdfe6;
-}
-.table-template-table .table-header-top {
-  margin-bottom: var(--margin);
   display: flex;
   justify-content: space-between;
   align-items: center;
 }
-.table-template-table .table-header-top .el-select {
+
+.table-template .el-header .el-select {
   width: 150px;
   margin-right: var(--margin);
 }
-.table-template-table .table-header-top .el-input {
+.table-template .el-header .el-input {
   width: 250px;
   margin-right: var(--margin);
 }
-.table-template-table .el-main {
+.table-template .el-main {
   padding: 0;
 }
-.table-template-table .el-main .el-table {
+.table-template .el-main .el-table {
   width: 100%;
   height: 100%;
 }
-.table-template-table .el-footer {
+.table-template .el-footer {
   display: flex;
   justify-content: end;
   align-items: center;

+ 2 - 2
vue.config.js

@@ -37,8 +37,8 @@ module.exports = {
       // detail: https://cli.vuejs.org/config/#devserver-proxy
       [process.env.VUE_APP_BASE_API]: {
         // target: `http://172.16.100.107:8080/drp-admin`, //测试
-        target: `http://test-sy.derom.com/drp-admin`, //测试
-        // target: `http://sy.derom.com/drp-admin`, //生产
+        // target: `http://test-sy.derom.com/drp-admin`, //测试
+        target: `http://sy.derom.com/drp-admin`, //生产
         // target: `http://172.16.63.202:8000/drp-admin`, // D本地
         // target: `http://172.16.62.241:8000/drp-admin`, //笑寒本地
         // target: `http://172.16.13.152:8000/drp-admin`, //豪哥本地