B073-封装工具类 服务模块(后台)

news2024/11/23 18:53:25

目录

      • 拿当前登录人信息工具类
      • 服务模块
        • 业务分析
        • 表结构
        • 后端代码
        • 后台代码
        • 覆写删除-加详情一起删
        • 调整前端Data,handleAdd和编辑框
        • 覆写新增
        • 编辑按钮展示详情
        • 资源:多图上传和回显图片

拿当前登录人信息工具类

工具类准备:LoginContext: 登录上下文,获取当前登录人的信息

/**
 * 登录上下文
 *   1.获取当前登录人的信息
 *   2.获取当前登录人的权限(我们不写)
 *   我们如何在非Spring容器管理的对象中,获取Spring管理的Bean对对象
 */
public class LoginContext {

    /**
     * 通过从请求头中获得token
     * 再通过以token为key去redis拿登录人信息返回
     */
    public static Logininfo getLoginIn(HttpServletRequest request){
        //1.获取token
        String token = request.getHeader("token");
        if(!StringUtils.isEmpty(token)){
            //获取Spring容器
            WebApplicationContext applicationContext =
                    WebApplicationContextUtils.getWebApplicationContext(request.getServletContext());
            //从容器中获取bean
            RedisTemplate redisTemplate = applicationContext.getBean("redisTemplate",RedisTemplate.class);
            //2.根据token从redis中获取loginInfo
            Object obj = redisTemplate.opsForValue().get(token);
            if(obj != null){//redis中登录用户还没有过期
                return (Logininfo)obj;
            }
        }
        return null;
    }
}

服务模块

业务分析

在这里插入图片描述
要两张表,基础信息表和服务详情表,前台上架都展示,后台要录入,只用展示基础信息

平台提供基础的洗澡,美容,洁牙等基础服务。
在线下单:用户通过前台页面下单,平台把订单的推送给离用户最近的门店,由门店提供线下服务。
线下服务:用户到店消费,由店员下单完成交易。

表结构

CREATE TABLE `t_product` (
  `id` bigint(2) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL COMMENT '服务名称',
  `resources` varchar(255) DEFAULT NULL COMMENT '存放fastdfs地址,多个资源使用,分割',
  `saleprice` decimal(19,2) DEFAULT NULL COMMENT '售价',
  `offsaletime` datetime DEFAULT NULL COMMENT '下架时间',
  `onsaletime` datetime DEFAULT NULL COMMENT '上架时间',
  `state` bigint(2) DEFAULT NULL COMMENT '状态:0下架 1上架',
  `costprice` varchar(255) DEFAULT NULL COMMENT '成本价',
  `createtime` datetime DEFAULT NULL,
  `salecount` bigint(20) DEFAULT NULL COMMENT '销售数量',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=169 DEFAULT CHARSET=utf8;

salecount:冗余过来,防止数据库压力过大

CREATE TABLE `t_product_detail` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `product_id` bigint(20) DEFAULT NULL,
  `intro` text COMMENT '简介',
  `orderNotice` text COMMENT '预约须知',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=160 DEFAULT CHARSET=utf8;

后端代码

新建模块,
product:domain,query,mapper,service,controller,yml
productDetail:domain,query,mapper,不用service和controller,由product级联操作

拦截器放行swagger

.excludePathPatterns("/swagger-resources/**","/webjars/**","/v2/**","/swagger-ui.html/**");

swagger不支持token,用postman测试

后台代码

拷贝department页面为product页面
替换英文单词与中文汉字,删掉部门树方法,getEmployee方法,dirpath,管理员,父服务,交给路由,调整分页SQL,
调整页面显示字段,data层:编辑需要的字段,domain调整时间显示格式,

覆写删除-加详情一起删

ProductServiceImpl

    @Override
    @Transactional
    public void delete(Long id) {
        //1.删除服务详情
        productDetailMapper.removeByProductId(id);
        //2.删除服务
        productMapper.remove(id);
    }

调整前端Data,handleAdd和编辑框

覆写新增

ProductServiceImpl

    @Override
    public void add(Product product) {
        //1.保存基本信息
        productMapper.save(product);
        //2.保存详情
        ProductDetail detail = product.getDetail();
        detail.setProduct_id(product.getId());
        productDetailMapper.save(detail);
    }

编辑按钮展示详情

查列表页不查详情,点编辑再查详情
product.vue

			//显示编辑界面
			handleEdit: function (index, row) {
				// this.productFormVisible = true;
				this.productForm = Object.assign({}, row);// 克隆当前行数据
				//查询详情数据  回显
				this.$http.get("/product/detail/"+row.id)
						.then(result=>{
							result = result.data;//ProductDetail
                    		this.productForm.detail = result;
							this.productFormVisible = true;//显示编辑窗口
						})
						.catch(result=>{
							this.$message({
								message: '系统错误',
								type: 'error'
							});
						});
			},

ProductController

    /**
     * 通过服务id获取服务详情
     * @param productId
     * @return
     */
    @GetMapping("/detail/{productId}")
    @ApiOperation(value = "查询一条服务数据",notes = "需要传入productId")
    public ProductDetail getDetailByProductId(@PathVariable("productId") Long productId){
        return productService.getDetailByProductId(productId);
    }

ProductServiceImpl

    @Override
    public ProductDetail getDetailByProductId(Long productId) {
        return productDetailMapper.loadByProductId(productId);
    }

ProductDetailMapper

    <select id="loadByProductId" resultType="ProductDetail">
        SELECT * FROM t_product_detail WHERE product_id = #{productId}
    </select>

资源:多图上传和回显图片

页面元素:resources,data声明fileList: [],,拷贝3个钩子方法,
handleSuccess把fileList组合拼接后给到resources(然后才能传到后端)

没有handleRemove图片清除fileList 导致每行打开编辑按钮图片一样或都没有 -> 需要在编辑界面先清空fileList
回显要弄成规定格式,

fileList: [
{name: 'food.jpeg', url: 'http://115.159.217.249:8888/group1/M00/00/4D/rBEAA2S5zz-AG8C3AADiDkvRRWc389.jpg'}, 
{name: 'food2.jpeg', url: 'http://115.159.217.249:8888/group1/M00/00/4D/rBEAA2S5z0eAJSzaAABTid_F4kM953.jpg'}
]
	let resources = row.resources;
	let fileListTmp = [];
	if(resources){
		resources = resources.split(",");//[xxx.jpg,yyy.jpg]
		for(let i=0;i<resources.length;i++){
			fileListTmp.push(
				{
					response:{resultObj:resources[i]},//和handleSuccess里的fileList结构一致
					url:"http://115.159.217.249:8888"+resources[i]
				});
		}
	}
	this.fileList = fileListTmp;//图片回显

删除成功后重新刷新resources

	//删除成功后,需要重新刷新resources
	let resources = '';
	if(fileList){
		for(let i=0;i<fileList.length;i++){
			if(i == fileList.length-1){//如果是最后一张就不需要加,
				resources = resources + fileList[i].response.resultObj;
				//  /group1/M00/00/75/rBEAA2BUYpyAE1ndAACffoTtVYI783.jpg
			}else{
				resources = resources + fileList[i].response.resultObj +",";
			}

		}
	}

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

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

相关文章

前端性能测试

目录 前言&#xff1a; 前端性能 1、优化 2、Lighthouse 使用 4、Lighthouse 报告参数的标准 5、更多产品 前言&#xff1a; 前端性能测试是一个广泛的领域&#xff0c;它旨在评估前端应用程序的性能和可靠性。前端性能测试需要使用各种测试工具和技术&#xff0c;包括浏…

功率信号源的基本工作原理、用途和应用方法

功率信号源是一种可以产生恒定或可变功率输出的测试设备。在电子实验中&#xff0c;功率信号源广泛应用于各种不同的应用&#xff0c;下面安泰电子就来介绍功率信号源的基本工作原理、用途和应用方法。 功率信号源的基本工作原理 功率信号源的基本工作原理是将电能转换成信号能…

【前端实习评审】对小说详情模块的产品原型有一定的自己理解

大家好&#xff0c;本篇文章分享一下【校招VIP】免费商业项目“推推”第一期书籍详情模块前端同学的文档作品。该同学来自中国科学院大学计算机技术专业。 本项目亮点难点&#xff1a;1 热门书籍在更新点的访问压力 2 书籍更新通知的及时性和有效性 3 书荒:同好推荐的可能性 4…

血压诊断米家智能血压计方案

智能血压计产品介绍: 智能血压计是一种基于蓝牙技术的便携式血压测量设备。它通过无线连接与智能手机或其他设备同步并联接到APP端&#xff08;米家&#xff09;&#xff0c;可以准确测量用户的血压数据&#xff0c;并通过手机应用程序进行记录和分析。 智能血压计产品结构: 智…

Win10的两个实用技巧系列之蓝屏代码大全及解决方案、更改应用优先级的技巧

Win10怎么设置程序优先级? Win10更改应用优先级的技巧 Win10怎么设置程序优先级&#xff1f;Win10系统中任务管理器想要设置优先级&#xff0c;该怎么设置呢&#xff1f;下面我们就来看看Win10更改应用优先级的技巧 有些Win10用户想要调整程序优先级&#xff0c;以确保某些…

Sentinel限流中间件

目录 介绍 Sentinel 的特征 Sentinel 的组成 实战使用 简单实例 配置本地控制台 使用可视化ui配置简单流控 配置异步任务限流 使用注解定义限流资源 SpringCloud整合Sentinel 简单整合 并发线程流控 关联模式 整合openFeign使用 介绍 随着微服务的流行&#xff0…

iOS私钥证书和证书profile文件的生成攻略

在使用uniapp打包ios app的时候&#xff0c;要求我们提供一个私钥证书和一个证书profile文件&#xff0c;私钥证书可以使用mac电脑的钥匙串访问程序来生成&#xff0c;也可以使用香蕉云编来生成。证书profile文件可以直接在苹果开发者中心生成。 有部分刚接触ios开发的同学们&…

Easy-Es笔记

一、Easy-ES概述 Easy-Es&#xff08;简称EE&#xff09;是一款ElasticSearch-ORM框架&#xff0c;在原生 RestHighLevelClient 的基础上&#xff0c;只做增强不做改变&#xff0c;为简化开发、提高效率而生。Easy-Es采用和MP一致的语法设计&#xff0c;能够显著降低ElasticSea…

各种拉格朗日函数

目录 一&#xff0c;拉格朗日函数 二&#xff0c;部分拉格朗日函数 三&#xff0c;增广拉格朗日函数 一&#xff0c;拉格朗日函数 以三元函数为例&#xff1a; 求f(x,y,z)的极值&#xff0c;s.t.g(x,y,z)0 拉格朗日函数L(x,y,z,a) f(x,y,z) a * g(x,y,z) 在极值点处一…

(学习日记)2023.06.09

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

Spring AOP(面向切面编程)的详细讲解

1.什么是 AOP&#xff1f; AOP&#xff08;Aspect Oriented Programming&#xff09;&#xff1a;⾯向切⾯编程&#xff0c;它是⼀种思想&#xff0c;它是对某⼀类事情的集中处理 AOP是一种思想&#xff0c;而Spring AOP是一个实现了AOP的思想框架&#xff0c;他们的关系和IOC…

PCIe Error Signaling and Logging持续更新

来源PCI5.0 SPEC 1.错误报告范式ERROR REPORTING PARADIGMS PCI Express定义了两种错误报告范式&#xff1a;baseline capability and the Advanced Error Reporting Capability。baseline错误报告能力是所有PCI Express设备都需要具备的&#xff0c;它定义了最低限度的错误报…

基于Ubuntu 22.04 编译chip-tool工具

前言 编译过程有点曲折&#xff0c;做下记录&#xff0c;过程中&#xff0c;有参考别人写的博客&#xff0c;也看github 官方介绍&#xff0c;终于跑通了~ 环境说明&#xff1a; 首先需要稳定的梯子&#xff0c;可以访问“外网”ubuntu 环境&#xff0c;最终成功实验在Ubunt…

Games101学习笔记 - 基础数学

向量 向量&#xff1a;方向和长度&#xff0c;没有起始位置 向量长度&#xff1a;各个方向平方相加开方 单位向量&#xff1a;向量除向量的长度 点乘 在笛卡尔坐标系中的点乘计算&#xff1a; 几何意思&#xff1a; 表示一个向量在另一个向量上的投影点乘在图形学中应用&a…

SQLite Studio 连接 SQLite数据库

1、在SQLite中创建数据库和表 1.1、按WINR&#xff0c;打开控制台&#xff0c;然后把指引到我们的SQLite的安装路径&#xff0c;输入D:&#xff0c;切换到D盘&#xff0c;cd 地址&#xff0c;切换到具体文件夹&#xff0c;输入“sqlite3”&#xff0c;启动服务 1.2、创建数据库…

最全SWAT教程:SWAT模型系统学习(建模方法、实例应用、高级进阶)

目前&#xff0c;水环境问题逐渐成为制约社会经济和环境可持续发展的重要因素。根据国内外研究表明&#xff0c;受全球环境变化和经济快速发展的影响&#xff0c;面源污染已逐渐成为水环境污染的第一因素。但面源污染由于具有排放分散、隐蔽&#xff0c;排污随机、不确定、不易…

关于封装的定义?以及API接口封装作用有哪些

封装是面向对象编程中的一个重要概念&#xff0c;它指的是将数据和程序代码包含在类中&#xff0c;并对外部对象隐藏其内部实现细节&#xff0c;只提供公共接口。这种方式可以有效地保护数据&#xff0c;防止被外部对象随意访问或修改&#xff0c;同时也更容易维护、升级和复用…

Linux下top命令用法详解

一、命令介绍 Linux top命令用于实时显示 process &#xff08;进程&#xff09;的动态。它用于监控正在运行系统负荷的信息&#xff0c;包括系统负载、CPU利用分布情况、内存使用、每个进程的资源占用情况等。 使用权限&#xff1a;所有使用者 二、命令详解 在命令行下输入…

串稳定混合交通的协同自适应巡航控制:基准和以人为本的设计(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 串稳定混合交通的协同自适应巡航控制是一种针对复杂交通环境的控制方法&#xff0c;旨在实现交通系统的高效运行和安全性。其中…

ATTO488 NHS ester ,新型亲水性荧光标记物,具有良好的水溶性

陕西新研博美生物科技有限公司MISS.wu小编&#xff08;2023.7月26日&#xff09;为大家整理以下的内容&#xff1a; Atto488-NHS是一种新型亲水性荧光标记物&#xff0c;具有良好的水溶性。这种染料表现得很浓吸收、高荧光量子产率以及优异的热稳定性和光稳定性。因此&#xff…