浏览代码

静态页面

xcx 4 年前
父节点
当前提交
d2a1cf8ba0
共有 6 个文件被更改,包括 294 次插入1 次删除
  1. 163
    0
      src/pages/ResetPassword/index.vue
  2. 114
    0
      src/pages/ResetPassword/page.scss
  3. 2
    0
      src/pages/SignIn/index.vue
  4. 5
    0
      src/router/index.js
  5. 5
    0
      src/store/user/index.js
  6. 5
    1
      src/util/Api.js

+ 163
- 0
src/pages/ResetPassword/index.vue 查看文件

@@ -0,0 +1,163 @@
1
+<template>
2
+  <div class="components MainPageContainer flex-v">
3
+
4
+    <!-- 头部 -->
5
+    <div class="MainHeaderPadding"></div>
6
+    <div class="MainHeader flex-h">
7
+      <a class="MainBack iconfont iconjiantouleft" @click="$router.back(-1)"></a>
8
+      <span class="MainTitle">
9
+        <span>找回密码</span>
10
+      </span>
11
+    </div>
12
+
13
+    <!-- 内容 -->
14
+    <div class="MainBody flex-item">
15
+      <div>
16
+        <div class="Form">
17
+          <div class="flex-h">
18
+            <span>手机号</span>
19
+            <div class="flex-item">
20
+              <input type="text" v-model="Phone" placeholder="请输入绑定手机号">
21
+            </div>
22
+          </div>
23
+          <div class="flex-h">
24
+            <span>验证码</span>
25
+            <div class="flex-item">
26
+              <input type="number" v-model="Code" placeholder="请输入手机验证码">
27
+            </div>
28
+            <a :class="{'active': Sec === 60}" @click="ToGetCode">{{Sec === 60 ? '获取验证码' : `${Sec > 9 ? Sec : `0${Sec}`}s后再次获取`}}</a>
29
+          </div>
30
+          <div class="flex-h">
31
+            <span>新密码</span>
32
+            <div class="flex-item">
33
+              <input type="password" v-model="Password" placeholder="请输入新密码">
34
+            </div>
35
+          </div>
36
+          <div class="flex-h">
37
+            <span>确认新密码</span>
38
+            <div class="flex-item">
39
+              <input type="password" v-model="PasswordAgain" placeholder="请再次输入新密码">
40
+            </div>
41
+          </div>
42
+          <div class="Btn">
43
+            <a @click="ToResetPassword">确认</a>
44
+          </div>
45
+        </div>
46
+      </div>
47
+    </div>
48
+
49
+  </div>
50
+</template>
51
+
52
+<script>
53
+import { createNamespacedHelpers } from 'vuex'
54
+const { mapActions: mapUserActions } = createNamespacedHelpers('user')
55
+export default {
56
+  name: '',
57
+  data () {
58
+    return {
59
+      Phone: '',
60
+      Code: '',
61
+      Password: '',
62
+      PasswordAgain: '',
63
+      DataLock: false,
64
+      Timer: null,
65
+      Sec: 60
66
+    }
67
+  },
68
+  computed: {
69
+  },
70
+  components: {
71
+  },
72
+  created () {
73
+  },
74
+  mounted () {
75
+    this.$nextTick(() => {
76
+    })
77
+  },
78
+  methods: {
79
+    ...mapUserActions([
80
+      'GetRegPhoneCode',
81
+      'CheckRegPhoneCode',
82
+      'ResetPassword'
83
+    ]),
84
+    Init () {
85
+    },
86
+    ToResetPassword () {
87
+      if (!this.IsPhone(this.Phone)) {
88
+        this.Toast('手机号格式错误')
89
+        return false
90
+      }
91
+      if (!this.IsPhone(this.Code === '')) {
92
+        this.Toast('请输入验证码')
93
+        return false
94
+      }
95
+      if (!this.IsPhone(this.Password === '')) {
96
+        this.Toast('请输入新密码')
97
+        return false
98
+      }
99
+      if (!this.IsPhone(this.PasswordAgain === '')) {
100
+        this.Toast('请确认新密码')
101
+        return false
102
+      }
103
+      if (!this.IsPhone(this.Password !== this.PasswordAgain)) {
104
+        this.Toast('两次密码输入不一致')
105
+        return false
106
+      }
107
+      if (this.DataLock) return
108
+      this.DataLock = true
109
+      this.ResetPassword({
110
+        data: {
111
+          captcha: this.Code,
112
+          password: this.Password,
113
+          phone: this.Phone
114
+        }
115
+      }).then(() => {
116
+        this.Toast('密码重置成功')
117
+        this.DataLock = false
118
+        window.setTimeout(() => {
119
+          this.$router.go(-1)
120
+        }, 1000)
121
+      }).catch((res) => {
122
+        this.Toast(res.data.message)
123
+        this.DataLock = false
124
+      })
125
+    },
126
+    IsPhone (str) { // 校验手机号
127
+      let myreg = /^[1][3,4,5,7,8][0-9]{9}$/
128
+      return !!myreg.test(str)
129
+    },
130
+    ToGetCode () {
131
+      if (!this.IsPhone(this.Phone)) {
132
+        this.Toast('手机号格式错误')
133
+        return false
134
+      }
135
+      if (this.Sec === 60 && !this.DataLock) {
136
+        this.DataLock = true
137
+        this.GetRegPhoneCode({ urlData: { phone: this.Phone } }).then(() => {
138
+          this.Toast('验证码已发送')
139
+          this.DataLock = false
140
+          window.clearInterval(this.Timer)
141
+          this.Sec -= 1
142
+          this.Timer = window.setInterval(() => {
143
+            if (this.Sec) {
144
+              this.Sec -= 1
145
+            } else {
146
+              this.Sec = 60
147
+              window.clearInterval(this.Timer)
148
+            }
149
+          }, 1000)
150
+        }).catch((res) => {
151
+          this.Toast(res.data.message)
152
+          this.DataLock = false
153
+        })
154
+      }
155
+    }
156
+  }
157
+}
158
+</script>
159
+
160
+<!-- Add "scoped" attribute to limit CSS to this component only -->
161
+<style lang="scss" scoped>
162
+@import "page.scss";
163
+</style>

+ 114
- 0
src/pages/ResetPassword/page.scss 查看文件

@@ -0,0 +1,114 @@
1
+.components.MainPageContainer {
2
+  width: 100%;
3
+  height: 100%;
4
+  position: relative;
5
+  overflow: hidden;
6
+  background: #f8f8f8;
7
+  > .MainHeaderPadding {
8
+    position: relative;
9
+    overflow: hidden;
10
+    background: #d91d36;
11
+  }
12
+  > .MainHeader {
13
+    position: relative;
14
+    overflow: hidden;
15
+    background: #d91d36;
16
+    > .MainTitle {
17
+      width: 100%;
18
+      display: block;
19
+      text-align: center;
20
+      height: 0.4rem;
21
+      white-space: nowrap;
22
+      position: relative;
23
+      z-index: 1;
24
+      > * {
25
+        display: inline-block;
26
+        vertical-align: middle;
27
+        line-height: 0.4rem;
28
+        font-size: 0.17rem;
29
+        color: #fff;
30
+      }
31
+    }
32
+    > a {
33
+      display: inline-block;
34
+      position: absolute;
35
+      z-index: 2;
36
+      color: #fff;
37
+      &.MainBack {
38
+        font-size: 0.18rem;
39
+        line-height: 0.4rem;
40
+        top: 0;
41
+        left: 0.15rem;
42
+      }
43
+    }
44
+  }
45
+  > .MainBody {
46
+    position: relative;
47
+    overflow: hidden;
48
+    > div {
49
+      position: absolute;
50
+      width: 100%;
51
+      position: absolute;
52
+      left: 0;
53
+      top: 0;
54
+      bottom: 0;
55
+      > .Form {
56
+        width: 100%;
57
+        height: 100%;
58
+        position: relative;
59
+        overflow-y: scroll;
60
+        -webkit-overflow-scrolling: touch;
61
+        > .flex-h {
62
+          align-items: center;
63
+          background: #fff;
64
+          padding: 0 0.15rem;
65
+          border-bottom: 0.01rem solid #f8f8f8;
66
+          > span {
67
+            min-width: 0.8rem;
68
+            font-size: 0.14rem;
69
+            color: #333;
70
+            line-height: 0.44rem;
71
+          }
72
+          > div {
73
+            position: relative;
74
+            overflow: hidden;
75
+            > input {
76
+              width: 100%;
77
+              display: block;
78
+              font-size: 0.14rem;
79
+              line-height: 0.4rem;
80
+              border: none;
81
+              color: #333;
82
+            }
83
+          }
84
+          > a {
85
+            font-size: 0.14rem;
86
+            color: #fff;
87
+            background: #ccc;
88
+            line-height: 0.3rem;
89
+            padding: 0 0.15rem;
90
+            border-radius: 0.04rem;
91
+            &.active {
92
+              background: #d91d36;
93
+            }
94
+          }
95
+        }
96
+        > .Btn {
97
+          padding: 0 0.15rem;
98
+          position: relative;
99
+          overflow: hidden;
100
+          margin-top: 0.15rem;
101
+          > a {
102
+            display: block;
103
+            font-size: 0.16rem;
104
+            color: #fff;
105
+            background: #d91d36;
106
+            text-align: center;
107
+            line-height: 0.4rem;
108
+            border-radius: 0.06rem;
109
+          }
110
+        }
111
+      }
112
+    }
113
+  }
114
+}

+ 2
- 0
src/pages/SignIn/index.vue 查看文件

@@ -26,6 +26,8 @@
26 26
       </li>
27 27
     </ul>
28 28
 
29
+    <span>忘记密码? <router-link :to="{ name: 'ResetPassword' }">重置密码</router-link></span>
30
+
29 31
     <span>没有注册账号? <router-link :to="{ name: 'SignUp' }">去注册</router-link></span>
30 32
 
31 33
     <div class="Btn">

+ 5
- 0
src/router/index.js 查看文件

@@ -133,6 +133,11 @@ let router = new Router({
133 133
         name: 'SignIn',
134 134
         component: resolve => (require(['@/pages/SignIn'], resolve))
135 135
       },
136
+      {
137
+        path: '/ResetPassword', // 重置密码
138
+        name: 'ResetPassword',
139
+        component: resolve => (require(['@/pages/ResetPassword'], resolve))
140
+      },
136 141
       {
137 142
         path: '/SignUp', // 注册页
138 143
         name: 'SignUp',

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

@@ -79,6 +79,11 @@ export default {
79 79
     }
80 80
   },
81 81
   actions: {
82
+    ResetPassword (context, payload) { // 重置密码
83
+      return new Promise((resolve, reject) => {
84
+        ToolClass.Axios(resolve, reject, Api.ResetPassword, context, payload, 1000)
85
+      })
86
+    },
82 87
     EditPassword (context, payload) { // 修改密码
83 88
       return new Promise((resolve, reject) => {
84 89
         ToolClass.Axios(resolve, reject, Api.EditPassword, context, payload, 1000)

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

@@ -2,9 +2,13 @@
2 2
 const prefix = '/api'
3 3
 
4 4
 const $api = {
5
+  ResetPassword: { // 重置密码
6
+    method: 'put',
7
+    url: `${prefix}/shop/reset-password`
8
+  },
5 9
   EditPassword: { // 修改密码
6 10
     method: 'put',
7
-    url: `${prefix}/shop/resetpassword`
11
+    url: `${prefix}/shop/change-password`
8 12
   },
9 13
   AliShiMingRenZheng: { // 支付宝实名认证
10 14
     method: 'put',