Browse Source

Merge branch 'master' of http://face3d.4dage.com:7005/chenzhiguang/guangdongVR_museum

任一存 2 năm trước cách đây
mục cha
commit
8bf7e645f6

+ 27 - 0
backstage/package-lock.json

@@ -14,6 +14,7 @@
         "js-base64": "^3.6.1",
         "sortablejs": "^1.15.0",
         "vue": "^2.6.11",
+        "vue-json-excel": "^0.3.0",
         "vue-router": "^3.2.0",
         "vuedraggable": "^2.24.3",
         "vuex": "^3.6.2"
@@ -5640,6 +5641,11 @@
       "integrity": "sha1-P7rwIL/XlIhAcuomsel5HUWmKfA=",
       "dev": true
     },
+    "node_modules/downloadjs": {
+      "version": "1.4.7",
+      "resolved": "https://registry.npmmirror.com/downloadjs/-/downloadjs-1.4.7.tgz",
+      "integrity": "sha512-LN1gO7+u9xjU5oEScGFKvXhYf7Y/empUIIEAGBs1LzUq/rg5duiDrkuH5A2lQGd5jfMOb9X9usDa2oVXwJ0U/Q=="
+    },
     "node_modules/duplexer": {
       "version": "0.1.2",
       "resolved": "https://registry.npm.taobao.org/duplexer/download/duplexer-0.1.2.tgz",
@@ -13606,6 +13612,14 @@
       "integrity": "sha1-UylVzB6yCKPZkLOp+acFdGV+CPI=",
       "dev": true
     },
+    "node_modules/vue-json-excel": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmmirror.com/vue-json-excel/-/vue-json-excel-0.3.0.tgz",
+      "integrity": "sha512-FrSh0tVUpw4K+ilLO8g0Qp52eFJw/hkk3rZPTEKo9qVkJgVfQtZwzj3UWc5ACYxA3jLk9HtjK+f9xKHCN4Kgag==",
+      "dependencies": {
+        "downloadjs": "^1.4.7"
+      }
+    },
     "node_modules/vue-loader": {
       "version": "15.9.7",
       "resolved": "https://registry.nlark.com/vue-loader/download/vue-loader-15.9.7.tgz",
@@ -19386,6 +19400,11 @@
       "integrity": "sha1-P7rwIL/XlIhAcuomsel5HUWmKfA=",
       "dev": true
     },
+    "downloadjs": {
+      "version": "1.4.7",
+      "resolved": "https://registry.npmmirror.com/downloadjs/-/downloadjs-1.4.7.tgz",
+      "integrity": "sha512-LN1gO7+u9xjU5oEScGFKvXhYf7Y/empUIIEAGBs1LzUq/rg5duiDrkuH5A2lQGd5jfMOb9X9usDa2oVXwJ0U/Q=="
+    },
     "duplexer": {
       "version": "0.1.2",
       "resolved": "https://registry.npm.taobao.org/duplexer/download/duplexer-0.1.2.tgz",
@@ -26029,6 +26048,14 @@
       "integrity": "sha1-UylVzB6yCKPZkLOp+acFdGV+CPI=",
       "dev": true
     },
+    "vue-json-excel": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmmirror.com/vue-json-excel/-/vue-json-excel-0.3.0.tgz",
+      "integrity": "sha512-FrSh0tVUpw4K+ilLO8g0Qp52eFJw/hkk3rZPTEKo9qVkJgVfQtZwzj3UWc5ACYxA3jLk9HtjK+f9xKHCN4Kgag==",
+      "requires": {
+        "downloadjs": "^1.4.7"
+      }
+    },
     "vue-loader": {
       "version": "15.9.7",
       "resolved": "https://registry.nlark.com/vue-loader/download/vue-loader-15.9.7.tgz",

+ 1 - 0
backstage/package.json

@@ -16,6 +16,7 @@
     "vue": "^2.6.11",
     "vue-router": "^3.2.0",
     "vuedraggable": "^2.24.3",
+    "vue-json-excel": "^0.3.0",
     "vuex": "^3.6.2"
   },
   "devDependencies": {

BIN
backstage/public/favicon.ico


+ 1 - 1
backstage/public/index.html

@@ -4,7 +4,7 @@
     <meta charset="utf-8">
     <meta http-equiv="X-UA-Compatible" content="IE=edge">
     <meta name="viewport" content="width=device-width,initial-scale=1.0">
-    <link rel="icon" href="<%= BASE_URL %>favicon.png">
+    <link rel="icon" href="./favicon.ico">
     <title>广东省博物馆</title>
   </head>
   <body>

+ 199 - 0
backstage/src/assets/styles/reset.css

@@ -0,0 +1,199 @@
+html,
+body,
+div,
+span,
+applet,
+object,
+iframe,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+p,
+blockquote,
+pre,
+a,
+abbr,
+acronym,
+address,
+big,
+cite,
+code,
+del,
+dfn,
+em,
+img,
+ins,
+kbd,
+q,
+s,
+samp,
+small,
+strike,
+strong,
+sub,
+sup,
+tt,
+var,
+b,
+u,
+i,
+center,
+dl,
+dt,
+dd,
+ol,
+ul,
+li,
+fieldset,
+form,
+label,
+legend,
+table,
+caption,
+tbody,
+tfoot,
+thead,
+tr,
+th,
+td,
+article,
+aside,
+canvas,
+details,
+embed,
+figure,
+figcaption,
+footer,
+header,
+hgroup,
+menu,
+nav,
+output,
+ruby,
+section,
+summary,
+time,
+mark,
+audio,
+video {
+  font-family: "Microsoft YaHei", "Microsoft JhengHei";
+  margin: 0;
+  padding: 0;
+  border: 0;
+  font-size: 100%;
+  vertical-align: baseline;
+}
+* {
+  box-sizing: border-box;
+}
+/* HTML5 display-role reset for older browsers */
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+menu,
+nav,
+section,
+main {
+  display: block;
+}
+html {
+  height: 100%;
+}
+body {
+  line-height: 1;
+  height: 100%;
+}
+html,
+body {
+  font-size: 16px;
+}
+ol,
+ul {
+  list-style: none;
+}
+blockquote,
+q {
+  quotes: none;
+}
+blockquote:before,
+blockquote:after,
+q:before,
+q:after {
+  content: '';
+  content: none;
+}
+table {
+  border-collapse: collapse;
+  border-spacing: 0;
+}
+button {
+  outline: none;
+  border: none;
+}
+input,
+button,
+select,
+textarea {
+  outline: none;
+  appearance: none;
+  -webkit-appearance: none;
+  border-radius: 0;
+  -webkit-appearance: textfield;
+  background-color: white;
+  -webkit-rtl-ordering: logical;
+  cursor: text;
+  padding: 1px;
+  border-color: initial;
+  border-image: initial;
+}
+input::-webkit-outer-spin-button,
+input::-webkit-inner-spin-button {
+  -webkit-appearance: textfield;
+}
+input[type="number"] {
+  -moz-appearance: textfield;
+}
+input:focus {
+  outline: none;
+}
+select::-ms-expand {
+  display: none;
+}
+::-webkit-scrollbar-track-piece {
+  background-color: #ffffff;
+}
+::-webkit-scrollbar {
+  width: 8px;
+  height: 13px;
+}
+::-webkit-scrollbar-thumb {
+  background-color: #e5e5e5;
+  background-clip: padding-box;
+  min-height: 20px;
+  border-radius: 3px;
+}
+::-webkit-scrollbar-thumb:hover {
+  background-color: #929292;
+}
+table th,
+table td {
+  text-align: center !important;
+}
+table th > .cell {
+  color: #000;
+}
+textarea {
+  height: 8rem!important;
+}
+.disabledAc {
+  color: #ccc !important;
+  pointer-events: none !important;
+}

+ 4 - 0
backstage/src/assets/styles/reset.less

@@ -106,4 +106,8 @@ table th > .cell{
 
 textarea{
   height: 8rem!important;
+}
+.disabledAc{
+	color: #ccc !important;
+	pointer-events: none !important;
 }

+ 3 - 0
backstage/src/components/focus-bang/index.vue

@@ -65,6 +65,9 @@ export default {
 }
 
 .card-layout{
+  max-height: 300px;
+  overflow-y: auto;
+  flex-wrap: wrap;
   display: flex;
   justify-content: space-between;
 }

+ 22 - 16
backstage/src/components/power-bar/index.vue

@@ -2,10 +2,13 @@
   <div class="power-layout">
     <p>各展馆访问量</p>
     <ul>
-      <li v-for="(item,i) in data.list" :key="i">
-        <span>{{item.name}}:</span>
-        <div :style="{width:`${ item.visit / data.all * 100}%`}" class="bar"></div>
-        <div class="visit">{{item.visit}}</div>
+      <li v-for="(item, i) in data.list" :key="i">
+        <span :title="item.name">{{ item.name }}</span>:
+        <div
+          :style="{ width: `${(item.visit / data.all) * 100}%` }"
+          class="bar"
+        ></div>
+        <div class="visit">{{ item.visit }}</div>
       </li>
     </ul>
   </div>
@@ -13,13 +16,13 @@
 
 <script>
 export default {
-  props: ['data'],
+  props: ["data"],
   data() {
     return {
-      sum: 25
-    }
-  }
-}
+      sum: 25,
+    };
+  },
+};
 </script>
 
 <style lang="less" scoped>
@@ -27,23 +30,27 @@ export default {
   padding: 20px;
   height: 100%;
 
-  >p {
+  > p {
     margin-bottom: 20px;
   }
 
-  >ul {
+  > ul {
     height: 86%;
     overflow-y: auto;
     width: 100%;
 
-    >li {
+    > li {
       display: flex;
       margin-bottom: 20px;
       align-items: center;
 
-      >span {
-        display: inline-block;
+      > span {
+        cursor: pointer;
+        width: 100px;
+        overflow: hidden;
+        text-overflow: ellipsis;
         white-space: nowrap;
+        display: inline-block;
       }
 
       .bar {
@@ -52,11 +59,10 @@ export default {
         background: #01a7f0;
       }
 
-      .visit{
+      .visit {
         margin-left: 10px;
       }
     }
-
   }
 }
 </style>

+ 2 - 8
backstage/src/components/table/index.vue

@@ -82,9 +82,10 @@
 </template>
 
 <script>
-import { handleDisplay, handleDisable,goodsSort } from "@/configue/api";
+import { handleDisplay, handleDisable } from "@/configue/api";
 import { mapGetters } from "vuex";
 export default {
+  name:'Table',
   props: {
     data: {
       type: Array,
@@ -162,13 +163,6 @@ export default {
     },
     handleSizeChange(data) {
       this.$emit("pagesizechange", data);
-    },
-    goodsSort(data){
-      goodsSort({
-        ...data
-      },()=>{
-
-      })
     }
   },
   mounted() {

+ 4 - 3
backstage/src/components/ww-card/index.vue

@@ -20,16 +20,17 @@ export default {
   position: relative;
   overflow: hidden;
   padding: 1rem;
+  margin-bottom: 25px;
 }
 
 .ww-layout .img{
   position: absolute;
-  right: 0;
+  left: 150px;
   top: 0;
   width: 240px;
   height: 240px;
   background-position: center;
-  background-size: auto 100%;
+  background-size: cover;
   background-repeat: no-repeat;
 }
 
@@ -47,7 +48,7 @@ export default {
 }
 
 p{
-  margin-bottom: 12px;
+  margin-bottom: 22px;
 }
 
 </style>

+ 2 - 1
backstage/src/configue/http.js

@@ -8,7 +8,8 @@ const vue = new Vue();
 var isProduction = process.env.NODE_ENV === "production";
 let loading = "";
 
-const serverName = isProduction ? "/api/" : "http://192.168.20.55:8035/api/";
+// const serverName = isProduction ? "/api/" : "http://192.168.20.55:8035/api/";
+const serverName = isProduction ? "/api/" : "https://gdbwg.4dage.com/api/";
 
 const serverLocation = window.location.hostname;
 

+ 4 - 0
backstage/src/main.js

@@ -2,6 +2,10 @@ import Vue from 'vue'
 import App from './App.vue'
 import router from './router'
 
+// 表格导出
+import JsonExcel from 'vue-json-excel'
+Vue.component('downloadExcel', JsonExcel)
+
 import ElementUI from 'element-ui';
 import 'element-ui/lib/theme-chalk/index.css';
 import '../theme/index.css'

+ 1 - 1
backstage/src/pages/content/collection/componets/img.vue

@@ -5,7 +5,7 @@
     </el-form-item>
 
     <el-form-item label="藏品类型:">
-      <el-radio disabled v-model="radio" label="选中且禁用">专题图库</el-radio>
+      <el-radio v-model="radio" label="选中且禁用">专题图库</el-radio>
     </el-form-item>
 
     <el-form-item label="藏品年代:">

+ 1 - 1
backstage/src/pages/content/collection/index.vue

@@ -34,7 +34,7 @@
             <el-table-column slot="operate" label="操作" width="190">
               <template slot-scope="scope">
                 <span class="o-span" @click="goto(scope.row)">编辑</span>
-                <span class="o-delete" @click="del({item:scope.row,type:'goods'})">删除</span>
+                <span class="o-delete" :class="{disabledAc:scope.row.display}" @click="del({item:scope.row,type:'goods'})">删除</span>
               </template>
             </el-table-column>
           </vtable>

+ 1 - 0
backstage/src/pages/content/scene/componets/detail.vue

@@ -21,6 +21,7 @@
             style="width:100%;"
             size="large"
             format="yyyy 年 MM 月 dd 日 HH:mm:ss"
+            value-format='yyyy-MM-dd HH:mm:ss'
            :picker-options="pickerOptions" range-separator="-"
             start-placeholder="开始日期" end-placeholder="结束日期" v-model="form.opening" align="center">
           </el-date-picker>

+ 1 - 1
backstage/src/pages/content/scene/data.js

@@ -21,7 +21,7 @@ let raw = {
       label: "状态",
     },
     {
-      prop: "name",
+      prop: "myTime",
       label: "展览时间",
     },
 

+ 1 - 0
backstage/src/pages/content/scene/edit.vue

@@ -16,6 +16,7 @@ import { formKey, rules } from "./data";
 import { save, getDetail } from "@/configue/api";
 
 export default {
+  name:'Edit',
   components: {
     vdetail
   },

+ 53 - 49
backstage/src/pages/content/scene/index.vue

@@ -1,8 +1,8 @@
 <template>
   <div>
     <main-top>
-      <div slot='con'>
-        <el-button @click="goto({ id: 'none'})" type="primary">新增</el-button>
+      <div slot="con">
+        <el-button @click="goto({ id: 'none' })" type="primary">新增</el-button>
       </div>
     </main-top>
     <div class="tablecon noSubmune">
@@ -21,10 +21,10 @@
             <el-button @click="getList" type="primary">查询</el-button>
             <el-button
               @click="
-                search = {
+                (search = {
                   inputKey: '',
-                },
-                getList()
+                }),
+                  getList()
               "
               >重置</el-button
             >
@@ -50,21 +50,25 @@
           >
             <el-table-column slot="operate" label="操作" width="190">
               <template slot-scope="scope">
-
                 <el-upload
-                  style="display: inline-block;"
+                  style="display: inline-block"
                   :action="uploadUrl"
                   :headers="{ token }"
-                  :data="{type:'zip',id:scope.row.id}"
+                  :data="{ type: 'zip', id: scope.row.id }"
                   :show-file-list="false"
                   :on-success="handleThumbSuccess"
                   :on-error="handleError"
                   :before-upload="beforeAvatarUpload"
-                  >
+                >
                   <span class="o-span">上传</span>
                 </el-upload>
-                <span class="o-span"  @click="goto(scope.row)">编辑</span>
-                <span class="o-delete" @click="del({item:scope.row,type:'scene'})">删除</span>
+                <span class="o-span" @click="goto(scope.row)">编辑</span>
+                <span
+                  class="o-delete"
+                  :class="{ disabledAc: scope.row.display }"
+                  @click="del({ item: scope.row, type: 'exhibition' })"
+                  >删除</span
+                >
               </template>
             </el-table-column>
           </vtable>
@@ -83,13 +87,14 @@ import { raw } from "./data";
 import { mapGetters } from "vuex";
 
 export default {
+  name: "Scene",
   data() {
     return {
-      token:window.localStorage.getItem('token'),
+      token: window.localStorage.getItem("token"),
       uploadUrl: this.$serverName + "cms/exhibition/upload",
       search: {
         inputKey: "",
-        date: ""
+        date: "",
       },
       list: {},
       page: {
@@ -104,40 +109,37 @@ export default {
     vtable,
   },
   methods: {
-    
-    showLoading(){
-      this.loading = this.$loading(this.loadOption)
+    showLoading() {
+      this.loading = this.$loading(this.loadOption);
     },
-    beforeAvatarUpload(file){
-      this.currentIdx = 0
+    beforeAvatarUpload(file) {
+      this.currentIdx = 0;
       let type = this.isZip(file.name);
       if (!type) {
-        this.$message.error('只允许上传zip包');
-        return type
+        this.$message.error("只允许上传zip包");
+        return type;
       }
-      const isLt2G = file.size / 1024 / 1024 / 1024 <  2;
+      const isLt2G = file.size / 1024 / 1024 / 1024 < 2;
       if (!isLt2G) {
         this.$message.error("上传图片大小不能超过 2GB!");
         return isLt2G;
       }
-      this.showLoading()
+      this.showLoading();
     },
-    handleError(){
+    handleError() {
       this.$alert("上传失败,请稍后再试", "提示", {
         confirmButtonText: "确定",
         callback: () => {
-          this.loading.close()
+          this.loading.close();
         },
       });
     },
-    handleThumbSuccess(res){
-      this.loading.close()
+    handleThumbSuccess(res) {
+      this.loading.close();
       let { data } = res;
-      this.$emit('update',data.filePath)
-    },
-    uploadZip(){
-
+      this.$emit("update", data.filePath);
     },
+    uploadZip() {},
     getList() {
       let { inputKey } = this.search;
       this.$http({
@@ -150,43 +152,45 @@ export default {
         url: `cms/exhibition/list`,
       }).then((res) => {
         this.list = res.data;
+        this.list.records.forEach((v) => {
+          if (v.timeStart && v.timeEnd) v.myTime = v.timeStart + ' 至 ' +v.timeEnd;
+          else v.myTime = "-";
+        });
       });
     },
-    openLink(item){
+    openLink(item) {
       window.open(`/panorama/edit.html?id=${item.id}`, "_blank");
     },
-
   },
   computed: {
     ...mapGetters({
       activeMenu: "activeMenu",
-      activeSub:"activeSub"
+      activeSub: "activeSub",
     }),
     subMenu() {
-      return 'exhibition';
+      return "exhibition";
     },
     data() {
       return raw["scene"];
     },
   },
   watch: {
-    subMenu:{
-      deep:true,
-      immediate:true,
-      handler:function () {
-        this.getAuth(this.activeMenu,'场景')
+    subMenu: {
+      deep: true,
+      immediate: true,
+      handler: function () {
+        this.getAuth(this.activeMenu, "场景");
         this.getList();
-      }
+      },
+    },
+    activeMenu: {
+      deep: true,
+      immediate: true,
+      handler: function (newVal) {
+        this.getAuth(newVal, "场景");
+      },
     },
-    activeMenu:{
-      deep:true,
-      immediate:true,
-      handler:function (newVal) {
-        this.getAuth(newVal,'场景')
-      }
-    }
-  },
-  mounted() {
   },
+  mounted() {},
 };
 </script>

+ 2 - 1
backstage/src/pages/system/dict/data.js

@@ -15,10 +15,11 @@ let raw = {
     {
       prop: "sort",
       label: "排序号",
+      default:'0'
     },
     {
       prop: "display",
-      label: "状态",
+      label: "是否显示",
     },
     {
       prop: "createTime",

+ 44 - 44
backstage/src/pages/system/dict/index.vue

@@ -1,8 +1,8 @@
 <template>
   <div>
     <main-top>
-      <div slot='con'>
-        <el-button @click="goto({ id: 'none'})" type="primary">新增</el-button>
+      <div slot="con">
+        <el-button @click="goto({ id: 'none' })" type="primary">新增</el-button>
       </div>
     </main-top>
     <div class="tablecon noSubmune">
@@ -21,10 +21,10 @@
             <el-button @click="getList" type="primary">查询</el-button>
             <el-button
               @click="
-                search = {
+                (search = {
                   inputKey: '',
-                },
-                getList()
+                }),
+                  getList()
               "
               >重置</el-button
             >
@@ -50,8 +50,13 @@
           >
             <el-table-column slot="operate" label="操作" width="190">
               <template slot-scope="scope">
-                <span class="o-span"  @click="goto(scope.row)">编辑</span>
-                <span class="o-delete" @click="del({item:scope.row,type:'dict'})">删除</span>
+                <span class="o-span" @click="goto(scope.row)">编辑</span>
+                <span
+                  class="o-delete"
+                  :class="{ disabledAc: scope.row.display }"
+                  @click="del({ item: scope.row, type: 'dict' })"
+                  >删除</span
+                >
               </template>
             </el-table-column>
           </vtable>
@@ -74,7 +79,7 @@ export default {
     return {
       search: {
         inputKey: "",
-        date: ""
+        date: "",
       },
       list: {},
       page: {
@@ -89,40 +94,37 @@ export default {
     vtable,
   },
   methods: {
-    
-    showLoading(){
-      this.loading = this.$loading(this.loadOption)
+    showLoading() {
+      this.loading = this.$loading(this.loadOption);
     },
-    beforeAvatarUpload(file){
-      this.currentIdx = 0
+    beforeAvatarUpload(file) {
+      this.currentIdx = 0;
       let type = this.isZip(file.name);
       if (!type) {
-        this.$message.error('只允许上传zip宝');
-        return type
+        this.$message.error("只允许上传zip宝");
+        return type;
       }
-      const isLt2G = file.size / 1024 / 1024 / 1024 <  2;
+      const isLt2G = file.size / 1024 / 1024 / 1024 < 2;
       if (!isLt2G) {
         this.$message.error("上传图片大小不能超过 2GB!");
         return isLt2G;
       }
-      this.showLoading()
+      this.showLoading();
     },
-    handleError(){
+    handleError() {
       this.$alert("上传失败,请稍后再试", "提示", {
         confirmButtonText: "确定",
         callback: () => {
-          this.loading.close()
+          this.loading.close();
         },
       });
     },
-    handleThumbSuccess(res){
-      this.loading.close()
+    handleThumbSuccess(res) {
+      this.loading.close();
       let { data } = res;
-      this.$emit('update',data.filePath)
-    },
-    uploadZip(){
-
+      this.$emit("update", data.filePath);
     },
+    uploadZip() {},
     getList() {
       let { inputKey } = this.search;
       this.$http({
@@ -137,41 +139,39 @@ export default {
         this.list = res.data;
       });
     },
-    openLink(item){
+    openLink(item) {
       window.open(`/panorama/edit.html?id=${item.id}`, "_blank");
     },
-
   },
   computed: {
     ...mapGetters({
       activeMenu: "activeMenu",
-      activeSub:"activeSub"
+      activeSub: "activeSub",
     }),
     subMenu() {
-      return 'dict';
+      return "dict";
     },
     data() {
       return raw["scene"];
     },
   },
   watch: {
-    subMenu:{
-      deep:true,
-      immediate:true,
-      handler:function () {
-        this.getAuth(this.activeMenu,'场景')
+    subMenu: {
+      deep: true,
+      immediate: true,
+      handler: function () {
+        this.getAuth(this.activeMenu, "场景");
         this.getList();
-      }
+      },
+    },
+    activeMenu: {
+      deep: true,
+      immediate: true,
+      handler: function (newVal) {
+        this.getAuth(newVal, "场景");
+      },
     },
-    activeMenu:{
-      deep:true,
-      immediate:true,
-      handler:function (newVal) {
-        this.getAuth(newVal,'场景')
-      }
-    }
-  },
-  mounted() {
   },
+  mounted() {},
 };
 </script>

+ 1 - 1
backstage/src/pages/system/role/index.vue

@@ -38,7 +38,7 @@
                 <template v-if="scope.row.roleKey!='sys_admin'" >
                   <span class="o-span" @click="gotoEdit(scope.row)">权限设置</span>
                   <span class="o-span" @click="openDilog(scope.row)">编辑</span>
-                  <span class="o-delete" @click="delSys(scope.row)">删除</span>
+                  <span class="o-delete" :class="{disabledAc:scope.row.isEnabled}" @click="delSys(scope.row)">删除</span>
                 </template>
                 <template v-else>-</template>
               </template>

+ 68 - 35
backstage/src/pages/system/statistics/index.vue

@@ -1,7 +1,19 @@
 <template>
   <div>
     <main-top>
-      <div slot="con"></div>
+      <div slot="con">
+        <!-- 导出 -->
+        <download-excel
+          :before-generate="derive"
+          class="export-excel-wrapper"
+          :data="json_data"
+          :fields="json_fields"
+          name="数据统计.xls"
+        >
+          <!-- 上面可以自定义自己的样式,还可以引用其他组件button -->
+          <el-button type="primary">导出</el-button>
+        </download-excel>
+      </div>
     </main-top>
     <div class="tablecon">
       <div class="tablebody">
@@ -10,7 +22,7 @@
             <div>
               <div>
                 <span>累计访问量</span>
-                <p>{{totalVisit}}</p>
+                <p>{{ totalVisit }}</p>
               </div>
               <i class="el-icon-s-data"></i>
             </div>
@@ -18,18 +30,17 @@
             <div>
               <div>
                 <span>今日访问量</span>
-                <p>{{todayVisit}}</p>
+                <p>{{ todayVisit }}</p>
               </div>
               <i class="el-icon-view"></i>
             </div>
           </div>
           <div class="ttr">
-            <PowerBar class="n-i" :data='visitData' />
+            <PowerBar class="n-i" :data="visitData" />
           </div>
         </div>
         <div class="tbottom">
-          <FocusBang v-if="focus.length>0" :data="focus" />
-
+          <FocusBang v-if="focus.length > 0" :data="focus" />
         </div>
       </div>
     </div>
@@ -40,53 +51,77 @@
 import MainTop from "@/components/main-top";
 import { mapGetters } from "vuex";
 import { getReportDetail } from "@/configue/api";
-import PowerBar from '@/components/power-bar'
-
-import FocusBang from '@/components/focus-bang'
+import PowerBar from "@/components/power-bar";
 
+import FocusBang from "@/components/focus-bang";
 
 export default {
+  name: "Derive",
   data() {
     return {
       focus: [],
       todayVisit: 0,
       totalVisit: 0,
-      visitData: { list: [], all: 0 }
-
+      visitData: { list: [], all: 0 },
+      // 关于导出的数据
+      json_fields: {
+        排行名次: "index",
+        展馆名称: "name",
+        访问量: "visit",
+      },
+      json_data: [],
+      json_meta: [
+        [
+          {
+            " key ": " charset ",
+            " value ": " utf- 8 ",
+          },
+        ],
+      ],
     };
   },
   components: {
     MainTop,
     FocusBang,
-    PowerBar
+    PowerBar,
   },
   methods: {
+    // 点击导出
+    async derive() {
+      this.visitData.list.forEach((v, i) => {
+        this.json_data.push({
+          index: i + 1,
+          name: v.name,
+          visit: v.visit,
+        });
+      });
+    },
     getReport() {
-      getReportDetail(data => {
+      getReportDetail((data) => {
         this.focus = data.data.ranking.map((item, i) => {
           return {
             num: i + 1,
             zan: item.visit,
             name: item.exhibitionName,
-            img: item.thumb
-          }
-        })
+            img: item.thumb,
+          };
+        });
 
-        let all = 0
+        let all = 0;
 
         this.visitData.list = data.data.exhibitionVisit.map((item) => {
-          all += item.visit
+          all += item.visit;
           return {
             visit: item.visit,
             name: item.exhibitionName,
-            img: item.thumb
-          }
-        })
-
-        this.visitData.all = all
-        this.todayVisit = data.data.todayVisit
-        this.totalVisit = data.data.totalVisit
-      })
+            img: item.thumb,
+          };
+        });
+
+        this.visitData.all = all;
+        this.todayVisit = data.data.todayVisit;
+        this.totalVisit = data.data.totalVisit;
+      });
     },
   },
   computed: {
@@ -111,7 +146,7 @@ export default {
     },
   },
   mounted() {
-    this.getReport()
+    this.getReport();
   },
 };
 </script>
@@ -138,7 +173,7 @@ export default {
       display: flex;
       justify-content: space-between;
 
-      >div {
+      > div {
         height: 100%;
         width: 49%;
         border-radius: 8px;
@@ -147,28 +182,27 @@ export default {
         display: flex;
         align-items: center;
 
-        >div {
+        > div {
           margin-left: 10%;
           text-align: center;
 
-          >span {
+          > span {
             color: #999;
             font-size: 32px;
-
           }
 
-          >p {
+          > p {
             font-size: 40px;
             margin-top: 20px;
           }
         }
 
-        >i {
+        > i {
           position: absolute;
           top: 50%;
           right: 10%;
           font-size: 60px;
-          color: #B63C25;
+          color: #b63c25;
         }
       }
     }
@@ -179,7 +213,6 @@ export default {
       box-shadow: 0 0 5px rgba(0, 0, 0, 0.5);
       border-radius: 8px;
     }
-
   }
 
   .tbottom {

+ 2 - 1
backstage/src/pages/system/user/index.vue

@@ -76,7 +76,7 @@
               <template slot-scope="scope">
                 <template v-if="scope.row.roleKey!='sys_admin'" >
                   <span class="o-span" @click="gotoEdit(scope.row)">编辑</span>
-                  <span class="o-span" @click="delSys(scope.row)">删除</span>
+                  <span class="o-span" :class="{disabledAc:scope.row.isEnabled}" @click="delSys(scope.row)">删除</span>
                 </template>
                 <template v-else>-</template>
               </template>
@@ -94,6 +94,7 @@ import { getSysList, delSys } from "@/configue/api";
 import { mapGetters } from "vuex";
 
 export default {
+  name:'User',
   data() {
     return {
       search: {

+ 1 - 1
backstage/src/pages/system/worklog/index.vue

@@ -20,7 +20,7 @@
             <span>操作者:</span>
             <el-input
               class="elInput paddingmore"
-              :maxlength="25"
+              :maxlength="20"
               show-word-limit
               @keydown.enter.native="getList"
               v-model="search.inputKey"