diff --git a/api-interface/itmk-base-parent/itmk-base-web/src/main/java/com/itmk/web/order/controller/UserOrderController.java b/api-interface/itmk-base-parent/itmk-base-web/src/main/java/com/itmk/web/order/controller/UserOrderController.java index 0880f8a..1a97744 100644 --- a/api-interface/itmk-base-parent/itmk-base-web/src/main/java/com/itmk/web/order/controller/UserOrderController.java +++ b/api-interface/itmk-base-parent/itmk-base-web/src/main/java/com/itmk/web/order/controller/UserOrderController.java @@ -1,14 +1,14 @@ package com.itmk.web.order.controller; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.itmk.utils.ResultUtils; import com.itmk.utils.ResultVo; import com.itmk.web.order.entity.OrderParm; +import com.itmk.web.order.entity.UserOrder; +import com.itmk.web.order.entity.WxOrderParm; import com.itmk.web.order.service.UserOrderService; import org.springframework.beans.factory.annotation.Autowired; -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 org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/wxapi/order") @@ -22,4 +22,11 @@ public class UserOrderController { userOrderService.splaceOrder(parm); return ResultUtils.success("提交成功!"); } + + //查询订单 + @GetMapping("/getOrderList") + public ResultVo getOrderList(WxOrderParm parm){ + IPage orderList = userOrderService.getOrderList(parm); + return ResultUtils.success("查询成功!",orderList); + } } diff --git a/api-interface/itmk-base-parent/itmk-base-web/src/main/java/com/itmk/web/order/entity/UserOrder.java b/api-interface/itmk-base-parent/itmk-base-web/src/main/java/com/itmk/web/order/entity/UserOrder.java index f566e51..80c51bc 100644 --- a/api-interface/itmk-base-parent/itmk-base-web/src/main/java/com/itmk/web/order/entity/UserOrder.java +++ b/api-interface/itmk-base-parent/itmk-base-web/src/main/java/com/itmk/web/order/entity/UserOrder.java @@ -1,12 +1,16 @@ package com.itmk.web.order.entity; import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import com.itmk.web.order_detail.entity.UserOrderDetail; import lombok.Data; import java.math.BigDecimal; +import java.util.ArrayList; import java.util.Date; +import java.util.List; @Data @TableName("user_order") @@ -20,4 +24,8 @@ public class UserOrder { private BigDecimal price; private Date createTime; private String status; + +// 排除字段 + @TableField(exist = false) + private List goodsList = new ArrayList<>(); } diff --git a/api-interface/itmk-base-parent/itmk-base-web/src/main/java/com/itmk/web/order/entity/WxOrderParm.java b/api-interface/itmk-base-parent/itmk-base-web/src/main/java/com/itmk/web/order/entity/WxOrderParm.java new file mode 100644 index 0000000..3378190 --- /dev/null +++ b/api-interface/itmk-base-parent/itmk-base-web/src/main/java/com/itmk/web/order/entity/WxOrderParm.java @@ -0,0 +1,11 @@ +package com.itmk.web.order.entity; + +import lombok.Data; + +@Data +public class WxOrderParm { + private String openid; + private String type; + private Long currentPage; + private Long pageSize; +} \ No newline at end of file diff --git a/api-interface/itmk-base-parent/itmk-base-web/src/main/java/com/itmk/web/order/service/UserOrderService.java b/api-interface/itmk-base-parent/itmk-base-web/src/main/java/com/itmk/web/order/service/UserOrderService.java index 1e371af..57c7523 100644 --- a/api-interface/itmk-base-parent/itmk-base-web/src/main/java/com/itmk/web/order/service/UserOrderService.java +++ b/api-interface/itmk-base-parent/itmk-base-web/src/main/java/com/itmk/web/order/service/UserOrderService.java @@ -1,9 +1,13 @@ package com.itmk.web.order.service; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import com.itmk.web.order.entity.OrderParm; import com.itmk.web.order.entity.UserOrder; +import com.itmk.web.order.entity.WxOrderParm; public interface UserOrderService extends IService { void splaceOrder(OrderParm parm); + + IPage getOrderList(WxOrderParm parm); } \ No newline at end of file diff --git a/api-interface/itmk-base-parent/itmk-base-web/src/main/java/com/itmk/web/order/service/impl/UserOrderServiceImpl.java b/api-interface/itmk-base-parent/itmk-base-web/src/main/java/com/itmk/web/order/service/impl/UserOrderServiceImpl.java index af45c9d..21695c6 100644 --- a/api-interface/itmk-base-parent/itmk-base-web/src/main/java/com/itmk/web/order/service/impl/UserOrderServiceImpl.java +++ b/api-interface/itmk-base-parent/itmk-base-web/src/main/java/com/itmk/web/order/service/impl/UserOrderServiceImpl.java @@ -1,9 +1,14 @@ package com.itmk.web.order.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.itmk.web.order.entity.OrderParm; import com.itmk.web.order.entity.ParmDetail; import com.itmk.web.order.entity.UserOrder; +import com.itmk.web.order.entity.WxOrderParm; import com.itmk.web.order.mapper.UserOrderMapper; import com.itmk.web.order.service.UserOrderService; import com.itmk.web.order_detail.entity.UserOrderDetail; @@ -46,4 +51,27 @@ public class UserOrderServiceImpl extends ServiceImpl getOrderList(WxOrderParm parm) { + //查询条件 + QueryWrapper query = new QueryWrapper<>(); + query.lambda().eq(UserOrder::getOpenid,parm.getOpenid()) + .eq(StringUtils.isNotEmpty(parm.getType()),UserOrder::getStatus,parm.getType()); + //构造分页对象 + IPage page = new Page<>(parm.getCurrentPage(),parm.getPageSize()); + //查询订单主表 + IPage order = this.baseMapper.selectPage(page, query); + //查询子表 + if(order.getRecords().size() > 0){ + for(int i=0;i queryWrapper = new QueryWrapper<>(); + queryWrapper.lambda().eq(UserOrderDetail::getOrderId,order.getRecords().get(i).getOrderId()); + List list = userOrderDetailService.list(queryWrapper); + //设置订单对应的商品 + order.getRecords().get(i).setGoodsList(list); + } + } + return order; + } } \ 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 c535165..b762bb5 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 @@ -8,10 +8,8 @@ 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 org.springframework.web.bind.annotation.*; +import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; @Slf4j @@ -28,11 +26,13 @@ public class WxLoginController { @Value("${Wechat.Applets.appSecret}") private String appSecret; - //小程序登录 + // 小程序登录 @PostMapping("/wxLogin") - public ResultVo wxLogin(@RequestBody LoginParm parm){ + public ResultVo wxLogin(@RequestBody LoginParm parm) { String code = parm.getCode(); log.info("wxlogin - code: " + code); + log.info("appId: " + appId); + log.info("appSecret: " + (appSecret != null ? "已设置" : "未设置")); try { // 构建请求URL @@ -45,17 +45,40 @@ public class WxLoginController { log.info("Request URL: " + url); // 使用 RestTemplate 发送请求 - ResponseEntity response = restTemplate.getForEntity(url, String.class); - String wxResult = response.getBody(); + ResponseEntity response; + try { + response = restTemplate.getForEntity(url, String.class); + } catch (RestClientException e) { + log.error("调用微信API失败: " + e.getMessage(), e); + return ResultUtils.error("网络连接失败,无法访问微信服务器"); + } + String wxResult = response.getBody(); log.info("WeChat API response: " + wxResult); - //转换参数 + // 检查微信API返回的错误 + if (wxResult == null) { + log.error("微信API返回空响应"); + return ResultUtils.error("微信服务器无响应"); + } + + if (wxResult.contains("\"errcode\":")) { + log.error("微信API返回错误: " + wxResult); + return ResultUtils.error("微信API错误: " + wxResult); + } + + // 转换参数 Code2Session userJson = FastJsonTools.getJson(wxResult, Code2Session.class); log.info("userJson: " + userJson); - if(userJson == null || userJson.getOpenid() == null) { - throw new BusinessException(500,"小程序获取open失败"); + if (userJson == null) { + log.error("解析微信响应失败"); + return ResultUtils.error("解析微信响应失败"); + } + + if (userJson.getOpenid() == null) { + log.error("微信响应中未包含openid: " + wxResult); + return ResultUtils.error("微信响应中未包含openid"); } String openid = userJson.getOpenid(); @@ -67,12 +90,35 @@ public class WxLoginController { vo.setOpenid(openid); vo.setSessionKey(sessionKey); - return ResultUtils.success("获取成功",vo); + return ResultUtils.success("获取成功", vo); } catch (Exception e) { - e.printStackTrace(); log.error("WxLoginController.wxLogin Error", e); return ResultUtils.error("小程序获取open失败: " + e.getMessage()); } } + + // 添加一个测试接口,验证配置是否正确 + @GetMapping("/testConfig") + public ResultVo testConfig() { + try { + return ResultUtils.success("配置检查", + "appId: " + appId + + ", appSecret: " + (appSecret != null ? "已设置" : "未设置")); + } catch (Exception e) { + return ResultUtils.error("配置检查失败: " + e.getMessage()); + } + } + + // 验证服务器是否可以访问微信 API: + @GetMapping("/testNetwork") + public ResultVo testNetwork() { + try { + String testUrl = "https://api.weixin.qq.com"; + ResponseEntity response = restTemplate.getForEntity(testUrl, String.class); + return ResultUtils.success("网络连接正常", response.getStatusCode()); + } catch (Exception e) { + return ResultUtils.error("网络连接失败: " + e.getMessage()); + } + } } \ No newline at end of file diff --git a/api-interface/itmk-base-parent/itmk-base-web/src/main/resources/application-active.yml b/api-interface/itmk-base-parent/itmk-base-web/src/main/resources/application-active.yml index 98996f0..b907a8e 100644 --- a/api-interface/itmk-base-parent/itmk-base-web/src/main/resources/application-active.yml +++ b/api-interface/itmk-base-parent/itmk-base-web/src/main/resources/application-active.yml @@ -31,6 +31,14 @@ mybatis-plus: # 配置MyBatis Plus在更新时间更新非空和非NULL的字段 update-strategy: not_empty +# 微信小程序相关 +Wechat: + Applets: + # 小程序appID + appId: wx6a41b250d82adc97 + # 小程序秘钥 + appSecret: 3bd822fb2c28fe7ba492ae7afd1fbd6e + # 日志配置 logging: level: diff --git a/order-app/src/pages/confirm/confirm.vue b/order-app/src/pages/confirm/confirm.vue index abffd9d..f53bbff 100644 --- a/order-app/src/pages/confirm/confirm.vue +++ b/order-app/src/pages/confirm/confirm.vue @@ -48,7 +48,8 @@ import { ref, reactive, - computed + computed, + onMounted } from 'vue' import { orderStore @@ -137,20 +138,58 @@ } //查询默认地址 const getAddress = async () => { - let res = await getAddressApi({ - openid: uni.getStorageSync('openid') - }) - console.log(res) - if (res && res.code == 200) { - astore.checkedId = res.data.addressId - astore.userName = res.data.userName - astore.phone = res.data.phone - astore.area = res.data.area - astore.address = res.data.address + try { + let res = await getAddressApi({ + openid: uni.getStorageSync('openid') + }) + console.log('获取地址响应:', res) + + if (res && res.code == 200) { + // 检查 res.data 是否存在 + if (res.data) { + astore.checkedId = res.data.addressId + astore.userName = res.data.userName + astore.phone = res.data.phone + astore.area = res.data.area + astore.address = res.data.address + console.log('地址信息已设置:', astore) + } else { + console.error('获取的地址数据为空') + // 设置默认值或显示提示 + uni.showToast({ + title: '暂无默认地址,请先添加地址', + icon: 'none' + }) + } + } else { + console.error('获取地址失败:', res?.msg || '未知错误') + uni.showToast({ + title: '获取地址失败', + icon: 'none' + }) + } + } catch (error) { + console.error('获取地址异常:', error) + uni.showToast({ + title: '获取地址异常', + icon: 'none' + }) } } //提交订单 const commitBtn = async () => { + // 检查地址信息是否完整 + if (!astore.userName || !astore.phone || !astore.area || !astore.address) { + uni.showToast({ + title: '请先选择收货地址', + icon: 'none' + }) + // 跳转到地址选择页面 + uni.navigateTo({ + url: '../addresslist/addresslist' + }) + return + } let commitParm = reactive({ openid: uni.getStorageSync('openid'), userName: astore.userName, diff --git a/order-app/src/pages/mine/mine.vue b/order-app/src/pages/mine/mine.vue index a9acedc..41d4333 100644 --- a/order-app/src/pages/mine/mine.vue +++ b/order-app/src/pages/mine/mine.vue @@ -31,59 +31,80 @@ } from '@dcloudio/uni-app'; import { ref, -<<<<<<< HEAD - onMounted -======= + onMounted, getCurrentInstance ->>>>>>> 68b2157c4343ab2af362312b5f64deb4e53904e3 } from 'vue' import { - userLogin + userLogin, + uploadImageApi } from '../../api/user.js' + + // 获取当前组件实例 + const instance = getCurrentInstance(); //昵称 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) - } + loadUserInfoFromStorage(); }) + + const loadUserInfoFromStorage = () => { + 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) + console.log('选择头像:', e) avatarUrl.value = e.detail.avatarUrl - uploadImageApi({ - url: "/api/upload/uploadImage", - filePath: e.detail.avatarUrl - }).then((res) => { - console.log(res) - }) + + // 上传头像到服务器 + try { + const res = await uploadImageApi({ + url: "/api/upload/uploadImage", + filePath: e.detail.avatarUrl + }) + console.log('头像上传成功:', res) + + // 保存头像URL到本地存储 + uni.setStorageSync('avatarUrl', e.detail.avatarUrl); + } catch (err) { + console.error('头像上传失败:', err) + uni.showToast({ + title: '头像上传失败', + icon: 'none' + }) + } } + const onNickName = (e) => { - console.log(e) - uni.createSelectorQuery().in(instance) // 注意这里要加上 in(this) + console.log('昵称输入:', e) + + // 使用已定义的 instance 变量 + uni.createSelectorQuery().in(instance) .select("#nickname-input") .fields({ properties: ["value"], }) .exec((res) => { - console.log(res) - nickName.value = res?.[0]?.value - console.log('昵称', nickName.value) + console.log('获取昵称结果:', res) + if (res && res[0] && res[0].value) { + nickName.value = res[0].value + console.log('设置昵称:', nickName.value) + // 保存昵称到本地存储 + uni.setStorageSync('nickName', nickName.value); + } }) - // nickName.value = e.detail.nickName } ->>>>>>> 68b2157c4343ab2af362312b5f64deb4e53904e3 + //获取头像点击事件 const getUserInfo = () => { console.log('获取用户信息') @@ -187,11 +208,10 @@ } }) } -<<<<<<< HEAD -======= + //跳转详情 const toOrder = () => { - getUserInfo() + // getUserInfo() //在起始页面跳转到details.vue页面并传递参数 uni.navigateTo({ url: '../order/order' @@ -199,9 +219,10 @@ } onShow(() => { userLogin() - getUserInfo() + // getUserInfo() + // 只从存储加载,不再调用getUserInfo + loadUserInfoFromStorage(); }) ->>>>>>> 68b2157c4343ab2af362312b5f64deb4e53904e3