尚品汇-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.xdnf.cn/news/146212.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【巧用ddddocr破解算术运算验证码的经典示范】

计算型验证码 算术验证码&#xff0c;也叫计算型验证码, 计算型验证码其实是一种特殊的字符型验证码&#xff0c;只不过在它的基础上增加了数字运算。   计算型验证码在将人类视觉和计算机视觉的差异作为区分用户和电脑的依据的同时&#xff0c;还加上了逻辑运算&#xff0c…

基于SpringBoot+Vue的在线酒店预订系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…

人工智能开发实战常用分类算法归纳与解析

内容导读 决策树贝叶斯分类器最近邻分类器支持向量机神经网络 一、决策树 决策树(Decision Tree)是用于决策的一棵树&#xff0c;从根节点出发&#xff0c;通过决策节点对样本的不同特征属性进行划分&#xff0c;按照结果进入不同的分支&#xff0c;最终达到某一叶子节点&am…

计算机毕业设计 基于Python的校园个人闲置物品换购平台 闲置物品交易平台 Python+Django+Vue 前后端分离 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

深耕电通二十年,崔光荣升电通中国首席执行官

电通今日宣布&#xff0c;任命拥有二十年深厚电通工作经验的杰出行业领袖崔光(Guang Cui)为电通中国首席执行官&#xff0c;该任命自2024年9月27日起生效。崔光自2004年加入电通以来&#xff0c;从策略规划岗位逐步成长为公司的核心领导者&#xff0c;这也是他职业生涯中的第9次…

篮球运动场景物体检测系统源码分享

篮球运动场景物体检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comp…

Linux基础---13三剑客及正则表达式

一.划水阶段 首先我们先来一个三剑客与正则表达式混合使用的简单示例&#xff0c;大致了解是个啥玩意儿。下面我来演示一下如何查询登录失败的ip地址及次数。 1.首先&#xff0c;进入到 /var/log目录下 cd /var/log效果如下 2.最后&#xff0c;输入如下指令即可查看&#xf…

OpenGL渲染管线(Rendering Pipeline)介绍

渲染管线 计算机图形学中&#xff0c;计算机图形管线&#xff08;渲染管线 或简称 图形管线、流水线&#xff09;是一个概念模型&#xff0c;它描述了t图像系统将 3D场景渲染到2D屏幕所需执行的一系列步骤。渲染管线大的可以分为三个阶段。 &#xff08;一&#xff09;应用阶段…

[UTCTF2020]sstv

用goldwave和010editor打开均未发现线索&#xff0c; 网上搜索sstv&#xff0c;豆包回答如下&#xff1a; 慢扫描电视&#xff08;Slow Scan Television&#xff0c;简称 SSTV&#xff09;是一种通过无线电传输和接收静态图像的技术。 一、工作原理 SSTV 通过将图像逐行扫描并…

【GMNER】Grounded Multimodal Named Entity Recognition on Social Media

Grounded Multimodal Named Entity Recognition on Social Media 动机解决方法特征抽取多模态索引设计索引生成框架EncoderDecoder 实体定位、实体-类型-区域三元组重建 出处&#xff1a;ACL2023 论文链接&#xff1a;https://aclanthology.org/2023.acl-long.508.pdf code链接…

[Linux] Linux操作系统 进程的状态

标题&#xff1a;[Linux] Linux操作系统 进程的状态 个人主页&#xff1a;水墨不写bug &#xff08;图片来源于网络&#xff09; 目录 一、前置概念的理解 1.并行和并发 2.时间片 3.进程间具有独立性 4.等待的本质 正文开始&#xff1a; 在校的时候&#xff0c;你一定学过《…

10 张手绘图详解Java 优先级队列PriorityQueue

PriorityQueue 是 Java 中的一个基于优先级堆的优先队列实现&#xff0c;它能够在 O(log n) 的时间复杂度内实现元素的插入和删除操作&#xff0c;并且能够自动维护队列中元素的优先级顺序。 通俗来说&#xff0c;PriorityQueue 就是一个队列&#xff0c;但是它不是先进先出的…

【速成Redis】04 Redis 概念扫盲:事务、持久化、主从复制、哨兵模式

前言&#xff1a; 前三篇如下&#xff1a; 【速成Redis】01 Redis简介及windows上如何安装redis-CSDN博客 【速成Redis】02 Redis 五大基本数据类型常用命令-CSDN博客 【速成Redis】03 Redis 五大高级数据结构介绍及其常用命令 | 消息队列、地理空间、HyperLogLog、BitMap、…

带你0到1之QT编程:十五、探索QSplitter和QDockWidget的简单应用技巧

此为QT编程的第十五谈&#xff01;关注我&#xff0c;带你快速学习QT编程的学习路线&#xff01; 每一篇的技术点都是很很重要&#xff01;很重要&#xff01;很重要&#xff01;但不冗余&#xff01; 我们通常采取总-分-总和生活化的讲解方式来阐述一个知识点&#xff01; …

系统架构设计师 - 案例特训专题 - 软件工程篇

案例特训专题 - 软件工程篇 软件工程篇需求分析 ★★★★结构化需求分析 SA数据流图答题技巧 面向对象设计 ★★UML 图概况用例图类图与对象图顺序图通信图状态图活动图定时图构件图包图部署图 大家好呀&#xff01;我是小笙&#xff0c;本章我主要分享系统架构设计师 - 案例特…

【刷题—双指针】复写0、三数之和、四数之和

目录 一、复写0二、三数之和三、四数之和 一、复写0 题目&#xff1a; 注意&#xff1a;题目要求是原数组上复写 思路&#xff1a; 一、确定最后一个复写的位置。定义两个变量cur等于0&#xff0c;dest等于-1&#xff0c;让cur去遍历数组。如果cur指向的元素是0&#xff0c;…

【玉米田】

题目 代码 #include <bits/stdc.h> using namespace std; typedef long long LL;const int mod 1e8; const int M 1 << 12; LL f[13][M]; int g[13]; vector<int> state; vector<int> p[M]; int n, m; bool check(int x) {return !(x & x <&…

【Linux课程学习】make/Makefile:Linux项目自动化构建工具

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;Linux课程学习 &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 &#x1f349;一.make/Makefile的理解&#xff1a; …

基于SpringBoot+Vue+MySQL的国产动漫网站

系统展示 用户前台界面 管理员后台界面 系统背景 随着国内动漫产业的蓬勃发展和互联网技术的快速进步&#xff0c;动漫爱好者们对高质量、个性化的国产动漫内容需求日益增长。然而&#xff0c;市场上现有的动漫平台大多以国外动漫为主&#xff0c;对国产动漫的推广和展示存在不…

【Java集合】深入了解ArrayList实现原理

概述 1.数据存储是基于动态数组实现的&#xff0c;默认初始容量为10。 2.添加数据时&#xff0c;首先需要检查元素个数是否超过数组容量&#xff0c;如果超过了则需要对数组进行扩容&#xff08;1.5倍&#xff09;&#xff1b;插入数据时&#xff0c;需要将从插入点 k 开始到数…