Browse Source

手机页面及聚水潭

natasha 4 months ago
parent
commit
c06b3e629c

+ 1 - 0
package.json

@@ -30,6 +30,7 @@
         "normalize.css": "7.0.0",
         "nprogress": "^0.2.0",
         "path-to-regexp": "2.4.0",
+        "qrcode": "^1.5.4",
         "tinymce": "^5.3.1",
         "view-design": "^4.5.0",
         "vue": "^2.7.14",

+ 117 - 105
src/App.vue

@@ -1,128 +1,140 @@
 <template>
-  <div id="app">
+  <div id="app" :style="{ minWidth: isPhone ? '100%' : '' }">
     <router-view />
   </div>
 </template>
 
 <script>
 import { getLogin } from "@/api/ajax";
-import { getToken } from '@/utils/auth'
+import { getToken } from "@/utils/auth";
 export default {
   name: "App",
   data() {
     return {
+      isPhone: false,
     };
   },
   created() {
-    this.fn()
+    this.fn();
+    const regExp = /Android|webOS|iPhone|BlackBerry|IEMobile|Opera Mini/i;
+    this.isPhone = regExp.test(navigator.userAgent) && window.innerWidth < 860;
   },
-  methods:{
+  methods: {
     async fn() {
-        let userInfor = getToken();
-        if (userInfor) {
-            let MethodName = "/OrgServer/DictManager/GetStudyPhaseList";
-            let typeListAll = [{
-                study_phase: -1,
-                study_phase_name: '全部'
-            }]
-            let typeList = []
-            await getLogin(MethodName, {})
-                .then((res) => {
-                    if (res.status === 1) {
-                        typeListAll = typeListAll.concat(res.study_phase_list)
-                        typeList = res.study_phase_list
-                    }
-                })
-                .catch(() => {
-
-                });
-            this.$store.commit('setStudyTypeAll',typeListAll)   
-            this.$store.commit('setStudyType',typeList)
-            let MethodNames = "/OrgServer/DictManager/GetOrgTypeList";
-            let typeListAlls = [{
-                type: -1,
-                type_name: '全部'
-            }]
-            let typeLists = []
-            await getLogin(MethodNames, {})
-                .then((res) => {
-                    if (res.status === 1) {
-                        typeListAlls = typeListAlls.concat(res.type_list)
-                        typeLists = res.type_list
-                    }
-                })
-                .catch(() => {
-
-                });
-            this.$store.commit('setOrgTypeAll',typeListAlls)   
-            this.$store.commit('setOrgType',typeLists)
-            let provinceCityListAll = [{
-                label: '全部',
-                value: '0',
-                leaf: true
-            }]
-            let provinceCityList = []
-            await getLogin('/OrgServer/DictManager/GetAllProvinceCityList', {})
-                .then((res) => {
-                    if (res.status === 1) {
-                        res.province_list.forEach(item => {
-                            let obj = {
-                                label: item.name,
-                                value: item.id,
-                                children: []
-                            }
-                            item.city_list.forEach(items=>{
-                                let objs = {
-                                    label: items.name,
-                                    value: items.id,
-                                    leaf: true
-                                }
-                                obj.children.push(objs)
-                            })
-                            provinceCityList.push(obj)
-                            provinceCityListAll.push(obj)
-                        });
-                    }
-                })
-                .catch(() => {
-
+      let userInfor = getToken();
+      if (userInfor) {
+        let MethodName = "/OrgServer/DictManager/GetStudyPhaseList";
+        let typeListAll = [
+          {
+            study_phase: -1,
+            study_phase_name: "全部",
+          },
+        ];
+        let typeList = [];
+        await getLogin(MethodName, {})
+          .then((res) => {
+            if (res.status === 1) {
+              typeListAll = typeListAll.concat(res.study_phase_list);
+              typeList = res.study_phase_list;
+            }
+          })
+          .catch(() => {});
+        this.$store.commit("setStudyTypeAll", typeListAll);
+        this.$store.commit("setStudyType", typeList);
+        let MethodNames = "/OrgServer/DictManager/GetOrgTypeList";
+        let typeListAlls = [
+          {
+            type: -1,
+            type_name: "全部",
+          },
+        ];
+        let typeLists = [];
+        await getLogin(MethodNames, {})
+          .then((res) => {
+            if (res.status === 1) {
+              typeListAlls = typeListAlls.concat(res.type_list);
+              typeLists = res.type_list;
+            }
+          })
+          .catch(() => {});
+        this.$store.commit("setOrgTypeAll", typeListAlls);
+        this.$store.commit("setOrgType", typeLists);
+        let provinceCityListAll = [
+          {
+            label: "全部",
+            value: "0",
+            leaf: true,
+          },
+        ];
+        let provinceCityList = [];
+        await getLogin("/OrgServer/DictManager/GetAllProvinceCityList", {})
+          .then((res) => {
+            if (res.status === 1) {
+              res.province_list.forEach((item) => {
+                let obj = {
+                  label: item.name,
+                  value: item.id,
+                  children: [],
+                };
+                item.city_list.forEach((items) => {
+                  let objs = {
+                    label: items.name,
+                    value: items.id,
+                    leaf: true,
+                  };
+                  obj.children.push(objs);
                 });
-            this.$store.commit('setProviceCity',provinceCityList)
-            this.$store.commit('setProviceCityAll',provinceCityListAll)
-            let searchStatusList = [{
-                status:-1,
-                status_name:'全部'
-            }]
-            await getLogin('/OrgServer/DictManager/GetSysUserStatusList', {})
-            .then((res) => {
-                if(res.status===1){
-                    searchStatusList = searchStatusList.concat(res.status_list)
-                }
-            })
-            .catch(() => {
-                this.loading = false
-            });
-            this.$store.commit('setSearchStatusList',searchStatusList)
-            await getLogin('/OrgServer/Manager/SysConfigManager/GetSysConfig_Preview', {})
-            .then((res) => {
-                if(res.status===1){
-                    this.$store.commit('setPreviewUrl',res.preview_server_url)
-                }
-            })
-            .catch(() => {
-                this.loading = false
-            });
-        }
-    }         
-  },
-  mounted(){
+                provinceCityList.push(obj);
+                provinceCityListAll.push(obj);
+              });
+            }
+          })
+          .catch(() => {});
+        this.$store.commit("setProviceCity", provinceCityList);
+        this.$store.commit("setProviceCityAll", provinceCityListAll);
+        let searchStatusList = [
+          {
+            status: -1,
+            status_name: "全部",
+          },
+        ];
+        await getLogin("/OrgServer/DictManager/GetSysUserStatusList", {})
+          .then((res) => {
+            if (res.status === 1) {
+              searchStatusList = searchStatusList.concat(res.status_list);
+            }
+          })
+          .catch(() => {
+            this.loading = false;
+          });
+        this.$store.commit("setSearchStatusList", searchStatusList);
+        await getLogin(
+          "/OrgServer/Manager/SysConfigManager/GetSysConfig_Preview",
+          {}
+        )
+          .then((res) => {
+            if (res.status === 1) {
+              this.$store.commit("setPreviewUrl", res.preview_server_url);
+            }
+          })
+          .catch(() => {
+            this.loading = false;
+          });
+      }
+    },
   },
+  mounted() {},
 };
 </script>
 <style lang="scss" scoped>
-#app{
-    background: #F7F8FA;
-    min-width: 1440px;
-    min-height: 100%;
+#app {
+  background: #f7f8fa;
+  min-width: 1440px;
+  min-height: 100%;
+}
+</style>
+<style lang="scss">
+.el-scrollbar .el-scrollbar__bar {
+  opacity: 1 !important;
 }
 </style>

+ 134 - 97
src/components/Header.vue

@@ -1,31 +1,63 @@
 <template>
   <!-- 顶部登录导航 -->
-  <div
-    class="LoginNav"
-  >
-    <div class="logo">
-      <div
-        class="logo-name"
-        @click="cutLoginReg"
-      >
-        二十一世纪英语智慧阅读平台
+  <div class="LoginNav">
+    <template v-if="isPhone">
+      <div class="logo"></div>
+      <div class="userName">
+        <el-dropdown @command="handleChange">
+          <span class="el-dropdown-link">
+            <el-image
+              :src="
+                touxiang
+                  ? touxiang
+                  : userMessage.image_url
+                  ? userMessage.image_url
+                  : require('../assets/avatar.png')
+              "
+              fit="cover"
+              style="width: 24px; height: 24px; margin: 0 8px"
+            >
+            </el-image>
+            <span class="name">{{ userMessage.user_name }}</span
+            ><i class="el-icon-arrow-down el-icon--right"></i>
+          </span>
+          <el-dropdown-menu slot="dropdown">
+            <el-dropdown-item command="logout">退出登录</el-dropdown-item>
+          </el-dropdown-menu>
+        </el-dropdown>
+      </div>
+    </template>
+    <template v-else>
+      <div class="logo">
+        <div class="logo-name" @click="cutLoginReg">
+          二十一世纪英语智慧阅读平台
+        </div>
       </div>
-    </div>
-    <div class="userName">
-      <el-dropdown @command="handleChange">
-        <span class="el-dropdown-link">
+      <div class="userName">
+        <el-dropdown @command="handleChange">
+          <span class="el-dropdown-link">
             <el-image
-                :src="touxiang?touxiang:userMessage.image_url?userMessage.image_url:require('../assets/avatar.png')"
-                fit="cover" style="width:24px;height:24px;margin:0 8px">
+              :src="
+                touxiang
+                  ? touxiang
+                  : userMessage.image_url
+                  ? userMessage.image_url
+                  : require('../assets/avatar.png')
+              "
+              fit="cover"
+              style="width: 24px; height: 24px; margin: 0 8px"
+            >
             </el-image>
-            <span class="name">{{userMessage.user_name}}</span><i class="el-icon-arrow-down el-icon--right"></i>
-        </span>
-        <el-dropdown-menu slot="dropdown">
-            <el-dropdown-item command='personal'>个人中心</el-dropdown-item>
-            <el-dropdown-item command='logout'>退出登录</el-dropdown-item>
-        </el-dropdown-menu>
-      </el-dropdown>
-    </div>
+            <span class="name">{{ userMessage.user_name }}</span
+            ><i class="el-icon-arrow-down el-icon--right"></i>
+          </span>
+          <el-dropdown-menu slot="dropdown">
+            <el-dropdown-item command="personal">个人中心</el-dropdown-item>
+            <el-dropdown-item command="logout">退出登录</el-dropdown-item>
+          </el-dropdown-menu>
+        </el-dropdown>
+      </div>
+    </template>
   </div>
 </template>
 
@@ -34,24 +66,26 @@ import { removeToken } from "@/utils/auth";
 import Cookies from "js-cookie";
 //import { setI18nLang } from "@/utils/i18n";
 import { removeSession } from "@/utils/role";
-import { getToken } from '@/utils/auth'
+import { getToken } from "@/utils/auth";
 export default {
-  components: { },
+  components: {},
   name: "LayoutHeader",
   props: ["touxiang"],
   data() {
     return {
-      userMessage: JSON.parse(getToken())
+      userMessage: JSON.parse(getToken()),
+      isPhone: false,
     };
   },
   watch: {},
-  computed: {
-
-  },
+  computed: {},
   methods: {
     // 切换登录的注册
     cutLoginReg() {
-      window.location.href = window.location.href.substring(0,window.location.href.indexOf('/#/'));
+      window.location.href = window.location.href.substring(
+        0,
+        window.location.href.indexOf("/#/")
+      );
     },
     QuitLogin() {
       removeToken();
@@ -62,30 +96,30 @@ export default {
       Cookies.remove("user_type");
       sessionStorage.removeItem("useragent_root_close");
       this.userMessage = null;
-      window.location.href = window.location.href.substring(0,window.location.href.indexOf('/#/'))+"/#/login";
+      window.location.href =
+        window.location.href.substring(0, window.location.href.indexOf("/#/")) +
+        "/#/login";
     },
-    handleLink(link,type){
-        this.$router.push({
-            path: '/'+link,
-            query: {
-            },
-        }); 
+    handleLink(link, type) {
+      this.$router.push({
+        path: "/" + link,
+        query: {},
+      });
     },
-    handleChange(com){
-        if(com==='personal'){
-            this.handleLink('personal','')
-        }else if(com==='logout'){
-            this.QuitLogin()
-        }
+    handleChange(com) {
+      if (com === "personal") {
+        this.handleLink("personal", "");
+      } else if (com === "logout") {
+        this.QuitLogin();
+      }
     },
-
   },
   created() {
+    const regExp = /Android|webOS|iPhone|BlackBerry|IEMobile|Opera Mini/i;
+    this.isPhone = regExp.test(navigator.userAgent) && window.innerWidth < 860;
   },
-  mounted() {
-  },
-  beforeDestroy() {
-  },
+  mounted() {},
+  beforeDestroy() {},
 };
 </script>
 
@@ -96,8 +130,8 @@ export default {
   align-items: center;
   justify-content: space-between;
   box-sizing: border-box;
-  background: #FFFFFF;
-  border-bottom: 1px solid #F5F5F5;
+  background: #ffffff;
+  border-bottom: 1px solid #f5f5f5;
   z-index: 999;
   padding: 0 24px;
   position: fixed;
@@ -122,33 +156,33 @@ export default {
       cursor: pointer;
       display: flex;
       align-items: center;
-    //   background: #242424;
-    //   border-radius: 40px;
+      //   background: #242424;
+      //   border-radius: 40px;
       padding: 0 8px;
       height: 40px;
       margin-left: 16px;
       color: #000;
-      &.login{
-        color: #FFFFFF;
+      &.login {
+        color: #ffffff;
         font-weight: 400;
         font-size: 14px;
         line-height: 22px;
-        a{
-            width: 60px;
-            line-height: 32px;
-            text-align: center;
-            border-radius: 2px;
-            &:hover{
-                background: rgba(255, 255, 255, 0.12);
-                color: rgba(255, 255, 255, 0.9);
-            }
-            &:focus{
-                background: rgba(255, 255, 255, 0.08);
-                color: rgba(255, 255, 255, 0.7);
-            }
+        a {
+          width: 60px;
+          line-height: 32px;
+          text-align: center;
+          border-radius: 2px;
+          &:hover {
+            background: rgba(255, 255, 255, 0.12);
+            color: rgba(255, 255, 255, 0.9);
+          }
+          &:focus {
+            background: rgba(255, 255, 255, 0.08);
+            color: rgba(255, 255, 255, 0.7);
+          }
         }
-        :first-child{
-            margin-right: 6px;
+        :first-child {
+          margin-right: 6px;
         }
       }
       img {
@@ -161,28 +195,28 @@ export default {
         // font-family: Harmony;
         margin-left: 8px;
       }
-    //   &:last-child {
-    //     border-radius: 20px;
-    //     width: 40px;
-    //     padding: 0 12px;
-    //   }
+      //   &:last-child {
+      //     border-radius: 20px;
+      //     width: 40px;
+      //     padding: 0 12px;
+      //   }
     }
   }
-  .el-dropdown{
+  .el-dropdown {
     color: #000000;
-    .el-dropdown-link{
-        display: flex;
-        align-items: center;
+    .el-dropdown-link {
+      display: flex;
+      align-items: center;
     }
-    .avatar{
-        width: 24px;
-        height: 24px;
-        border-radius: 2px;
-        margin: 0 8px;
+    .avatar {
+      width: 24px;
+      height: 24px;
+      border-radius: 2px;
+      margin: 0 8px;
     }
-    .name{
-        font-size: 14px;
-        line-height: 22px;
+    .name {
+      font-size: 14px;
+      line-height: 22px;
     }
   }
 }
@@ -233,15 +267,18 @@ export default {
     background: #ff9900;
   }
 }
-.login-dialog{
-   .el-dialog__header,.el-dialog__body{
-        padding: 0;
-    }
-    .el-dialog{
-        border: 1px solid #E5E6EB;
-        box-shadow: 0px 6px 30px 5px rgba(0, 0, 0, 0.05), 0px 16px 24px 2px rgba(0, 0, 0, 0.04), 0px 8px 10px -5px rgba(0, 0, 0, 0.08);
-        border-radius: 4px;
-        overflow: hidden;
-    } 
+.login-dialog {
+  .el-dialog__header,
+  .el-dialog__body {
+    padding: 0;
+  }
+  .el-dialog {
+    border: 1px solid #e5e6eb;
+    box-shadow: 0px 6px 30px 5px rgba(0, 0, 0, 0.05),
+      0px 16px 24px 2px rgba(0, 0, 0, 0.04),
+      0px 8px 10px -5px rgba(0, 0, 0, 0.08);
+    border-radius: 4px;
+    overflow: hidden;
+  }
 }
-</style>
+</style>

+ 131 - 49
src/components/NavMenu.vue

@@ -1,54 +1,63 @@
 <template v-if="menuList && menuList.length > 0">
-  <el-menu
-    :default-active="activeMenuIndex"
-    :unique-opened="true"
-    :router="true"
-    class="nav-menu"
-    @open="handleOpen"
-    @close="handleClose"
-    @select="handleSelect"
-  >
-    <template v-for="(item, index) in menuList">
-      <el-submenu
-        :index="item.index"
-        :key="index"
-        v-if="item.node && item.node.length > 0"
-      >
-        <template slot="title">
-          <svg-icon :icon-class="item.icon"></svg-icon>
-          <span>{{ item.title }}</span>
-        </template>
-        <template v-for="(items, indexs) in item.node">
-          <el-submenu
-            :index="items.index"
-            :key="indexs"
-            v-if="items.node && items.node.length > 0"
-            class="nav-item1"
-          >
-            <span slot="title" class="nav-item4">{{ items.title }}</span>
+  <div :class="[isPhone ? 'nav-menu-box-phone' : 'nav-menu-box']">
+    <svg-icon
+      icon-class="menu"
+      class="nav-menu-btn"
+      @click="showMenu = !showMenu"
+    ></svg-icon>
+    <el-menu
+      :default-active="activeMenuIndex"
+      :unique-opened="true"
+      :router="true"
+      class="nav-menu"
+      :class="[isPhone ? 'nav-menu-phone' : '']"
+      @open="handleOpen"
+      @close="handleClose"
+      @select="handleSelect"
+      v-show="showMenu"
+    >
+      <template v-for="(item, index) in menuList">
+        <el-submenu
+          :index="item.index"
+          :key="index"
+          v-if="item.node && item.node.length > 0"
+        >
+          <template slot="title">
+            <svg-icon :icon-class="item.icon"></svg-icon>
+            <span>{{ item.title }}</span>
+          </template>
+          <template v-for="(items, indexs) in item.node">
+            <el-submenu
+              :index="items.index"
+              :key="indexs"
+              v-if="items.node && items.node.length > 0"
+              class="nav-item1"
+            >
+              <span slot="title" class="nav-item4">{{ items.title }}</span>
+              <el-menu-item
+                :index="itemss.index"
+                :key="indexss"
+                v-for="(itemss, indexss) in items.node"
+                class="nav-item3"
+                >{{ itemss.title }}</el-menu-item
+              >
+            </el-submenu>
             <el-menu-item
-              :index="itemss.index"
-              :key="indexss"
-              v-for="(itemss, indexss) in items.node"
-              class="nav-item3"
-              >{{ itemss.title }}</el-menu-item
+              :index="items.index"
+              :key="indexs"
+              v-else
+              class="nav-item2"
+              >{{ items.title }}</el-menu-item
             >
-          </el-submenu>
-          <el-menu-item
-            :index="items.index"
-            :key="indexs"
-            v-else
-            class="nav-item2"
-            >{{ items.title }}</el-menu-item
-          >
-        </template>
-      </el-submenu>
-      <el-menu-item :index="item.index" v-else :key="index">
-        <svg-icon :icon-class="item.icon"></svg-icon>
-        <span slot="title">{{ item.title }}</span>
-      </el-menu-item>
-    </template>
-  </el-menu>
+          </template>
+        </el-submenu>
+        <el-menu-item :index="item.index" v-else :key="index">
+          <svg-icon :icon-class="item.icon"></svg-icon>
+          <span slot="title">{{ item.title }}</span>
+        </el-menu-item>
+      </template>
+    </el-menu>
+  </div>
 </template>
 
 <script>
@@ -64,6 +73,8 @@ export default {
         getToken() && JSON.parse(getToken())
           ? JSON.parse(getToken()).popedom_code_list
           : [],
+      isPhone: false,
+      showMenu: true,
     };
   },
   watch: {},
@@ -82,10 +93,14 @@ export default {
       window.localStorage.removeItem("pageSizes");
       window.localStorage.removeItem("pageNumbers");
       window.localStorage.removeItem("tabsIndex");
+      if (this.isPhone) {
+        this.showMenu = false;
+      }
     },
     // 处理菜单权限
     handleMenu() {
       this.menuList = [];
+
       let menuList = [
         {
           title: "数据中心",
@@ -243,9 +258,47 @@ export default {
               title: "短信资源",
               index: "SMS_resources",
             },
+            {
+              title: "聚水潭对接配置",
+              index: "jst_setting",
+            },
           ],
         },
       ];
+      if (this.isPhone) {
+        menuList = [
+          {
+            title: "机构管理",
+            icon: "school-line",
+            index: "organize_manage",
+            node: [
+              {
+                title: "全部人员",
+                index: "organize_people_manage",
+                code: 10002,
+              },
+            ],
+          },
+          {
+            title: "财务中心",
+            icon: "money-cny-box-line",
+            index: "finance_manage",
+
+            node: [
+              {
+                title: "退款管理",
+                index: "refund_manage",
+                code: 40003,
+              },
+              // {
+              //   title: "发票管理",
+              //   index: "invoice_manage",
+              //   code: 40004,
+              // },
+            ],
+          },
+        ];
+      }
       menuList.forEach((item) => {
         if (item.showFlag) {
           this.menuList.push(item);
@@ -279,6 +332,11 @@ export default {
     },
   },
   created() {
+    const regExp = /Android|webOS|iPhone|BlackBerry|IEMobile|Opera Mini/i;
+    this.isPhone = regExp.test(navigator.userAgent) && window.innerWidth < 860;
+    if (this.isPhone) {
+      this.showMenu = false;
+    }
     this.handleMenu();
   },
   mounted() {},
@@ -287,7 +345,31 @@ export default {
 </script>
 
 <style lang="scss" scoped>
-.nav-menu {
+.nav-menu-box-phone {
+  position: fixed;
+  left: 0;
+  top: 52px;
+  z-index: 1001;
+  box-shadow: 0 2px 2px rgba(0, 0, 0, 8%);
+  padding: 0;
+}
+.nav-menu-box {
+  background-color: #fff;
+  border-right: solid 1px #e6e6e6;
+}
+:deep .el-menu {
+  border-right: none;
+  width: 100% !important;
+}
+
+.nav-menu-btn {
+  position: fixed;
+  padding: 17px;
+  top: 0;
+  left: 0;
+  z-index: 1000;
+  width: 52px !important;
+  height: 52px !important;
 }
 </style>
 <style lang="scss">

File diff suppressed because it is too large
+ 0 - 0
src/icons/svg/menu.svg


+ 5 - 0
src/router/index.js

@@ -165,6 +165,11 @@ export const constantRoutes = [{
             import ('@/views/system_config/SMSResources.vue')
     },
     {
+        path: '/jst_setting',
+        component: () =>
+            import ('@/views/system_config/JstSetting.vue')
+    },
+    {
         path: '/personal',
         component: () =>
             import ('@/views/personal.vue')

+ 21 - 0
src/styles/index.scss

@@ -83,6 +83,19 @@ div:focus {
             flex: 1;
             padding: 56px 16px 16px;
             overflow: hidden;
+            &-phone{
+              padding-top: 32px;
+              overflow-y: auto;
+              .personal-inner{
+                padding: 15px 10px;
+              }
+              .search-box{
+                padding-top: 12px;
+                .search-item{
+                  margin-bottom: 10px;
+                }
+              }
+            }
         }
     }
     .breadcrumb-box {
@@ -94,6 +107,14 @@ div:focus {
         font-weight: 400;
         font-size: 14px;
         line-height: 22px;
+        &-phone{
+          left: 17px;
+          padding: 5px 0;
+          height: 32px;
+          z-index: 9;
+          background: #f7f8fa;
+          width: 100%;
+        }
         .breadcrumb-item {
             &-pointer {
                 cursor: pointer;

+ 602 - 421
src/views/cdkey_manage/index.vue

@@ -2,192 +2,261 @@
   <div class="manage-root personnel-manage">
     <Header />
     <div class="manage-root-contain">
-        <nav-menu class="manage-root-contain-left" :activeMenuIndex="activeMenuIndex"></nav-menu>
-        <div class="manage-root-contain-right personnel-manage-right">
-            <breadcrumb :breadcrumbList="breadcrumbList" class="breadcrumb-box"></breadcrumb>
-            <div class="personal-inner">
-                <div class="common-title-box">
-                    <h3>兑换码列表</h3>
-                    <div class="btn-box">
-                        <el-button type="primary" size="small" @click="createCdkey(1)">批量创建</el-button>
-                        <el-button type="primary" size="small" @click="createCdkey(0)">创建兑换码</el-button>
-                    </div>
-                </div>
-                <div class="search-box">
-                    <div class="search-item">
-                        <label>搜索</label>
-                        <el-input
-                            placeholder="输入搜索内容"
-                            v-model="searchInput" maxlength="200">
-                            <i slot="suffix" class="el-input__icon el-icon-search" @click="getList(1)" style="cursor: pointer;"></i>
-                        </el-input>
-                    </div>
-                    <div class="search-item">
-                        <label>状态</label>
-                        <el-select v-model="searchStatus" @change="getList(1)" placeholder="请选择">
-                            <el-option
-                                v-for="item in statusList"
-                                :key="item.value"
-                                :label="item.label"
-                                :value="item.value">
-                            </el-option>
-                        </el-select>
-                    </div>
-                    <div class="search-item">
-                        <label>类型</label>
-                        <el-select v-model="searchType" @change="getList(1)" placeholder="请选择">
-                            <el-option
-                                v-for="item in typeList"
-                                :key="item.value"
-                                :label="item.label"
-                                :value="item.value">
-                            </el-option>
-                        </el-select>
-                    </div>
-                </div>
-                <el-table
-                    class="search-table"
-                    :data="tableData"
-                    style="width: 100%"
-                    @sort-change="handleSort"
-                    :default-sort = dataSort
-                    :max-height="tableHeight"
-                    v-loading="tableLoading">
-                    <el-table-column
-                        type="index"
-                        label="#"
-                        sortable
-                        width="54"
-                        :index="(pageNumber-1)*pageSize+1">
-                    </el-table-column>
-                    <el-table-column
-                        prop="name"
-                        label="兑换码名称"
-                        sortable="custom"
-                        width="163">
-                    </el-table-column>
-                    <el-table-column
-                        prop="code"
-                        label="兑换码"
-                        sortable="custom"
-                        width="170">
-                        <template slot-scope="scope">
-                            {{scope.row.type===0?scope.row.code:'多个'}}
-                        </template>
-                    </el-table-column>
-                    <el-table-column
-                        prop="type"
-                        label="类型"
-                        sortable="custom"
-                        width="92" >
-                        <template slot-scope="scope">
-                            {{scope.row.type===0?'普通兑换码':'批量兑换码'}}
-                        </template>
-                    </el-table-column>
-                    <el-table-column
-                        prop="goods_count"
-                        label="内容数"
-                        min-width="80">
-                    </el-table-column>
-                    <el-table-column
-                        prop="phone"
-                        label="使用情况"
-                        width="96">
-                        <template slot-scope="scope">
-                            {{scope.row.person_count_use+'/'+scope.row.person_count_max}}
-                        </template>
-                    </el-table-column>
-                    <el-table-column
-                        prop="creator_name"
-                        label="创建人"
-                        width="88">
-                    </el-table-column>
-                    <el-table-column
-                        prop="create_time"
-                        label="创建时间"
-                        sortable="custom"
-                        width="164">
-                    </el-table-column>
-                    <el-table-column
-                        prop="end_date"
-                        label="到期日期"
-                        sortable="custom"
-                        width="126" >
-                    </el-table-column>
-                    <el-table-column
-                        prop="valid_status"
-                        label="状态"
-                        width="88" >
-                        <template slot-scope="scope">
-                            <div class="status-box">
-                                <span :style="{background:statusListCss[scope.row.valid_status].bg}"></span>
-                                <b :style="{color:statusListCss[scope.row.valid_status].color}">{{scope.row.valid_status_name}}</b>
-                            </div>
-                        </template>
-                    </el-table-column>
-                    <el-table-column
-                        prop="memo"
-                        label="备注"
-                        width="120">
-                    </el-table-column>
-                    <el-table-column
-                        fixed="right"
-                        label="操作"
-                        width="180">
-                        <template slot-scope="scope">
-                            <el-button
-                                @click.native.prevent="handleEdit(scope.row)"
-                                type="text"
-                                size="small"
-                                class="primary-btn">
-                                查看
-                            </el-button>
-                            <el-button
-                                @click.native.prevent="handleUp(scope.row, scope.$index)"
-                                type="text"
-                                size="small"
-                                class="primary-btn"
-                                v-if="scope.row.valid_status===0">
-                                启用
-                            </el-button>
-                            <el-button
-                                @click.native.prevent="handleUp(scope.row, scope.$index)"
-                                type="text"
-                                size="small"
-                                class="red-btn"
-                                v-else-if="scope.row.valid_status===1">
-                                停用
-                            </el-button>
-                            <el-button
-                                @click.native.prevent="handleRevoca(scope.row)"
-                                type="text"
-                                size="small"
-                                class="primary-btn">
-                                撤回
-                            </el-button>
-                            <el-button
-                                @click.native.prevent="handleDelete(scope.row, scope.$index)"
-                                type="text"
-                                size="small"
-                                class="red-btn">
-                                删除
-                            </el-button>
-                        </template>
-                    </el-table-column>
-                </el-table>
-                <el-pagination
-                    background
-                    @size-change="handleSizeChange"
-                    @current-change="handleCurrentChange"
-                    :current-page="pageNumber"
-                    :page-sizes="[10, 20, 30, 40]"
-                    :page-size="pageSize"
-                    layout="total, prev, pager, next, sizes, jumper"
-                    :total="total_count">
-                </el-pagination>
+      <nav-menu
+        class="manage-root-contain-left"
+        :activeMenuIndex="activeMenuIndex"
+      ></nav-menu>
+      <div class="manage-root-contain-right personnel-manage-right">
+        <breadcrumb
+          :breadcrumbList="breadcrumbList"
+          class="breadcrumb-box"
+        ></breadcrumb>
+        <div class="personal-inner">
+          <div class="common-title-box">
+            <h3>兑换码列表</h3>
+            <div class="btn-box">
+              <el-input
+                placeholder="输入聚水潭内部订单号"
+                v-model="orderNumber"
+                maxlength="200"
+                class="order-input"
+              >
+                <span
+                  slot="suffix"
+                  @click="createDiscountCode"
+                  style="cursor: pointer"
+                  v-loading="btnLoading"
+                  >创建</span
+                >
+              </el-input>
+              <el-button type="primary" size="small" @click="createCdkey(1)"
+                >批量创建</el-button
+              >
+              <el-button type="primary" size="small" @click="createCdkey(0)"
+                >创建兑换码</el-button
+              >
+              <el-button type="primary" size="small" @click="createQRcode"
+                >生成二维码</el-button
+              >
+            </div>
+          </div>
+          <div class="search-box">
+            <div class="search-item">
+              <label>搜索</label>
+              <el-input
+                placeholder="输入搜索内容"
+                v-model="searchInput"
+                maxlength="200"
+              >
+                <i
+                  slot="suffix"
+                  class="el-input__icon el-icon-search"
+                  @click="getList(1)"
+                  style="cursor: pointer"
+                ></i>
+              </el-input>
+            </div>
+            <div class="search-item">
+              <label>状态</label>
+              <el-select
+                v-model="searchStatus"
+                @change="getList(1)"
+                placeholder="请选择"
+              >
+                <el-option
+                  v-for="item in statusList"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
+                >
+                </el-option>
+              </el-select>
+            </div>
+            <div class="search-item">
+              <label>类型</label>
+              <el-select
+                v-model="searchType"
+                @change="getList(1)"
+                placeholder="请选择"
+              >
+                <el-option
+                  v-for="item in typeList"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
+                >
+                </el-option>
+              </el-select>
             </div>
+          </div>
+          <el-table
+            class="search-table"
+            :data="tableData"
+            style="width: 100%"
+            @sort-change="handleSort"
+            :default-sort="dataSort"
+            :max-height="tableHeight"
+            v-loading="tableLoading"
+          >
+            <el-table-column
+              type="index"
+              label="#"
+              sortable
+              width="54"
+              :index="(pageNumber - 1) * pageSize + 1"
+            >
+            </el-table-column>
+            <el-table-column
+              prop="name"
+              label="兑换码名称"
+              sortable="custom"
+              width="163"
+            >
+            </el-table-column>
+            <el-table-column
+              prop="code"
+              label="兑换码"
+              sortable="custom"
+              width="170"
+            >
+              <template slot-scope="scope">
+                {{ scope.row.type === 0 ? scope.row.code : "多个" }}
+              </template>
+            </el-table-column>
+            <el-table-column
+              prop="type"
+              label="类型"
+              sortable="custom"
+              width="92"
+            >
+              <template slot-scope="scope">
+                {{ scope.row.type === 0 ? "普通兑换码" : "批量兑换码" }}
+              </template>
+            </el-table-column>
+            <el-table-column prop="goods_count" label="内容数" min-width="80">
+            </el-table-column>
+            <el-table-column prop="phone" label="使用情况" width="96">
+              <template slot-scope="scope">
+                {{
+                  scope.row.person_count_use + "/" + scope.row.person_count_max
+                }}
+              </template>
+            </el-table-column>
+            <el-table-column prop="creator_name" label="创建人" width="88">
+            </el-table-column>
+            <el-table-column
+              prop="create_time"
+              label="创建时间"
+              sortable="custom"
+              width="164"
+            >
+            </el-table-column>
+            <el-table-column
+              prop="end_date"
+              label="到期日期"
+              sortable="custom"
+              width="126"
+            >
+            </el-table-column>
+            <el-table-column prop="valid_status" label="状态" width="88">
+              <template slot-scope="scope">
+                <div class="status-box">
+                  <span
+                    :style="{
+                      background: statusListCss[scope.row.valid_status].bg,
+                    }"
+                  ></span>
+                  <b
+                    :style="{
+                      color: statusListCss[scope.row.valid_status].color,
+                    }"
+                    >{{ scope.row.valid_status_name }}</b
+                  >
+                </div>
+              </template>
+            </el-table-column>
+            <el-table-column prop="memo" label="备注" width="120">
+            </el-table-column>
+            <el-table-column fixed="right" label="操作" width="180">
+              <template slot-scope="scope">
+                <el-button
+                  @click.native.prevent="handleEdit(scope.row)"
+                  type="text"
+                  size="small"
+                  class="primary-btn"
+                >
+                  查看
+                </el-button>
+                <el-button
+                  @click.native.prevent="handleUp(scope.row, scope.$index)"
+                  type="text"
+                  size="small"
+                  class="primary-btn"
+                  v-if="scope.row.valid_status === 0"
+                >
+                  启用
+                </el-button>
+                <el-button
+                  @click.native.prevent="handleUp(scope.row, scope.$index)"
+                  type="text"
+                  size="small"
+                  class="red-btn"
+                  v-else-if="scope.row.valid_status === 1"
+                >
+                  停用
+                </el-button>
+                <el-button
+                  @click.native.prevent="handleRevoca(scope.row)"
+                  type="text"
+                  size="small"
+                  class="primary-btn"
+                >
+                  撤回
+                </el-button>
+                <el-button
+                  @click.native.prevent="handleDelete(scope.row, scope.$index)"
+                  type="text"
+                  size="small"
+                  class="red-btn"
+                >
+                  删除
+                </el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+          <el-pagination
+            background
+            @size-change="handleSizeChange"
+            @current-change="handleCurrentChange"
+            :current-page="pageNumber"
+            :page-sizes="[10, 20, 30, 40]"
+            :page-size="pageSize"
+            layout="total, prev, pager, next, sizes, jumper"
+            :total="total_count"
+          >
+          </el-pagination>
         </div>
+      </div>
     </div>
+    <el-dialog title="兑换二维码" :visible.sync="dialogVisible" width="500px">
+      <canvas
+        id="QRCode_header"
+        style="
+          width: 338px;
+          height: 338px;
+          cursor: pointer;
+          margin: 0 auto;
+          display: block;
+        "
+        @click="createQRcode"
+        v-loading="codeloading"
+      ></canvas>
+      <span slot="footer" class="dialog-footer">
+        <el-button size="small" type="primary" @click="dialogVisible = false"
+          >确 定</el-button
+        >
+      </span>
+    </el-dialog>
   </div>
 </template>
 
@@ -195,9 +264,10 @@
 //这里可以导入其它文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)
 //例如:import 《组件名称》from ‘《组件路径》';
 import Header from "../../components/Header.vue";
-import NavMenu from "../../components/NavMenu.vue"
-import Breadcrumb from '../../components/Breadcrumb.vue';
+import NavMenu from "../../components/NavMenu.vue";
+import Breadcrumb from "../../components/Breadcrumb.vue";
 import { getLogin } from "@/api/ajax";
+import QRCode from "qrcode";
 
 export default {
   //import引入的组件需要注入到对象中才能使用
@@ -206,224 +276,248 @@ export default {
   data() {
     //这里存放数据
     return {
-        activeMenuIndex: "cdkey_manage",
-        breadcrumbList:[
-            {
-                icon:'barcode-line',
-                url:'',
-                text:''
-            },
-            {
-                icon:'',
-                url:'',
-                text:'兑换码管理'
-            }
-        ],
-        searchInput: '',
-        searchType: -1,
-        searchStatus: -1,
-        typeList:[
-            {
-                value:-1,
-                label:'全部'
-            },
-            {
-                value:0,
-                label:'普通兑换码'
-            },
-            {
-                value:1,
-                label:'批量兑换码'
-            }
-        ],
-        statusList:[
-            {
-                label: '全部',
-                value: -1
-            },
-            {
-                label: '使用中',
-                value: 1
-            },
-            {
-                label: '已停用',
-                value: 0
-            },
-            {
-                label: '已到期',
-                value: 2
-            }
-        ],
-        statusListCss:{
-            1:{
-                text:'使用中',
-                bg:'#165DFF',
-                color:''
-            },
-            0:{
-                text:'已停用',
-                bg:'#F53F3F',
-                color:''
-            },
-            2:{
-                text:'已过期',
-                bg:'#FF7D00',
-                color:''
-            }
+      activeMenuIndex: "cdkey_manage",
+      breadcrumbList: [
+        {
+          icon: "barcode-line",
+          url: "",
+          text: "",
         },
-        tableData:[
-            // {
-            //     id:'1',
-            //     userName:'admin',
-            //     realName:'超级管理员',
-            //     sex:'0',
-            //     type:'0', // 0 管理员 1 平台管理员 2 内容管理员 3 财务管理员 4 兑换码管理员
-            //     email:'d.dkemi@kqtdgbo.tj',
-            //     phone:'13082684216',
-            //     status:'1',
-            //     data:'2018-02-03',
-            //     img:''
-            // }
-        ],
-        pageSize: window.localStorage.getItem('pageSize')?Number(window.localStorage.getItem('pageSize')):10, 
-        pageNumber: window.localStorage.getItem('pageNumber')?Number(window.localStorage.getItem('pageNumber')):1,
-        tableHeight: "", // 表格高度
-        total_count: 0,
-        dataSort: {},
-        tableLoading: false,
-    }
+        {
+          icon: "",
+          url: "",
+          text: "兑换码管理",
+        },
+      ],
+      searchInput: "",
+      searchType: -1,
+      searchStatus: -1,
+      typeList: [
+        {
+          value: -1,
+          label: "全部",
+        },
+        {
+          value: 0,
+          label: "普通兑换码",
+        },
+        {
+          value: 1,
+          label: "批量兑换码",
+        },
+      ],
+      statusList: [
+        {
+          label: "全部",
+          value: -1,
+        },
+        {
+          label: "使用中",
+          value: 1,
+        },
+        {
+          label: "已停用",
+          value: 0,
+        },
+        {
+          label: "已到期",
+          value: 2,
+        },
+      ],
+      statusListCss: {
+        1: {
+          text: "使用中",
+          bg: "#165DFF",
+          color: "",
+        },
+        0: {
+          text: "已停用",
+          bg: "#F53F3F",
+          color: "",
+        },
+        2: {
+          text: "已过期",
+          bg: "#FF7D00",
+          color: "",
+        },
+      },
+      tableData: [
+        // {
+        //     id:'1',
+        //     userName:'admin',
+        //     realName:'超级管理员',
+        //     sex:'0',
+        //     type:'0', // 0 管理员 1 平台管理员 2 内容管理员 3 财务管理员 4 兑换码管理员
+        //     email:'d.dkemi@kqtdgbo.tj',
+        //     phone:'13082684216',
+        //     status:'1',
+        //     data:'2018-02-03',
+        //     img:''
+        // }
+      ],
+      pageSize: window.localStorage.getItem("pageSize")
+        ? Number(window.localStorage.getItem("pageSize"))
+        : 10,
+      pageNumber: window.localStorage.getItem("pageNumber")
+        ? Number(window.localStorage.getItem("pageNumber"))
+        : 1,
+      tableHeight: "", // 表格高度
+      total_count: 0,
+      dataSort: {},
+      tableLoading: false,
+      orderNumber: "",
+      btnLoading: false,
+      qr_code_url: "",
+      opts: {
+        errorCorrectionLevel: "H", //容错级别
+        type: "image/png", //生成的二维码类型
+        quality: 1, //二维码质量
+        margin: 0, //二维码留白边距
+        width: 330, //宽
+        height: 330, //高
+        text: "", //二维码内容
+        color: {
+          dark: "#333333", //前景色
+          light: "#fff", //背景色
+        },
+      },
+      codeloading: false,
+      dialogVisible: false,
+    };
   },
   //计算属性 类似于data概念
-  computed: {
-  },
+  computed: {},
   //监控data中数据变化
   watch: {},
   //方法集合
   methods: {
-    createCdkey(type){
-        window.localStorage.removeItem('cdKeyId')
-        this.$router.push({
-            path: '/createCdkey',
-            query: {
-                type: type
-            }
-        })
+    createCdkey(type) {
+      window.localStorage.removeItem("cdKeyId");
+      this.$router.push({
+        path: "/createCdkey",
+        query: {
+          type: type,
+        },
+      });
     },
-    handleSort(value){
-        let dataSort = {
-            prop: value.prop,
-            order: value.order
-        }
-        this.dataSort = dataSort
-        this.getList()
+    handleSort(value) {
+      let dataSort = {
+        prop: value.prop,
+        order: value.order,
+      };
+      this.dataSort = dataSort;
+      this.getList();
     },
     // 撤回
-    handleRevoca(row){
-        this.$confirm('确定撤回吗?', '提示', {
-          confirmButtonText: '确定',
-          cancelButtonText: '取消',
-          type: 'warning'
-        }).then(() => {
-            let Mname = "/ShopServer/Manager/DiscountCodeManager/RecallDiscountCode";
-            let data = {
-                id: row.id
-            };
-            getLogin(Mname, data).then(res => {
-                this.$message({
-                    type: 'success',
-                    message: '撤回成功!'
-                });
-                this.getList()
+    handleRevoca(row) {
+      this.$confirm("确定撤回吗?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(() => {
+          let Mname =
+            "/ShopServer/Manager/DiscountCodeManager/RecallDiscountCode";
+          let data = {
+            id: row.id,
+          };
+          getLogin(Mname, data).then((res) => {
+            this.$message({
+              type: "success",
+              message: "撤回成功!",
             });
-        }).catch(() => {
-               
-        });
+            this.getList();
+          });
+        })
+        .catch(() => {});
     },
     // 删除
-    handleDelete(row){
-        this.$confirm('确定删除吗?', '提示', {
-          confirmButtonText: '确定',
-          cancelButtonText: '取消',
-          type: 'warning'
-        }).then(() => {
-            let Mname = "/ShopServer/Manager/DiscountCodeManager/DeleteDiscountCode";
-            let data = {
-                id: row.id
-            };
-            getLogin(Mname, data).then(res => {
-                this.$message({
-                    type: 'success',
-                    message: '删除成功!'
-                });
-                this.getList()
+    handleDelete(row) {
+      this.$confirm("确定删除吗?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(() => {
+          let Mname =
+            "/ShopServer/Manager/DiscountCodeManager/DeleteDiscountCode";
+          let data = {
+            id: row.id,
+          };
+          getLogin(Mname, data).then((res) => {
+            this.$message({
+              type: "success",
+              message: "删除成功!",
             });
-        }).catch(() => {
-               
-        });
+            this.getList();
+          });
+        })
+        .catch(() => {});
     },
     // 查询列表
-    getList(page){
-        this.tableLoading = true
-        if(page){
-            this.pageNumber = page
-        }
-        let MethodName = "/ShopServer/Manager/DiscountCodeManager/PageQueryDiscountCodeList";
-        let order_column_list = []
-        if(this.dataSort != {}){
-            if(this.dataSort.order=='descending'){
-                order_column_list = [this.dataSort.prop + ':desc']
-            }else if(this.dataSort.order=='ascending'){
-                // 升序不传值
-                order_column_list = [this.dataSort.prop]
-            }else{
-                order_column_list = ['create_time:desc']
-            }
-        }else{
-            order_column_list = ['create_time:desc']
-        }
-        let data = {
-            content:this.searchInput.trim(),
-            type:this.searchType,
-            valid_status:this.searchStatus,
-            page_capacity:this.pageSize,
-            cur_page:this.pageNumber,
-            order_column_list: order_column_list
+    getList(page) {
+      this.tableLoading = true;
+      if (page) {
+        this.pageNumber = page;
+      }
+      let MethodName =
+        "/ShopServer/Manager/DiscountCodeManager/PageQueryDiscountCodeList";
+      let order_column_list = [];
+      if (this.dataSort != {}) {
+        if (this.dataSort.order == "descending") {
+          order_column_list = [this.dataSort.prop + ":desc"];
+        } else if (this.dataSort.order == "ascending") {
+          // 升序不传值
+          order_column_list = [this.dataSort.prop];
+        } else {
+          order_column_list = ["create_time:desc"];
         }
-        getLogin(MethodName, data)
+      } else {
+        order_column_list = ["create_time:desc"];
+      }
+      let data = {
+        content: this.searchInput.trim(),
+        type: this.searchType,
+        valid_status: this.searchStatus,
+        page_capacity: this.pageSize,
+        cur_page: this.pageNumber,
+        order_column_list: order_column_list,
+      };
+      getLogin(MethodName, data)
         .then((res) => {
-            this.tableLoading = false
-            if(res.status===1){
-               this.tableData = res.discount_code_list
-               this.total_count = res.total_count
-            }
+          this.tableLoading = false;
+          if (res.status === 1) {
+            this.tableData = res.discount_code_list;
+            this.total_count = res.total_count;
+          }
         })
         .catch(() => {
-            this.tableLoading = false
+          this.tableLoading = false;
         });
     },
     // 编辑账号
-    handleEdit(row){
-        // 根据登录用户判断当前用户是不是超管 在table里加上disabled
+    handleEdit(row) {
+      // 根据登录用户判断当前用户是不是超管 在table里加上disabled
 
-        // 点击时记录页码和每页条数
-        window.localStorage.setItem('pageSize',this.pageSize)
-        window.localStorage.setItem('pageNumber',this.pageNumber)
-        if(row&&row.id){
-            this.$router.push({
-                path: "/checkGoods",
-                query: {
-                    id: row?row.id:'',
-                    type: row.type
-                },
-            });
-        }
+      // 点击时记录页码和每页条数
+      window.localStorage.setItem("pageSize", this.pageSize);
+      window.localStorage.setItem("pageNumber", this.pageNumber);
+      if (row && row.id) {
+        this.$router.push({
+          path: "/checkGoods",
+          query: {
+            id: row ? row.id : "",
+            type: row.type,
+          },
+        });
+      }
     },
     // 停用 启用
     handleUp(row, index) {
       let Mname = "/ShopServer/Manager/DiscountCodeManager/StopDiscountCode";
       let updataData = JSON.parse(JSON.stringify(row));
       let data = {
-        id: row.id
+        id: row.id,
       };
       if (row.valid_status === 0) {
         // 下架状态
@@ -433,20 +527,20 @@ export default {
         data.is_stop = "true";
         updataData.valid_status = 0;
       }
-      getLogin(Mname, data).then(res => {
+      getLogin(Mname, data).then((res) => {
         this.$message.success("操作成功");
         this.$set(this.tableData, index, updataData);
-        this.getList()
+        this.getList();
       });
     },
     handleSizeChange(val) {
-        this.pageSize = val
-        this.pageNumber = 1
-        this.getList()
+      this.pageSize = val;
+      this.pageNumber = 1;
+      this.getList();
     },
     handleCurrentChange(val) {
-        this.pageNumber = val
-        this.getList()
+      this.pageNumber = val;
+      this.getList();
     },
     //计算table高度(动态设置table高度)
     getTableHeight() {
@@ -458,67 +552,154 @@ export default {
         this.tableHeight = window.innerHeight - tableH;
       }
     },
+    // 根据聚水潭订单号
+    createDiscountCode() {
+      if (this.orderNumber && this.orderNumber.trim()) {
+        this.btnLoading = true;
+        let MethodName =
+          "/ShopServer/Manager/DiscountCodeManager/CreateDiscountCode_UseJushuitanInnerOrderSN";
+        getLogin(MethodName, { order_sn: this.orderNumber.trim() })
+          .then((res) => {
+            this.btnLoading = false;
+            if (res.status === 1) {
+              this.$message.success("创建成功");
+              this.orderNumber = "";
+              this.getList("1");
+            }
+          })
+          .catch(() => {
+            this.btnLoading = false;
+          });
+      } else {
+        this.$message.warning("请先输入聚水潭内部订单号");
+      }
+    },
+    // 生成二维码
+    createQRcode() {
+      if (!this.qr_code_url) {
+        this.$confirm(
+          "请先去系统配置-聚水潭对接配置里设置用于扫码兑换的二维码的URL",
+          "提示",
+          {
+            type: "warning",
+            closeOnClickModal: false,
+          }
+        ).then(({}) => {});
+      } else {
+        this.dialogVisible = true;
+        this.codeloading = true;
+        setTimeout(() => {
+          let msg = document.getElementById("QRCode_header");
+          QRCode.toCanvas(msg, this.qr_code_url, this.opts, function (error) {
+            if (error) {
+              console.log("二维码加载失败", error);
+              this.$message.error("二维码加载失败");
+            }
+          });
+          this.codeloading = false;
+        }, 100);
+      }
+    },
+    // 得到配置信息
+    getInfo() {
+      let MethodName =
+        "/OrgServer/Manager/SysConfigManager/GetSysConfig_Jushuitan";
+      getLogin(MethodName, {})
+        .then((res) => {
+          if (res.status === 1) {
+            this.qr_code_url = res.qr_code_url;
+          }
+        })
+        .catch((res) => {});
+    },
   },
   //生命周期 - 创建完成(可以访问当前this实例)
   created() {
     this.getTableHeight();
-    this.getList()
+    this.getList();
+    this.getInfo();
   },
   //生命周期 - 挂载完成(可以访问DOM元素)
   mounted() {
-    let _this = this
-    let input = document.querySelector('input');
-    input.addEventListener('keyup', function(event) {
-        // 判断是否按下回车键
-        if (event.keyCode === 13) {
-            // 回车键被按下,执行你想要的操作
-            _this.getList(1)
-        }
+    let _this = this;
+    let input = document.querySelector("input");
+    input.addEventListener("keyup", function (event) {
+      // 判断是否按下回车键
+      if (event.keyCode === 13) {
+        // 回车键被按下,执行你想要的操作
+        _this.getList(1);
+      }
     });
   },
   //生命周期-创建之前
-  beforeCreated() { },
+  beforeCreated() {},
   //生命周期-挂载之前
-  beforeMount() { },
+  beforeMount() {},
   //生命周期-更新之前
-  beforUpdate() { },
+  beforUpdate() {},
   //生命周期-更新之后
-  updated() { },
+  updated() {},
   //生命周期-销毁之前
-  beforeDestory() { },
+  beforeDestory() {},
   //生命周期-销毁完成
-  destoryed() { },
+  destoryed() {},
   //如果页面有keep-alive缓存功能,这个函数会触发
-  activated() { }
-}
+  activated() {},
+};
 </script>
 <style lang="scss" scoped>
 /* @import url(); 引入css类 */
+.btn-box {
+  display: flex;
+  align-items: center;
+}
+.order-input {
+  width: 200px;
+  margin-right: 10px;
+
+  :deep .el-input__suffix {
+    background: #165dff;
+    right: 0;
+    border-radius: 0 2px 2px 0;
+    cursor: pointer;
+  }
+  :deep .el-input__suffix-inner {
+    span {
+      line-height: 32px;
+      color: #fff;
+      font-size: 12px;
+      height: 32px;
+      padding: 0 8px;
+      display: block;
+      font-weight: 500;
+    }
+  }
+}
 </style>
 <style lang="scss">
-.personal-inner{
-    .user-info{
-        .cell{
-            display: flex;
-            align-items: center;
-            .touxiang{
-                width: 24px;
-                height: 24px;
-                border-radius: 50%;
-                margin-right: 8px;
-            }
-        }
-    }
-    .type-info{
-        background: #F2F3F5;
-        border-radius: 2px;
-        color: #1D2129;
-        padding: 2px 8px 3px 8px;
-        font-weight: 500;
-        font-size: 14px;
-        line-height: 22px;
-        height: auto;
-        border: none;
+.personal-inner {
+  .user-info {
+    .cell {
+      display: flex;
+      align-items: center;
+      .touxiang {
+        width: 24px;
+        height: 24px;
+        border-radius: 50%;
+        margin-right: 8px;
+      }
     }
+  }
+  .type-info {
+    background: #f2f3f5;
+    border-radius: 2px;
+    color: #1d2129;
+    padding: 2px 8px 3px 8px;
+    font-weight: 500;
+    font-size: 14px;
+    line-height: 22px;
+    height: auto;
+    border: none;
+  }
 }
-</style>
+</style>

+ 71 - 0
src/views/content_manage/newspaper_manage/CreateArticle.vue

@@ -95,6 +95,13 @@
               :loading="changeCnLoading"
               >转成英文内容</el-button
             >
+            <el-button
+              type="primary"
+              size="small"
+              @click="reqNewTtsTask"
+              :loading="ttsTaskLoading"
+              >tts重新生成</el-button
+            >
           </div>
         </template>
         <Editor
@@ -502,6 +509,7 @@ export default {
       phraseList: [],
       previewArticle: false,
       changeCnLoading: false,
+      ttsTaskLoading: false,
     };
   },
   //计算属性 类似于data概念
@@ -966,6 +974,69 @@ export default {
           this.changeCnLoading = false;
         });
     },
+    // 点击重新生成tts按钮
+    reqNewTtsTask() {
+      this.ttsTaskLoading = true;
+      // 先获取tts任务信息 code=1表示tts数据已经生成 code=2 表示 已经成功发出tts任务,等待tts服务器返回数据中
+      let MethodName =
+        "/PaperServer/Manager/ArticleManager/GetArticleTtsTaskInfo";
+      let data = {
+        id: this.id || this.articleId,
+      };
+      getLogin(MethodName, data)
+        .then((res) => {
+          this.ttsTaskLoading = false;
+          if (res.status === 1) {
+            if (res.data.code === 0) {
+              let Mnames = "/PaperServer/Manager/ArticleManager/ReqNewTtsTask";
+
+              getLogin(Mnames, data).then((res) => {
+                if (res.status === 1) {
+                  this.$message.success(
+                    "已成功发送tts重新生成请求,请稍后刷新页面查看文章详情"
+                  );
+                }
+              });
+            } else if (res.data.code === 1) {
+              this.$message.success("tts重新生成成功");
+              this.getArticleInfo();
+            } else if (res.data.code === 2) {
+              let str =
+                "已成功发送tts请求,等待tts服务器返回数据中,目前已等待" +
+                res.data.ttsRequestDurationSecs +
+                "秒";
+              this.$confirm(str, "提示", {
+                confirmButtonText: "再次生成",
+                cancelButtonText: "继续等待",
+                type: "success",
+                dangerouslyUseHTMLString: true,
+              }).then(() => {
+                let Mnames =
+                  "/PaperServer/Manager/ArticleManager/ReqNewTtsTask";
+
+                getLogin(Mnames, data).then((res) => {
+                  if (res.status === 1) {
+                    this.$message.success(
+                      "已成功发送tts重新生成请求,请稍后查看文章详情"
+                    );
+                  }
+                });
+              });
+            } else if (code === 10) {
+              this.$message.warning("发送tts请求出错,请重试");
+            } else if (code === 11) {
+              this.$message.warning("文章或报刊基础数据错误");
+            } else if (code === 12) {
+              this.$message.warning("文章已经有原声音频");
+            } else if (code === 13) {
+              this.$message.warning("文章类型错误");
+            }
+          }
+        })
+        .catch(() => {
+          this.ttsTaskLoading = false;
+        });
+    },
   },
   //生命周期 - 创建完成(可以访问当前this实例)
   created() {

+ 12 - 4
src/views/data_center/index.vue

@@ -6,7 +6,10 @@
         class="manage-root-contain-left"
         :activeMenuIndex="activeMenuIndex"
       ></nav-menu>
-      <div class="manage-root-contain-right personnel-manage-right">
+      <div
+        class="manage-root-contain-right personnel-manage-right"
+        v-if="!isPhone"
+      >
         <div class="top">
           <span>数据中心</span>
           <b>{{ queryTime }}</b>
@@ -673,6 +676,7 @@ export default {
         },
       },
       exportLoading: false,
+      isPhone: false,
     };
   },
   //计算属性 类似于data概念
@@ -1339,9 +1343,13 @@ export default {
   created() {},
   //生命周期 - 挂载完成(可以访问DOM元素)
   mounted() {
-    this.getTableHeight();
-    this.getData();
-    this.searchStatDaily();
+    const regExp = /Android|webOS|iPhone|BlackBerry|IEMobile|Opera Mini/i;
+    this.isPhone = regExp.test(navigator.userAgent) && window.innerWidth < 860;
+    if (!this.isPhone) {
+      this.getTableHeight();
+      this.getData();
+      this.searchStatDaily();
+    }
   },
   //生命周期-创建之前
   beforeCreated() {},

+ 50 - 7
src/views/finance_manage/RefundManager.vue

@@ -6,16 +6,26 @@
         class="manage-root-contain-left"
         :activeMenuIndex="activeMenuIndex"
       ></nav-menu>
-      <div class="manage-root-contain-right">
+      <div
+        class="manage-root-contain-right"
+        :class="[isPhone ? 'manage-root-contain-right-phone' : '']"
+      >
         <breadcrumb
           :breadcrumbList="breadcrumbList"
           class="breadcrumb-box"
+          :class="[isPhone ? 'breadcrumb-box-phone' : '']"
         ></breadcrumb>
         <div class="personal-inner">
-          <div class="common-title-box">
+          <div
+            class="common-title-box"
+            :style="{ paddingBottom: showSearch ? '' : '12px' }"
+          >
             <h3>退款列表</h3>
+            <span v-if="isPhone" @click="showSearch = !showSearch">{{
+              showSearch ? "收起查询条件" : "展开查询条件"
+            }}</span>
           </div>
-          <div class="search-box">
+          <div class="search-box" v-if="showSearch">
             <div class="search-item">
               <label>搜索</label>
               <el-input
@@ -54,7 +64,7 @@
             style="width: 100%"
             @sort-change="handleSort"
             :default-sort="dataSort"
-            :max-height="tableHeight"
+            :max-height="isPhone ? '' : tableHeight"
             v-loading="tableLoading"
           >
             <el-table-column
@@ -213,17 +223,27 @@
             :current-page="pageNumber"
             :page-sizes="[10, 20, 30, 40]"
             :page-size="pageSize"
-            layout="total, prev, pager, next, sizes, jumper"
+            :layout="
+              isPhone
+                ? 'total, prev, pager, next'
+                : 'total, prev, pager, next, sizes, jumper'
+            "
             :total="total_count"
+            :small="isPhone"
+            :pager-count="isPhone ? 3 : 7"
           >
           </el-pagination>
         </div>
       </div>
     </div>
-    <el-dialog title="退款信息" :visible.sync="dialogVisible" width="500px">
+    <el-dialog
+      title="退款信息"
+      :visible.sync="dialogVisible"
+      :width="isPhone ? '100%' : '500px'"
+    >
       <template v-if="ktjeInfo">
         <span style="margin-right: 5px">可退金额:</span>
-        <el-input v-model="ktje"></el-input>
+        <el-input v-model="ktje" style="width: 150px"></el-input>
         <p>可退商品信息</p>
         <div class="item-info">
           <label>物品类型:</label><span>{{ ktjeInfo.goods_type_name }}</span>
@@ -581,6 +601,8 @@ export default {
       ktje: 0,
       refundId: "",
       ktjeInfo: null,
+      isPhone: false,
+      showSearch: true,
     };
   },
   //计算属性 类似于data概念
@@ -652,6 +674,7 @@ export default {
         confirmButtonText: "确定",
         cancelButtonText: "取消",
         type: "warning",
+        customClass: this.isPhone ? "refund-model" : "",
       })
         .then(() => {
           let Mname =
@@ -799,6 +822,11 @@ export default {
   },
   //生命周期 - 创建完成(可以访问当前this实例)
   created() {
+    const regExp = /Android|webOS|iPhone|BlackBerry|IEMobile|Opera Mini/i;
+    this.isPhone = regExp.test(navigator.userAgent) && window.innerWidth < 860;
+    if (this.isPhone) {
+      this.showSearch = false;
+    }
     this.getTableHeight();
     this.getQuickList();
     this.getOrgList();
@@ -834,6 +862,18 @@ export default {
 </script>
 <style lang="scss" scoped>
 /* @import url(); 引入css类 */
+.common-title-box {
+  align-items: center;
+  span {
+    font-size: 14px;
+  }
+}
+.manage-root-contain-right-phone {
+  .personal-inner {
+    min-height: calc(100vh - 124px);
+    height: auto;
+  }
+}
 </style>
 <style lang="scss">
 .btn-box {
@@ -944,4 +984,7 @@ export default {
     flex-shrink: 0;
   }
 }
+.refund-model {
+  max-width: 100%;
+}
 </style>

+ 21 - 28
src/views/index.vue

@@ -2,10 +2,11 @@
   <div class="manage-root">
     <Header />
     <div class="manage-root-contain">
-        <nav-menu class="manage-root-contain-left" :activeMenuIndex="activeMenuIndex"></nav-menu>
-        <div class="manage-root-contain-right">
-            
-        </div>
+      <nav-menu
+        class="manage-root-contain-left"
+        :activeMenuIndex="activeMenuIndex"
+      ></nav-menu>
+      <div class="manage-root-contain-right"></div>
     </div>
   </div>
 </template>
@@ -14,7 +15,7 @@
 //这里可以导入其它文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)
 //例如:import 《组件名称》from ‘《组件路径》';
 import Header from "../components/Header.vue";
-import NavMenu from "../components/NavMenu.vue"
+import NavMenu from "../components/NavMenu.vue";
 
 export default {
   //import引入的组件需要注入到对象中才能使用
@@ -23,43 +24,35 @@ export default {
   data() {
     //这里存放数据
     return {
-        activeMenuIndex: ""
-    }
+      activeMenuIndex: "",
+    };
   },
   //计算属性 类似于data概念
-  computed: {
-    
-  },
+  computed: {},
   //监控data中数据变化
   watch: {},
   //方法集合
-  methods: {
-  },
+  methods: {},
   //生命周期 - 创建完成(可以访问当前this实例)
-  created() {
-
-  },
+  created() {},
   //生命周期 - 挂载完成(可以访问DOM元素)
-  mounted() {
-
-  },
+  mounted() {},
   //生命周期-创建之前
-  beforeCreated() { },
+  beforeCreated() {},
   //生命周期-挂载之前
-  beforeMount() { },
+  beforeMount() {},
   //生命周期-更新之前
-  beforUpdate() { },
+  beforUpdate() {},
   //生命周期-更新之后
-  updated() { },
+  updated() {},
   //生命周期-销毁之前
-  beforeDestory() { },
+  beforeDestory() {},
   //生命周期-销毁完成
-  destoryed() { },
+  destoryed() {},
   //如果页面有keep-alive缓存功能,这个函数会触发
-  activated() { }
-}
+  activated() {},
+};
 </script>
 <style lang="scss" scoped>
 /* @import url(); 引入css类 */
-
-</style>
+</style>

+ 21 - 1
src/views/login.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="login">
+  <div class="login" :class="[isPhone ? 'login-phone' : '']">
     <div class="login-left">
       <img src="../assets/login-logo.png" />
     </div>
@@ -234,6 +234,7 @@ export default {
       loading: false,
       timer: null,
       forgotPwdFlag: false,
+      isPhone: false,
     };
   },
   watch: {},
@@ -344,6 +345,10 @@ export default {
       this.forgotPwdFlag = false;
     },
   },
+  created() {
+    const regExp = /Android|webOS|iPhone|BlackBerry|IEMobile|Opera Mini/i;
+    this.isPhone = regExp.test(navigator.userAgent) && window.innerWidth < 860;
+  },
   mounted() {},
 };
 </script>
@@ -365,6 +370,21 @@ export default {
       padding-top: 32px;
     }
   }
+  &-phone {
+    .login-left {
+      display: none;
+    }
+    .login-container {
+      padding: 20px 30px;
+      &-inner {
+        width: 100%;
+        .el-input,
+        .el-textarea {
+          width: 100%;
+        }
+      }
+    }
+  }
 }
 .login-container {
   background: #ffffff;

+ 264 - 0
src/views/system_config/JstSetting.vue

@@ -0,0 +1,264 @@
+<template>
+  <div class="manage-root personnel-create">
+    <Header />
+    <div class="manage-root-contain">
+      <nav-menu
+        class="manage-root-contain-left"
+        :activeMenuIndex="activeMenuIndex"
+      ></nav-menu>
+      <div class="manage-root-contain-right">
+        <breadcrumb
+          :breadcrumbList="breadcrumbList"
+          class="breadcrumb-box"
+        ></breadcrumb>
+        <div class="create-bottom">
+          <h3>聚水潭配置</h3>
+          <el-form
+            :model="registerForm"
+            ref="registerForm"
+            label-width="100px"
+            class="registerForm"
+            label-position="top"
+          >
+            <el-form-item label="应用键值" prop="app_key">
+              <el-input
+                v-model="registerForm.app_key"
+                autocomplete="off"
+                placeholder="请输入应用键值"
+                @blur="handleTrim('registerForm', 'app_key')"
+                maxlength="100"
+              >
+              </el-input>
+            </el-form-item>
+            <el-form-item label="应用密钥" prop="app_secret">
+              <el-input
+                v-model="registerForm.app_secret"
+                autocomplete="off"
+                placeholder="请输入SMTP 服务器"
+                @blur="handleTrim('registerForm', 'app_secret')"
+                maxlength="200"
+              >
+              </el-input>
+            </el-form-item>
+            <el-form-item label="访问令牌" prop="access_token">
+              <el-input
+                v-model="registerForm.access_token"
+                autocomplete="off"
+                placeholder="请输入访问令牌"
+                @blur="handleTrim('registerForm', 'access_token')"
+                maxlength="100"
+              >
+              </el-input>
+            </el-form-item>
+            <el-form-item label="用于扫码兑换的二维码的URL" prop="qr_code_url">
+              <el-input
+                v-model="registerForm.qr_code_url"
+                type="text"
+                autocomplete="off"
+                placeholder="请输入URL"
+                @blur="handleTrim('registerForm', 'qr_code_url')"
+                maxlength="100"
+              >
+              </el-input>
+            </el-form-item>
+            <el-form-item
+              label="扫码兑换时自动注册用户归属机构"
+              prop="auto_register_user_org_id"
+            >
+              <el-select
+                v-model="registerForm.auto_register_user_org_id"
+                placeholder="请选择"
+              >
+                <el-option
+                  v-for="item in orgList"
+                  :key="item.id"
+                  :label="item.name"
+                  :value="item.id"
+                >
+                </el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item>
+              <el-button
+                type="primary"
+                @click="onSubmit('registerForm')"
+                size="small"
+                :loading="loading"
+                >保存</el-button
+              >
+              <el-button @click="onCancel('registerForm')" size="small"
+                >取消</el-button
+              >
+            </el-form-item>
+          </el-form>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+//这里可以导入其它文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)
+//例如:import 《组件名称》from ‘《组件路径》';
+import Header from "../../components/Header.vue";
+import NavMenu from "../../components/NavMenu.vue";
+import Breadcrumb from "../../components/Breadcrumb.vue";
+import { getLogin } from "@/api/ajax";
+
+export default {
+  //import引入的组件需要注入到对象中才能使用
+  components: { Header, NavMenu, Breadcrumb },
+  props: {},
+  data() {
+    //这里存放数据
+    return {
+      activeMenuIndex: "jst_setting",
+      breadcrumbList: [
+        {
+          icon: "setting",
+          url: "",
+          text: "",
+        },
+        {
+          icon: "",
+          url: "",
+          notLink: true,
+          text: "系统配置",
+        },
+        {
+          icon: "",
+          url: "",
+          text: "聚水潭对接配置",
+        },
+      ],
+      registerForm: {
+        app_key: "",
+        app_secret: "",
+        access_token: "",
+        qr_code_url: "",
+        auto_register_user_org_id: "",
+      },
+
+      loading: false,
+      orgList: [],
+    };
+  },
+  //计算属性 类似于data概念
+  computed: {},
+  //监控data中数据变化
+  watch: {},
+  //方法集合
+  methods: {
+    // 去掉前后空格
+    handleTrim(form, fild) {
+      this[form][fild] = this[form][fild].trim();
+    },
+    // 提交表单
+    onSubmit(formName) {
+      this.$refs[formName].validate((valid) => {
+        if (valid) {
+          this.loading = true;
+          let MethodName =
+            "/OrgServer/Manager/SysConfigManager/SetSysConfig_Jushuitan";
+          getLogin(MethodName, this.registerForm)
+            .then((res) => {
+              this.loading = false;
+              if (res.status === 1) {
+                this.$message.success("保存成功");
+              }
+            })
+            .catch((res) => {
+              this.loading = false;
+            });
+        } else {
+          return false;
+        }
+      });
+    },
+    // 取消 恢复到修改前状态
+    onCancel(formName) {
+      this.$refs[formName].resetFields();
+    },
+    // 得到配置信息
+    getInfo() {
+      let MethodName =
+        "/OrgServer/Manager/SysConfigManager/GetSysConfig_Jushuitan";
+      getLogin(MethodName, {})
+        .then((res) => {
+          if (res.status === 1) {
+            this.registerForm = {
+              app_key: res.app_key,
+              app_secret: res.app_secret,
+              access_token: res.access_token,
+              qr_code_url: res.qr_code_url,
+              auto_register_user_org_id: res.auto_register_user_org_id,
+            };
+          }
+        })
+        .catch((res) => {});
+    },
+    // 查询列表
+    getOrgList() {
+      let MethodName = "/OrgServer/Manager/PageQuery/PageQueryOrgList";
+
+      let data = {
+        name: "",
+        type: -1,
+        status: 1,
+        creator_id: "",
+        page_capacity: 100,
+        cur_page: 1,
+        order_column_list: ["create_time:desc"],
+      };
+      getLogin(MethodName, data)
+        .then((res) => {
+          this.tableLoading = false;
+          if (res.status === 1) {
+            this.orgList = res.org_list;
+          }
+        })
+        .catch(() => {});
+    },
+  },
+  //生命周期 - 创建完成(可以访问当前this实例)
+  created() {
+    this.getOrgList();
+    this.getInfo();
+  },
+  //生命周期 - 挂载完成(可以访问DOM元素)
+  mounted() {},
+  //生命周期-创建之前
+  beforeCreated() {},
+  //生命周期-挂载之前
+  beforeMount() {},
+  //生命周期-更新之前
+  beforUpdate() {},
+  //生命周期-更新之后
+  updated() {},
+  //生命周期-销毁之前
+  beforeDestory() {},
+  //生命周期-销毁完成
+  destoryed() {},
+  //如果页面有keep-alive缓存功能,这个函数会触发
+  activated() {},
+};
+</script>
+<style lang="scss" scoped>
+/* @import url(); 引入css类 */
+.create-bottom {
+  padding: 40px 40px;
+  background: #ffffff;
+  border-radius: 4px;
+  height: calc(100vh - 140px);
+  overflow: auto;
+  h3 {
+    font-size: 20px;
+    font-weight: 500;
+    line-height: 28px;
+    margin: 0 0 28px 0;
+    color: #1d2129;
+  }
+}
+</style>
+
+<style lang="scss"></style>

Some files were not shown because too many files changed in this diff