diff --git a/api-interface/itmk-base-parent/dependency_tree.txt b/api-interface/itmk-base-parent/dependency_tree.txt new file mode 100644 index 0000000..4e2785a Binary files /dev/null and b/api-interface/itmk-base-parent/dependency_tree.txt differ diff --git a/api-interface/itmk-base-parent/itmk-base-web/pom.xml b/api-interface/itmk-base-parent/itmk-base-web/pom.xml index bc07b76..46c4e1a 100644 --- a/api-interface/itmk-base-parent/itmk-base-web/pom.xml +++ b/api-interface/itmk-base-parent/itmk-base-web/pom.xml @@ -69,6 +69,12 @@ com.github.penggle kaptcha + + + org.apache.httpcomponents + httpclient + 4.5.13 + diff --git a/api-interface/itmk-base-parent/itmk-base-web/src/main/java/com/itmk/config/RestTemplateConfig.java b/api-interface/itmk-base-parent/itmk-base-web/src/main/java/com/itmk/config/RestTemplateConfig.java new file mode 100644 index 0000000..b2b0273 --- /dev/null +++ b/api-interface/itmk-base-parent/itmk-base-web/src/main/java/com/itmk/config/RestTemplateConfig.java @@ -0,0 +1,14 @@ +package com.itmk.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestTemplate; + +@Configuration +public class RestTemplateConfig { + + @Bean + public RestTemplate restTemplate() { + return new RestTemplate(); + } +} \ No newline at end of file diff --git a/api-interface/itmk-base-parent/itmk-base-web/src/main/java/com/itmk/web/wxapi/controller/WxLoginController.java b/api-interface/itmk-base-parent/itmk-base-web/src/main/java/com/itmk/web/wxapi/controller/WxLoginController.java index 181c278..c535165 100644 --- a/api-interface/itmk-base-parent/itmk-base-web/src/main/java/com/itmk/web/wxapi/controller/WxLoginController.java +++ b/api-interface/itmk-base-parent/itmk-base-web/src/main/java/com/itmk/web/wxapi/controller/WxLoginController.java @@ -5,55 +5,74 @@ import com.itmk.web.wxapi.entity.Code2Session; import com.itmk.web.wxapi.entity.LoginParm; import com.itmk.web.wxapi.entity.LoginVo; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; - -import java.util.HashMap; -import java.util.Map; +import org.springframework.web.client.RestTemplate; @Slf4j @RestController @RequestMapping("/wxapi/user") public class WxLoginController { + + @Autowired + private RestTemplate restTemplate; + @Value("${Wechat.Applets.appId}") private String appId; + @Value("${Wechat.Applets.appSecret}") private String appSecret; + //小程序登录 @PostMapping("/wxLogin") public ResultVo wxLogin(@RequestBody LoginParm parm){ String code = parm.getCode(); log.info("wxlogin - code: " + code); - String url = "https://api.weixin.qq.com/sns/jscode2session"; - Map param = new HashMap<>(); - param.put("appid", appId); - param.put("secret", appSecret); - param.put("js_code", code); - param.put("grant_type", "authorization_code"); - log.info("param: " + param); + try { - //发送请求 - String wxResult = HttpClientUtil.doGet(url, param); + // 构建请求URL + String url = "https://api.weixin.qq.com/sns/jscode2session" + + "?appid=" + appId + + "&secret=" + appSecret + + "&js_code=" + code + + "&grant_type=authorization_code"; + + log.info("Request URL: " + url); + + // 使用 RestTemplate 发送请求 + ResponseEntity response = restTemplate.getForEntity(url, String.class); + String wxResult = response.getBody(); + + log.info("WeChat API response: " + wxResult); + //转换参数 Code2Session userJson = FastJsonTools.getJson(wxResult, Code2Session.class); log.info("userJson: " + userJson); - if(userJson == null) throw new BusinessException(500,"小程序获取open失败"); + + if(userJson == null || userJson.getOpenid() == null) { + throw new BusinessException(500,"小程序获取open失败"); + } + String openid = userJson.getOpenid(); String sessionKey = userJson.getSession_key(); log.info("openid: " + openid); log.info("sessionKey: " + sessionKey); + LoginVo vo = new LoginVo(); vo.setOpenid(openid); vo.setSessionKey(sessionKey); + return ResultUtils.success("获取成功",vo); } catch (Exception e) { e.printStackTrace(); - log.error(String.format("WxLoginController.wxLogin Error", e)); + log.error("WxLoginController.wxLogin Error", e); + return ResultUtils.error("小程序获取open失败: " + e.getMessage()); } - return ResultUtils.error("小程序获取open失败"); } } \ No newline at end of file diff --git a/order-app/src/pages/mine/mine.vue b/order-app/src/pages/mine/mine.vue index ec65605..a9acedc 100644 --- a/order-app/src/pages/mine/mine.vue +++ b/order-app/src/pages/mine/mine.vue @@ -31,15 +31,33 @@ } from '@dcloudio/uni-app'; import { ref, +<<<<<<< HEAD + onMounted +======= getCurrentInstance +>>>>>>> 68b2157c4343ab2af362312b5f64deb4e53904e3 } from 'vue' import { userLogin } from '../../api/user.js' //昵称 - const nickName = ref('大幕孤烟直') + const nickName = ref('微信用户') //头像 const avatarUrl = ref('/static/user.jpg') +<<<<<<< HEAD + // 页面加载时从缓存读取用户信息 + onMounted(() => { + const storedAvatar = uni.getStorageSync('avatarUrl') + const storedNickName = uni.getStorageSync('nickName') + + if (storedAvatar && storedNickName) { + nickName.value = storedNickName + avatarUrl.value = storedAvatar + console.log('从缓存加载用户信息:', storedNickName, storedAvatar) + } + }) + +======= const onChooseAvatar = async (e) => { console.log(e) avatarUrl.value = e.detail.avatarUrl @@ -65,25 +83,112 @@ }) // nickName.value = e.detail.nickName } +>>>>>>> 68b2157c4343ab2af362312b5f64deb4e53904e3 //获取头像点击事件 const getUserInfo = () => { - console.log('获取头像') - if (uni.getStorageSync('avatarUrl') && uni.getStorageSync('nickName')) { - nickName.value = uni.getStorageSync('nickName') - avatarUrl.value = uni.getStorageSync('avatarUrl') - } else { - uni.getUserProfile({ - desc: '用于头像昵称展示', // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写 - success: (res) => { - console.log(res) - nickName.value = res.userInfo.nickName - avatarUrl.value = res.userInfo.avatarUrl - uni.setStorageSync('avatarUrl', res.userInfo.avatarUrl); - uni.setStorageSync('nickName', res.userInfo.nickName); + console.log('获取用户信息') + + // 检查是否已授权 + uni.getSetting({ + success: (res) => { + if (res.authSetting['scope.userInfo']) { + // 显示加载提示 + uni.showLoading({ + title: '获取用户信息中...' + }) + // 已授权,直接获取用户信息 + uni.getUserInfo({ + success: (res) => { + console.log('已授权用户信息:', res) + // 确保使用正确的数据路径 + const userInfo = res.userInfo || {} + nickName.value = userInfo.nickName || '未知用户' + + // 处理头像URL,添加时间戳避免缓存 + let avatar = userInfo.avatarUrl || '/static/user.jpg' + if (avatar !== '/static/user.jpg') { + // 添加时间戳参数避免缓存 + avatar += (avatar.includes('?') ? '&' : '?') + 't=' + + new Date().getTime() + } + avatarUrl.value = avatar + + // 存储到本地 + uni.setStorageSync('avatarUrl', avatar); + uni.setStorageSync('nickName', nickName.value); + + console.log('更新后的用户信息:', nickName.value, avatarUrl.value) + // 显示成功提示 + uni.showToast({ + title: '信息更新成功', + icon: 'success' + }) + }, + fail: (err) => { + uni.hideLoading() + console.log('获取用户信息失败:', err) + uni.showToast({ + title: '获取信息失败', + icon: 'none' + }) + } + }) + } else { + // 未授权,弹出授权窗口 + uni.showModal({ + title: '用户信息授权', + content: '需要获取您的头像和昵称', + success: (res) => { + if (res.confirm) { + // 用户点击确定 + uni.getUserProfile({ + desc: '用于完善会员资料', + success: (res) => { + console.log('授权成功:', res) + // 确保使用正确的数据路径 + const userInfo = res.userInfo || {} + nickName.value = userInfo.nickName || + '未知用户' + + // 处理头像URL,添加时间戳避免缓存 + let avatar = userInfo.avatarUrl || + '/static/user.jpg' + if (avatar !== '/static/user.jpg') { + // 添加时间戳参数避免缓存 + avatar += (avatar.includes('?') ? '&' : + '?') + 't=' + new Date() + .getTime() + } + avatarUrl.value = avatar + + // 存储到本地 + uni.setStorageSync('avatarUrl', avatar); + uni.setStorageSync('nickName', nickName + .value); + + console.log('更新后的用户信息:', nickName.value, + avatarUrl.value) + }, + fail: (err) => { + console.log('授权失败:', err) + uni.showToast({ + title: '授权失败', + icon: 'none' + }) + } + }) + } + } + }) } - }) - } + }, + fail: (err) => { + console.log('检查授权设置失败:', err) + } + }) } +<<<<<<< HEAD +======= //跳转详情 const toOrder = () => { getUserInfo() @@ -96,6 +201,7 @@ userLogin() getUserInfo() }) +>>>>>>> 68b2157c4343ab2af362312b5f64deb4e53904e3