Commit 713817d0f18e0dc6a8c9b84546a505d750b4b3f4

Authored by sfmind
1 parent 5e19beee

退出登录、修改个人头像

yudao-ui-app/common/api.js
@@ -3,6 +3,8 @@ const { http } = uni.$u @@ -3,6 +3,8 @@ const { http } = uni.$u
3 /* login */ 3 /* login */
4 //使用手机 + 密码登录 4 //使用手机 + 密码登录
5 export const passwordLogin = params => http.post('/app-api/member/login', params) 5 export const passwordLogin = params => http.post('/app-api/member/login', params)
  6 +//退出登录
  7 +export const logout = params => http.post('/app-api/member/logout', params)
6 //发送手机验证码 8 //发送手机验证码
7 export const sendSmsCode = params => http.post('/app-api/member/send-sms-code', params) 9 export const sendSmsCode = params => http.post('/app-api/member/send-sms-code', params)
8 //使用手机 + 验证码登录 10 //使用手机 + 验证码登录
@@ -10,6 +12,13 @@ export const smsLogin = params => http.post('/app-api/member/sms-login', params) @@ -10,6 +12,13 @@ export const smsLogin = params => http.post('/app-api/member/sms-login', params)
10 12
11 //获取用户信息 13 //获取用户信息
12 export const getUserInfo = params => http.get('/app-api/member/user/get', params) 14 export const getUserInfo = params => http.get('/app-api/member/user/get', params)
  15 +//修改用户头像
  16 +export const updateAvatar = filePath =>
  17 + http.upload('/app-api/member/user/update-avatar', {
  18 + name: 'avatarFile',
  19 + fileType: 'image',
  20 + filePath: filePath
  21 + })
13 22
14 /* index */ 23 /* index */
15 // 获取滚动图数据 24 // 获取滚动图数据
yudao-ui-app/pages/profile/profile.vue
1 <template> 1 <template>
2 - <view class="container"> 个人资料 </view> 2 + <view class="container">
  3 + <view class="user-info">
  4 + <view class="info-item">
  5 + <view class="label">头像:</view>
  6 + <view class="info" @click="handleAvatarClick">
  7 + <u-avatar size="60" :src="userInfo.avatar"></u-avatar>
  8 + <u-icon class="btn" name="arrow-right"></u-icon>
  9 + </view>
  10 + </view>
  11 + <view class="info-item">
  12 + <view class="label">昵称:</view>
  13 + <view class="info">
  14 + <view class="value">{{ userInfo.nickname }}</view>
  15 + <u-icon class="btn" name="edit-pen"></u-icon>
  16 + </view>
  17 + </view>
  18 + <view class="info-item">
  19 + <view class="label">手机:</view>
  20 + <view class="info">
  21 + <view class="value">{{ userInfo.mobile }}</view>
  22 + <u-icon class="btn" name="edit-pen"></u-icon>
  23 + </view>
  24 + </view>
  25 + </view>
  26 + </view>
3 </template> 27 </template>
4 28
5 <script> 29 <script>
  30 +import { getUserInfo, updateAvatar } from '../../common/api'
  31 +
6 export default { 32 export default {
7 data() { 33 data() {
8 return { 34 return {
9 - title: '' 35 + userInfo: {
  36 + nickname: '',
  37 + avatar: '',
  38 + mobile: ''
  39 + },
  40 + avatarFiles: []
10 } 41 }
11 }, 42 },
12 - onLoad() {},  
13 - methods: {} 43 + onLoad() {
  44 + this.loadUserInfoData()
  45 + },
  46 + methods: {
  47 + loadUserInfoData() {
  48 + getUserInfo()
  49 + .then(res => {
  50 + this.userInfo = res.data
  51 + })
  52 + .catch(err => {
  53 + //console.log(err)
  54 + })
  55 + },
  56 + handleAvatarClick() {
  57 + uni.chooseImage({
  58 + success: chooseImageRes => {
  59 + const tempFilePaths = chooseImageRes.tempFilePaths
  60 + console.log(tempFilePaths)
  61 + updateAvatar(tempFilePaths[0])
  62 + .then(res => {
  63 + console.log(res)
  64 + })
  65 + .catch(err => {
  66 + //console.log(err)
  67 + })
  68 + }
  69 + })
  70 + }
  71 + }
14 } 72 }
15 </script> 73 </script>
16 74
17 -<style lang="scss" scoped></style> 75 +<style lang="scss" scoped>
  76 +.user-info {
  77 + .info-item {
  78 + padding: 20rpx 60rpx;
  79 + border-bottom: $custom-border-style;
  80 + @include flex-space-between;
  81 + .label {
  82 + font-size: 30rpx;
  83 + }
  84 + .info {
  85 + @include flex-right;
  86 + .value {
  87 + font-size: 30rpx;
  88 + }
  89 + .btn {
  90 + margin-left: 30rpx;
  91 + }
  92 + }
  93 + }
  94 +}
  95 +</style>
yudao-ui-app/pages/user/user.vue
@@ -71,7 +71,9 @@ export default { @@ -71,7 +71,9 @@ export default {
71 ] 71 ]
72 } 72 }
73 }, 73 },
74 - onLoad() {}, 74 + onLoad() {
  75 + this.$store.dispatch('obtainUserInfo')
  76 + },
75 methods: { 77 methods: {
76 loginOrJump(pageUrl) { 78 loginOrJump(pageUrl) {
77 if (!this.hasLogin) { 79 if (!this.hasLogin) {
@@ -87,7 +89,7 @@ export default { @@ -87,7 +89,7 @@ export default {
87 success: res => { 89 success: res => {
88 if (res.confirm) { 90 if (res.confirm) {
89 console.log('用户点击确定') 91 console.log('用户点击确定')
90 - this.$store.commit('logout') 92 + this.$store.dispatch('logout')
91 } else if (res.cancel) { 93 } else if (res.cancel) {
92 console.log('用户点击取消') 94 console.log('用户点击取消')
93 } 95 }
yudao-ui-app/store/index.js
1 import Vue from 'vue' 1 import Vue from 'vue'
2 import Vuex from 'vuex' 2 import Vuex from 'vuex'
3 -import { getUserInfo } from '@/common/api' 3 +import { getUserInfo, logout } from '@/common/api'
4 4
5 Vue.use(Vuex) // vue的插件机制 5 Vue.use(Vuex) // vue的插件机制
6 6
@@ -9,7 +9,7 @@ const store = new Vuex.Store({ @@ -9,7 +9,7 @@ const store = new Vuex.Store({
9 state: { 9 state: {
10 openExamine: false, // 是否开启审核状态。用于小程序、App 等审核时,关闭部分功能。TODO 芋艿:暂时没找到刷新的地方 10 openExamine: false, // 是否开启审核状态。用于小程序、App 等审核时,关闭部分功能。TODO 芋艿:暂时没找到刷新的地方
11 token: uni.getStorageSync('token'), // 用户身份 Token 11 token: uni.getStorageSync('token'), // 用户身份 Token
12 - userInfo: {}, // 用户基本信息 12 + userInfo: uni.getStorageSync('userInfo'), // 用户基本信息
13 timerIdent: false // 全局 1s 定时器,只在全局开启一个,所有需要定时执行的任务监听该值即可,无需额外开启 TODO 芋艿:需要看看 13 timerIdent: false // 全局 1s 定时器,只在全局开启一个,所有需要定时执行的任务监听该值即可,无需额外开启 TODO 芋艿:需要看看
14 }, 14 },
15 getters: { 15 getters: {
@@ -38,25 +38,29 @@ const store = new Vuex.Store({ @@ -38,25 +38,29 @@ const store = new Vuex.Store({
38 // 加载用户信息 38 // 加载用户信息
39 this.dispatch('obtainUserInfo') 39 this.dispatch('obtainUserInfo')
40 }, 40 },
41 - // 退出登录  
42 - logout(state) {  
43 - // 清空 Token  
44 - state.token = '' 41 + // 更新用户信息
  42 + setUserInfo(state, data) {
  43 + state.userInfo = data
  44 + uni.setStorageSync('userInfo', data)
  45 + },
  46 + // 清空 Token 和 用户信息
  47 + clearLoginInfo(state) {
45 uni.removeStorageSync('token') 48 uni.removeStorageSync('token')
46 - // 清空用户信息 TODO 芋艿:这里 setTimeout 的原因是,上面可能还有一些 request 请求。后续得优化下  
47 - setTimeout(() => {  
48 - state.userInfo = {}  
49 - }, 1100) 49 + state.token = ''
  50 + uni.removeStorageSync('userInfo')
  51 + state.userInfo = {}
50 } 52 }
51 }, 53 },
52 actions: { 54 actions: {
53 // 获得用户基本信息 55 // 获得用户基本信息
54 async obtainUserInfo({ state, commit }) { 56 async obtainUserInfo({ state, commit }) {
55 const res = await getUserInfo() 57 const res = await getUserInfo()
56 - commit('setStateAttr', {  
57 - key: 'userInfo',  
58 - val: res.data  
59 - }) 58 + commit('setUserInfo', res.data)
  59 + },
  60 + // 退出登录
  61 + async logout({ state, commit }) {
  62 + commit('clearLoginInfo')
  63 + await logout()
60 } 64 }
61 } 65 }
62 }) 66 })