yuantianjiao 6 years ago
parent
commit
7fc4f55a7f

BIN
public/favicon.ico View File


+ 1
- 1
public/index.html View File

@@ -6,7 +6,7 @@
6 6
     <meta name="viewport" content="width=device-width,initial-scale=1.0">
7 7
     <link rel="icon" href="<%= BASE_URL %>favicon.ico">
8 8
     <link rel="stylesheet" href="//at.alicdn.com/t/font_681879_u55mh75ray8.css">
9
-    <title>menu</title>
9
+    <title>千锦荟第三方平台</title>
10 10
   </head>
11 11
   <body>
12 12
     <noscript>

BIN
src/assets/defultHead.png View File


BIN
src/assets/logo.png View File


+ 1
- 0
src/components/bottomMenu.vue View File

@@ -16,6 +16,7 @@ export default {
16 16
   components: { subMenu },
17 17
   methods: {
18 18
     addMenu () {
19
+      console.log(this.menuArr)
19 20
       this.$emit('addMainMenu')
20 21
     },
21 22
     modify (item, index) {

+ 31
- 10
src/components/material.vue View File

@@ -1,5 +1,6 @@
1 1
 <template>
2 2
   <div>
3
+    <Button type="error" @click="reflsh">同步素材库</Button>
3 4
     <div class="box" v-if="model === 'get'">
4 5
       <div v-if="type === 'img'">
5 6
         <div  v-for="(item,index) in img" :key="index" @click="emit(item,index)" :class="{checked:item.checked}">
@@ -31,10 +32,9 @@
31 32
         :max-size="2048"
32 33
         :on-format-error="handleFormatError" 
33 34
         :on-exceeded-size="handleMaxSize"
34
-        :before-upload="handleBeforeUpload"
35 35
         :with-credentials='true'
36 36
         type="drag"
37
-        :action="api.common.image.url"
37
+        :action="api.material.addImg.url"
38 38
         class="upload-btn">
39 39
         <div>
40 40
           <Icon type="ios-camera" size="50"></Icon>
@@ -62,7 +62,7 @@ export default {
62 62
   },
63 63
   created () {
64 64
     if (this.type === 'img') {
65
-      this.getImg().then(() => {
65
+      this.getImg({ type: 'image' }).then(() => {
66 66
         if (this.model === 'set') {
67 67
           this.$nextTick(() => {
68 68
             this.uploadList = this.img
@@ -80,7 +80,7 @@ export default {
80 80
     })
81 81
   },
82 82
   methods: {
83
-    ...mapMaterialActions(['getImg', 'getView', 'deleteImg','addImg']),
83
+    ...mapMaterialActions(['getImg', 'getView', 'deleteImg', 'addImg', 'reflshImg']),
84 84
     emit (item, index) {
85 85
       if (this.type === 'img') {
86 86
         this.img.forEach((curr, ind) => {
@@ -100,18 +100,27 @@ export default {
100 100
       this.$emit('emit', item)
101 101
     },
102 102
     handleView (url) {
103
-      this.imgName = url;
104
-      this.visible = true;
103
+      this.imgName = url
104
+      this.visible = true
105 105
     },
106 106
     handleRemove (file) {
107
-      this.deleteImg(file).then(() => {
108
-        this.getImg()
107
+      this.deleteImg({ mediaId: file.media_id }).then(() => {
108
+        this.$Message.success('删除成功')
109
+        this.getImg({ type: 'image' }).then(() => {
110
+          if (this.model === 'set') {
111
+            this.$nextTick(() => {
112
+              this.uploadList = this.img
113
+            })
114
+          }
115
+        })
109 116
       })
110 117
     },
111 118
     handleSuccess (res, file) {
112 119
       console.log(res)
113 120
       console.log(file)
114
-      this.addImg(res)
121
+      // this.addImg(file).then(() => {
122
+
123
+      // })
115 124
     },
116 125
     handleFormatError (file) {
117 126
       this.$Notice.warning({
@@ -130,10 +139,22 @@ export default {
130 139
       if (!check) {
131 140
         this.$Notice.warning({
132 141
           title: '一次最多上传1张图片。'
133
-        });
142
+        })
134 143
       }
135 144
       return check
136 145
     },
146
+    reflsh () {
147
+      this.reflshImg({ type: 'image' }).then(() => {
148
+        this.$Message.success('同步成功')
149
+        this.getImg({ type: 'image' }).then(() => {
150
+          if (this.model === 'set') {
151
+            this.$nextTick(() => {
152
+              this.uploadList = this.img
153
+            })
154
+          }
155
+        })
156
+      })
157
+    }
137 158
   }
138 159
 }
139 160
 </script>

+ 32
- 5
src/components/menu.vue View File

@@ -1,22 +1,30 @@
1 1
 <template>
2 2
   <div>
3
-    <Menu style="width:200px;">
3
+    <Menu style="width:200px;" active-name="20">
4 4
       <div v-for="(item,index) in packChildren(menuData)" :key="index">
5 5
         <Submenu v-if="item.children" :name='item.id'>
6 6
           <template slot="title">
7
+            <Icon v-if="item.Icon" :type="item.Icon"/>
7 8
             {{item.label}}
8 9
           </template>
9 10
           <div v-for="(subItem,subIndex) in item.children" :key="subIndex">
10 11
             <Submenu v-if="subItem.children" :name='subItem.id'>
11 12
               <template slot="title">
13
+                <Icon v-if="subItem.Icon" :type="subItem.Icon"/>
12 14
                 {{subItem.label}}
13 15
               </template>
14 16
               <MenuItem v-for="(subItems,subIndexs) in subItem.children" :key="subIndexs" :name="subItems.id" :to='{name: subItems.Url}' >{{subItems.label}}</MenuItem>
15 17
             </Submenu>
16
-            <MenuItem v-else :name="subItem.id" :to='{name: subItem.Url}' >{{subItem.label}}</MenuItem>
18
+            <MenuItem v-else :name="subItem.id" :to='{name: subItem.Url}' >
19
+              <Icon v-if="subItem.Icon" :type="subItem.Icon"/>
20
+              {{subItem.label}}
21
+            </MenuItem>
17 22
           </div>
18 23
         </Submenu>
19
-        <MenuItem v-else :name="item.id" :to='{name: item.Url}' >{{item.label}}</MenuItem>
24
+        <MenuItem v-else :name="item.id" :to='{name: item.Url}' >
25
+          <Icon v-if="item.Icon" :type="item.Icon"/>
26
+          {{item.label}}
27
+        </MenuItem>
20 28
       </div>
21 29
     </Menu>
22 30
   </div>
@@ -24,7 +32,7 @@
24 32
 
25 33
 <script>
26 34
 export default {
27
-  props:['menuData'],
35
+  props: ['menuData'],
28 36
   methods: {
29 37
     packChildren (data) {
30 38
       let cp = data.slice()
@@ -52,9 +60,28 @@ export default {
52 60
           res.push(cp[inx])
53 61
         }
54 62
       })
55
-
63
+      console.log(res)
56 64
       return res
57 65
     }
58 66
   }
59 67
 }
60 68
 </script>
69
+
70
+<style lang="scss" scoped>
71
+i {
72
+  font-size: 16px;
73
+}
74
+.ivu-menu-light.ivu-menu-vertical {
75
+  color: #999;
76
+}
77
+a:hover {
78
+  color: #000 !important;
79
+}
80
+.ivu-menu-light.ivu-menu-vertical .ivu-menu-item-active:not(.ivu-menu-submenu) {
81
+  color: #000;
82
+  background: rgba(0, 0, 0, 0.1);
83
+  &:after {
84
+    background-color: #000;
85
+  }
86
+}
87
+</style>

+ 19
- 15
src/components/menuForm.vue View File

@@ -31,16 +31,19 @@
31 31
         <div class="expression" v-show="showExpression">
32 32
           <emotion @emotion="handleEmotion" :height="200"></emotion>
33 33
         </div>
34
-        <Modal v-model="showLink" draggable scrollable title="添加链接" @on-ok="checkLink" @on-cancel="closeLink">
34
+        <Modal v-model="showLink" draggable scrollable title="添加链接" @on-cancel="closeLink">
35 35
           <div style="display: flex;justify-content: flex-start;align-items: center;padding-bottom: 20px;">
36 36
             <label for="text" style="padding-right: 20px;">链接文字</label>
37 37
             <Input placeholder="链接文字" size="large" v-model="linkText" clearable name="text" style="width: 300px"/>
38 38
           </div>
39 39
           <div style="display: flex;justify-content: flex-start;align-items: center;">
40 40
             <label for="link" style="padding-right: 20px;">链接&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</label>
41
-            <Input placeholder="链接" v-validate="' url:require_protocol '" size="large" v-model="linkHref" clearable name="linkT" style="width: 300px"/>
41
+            <Input placeholder="链接" v-validate="'url:require_protocol'" size="large" v-model="linkHref" clearable name="linkT" style="width: 300px"/>
42 42
             <span style="color: red;padding-left: 20px;" v-show="errors.first('linkT')">请输入正确的url</span>
43 43
           </div>
44
+          <div slot="footer">
45
+            <Button type="primary" @click="checkLink">确认</Button>
46
+          </div>
44 47
         </Modal>
45 48
       </div>
46 49
       <div v-show="active === '图片'">
@@ -135,7 +138,8 @@ export default {
135 138
         media_id: '',
136 139
         url: '',
137 140
         text: ''
138
-      }
141
+      },
142
+      emitData: {}
139 143
     }
140 144
   },
141 145
   created () {
@@ -253,7 +257,7 @@ export default {
253 257
       this.showMaterialView = false
254 258
     },
255 259
     emit () {
256
-      let emitData = {}
260
+      this.emitData = {}
257 261
       if (this.menuConfig) {
258 262
         if (!this.menuTitle) {
259 263
           this.$Message.warning('菜单名称必填')
@@ -262,7 +266,7 @@ export default {
262 266
           this.$Message.warning('菜单名称超过4个汉字或8个字母')
263 267
           return false
264 268
         }
265
-        emitData.name = this.menuTitle
269
+        this.emitData.name = this.menuTitle
266 270
       }
267 271
       if (this.type === '发送消息') {
268 272
         if (this.active === '文字') {
@@ -270,22 +274,22 @@ export default {
270 274
             this.$Message.warning('消息文字必填')
271 275
             return false
272 276
           }
273
-          emitData.type = 'text'
274
-          emitData.value = this.text
277
+          this.emitData.type = 'text'
278
+          this.emitData.value = this.text
275 279
         } else if (this.active === '图片') {
276 280
           if (!this.img.media_id) {
277 281
             this.$Message.warning('请选择素材')
278 282
             return false
279 283
           }
280
-          emitData.type = 'media_id'
281
-          emitData.media_id = this.img.media_id
284
+          this.emitData.type = 'media_id'
285
+          this.emitData.media_id = this.img.media_id
282 286
         } else if (this.active === '图文') {
283 287
           if (!this.view.media_id) {
284 288
             this.$Message.warning('请选择素材')
285 289
             return false
286 290
           }
287
-          emitData.type = 'view_limited'
288
-          emitData.media_id = this.view.media_id
291
+          this.emitData.type = 'view_limited'
292
+          this.emitData.media_id = this.view.media_id
289 293
         }
290 294
       } else if (this.type === '跳转网页') {
291 295
         if (this.errors.first('link')) {
@@ -293,13 +297,13 @@ export default {
293 297
         } else if (!this.linkHref) {
294 298
           this.$Message.warning('url必填')
295 299
         }
296
-        emitData.type = 'view'
297
-        emitData.url = this.linkHref
300
+        this.emitData.type = 'view'
301
+        this.emitData.url = this.linkHref
298 302
       }
299 303
       if (this.data.sub_button) {
300
-        emitData.sub_button = this.data.sub_button
304
+        this.emitData.sub_button = this.data.sub_button
301 305
       }
302
-      this.$emit('emit', emitData)
306
+      this.$emit('emit', this.emitData)
303 307
     },
304 308
     delMenu () {
305 309
       this.$emit('delMenu')

+ 3
- 2
src/pages/login/login.vue View File

@@ -78,13 +78,14 @@ export default {
78 78
   },
79 79
   methods: {
80 80
     ...mapLoginActions(['setRemember', 'setUserName', 'setPassWord', 'login']),
81
-    ...mapMainActions(['getUserInfo']),
81
+    ...mapMainActions(['getUserInfo', 'clearMenu']),
82 82
     submit () {
83
-      this.login({ UserName: this.UserName, UserPass: this.PassWord }).then(() => {
83
+      this.login({ UserName: this.UserName, UserPass: this.md5(this.PassWord) }).then(() => {
84 84
         if (!this.Remember) {
85 85
           this.UserName = ''
86 86
           this.PassWord = ''
87 87
         }
88
+        this.$Message.success('登录成功')
88 89
         this.$router.push({ name: 'menuConfig' })
89 90
       })
90 91
     }

+ 44
- 11
src/pages/main/main.vue View File

@@ -2,9 +2,13 @@
2 2
   <div class="layout">
3 3
     <Layout>
4 4
       <Header class="header">
5
-        <div class="left"></div>
5
+        <div class="left">
6
+          <img :src="logo" alt="">
7
+          <span>千锦荟第三方平台</span>
8
+        </div>
6 9
         <div class="right">
7
-          <img :src="userInfo.Headimgurl" alt="">
10
+          <img v-if="userInfo.Headimgurl" :src="userInfo.Headimgurl" alt="">
11
+          <img v-else :src="defultHead" alt="">
8 12
           <Dropdown @on-click="putPassWord">
9 13
             <a href="javascript:void(0)" style="color:#fff;">{{userInfo.UserName}}<Icon type="ios-arrow-down"></Icon></a>
10 14
             <DropdownMenu slot="list">
@@ -29,12 +33,12 @@
29 33
       </Header>
30 34
       <Layout>
31 35
         <Sider hide-trigger :style="{background: '#fff',borderRight:'1px solid #dcdee2'}">
32
-          <menuLeft :menuData='menuData'></menuLeft>
36
+          <menuLeft v-if="menuData.length>0" :menuData='menuData'></menuLeft>
33 37
         </Sider>
34 38
         <Layout :style="{padding: '24px'}">
35 39
           <Content :style="{padding: '24px', height: '85vh',background: '#fff', position:'relative',overflowY: 'scroll'}">
36 40
             <transition name="fade">
37
-              <router-view class="child-view"></router-view>
41
+              <router-view class="child-view" v-if="showPage"></router-view>
38 42
             </transition>
39 43
           </Content>
40 44
         </Layout>
@@ -44,6 +48,8 @@
44 48
 </template>
45 49
 
46 50
 <script>
51
+import logo from '@/assets/logo.png'
52
+import defultHead from '@/assets/defultHead.png'
47 53
 import { createNamespacedHelpers } from 'vuex'
48 54
 const { mapState: mapMainState, mapActions: mapMainActions } = createNamespacedHelpers('main')
49 55
 import menuLeft from '@/components/menu.vue' // 左侧导航
@@ -52,12 +58,22 @@ export default {
52 58
     return {
53 59
       passWord: '',
54 60
       passWordOld: '',
55
-      showPass: false
61
+      showPass: false,
62
+      defultHead,
63
+      logo,
64
+      showPage: false
56 65
     }
57 66
   },
58 67
   created () {
59 68
     this.getMainMenu()
60 69
     this.getUserInfo()
70
+    this.checkBind().then(() => {
71
+      if (this.isBind) {
72
+        this.showPage = true
73
+      } else {
74
+        this.$Message.warning('请先通知管理员绑定项目,再进行微信配置')
75
+      }
76
+    })
61 77
   },
62 78
   components: {
63 79
     menuLeft
@@ -65,11 +81,12 @@ export default {
65 81
   computed: {
66 82
     ...mapMainState({
67 83
       menuData: item => item.menuData,
68
-      userInfo: item => item.userInfo
84
+      userInfo: item => item.userInfo,
85
+      isBind: item => item.isBind
69 86
     })
70 87
   },
71 88
   methods: {
72
-    ...mapMainActions(['getMainMenu', 'getUserInfo', 'changePassWord', 'logOut']),
89
+    ...mapMainActions(['getMainMenu', 'getUserInfo', 'changePassWord', 'logOut', 'checkBind']),
73 90
     putPassWord (name) {
74 91
       console.log(this.showPass)
75 92
       if (name === '修改密码') {
@@ -89,7 +106,7 @@ export default {
89 106
         this.$Message.warning('请输入新密码')
90 107
         return
91 108
       }
92
-      this.changePassWord({ oriPasswd: this.passWordOld, newPasswd: this.passWord }).then(() => {
109
+      this.changePassWord({ oriPasswd: this.md5(this.passWordOld), newPasswd: this.md5(this.passWord) }).then(() => {
93 110
         this.showPass = false
94 111
         this.$Message.success('修改成功')
95 112
         console.log(this.userInfo)
@@ -138,16 +155,32 @@ export default {
138 155
   opacity: 0;
139 156
 }
140 157
 .header {
141
-  background: #2d8cf0;
158
+  background: #000;
142 159
   display: flex;
143 160
   justify-content: space-between;
144 161
   align-items: center;
162
+  .left {
163
+    display: flex;
164
+    align-items: baseline;
165
+    img {
166
+      height: 35px;
167
+      position: relative;
168
+      top: 5px;
169
+    }
170
+    span {
171
+      font-size: 20px;
172
+      color: #fff;
173
+      margin-left: 40px;
174
+      position: relative;
175
+      top: 2px;
176
+    }
177
+  }
145 178
   .right {
146 179
     display: flex;
147 180
     align-items: center;
148 181
     img {
149
-      width: 50px;
150
-      height: 50px;
182
+      width: 30px;
183
+      height: 30px;
151 184
       border-radius: 50%;
152 185
       margin-right: 10px;
153 186
     }

+ 37
- 28
src/pages/main/management/management.vue View File

@@ -1,6 +1,6 @@
1 1
 <template>
2 2
   <div>
3
-    <Button type="success" style="margin-bottom:20px;" @click="showAdd = true">新增</Button>
3
+    <Button type="error" style="margin-bottom:20px;" @click="showAdd = true">新增</Button>
4 4
     <Table border :columns="managementColumns" :data="managementList"></Table>
5 5
     <div class="page">
6 6
       <Page :total="total" :pageSize='pageSize' :current='current' @on-change='changePage' show-elevator />
@@ -13,22 +13,20 @@
13 13
       </div>
14 14
     </Modal>
15 15
     <Modal title="公众平台账号授权" v-model="pop.show" :mask-closable="false">
16
-      <div class="qrcode">
17
-        <Button type="success" class="reflsh">刷新</Button>
18
-        <img src="" alt="">
19
-        <span>使用公众平台绑定的管理员个人微信号扫描</span>
16
+      <div class="qrcode" v-if="wechatConfig.ConfId">
17
+        <img v-if="wechatConfig.HeadImg" :src="wechatConfig.HeadImg" alt="">
18
+        <img v-else :src="defultHead" alt="">
19
+        <p>公众号名称:{{wechatConfig.NickName}}</p>
20 20
       </div>
21
-      <div class="select">
22
-        <div>扫码后点击刷新按钮,选择您想要绑定的公众号进行绑定</div>
23
-        <!-- <Select v-model="model1" style="width:300px">
24
-          <Option v-for="item in cityList" :value="item.value" :key="item.value">{{ item.label }}</Option>
25
-        </Select> -->
21
+      <div slot="footer">
22
+        <Button type="primary" @click="check">点击确认授权</Button>
26 23
       </div>
27 24
     </Modal>
28 25
   </div>
29 26
 </template>
30 27
 
31 28
 <script>
29
+import defultHead from '@/assets/defultHead.png'
32 30
 import { createNamespacedHelpers } from 'vuex'
33 31
 const { mapState: mapManagementState, mapActions: mapManagementActions } = createNamespacedHelpers('management')
34 32
 export default {
@@ -37,6 +35,7 @@ export default {
37 35
       pageSize: 10,
38 36
       showAdd: false,
39 37
       name: '',
38
+      defultHead,
40 39
       pop: {
41 40
         show: false,
42 41
       },
@@ -89,9 +88,12 @@ export default {
89 88
               }, '授权') : '',
90 89
               h('Button', {
91 90
                 props: {
92
-                  type: 'error',
93 91
                   size: 'default'
94 92
                 },
93
+                style: {
94
+                  'background': '#808695',
95
+                  'color': '#fff'
96
+                },
95 97
                 on: {
96 98
                   click: () => { this.delete(params) }
97 99
                 }
@@ -104,18 +106,25 @@ export default {
104 106
   },
105 107
   created () {
106 108
     this.getManagementList({ page: this.current, pagesize: this.pageSize })
107
-    console.log(this.$route.query)
109
+    if (this.$route.query.auth_code) {
110
+      this.setAuthcode({ code: this.$route.query.auth_code }).then(() => {
111
+        if (this.wechatConfig.ConfId) {
112
+          this.pop.show = true
113
+        }
114
+      })
115
+    }
108 116
   },
109 117
   computed: {
110 118
     ...mapManagementState({
111 119
       managementList: item => item.managementList,
112 120
       current: item => item.current,
113 121
       total: item => item.total,
114
-      authData: item => item.authData
122
+      authData: item => item.authData,
123
+      wechatConfig: item => item.wechatConfig
115 124
     })
116 125
   },
117 126
   methods: {
118
-    ...mapManagementActions(['getManagementList', 'addManagement', 'deleteManagement', 'changeCurrent', 'authcode']),
127
+    ...mapManagementActions(['getManagementList', 'addManagement', 'deleteManagement', 'changeCurrent', 'authcode', 'setAuthcode', 'checkAuth']),
119 128
     submit () {
120 129
       if (!this.name) {
121 130
         this.$Message.warning('请输入项目名称')
@@ -134,6 +143,10 @@ export default {
134 143
       this.showAdd = false
135 144
     },
136 145
     delete (info) {
146
+      if (info.row.AuthStatus === 'yes') {
147
+        this.$Message.error('当前项目已被用户绑定,请先进行解绑操作')
148
+        return
149
+      }
137 150
       this.$Modal.confirm({
138 151
         title: '警告',
139 152
         content: `<p style='font-size:18px;'>确认删除此项目?<p>`,
@@ -156,9 +169,16 @@ export default {
156 169
     auth (params) {
157 170
       // this.pop.show = true
158 171
       this.authcode().then(() => {
159
-        let url = encodeURIComponent(`${window.location.href}?OrgId=${params.row.OrgId}`)
172
+        let url = encodeURIComponent(`${window.location.origin}${window.location.pathname}${window.location.hash}?OrgId=${params.row.OrgId}`)
160 173
         window.location.href = `https://mp.weixin.qq.com/cgi-bin/componentloginpage?component_appid=${this.authData.appid}&pre_auth_code=${this.authData.code}&redirect_uri=${url}&auth_type=1`
161
-
174
+      })
175
+    },
176
+    check () {
177
+      this.checkAuth({ orgid: this.$route.query.OrgId, confid: this.wechatConfig.ConfId }).then(() => {
178
+        this.$Message.success('绑定成功')
179
+        this.pop.show = false
180
+        this.changePage(1)
181
+        this.getManagementList({ page: this.current, pagesize: this.pageSize })
162 182
       })
163 183
     }
164 184
   }
@@ -173,7 +193,6 @@ export default {
173 193
   flex-flow: column nowrap;
174 194
   justify-content: center;
175 195
   align-items: center;
176
-  border: 1px solid #ddd;
177 196
   margin: 0 auto;
178 197
   img {
179 198
     width: 150px;
@@ -181,19 +200,9 @@ export default {
181 200
     margin: 10px;
182 201
   }
183 202
   p {
203
+    margin-top: 20px;
184 204
     text-align: center;
185 205
   }
186
-  .reflsh {
187
-    position: absolute;
188
-    top: 60px;
189
-    left: 10px;
190
-  }
191
-}
192
-.select {
193
-  text-align: center;
194
-  div {
195
-    margin-top: 10px;
196
-  }
197 206
 }
198 207
 </style>
199 208
 

+ 3
- 3
src/pages/main/menuConfig/menuConfig.vue View File

@@ -55,7 +55,7 @@ export default {
55 55
     }
56 56
   },
57 57
   created () {
58
-    this.getMenu()
58
+    this.getWechatMenu()
59 59
   },
60 60
   computed: {
61 61
     ...mapMenuConfigState({
@@ -67,7 +67,7 @@ export default {
67 67
     menuForm
68 68
   },
69 69
   methods: {
70
-    ...mapMenuConfigActions(['getMenu', 'AddMainMenu', 'SetMainMenu', 'AddSubMenu', 'SetSubMenu', 'mainActive', 'subActive', 'mainPlusActive', 'subPlusActive', 'clear', 'submitMenu']),
70
+    ...mapMenuConfigActions(['getWechatMenu', 'AddMainMenu', 'SetMainMenu', 'AddSubMenu', 'SetSubMenu', 'mainActive', 'subActive', 'mainPlusActive', 'subPlusActive', 'clear', 'setWechatMenu']),
71 71
     chengeForm (hasContent, hasDelete) {
72 72
       this.formActive = false
73 73
       this.hasContent = hasContent
@@ -156,7 +156,7 @@ export default {
156 156
       this.SetSubMenu(data)
157 157
     },
158 158
     submit () {
159
-      this.submitMenu()
159
+      this.setWechatMenu()
160 160
     }
161 161
   }
162 162
 }

+ 1
- 1
src/pages/main/reply/reply.vue View File

@@ -6,7 +6,7 @@
6 6
           <label>用户通过发送关键词来触发回复</label>
7 7
           <i-switch v-model="keywordSwitch" @on-change="changeKey"/>
8 8
           <div class="add">
9
-            <Button type="primary" @click="edit">新增</Button>
9
+            <Button type="error" @click="edit">新增</Button>
10 10
           </div>
11 11
           <Table border :columns="keywordColumns" :data="keywordList"></Table>
12 12
         </div>

+ 2
- 2
src/pages/main/user/user.vue View File

@@ -1,6 +1,6 @@
1 1
 <template>
2 2
   <div>
3
-    <Button type="success" style="margin-bottom:20px;" @click="editUser">新增</Button>
3
+    <Button type="error" style="margin-bottom:20px;" @click="editUser">新增</Button>
4 4
     <Table border :columns="userColumns" :data="userList"></Table>
5 5
     <div class="page">
6 6
       <Page :total="total" :pageSize='pageSize' :current='current' @on-change='changePage' show-elevator />
@@ -96,7 +96,7 @@ export default {
96 96
               }, params.row.OrgId ? '取消绑定' : '绑定'),
97 97
               h('Button', {
98 98
                 props: {
99
-                  type: 'error',
99
+                  type: 'success',
100 100
                   size: 'default'
101 101
                 },
102 102
                 on: {

+ 8
- 2
src/router/index.js View File

@@ -2,7 +2,8 @@
2 2
 import Vue from 'vue'
3 3
 import Router from 'vue-router'
4 4
 import routerData from './router'
5
-// import store from './../store/index'
5
+import store from './../store/index'
6
+// import { Message } from 'iview'
6 7
 
7 8
 Vue.use(Router)
8 9
 
@@ -35,7 +36,12 @@ const router = new Router({
35 36
 })
36 37
 
37 38
 router.beforeEach((to, from, next) => {
38
-  // store.commit('updateBread', { routerData, Url: to.name })
39
+  console.log(store.state.main.isBind)
40
+  console.log(to)
41
+  console.log(from)
42
+  if (to.name !== 'login' && !store.state.main.isBind) {
43
+    // Message.warning('请先通知管理员绑定项目,再进行微信配置')
44
+  }
39 45
   next()
40 46
 })
41 47
 

+ 19
- 2
src/store/main.js View File

@@ -5,7 +5,8 @@ export default {
5 5
   namespaced: true,
6 6
   state: {
7 7
     menuData: [],
8
-    userInfo: {}
8
+    userInfo: {},
9
+    isBind: false
9 10
   },
10 11
   mutations: {
11 12
     updateMenu (state, data) {
@@ -13,7 +14,10 @@ export default {
13 14
     },
14 15
     updateUserInfo (state, data) {
15 16
       state.userInfo = data || {}
16
-    }
17
+    },
18
+    updateIsBind (state, data) {
19
+      state.isBind = data
20
+    },
17 21
   },
18 22
   actions: {
19 23
     login (context, data) {
@@ -52,6 +56,9 @@ export default {
52 56
         }).catch(reject)
53 57
       })
54 58
     },
59
+    clearMenu (context) {
60
+      context.commit('updateMenu', '')
61
+    },
55 62
     getUserInfo (context) {
56 63
       return new Promise((resolve, reject) => {
57 64
         ajax({
@@ -75,5 +82,15 @@ export default {
75 82
         }).catch(reject)
76 83
       })
77 84
     },
85
+    checkBind (context) {
86
+      return new Promise((resolve, reject) => {
87
+        ajax({
88
+          ...api.common.checkBind
89
+        }).then((res) => {
90
+          context.commit('updateIsBind', res)
91
+          resolve()
92
+        }).catch(reject)
93
+      })
94
+    },
78 95
   }
79 96
 }

+ 32
- 2
src/store/management.js View File

@@ -7,7 +7,8 @@ export default {
7 7
     managementList: [],
8 8
     current: 1,
9 9
     total: 0,
10
-    authData: {}
10
+    authData: {},
11
+    wechatConfig: {}
11 12
   },
12 13
   mutations: {
13 14
     updateManagementList (state, data) {
@@ -20,6 +21,9 @@ export default {
20 21
     updateAuthData (state, data) {
21 22
       state.authData = data || {}
22 23
     },
24
+    updateWechatConfig (state, data) {
25
+      state.wechatConfig = data
26
+    },
23 27
   },
24 28
   actions: {
25 29
     getManagementList (context, data) {
@@ -65,7 +69,6 @@ export default {
65 69
       context.commit('updateCurrent', data)
66 70
     },
67 71
     authcode (context) {
68
-      console.log(context)
69 72
       return new Promise((resolve, reject) => {
70 73
         ajax({
71 74
           ...api.management.authcode
@@ -74,6 +77,33 @@ export default {
74 77
           resolve()
75 78
         }).catch(reject)
76 79
       })
80
+    },
81
+    setAuthcode (context, data) {
82
+      console.log(context)
83
+      return new Promise((resolve, reject) => {
84
+        ajax({
85
+          ...api.management.setAuthcode,
86
+          urlData: {
87
+            ...data
88
+          }
89
+        }).then((res) => {
90
+          context.commit('updateWechatConfig', res)
91
+          resolve()
92
+        }).catch(reject)
93
+      })
94
+    },
95
+    checkAuth (context, data) {
96
+      console.log(context)
97
+      return new Promise((resolve, reject) => {
98
+        ajax({
99
+          ...api.management.checkAuth,
100
+          urlData: {
101
+            ...data
102
+          }
103
+        }).then(() => {
104
+          resolve()
105
+        }).catch(reject)
106
+      })
77 107
     }
78 108
   }
79 109
 }

+ 28
- 51
src/store/material.js View File

@@ -17,53 +17,20 @@ export default {
17 17
   },
18 18
   actions: {
19 19
     getImg (context, data) {
20
-      // return new Promise((resolve, reject) => {
21
-      //   ajax({
22
-      //     ...api.common.login,
23
-      //     data: {
24
-      //       ...data,
25
-      //     }
26
-      //   }).then(res => {
27
-      //     context.commit('updateList', res)
28
-      //     resolve(res)
29
-      //   }).catch(reject)
30
-      // })
31
-      data = [
32
-        {
33
-          "type": "media_id",
34
-          "name": "图片",
35
-          "media_id": "MEDIA_ID1",
36
-          url: 'http://mmbiz.qpic.cn/mmbiz_jpg/PiajxSqBRaEIQxibpLbyuSK4TssiajqknJS6dACV5IoTxppdoyfGEYScCFMqV3dgFzf2tGqy2IiciaysTlaZt6zchibA/0?wx_fmt=jpeg'
37
-        },
38
-        {
39
-          "type": "media_id",
40
-          "name": "图片",
41
-          "media_id": "MEDIA_ID1",
42
-          url: 'http://mmbiz.qpic.cn/mmbiz_jpg/PiajxSqBRaEIQxibpLbyuSK4TssiajqknJS6dACV5IoTxppdoyfGEYScCFMqV3dgFzf2tGqy2IiciaysTlaZt6zchibA/0?wx_fmt=jpeg'
43
-        },
44
-        {
45
-          "type": "media_id",
46
-          "name": "图片",
47
-          "media_id": "MEDIA_ID1",
48
-          url: 'http://mmbiz.qpic.cn/mmbiz_jpg/PiajxSqBRaEIQxibpLbyuSK4TssiajqknJS6dACV5IoTxppdoyfGEYScCFMqV3dgFzf2tGqy2IiciaysTlaZt6zchibA/0?wx_fmt=jpeg'
49
-        },
50
-        {
51
-          "type": "media_id",
52
-          "name": "图片",
53
-          "media_id": "MEDIA_ID1",
54
-          url: 'http://mmbiz.qpic.cn/mmbiz_jpg/PiajxSqBRaEIQxibpLbyuSK4TssiajqknJS6dACV5IoTxppdoyfGEYScCFMqV3dgFzf2tGqy2IiciaysTlaZt6zchibA/0?wx_fmt=jpeg'
55
-        },
56
-        {
57
-          "type": "media_id",
58
-          "name": "图片",
59
-          "media_id": "MEDIA_ID1",
60
-          url: 'http://mmbiz.qpic.cn/mmbiz_jpg/PiajxSqBRaEIQxibpLbyuSK4TssiajqknJS6dACV5IoTxppdoyfGEYScCFMqV3dgFzf2tGqy2IiciaysTlaZt6zchibA/0?wx_fmt=jpeg'
61
-        },
62
-      ]
63
-      data.forEach((curr) => {
64
-        curr.checked = false
20
+      return new Promise((resolve, reject) => {
21
+        ajax({
22
+          ...api.material.getImg,
23
+          urlData: {
24
+            ...data,
25
+          }
26
+        }).then(res => {
27
+          // data.forEach((curr) => {
28
+          //   curr.checked = false
29
+          // })
30
+          context.commit('updateImg', res)
31
+          resolve(res)
32
+        }).catch(reject)
65 33
       })
66
-      context.commit('updateImg', data)
67 34
     },
68 35
     getView (context, data) {
69 36
       // return new Promise((resolve, reject) => {
@@ -109,9 +76,9 @@ export default {
109 76
       console.log(context)
110 77
       return new Promise((resolve, reject) => {
111 78
         ajax({
112
-          ...api.common.login,
113
-          data: {
114
-            ...data,
79
+          ...api.material.deleteImg,
80
+          urlData: {
81
+            ...data
115 82
           }
116 83
         }).then(() => {
117 84
           resolve()
@@ -122,14 +89,24 @@ export default {
122 89
       console.log(context)
123 90
       return new Promise((resolve, reject) => {
124 91
         ajax({
125
-          ...api.common.login,
92
+          ...api.material.addImg,
126 93
           data: {
127
-            ...data,
94
+            ...data
128 95
           }
129 96
         }).then(() => {
130 97
           resolve()
131 98
         }).catch(reject)
132 99
       })
100
+    },
101
+    reflshImg (context) {
102
+      console.log(context)
103
+      return new Promise((resolve, reject) => {
104
+        ajax({
105
+          ...api.material.reflshImg
106
+        }).then(() => {
107
+          resolve()
108
+        }).catch(reject)
109
+      })
133 110
     }
134 111
   }
135 112
 }

+ 84
- 95
src/store/menuConfig.js View File

@@ -1,8 +1,14 @@
1 1
 import ajax from '../util/ajax'
2 2
 import api from '../util/api'
3
+import Vue from 'vue'
3 4
 const loop = (data, setTrue) => {
4 5
   let returnData = {}
5 6
   data.mainPlusActive = false
7
+  if (setTrue) {
8
+    if (setTrue.type === 1) {
9
+      data.mainPlusActive = true
10
+    }
11
+  }
6 12
   data.button.forEach((currentValue, index) => {
7 13
     currentValue.active = false
8 14
     currentValue.subPlusActive = false
@@ -23,8 +29,6 @@ const loop = (data, setTrue) => {
23 29
         if (index === setTrue.index) {
24 30
           currentValue.active = true
25 31
         }
26
-      } else if (setTrue.type === 1) {
27
-        data.mainPlusActive = false
28 32
       } else if (setTrue.type === 3) {
29 33
         if (index === setTrue.index) {
30 34
           currentValue.subPlusActive = true
@@ -42,7 +46,7 @@ const loop = (data, setTrue) => {
42 46
     }
43 47
     returnData.button.push(currentValue)
44 48
   })
45
-  return returnData
49
+  return JSON.parse(JSON.stringify(returnData))
46 50
 }
47 51
 
48 52
 export default {
@@ -59,27 +63,29 @@ export default {
59 63
     },
60 64
     updateAddMain (state, data) {
61 65
       state.menuJson.button.push(data)
66
+      Vue.set(state.menuJson.button, state.menuJson.button.lenght, data)
62 67
     },
63 68
     updateSetMain (state, data) {
64 69
       if (data.item) { // data有值时,为修改
65
-        state.menuJson.button.splice(data.index, 1, data.item)
70
+        Vue.set(state.menuJson.button, data.index, data.item)
71
+        // state.menuJson.button.splice(data.index, 1, data.item)
66 72
       } else { // data为空时,为删除
67 73
         state.menuJson.button.splice(data.index, 1)
68 74
       }
69 75
     },
70 76
     updateAddSub (state, data) {
71
-      let obj = {
72
-        ...state.menuJson.button[data.index],
73
-        sub_button: []
74
-      }
75 77
       if (!state.menuJson.button[data.index].sub_button) {
76
-        state.menuJson.button.splice(data.index, 1, obj)
78
+        Vue.set(state.menuJson.button, data.index, {
79
+          ...state.menuJson.button[data.index],
80
+          sub_button: []
81
+        })
77 82
       }
78 83
       state.menuJson.button[data.index].sub_button.push(data.item)
84
+      loop(state.menuJson)
79 85
     },
80 86
     updateSetSub (state, data) {
81 87
       if (data.item) { // data有值时,为修改
82
-        state.menuJson.button[data.parentIndex].sub_button.splice(data.index, 1, data.item)
88
+        Vue.set(state.menuJson.button[data.parentIndex].sub_button, data.index, data.item)
83 89
       } else { // data为空时,为删除
84 90
         state.menuJson.button[data.parentIndex].sub_button.splice(data.index, 1)
85 91
       }
@@ -104,85 +110,19 @@ export default {
104 110
     }
105 111
   },
106 112
   actions: {
107
-    getMenu (context) {
108
-      // return new Promise((resolve, reject) => {
109
-      //   ajax({
110
-      //     ...api.index.getWechatMenu,
111
-      //     data: {
112
-      //       ...data,
113
-      //     }
114
-      //   }).then(() => {
115
-      //     // context.commit('updateList', res)
116
-      //     resolve()
117
-      //   }).catch(reject)
118
-      // })
119
-      let button = [
120
-        {
121
-          'name': '扫码',
122
-          'sub_button': [
123
-            {
124
-              'type': 'scancode_waitmsg',
125
-              'name': '扫码代提示',
126
-              'key': 'reslfmenu_0_0'
127
-            },
128
-            {
129
-              'type': 'scancode_push',
130
-              'name': '扫码推事件',
131
-              'key': 'reslfmenu_0_1'
132
-            }
133
-          ]
134
-        },
135
-        {
136
-          'name': '发图',
137
-          'sub_button': [
138
-            {
139
-              'type': 'pic_sysphoto',
140
-              'name': '系统拍照发图',
141
-              'key': 'reslfmenu_1_0'
142
-            },
143
-            {
144
-              'type': 'pic_photo_or_album',
145
-              'name': '拍照或相册发图',
146
-              'key': 'reslfmenu_1_1'
147
-            },
148
-            {
149
-              'type': 'pic_weixin',
150
-              'name': '微信相册发图',
151
-              'key': 'reslfmenu_1_2'
152
-            }
153
-          ]
154
-        },
155
-        {
156
-          'name': '菜单',
157
-          'sub_button': [
158
-            {
159
-              'type': 'view',
160
-              'name': '百度',
161
-              'url': 'http://www.baidu.com'
162
-            },
163
-            {
164
-              'type': 'view',
165
-              'name': '我的主页',
166
-              'url': 'http://www.tongtianguanriz.com/index.html'
167
-            },
168
-            {
169
-              'type': 'click',
170
-              'name': '为我们点赞!',
171
-              'key': 'V1001_GOOD'
172
-            }
173
-          ]
174
-        }
175
-      ]
176
-      // button.forEach((currentValue) => {
177
-      //   currentValue.active = false
178
-      //   currentValue.subPlusActive = false
179
-      //   if (currentValue.sub_button) {
180
-      //     currentValue.sub_button.forEach((curr) => {
181
-      //       curr.active = false
182
-      //     })
183
-      //   }
184
-      // })
185
-      context.commit('updateMenu', loop({ button }))
113
+    getWechatMenu (context) {
114
+      return new Promise((resolve, reject) => {
115
+        ajax({
116
+          ...api.wechatMenu.getWechatMenu
117
+        }).then((res) => {
118
+          let button = []
119
+          if (res) {
120
+            button = res.menu.button
121
+          }
122
+          context.commit('updateMenu', loop({ button }))
123
+          resolve()
124
+        }).catch(reject)
125
+      })
186 126
     },
187 127
     clear (context) {
188 128
       context.commit('clearMenu')
@@ -211,10 +151,13 @@ export default {
211 151
     subPlusActive (context, data) {
212 152
       context.commit('updateSubPlusActive', data)
213 153
     },
214
-    submitMenu (context) {
215
-      let submitData = context.state.menuJson
216
-      delete submitData['mainPlusActive']
217
-      submitData.button.forEach((currentValue) => {
154
+    setWechatMenu (context) {
155
+      let submitData = {
156
+        menu: {}
157
+      }
158
+      submitData.menu = context.state.menuJson
159
+      delete submitData.menu['mainPlusActive']
160
+      submitData.menu.button.forEach((currentValue) => {
218 161
         delete currentValue['active']
219 162
         delete currentValue['subPlusActive']
220 163
         if (currentValue.sub_button) {
@@ -223,10 +166,56 @@ export default {
223 166
           })
224 167
         }
225 168
       })
169
+      let str = JSON.stringify(submitData)
170
+      // let str = JSON.stringify(
171
+      //   {
172
+      //     "menu": {
173
+      //       "button": [
174
+      //         {
175
+      //           "type": "view",
176
+      //           "name": "业主门禁",
177
+      //           "url": "https://www.haina.com/m/eed980b4a3b3f8213c21a29f9ca8f407/index",
178
+      //           "sub_button": []
179
+      //         },
180
+      //         {
181
+      //           "type": "view",
182
+      //           "name": "物业费",
183
+      //           "url": "https://www.haina.com/m/eed980b4a3b3f8213c21a29f9ca8f407/cp/agrOkGbiO7vMYOamjd",
184
+      //           "sub_button": []
185
+      //         },
186
+      //         {
187
+      //           "name": "城的空间",
188
+      //           "sub_button": [
189
+      //             {
190
+      //               "type": "view",
191
+      //               "name": "C端",
192
+      //               "url": "http://dev.ycjcjy.com/c/",
193
+      //               "sub_button": []
194
+      //             },
195
+      //             {
196
+      //               "type": "view",
197
+      //               "name": "邻里圈",
198
+      //               "url": "https://www.haina.com/m/eed980b4a3b3f8213c21a29f9ca8f407/cp/agVvBQGsWwDJ5nz3kb",
199
+      //               "sub_button": []
200
+      //             },
201
+      //             {
202
+      //               "type": "view",
203
+      //               "name": "另外一个缴费",
204
+      //               "url": "https://www.haina.com/m/eed980b4a3b3f8213c21a29f9ca8f407/cp/agvBQ95cWlrpa7mOBb",
205
+      //               "sub_button": []
206
+      //             }
207
+      //           ]
208
+      //         }
209
+      //       ]
210
+      //     }
211
+      //   }
212
+      // )
226 213
       return new Promise((resolve, reject) => {
227 214
         ajax({
228
-          ...api.index.getWechatMenu,
229
-          data: submitData
215
+          ...api.wechatMenu.setWechatMenu,
216
+          data: {
217
+            WechatJson: str
218
+          }
230 219
         }).then(() => {
231 220
           resolve()
232 221
         }).catch(reject)

+ 41
- 1
src/util/api.js View File

@@ -22,6 +22,20 @@ const $api = {
22 22
     getProjectList: { // 获取项目列表
23 23
       url: `${baseUrl}${admin}/sysorg`,
24 24
       method: 'get'
25
+    },
26
+    checkBind: { // 验证用户是否绑定项目
27
+      url: `${baseUrl}${admin}/sysuser/auth`,
28
+      method: 'get'
29
+    }
30
+  },
31
+  wechatMenu: {
32
+    getWechatMenu: { // 获取微信菜单
33
+      url: `${baseUrl}${admin}/wechatmenu`,
34
+      method: 'get'
35
+    },
36
+    setWechatMenu: { // 设置微信菜单
37
+      url: `${baseUrl}${admin}/wechatmenu`,
38
+      method: 'put'
25 39
     }
26 40
   },
27 41
   user: {
@@ -73,7 +87,15 @@ const $api = {
73 87
     },
74 88
     authcode: { // 项目授权
75 89
       url: `${baseUrl}${admin}/authcode`,
76
-      method: 'post'
90
+      method: 'get'
91
+    },
92
+    setAuthcode: { // 发送项目授权码
93
+      url: `${baseUrl}${admin}/wechat/conf/:code`,
94
+      method: 'get'
95
+    },
96
+    checkAuth: { // 确认项目授权
97
+      url: `${baseUrl}${admin}/sysorg/:orgid/:confid`,
98
+      method: 'put'
77 99
     }
78 100
   },
79 101
   reply: {
@@ -101,6 +123,24 @@ const $api = {
101 123
       url: `${baseUrl}${admin}/autoreply/isUse/:autoType/:isUse`,
102 124
       method: 'put'
103 125
     }
126
+  },
127
+  material: {
128
+    getImg: { // 获取素材库图片
129
+      url: `${baseUrl}${admin}/material/:type`,
130
+      method: 'get'
131
+    },
132
+    addImg: { // 新增素材库图片
133
+      url: `${baseUrl}${admin}/material/image/save`,
134
+      method: 'post'
135
+    },
136
+    deleteImg: { // 删除素材库图片
137
+      url: `${baseUrl}${admin}/material/:mediaId`,
138
+      method: 'delete'
139
+    },
140
+    reflshImg: { // 刷新素材库图片
141
+      url: `${baseUrl}${admin}/material/:type/sync`,
142
+      method: 'post'
143
+    }
104 144
   }
105 145
 }
106 146
 export default $api

+ 3
- 3
vue.config.js View File

@@ -6,9 +6,9 @@ module.exports = {
6 6
   devServer: {
7 7
     proxy: {
8 8
       '/api': {
9
-        // target: 'https://dp.huiju360.com.cn/hj_operations',
10
-        // target: 'http://192.168.0.62:8080', // wf
11
-        target: 'http://192.168.0.102:8080', // hyq
9
+        // target: 'http://wechatconfig.ycjcjy.com',
10
+        target: 'http://192.168.0.62:8080', // wf
11
+        // target: 'http://192.168.0.102:8080', // hyq
12 12
         // target: 'http://192.168.0.11', // ys
13 13
         // target: 'http://dev.ycjcjy.com', // frp
14 14
         changeOrigin: true, // 如果接口跨域,需要进行这个参数配置