新增套餐/redis/QuartZ

news2024/9/29 0:08:55

套餐其实就是检查组的集合,例如有一个套餐为“入职体检套餐”,这个体检套餐可以包括多个检查组:一般检查、血常规、尿常规、肝功三项等。所以在添加套餐时需要选择这个套餐包括的检查组。

套餐对应的实体类为Setmeal,对应的数据表为t_setmeal。套餐和检查组为多对多关系,所以需要中间表t_setmeal_checkgroup进行关联。

前端页面

弹出新增套餐页面功能

表单重置和默认选择tab项功能

动态列表显示检查组列表

在前端动态显示列表,就进行一个tableData的遍历即可,前端发送ajax请求到后台查询所有的记录并赋值给tableData,前端在对tableData进行处理

Controller

Service

ServiceImpl

Dao

Mapper

xml文件中的SQL语句,如果是查询所有数据,那么前端就不用传任何参数,只需发送一个get请求,sql语句中也不用写parameterType,只需要一个返回参数类型

<!-- 查询所有检查组-->
    <select id="findAll" resultType="com.itheima.pojo.CheckGroup">
        select * from t_checkgroup
    </select>

parameterType="String" //查询是具有参数的,这个参数的类型是String

resultType="com.itheima.pojo.CheckGroup"  //查询返回的参数类型

图片上传预览

此处使用的是ElementUI提供的上传组件el-upload,提供了多种不同的上传效果,上传成功后可以进行预览。

<!--
  el-upload:上传组件
  action:上传的提交地址
  auto-upload:选中文件后是否自动上传
  name:上传文件的名称,服务端可以根据名称获得上传的文件对象
  show-file-list:是否显示已上传文件列表
  on-success:文件上传成功时的钩子
  before-upload:上传文件之前的钩子
-->

上传之前需要检验

//上传图片之前执行
                beforeAvatarUpload(file) {
				  const isJPG = file.type === 'image/jpeg';
				  const isLt2M = file.size / 1024 / 1024 < 2;
				  if (!isJPG) {
					this.$message.error('上传套餐图片只能是 JPG 格式!');
				  }
				  if (!isLt2M) {
					this.$message.error('上传套餐图片大小不能超过 2MB!');
				  }
				  return isJPG && isLt2M;
                },

上传成功后,将图片的网络链接值赋给imageUr,imageUrll的值不为空,v-if条件成立,则显示图片的预览图

//文件上传成功后的钩子,response为服务端返回的值,file为当前上传的文件封装成的js对象
                handleAvatarSuccess(response, file) {
                    this.imageUrl = 'http://rtb9a5bgc.hn-bkt.clouddn.com/' + response.data;
                    this.$message({
                        message: response.message,
                        type: response.flag ? 'success' : 'error'
                    });
                    //设置模型数据(图片名称),后续提交ajax请求时会提交到后台最终保存到数据库
                    this.formData.img = response.data;
                },

Controller

springmvc中需要设置一个文件上传的组件

<!--文件上传组件-->
    <bean id="multipartResolver"
          class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="104857600" />
        <property name="maxInMemorySize" value="4096" />
        <property name="defaultEncoding" value="UTF-8"/>
    </bean>

之前设置的七牛云图片上传工具类中设置了两种图片上传方法,使用byte数组上传方法

//文件上传
    //图片上传
    @RequestMapping("/upload")
    public Result upload(@RequestParam("imgFile") MultipartFile imgFile){//使用springmvc的上传组件来上传文件,后台接收到文件
        System.out.println(imgFile);
        //获取原始文件名
        String originalFilename = imgFile.getOriginalFilename();
        int lastIndexOf = originalFilename.lastIndexOf(".");
        //获取文件后缀
        String suffix = originalFilename.substring(lastIndexOf - 1);
        //使用UUID随机产生文件名称,防止同名文件覆盖
        String fileName = UUID.randomUUID().toString() + suffix;
        try {
            QiniuUtils.upload2Qiniu(imgFile.getBytes(), fileName);//使用七牛云工具类的bytes数组上传文件方法,第二个参数为文件名
            //图片上传成功
            Result result = new Result(true, MessageConstant.PIC_UPLOAD_SUCCESS);
            result.setData(fileName);
            return result;
        } catch (IOException e) {
            e.printStackTrace();
            //图片上传失败
            return new Result(false, MessageConstant.PIC_UPLOAD_FAIL);
        }
    }

完善新增套餐_提交表单

前端代码

//添加
                handleAdd () {
                    //发送ajax请求,将表单数据(套餐信息,检查组ID)提交到后台进行处理
                    axios.post("/setmeal/add.do?checkgroupIds=" + this.checkgroupIds,this.formData).then((res) =>{
                        this.dialogFormVisible = false;
                        if(res.data.flag){//本次操作成功,controller成功响应
                            this.$message({
                                message: res.data.message,
                                type: 'success'
                            });
                        }else{
                            this.$message.error(res.data.message);
                        }
                    }).finally(()=> {//本次操作失败
                        this.findPage();
                    });
                },

后台代码

完善图片上传

清理垃圾图片,释放磁盘空间

利用redis来保存图片名称,具体做法为:

1、当用户上传图片后,将图片名称保存到redis的一个Set集合中,例如集合名称为setmealPicResources

2、当用户添加套餐后,将图片名称保存到redis的另一个Set集合中,例如集合名称为setmealPicDbResources

3、计算setmealPicResources集合与setmealPicDbResources集合的差值,结果就是垃圾图片的名称集合,清理这些图片即可

 

配置好配置文件中,记得在springmvc.xml中引用 

<import resource="spring-redis.xml"></import>

在health_common工程中提供Redis常量类

完善SetmealController,在文件上传成功后将图片名称保存到redis集合中

在health_service_provider项目中提供Spring配置文件applicationContext-redis.xml

查看是否能扫描到配置文件 

完善SetmealServiceImpl服务类,在保存完成套餐信息后将图片名称存储到redis集合中

//将图片名称保存到Redis
  savePic2Redis(setmeal.getImg());
}
//将图片名称保存到Redis
private void savePic2Redis(String pic){
  jedisPool.getResource().sadd(RedisConstant.SETMEAL_PIC_DB_RESOURCES,pic);
}

 

定时任务组件Quartz

Quartz是Job scheduling(作业调度)领域的一个开源项目,Quartz既可以单独使用也可以跟spring框架整合使用,在实际开发中一般会使用后者。使用Quartz可以开发一个或者多个定时任务,每个定时任务可以单独指定执行的时间,例如每隔1小时执行一次、每个月第一天上午10点执行一次、每个月最后一天下午5点执行一次等。

pom文件中导入坐标

  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context-support</artifactId>
      <version>5.0.2.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>5.0.2.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.quartz-scheduler</groupId>
      <artifactId>quartz</artifactId>
      <version>2.2.1</version>
    </dependency>
    <dependency>
      <groupId>org.quartz-scheduler</groupId>
      <artifactId>quartz-jobs</artifactId>
      <version>2.2.1</version>
    </dependency>
  </dependencies>

 自定义一个job

 提供Spring配置文件spring-jobs.xml,配置自定义Job、任务描述、触发器、调度工厂等

<!-- 注册自定义Job -->
    <bean id="jobDemo" class="com.itheima.jobs.JobDemo"></bean>
	<!-- 注册JobDetail,作用是负责通过反射调用指定的Job -->
    <bean id="jobDetail" 
          class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <!-- 注入目标对象 -->
        <property name="targetObject" ref="jobDemo"/>
        <!-- 注入目标方法 -->
        <property name="targetMethod" value="run"/>
    </bean>
    <!-- 注册一个触发器,指定任务触发的时间 -->
    <bean id="myTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <!-- 注入JobDetail -->
        <property name="jobDetail" ref="jobDetail"/>
        <!-- 指定触发的时间,基于Cron表达式 -->
        <property name="cronExpression">
            <value>0/10 * * * * ?</value>
        </property>
    </bean>
    <!-- 注册一个统一的调度工厂,通过这个调度工厂调度任务 -->
    <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <!-- 注入多个触发器 -->
        <property name="triggers">
            <list>
                <ref bean="myTrigger"/>
            </list>
        </property>
    </bean>

编写一个main方法来测试

 

Cron表达式 

cron表达式分为七个域,之间使用空格分隔。其中最后一个域(年)可以为空。每个域都有自己允许的值和一些特殊字符构成。使用这些特殊字符可以使我们定义的表达式更加灵活。

下面是对这些特殊字符的介绍:

逗号(,):指定一个值列表,例如使用在月域上1,4,5,7表示1月、4月、5月和7月

横杠(-):指定一个范围,例如在时域上3-6表示3点到6点(即3点、4点、5点、6点)

星号(*):表示这个域上包含所有合法的值。例如,在月份域上使用星号意味着每个月都会触发

斜线(/):表示递增,例如使用在秒域上0/15表示每15秒

问号(?):只能用在日和周域上,但是不能在这两个域上同时使用。表示不指定

井号(#):只能使用在周域上,用于指定月份中的第几周的哪一天,例如6#3,意思是某月的第三个周五 (6=星期五,3意味着月份中的第三周)

L:某域上允许的最后一个值。只能使用在日和周域上。当用在日域上,表示的是在月域上指定的月份的最后一天。用于周域上时,表示周的最后一天,就是星期六

W:W 字符代表着工作日 (星期一到星期五),只能用在日域上,它用来指定离指定日的最近的一个工作日

cron表达式在线生成器

在线Cron表达式生成器

利用Quartz实现定时清理垃圾图片

创建maven工程health_jobs,打包方式为war,导入Quartz等相关坐标

导入坐标

配置web.xml  

配置log4j.properties

配置applicationContext-redis.xml

配置applicationContext-jobs.xml

创建ClearImgJob定时任务类

 

 

套餐分页查询

定义分页相关的模型数据

pagination: {//分页相关模型数据
  currentPage: 1,//当前页码
  pageSize:10,//每页显示的记录数
  total:0,//总记录数
  queryString:null//查询条件
},
dataList: [],//当前页要展示的分页列表数据

findPage方法

//分页查询
findPage() {
  //分页参数
  var param = {
    currentPage:this.pagination.currentPage,//页码
    pageSize:this.pagination.pageSize,//每页显示的记录数
    queryString:this.pagination.queryString//查询条件
  };
  //请求后台
  axios.post("/setmeal/findPage.do",param).then((response)=> {
    //为模型数据赋值,基于VUE的双向绑定展示到页面
    this.dataList = response.data.rows;
    this.pagination.total = response.data.total;
  });
}

时机:钩子函数,查询按钮,分页条组件

后端开发同检查组后台开发

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

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

相关文章

深度学习(7)之图像抠图 Image Matting算法调研

目录 1.Trimap和Strokes 2. 相关数据集 3.论文算法调研 3.1 Deep Image Matting 3.2 Semantic Image Matting 3.3 Background Matting 3.4 Background Matting V2 3.5 Semantic Human Matting 3.6 HAttMatting 3.7 MMNet&#xff1a;Towards Real-Time Automatic Portrait Matt…

Nginx虚拟主机、优化和防盗链

一、Nginx虚拟主机 1、基于域名的nginx虚拟主机的操作步骤 1.1 为虚拟主机提供域名和IP的映射(也可以使用DNS正向解析) echo "192.168.2.66 www.xkq.com www.wy.com" >> /etc/hosts1.2 为虚拟主机准备网页文档 mkdir -p /var/www/html/ly/ mkdir -p /var/w…

经典文献阅读之--VGICP(体素化的ICP匹配)

0. 简介 之前我们在以前的文章中介绍了很多有关于点云匹配相关的知识&#xff0c;最近两年处理GICP这一大一统的ICP匹配方法以外&#xff0c;还有一个工作对体素化和ICP这两者打起了心思&#xff0c;《Voxelized GICP for Fast and Accurate 3D Point Cloud Registration》提出…

动车的颜色种类

01 大家平时见到最多的动车 可能就是白色的吧 和谐号动车组开行后 白就是动车的经典配色 白色为底 车腰一条蓝色飘带让其设计感十足 我们也可以把这种动车配色 称为和谐白 02 复兴号CR400AF型电力动车组 最高运营速度350公里每小时 因其车身采用银色底色 搭配侧窗…

大数据时代必备技能,从0开始学好数据可视化

当今社会&#xff0c;数据可视化已经成为了一项非常重要的技能。随着大数据时代的到来&#xff0c;越来越多的人开始关注数据可视化&#xff0c;并希望能够快速地掌握这项技能。那么&#xff0c;如何快速学习数据可视化呢&#xff1f;以下是AdBright数据分析师的一些建议。 什么…

CDN的发展史和未来

互联网是一种不断变化的机制&#xff0c;新形式的数据和内容正在不断创造。在它商业化后不久&#xff0c;必须解决尽快将大量数据推送给最终用户的问题&#xff0c;CDN因此应运而生。 CDN的根源产生于近20年前&#xff0c;并一直是内容交付的驱动力&#xff0c;自其创立以来&a…

企业电子招投标系统源码之了解电子招标投标全流程

随着各级政府部门的大力推进&#xff0c;以及国内互联网的建设&#xff0c;电子招投标已经逐渐成为国内主流的招标投标方式&#xff0c;但是依然有很多人对电子招投标的流程不够了解&#xff0c;在具体操作上存在困难。虽然各个交易平台的招标投标在线操作会略有不同&#xff0…

虚拟机里安装ubuntu-23.04-beta-desktop-amd64,开启SSH(换源、备份),配置中文以及中文输入法等

一、下载 官网 清华镜像站(推荐) 二、配置虚拟机 【自定义】 点击“下一步”&#xff0c;此处【默认】&#xff0c;再点击“下一步”。 点击“稍后安装操作系统”&#xff0c;再点击“下一步”。 点击“Linux(L)”&#xff0c;版本选择【Ubuntu 64 位】&#xff0c;再点击…

升级H2数据库2.x版本遇见的问题

目录 一、引言二、集成H2基础配置三、升级H2版本2.x遇到的问题报错1报错2 三、H2关键字 一、引言 之前在跑代码单元测试时&#xff0c;一直用的内存数据库H2代替实际的Mysql数据库&#xff0c;如此便省去了对Dao的大量mock代码&#xff0c;类似于在跑Junit单元测试时直接跑了集…

报错:crbug/1173575 non-js module files deprecated

文章目录 报错分析解决方法一&#xff1a;尽可能使用JS模块文件方法二&#xff1a;使用type"module"属性方法三&#xff1a;忽略警告 报错 分析 这个错误报告 (crbug/1173575) 指的是非 JavaScript 模块文件将不再被支持&#xff0c;并且已经弃用。这个问题是因为Ch…

【获奖案例巡展】信创先锋之星——云上贵州信创工程中心大数据中台

为表彰使用大数据、人工智能等基础软件为企业、行业或世界做出杰出贡献和巨大创新的标杆项目&#xff0c;星环科技自2021年推出了“新科技 星力量” 星环科技科技实践案例评选活动&#xff0c;旨在为各行业提供更多的优秀产品案例&#xff0c;彰显技术改变世界的力量&#xff0…

【ctfshow】命令执行->web29-web44

前言 半夜网抑云听歌听emo了 z 刷会儿题不然睡不着了呜呜呜 红中(hong_zh0) CSDN内容合伙人、2023年新星计划web安全方向导师、 华为MindSpore截至目前最年轻的优秀开发者、IK&N战队队长、 吉林师范大学网安大一的一名普通学生、搞网安论文拿了回大挑校二、 阿里云专家博…

2023年,人工智能和数据训练呈现哪些新趋势?

最近&#xff0c;多才多艺的“全能网友”ChatGPT一次次火出圈。未来人工智能将以多快的速度、发展到何种地步&#xff1f;人们已经开始坐下来认真地探讨和思考。 我们生活在这个日新月异的时代。新的一年&#xff0c;人工智能的真正能力和应用场景又发生了哪些演进&#xff1f;…

【学习笔记】go-gRPC 初尝试

安装protoc 安装地址 找到对应版本的anz安装文件 解压&#xff0c;将文件夹移动到goroot目录中&#xff0c;可以通过命令go env查看goroot目录。 如我的goroot目录为D:\Program Files\Go 或者移动到自定义目录&#xff0c;并将该目录设置到环境变量中即可。 安装go插件 …

混淆矩阵的输出,异常检测可视化(针对二分类)

对于二分类任务&#xff1a; 真阳性&#xff08;True Positives, TP&#xff09;为真实值为1&#xff0c;预测值为1&#xff0c;即正确预测出的正样本个数真阴性&#xff08;True Negatives, TN&#xff09;为真实值为0&#xff0c;预测值为0&#xff0c;即正确预测出的负样本…

网关(史上最全)

什么是网关 网关&#xff0c;很多地方将网关比如成门&#xff0c;没什么问题&#xff0c;但是需要区分网关与网桥的区别。 网桥工作在数据链路层&#xff0c;在不同或相同类型的LAN之间存储并转发数据帧&#xff0c;必要时进行链路层上的协议转换。可连接两个或多个网络&…

漫画:是喜,还是悲?AI竟帮我们把Office破活干完了

图文原创&#xff1a;亲爱的数据 国产大模型烈火制造。阿里百度字节美团各科技大佬不等闲。 大模型嘛&#xff0c;重大工程&#xff0c;对我等“怀保小民”来说&#xff0c;只关心怎么用&#xff0c;不关心怎么造。 我来介绍一下自己&#xff0c;我是一个写稿男团组合的成员&am…

13、fishhook原理Dobby

一、fishhook原理 1.1 fishhook代码分析 int rebind_symbols(struct rebinding rebindings[], size_t rebindings_nel) {//prepend_rebindings的函数会将整个 rebindings 数组添加到 _rebindings_head 这个链表的头部//Fishhook采用链表的方式来存储每一次调用rebind_symbols…

Java动态代理(JDK/CGLIB)静态代理

Java Guide动态代理阅读笔记。 一、代理模式 代理模式是一种比较好的理解的设计模式。简单来说就是 我们使用代理对象来代替对真实对象(real obiect)的访问&#xff0c;这样就可以在不修改原目标对象的前提下&#xff0c;提供额外的功能操作&#xff0c;扩展目标对象的功能。 …

vue2+vue3——36+

vue2vue3——36 尚硅谷vue2vue2 Vue监测数据的原理_数组【18:56】数组vue 查看 没有 set() get()对象 有 get() set() 监测不到 不更新测试 : 数据改了 &#xff0c; 单页面没变 修改数组的 7方法 &#xff1a; filter 不改变原数组&#xff0c; 返回新的 数组 可以替换掉 原数…