李志伟 3 лет назад
Родитель
Сommit
645189b54c

+ 38
- 8
src/api/user.js Просмотреть файл

1
 import request from '@/utils/request'
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
 * @param {*} data
5
 * @param {*} data
17
   url: '/admin/user', params
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
 * @param {*} data
27
 * @param {*} data
36
 export const getCaptcha = (params) => request({
41
 export const getCaptcha = (params) => request({
37
   url: '/admin/captcha', params
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
           <i class="el-icon-caret-bottom" />
15
           <i class="el-icon-caret-bottom" />
16
         </div>
16
         </div>
17
         <el-dropdown-menu slot="dropdown">
17
         <el-dropdown-menu slot="dropdown">
18
+          <el-dropdown-item @click.native="handlePassword">
19
+            <span>修改密码</span>
20
+          </el-dropdown-item>
18
           <el-dropdown-item @click.native="logout">
21
           <el-dropdown-item @click.native="logout">
19
             <span>安全退出</span>
22
             <span>安全退出</span>
20
           </el-dropdown-item>
23
           </el-dropdown-item>
21
         </el-dropdown-menu>
24
         </el-dropdown-menu>
22
       </el-dropdown>
25
       </el-dropdown>
23
     </div>
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
   </div>
56
   </div>
25
 </template>
57
 </template>
26
 
58
 
28
 import { mapGetters } from 'vuex'
60
 import { mapGetters } from 'vuex'
29
 import Breadcrumb from '@/components/Breadcrumb'
61
 import Breadcrumb from '@/components/Breadcrumb'
30
 import Hamburger from '@/components/Hamburger'
62
 import Hamburger from '@/components/Hamburger'
63
+import { changePassword } from '@/api/user'
64
+import md5 from 'js-md5'
31
 
65
 
32
 export default {
66
 export default {
33
   components: {
67
   components: {
34
     Breadcrumb,
68
     Breadcrumb,
35
     Hamburger
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
   computed: {
92
   computed: {
38
     ...mapGetters(['sidebar', 'avatar'])
93
     ...mapGetters(['sidebar', 'avatar'])
39
   },
94
   },
44
     async logout() {
99
     async logout() {
45
       await this.$store.dispatch('user/logout')
100
       await this.$store.dispatch('user/logout')
46
       this.$router.push(`/login?redirect=${this.$route.fullPath}`)
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
   },
24
   },
25
   data() {
25
   data() {
26
     return {
26
     return {
27
-      title: 'Vue Admin Template',
27
+      title: '答题系统',
28
       logo: 'https://wpimg.wallstcn.com/69a1c46c-eb1c-4b46-8bd4-e9e686ef5251.png'
28
       logo: 'https://wpimg.wallstcn.com/69a1c46c-eb1c-4b46-8bd4-e9e686ef5251.png'
29
     }
29
     }
30
   }
30
   }

+ 2
- 14
src/router/index.js Просмотреть файл

5
 
5
 
6
 /* Layout */
6
 /* Layout */
7
 import Layout from '@/layout'
7
 import Layout from '@/layout'
8
-
9
 /**
8
 /**
10
  * Note: sub-menu only appear when route children.length >= 1
9
  * Note: sub-menu only appear when route children.length >= 1
11
  * Detail see: https://panjiachen.github.io/vue-element-admin-site/guide/essentials/router-and-nav.html
10
  * Detail see: https://panjiachen.github.io/vue-element-admin-site/guide/essentials/router-and-nav.html
143
   {
142
   {
144
     path: '/userManage',
143
     path: '/userManage',
145
     component: Layout,
144
     component: Layout,
146
-    meta: { title: '用户管理', icon: 'form' },
145
+    meta: { title: '用户管理', icon: 'user' },
147
     children: [
146
     children: [
148
       {
147
       {
149
         path: 'userManage',
148
         path: 'userManage',
150
         name: '',
149
         name: '',
151
         component: () => import('@/views/userManage/index'),
150
         component: () => import('@/views/userManage/index'),
152
-        meta: { title: '用户管理', icon: 'appconfig' }
151
+        meta: { title: '用户管理', icon: 'user' }
153
       }
152
       }
154
     ]
153
     ]
155
   },
154
   },
180
     hidden: true
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
   // 404 page must be placed at the end !!!
182
   // 404 page must be placed at the end !!!
195
   { path: '*', redirect: '/404', hidden: true }
183
   { path: '*', redirect: '/404', hidden: true }
196
 ]
184
 ]

+ 1
- 1
src/settings.js Просмотреть файл

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

+ 8
- 5
src/store/modules/user.js Просмотреть файл

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

+ 3
- 0
src/utils/auth.js Просмотреть файл

22
 export function getUserId() {
22
 export function getUserId() {
23
   return Cookies.get(UserIdKey)
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
   </div>
69
   </div>
70
 </template>
70
 </template>
71
 <script>
71
 <script>
72
-import md5 from 'js-md5'
73
 export default {
72
 export default {
74
   name: 'Login',
73
   name: 'Login',
75
   data() {
74
   data() {
114
       this.$refs.loginForm.validate((valid) => {
113
       this.$refs.loginForm.validate((valid) => {
115
         if (valid) {
114
         if (valid) {
116
           this.loading = true
115
           this.loading = true
117
-          this.loginForm.password = md5(this.loginForm.password)
118
           this.$store
116
           this.$store
119
             .dispatch('user/login', this.loginForm)
117
             .dispatch('user/login', this.loginForm)
120
             .then(() => {
118
             .then(() => {

+ 6
- 23
src/views/login/register.vue Просмотреть файл

25
           tabindex="1"
25
           tabindex="1"
26
         />
26
         />
27
       </el-form-item>
27
       </el-form-item>
28
-
29
       <el-form-item prop="password">
28
       <el-form-item prop="password">
30
         <span class="svg-container">
29
         <span class="svg-container">
31
           <svg-icon icon-class="password" />
30
           <svg-icon icon-class="password" />
32
         </span>
31
         </span>
33
         <el-input
32
         <el-input
34
-          :key="passwordType"
35
           ref="password"
33
           ref="password"
36
           v-model="regisiterForm.password"
34
           v-model="regisiterForm.password"
37
-          :type="passwordType"
38
-          placeholder="密码"
35
+          type="text"
36
+          placeholder="请输入密码"
39
           name="password"
37
           name="password"
40
           tabindex="2"
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
       </el-form-item>
40
       </el-form-item>
48
       <el-form-item prop="password2">
41
       <el-form-item prop="password2">
49
         <span class="svg-container">
42
         <span class="svg-container">
151
       disabled: false,
144
       disabled: false,
152
       btnText: '发送验证码',
145
       btnText: '发送验证码',
153
       time: 0,
146
       time: 0,
154
-      loading: false,
155
-      passwordType: 'password'
147
+      loading: false
156
     }
148
     }
157
   },
149
   },
158
   methods: {
150
   methods: {
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
     handleLogin() {
179
     handleLogin() {
198
       this.$refs.regisiterForm.validate((valid) => {
180
       this.$refs.regisiterForm.validate((valid) => {
199
         if (valid) {
181
         if (valid) {
202
             this.$refs.password2.focus()
184
             this.$refs.password2.focus()
203
             return false
185
             return false
204
           } else {
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
               this.$message('注册成功')
190
               this.$message('注册成功')
208
               this.$router.push({ path: '/login' })
191
               this.$router.push({ path: '/login' })
209
             })
192
             })

+ 12
- 3
src/views/userManage/index.vue Просмотреть файл

15
       <el-table-column prop="phone" label="手机号" />
15
       <el-table-column prop="phone" label="手机号" />
16
       <el-table-column align="center" label="操作">
16
       <el-table-column align="center" label="操作">
17
         <template slot-scope="scope">
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
         </template>
19
         </template>
20
       </el-table-column>
20
       </el-table-column>
21
     </el-table>
21
     </el-table>
34
 </template>
34
 </template>
35
 <script>
35
 <script>
36
 import {
36
 import {
37
-  getUserList
37
+  getUserList,
38
+  enableUser,
39
+  disableUser
38
 } from '@/api/user'
40
 } from '@/api/user'
39
 
41
 
40
 export default {
42
 export default {
90
       this.onSearch()
92
       this.onSearch()
91
     },
93
     },
92
     toogleUser(val) {
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
   return path.join(__dirname, dir)
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
 // If your port is set to 80,
11
 // If your port is set to 80,
12
 // use administrator privileges to execute the command line.
12
 // use administrator privileges to execute the command line.