Compare commits

...

16 Commits

Author SHA1 Message Date
Suk1No 1ed402cb5f 123
1 month ago
ppnwsfegt d7272e7423 Merge pull request '完善默认地址查询接口' (#54) from Brunch_LPQ into main
1 month ago
riverflow af2d588e8a 完善默认地址查询接口
1 month ago
ppnwsfegt 59ce7e3e75 Merge pull request '修复小程序端的部分bug 完善首页点击事件接口对接' (#53) from Brunch_LPQ into main
1 month ago
riverflow 69f7ca2f33 修复小程序端的部分bug
1 month ago
ppnwsfegt 820ec95a25 Merge pull request '完成部分接口开发' (#52) from Brunch_LPQ into main
1 month ago
riverflow f9a914bc19 完成订单接口
1 month ago
riverflow 09cda3409b 完成收货地址数据库与接口开发
1 month ago
riverflow fef53ce0b6 完成菜品分类页面接口
1 month ago
pikvyz67s a936521d26 Merge pull request '"我的"页面及其中"我的订单"页面制作' (#51) from Brunch_DBK into main
1 month ago
pikvyz67s 0327bb1f13 Merge pull request '订单接口对接' (#50) from Brunch_DBK into main
1 month ago
pikvyz67s 237e186172 Merge pull request '实现存在多地址时选择实际地址的设置' (#49) from Brunch_DBK into main
1 month ago
pikvyz67s 74e7399938 Merge pull request '用户地址列表页面制作及其接口对接' (#48) from Brunch_DBK into main
1 month ago
pikvyz67s aa1391acbe Merge pull request '新增地址接口对接' (#47) from Brunch_DBK into main
1 month ago
pikvyz67s 6e9423b80d Merge pull request '确认订单页面制作和改进' (#46) from Brunch_DBK into main
1 month ago
pikvyz67s c88e9dd686 Merge pull request '商品详情页跳转首页和购物车页面并新建user.js' (#45) from Brunch_DBK into main
1 month ago

@ -0,0 +1,8 @@
# 默认忽略的文件
/shelf/
/workspace.xml
# 基于编辑器的 HTTP 客户端请求
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="com.codeverse.userSettings.MarscodeWorkspaceAppSettingsState">
<option name="ckgOperationStatus" value="SUCCESS" />
<option name="progress" value="0.72" />
</component>
</project>

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<annotationProcessing>
<profile default="true" name="Default" enabled="true" />
<profile name="Maven default annotation processors profile" enabled="true">
<sourceOutputDir name="target/generated-sources/annotations" />
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
<outputRelativeToContentRoot value="true" />
<module name="itmk-base-web" />
<module name="itmk-base-common" />
</profile>
</annotationProcessing>
</component>
<component name="JavacSettings">
<option name="ADDITIONAL_OPTIONS_OVERRIDE">
<module name="itmk-base-common" options="-parameters" />
<module name="itmk-base-web" options="-parameters" />
</option>
</component>
</project>

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="file://$PROJECT_DIR$/itmk-base-parent/itmk-base-common/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/itmk-base-parent/itmk-base-web/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/itmk-base-parent/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/itmk-base-parent/src/main/resources" charset="UTF-8" />
</component>
</project>

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RemoteRepositoriesConfiguration">
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Central Repository" />
<option name="url" value="https://repo.maven.apache.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Maven Central repository" />
<option name="url" value="https://repo1.maven.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="jboss.community" />
<option name="name" value="JBoss Community repository" />
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
</remote-repository>
</component>
</project>

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/itmk-base-parent/pom.xml" />
</list>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="jbr-17" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/api-interface.iml" filepath="$PROJECT_DIR$/.idea/api-interface.iml" />
</modules>
</component>
</project>

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
</component>
</project>

@ -48,6 +48,11 @@
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
</dependencies>
<build>

@ -0,0 +1,29 @@
package com.itmk.utils;
public class BusinessException extends RuntimeException {
private Integer code;
private String message;
public BusinessException(Integer code, String message) {
this.code = code;
this.message = message;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
@Override
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}

@ -0,0 +1,22 @@
package com.itmk.utils;
public enum BusinessExceptionEnum {
SERVER_ERROR(500, "服务器异常!"),
;
private Integer code;
private String message;
BusinessExceptionEnum(Integer code, String message) {
this.code = code;
this.message = message;
}
public Integer getCode() {
return code;
}
public String getMessage() {
return message;
}
}

@ -0,0 +1,150 @@
package com.itmk.utils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.alibaba.fastjson.serializer.JSONLibDataFormatSerializer;
import com.alibaba.fastjson.serializer.SerializeConfig;
import com.alibaba.fastjson.serializer.SerializerFeature;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class FastJsonTools {
private static SerializeConfig CONFIG = null;
static {
CONFIG = new SerializeConfig();
// 使用和json-lib兼容的日期输出格式
CONFIG.put(java.util.Date.class, new JSONLibDataFormatSerializer());
// 使用和json-lib兼容的日期输出格式
CONFIG.put(java.sql.Date.class, new JSONLibDataFormatSerializer());
}
private static final SerializerFeature[] FEATURES = {
// 输出空置字段
SerializerFeature.WriteMapNullValue,
// list字段如果为null输出为[]而不是null
SerializerFeature.WriteNullListAsEmpty,
// 数值字段如果为null输出为0而不是null
SerializerFeature.WriteNullNumberAsZero,
// Boolean字段如果为null输出为false而不是null
SerializerFeature.WriteNullBooleanAsFalse,
// 字符类型字段如果为null输出为""而不是null
SerializerFeature.WriteNullStringAsEmpty
};
/**
* Object
*
* @param object
* @return
*/
public static String toJSONFeaturesString(Object object) {
return JSON.toJSONString(object, CONFIG, FEATURES);
}
/**
* Object
*
* @param object
* @return
*/
public static String toJSONString(Object object) {
return JSON.toJSONString(object, CONFIG);
}
/**
* jsonmap
*
* @param s
* @return
*/
public static Map stringToCollect(String s) {
Map m = JSONObject.parseObject(s);
return m;
}
/**
* mapstring
*
* @param m
* @return
*/
public static String collectToString(Map m) {
String s = JSONObject.toJSONString(m);
return s;
}
/**
* fastjson json JavaBean
*
* @param jsonString
* @param cls
* @return
*/
public static <T> T getJson(String jsonString, Class<T> cls) {
T t = null;
try {
t = JSON.parseObject(jsonString, cls);
} catch (Exception e) {
e.printStackTrace();
}
return t;
}
/**
* fastjson json List<JavaBean> List<String>
*
* @param jsonString
* @param cls
* @return
*/
public static <T> List<T> getArrayJson(String jsonString, Class<T> cls) {
List<T> list = new ArrayList<T>();
try {
list = JSON.parseArray(jsonString, cls);
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
/**
* fastjson json List<JavaBean> List<String>
*
* @param jsonString
* @return
*/
@SuppressWarnings("unchecked")
public static <T> List<T> getArrayJson(String jsonString) {
List<T> list = new ArrayList<T>();
try {
list = (List<T>) JSON.parseArray(jsonString);
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
/**
* fastjson jsonString List<Map<String,Object>>
*
* @param jsonString
* @return
*/
public static List<Map<String, Object>> getListMap(String jsonString) {
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
try {
list = JSON.parseObject(jsonString, new TypeReference<List<Map<String, Object>>>() {
});
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
}

@ -0,0 +1,143 @@
package com.itmk.utils;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* Http
*/
public class HttpClientUtil {
//连接超时时间默认10秒
private static final int socketTimeout = 10000;
//传输超时时间默认30秒
private static final int connectTimeout = 30000;
public static String doGet(String url, Map<String, String> param) {
// 创建Httpclient对象
CloseableHttpClient httpclient = HttpClients.createDefault();
String resultString = "";
CloseableHttpResponse response = null;
try {
// 创建uri
URIBuilder builder = new URIBuilder(url);
if (param != null) {
for (String key : param.keySet()) {
builder.addParameter(key, param.get(key));
}
}
URI uri = builder.build();
// 创建http GET请求
HttpGet httpGet = new HttpGet(uri);
// 执行请求
response = httpclient.execute(httpGet);
// 判断返回状态是否为200
if (response.getStatusLine().getStatusCode() == 200) {
resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (response != null) {
response.close();
}
httpclient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return resultString;
}
public static String doGet(String url) {
return doGet(url, null);
}
public static String doPost(String url, Map<String, String> param) {
// 创建Httpclient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = null;
String resultString = "";
try {
// 创建Http Post请求
HttpPost httpPost = new HttpPost(url);
// 创建参数列表
if (param != null) {
List<NameValuePair> paramList = new ArrayList<>();
for (String key : param.keySet()) {
paramList.add(new BasicNameValuePair(key, param.get(key)));
}
// 模拟表单
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList);
httpPost.setEntity(entity);
}
// 执行http请求
response = httpClient.execute(httpPost);
resultString = EntityUtils.toString(response.getEntity(), "utf-8");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
response.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return resultString;
}
public static String doPost(String url) {
return doPost(url, null);
}
public static String doPostJson(String url, String json) {
// 创建Httpclient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = null;
String resultString = "";
try {
// 创建Http Post请求
HttpPost httpPost = new HttpPost(url);
// 创建请求内容
StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON);
httpPost.setEntity(entity);
// 执行http请求
response = httpClient.execute(httpPost);
resultString = EntityUtils.toString(response.getEntity(), "utf-8");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
response.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return resultString;
}
}

@ -0,0 +1,19 @@
package com.itmk.web.address.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@Data
@TableName("user_address")
public class UserAddress {
@TableId(type = IdType.AUTO)
private Long addressId;
private String openid;
private String userName;
private String phone;
private String area;
private String address;
private String status;
}

@ -0,0 +1,7 @@
package com.itmk.web.address.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.itmk.web.address.entity.UserAddress;
public interface UserAddressMapper extends BaseMapper<UserAddress> {
}

@ -0,0 +1,7 @@
package com.itmk.web.address.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.itmk.web.address.entity.UserAddress;
public interface UserAddressService extends IService<UserAddress> {
}

@ -0,0 +1,11 @@
package com.itmk.web.address.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itmk.web.address.entity.UserAddress;
import com.itmk.web.address.mapper.UserAddressMapper;
import com.itmk.web.address.service.UserAddressService;
import org.springframework.stereotype.Service;
@Service
public class UserAddressServiceImpl extends ServiceImpl<UserAddressMapper, UserAddress> implements UserAddressService {
}

@ -2,10 +2,15 @@ package com.itmk.web.category.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.goods.entity.SysGoods;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
@Data
@TableName("sys_category")//表明该类实体类所关联的数据表库
@ -16,4 +21,7 @@ public class SysCategory {
private Long categoryId;
private String categoryName;
private Integer orderNum;
@TableField(exist = false)
private List<SysGoods> goods = new ArrayList<>();
}

@ -0,0 +1,25 @@
package com.itmk.web.order.controller;
import com.itmk.utils.ResultUtils;
import com.itmk.utils.ResultVo;
import com.itmk.web.order.entity.OrderParm;
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;
@RestController
@RequestMapping("/wxapi/order")
public class UserOrderController {
@Autowired
private UserOrderService userOrderService;
//下单
@PostMapping("/splaceOrder")
public ResultVo splaceOrder(@RequestBody OrderParm parm){
userOrderService.splaceOrder(parm);
return ResultUtils.success("提交成功!");
}
}

@ -0,0 +1,17 @@
package com.itmk.web.order.entity;
import lombok.Data;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
@Data
public class OrderParm {
private String openid;
private String userName;
private String phone;
private String address;
private BigDecimal price;
private List<com.itmk.web.order.entity.ParmDetail> details = new ArrayList<>();
}

@ -0,0 +1,16 @@
package com.itmk.web.order.entity;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class ParmDetail {
private Long goodsId;
private String goodsImage;
private String goodsName;
private String goodsUnit;
private String specsName;
private BigDecimal price;
private Integer num;
}

@ -0,0 +1,23 @@
package com.itmk.web.order.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
@Data
@TableName("user_order")
public class UserOrder {
@TableId(type = IdType.AUTO)
private Long orderId;
private String openid;
private String userName;
private String phone;
private String address;
private BigDecimal price;
private Date createTime;
private String status;
}

@ -0,0 +1,7 @@
package com.itmk.web.order.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.itmk.web.order.entity.UserOrder;
public interface UserOrderMapper extends BaseMapper<UserOrder> {
}

@ -0,0 +1,9 @@
package com.itmk.web.order.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.itmk.web.order.entity.OrderParm;
import com.itmk.web.order.entity.UserOrder;
public interface UserOrderService extends IService<UserOrder> {
void splaceOrder(OrderParm parm);
}

@ -0,0 +1,49 @@
package com.itmk.web.order.service.impl;
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.mapper.UserOrderMapper;
import com.itmk.web.order.service.UserOrderService;
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.stereotype.Service;
import java.util.Date;
import java.util.ArrayList;
import java.util.List;
@Service
public class UserOrderServiceImpl extends ServiceImpl<UserOrderMapper, UserOrder> implements UserOrderService {
@Autowired
private UserOrderDetailService userOrderDetailService;
@Override
public void splaceOrder(OrderParm parm) {
//操作订单主表
UserOrder order = new UserOrder();
BeanUtils.copyProperties(parm, order);
order.setCreateTime(new Date());
order.setStatus("0");
int ls = this.baseMapper.insert(order);
//操作子表:订单对应的商品
if (ls > 0) {
List<ParmDetail> details = parm.getDetails();
List<UserOrderDetail> list = new ArrayList<>();
if (details.size() > 0) {
for (int i = 0; i < details.size(); i++) {
UserOrderDetail detail = new UserOrderDetail();
BeanUtils.copyProperties(details.get(i), detail);
//设置关联的主表
detail.setOrderId(order.getOrderId());
list.add(detail);
}
}
//批量插入
userOrderDetailService.saveBatch(list);
}
}
}

@ -0,0 +1,23 @@
package com.itmk.web.order_detail.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.math.BigDecimal;
@Data
@TableName("user_order_detail")
public class UserOrderDetail {
@TableId(type = IdType.AUTO)
private Long detailId;
private Long orderId;
private Long goodsId;
private String goodsImage;
private String goodsName;
private String goodsUnit;
private String specsName;
private BigDecimal price;
private Integer num;
}

@ -0,0 +1,7 @@
package com.itmk.web.order_detail.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.itmk.web.order_detail.entity.UserOrderDetail;
public interface UserOrderDetailMapper extends BaseMapper<UserOrderDetail> {
}

@ -0,0 +1,7 @@
package com.itmk.web.order_detail.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.itmk.web.order_detail.entity.UserOrderDetail;
public interface UserOrderDetailService extends IService<UserOrderDetail> {
}

@ -0,0 +1,11 @@
package com.itmk.web.order_detail.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itmk.web.order_detail.entity.UserOrderDetail;
import com.itmk.web.order_detail.mapper.UserOrderDetailMapper;
import com.itmk.web.order_detail.service.UserOrderDetailService;
import org.springframework.stereotype.Service;
@Service
public class UserOrderDetailServiceImpl extends ServiceImpl<UserOrderDetailMapper, UserOrderDetail> implements UserOrderDetailService {
}

@ -0,0 +1,64 @@
package com.itmk.web.wxapi.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.itmk.utils.ResultUtils;
import com.itmk.utils.ResultVo;
import com.itmk.web.address.entity.UserAddress;
import com.itmk.web.address.service.UserAddressService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/wxapi/address")
public class UserAddressController {
@Autowired
private UserAddressService userAddressService;
//新增地址
@PostMapping
public ResultVo add(@RequestBody UserAddress userAddress) {
if (userAddressService.save(userAddress)) {
return ResultUtils.success("新增地址成功!");
}
return ResultUtils.error("新增地址失败!");
}
//编辑地址
@PutMapping
public ResultVo edit(@RequestBody UserAddress userAddress) {
//先全部更新为不是默认
LambdaUpdateWrapper<UserAddress> query = new LambdaUpdateWrapper<>();
query.eq(UserAddress::getOpenid, userAddress.getOpenid()).set(UserAddress::getStatus, "0");
userAddressService.update(query);
//更新当前编辑的这条数据
if (userAddressService.updateById(userAddress)) {
return ResultUtils.success("编辑地址成功!");
}
return ResultUtils.error("编辑地址失败!");
}
//列表
@GetMapping("/list")
public ResultVo list(String openid) {
//排序按status排序默认的排在第一条
QueryWrapper<UserAddress> query = new QueryWrapper<>();
query.lambda().eq(UserAddress::getOpenid, openid);
query.lambda().orderByDesc(UserAddress::getStatus);
List<UserAddress> list = userAddressService.list(query);
return ResultUtils.success("查询成功", list);
}
//获取默认地址
@GetMapping("/getAddress")
public ResultVo getAddress(String openid) {
QueryWrapper<UserAddress> query = new QueryWrapper<>();
query.lambda().eq(UserAddress::getOpenid, openid)
.eq(UserAddress::getStatus, "1");
UserAddress address = userAddressService.getOne(query);
return ResultUtils.success("查询成功", address);
}
}

@ -0,0 +1,59 @@
package com.itmk.web.wxapi.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.itmk.utils.ResultUtils;
import com.itmk.utils.ResultVo;
import com.itmk.web.category.entity.SysCategory;
import com.itmk.web.category.service.SysCategoryService;
import com.itmk.web.goods.entity.SysGoods;
import com.itmk.web.goods.service.SysGoodsService;
import com.itmk.web.goods_specs.entity.SysGoodsSpecs;
import com.itmk.web.goods_specs.service.SysGoodsSpecsService;
import com.itmk.web.banner.entity.SysBanner;
import com.itmk.web.banner.service.SysBannerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/wxapi/category")
public class WxCategoryController {
@Autowired
private SysGoodsService sysGoodsService;
@Autowired
private SysCategoryService sysCategoryService;
@Autowired
private SysGoodsSpecsService sysGoodsSpecsService;
//分类数据
@GetMapping("/getCategoryList")
public ResultVo getCategoryList(){
QueryWrapper<SysCategory> query = new QueryWrapper<>();
query.lambda().orderByAsc(SysCategory::getOrderNum);
List<SysCategory> list = sysCategoryService.list(query);
if(list.size() > 0){
for (int i = 0; i < list.size(); i++) {
//查询分类下面的菜品
QueryWrapper<SysGoods> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().eq(SysGoods::getCategoryId,list.get(i).getCategoryId())
.orderByAsc(SysGoods::getOrderNum);
List<SysGoods> goods = sysGoodsService.list(queryWrapper);
list.get(i).setGoods(goods);
if(goods.size() > 0){
for (int j = 0; j < goods.size(); j++) {
//查询价格
QueryWrapper<SysGoodsSpecs> queryWrapperPrice = new QueryWrapper<>();
queryWrapperPrice.lambda().eq(SysGoodsSpecs::getGoodsId,goods.get(j).getGoodsId())
.orderByAsc(SysGoodsSpecs::getOrderNum);
List<SysGoodsSpecs> specs = sysGoodsSpecsService.list(queryWrapperPrice);
goods.get(j).setSpecs(specs);
}
}
}
}
return ResultUtils.success("查询成功",list);
}
}

@ -0,0 +1,59 @@
package com.itmk.web.wxapi.controller;
import com.itmk.utils.*;
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.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;
@Slf4j
@RestController
@RequestMapping("/wxapi/user")
public class WxLoginController {
@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<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);
try {
//发送请求
String wxResult = HttpClientUtil.doGet(url, param);
//转换参数
Code2Session userJson = FastJsonTools.getJson(wxResult, Code2Session.class);
log.info("userJson: " + userJson);
if(userJson == 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));
}
return ResultUtils.error("小程序获取open失败");
}
}

@ -0,0 +1,18 @@
package com.itmk.web.wxapi.entity;
import lombok.Data;
@Data
public class Code2Session {
private String openid; //用户唯一标识
private String session_key; //会话密钥
private String unionid; //用户在开放平台的唯一标识符,在满足 UnionID 下发条件的情况下会返回,详见 UnionID 机制说明。
private Integer errcode; //错误码
private String errmsg; //错误信息
}

@ -0,0 +1,8 @@
package com.itmk.web.wxapi.entity;
import lombok.Data;
@Data
public class LoginParm {
private String code;
}

@ -0,0 +1,9 @@
package com.itmk.web.wxapi.entity;
import lombok.Data;
@Data
public class LoginVo {
private String openid;
private String sessionKey;
}

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

@ -0,0 +1,7 @@
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itmk.web.address.mapper.UserAddressMapper">
</mapper>

@ -0,0 +1,7 @@
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itmk.web.user_order_detail.mapper.UserOrderDetailMapper">
</mapper>

@ -0,0 +1,7 @@
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itmk.web.user_order.mapper.UserOrderMapper">
</mapper>

@ -48,17 +48,21 @@ export const userLogin = async () => {
}
//新增地址
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)
}

@ -39,6 +39,9 @@
ref,
getCurrentInstance
} from "vue"
import {
onLoad
} from '@dcloudio/uni-app'
//
const instance = getCurrentInstance();
@ -46,6 +49,7 @@
const scrollTop = ref(0)
const current = ref(0)
const menuHeight = ref(0)
const menuItemHeight = ref(0)
const getImg = () => {
return Math.floor(Math.random() * 35)
@ -63,7 +67,6 @@
// item
scrollTop.value = index * menuItemHeight.value + menuItemHeight.value / 2 - menuHeight.value / 2;
}
const getElRect = (elClass, dataVal) => {
new Promise((resolve, reject) => {
const query = uni.createSelectorQuery().in(instance);
@ -95,8 +98,15 @@
const toDetails = (item) => {
console.log(item)
//details.vue
// JSON
const encodedGoods = encodeURIComponent(JSON.stringify(item))
// uni.navigateTo({
// url: '../detail/detail?goods=' + JSON.stringify(item)
// });
uni.navigateTo({
url: '../detail/detail?goods=' + JSON.stringify(item)
url: '../detail/detail?goods=' + encodeURIComponent(JSON.stringify(item))
});
}
onLoad(() => {
@ -223,5 +233,4 @@
width: 120rpx;
height: 120rpx;
}
</style>

@ -192,21 +192,52 @@
}
onLoad((options) => {
userLogin()
const goods = JSON.parse(options.goods)
swipperList.value = goods.goodsImage.split(',')
console.log(goods)
goodsUnit.value = goods.goodsUnit
title.value = goods.goodsName
price.value = goods.specs[0].goodsPrice
specs.value = goods.specs
content.value = goods.goodsDesc
//
carData.value.goodsId = goods.goodsId
carData.value.goodsName = goods.goodsName
carData.value.goodsUnit = goods.goodsUnit
carData.value.specsName = goods.specs[0].specsName
carData.value.price = goods.specs[0].goodsPrice
carData.value.goodsImage = goods.goodsImage.split(',')[0]
// const goods = JSON.parse(options.goods)
// swipperList.value = goods.goodsImage.split(',')
// console.log(goods)
// goodsUnit.value = goods.goodsUnit
// title.value = goods.goodsName
// price.value = goods.specs[0].goodsPrice
// specs.value = goods.specs
// content.value = goods.goodsDesc
// //
// carData.value.goodsId = goods.goodsId
// carData.value.goodsName = goods.goodsName
// carData.value.goodsUnit = goods.goodsUnit
// carData.value.specsName = goods.specs[0].specsName
// carData.value.price = goods.specs[0].goodsPrice
// carData.value.goodsImage = goods.goodsImage.split(',')[0]
//
try {
//
const decodedGoods = decodeURIComponent(options.goods);
const goods = JSON.parse(decodedGoods);
swipperList.value = goods.goodsImage.split(',')
console.log(goods)
goodsUnit.value = goods.goodsUnit
title.value = goods.goodsName
price.value = goods.specs[0].goodsPrice
specs.value = goods.specs
content.value = goods.goodsDesc
//
carData.value.goodsId = goods.goodsId
carData.value.goodsName = goods.goodsName
carData.value.goodsUnit = goods.goodsUnit
carData.value.specsName = goods.specs[0].specsName
carData.value.price = goods.specs[0].goodsPrice
carData.value.goodsImage = goods.goodsImage.split(',')[0]
} catch (error) {
console.error('解析商品数据失败:', error)
uni.showToast({
title: '商品信息加载失败',
icon: 'none'
})
//
setTimeout(() => {
uni.navigateBack()
}, 1500)
}
})
</script>

@ -7,7 +7,7 @@
<view class="wrap">
<u-waterfall v-model="flowList" ref="uWaterfall">
<template v-slot:left="{leftList}">
<view class="demo-warter" v-for="(item, index) in leftList" :key="index">
<view @click="toDetails(item)" class="demo-warter" v-for="(item, index) in leftList" :key="index">
<!-- 警告微信小程序中需要hx2.8.11版本才支持在template中结合其他组件比如下方的lazy-load组件 -->
<u-lazy-load threshold="-450" border-radius="10" :image="item.goodsImage.split(',')[0]" :index="index"></u-lazy-load>
@ -23,12 +23,12 @@
<view class="demo-title">
/
</view>
<image class="carimg" :src="carimg"></image>
<image @click="toDetails(item)" class="carimg" :src="carimg"></image>
</view>
</view>
</template>
<template v-slot:right="{rightList}">
<view class="demo-warter" v-for="(item, index) in rightList" :key="index">
<view @click="toDetails(item)" class="demo-warter" v-for="(item, index) in rightList" :key="index">
<u-lazy-load threshold="-450" border-radius="10" :image="item.goodsImage.split(',')[0]" :index="index"></u-lazy-load>
<view class="demo-title">
@ -43,7 +43,7 @@
<view class="demo-title">
/
</view>
<image class="carimg" :src="carimg"></image>
<image @click="toDetails(item)" class="carimg" :src="carimg"></image>
</view>
</view>
</template>
@ -80,8 +80,12 @@
const flowList = ref([]) //
const toDetails = (item) => {
//details.vue
// uni.navigateTo({
// url: '../detail/detail?goods=' + JSON.stringify(item)
// });
uni.navigateTo({
url: '../detail/detail?goods=' + JSON.stringify(item)
url: '../detail/detail?goods=' + encodeURIComponent(JSON.stringify(item))
});
}
//

Loading…
Cancel
Save