瀏覽代碼

修改密码

李志伟 3 年之前
父節點
當前提交
645189b54c

+ 38
- 8
src/api/user.js 查看文件

@@ -1,13 +1,5 @@
1 1
 import request from '@/utils/request'
2 2
 
3
-export function login(data) {
4
-  return request({
5
-    url: '/admin/login',
6
-    method: 'post',
7
-    data
8
-  })
9
-}
10
-
11 3
 /**
12 4
 * 用户列表
13 5
 * @param {*} data
@@ -17,6 +9,19 @@ export const getUserList = (params) => request({
17 9
   url: '/admin/user', params
18 10
 })
19 11
 
12
+/**
13
+ * 登录
14
+ * @param {*} data
15
+ * @returns
16
+ */
17
+export function login(data) {
18
+  return request({
19
+    url: '/admin/login',
20
+    method: 'post',
21
+    data
22
+  })
23
+}
24
+
20 25
 /**
21 26
 * 注册账号
22 27
 * @param {*} data
@@ -36,3 +41,28 @@ export const signUp = (data) => request({
36 41
 export const getCaptcha = (params) => request({
37 42
   url: '/admin/captcha', params
38 43
 })
44
+
45
+/**
46
+ * 修改密码
47
+ * @param {*} data
48
+ * @returns
49
+ */
50
+export const changePassword = (data) => request({
51
+  url: '/admin/change-password', method: 'put', data
52
+})
53
+/**
54
+ * 启用账号
55
+ * @param {*} data
56
+ * @returns
57
+ */
58
+export const enableUser = (id) => request({
59
+  url: `/admin/user/${id}/on`, method: 'put'
60
+})
61
+/**
62
+ * 禁用账号
63
+ * @param {*} data
64
+ * @returns
65
+ */
66
+export const disableUser = (id) => request({
67
+  url: `/admin/user/${id}/off`, method: 'put'
68
+})

+ 88
- 0
src/layout/components/Navbar.vue 查看文件

@@ -15,12 +15,44 @@
15 15
           <i class="el-icon-caret-bottom" />
16 16
         </div>
17 17
         <el-dropdown-menu slot="dropdown">
18
+          <el-dropdown-item @click.native="handlePassword">
19
+            <span>修改密码</span>
20
+          </el-dropdown-item>
18 21
           <el-dropdown-item @click.native="logout">
19 22
             <span>安全退出</span>
20 23
           </el-dropdown-item>
21 24
         </el-dropdown-menu>
22 25
       </el-dropdown>
23 26
     </div>
27
+    <el-dialog
28
+      title="修改密码"
29
+      :visible.sync="dialogFormVisible"
30
+      :show-close="false"
31
+      :close-on-click-modal="false"
32
+      style="width:800px; margin:auto"
33
+    >
34
+      <el-form
35
+        ref="ruleForm"
36
+        :model="ruleForm"
37
+        :rules="rules"
38
+        label-width="110px"
39
+        class="demo-ruleForm"
40
+      >
41
+        <el-form-item label="原密码" prop="originPassword">
42
+          <el-input ref="originPassword" v-model="ruleForm.originPassword" type="password" />
43
+        </el-form-item>
44
+        <el-form-item label="新密码" prop="newPassword">
45
+          <el-input ref="newPassword" v-model="ruleForm.newPassword" type="password" />
46
+        </el-form-item>
47
+        <el-form-item label="再次输入密码" prop="newPassword2">
48
+          <el-input ref="newPassword2" v-model="ruleForm.newPassword2" type="password" />
49
+        </el-form-item>
50
+      </el-form>
51
+      <div slot="footer" class="dialog-footer">
52
+        <el-button type="primary" @click="submit('ruleForm')">修改密码</el-button>
53
+        <el-button @click="onCancel">取 消</el-button>
54
+      </div>
55
+    </el-dialog>
24 56
   </div>
25 57
 </template>
26 58
 
@@ -28,12 +60,35 @@
28 60
 import { mapGetters } from 'vuex'
29 61
 import Breadcrumb from '@/components/Breadcrumb'
30 62
 import Hamburger from '@/components/Hamburger'
63
+import { changePassword } from '@/api/user'
64
+import md5 from 'js-md5'
31 65
 
32 66
 export default {
33 67
   components: {
34 68
     Breadcrumb,
35 69
     Hamburger
36 70
   },
71
+  data() {
72
+    return {
73
+      dialogFormVisible: false,
74
+      ruleForm: {
75
+        originPassword: undefined,
76
+        newPassword: undefined,
77
+        newPassword2: undefined
78
+      },
79
+      rules: {
80
+        originPassword: [
81
+          { required: true, message: '请输入原密码', trigger: 'blur' }
82
+        ],
83
+        newPassword: [
84
+          { required: true, message: '请输入新密码', trigger: 'blur' }
85
+        ],
86
+        newPassword2: [
87
+          { required: true, message: '请再次输入新密码', trigger: 'blur' }
88
+        ]
89
+      }
90
+    }
91
+  },
37 92
   computed: {
38 93
     ...mapGetters(['sidebar', 'avatar'])
39 94
   },
@@ -44,6 +99,39 @@ export default {
44 99
     async logout() {
45 100
       await this.$store.dispatch('user/logout')
46 101
       this.$router.push(`/login?redirect=${this.$route.fullPath}`)
102
+    },
103
+    handlePassword() {
104
+      this.ruleForm.originPassword = ''
105
+      this.dialogFormVisible = true
106
+    },
107
+    submit(formName) {
108
+      this.$refs[formName].validate((val) => {
109
+        if (val) {
110
+          if (this.ruleForm.newPassword !== this.ruleForm.newPassword2) {
111
+            this.$message('两次密码不一致请重新输入')
112
+            this.$refs.newPassword2.focus()
113
+          } else {
114
+            var newData = { ...this.ruleForm }
115
+            newData.originPassword = md5(newData.originPassword)
116
+            newData.newPassword = md5(newData.newPassword)
117
+            changePassword(newData).then(() => {
118
+              this.$message('密码修改成功请重新登录')
119
+              this.onCancel()
120
+              this.logout()
121
+            })
122
+          }
123
+        } else {
124
+          return false
125
+        }
126
+      })
127
+    },
128
+    onCancel() {
129
+      this.dialogFormVisible = false
130
+      this.ruleForm = {
131
+        originPassword: undefined,
132
+        newPassword: undefined,
133
+        newPassword2: undefined
134
+      }
47 135
     }
48 136
   }
49 137
 }

+ 1
- 1
src/layout/components/Sidebar/Logo.vue 查看文件

@@ -24,7 +24,7 @@ export default {
24 24
   },
25 25
   data() {
26 26
     return {
27
-      title: 'Vue Admin Template',
27
+      title: '答题系统',
28 28
       logo: 'https://wpimg.wallstcn.com/69a1c46c-eb1c-4b46-8bd4-e9e686ef5251.png'
29 29
     }
30 30
   }

+ 2
- 14
src/router/index.js 查看文件

@@ -5,7 +5,6 @@ Vue.use(Router)
5 5
 
6 6
 /* Layout */
7 7
 import Layout from '@/layout'
8
-
9 8
 /**
10 9
  * Note: sub-menu only appear when route children.length >= 1
11 10
  * Detail see: https://panjiachen.github.io/vue-element-admin-site/guide/essentials/router-and-nav.html
@@ -143,13 +142,13 @@ export const constantRoutes = [
143 142
   {
144 143
     path: '/userManage',
145 144
     component: Layout,
146
-    meta: { title: '用户管理', icon: 'form' },
145
+    meta: { title: '用户管理', icon: 'user' },
147 146
     children: [
148 147
       {
149 148
         path: 'userManage',
150 149
         name: '',
151 150
         component: () => import('@/views/userManage/index'),
152
-        meta: { title: '用户管理', icon: 'appconfig' }
151
+        meta: { title: '用户管理', icon: 'user' }
153 152
       }
154 153
     ]
155 154
   },
@@ -180,17 +179,6 @@ export const constantRoutes = [
180 179
     hidden: true
181 180
   },
182 181
 
183
-  {
184
-    path: 'external-link',
185
-    component: Layout,
186
-    children: [
187
-      {
188
-        path: 'https://panjiachen.github.io/vue-element-admin-site/#/',
189
-        meta: { title: 'External Link', icon: 'link' }
190
-      }
191
-    ]
192
-  },
193
-
194 182
   // 404 page must be placed at the end !!!
195 183
   { path: '*', redirect: '/404', hidden: true }
196 184
 ]

+ 1
- 1
src/settings.js 查看文件

@@ -1,6 +1,6 @@
1 1
 module.exports = {
2 2
 
3
-  title: 'Vue Admin Template',
3
+  title: '答题系统',
4 4
 
5 5
   /**
6 6
    * @type {boolean} true | false

+ 8
- 5
src/store/modules/user.js 查看文件

@@ -1,6 +1,7 @@
1 1
 import { login } from '@/api/user'
2
-import { getToken, setToken, removeToken, setUserId } from '@/utils/auth'
2
+import { getToken, setToken, removeToken, setUserId, removeUserId } from '@/utils/auth'
3 3
 import { resetRouter } from '@/router'
4
+import md5 from 'js-md5'
4 5
 
5 6
 const getDefaultState = () => {
6 7
   return {
@@ -23,10 +24,10 @@ const mutations = {
23 24
 // this.$store.dispatch('user/login', this.loginForm)调用api里面的方法
24 25
 const actions = {
25 26
   // user login
26
-  login ({ commit }, userInfo) {
27
+  login({ commit }, userInfo) {
27 28
     const { userName, password } = userInfo
28 29
     return new Promise((resolve, reject) => {
29
-      login({ userName: userName.trim(), password: password }).then(response => {
30
+      login({ userName: userName.trim(), password: md5(password) }).then(response => {
30 31
         const { data } = response
31 32
         commit('SET_TOKEN', data.token)
32 33
         setToken(data.token)
@@ -39,9 +40,10 @@ const actions = {
39 40
   },
40 41
 
41 42
   // user logout
42
-  logout ({ commit, state }) {
43
+  logout({ commit, state }) {
43 44
     return new Promise((resolve, reject) => {
44 45
       removeToken() // must remove  token  first
46
+      removeUserId()
45 47
       resetRouter()
46 48
       commit('RESET_STATE')
47 49
       resolve()
@@ -49,9 +51,10 @@ const actions = {
49 51
   },
50 52
 
51 53
   // remove token
52
-  resetToken ({ commit }) {
54
+  resetToken({ commit }) {
53 55
     return new Promise(resolve => {
54 56
       removeToken() // must remove  token  first
57
+      removeUserId()
55 58
       commit('RESET_STATE')
56 59
       resolve()
57 60
     })

+ 3
- 0
src/utils/auth.js 查看文件

@@ -22,3 +22,6 @@ export function setUserId(userId) {
22 22
 export function getUserId() {
23 23
   return Cookies.get(UserIdKey)
24 24
 }
25
+export function removeUserId() {
26
+  return Cookies.remove(TokenKey)
27
+}

+ 0
- 2
src/views/login/index.vue 查看文件

@@ -69,7 +69,6 @@
69 69
   </div>
70 70
 </template>
71 71
 <script>
72
-import md5 from 'js-md5'
73 72
 export default {
74 73
   name: 'Login',
75 74
   data() {
@@ -114,7 +113,6 @@ export default {
114 113
       this.$refs.loginForm.validate((valid) => {
115 114
         if (valid) {
116 115
           this.loading = true
117
-          this.loginForm.password = md5(this.loginForm.password)
118 116
           this.$store
119 117
             .dispatch('user/login', this.loginForm)
120 118
             .then(() => {

+ 6
- 23
src/views/login/register.vue 查看文件

@@ -25,25 +25,18 @@
25 25
           tabindex="1"
26 26
         />
27 27
       </el-form-item>
28
-
29 28
       <el-form-item prop="password">
30 29
         <span class="svg-container">
31 30
           <svg-icon icon-class="password" />
32 31
         </span>
33 32
         <el-input
34
-          :key="passwordType"
35 33
           ref="password"
36 34
           v-model="regisiterForm.password"
37
-          :type="passwordType"
38
-          placeholder="密码"
35
+          type="text"
36
+          placeholder="请输入密码"
39 37
           name="password"
40 38
           tabindex="2"
41 39
         />
42
-        <span class="show-pwd" @click="showPwd">
43
-          <svg-icon
44
-            :icon-class="passwordType === 'password' ? 'eye' : 'eye-open'"
45
-          />
46
-        </span>
47 40
       </el-form-item>
48 41
       <el-form-item prop="password2">
49 42
         <span class="svg-container">
@@ -151,8 +144,7 @@ export default {
151 144
       disabled: false,
152 145
       btnText: '发送验证码',
153 146
       time: 0,
154
-      loading: false,
155
-      passwordType: 'password'
147
+      loading: false
156 148
     }
157 149
   },
158 150
   methods: {
@@ -184,16 +176,6 @@ export default {
184 176
         }
185 177
       })
186 178
     },
187
-    showPwd() {
188
-      if (this.passwordType === 'password') {
189
-        this.passwordType = ''
190
-      } else {
191
-        this.passwordType = 'password'
192
-      }
193
-      this.$nextTick(() => {
194
-        this.$refs.password.focus()
195
-      })
196
-    },
197 179
     handleLogin() {
198 180
       this.$refs.regisiterForm.validate((valid) => {
199 181
         if (valid) {
@@ -202,8 +184,9 @@ export default {
202 184
             this.$refs.password2.focus()
203 185
             return false
204 186
           } else {
205
-            this.regisiterForm.password = md5(this.regisiterForm.password)
206
-            signUp(this.regisiterForm).then((res) => {
187
+            var newData = { ...this.regisiterForm }
188
+            newData.password = md5(newData.password)
189
+            signUp(newData).then((res) => {
207 190
               this.$message('注册成功')
208 191
               this.$router.push({ path: '/login' })
209 192
             })

+ 12
- 3
src/views/userManage/index.vue 查看文件

@@ -15,7 +15,7 @@
15 15
       <el-table-column prop="phone" label="手机号" />
16 16
       <el-table-column align="center" label="操作">
17 17
         <template slot-scope="scope">
18
-          <el-button type="text" style="color:red" @click="toogleUser(scope.row.userId)">{{ scope.row.status==1?'禁用':'启用' }}</el-button>
18
+          <el-button type="text" style="color:red" @click="toogleUser(scope.row)">{{ scope.row.status==1?'禁用':'启用' }}</el-button>
19 19
         </template>
20 20
       </el-table-column>
21 21
     </el-table>
@@ -34,7 +34,9 @@
34 34
 </template>
35 35
 <script>
36 36
 import {
37
-  getUserList
37
+  getUserList,
38
+  enableUser,
39
+  disableUser
38 40
 } from '@/api/user'
39 41
 
40 42
 export default {
@@ -90,7 +92,14 @@ export default {
90 92
       this.onSearch()
91 93
     },
92 94
     toogleUser(val) {
93
-      console.log(val)
95
+      if (val.status === 1) {
96
+        disableUser(val.userId).then(() => {
97
+
98
+        })
99
+        // console.log('启用')
100
+      } else {
101
+        console.log('禁用')
102
+      }
94 103
     }
95 104
   }
96 105
 }

+ 1
- 1
vue.config.js 查看文件

@@ -6,7 +6,7 @@ function resolve(dir) {
6 6
   return path.join(__dirname, dir)
7 7
 }
8 8
 
9
-const name = defaultSettings.title || 'vue Admin Template' // page title
9
+const name = defaultSettings.title || '答题系统' // page title
10 10
 
11 11
 // If your port is set to 80,
12 12
 // use administrator privileges to execute the command line.