Compare commits

...

2 Commits

Author SHA1 Message Date
ppnwsfegt af0c39582a Merge pull request '完成订单模块接口开发 与小程序端对接接口' (#59) from Brunch_LPQ into main
1 month ago
riverflow f5a05c0cd6 完成订单模块接口开发
1 month ago

@ -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<UserOrder> orderList = userOrderService.getOrderList(parm);
return ResultUtils.success("查询成功!",orderList);
}
}

@ -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<UserOrderDetail> goodsList = new ArrayList<>();
}

@ -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;
}

@ -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<UserOrder> {
void splaceOrder(OrderParm parm);
IPage<UserOrder> getOrderList(WxOrderParm parm);
}

@ -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<UserOrderMapper, UserOrder
userOrderDetailService.saveBatch(list);
}
}
@Override
public IPage<UserOrder> getOrderList(WxOrderParm parm) {
//查询条件
QueryWrapper<UserOrder> query = new QueryWrapper<>();
query.lambda().eq(UserOrder::getOpenid,parm.getOpenid())
.eq(StringUtils.isNotEmpty(parm.getType()),UserOrder::getStatus,parm.getType());
//构造分页对象
IPage<UserOrder> page = new Page<>(parm.getCurrentPage(),parm.getPageSize());
//查询订单主表
IPage<UserOrder> order = this.baseMapper.selectPage(page, query);
//查询子表
if(order.getRecords().size() > 0){
for(int i=0;i<order.getRecords().size();i++){
QueryWrapper<UserOrderDetail> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().eq(UserOrderDetail::getOrderId,order.getRecords().get(i).getOrderId());
List<UserOrderDetail> list = userOrderDetailService.list(queryWrapper);
//设置订单对应的商品
order.getRecords().get(i).setGoodsList(list);
}
}
return order;
}
}

@ -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<String> response = restTemplate.getForEntity(url, String.class);
String wxResult = response.getBody();
ResponseEntity<String> 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<String> response = restTemplate.getForEntity(testUrl, String.class);
return ResultUtils.success("网络连接正常", response.getStatusCode());
} catch (Exception e) {
return ResultUtils.error("网络连接失败: " + e.getMessage());
}
}
}

@ -31,6 +31,14 @@ mybatis-plus:
# 配置MyBatis Plus在更新时间更新非空和非NULL的字段
update-strategy: not_empty
# 微信小程序相关
Wechat:
Applets:
# 小程序appID
appId: wx6a41b250d82adc97
# 小程序秘钥
appSecret: 3bd822fb2c28fe7ba492ae7afd1fbd6e
# 日志配置
logging:
level:

@ -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,

@ -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
</script>
<style lang="scss">

Loading…
Cancel
Save