Compare commits

...

23 Commits

Author SHA1 Message Date
Suk1No b1f0793768 昵称、头像接口开发对接和数据库获取
1 month ago
ppnwsfegt fa8062c64e Merge pull request '完成评论管理页面的制作' (#66) from Brunch_LPQ into main
1 month ago
riverflow da7bb8bd57 完成评论管理页面的制作
1 month ago
ppnwsfegt 038898928b Merge pull request '完成评论管理接口开发' (#65) from Brunch_LPQ into main
1 month ago
riverflow c0c926b2da 完成评论管理接口开发
1 month ago
ppnwsfegt dbcac59eea Merge pull request '完成我的收藏模块开发' (#64) from Brunch_LPQ into main
1 month ago
riverflow 5abc63b45e 完成我的收藏模块开发
1 month ago
ppnwsfegt 0437dc8935 Merge pull request '完成小程序端用户昵称头像接口开发 完成小程序端评论接口开发' (#63) from Brunch_LPQ into main
1 month ago
riverflow 5a8d197c1c 完成小程序端用户昵称头像接口开发
1 month ago
ppnwsfegt e0db67ebc9 Merge pull request '完成小程序端取消订单接口的开发' (#62) from Brunch_LPQ into main
1 month ago
riverflow a9b45a9003 完成小程序端取消订单接口的开发
1 month ago
ppnwsfegt b3d05f8d65 Merge pull request '完成发货接口的开发' (#61) from Brunch_LPQ into main
1 month ago
riverflow 5c488718c8 完成发货接口的开发
1 month ago
ppnwsfegt 1daca03d06 Merge pull request '完成后端订单管理页面和接口的开发' (#60) from Brunch_LPQ into main
1 month ago
riverflow d388e896e5 完成后端订单管理页面和接口的开发
1 month ago
ppnwsfegt af0c39582a Merge pull request '完成订单模块接口开发 与小程序端对接接口' (#59) from Brunch_LPQ into main
1 month ago
riverflow f5a05c0cd6 完成订单模块接口开发
1 month ago
ppnwsfegt 334b718d73 Merge pull request '完成wxLogin模块接口bug修复' (#58) from Brunch_LPQ into main
1 month ago
riverflow e38a27f3a0 Merge branch 'main' of https://bdgit.educoder.net/ppnwsfegt/WXCampusFoodOrdering into Brunch_LPQ
1 month ago
riverflow a433c059a9 完成wxLogin模块接口bug修复
1 month ago
pikvyz67s 68b2157c43 Merge pull request '小程序取消订单 昵称、头像优化及上传' (#57) from Brunch_DBK into main
1 month ago
pikvyz67s 97e083cc13 Merge pull request '小程序订单页面优化' (#56) from Brunch_DBK into main
1 month ago
pikvyz67s a3724e210e Merge pull request '小程序订单列表接口对接' (#55) from Brunch_DBK into main
1 month ago

@ -69,6 +69,12 @@
<groupId>com.github.penggle</groupId>
<artifactId>kaptcha</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.13</version> <!-- 或者使用与你的Spring Boot版本兼容的版本 -->
</dependency>
</dependencies>
<build>

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

@ -0,0 +1,73 @@
package com.itmk.web.goods_comment.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.itmk.utils.ResultUtils;
import com.itmk.utils.ResultVo;
import com.itmk.web.goods_comment.entity.CommentParm;
import com.itmk.web.goods_comment.entity.GoodsComment;
import com.itmk.web.goods_comment.service.GoodsCommentService;
import com.itmk.web.order_detail.entity.UserOrderDetail;
import com.itmk.web.order_detail.service.UserOrderDetailService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @Author java
* @Version 2383404558
*/
@RestController
@RequestMapping("/wxapi/comment")
public class GoodsCommentController {
@Autowired
private GoodsCommentService goodsCommentService;
@Resource
private UserOrderDetailService userOrderDetailService;
//新增评论
@PostMapping("/addComment")
public ResultVo addComment(@RequestBody GoodsComment goodsComment){
//根据订单id查询商品
QueryWrapper<UserOrderDetail> query = new QueryWrapper<>();
query.lambda().eq(UserOrderDetail::getOrderId,goodsComment.getOrderId());
List<UserOrderDetail> list = userOrderDetailService.list(query);
List<GoodsComment> goodsCommentList = new ArrayList<>();
if(list.size() >0){
for (int i=0;i<list.size();i++){
GoodsComment goodsC = new GoodsComment();
BeanUtils.copyProperties(goodsComment,goodsC);
goodsC.setCreateTime(new Date());
goodsC.setGoodsId(list.get(i).getGoodsId());
goodsCommentList.add(goodsC);
}
}
//批量插入
goodsCommentService.saveBatch(goodsCommentList);
return ResultUtils.success("评论成功!");
}
//小程序评论列表
@GetMapping("/commentList")
public ResultVo commentList(Long goodsId){
List<GoodsComment> list = goodsCommentService.commentList(goodsId);
return ResultUtils.success("查询成功",list);
}
//pc列表查询
@GetMapping("/pcCommentList")
public ResultVo pcCommentList(CommentParm parm){
IPage<GoodsComment> list = goodsCommentService.getList(parm);
return ResultUtils.success("查询成功",list);
}
//删除
@DeleteMapping("/{commentId}")
public ResultVo delete(@PathVariable("commentId") Long commentId){
goodsCommentService.removeById(commentId);
return ResultUtils.success("删除成功!");
}
}

@ -0,0 +1,11 @@
package com.itmk.web.goods_comment.entity;
import lombok.Data;
@Data
public class CommentParm {
private Integer currentPage; //当前页
private Integer pageSize;//每页查询的条数
}

@ -0,0 +1,34 @@
package com.itmk.web.goods_comment.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.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
@Data
@TableName("goods_comment")
public class GoodsComment {
@TableId(type = IdType.AUTO)
private Long commentId;
private Long goodsId;
@TableField(exist = false)
private Long orderId;
private String openid;
private String commentText;
@TableField(exist = false)
private String nickName;
@TableField(exist = false)
private String avatarUrl;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private Date createTime;
@TableField(exist = false)
private String goodsName;
@TableField(exist = false)
private String goodsImage;
}

@ -0,0 +1,15 @@
package com.itmk.web.goods_comment.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itmk.web.goods_comment.entity.GoodsComment;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface GoodsCommentMapper extends BaseMapper<GoodsComment> {
List<GoodsComment> commentList(@Param("goodsId") Long goodsId);
IPage<GoodsComment> getList(Page<GoodsComment> page);
}

@ -0,0 +1,14 @@
package com.itmk.web.goods_comment.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.itmk.web.goods_comment.entity.CommentParm;
import com.itmk.web.goods_comment.entity.GoodsComment;
import java.util.List;
public interface GoodsCommentService extends IService<GoodsComment> {
List<GoodsComment> commentList(Long goodsId);
IPage<GoodsComment> getList(CommentParm parm);
}

@ -0,0 +1,27 @@
package com.itmk.web.goods_comment.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itmk.web.goods_comment.entity.CommentParm;
import com.itmk.web.goods_comment.entity.GoodsComment;
import com.itmk.web.goods_comment.mapper.GoodsCommentMapper;
import com.itmk.web.goods_comment.service.GoodsCommentService;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class GoodsCommentServiceImpl extends ServiceImpl<GoodsCommentMapper, GoodsComment> implements GoodsCommentService {
@Override
public List<GoodsComment> commentList(Long goodsId) {
return this.baseMapper.commentList(goodsId);
}
@Override
public IPage<GoodsComment> getList(CommentParm parm) {
//构造分页对象
Page<GoodsComment> page = new Page<>(parm.getCurrentPage(),parm.getPageSize());
return this.baseMapper.getList(page);
}
}

@ -1,14 +1,17 @@
package com.itmk.web.order.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
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.SendParm;
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 +25,58 @@ 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);
}
//pc端查询订单
@GetMapping("/getPcOrderList")
public ResultVo getPcOrderList(WxOrderParm parm){
IPage<UserOrder> orderList = userOrderService.getPcOrderList(parm);
return ResultUtils.success("查询成功!",orderList);
}
//发货
@PutMapping("/sendOrder")
public ResultVo sendOrder(@RequestBody SendParm parm){
//判断订单是否被取消
QueryWrapper<UserOrder> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().eq(UserOrder::getOrderId,parm.getOrderId()).eq(UserOrder::getStatus,"3");
UserOrder one = userOrderService.getOne(queryWrapper);
if(one != null){
return ResultUtils.error("订单已被取消,不能发货!");
}
//更新条件
LambdaUpdateWrapper<UserOrder> query = new LambdaUpdateWrapper<>();
query.eq(UserOrder::getOrderId,parm.getOrderId())
.set(UserOrder::getStatus,"1");
if(userOrderService.update(query)){
return ResultUtils.success("更新成功!");
}
return ResultUtils.error("更新失败!");
}
//取消订单
@PostMapping("/cancelOrder")
public ResultVo cancelOrder(@RequestBody SendParm parm){
//如果已发货,不能取消
QueryWrapper<UserOrder> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().eq(UserOrder::getOrderId,parm.getOrderId()).eq(UserOrder::getStatus,"1");
UserOrder one = userOrderService.getOne(queryWrapper);
if(one != null){
return ResultUtils.error("订单已发货,不能取消!");
}
//更新条件
LambdaUpdateWrapper<UserOrder> query = new LambdaUpdateWrapper<>();
query.eq(UserOrder::getOrderId,parm.getOrderId())
.set(UserOrder::getStatus,"3");
if(userOrderService.update(query)){
return ResultUtils.success("取消成功!");
}
return ResultUtils.error("取消失败!");
}
}

@ -0,0 +1,9 @@
package com.itmk.web.order.entity;
import lombok.Data;
@Data
public class SendParm {
private Long orderId;
}

@ -1,12 +1,17 @@
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.fasterxml.jackson.annotation.JsonFormat;
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")
@ -18,6 +23,11 @@ public class UserOrder {
private String phone;
private String address;
private BigDecimal price;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;
private String status;
// 排除字段
@TableField(exist = false)
private List<UserOrderDetail> goodsList = new ArrayList<>();
}

@ -0,0 +1,12 @@
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;
private String userName;
}

@ -1,9 +1,15 @@
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);
IPage<UserOrder> getPcOrderList(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,49 @@ 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;
}
@Override
public IPage<UserOrder> getPcOrderList(WxOrderParm parm) {
//查询订单
QueryWrapper<UserOrder> query = new QueryWrapper<>();
query.lambda().like(StringUtils.isNotEmpty(parm.getUserName()),UserOrder::getUserName,parm.getUserName())
.eq(StringUtils.isNotEmpty(parm.getType()),UserOrder::getStatus,parm.getType())
.orderByDesc(UserOrder::getCreateTime);
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;
}
}

@ -0,0 +1,82 @@
package com.itmk.web.user_collect.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.itmk.utils.ResultUtils;
import com.itmk.utils.ResultVo;
import com.itmk.web.user_collect.entity.UserCollect;
import com.itmk.web.user_collect.service.UserCollectService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* @Author java
* @Version 2383404558
*/
@RestController
@RequestMapping("/wxapi/collect")
public class UserCollectController {
@Autowired
private UserCollectService userCollectService;
//收藏
@PostMapping("/addCollect")
public ResultVo addCollect(@RequestBody UserCollect userCollect){
//查询是否收藏
QueryWrapper<UserCollect> query = new QueryWrapper<>();
query.lambda().eq(UserCollect::getGoodsId,userCollect.getGoodsId())
.eq(UserCollect::getOpenid,userCollect.getOpenid());
UserCollect one = userCollectService.getOne(query);
if(one != null){
return ResultUtils.error("您已经收藏该商品!");
}
if(userCollectService.save(userCollect)){
return ResultUtils.success("收藏成功!");
}
return ResultUtils.error("收藏失败!");
}
@GetMapping("/list")
public ResultVo getList(String openid){
List<UserCollect> list = userCollectService.getList(openid);
return ResultUtils.success("查询成功!",list);
}
@GetMapping("/hasCollect")
public ResultVo hasCollect(UserCollect userCollect){
QueryWrapper<UserCollect> query = new QueryWrapper<>();
query.lambda().eq(UserCollect::getOpenid,userCollect.getOpenid())
.eq(UserCollect::getGoodsId,userCollect.getGoodsId());
UserCollect list = userCollectService.getOne(query);
if(list != null){
return ResultUtils.success("查询成功!","1");
}else{
return ResultUtils.success("查询成功!","0");
}
}
//取消收藏
@PostMapping("/cancelCollect")
public ResultVo cancelCollect(@RequestBody UserCollect userCollect){
//查询是否收藏
QueryWrapper<UserCollect> query = new QueryWrapper<>();
query.lambda().eq(UserCollect::getGoodsId,userCollect.getGoodsId())
.eq(UserCollect::getOpenid,userCollect.getOpenid());
if(userCollectService.remove(query)){
return ResultUtils.success("取消收藏成功!");
}else{
return ResultUtils.error("取消收藏失败!");
}
}
//删除收藏
@PostMapping("/deleteCollect")
public ResultVo deleteCollect(@RequestBody UserCollect userCollect){
if(userCollectService.removeById(userCollect.getCollectId())){
return ResultUtils.success("删除收藏成功!");
}else{
return ResultUtils.error("删除收藏失败!");
}
}
}

@ -0,0 +1,21 @@
package com.itmk.web.user_collect.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 lombok.Data;
@Data
@TableName("user_collect")
public class UserCollect {
@TableId(type = IdType.AUTO)
private Long collectId;
private String openid;
@TableField(exist = false)
private String goodsName;
@TableField(exist = false)
private String goodsImage;
private Long goodsId;
}

@ -0,0 +1,13 @@
package com.itmk.web.user_collect.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.itmk.web.user_collect.entity.UserCollect;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface UserCollectMapper extends BaseMapper<UserCollect> {
List<UserCollect> getList(@Param("openid") String openid);
}

@ -0,0 +1,11 @@
package com.itmk.web.user_collect.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.itmk.web.user_collect.entity.UserCollect;
import java.util.List;
public interface UserCollectService extends IService<UserCollect> {
List<UserCollect> getList(String openid);
}

@ -0,0 +1,18 @@
package com.itmk.web.user_collect.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itmk.web.user_collect.entity.UserCollect;
import com.itmk.web.user_collect.mapper.UserCollectMapper;
import com.itmk.web.user_collect.service.UserCollectService;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserCollectServiceImpl extends ServiceImpl<UserCollectMapper, UserCollect> implements UserCollectService {
@Override
public List<UserCollect> getList(String openid) {
return this.baseMapper.getList(openid);
}
}

@ -0,0 +1,28 @@
package com.itmk.web.wx_user.controller;
import com.itmk.utils.ResultUtils;
import com.itmk.utils.ResultVo;
import com.itmk.web.wx_user.entity.WxUser;
import com.itmk.web.wx_user.service.WxUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/wxapi/wxUser")
public class WxUserController {
@Autowired
private WxUserService wxUserService;
@PostMapping("/saveOrUpdate")
public ResultVo saveOrUpdate(@RequestBody WxUser wxUser){
wxUserService.saveOrUpdate(wxUser);
return ResultUtils.success("更新成功!");
}
//查询头像昵称
@GetMapping("/getUserInfo")
public ResultVo getUserInfo(String openid) {
WxUser user = wxUserService.getById(openid);
return ResultUtils.error("查询成功!",user);
}
}

@ -0,0 +1,14 @@
package com.itmk.web.wx_user.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@Data
@TableName("wx_user")
public class WxUser {
@TableId
private String openid;
private String nickName;
private String avatarUrl;
}

@ -0,0 +1,9 @@
package com.itmk.web.wx_user.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.itmk.web.wx_user.entity.WxUser;
import org.apache.ibatis.annotations.Param;
public interface WxUserMapper extends BaseMapper<WxUser> {
int saveOrUpdateInfo(@Param("user") WxUser user);
}

@ -0,0 +1,8 @@
package com.itmk.web.wx_user.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.itmk.web.wx_user.entity.WxUser;
public interface WxUserService extends IService<WxUser> {
int saveOrUpdateInfo(WxUser user);
}

@ -0,0 +1,18 @@
package com.itmk.web.wx_user.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itmk.web.wx_user.entity.WxUser;
import com.itmk.web.wx_user.mapper.WxUserMapper;
import com.itmk.web.wx_user.service.WxUserService;
import org.springframework.stereotype.Service;
@Service
public class WxUserServiceImpl extends ServiceImpl<WxUserMapper, WxUser> implements WxUserService {
@Override
public int saveOrUpdateInfo(WxUser user) {
return this.baseMapper.saveOrUpdateInfo(user);
}
}

@ -5,55 +5,120 @@ 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.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.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestClientException;
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){
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<String, String> 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);
log.info("appId: " + appId);
log.info("appSecret: " + (appSecret != null ? "已设置" : "未设置"));
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<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) 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();
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);
return ResultUtils.success("获取成功", vo);
} catch (Exception e) {
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) {
e.printStackTrace();
log.error(String.format("WxLoginController.wxLogin Error", e));
return ResultUtils.error("网络连接失败: " + e.getMessage());
}
return ResultUtils.error("小程序获取open失败");
}
}

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

@ -0,0 +1,17 @@
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itmk.web.goods_comment.mapper.GoodsCommentMapper">
<select id="commentList" resultType="com.itmk.web.goods_comment.entity.GoodsComment">
select w.nick_name,w.avatar_url,g.* from goods_comment as g inner join wx_user as w on g.openid = w.openid
where g.goods_id =#{goodsId}
</select>
<select id="getList" resultType="com.itmk.web.goods_comment.entity.GoodsComment">
SELECT c.*,u.avatar_url,u.nick_name,gs.goods_name,gs.goods_image
FROM goods_comment as c
inner join wx_user as u on c.openid = u.openid
inner join sys_goods as gs on gs.goods_id = c.goods_id
order by c.create_time desc
</select>
</mapper>

@ -0,0 +1,10 @@
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itmk.web.user_collect.mapper.UserCollectMapper">
<select id="getList" resultType="com.itmk.web.user_collect.entity.UserCollect">
select g.goods_name,g.goods_image,c.* from user_collect as c inner join sys_goods as g on c.goods_id = g.goods_id
where c.openid =#{openid}
</select>
</mapper>

@ -1,4 +1,7 @@
import http from '../common/http.js'
import {
userStore
} from '../store/user.js'
//获取code
export const getCode = () => {
const promise = new Promise((resolve, reject) => {
@ -24,6 +27,9 @@ export const getCode = () => {
})
return promise;
}
export const getUserInfoApi = (parm) => {
return http.get("/wxapi/wxUser/getUserInfo", parm)
}
//小程序登录
export const wxLoginApi = (code) => {
return http.post('/wxapi/user/wxLogin', {
@ -32,6 +38,7 @@ export const wxLoginApi = (code) => {
}
//封装登录
export const userLogin = async () => {
const store = userStore()
//获取code
let res = await getCode()
//登录: 调用我们自己的后端接口
@ -45,28 +52,40 @@ export const userLogin = async () => {
uni.setStorageSync('openid', data.openid)
uni.setStorageSync('sessionkey', data.sessionKey)
}
let result = await getUserInfoApi({
openid: data.openid
})
console.log(result.data)
if (result.data && result.data.avatarUrl) {
store.avatarUrl = result.data.avatarUrl
uni.setStorageSync('avatarUrl', result.data.avatarUrl)
}
if (result.data && result.data.nickName) {
store.nickName = result.data.nickName
uni.setStorageSync('nickName', result.data.nickName)
}
}
//新增地址
export const addAddressApi = (parm) => {
console.log("新增地址成功")
return http.post("/wxapi/address", parm)
}
//地址列表
export const addressListApi = (parm) => {
console.log("查询地址列表成功")
return http.get("/wxapi/address/list", parm)
}
//编辑地址
export const editAddressApi = (parm) => {
console.log("编辑地址成功")
return http.put("/wxapi/address", parm)
}
//默认地址查询
export const getAddressApi = (parm) => {
console.log("查询默认地址成功")
return http.get("/wxapi/address/getAddress", parm)
}
//头像上传
export const uploadImageApi = (parm) => {
return http.upload(parm)
}
//头像昵称更新
export const saveOrUpdateApi = (parm) => {
return http.post("/wxapi/wxUser/saveOrUpdate", parm)
}

@ -58,5 +58,6 @@ export default {
get,
post,
put,
upload
upload,
baseUrl
}

@ -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,23 +31,73 @@
} from '@dcloudio/uni-app';
import {
ref,
getCurrentInstance
onMounted,
getCurrentInstance,
computed
} from 'vue'
import {
userLogin
userLogin,
uploadImageApi,
saveOrUpdateApi
} from '../../api/user.js'
import http from '../../common/http.js'
import {
userStore
} from '../../store/user.js';
const ustore = userStore()
//
const instance = getCurrentInstance();
//
const nickName = ref('大幕孤烟直')
const nickName = computed(() => {
if (ustore.nickName) {
return ustore.nickName
} else {
return ''
}
})
//
const avatarUrl = ref('/static/user.jpg')
const onChooseAvatar = async (e) => {
//const avatarUrl = ref('/static/user.jpg')
const avatarUrl = computed(() => {
if (ustore.avatarUrl) {
return http.baseUrl + ustore.avatarUrl
} else {
return '/static/user.jpg'
}
})
//
onMounted(() => {
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 = (e) => {
console.log(e)
avatarUrl.value = e.detail.avatarUrl
//
uploadImageApi({
url: "/api/upload/uploadImage",
filePath: e.detail.avatarUrl
}).then((res) => {
//
console.log(res)
let result = JSON.parse(res)
saveOrUpdateApi({
openid: uni.getStorageSync('openid'),
avatarUrl: result.data
}).then(res => {
console.log(res)
ustore.avatarUrl = result.data
})
})
}
const onNickName = (e) => {
@ -61,32 +111,123 @@
console.log(res)
nickName.value = res?.[0]?.value
console.log('昵称', nickName.value)
saveOrUpdateApi({
openid: uni.getStorageSync('openid'),
nickName: res?.[0]?.value
}).then(res => {
console.log(res)
ustore.nickName = res?.[0]?.value
})
})
// nickName.value = e.detail.nickName
}
//
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)
}
})
}
//
const toOrder = () => {
getUserInfo()
// getUserInfo()
//details.vue
uni.navigateTo({
url: '../order/order'
@ -94,7 +235,9 @@
}
onShow(() => {
userLogin()
getUserInfo()
// getUserInfo()
// getUserInfo
loadUserInfoFromStorage();
})
</script>

@ -0,0 +1,19 @@
// 引入
import {
defineStore
} from 'pinia';
//通过defineStore定义一个store,
// defineStore 第一个参数是唯一的
export const userStore = defineStore('userStore', {
state: () => {
return {
nickName: '',
avatarUrl: ''
};
},
// 也可以这样定义
// state: () => ({ count: 0 })
actions: {
},
});

@ -12,6 +12,7 @@
"@wangeditor/editor": "^5.1.23",
"@wangeditor/editor-for-vue": "^5.1.12",
"axios": "^1.11.0",
"echarts": "^6.0.0",
"element-plus": "^2.10.6",
"pinia": "^3.0.3",
"vue": "^3.5.17",
@ -1974,6 +1975,16 @@
"node": ">= 0.4"
}
},
"node_modules/echarts": {
"version": "6.0.0",
"resolved": "https://registry.npmmirror.com/echarts/-/echarts-6.0.0.tgz",
"integrity": "sha512-Tte/grDQRiETQP4xz3iZWSvoHrkCQtwqd6hs+mifXcjrCuo2iKWbajFObuLJVBlDIJlOzgQPd1hsaKt/3+OMkQ==",
"license": "Apache-2.0",
"dependencies": {
"tslib": "2.3.0",
"zrender": "6.0.0"
}
},
"node_modules/element-plus": {
"version": "2.10.6",
"resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.10.6.tgz",
@ -3015,6 +3026,12 @@
"node": ">=8.0"
}
},
"node_modules/tslib": {
"version": "2.3.0",
"resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz",
"integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==",
"license": "0BSD"
},
"node_modules/type": {
"version": "2.7.3",
"resolved": "https://registry.npmmirror.com/type/-/type-2.7.3.tgz",
@ -3182,6 +3199,15 @@
"resolved": "https://registry.npmmirror.com/wildcard/-/wildcard-1.1.2.tgz",
"integrity": "sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng==",
"license": "MIT"
},
"node_modules/zrender": {
"version": "6.0.0",
"resolved": "https://registry.npmmirror.com/zrender/-/zrender-6.0.0.tgz",
"integrity": "sha512-41dFXEEXuJpNecuUQq6JlbybmnHaqqpGlbH1yxnA5V9MMP4SbohSVZsJIwz+zdjQXSSlR1Vc34EgH1zxyTDvhg==",
"license": "BSD-3-Clause",
"dependencies": {
"tslib": "2.3.0"
}
}
}
}

@ -13,6 +13,7 @@
"@wangeditor/editor": "^5.1.23",
"@wangeditor/editor-for-vue": "^5.1.12",
"axios": "^1.11.0",
"echarts": "^6.0.0",
"element-plus": "^2.10.6",
"pinia": "^3.0.3",
"vue": "^3.5.17",

@ -0,0 +1,6 @@
//列表参数类型
export type CommentListParm = {
currentPage:number;
pageSize:number;
total:number; //分页的总条数
}

@ -0,0 +1,11 @@
import http from "../../http";
import type { CommentListParm } from "./CommentModel";
//列表
export const getListApi = (parm:CommentListParm)=>{
return http.get("/wxapi/comment/pcCommentList",parm)
}
//删除
export const deleteApi = (commentId:string)=>{
return http.delete(`/wxapi/comment/${commentId}`)
}

@ -0,0 +1,8 @@
//列表参数类型
export type OrderListParm = {
currentPage:number;
pageSize:number;
type:string;
userName:string;
total:number; //分页的总条数
}

@ -0,0 +1,11 @@
import http from "../../http";
import type { OrderListParm } from "./OrderModel";
//列表
export const gePcOrdertListApi = (parm: OrderListParm) => {
return http.get("/wxapi/order/getPcOrderList", parm)
}
// 发货
export const sendOrderApi = (orderId: string) => {
return http.put("/wxapi/order/sendOrder", { orderId: orderId })
}

@ -0,0 +1,73 @@
import type { CommentListParm } from "../../api/comment/CommentModel";
import { reactive ,ref,onMounted,nextTick} from "vue";
import {getListApi,deleteApi} from '../../api/comment/index'
import useInstance from "@/hooks/useInstance";
import { ElMessage } from "element-plus";
export default function useCommentTable(){
const {global} = useInstance()
//表格高度
const tableHeight = ref(0)
//接收表格数据
const tableList = ref([])
//列表查询的参数
const listParm = reactive<CommentListParm>({
currentPage:1,
pageSize:10,
total:0
})
//列表
const getList = async()=>{
let res = await getListApi(listParm)
if(res && res.code == 200){
tableList.value = res.data.records;
listParm.total = res.data.total;
}
}
//删除
const deleteBtn = async(commentId:string)=>{
const confirm = await global.$myconfirm('确定删除吗?')
if(confirm){
let res = await deleteApi(commentId)
if(res && res.code == 200){
ElMessage.success(res.msg)
getList()
}
}
}
//搜索
const searchBtn = ()=>{
getList()
}
//重置
const resetBtn = ()=>{
listParm.currentPage = 1;
getList()
}
//页容量改变时触发
const sizeChange = (size:number)=>{
listParm.pageSize = size;
getList()
}
//页数改变触发
const currentChange = (page:number)=>{
listParm.currentPage = page;
getList()
}
onMounted(()=>{
getList()
nextTick(()=>{
tableHeight.value = window.innerHeight - 180
})
})
return{
listParm,
getList,
searchBtn,
resetBtn,
tableList,
sizeChange,
currentChange,
tableHeight,
deleteBtn
}
}

@ -0,0 +1,77 @@
import type { OrderListParm } from '../../api/order/OrderModel'
import { nextTick, onMounted, reactive, ref } from 'vue'
import { gePcOrdertListApi, sendOrderApi } from '../../api/order'
import useInstance from '@/hooks/useInstance'
export default function useOrderTable() {
const { global } = useInstance()
//表格高度
const tableHeight = ref(0)
//表格数据
const tableList = ref([])
//表格查询的参数
const listParm = reactive<OrderListParm>({
currentPage: 1,
pageSize: 10,
type: '',
userName: '',
total: 0
})
//列表
const getList = async () => {
let res = await gePcOrdertListApi(listParm)
if (res && res.code == 200) {
//设置表格数据
tableList.value = res.data.records;
//设置分页总条数
listParm.total = res.data.total;
}
}
//搜索
const searchBtn = () => {
getList()
}
//重置
const resetBtn = () => {
listParm.currentPage = 1;
listParm.type = ''
getList()
}
//页容量改变触发
const sizeChange = (size: number) => {
listParm.pageSize = size;
getList()
}
//页数改变触发
const currentChange = (page: number) => {
listParm.currentPage = page;
getList()
}
// 发货
const sendOrder = async (orderId: string) => {
let confirm = await global.$myconfirm('确定发货吗?')
if (confirm) {
let res = await sendOrderApi(orderId)
if (res && res.code == 200) {
getList()
}
}
}
onMounted(() => {
getList()
nextTick(() => {
tableHeight.value = window.innerHeight - 220
})
})
return {
tableList,
sendOrder,
listParm,
getList,
searchBtn,
resetBtn,
sizeChange,
currentChange,
tableHeight
}
}

@ -1,13 +1,55 @@
<template>
<div>
评论管理
</div>
</template>
<el-main>
<!-- 表格 -->
<el-table :height="tableHeight" :data="tableList" border stripe>
<el-table-column label="名称" prop="goodsName"></el-table-column>
<el-table-column label="商品图片" prop="goodsImage">
<template #default="scope">
<el-image
:src="scope.row.goodsImage.split(',')[0]"
style="height: 60px; width: 60px; border-radius: 50%"
></el-image>
</template>
</el-table-column>
<el-table-column label="昵称" prop="nickName"></el-table-column>
<el-table-column label="头像" prop="avatarUrl">
<template #default="scope">
<el-image
:src="imgUrl+scope.row.avatarUrl"
style="height: 60px; width: 60px; border-radius: 50%"
></el-image>
</template>
</el-table-column>
<el-table-column label="时间" prop="createTime"></el-table-column>
<el-table-column label="操作" width="220" align="center">
<template #default="scope">
<el-button :icon="Delete" @click="deleteBtn(scope.row.commentId)" type="danger" size="default">删除</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<el-pagination
@size-change="sizeChange"
@current-change="currentChange"
:current-page.sync="listParm.currentPage"
:page-sizes="[10,20, 40, 80, 100]"
:page-size="listParm.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="listParm.total" background>
</el-pagination>
</el-main>
</template>
<script setup lang="ts">
import {ref} from 'vue'
import { Delete } from "@element-plus/icons-vue";
import useCommentTable from "../../compositions/comment/useCommentTable";
const imgUrl = ref('http://localhost:8089/')
//
const { listParm, deleteBtn, tableList,sizeChange ,currentChange,tableHeight} = useCommentTable();
<script setup lang="ts">
</script>
<style scoped>
</style>
</script>
<style scoped></style>

@ -1,13 +1,103 @@
<template>
<div>
订单管理
</div>
</template>
<script setup lang="ts">
</script>
<style scoped>
</style>
<el-main>
<!-- 搜索栏 -->
<el-form :model="listParm" :inline="true" size="default">
<el-form-item>
<el-input
v-model="listParm.userName"
placeholder="请输入姓名"
></el-input>
</el-form-item>
<el-form-item>
<el-button :icon="Search" @click="searchBtn"></el-button>
<el-button @click="resetBtn" type="danger" plain :icon="Close"
>重置</el-button
>
</el-form-item>
</el-form>
<!-- 表格
主子表的关键
1父表需要设置 row-key字段
2设置type = 'expand'
-->
<el-table
row-key="orderId"
:height="tableHeight"
:data="tableList"
border
stripe
>
<el-table-column type="expand">
<template #default="scope">
<el-table :data="scope.row.goodsList" border stripe>
<el-table-column label="菜品图片" prop="goodsImage">
<template #default="scope">
<el-image
:src="scope.row.goodsImage.split(',')[0]"
style="height: 60px; width: 60px; border-radius: 50%"
></el-image>
</template>
</el-table-column>
<el-table-column label="名称" prop="goodsName"></el-table-column>
<el-table-column label="价格" prop="price"></el-table-column>
<el-table-column label="规格" prop="specsName"></el-table-column>
</el-table>
</template>
</el-table-column>
<el-table-column label="姓名" prop="userName"></el-table-column>
<el-table-column label="电话" prop="phone"></el-table-column>
<el-table-column label="地址" prop="address"></el-table-column>
<el-table-column label="价格" prop="price"></el-table-column>
<el-table-column label="下单时间" prop="createTime"></el-table-column>
<el-table-column label="发货状态" prop="status">
<template #default="scope">
<el-tag v-if="scope.row.status == '0'" type="danger" size="default"
>待发货</el-tag
>
<el-tag v-if="scope.row.status == '1'" size="default" effect="dark"
>已发货</el-tag
>
<el-tag v-if="scope.row.status == '2'" size="default" effect="dark"
>已收货</el-tag
>
</template>
</el-table-column>
<el-table-column label="操作" width="200" align="center">
<template #default="scope">
<el-button type="primary" @click="sendOrder(scope.row.orderId)" :icon="Edit" size="default">发货</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<el-pagination
@size-change="sizeChange"
@current-change="currentChange"
:current-page.sync="listParm.currentPage"
:page-sizes="[10, 20, 40, 80, 100]"
:page-size="listParm.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="listParm.total"
background
>
</el-pagination>
</el-main>
</template>
<script setup lang="ts">
import { Search, Close, Plus, Edit, Delete } from "@element-plus/icons-vue";
import useOrderTable from "../../compositions/order/useOrderTable";
//
const {
tableList,
sendOrder,
listParm,
resetBtn,
searchBtn,
sizeChange,
currentChange,
tableHeight,
} = useOrderTable();
</script>
<style scoped></style>
Loading…
Cancel
Save