尚品汇-H5移动端整合系统(五十五)

目录:

(1)运行前端页面

(2)启动前端页面

(3)添加搜索分类接口

(4)购物车模块修改

(5)登录模块

(6)订单模块

(7)支付系统

(8)查看我的订单

(1)运行前端页面

将页面放入nginx中 配置nginx.conf 

server {listen       8989;server_name  localhost;#charset koi8-r;#access_log  logs/host.access.log  main;location / {root   h5;index  index.html index.htm;}#error_page  404              /404.html;# redirect server error pages to the static page /50x.html#error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}     }

前面用的8086,这里新添加一个server 

重要! 访问首页 之后  点击我的 设置 修改 base路径 改为当前网关地址 http://localhost

(2)启动前端页面

ServerGatewayApplication :80/

ServiceProductApplication [devtools] :8206/

ServiceListApplication [devtools] :8203/

ServiceItemApplication [devtools] :8202/

查看首页,

商品检索:

在Nacos网关配置中添加配置

- id: service-list

          uri: lb://service-list

          predicates:

            - Path=/*/list/** # 路径匹配

商品详情

需要项目启动,启动成功后就行获取数据列表

其次需要修改配置:

(3)添加搜索分类接口

 这个分类接口不同需要修改:

service-product

代码跟原来写的一样,只是路经不同,新建一个conttroller

/*** date:2022/6/21 10:34* 描述:**/
@RestController
@RequestMapping("/api/product/")
public class IndexApiController {@Autowiredprivate ManageService manageService;@GetMapping("getBaseCategoryList")public Result getBaseCategoryList(){//  调用服务层方法List<JSONObject> list = manageService.getBaseCategoryList();return Result.ok(list);}
}

 

 

(4)购物车模块修改

 

 实现选择清空状态保存:

购物车控制器:


@GetMapping("/allCheckCart/{isChecked}")
public Result allCheckCart(@PathVariable Integer isChecked,HttpServletRequest request){//  获取用户IdString userId = AuthContextHolder.getUserId(request);//  判断用户Id 为空if (StringUtils.isEmpty(userId)){userId = AuthContextHolder.getUserTempId(request);}//  调用方法this.cartService.allCheckCart(userId,isChecked);//  默认返回return Result.ok();
}

接口: 


/*** 选中购物车列表* @param userId* @param isChecked*/
void allCheckCart(String userId, Integer isChecked);

实现类: 


@Override
public void allCheckCart(String userId, Integer isChecked) {//  获取到购物车keyString cartKey = this.getCartKey(userId);List<CartInfo> cartInfoList = this.redisTemplate.opsForHash().values(cartKey);//  声明一个Map 集合HashMap<String, Object> hashMap = new HashMap<>();//  循环遍历for (CartInfo cartInfo : cartInfoList) {cartInfo.setIsChecked(isChecked);hashMap.put(cartInfo.getSkuId().toString(),cartInfo);}//  将数据存储到购物车中this.redisTemplate.opsForHash().putAll(cartKey,hashMap);
}

选中后,再刷新页面也可以选中: 

清空: /api/cart/clearCart

@GetMapping("clearCart")
public Result clearCart(HttpServletRequest request){// 如何获取userIdString userId = AuthContextHolder.getUserId(request);if (StringUtils.isEmpty(userId)) {// 获取临时用户IduserId = AuthContextHolder.getUserTempId(request);}cartService.clearCart(userId);return Result.ok();
}
/*** 清空购物车* @param userId*/
void clearCart(String userId);

@Override
public void clearCart(String userId) {//  获取购物车keyString cartKey = getCartKey(userId);//  删除数据redisTemplate.delete(cartKey);
}

点击清空: 

清空后刷新页面就没了 

(5)登录模块

点击结算,判断是否登录,进行跳转登录页面 

登录模块信息发生变化:

将原来的接收对象UserInfo 改为LoginVo

@Data
@ApiModel(description="登录对象")
public class LoginVo {@ApiModelProperty(value = "手机号")private String phone;@ApiModelProperty(value = "密码")private String password;@ApiModelProperty(value = "IP")private String ip;
}

 这里可以改登录的接口实体类,先进行演示,但是已改就不能通用了,我们可以吧这个接口改成通用的接口,或者重新写一个登录的接口

@PostMapping("login")
public Result login(@RequestBody LoginVo loginVo, HttpServletRequest request){控制器内容不变
}

接口: 

UserInfo login(LoginVo loginVo);

实现类: 


@Override
public UserInfo login(LoginVo loginVo) {//  select * from user_info where login_name = ? and passwd = ?QueryWrapper<UserInfo> userInfoQueryWrapper = new QueryWrapper<>();//  adminuserInfoQueryWrapper.eq("login_name",loginVo.getPhone());//  111111 ---> 加密之后的数据。 对其进行了md5加密String passwd = loginVo.getPassword();String newPassword = DigestUtils.md5DigestAsHex(passwd.getBytes());//  96e79218965eb72c92a549dd5a330112userInfoQueryWrapper.eq("passwd",newPassword);UserInfo info = userInfoMapper.selectOne(userInfoQueryWrapper);//  判断if (info!=null){return info;}return null;
}

 

登录成功跳转到订单页面: 

(6)订单模块

点击去结算:

 

收货地址列表

控制器:http://localhost/api/user/userAddress/auth/findUserAddressList

//  http://localhost/api/user/userAddress/auth/findUserAddressList
@GetMapping("userAddress/auth/findUserAddressList")
public Result findUserAddressList(HttpServletRequest request){String userId = AuthContextHolder.getUserId(request);return Result.ok(userAddressService.findUserAddressListByUserId(userId));
}

 

 (7)支付系统

这里我们现为了演示,先修改部分代码,到时候需要提供两个接口 

生成二维码:要替换掉原来的对象AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();
bizContent.put("product_code", "QUICK_WAP_WAY");

 

(8)查看我的订单

添加一个状态查询参数: 

@GetMapping("/auth/{page}/{limit}")public Result getOrderPage(@PathVariable Long page,@PathVariable Long limit,HttpServletRequest request){//  获取到用户IdString userId = AuthContextHolder.getUserId(request);String orderStatus = request.getParameter("orderStatus");//  声明一个 page 对象Page<OrderInfo> orderInfoPage = new Page<>(page, limit);//  调用服务层方法查询数据:第二个参数?IPage<OrderInfo> infoIPage = this.orderService.getOrderPage(orderInfoPage,userId,orderStatus);//  返回数据return Result.ok(infoIPage);}

    @Overridepublic IPage<OrderInfo> getOrderPage(Page<OrderInfo> orderInfoPage, String userId, String orderStatus) {IPage<OrderInfo> infoIPage = orderInfoMapper.selectUserOrderPage(orderInfoPage,userId,orderStatus);//  获取到订单状态:中文infoIPage.getRecords().stream().forEach(orderInfo -> {orderInfo.setOrderStatusName(OrderStatus.getStatusNameByStatus(orderInfo.getOrderStatus()));});//  返回数据。return infoIPage;}

IPage<OrderInfo> selectUserOrderPage(Page<OrderInfo> orderInfoPage, @Param("userId") String userId, @Param("orderStatus")String orderStatus);

<select id="selectUserOrderPage" resultMap="OrderInfoMap">SELECToi.id,oi.consignee,oi.consignee_tel,oi.total_amount,oi.order_status,oi.user_id,oi.payment_way,oi.delivery_address,oi.order_comment,oi.out_trade_no,oi.trade_body,oi.create_time,oi.expire_time,oi.process_status,od.id detail_id,od.order_id,od.sku_id,od.sku_name,od.img_url,od.order_price,od.sku_num,od.create_timeFROMorder_info oiINNER JOIN order_detail od ON od.order_id = oi.id<where>AND user_id = #{userId}AND oi.order_status NOT IN ('CLOSED', 'SPLIT')<if test="orderStatus != null and orderStatus != ''">and oi.order_status = #{orderStatus}</if></where>ORDER BYoi.id DESC
</select>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/54399.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Golang | Leetcode Golang题解之第423题从英文中重建数字

题目&#xff1a; 题解&#xff1a; func originalDigits(s string) string {c : map[rune]int{}for _, ch : range s {c[ch]}cnt : [10]int{}cnt[0] c[z]cnt[2] c[w]cnt[4] c[u]cnt[6] c[x]cnt[8] c[g]cnt[3] c[h] - cnt[8]cnt[5] c[f] - cnt[4]cnt[7] c[s] - cnt[6]…

【Verilog学习日常】—牛客网刷题—Verilog快速入门—VL16

使用8线-3线优先编码器Ⅰ实现16线-4线优先编码器 描述 ②请使用2片该优先编码器Ⅰ及必要的逻辑电路实现16线-4线优先编码器。优先编码器Ⅰ的真值表和代码已给出。 可将优先编码器Ⅰ的代码添加到本题答案中&#xff0c;并例化。 优先编码器Ⅰ的代码如下&#xff1a; module…

【CentOS 7 】设置密码命令

好久没用虚拟机&#xff0c;今天打开忘了密码&#xff0c;还好设置了快照&#xff0c;赶紧改密码 1.切换到 root 用户 sudo su -2.输入以下命令以更改 root 用户的密码&#xff1a; passwd root3.按照提示输入新的密码&#xff0c;然后再次输入以确认。

MyBatis 源码解析:TypeHandler 设计与自定义实现

引言 在 MyBatis 中&#xff0c;TypeHandler 是一个非常重要的接口&#xff0c;它的作用是将 Java 类型和数据库类型进行互相转换。当我们执行 SQL 查询或插入操作时&#xff0c;TypeHandler 决定了如何将 Java 对象转换为数据库字段类型&#xff0c;或将数据库字段转换为 Jav…

[python]从零开始的PySide安装配置教程

一、PySide是什么&#xff1f; PySide 是 Qt for Python 项目的一部分&#xff0c;它提供了与 PyQt 类似的功能&#xff0c;使开发者能够使用 Python 编程语言来构建基于 Qt 的图形用户界面 (GUI) 应用程序。PySide 是由 Qt 公司官方维护的&#xff0c;而 PyQt 则是由第三方开发…

【Pyside】pycharm2024配置conda虚拟环境

知识拓展 Pycharm 是一个由 JetBrains 开发的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它主要用于 Python 编程语言的开发。Pycharm 提供了代码编辑、调试、版本控制、测试等多种功能&#xff0c;以提高 Python 开发者的效率。 Pycharm 与 Python 的关系 Pycharm 是…

【JavaEE】——多线程(join阻塞,计算,引用,状态)

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯&#xff0c;你们的点赞收藏是我前进最大的动力&#xff01;&#xff01;希望本文内容能够帮助到你&#xff01; 目录 一&#xff1a;join等待线程结束 1&#xff1a;知识回顾 2&#xff1a;join的功能就是“阻塞等待” …

PyTorch 实现手写数字识别

PyTorch 实现手写数字识别 在本教程中&#xff0c;我们将使用 PyTorch 实现经典的手写数字识别任务。我们将使用 MNIST 数据集&#xff0c;这是一个包含手写数字的图像数据集。我们将介绍如何使用 PyTorch 构建、训练和评估一个简单的卷积神经网络&#xff08;CNN&#xff09;…

【linux】kill命令

kill 命令在 Linux 和类 Unix 系统中用于向进程发送信号&#xff0c;默认情况下是发送 SIGTERM&#xff08;信号 15&#xff09;&#xff0c;请求程序终止运行。如果程序没有响应 SIGTERM 信号&#xff0c;可以使用 SIGKILL&#xff08;信号 9&#xff09;强制终止进程&#xf…

java之斗地主部分功能的实现

今天我们要实现斗地主中发牌和洗牌这两个功能&#xff0c;该如何去实现呢&#xff1f; 1.创建牌类&#xff1a;52张牌每一张牌包含两个属性:牌的大小和牌的花色。 故我们优先创建一个牌的类(Card)&#xff1a;包含大小和花色。 public class Card { //单张牌的大小及类型/…

无人机+自组网:中继通信增强技术详解

无人机与自组网技术的结合&#xff0c;特别是通过中继通信增强技术&#xff0c;为无人机在复杂环境中的通信提供了稳定、高效、可靠的解决方案。以下是对该技术的详细解析&#xff1a; 一、无人机自组网技术概述 无人机自组网技术是一种利用无人机作为节点&#xff0c;通过无…

proteus仿真学习(1)

一&#xff0c;创建工程 一般选择默认模式&#xff0c;不配置pcb文件 可以选用芯片型号也可以不选 不选则从零开始布局&#xff0c;没有初始最小系统。选用则有初始最小系统以及基础的main函数 本次学习使用从零开始&#xff0c;不配置固件 二&#xff0c;上手软件 1.在元件…

6--SpringBootWeb案例(详解)

目录 环境搭建 部门管理 查询部门 接口文档 代码 删除部门 接口文档 代码 新增部门 接口文档 代码 已有前端&#xff0c;根据接口文档完成后端功能的开发 成品如下&#xff1a; 环境搭建 1. 准备数据库表 (dept 、 emp) -- 部门管理 create table dept( id int un…

深度学习自编码器 - 正则自编码器篇

序言 深度学习领域中&#xff0c;自编码器&#xff08; Autoencoder \text{Autoencoder} Autoencoder&#xff09;作为一种无监督学习技术&#xff0c;凭借其独特的结构在数据降维、特征提取、异常检测及数据去噪等方面展现出强大的能力。正则自编码器&#xff0c;作为自编码器…

ES5 在 Web 上的现状

最后一个支持 ES5 的浏览器 IE 11 在 2022 年被微软停止支持&#xff0c;那么今天 Web 上的 ES5 现状如何&#xff1f;在构建生产代码时&#xff0c;Web 开发者的最佳实践是什么&#xff1f; 本文将通过数据来回答这些问题&#xff0c;并基于这些数据为网站开发者和库作者提供一…

Delta Lake如何使用

1. 安装 Java 确保你的系统上安装了 Java 8 或更高版本。可以通过以下命令检查 Java 是否已安装&#xff1a; java -version2. 安装 Apache Spark 下载 Spark&#xff1a; 从 Apache Spark 官方网站 下载适合的版本&#xff0c;建议下载预编译的版本&#xff08;例如&#xf…

如何有效检测住宅IP真伪?

在当今的互联网时代&#xff0c;住宅IP&#xff08;即家庭用户通过宽带服务提供商获得的IP地址&#xff09;在跨境电商、广告投放、网络安全等多个领域扮演着重要角色。然而&#xff0c;随着网络环境的复杂化和欺诈行为的增多&#xff0c;如何有效检测和辨别住宅IP的真伪成为了…

Spring:统一结果私有属性造成的前端无法访问异常报错问题

用户未填写任何评价 1.问题复现 &#xff08;1&#xff09;看一段代码 controller&#xff1a; import lombok.extern.slf4j.Slf4j; import org.ljy.testdemo.common.Result; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.w…

深入解析 SQLSugar:从基础 CRUD 到读写分离与高级特性详解

SQLSugar 使用指南&#xff1a;从入门到进阶及高级特性详解 SQLSugar 是一款功能丰富的 .NET ORM 框架&#xff0c;它支持多种数据库、简洁的 API 和优雅的编程体验。相较于其他 ORM&#xff0c;SQLSugar 提供了很多开发者友好的功能&#xff0c;比如自动创建表结构、灵活的查…

在HTML中添加图片

在HTML中添加图片&#xff0c;你需要使用<img>标签。这个标签用于在网页上嵌入图像。<img>是一个空元素&#xff0c;它只包含属性&#xff0c;并且没有闭合标签。要在<img>标签中指定要显示的图像&#xff0c;你需要使用src&#xff08;source的缩写&#xf…