diff --git a/backend/src/main/java/com/budwk/app/client/auth/controller/ClientAuthController.java b/backend/src/main/java/com/budwk/app/client/auth/controller/ClientAuthController.java index b0629f2..ec37e6f 100644 --- a/backend/src/main/java/com/budwk/app/client/auth/controller/ClientAuthController.java +++ b/backend/src/main/java/com/budwk/app/client/auth/controller/ClientAuthController.java @@ -15,6 +15,8 @@ import com.budwk.app.web.commons.slog.SLogService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; +import org.nutz.dao.Chain; +import org.nutz.dao.Cnd; import org.nutz.dao.Dao; import org.nutz.integration.jedis.RedisService; import org.nutz.ioc.loader.annotation.Inject; @@ -89,7 +91,7 @@ public class ClientAuthController { } } - @At("/info") + @At(value = {"/info", "/user-info"}) @Ok("json") @SaCheckLogin(type = StpClientUtil.TYPE) public Result info() { @@ -97,6 +99,17 @@ public class ClientAuthController { return Result.success(user); } + @At("/update-user-info") + @Ok("json") + @SaCheckLogin(type = StpClientUtil.TYPE) + @ApiOperation(value = "修改用户信息", nickname = "/update-user-info", httpMethod = "POST") + @AdaptBy(type = JsonAdaptor.class) + public Result updateUserInfo(Client_user user) { + user.setId(StpClientUtil.STP.getLoginIdAsLong()); + user.setAvatar("https://tdesign.gtimg.com/mobile/demos/avatar1.png"); + dao.updateIgnoreNull(user); + return Result.success(user); + } /** * 退出登录 diff --git a/backend/src/main/java/com/budwk/app/client/auth/models/Client_user.java b/backend/src/main/java/com/budwk/app/client/auth/models/Client_user.java index 3a922a0..d2dfbb5 100644 --- a/backend/src/main/java/com/budwk/app/client/auth/models/Client_user.java +++ b/backend/src/main/java/com/budwk/app/client/auth/models/Client_user.java @@ -38,6 +38,11 @@ public class Client_user extends BaseModel implements Serializable { @Comment("身份证") private String idCard; + @Column + @ColDefine(type = ColType.VARCHAR, width = 255) + @Comment("头像") + private String avatar; + @Column @ColDefine(type = ColType.VARCHAR, width = 255) @Comment("openId") diff --git a/frontend/package-lock.json b/frontend/package-lock.json index b4af3b2..8bb62c2 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -26,6 +26,7 @@ "@dcloudio/uni-quickapp-webview": "3.0.0-4050720250324001", "html5-qrcode": "^2.3.8", "moment": "^2.30.1", + "pinia": "^3.0.2", "tdesign-mobile-vue": "^1.8.3", "vue": "^3.4.21", "vue-i18n": "^9.1.9" @@ -4609,6 +4610,30 @@ "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", "license": "MIT" }, + "node_modules/@vue/devtools-kit": { + "version": "7.7.6", + "resolved": "https://registry.npmmirror.com/@vue/devtools-kit/-/devtools-kit-7.7.6.tgz", + "integrity": "sha512-geu7ds7tem2Y7Wz+WgbnbZ6T5eadOvozHZ23Atk/8tksHMFOFylKi1xgGlQlVn0wlkEf4hu+vd5ctj1G4kFtwA==", + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^7.7.6", + "birpc": "^2.3.0", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.7.6", + "resolved": "https://registry.npmmirror.com/@vue/devtools-shared/-/devtools-shared-7.7.6.tgz", + "integrity": "sha512-yFEgJZ/WblEsojQQceuyK6FzpFDx4kqrz2ohInxNj5/DnhoX023upTv4OD6lNPLAA5LLkbwPVb10o/7b+Y4FVA==", + "license": "MIT", + "dependencies": { + "rfdc": "^1.4.1" + } + }, "node_modules/@vue/reactivity": { "version": "3.5.13", "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.13.tgz", @@ -5219,6 +5244,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/birpc": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/birpc/-/birpc-2.3.0.tgz", + "integrity": "sha512-ijbtkn/F3Pvzb6jHypHRyve2QApOCZDR25D/VnkY2G/lBNcXCTsnsCxgY4k4PkVB7zfwzYbY3O9Lcqe3xufS5g==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/bmp-js": { "version": "0.1.0", "resolved": "https://registry.npmmirror.com/bmp-js/-/bmp-js-0.1.0.tgz", @@ -6931,6 +6965,12 @@ "node": ">= 0.4" } }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmmirror.com/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "license": "MIT" + }, "node_modules/html-encoding-sniffer": { "version": "2.0.1", "resolved": "https://registry.npmmirror.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", @@ -8751,6 +8791,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "license": "MIT" + }, "node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz", @@ -9185,6 +9231,12 @@ "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", "license": "MIT" }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "license": "MIT" + }, "node_modules/phin": { "version": "2.9.3", "resolved": "https://registry.npmmirror.com/phin/-/phin-2.9.3.tgz", @@ -9219,6 +9271,36 @@ "node": ">=0.10.0" } }, + "node_modules/pinia": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/pinia/-/pinia-3.0.2.tgz", + "integrity": "sha512-sH2JK3wNY809JOeiiURUR0wehJ9/gd9qFN2Y828jCbxEzKEmEt0pzCXwqiSTfuRsK9vQsOflSdnbdBOGrhtn+g==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^7.7.2" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "typescript": ">=4.4.4", + "vue": "^2.7.0 || ^3.5.11" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/pinia/node_modules/@vue/devtools-api": { + "version": "7.7.6", + "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-7.7.6.tgz", + "integrity": "sha512-b2Xx0KvXZObePpXPYHvBRRJLDQn5nhKjXh7vUhMEtWxz1AYNFOVIsh5+HLP8xDGL7sy+Q7hXeUxPHB/KgbtsPw==", + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^7.7.6" + } + }, "node_modules/pirates": { "version": "4.0.7", "resolved": "https://registry.npmmirror.com/pirates/-/pirates-4.0.7.tgz", @@ -9886,6 +9968,12 @@ "node": ">=0.10.0" } }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "license": "MIT" + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz", @@ -10277,6 +10365,15 @@ "source-map": "^0.6.0" } }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmmirror.com/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -10413,6 +10510,45 @@ "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", "license": "MIT" }, + "node_modules/superjson": { + "version": "2.2.2", + "resolved": "https://registry.npmmirror.com/superjson/-/superjson-2.2.2.tgz", + "integrity": "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==", + "license": "MIT", + "dependencies": { + "copy-anything": "^3.0.2" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/superjson/node_modules/copy-anything": { + "version": "3.0.5", + "resolved": "https://registry.npmmirror.com/copy-anything/-/copy-anything-3.0.5.tgz", + "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", + "license": "MIT", + "dependencies": { + "is-what": "^4.1.8" + }, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/superjson/node_modules/is-what": { + "version": "4.1.16", + "resolved": "https://registry.npmmirror.com/is-what/-/is-what-4.1.16.tgz", + "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", + "license": "MIT", + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", diff --git a/frontend/package.json b/frontend/package.json index 2f27d2f..bb44947 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -54,6 +54,7 @@ "@dcloudio/uni-quickapp-webview": "3.0.0-4050720250324001", "html5-qrcode": "^2.3.8", "moment": "^2.30.1", + "pinia": "^3.0.2", "tdesign-mobile-vue": "^1.8.3", "vue": "^3.4.21", "vue-i18n": "^9.1.9" diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 59f1c40..203299b 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -5,9 +5,8 @@ export default { globalData: { user: null }, - onLaunch: function () { + onLaunch: async function () { console.log('App Launch') - console.log(process.env.VUE_APP_PLATFORM) // 检查访问页面是否需要登录(不走拦截器 直接从地址栏进入) checkAuth() // 初始化路由拦截器 diff --git a/frontend/src/main.js b/frontend/src/main.js index 4353083..83d6381 100644 --- a/frontend/src/main.js +++ b/frontend/src/main.js @@ -1,4 +1,5 @@ import {createSSRApp} from "vue"; +import * as Pinia from 'pinia'; import App from "./App.vue"; // 引入TDesign组件库 @@ -14,10 +15,17 @@ import 'moment/dist/locale/zh-cn' moment.locale('zh-cn') +uni.$on('beforeRouterEnter', async (to, from, next) => { + console.log('beforeRouterEnter', to, from) +}) + + export function createApp() { const app = createSSRApp(App); - app.use(TDesign); // 使用TDesign组件库 + app.use(TDesign); + app.use(Pinia.createPinia()) return { app, + Pinia }; } diff --git a/frontend/src/pages/activity/list/index.vue b/frontend/src/pages/activity/list/index.vue index 070b8df..5e7b3c8 100644 --- a/frontend/src/pages/activity/list/index.vue +++ b/frontend/src/pages/activity/list/index.vue @@ -152,11 +152,10 @@ const getListData = async (isRefresh = false) => { hasMore.value = dataList.value.length < totalCount; pageForm.pageNumber++; } else { - Toast({message: '获取活动列表失败', theme: 'error'}); + Toast({message: response.msg, theme: 'error'}); } } catch (error) { console.error('获取活动列表失败', error); - Toast({message: '获取活动列表失败', theme: 'error'}); } finally { loading.value = false; diff --git a/frontend/src/pages/login/index.vue b/frontend/src/pages/login/index.vue index d3f2a3b..7d0e4e2 100644 --- a/frontend/src/pages/login/index.vue +++ b/frontend/src/pages/login/index.vue @@ -3,13 +3,15 @@
- + - - + + - + @@ -17,7 +19,7 @@ values="M20,50 Q60,20 100,50 T180,50 T260,50; M20,50 Q60,80 100,50 T180,50 T260,50; M20,50 Q60,20 100,50 T180,50 T260,50" - dur="10s" repeatCount="indefinite" /> + dur="10s" repeatCount="indefinite"/> @@ -25,26 +27,26 @@ values="M20,70 Q60,40 100,70 T180,70 T260,70; M20,70 Q60,100 100,70 T180,70 T260,70; M20,70 Q60,40 100,70 T180,70 T260,70" - dur="12s" repeatCount="indefinite" /> + dur="12s" repeatCount="indefinite"/> - - - + + + - - - + + + - - - + + +
@@ -77,7 +79,7 @@ - + - + - - - - - + + + + + @@ -121,8 +123,10 @@ import {ref, reactive, computed, onMounted, onBeforeUnmount} from 'vue' import {Toast} from 'tdesign-mobile-vue'; import {useRequest} from "@/utils/request"; +import {useUserStore} from "@/store"; const request = useRequest() +const userStore = useUserStore() const activeMethod = ref('phone') const loginForm = reactive({ @@ -167,15 +171,15 @@ const saveCountdownState = (seconds, phone) => { const restoreCountdownState = () => { const endTime = uni.getStorageSync(SMS_COUNTDOWN_KEY) const savedPhone = uni.getStorageSync(SMS_PHONE_KEY) - + if (endTime && savedPhone) { const now = Date.now() const remainingSeconds = Math.floor((endTime - now) / 1000) - + if (remainingSeconds > 0) { countdown.value = remainingSeconds startCountDownTimer() // 重新启动定时器 - + // 如果用户还没输入手机号,填入保存的手机号 if (!loginForm.phone) { loginForm.phone = savedPhone @@ -267,33 +271,47 @@ async function handleLogin() { } try { - const {data, code, msg} = await request.post('/client/auth/sms-login', loginForm) - if (code === 0) { - Toast({message: '登录成功', theme: 'success'}) - // 保存token - uni.setStorageSync('token', data) + userStore.smsLogin(loginForm).then(() => { + userStore.getUserInfo().then(() => { + Toast({message: '登录成功', theme: 'success'}) + uni.switchTab({ + url: '/pages/index/index' + }) + }).catch(e => { + Toast({message: e.message, theme: 'error'}) + }) + }).catch(e => { + console.log(e) + Toast({message: e.message, theme: 'error'}) + }) - // 获取之前保存的重定向URL - const redirectUrl = uni.getStorageSync('REDIRECT_URL') || '/pages/index/index' - uni.removeStorageSync('REDIRECT_URL') // 使用后删除 - - // 延迟跳转,让用户看到成功提示 - setTimeout(() => { - if (redirectUrl.startsWith('/pages/index/') || redirectUrl.startsWith('/pages/profile/')) { - // 主页和个人中心,使用switchTab - uni.switchTab({ - url: redirectUrl - }) - } else { - // 其他页面使用reLaunch - uni.reLaunch({ - url: redirectUrl - }) - } - }, 1000) - } else { - Toast({message: msg, theme: 'error'}) - } + // const {data, code, msg} = await request.post('/client/auth/sms-login', loginForm) + // if (code === 0) { + // Toast({message: '登录成功', theme: 'success'}) + // // 保存token + // uni.setStorageSync('token', data) + // + // // 获取之前保存的重定向URL + // const redirectUrl = uni.getStorageSync('REDIRECT_URL') || '/pages/index/index' + // uni.removeStorageSync('REDIRECT_URL') // 使用后删除 + // + // // 延迟跳转,让用户看到成功提示 + // setTimeout(() => { + // if (redirectUrl.startsWith('/pages/index/') || redirectUrl.startsWith('/pages/profile/')) { + // // 主页和个人中心,使用switchTab + // uni.switchTab({ + // url: redirectUrl + // }) + // } else { + // // 其他页面使用reLaunch + // uni.reLaunch({ + // url: redirectUrl + // }) + // } + // }, 1000) + // } else { + // Toast({message: msg, theme: 'error'}) + // } } catch (e) { console.error(e) Toast({message: e.message, theme: 'error'}) diff --git a/frontend/src/pages/profile/index.vue b/frontend/src/pages/profile/index.vue index 07ed48f..d81b19d 100644 --- a/frontend/src/pages/profile/index.vue +++ b/frontend/src/pages/profile/index.vue @@ -1,21 +1,16 @@