浏览代码

Merge branch 'master' of http://git.ycjcjy.com/xuchengxiang/niucai-user into master

张延森 4 年前
父节点
当前提交
6e4eab4ddb

+ 1
- 1
index.html 查看文件

5
   <meta charset='utf-8'>
5
   <meta charset='utf-8'>
6
   <meta content='width=device-width,initial-scale=1,maximum-scale=1,user-scalable=0' name='viewport'>
6
   <meta content='width=device-width,initial-scale=1,maximum-scale=1,user-scalable=0' name='viewport'>
7
   <meta name="referrer" content="no-referrer">
7
   <meta name="referrer" content="no-referrer">
8
-  <link rel="stylesheet" href="//at.alicdn.com/t/font_2022160_eo4jmbtg5ek.css">
8
+  <link rel="stylesheet" href="//at.alicdn.com/t/font_2022160_zgncjv2mcd.css">
9
   <title>牛彩</title>
9
   <title>牛彩</title>
10
   <script>
10
   <script>
11
     let Width = document.documentElement.clientWidth / 375 * 100
11
     let Width = document.documentElement.clientWidth / 375 * 100

+ 2
- 0
src/components/common/MainPageContainer/index.vue 查看文件

155
         } else {
155
         } else {
156
           this.$router.push({ name: 'SignIn' })
156
           this.$router.push({ name: 'SignIn' })
157
         }
157
         }
158
+      } else {
159
+        this.$emit('UserInfoChange')
158
       }
160
       }
159
     }
161
     }
160
   }
162
   }

+ 61
- 5
src/pages/WoDe/AnQuanZhongXin/BangDingShouJi/index.vue 查看文件

7
             <i class="iconfont iconshouji"></i>
7
             <i class="iconfont iconshouji"></i>
8
             <div class="flex-item">
8
             <div class="flex-item">
9
               <div>
9
               <div>
10
-                <input type="number" placeholder="请输入您的手机号码">
10
+                <input type="number" placeholder="请输入您的手机号码" v-model="Phone">
11
               </div>
11
               </div>
12
             </div>
12
             </div>
13
           </li>
13
           </li>
15
             <i class="iconfont iconmima"></i>
15
             <i class="iconfont iconmima"></i>
16
             <div class="flex-item">
16
             <div class="flex-item">
17
               <div>
17
               <div>
18
-                <input type="number" placeholder="请输入验证码">
18
+                <input type="number" placeholder="请输入验证码" v-model="Code">
19
               </div>
19
               </div>
20
             </div>
20
             </div>
21
-            <a>获取验证码</a>
22
-            <span>59s后重新获取</span>
21
+            <a v-if="TimeNum === 60" @click="GetCode">获取验证码</a>
22
+            <span v-else>{{TimeNum > 9 ? TimeNum : `0${TimeNum}`}}s后重新获取</span>
23
           </li>
23
           </li>
24
         </ul>
24
         </ul>
25
         <div class="Btn">
25
         <div class="Btn">
26
-          <a>立即绑定</a>
26
+          <a @click="BindPhone">立即绑定</a>
27
         </div>
27
         </div>
28
       </div>
28
       </div>
29
     </MainPageContainer>
29
     </MainPageContainer>
32
 
32
 
33
 <script>
33
 <script>
34
 import MainPageContainer from '../../../../components/common/MainPageContainer'
34
 import MainPageContainer from '../../../../components/common/MainPageContainer'
35
+import { createNamespacedHelpers } from 'vuex'
36
+const { mapState: mapUserState, mapActions: mapUserActions, mapMutations: mapUserMutations } = createNamespacedHelpers('user')
35
 export default {
37
 export default {
36
   name: '',
38
   name: '',
37
   data () {
39
   data () {
38
     return {
40
     return {
41
+      Phone: '',
42
+      Code: '',
43
+      DataLock: false,
44
+      Timer: null,
45
+      TimeNum: 60
39
     }
46
     }
40
   },
47
   },
41
   computed: {
48
   computed: {
49
+    ...mapUserState({
50
+      UserInfo: x => x.UserInfo
51
+    })
42
   },
52
   },
43
   components: {
53
   components: {
44
     MainPageContainer
54
     MainPageContainer
50
     })
60
     })
51
   },
61
   },
52
   methods: {
62
   methods: {
63
+    ...mapUserMutations([
64
+      'EditUserInfo'
65
+    ]),
66
+    ...mapUserActions([
67
+      'GetRegPhoneCode',
68
+      'UpdateUserInfo',
69
+      'CheckRegPhoneCode'
70
+    ]),
71
+    BindPhone () { // 绑定手机
72
+      if (this.DataLock) return
73
+      this.DataLock = true
74
+      this.CheckRegPhoneCode({ urlData: { phone: this.Phone }, queryData: { captcha: this.Code } }).then((res) => {
75
+        this.UpdateUserInfo({ urlData: { id: this.UserInfo.customerId }, data: { phone: this.Phone } }).then(() => {
76
+          this.Toast('手机绑定成功')
77
+          this.EditUserInfo({ name: 'phone', value: this.Phone })
78
+          this.DataLock = false
79
+          this.$router.go(-1)
80
+        })
81
+      })
82
+    },
83
+    GetCode () { // 获取手机验证码
84
+      if (this.DataLock || this.TimeNum !== 60 || !this.IsPhone(this.Phone)) return
85
+      this.DataLock = false
86
+      window.clearInterval(this.Timer)
87
+      this.GetRegPhoneCode({ urlData: { phone: this.Phone } }).then(() => {
88
+        this.DataLock = false
89
+        if (this.TimeNum === 60) {
90
+          this.TimeNum -= 1
91
+        }
92
+        this.Timer = window.setInterval(() => {
93
+          if (this.TimeNum) {
94
+            this.TimeNum -= 1
95
+          } else {
96
+            window.clearInterval(this.Timer)
97
+            this.TimeNum = 60
98
+          }
99
+        }, 1000)
100
+      }).catch((res) => {
101
+        this.Toast(res.data.message)
102
+        this.DataLock = false
103
+      })
104
+    },
105
+    IsPhone (str) { // 校验手机号
106
+      let myreg = /^[1][3,4,5,7,8][0-9]{9}$/
107
+      return !!myreg.test(str)
108
+    }
53
   }
109
   }
54
 }
110
 }
55
 </script>
111
 </script>

+ 10
- 14
src/pages/WoDe/AnQuanZhongXin/SubIndex/index.vue 查看文件

2
   <div class="Page">
2
   <div class="Page">
3
     <MainPageContainer :ShowMainHeader="true" :ShowMainHeaderBack="true" MainHeaderTitle="安全中心">
3
     <MainPageContainer :ShowMainHeader="true" :ShowMainHeaderBack="true" MainHeaderTitle="安全中心">
4
       <div class="PageContainer">
4
       <div class="PageContainer">
5
-        <ul>
6
-          <router-link tag="li" :to="{ name: 'YaoQingZhuCe' }" class="flex-h">
5
+        <ul v-if="UserInfo !== null">
6
+          <!-- <router-link tag="li" :to="{ name: 'YaoQingZhuCe' }" class="flex-h">
7
             <span class="flex-item">邀请注册</span>
7
             <span class="flex-item">邀请注册</span>
8
             <i class="iconfont iconjiantouright"></i>
8
             <i class="iconfont iconjiantouright"></i>
9
           </router-link>
9
           </router-link>
12
             <i class="iconfont iconjinggao"></i>
12
             <i class="iconfont iconjinggao"></i>
13
             <span>未绑定</span>
13
             <span>未绑定</span>
14
             <i class="iconfont iconjiantouright"></i>
14
             <i class="iconfont iconjiantouright"></i>
15
-          </li>
15
+          </li> -->
16
           <li class="flex-h">
16
           <li class="flex-h">
17
             <span class="flex-item">绑定支付宝</span>
17
             <span class="flex-item">绑定支付宝</span>
18
             <i class="iconfont iconjinggao"></i>
18
             <i class="iconfont iconjinggao"></i>
21
           </li>
21
           </li>
22
           <router-link tag="li" :to="{ name: 'BangDingShouJi' }" class="flex-h">
22
           <router-link tag="li" :to="{ name: 'BangDingShouJi' }" class="flex-h">
23
             <span class="flex-item">绑定手机号</span>
23
             <span class="flex-item">绑定手机号</span>
24
-            <i class="iconfont iconjinggao"></i>
25
-            <span>未绑定</span>
24
+            <i class="iconfont iconjinggao" v-if="UserInfo.phone === '' || UserInfo.phone === null"></i>
25
+            <span>{{UserInfo.phone || '未绑定'}}</span>
26
             <i class="iconfont iconjiantouright"></i>
26
             <i class="iconfont iconjiantouright"></i>
27
           </router-link>
27
           </router-link>
28
         </ul>
28
         </ul>
33
 
33
 
34
 <script>
34
 <script>
35
 import MainPageContainer from '../../../../components/common/MainPageContainer'
35
 import MainPageContainer from '../../../../components/common/MainPageContainer'
36
-import { mapMutations } from 'vuex'
36
+import { createNamespacedHelpers } from 'vuex'
37
+const { mapState: mapUserState } = createNamespacedHelpers('user')
37
 export default {
38
 export default {
38
   name: '',
39
   name: '',
39
   data () {
40
   data () {
41
     }
42
     }
42
   },
43
   },
43
   computed: {
44
   computed: {
45
+    ...mapUserState({
46
+      UserInfo: x => x.UserInfo
47
+    })
44
   },
48
   },
45
   components: {
49
   components: {
46
     MainPageContainer
50
     MainPageContainer
47
   },
51
   },
48
   created () {
52
   created () {
49
-    this.EditMainData([ // 配置页面框架数据
50
-      { name: 'ShowMainHeader', value: true },
51
-      { name: 'MainHeaderTitle', value: '安全中心' },
52
-      { name: 'ShowMainHeaderBack', value: true }
53
-    ])
54
   },
53
   },
55
   mounted () {
54
   mounted () {
56
     this.$nextTick(() => {
55
     this.$nextTick(() => {
57
     })
56
     })
58
   },
57
   },
59
   methods: {
58
   methods: {
60
-    ...mapMutations([
61
-      'EditMainData' // 配置页面框架数据
62
-    ])
63
   }
59
   }
64
 }
60
 }
65
 </script>
61
 </script>

+ 26
- 3
src/pages/WoDe/GeRenSheZhi/ZhangHuSheZhi/EditUserNick/index.vue 查看文件

1
 <template>
1
 <template>
2
   <div class="Page">
2
   <div class="Page">
3
-    <MainPageContainer :ShowMainHeader="true" :ShowMainHeaderBack="true" MainHeaderTitle="设置昵称">
3
+    <MainPageContainer :ShowMainHeader="true" :ShowMainHeaderBack="true" MainHeaderTitle="设置昵称" @UserInfoChange="Init">
4
       <div class="PageContainer">
4
       <div class="PageContainer">
5
         <div class="Form">
5
         <div class="Form">
6
-          <input type="text" placeholder="请输入2~12个字符">
6
+          <input type="text" placeholder="请输入2~12个字符" v-model="Name" @input="Name = Name.substring(0, 12)">
7
         </div>
7
         </div>
8
         <span>填写成功后不可更改</span>
8
         <span>填写成功后不可更改</span>
9
         <div class="Btn">
9
         <div class="Btn">
10
-          <a>确认</a>
10
+          <a @click="EditName">确认</a>
11
         </div>
11
         </div>
12
       </div>
12
       </div>
13
     </MainPageContainer>
13
     </MainPageContainer>
16
 
16
 
17
 <script>
17
 <script>
18
 import MainPageContainer from '../../../../../components/common/MainPageContainer'
18
 import MainPageContainer from '../../../../../components/common/MainPageContainer'
19
+import { createNamespacedHelpers } from 'vuex'
20
+const { mapState: mapUserState, mapActions: mapUserActions, mapMutations: mapUserMutations } = createNamespacedHelpers('user')
19
 export default {
21
 export default {
20
   name: '',
22
   name: '',
21
   data () {
23
   data () {
22
     return {
24
     return {
25
+      Name: ''
23
     }
26
     }
24
   },
27
   },
25
   computed: {
28
   computed: {
29
+    ...mapUserState({
30
+      UserInfo: x => x.UserInfo
31
+    })
26
   },
32
   },
27
   components: {
33
   components: {
28
     MainPageContainer
34
     MainPageContainer
34
     })
40
     })
35
   },
41
   },
36
   methods: {
42
   methods: {
43
+    ...mapUserMutations([
44
+      'EditUserInfo'
45
+    ]),
46
+    ...mapUserActions([
47
+      'UpdateUserInfo'
48
+    ]),
49
+    Init () {
50
+      this.Name = this.UserInfo.name
51
+    },
52
+    EditName () {
53
+      if (this.Name !== '') {
54
+        this.UpdateUserInfo({ urlData: { id: this.UserInfo.customerId }, data: { name: this.Name } }).then(() => {
55
+          this.Toast('昵称更新成功')
56
+          this.EditUserInfo({ name: 'name', value: this.Name })
57
+        })
58
+      }
59
+    }
37
   }
60
   }
38
 }
61
 }
39
 </script>
62
 </script>

+ 28
- 4
src/pages/WoDe/GeRenSheZhi/ZhangHuSheZhi/UserInfo/index.vue 查看文件

2
   <div class="Page">
2
   <div class="Page">
3
     <MainPageContainer :ShowMainHeader="true" :ShowMainHeaderBack="true" MainHeaderTitle="账户设置">
3
     <MainPageContainer :ShowMainHeader="true" :ShowMainHeaderBack="true" MainHeaderTitle="账户设置">
4
       <div class="PageContainer">
4
       <div class="PageContainer">
5
-        <ul>
6
-          <li class="flex-h">
5
+        <ul v-if="UserInfo !== null">
6
+          <li class="flex-h" @click="$refs.IconFile.click()">
7
             <span class="flex-item">头像</span>
7
             <span class="flex-item">头像</span>
8
             <div class="Icon">
8
             <div class="Icon">
9
-              <img src="" class="centerLabel cover" alt="">
9
+              <img :src="UserInfo.avatar" class="centerLabel cover" alt="">
10
             </div>
10
             </div>
11
             <i class="iconfont iconjiantouright"></i>
11
             <i class="iconfont iconjiantouright"></i>
12
+            <input type="file" ref="IconFile" @change="IconFileChange" style="display: none">
12
           </li>
13
           </li>
13
           <router-link tag="li" class="flex-h" :to="{name: 'EditUserNick'}">
14
           <router-link tag="li" class="flex-h" :to="{name: 'EditUserNick'}">
14
             <span class="flex-item">昵称</span>
15
             <span class="flex-item">昵称</span>
15
-            <span>未设置</span>
16
+            <span>{{UserInfo.name || '未设置'}}</span>
16
             <i class="iconfont iconjiantouright"></i>
17
             <i class="iconfont iconjiantouright"></i>
17
           </router-link>
18
           </router-link>
18
         </ul>
19
         </ul>
23
 
24
 
24
 <script>
25
 <script>
25
 import MainPageContainer from '../../../../../components/common/MainPageContainer'
26
 import MainPageContainer from '../../../../../components/common/MainPageContainer'
27
+import { createNamespacedHelpers } from 'vuex'
28
+const { mapState: mapUserState, mapActions: mapUserActions, mapMutations: mapUserMutations } = createNamespacedHelpers('user')
26
 export default {
29
 export default {
27
   name: '',
30
   name: '',
28
   data () {
31
   data () {
30
     }
33
     }
31
   },
34
   },
32
   computed: {
35
   computed: {
36
+    ...mapUserState({
37
+      UserInfo: x => x.UserInfo
38
+    })
33
   },
39
   },
34
   components: {
40
   components: {
35
     MainPageContainer
41
     MainPageContainer
41
     })
47
     })
42
   },
48
   },
43
   methods: {
49
   methods: {
50
+    ...mapUserMutations([
51
+      'EditUserInfo'
52
+    ]),
53
+    ...mapUserActions([
54
+      'ImgUpload',
55
+      'UpdateUserInfo'
56
+    ]),
57
+    IconFileChange (e) {
58
+      let aFormData = new FormData()
59
+      aFormData.append('file', e.target.files[0])
60
+      this.ImgUpload({ urlData: { plat: 'app' }, data: aFormData, headers: { 'Content-Type': 'multipart/form-data' } }).then((res) => {
61
+        this.$refs.IconFile.value = ''
62
+        this.UpdateUserInfo({ urlData: { id: this.UserInfo.customerId }, data: { avatar: res.data.data } }).then(() => {
63
+          this.Toast('头像更新成功')
64
+          this.EditUserInfo({ name: 'avatar', value: res.data.data })
65
+        })
66
+      })
67
+    }
44
   }
68
   }
45
 }
69
 }
46
 </script>
70
 </script>

+ 3
- 1
src/pages/index/DaLeTouDingDan/index.vue 查看文件

148
     ]),
148
     ]),
149
     ...mapUserActions([
149
     ...mapUserActions([
150
       'PostBetting',
150
       'PostBetting',
151
-      'GetStoreList'
151
+      'GetStoreList',
152
+      'CreateAliPayOrder'
152
     ]),
153
     ]),
153
     SelectStore (item) { // 选择店铺
154
     SelectStore (item) { // 选择店铺
154
       if (this.DataLock) return
155
       if (this.DataLock) return
197
         this.TotalPrize = 0
198
         this.TotalPrize = 0
198
         this.Multiple = 1
199
         this.Multiple = 1
199
         this.DataLock = false
200
         this.DataLock = false
201
+        // window.location.href = `/api/app/order/alipay/buylottery?orderId=${res.data.data.orderId}&returlURL=${encodeURIComponent(`http://www.baidu.com`)}&token=${window.localStorage.Jwt}`
200
       }).catch((res) => {
202
       }).catch((res) => {
201
         this.Toast(res.data.message)
203
         this.Toast(res.data.message)
202
         this.DataLock = false
204
         this.DataLock = false

+ 18
- 0
src/store/user/index.js 查看文件

42
     EmptyUserInfo (state) { // 清空用户信息
42
     EmptyUserInfo (state) { // 清空用户信息
43
       state.UserInfo = null
43
       state.UserInfo = null
44
     },
44
     },
45
+    EditUserInfo (state, data) { // 编辑用户信息
46
+      state.UserInfo[data.name] = data.value
47
+    },
45
     AddDaLeTouCart (state, data) { // 新增大乐透购物车
48
     AddDaLeTouCart (state, data) { // 新增大乐透购物车
46
       state.DaLeTouCart.push(data)
49
       state.DaLeTouCart.push(data)
47
     },
50
     },
111
     }
114
     }
112
   },
115
   },
113
   actions: {
116
   actions: {
117
+    CreateAliPayOrder (context, payload) { // 创建支付宝订单
118
+      return new Promise((resolve, reject) => {
119
+        ToolClass.Axios(resolve, reject, Api.CreateAliPayOrder, context, payload, 1000)
120
+      })
121
+    },
122
+    ImgUpload (context, payload) { // 上传图片
123
+      return new Promise((resolve, reject) => {
124
+        ToolClass.Axios(resolve, reject, Api.ImgUpload, context, payload, 1000)
125
+      })
126
+    },
127
+    UpdateUserInfo (context, payload) { // 更新用户信息
128
+      return new Promise((resolve, reject) => {
129
+        ToolClass.Axios(resolve, reject, Api.UpdateUserInfo, context, payload, 1000)
130
+      })
131
+    },
114
     CheckRegPhoneCode (context, payload) { // 校验注册手机验证码
132
     CheckRegPhoneCode (context, payload) { // 校验注册手机验证码
115
       return new Promise((resolve, reject) => {
133
       return new Promise((resolve, reject) => {
116
         ToolClass.Axios(resolve, reject, Api.CheckRegPhoneCode, context, payload, 1000)
134
         ToolClass.Axios(resolve, reject, Api.CheckRegPhoneCode, context, payload, 1000)

+ 13
- 1
src/util/Api.js 查看文件

2
 const prefix = process.env.NODE_ENV === 'production' ? '/api' : '/api'
2
 const prefix = process.env.NODE_ENV === 'production' ? '/api' : '/api'
3
 
3
 
4
 const $api = {
4
 const $api = {
5
+  CreateAliPayOrder: { // 创建支付宝订单
6
+    method: 'get',
7
+    url: `${prefix}/app/order/alipay/buylottery`
8
+  },
5
   SignIn: { // 登录
9
   SignIn: { // 登录
6
     method: 'post',
10
     method: 'post',
7
     url: `${prefix}/app/login`
11
     url: `${prefix}/app/login`
8
   },
12
   },
9
   GetBanner: { // 获取banner
13
   GetBanner: { // 获取banner
10
     method: 'get',
14
     method: 'get',
11
-    url: `${prefix}/app/ad`
15
+    url: `${prefix}/app/banner`
12
   },
16
   },
13
   GetFootballKeys: { // 获取足彩相关字典
17
   GetFootballKeys: { // 获取足彩相关字典
14
     method: 'get',
18
     method: 'get',
65
   GetMixData: { // 获取混合比赛数据
69
   GetMixData: { // 获取混合比赛数据
66
     method: 'get',
70
     method: 'get',
67
     url: `${prefix}/app/sport/mix-match`
71
     url: `${prefix}/app/sport/mix-match`
72
+  },
73
+  ImgUpload: { // 图片上传
74
+    method: 'post',
75
+    url: `${prefix}/:plat/image`
76
+  },
77
+  UpdateUserInfo: { // 更新用户信息
78
+    method: 'put',
79
+    url: `${prefix}/app/customer/:id`
68
   }
80
   }
69
 }
81
 }
70
 
82
 

+ 9
- 3
src/util/PublicMethod.js 查看文件

78
     if (window.localStorage.Jwt !== undefined && window.localStorage.JwtTime !== undefined && window.localStorage.JwtTime + 24 * 60 * 60 * 1000 >= Date.now()) { // 本地获取token
78
     if (window.localStorage.Jwt !== undefined && window.localStorage.JwtTime !== undefined && window.localStorage.JwtTime + 24 * 60 * 60 * 1000 >= Date.now()) { // 本地获取token
79
       Header['x-authorization-jwt'] = window.localStorage.Jwt
79
       Header['x-authorization-jwt'] = window.localStorage.Jwt
80
     }
80
     }
81
-    Axios({
81
+    if (payload.headers !== undefined) {
82
+      for (let key in payload.headers) {
83
+        Header[key] = payload.headers[key]
84
+      }
85
+    }
86
+    let aParams = {
82
       method: target.method,
87
       method: target.method,
83
       url: Url,
88
       url: Url,
84
-      data: { ...Data },
89
+      data: Data,
85
       headers: { ...Header }
90
       headers: { ...Header }
86
-    }).then(res => {
91
+    }
92
+    Axios({ ...aParams }).then(res => {
87
       const token = res.headers['x-authorization-jwt']
93
       const token = res.headers['x-authorization-jwt']
88
       if (token) { // 更新本地存储token
94
       if (token) { // 更新本地存储token
89
         window.localStorage.Jwt = token
95
         window.localStorage.Jwt = token