帝可得项目总结

业务需求

  1. 区域列表查询中,需要显示每个区域的点位数

(1)同步存储:在区域表中有点位数的字段(冗余字段6.),当点位发生变化时,同步区域表中的点位数。

优点:由于是单表查询操作,查询列表效率最高。

缺点:需要在点位增删改时修改区域表中的数据,有额外的开销,数据也可能不一致在更新点位数据时,如果事务没有正确处理或者系统出现故障(如网络中断、数据库宕机等),可能会导致区域表中的点位数未能及时更新或更新失败,从而造成数据不一致的情况。

(2)关联查询:编写关联查询语句,在mapper 层封装。

优点:实时查询,数据100%正确,不需要单独维护

缺点:SQL语句较复杂,如果数据量大,性能比较低。

SELECT r.*, COUNT(n.id) AS node_count FROM tb_region r LEFT JOIN tb_node n ON r.id = n.region_id GROUP BY r.id;

左外连接(LEFT OUTER JOIN)

左外连接会返回左表(FROM子句中的第一个表)的所有记录,以及右表(JOIN子句中的第二个表)中与左表相匹配的记录。如果右表中没有与左表匹配的记录,则结果集中相应的列将为NULL。

  1. 在点位列表查询中,会关联显示区域、商圈等信息

关联实体:我们会采用Mybatis提供的嵌套查询功能。

MyBatis 嵌套查询就是将原来多表查询中的联合查询语句拆成单个表的查询,再使用mybatis的语法嵌套在一 起,通过定义resultMap和sql语句中的association(一对一或多对一)或collection(一对多)元素来实现嵌套查询。

点位与区域商圈是多对一的关系

货道与商品是多对一

定义一个新的resultMap标签作为selectNodeVoList的xml语句的返回结果

  1. 数据完整性

当我们删除区域或合作商数据时,与之关联的点位数据该如何处理?

RESTRICT(限制):在尝试删除或更新父表中的记录之前,数据库首先检查是否有相关联的子记录存在。如果有,则拒绝执行删除或更新操作,以防止意外丢失数据或破坏数据关系的完整性。这是一种保守策略,确保数据间的引用完整性。

在MYSQL图形化界面-修改表-修改表的删除规则即可

4.错误提示信息统一处理

修改完毕后,如果你尝试进行删除操作,会发现数据库的完整性约束生效了,它会阻止删除操作并给出错误提示。但是,这个错误提示信息可能对于用户来说不够友好,可能会让用户感到困惑。

SpringBoot全局异常处理器

com.dkd.framework.web.exception.GlobalExceptionHandler

5.前端:修改时需要显示创建时间,新建时不需要

使用v-if标签,修改时会回显id而新增时不会。修改时id!= null

  1. 修改区域表时对应的员工表的区域字段也需更改

关系到两张表的操作,使用@Transational注解开启事务

设置 rollbackFor = Exception.class 表示只要方法执行过程中抛出任何异常,都会触发事务回滚。这样可以确保数据的一致性和完整性,避免因异常导致的数据错误。

  1. 日期格式化

 前端

后端

8.小数精度问题

商品价格在java中如果用double会有精确度降低的风险,所以后端返回的价格是以分为单位的int类型,前端展示为元为单位就需要除以100

9.将商品管理展示的商品类型id改为商品类型名称进行展示前端

查询商品类型列表->当商品类型id等于当前选中的id时再进行展示

10.逻辑外键

在删除商品时,需要判断此商品是否被售货机的货道关联,如果关联则无法删除(外键)

物理外键约束(在字段后面加上属性):通过在子表中添加一个外键列和约束,该列与父表的主键列相关联,由数据库维护数据的一致性和完整性

逻辑外键约束:在不使用数据库外键约束的情况下,通常在应用程序中通过代码来检查和维护数据的一致性和完整性

使用逻辑外键约束的原因(sku_id = 商品表的id):我们在新增售货机货道记录时暂不指定商品,货道表中的SKU_ID有默认值0,而这个值在商品表中并不存在,那么物理外键约束会阻止货道表的插入,因为0并不指向任何有效的商品记录

在实际业务场景中,有时需要先创建货道记录,但暂时不确定具体对应哪个商品。
为了方便操作,可以将 SKU_ID 设置为默认值 0,表示“暂未分配商品”。

删除商品方法前面加上对商品关联货道的查询,即根据商品id查询货道数量,如果大于0则抛出异常

  1. 批量新增(技术5.)

public List<T> importExcel(InputStream is)

1.接收一个输入流 is 作为参数。

2.尝试调用 importExcel 方法,并传入输入流和索引 0(表示首张工作表)。

12.DTO转VO可以用stream的map,最后collect收集

13.用于接收前端传过来的各种参数工单类型

运营和运营工单共享一套后端接口,通过特定的查询条件区分工单类型,并在返回结果中包含工单类型的详细信息

所有的类都继承BaseEntity

接收的参数为map集合,key的名称为isRepair

14.用户登录流程后端)(技术点9.

1.验证码校验

·检查系统是否开启验证码功能。

·若开启,则从Redis缓存redisCache中获取对应uuid(唯一标识)的验证码。并从缓存中删除

·如果验证码已过期或不存在,记录登录失败信息并抛出异常。

·比较用户输入的验证码与实际验证码,不一致时记录失败信息并抛出异常。

  1. 登录前置校验

·检查用户名和密码是否为空,若空则记录登录信息并抛出异常。

·验证密码长度是否在规定范围内,否则记录信息并抛出异常。

·检查用户名长度是否符合要求,不符合则记录信息并抛出异常。

·校验客户端IP地址是否在黑名单中,若在黑名单,则记录登录失败信息 并抛出异常。

  1. ss认证管理器用户校验

·使用 UsernamePasswordAuthenticationToken 对象进行用户认证,放入AuthenticationContextHolder中(底层是ThreadLocal,来为每个线程提供独立的身份验证信息存储空间。)

若认证失败,记录日志并抛出异常;

认证成功后记录成功登录信息,并依据认证信息记录用户登录详情;

4.登陆成功,记录日志。

5.更新登录用户信息

6.生成token,并将登录用户信息缓存在redis中。

7.返回token

  1. 获取用户角色和权限

查询该用户权限(菜单)集合用set集合,一个用户可能有多个角色,多个角色的权限可能有重复的

16.数据权限

我们有一个系统登录日志,里面记录了所有用户的登录信息。

但是,并不是所有人都应该看到所有的日志数据。所以,我们需要根据用户的角色来控制他们能查看的数据范围。

17.跨域

在前端开发中,跨域是一个常见的问题,特别是在使用Vue框架进行开发时。跨域是指在浏览器中发送的AJAX请求的目标地址与当前页面的地址不在同一个域下,这会导致浏览器的同源策略产生限制,从而阻止了跨域请求的发送。然而,我们可以通过代理服务器来解决这个问题。

代理服务器是位于客户端和目标服务器之间的一台服务器,它接收客户端发送的请求,并将请求转发给目标服务器。通过在代理服务器上进行请求转发,可以绕过浏览器的同源策略限制,从而实现跨域请求。

技术点

  1. MyBatis 嵌套查询

MyBatis 嵌套查询就是将原来多表查询中的联合查询语句拆成单个表的查询,再使用mybatis的语法嵌套在一 起,通过定义resultMap和sql语句中的association(一对一或多对一)或collection(一对多)元素来实现嵌套查询。

主sql语句为前者

  1. SpringBoot全局异常处理器

SQLIntegrityConstraintViolationException是Java中的一个异常类,这个类通常用于表示SQL数据库操作中的完整性约束违反异常

例如:外键约束、唯一约束等。当数据库操作违反了这些约束时,就会抛出这个异常。

这个错误是由于外键约束导致的。它表明在删除或更新父表的行时,存在外键约束,子表中的相关行会受到影响。

是因为在删除tb_region表中的行时,tb_node表中的region_id外键约束会阻止操作。

如果你在使用Spring框架进行数据库操作,可能会先遇到DataIntegrityViolationException,它是对SQLIntegrityConstraintViolationException的一个更高层次的抽象,旨在提供一种更加面向应用的错误表示。

而SQLIntegrityConstraintViolationException是更底层的异常,直接来源于数据库驱动,包含更多底层数据库相关的细节。

在实际开发中,推荐捕获并处理DataIntegrityViolationException,因为它更符合Spring应用的异常处理模式,同时也可以通过其内部的cause(原因)属性来获取具体的SQLIntegrityConstraintViolationException,进而获取详细的错误信息。

3.MtBatis注解

1.@Param: 当方法中有多个参数时,使用 @Param 可以为每个参数指定一个名字。这在 SQL 映射文件中引用参数时非常有用,特别是当需要传递多个参数给 SQL 语句时。

4.x-file-storage

一行代码将文件存储到本地、阿里云 OSS、华为云 OBS等

5.EasyExcel

基于JAVA的EXCEL处理工具

easyexcel重写了poi对07版Excel的解析,一个3M的excel用POI sax解析依然需要100M左右内存,改用easyexcel可以降低到几M,并且再大的excel也不会出现内存溢出

  1. Redis计数器

自动生成工单编号-使用redis的计数器

redisTemplate.opsForValue().set(key, 1, Duration.ofDays(1));

使用opsForValue()方法获取操作字符串值的对象。
调用set方法存储值1。
使用Duration.ofDays(1)设置键的有效期为一天。

dateStr+StrUtil.padPre(redisTemplate.opsForValue().increment(key).toString(),4,'0');

从Redis中获取指定键的值,并对其执行自增操作。
将自增后的值转换为字符串。
在字符串左侧填充‘0’,确保总长度为4位。
将填充后的字符串与日期字符串(dateStr)拼接后返回。

7.Knife4j

如果不习惯使用swagger可以使用前端UI的增强解决方案knife4j,对比swagger相比有以下优势,友好界面,离线文档,接口排序,安全控制,在线调试,文档清晰,注解增强,容易上手。

TaskDetailsController添加swagger注解

@Api: 用于类级别,描述API的标签和描述。

@ApiOperation: 用于方法级别,描述一个HTTP操作。

@ApiParam: 用于参数级别,描述请求参数。

注意:若依框架的AjaxResult由于继承自HashMap导致与Swagger和knife4j不兼容的问题,选择替换返回值类型为R<>以解决Swagger解析问题,减少整体改动量。

8.Velocity模版引擎

实体类支持Lombok@Data,Controller类支持Swagger(@Apioperation)

(导入坐标,修改模板代码)

Velocity是一个基于Java的模板引擎,可以通过特定的语法获取在java对象的数据 , 填充到模板中,从而实现界面和java代码的分离 !

Velocity中的变量有两类

在模板中定义变量: #set开头,比如 #set($name = "velocity")

获取变量的的值: $name 或者 ${name}

9.RBAC权限控制

1.SpringSecurity配置:SecurityConfig类上加上@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)

开启方法级别的权限控制

方法的controller层加上@PreAuthorize("@ss.hasPermi('manage:taskType:list')")

@PreAuthorize:Spring Security注解,用于在执行方法前检查用户权限。

@ss.hasPermi:自定义权限校验方法,验证用户是否具有指定权限。

ss:Spring容器管理的一个bean

 @PreAuthorize 是 Spring Security 框架中提供的一个安全注解,用于实现基于注解的访问控制。它允许开发者在方法级别上声明特定的安全约束,以确保只有满足指定条件的用户才能调用该方法

- 当 @PreAuthorize 注解被应用于某个方法时,Spring Security 在该方法执行前会先对当前认证的用户进行权限检查。如果检查通过,方法调用得以继续;否则,框架会抛出相应的权限异常(如 AccessDeniedException),阻止方法执行。

2.如果有些接口是不需要验证权限可以公开访问的,这个时候就需要我们给接口放行。

使用注解方式,只需要在Controller的类或方法上加入@Anonymous该注解即可

10.异步任务管理器

主要用于处理一些不需要即时返回结果的后台任务,从而提高应用程序的整体性能

// 多线程执行任务me()创建单例对象(饿汉式)
AsyncManager.me().execute(AsyncFactory.createTimerTask());

若依异步任务管理器是一个单例对象使用了线程池+异步工厂(产生任务用)

1、 AsyncManager.me()获取AsyncManager对象

2、调用execute方法,执行TimerTask任务(记录登录日志),它实现了runnable接口,由线程Thread去执行

3、execute方法内部调用ScheduledExecutorService异步操作任务调度线程池的schedule方法用于延迟10毫秒执行一个任务

11.操作日志

在需要被记录日志的controller方法上添加@Log注解

若依操作日志使用了自定义注解+AOP切面+异步任务管理器

通过实现AOP切面编程,对目标方法进行拦截(标注Log注解的方法),实现了操作日志的自动记录

异步任务管理器来将任务(记录操作日志到数据库)交给线程池来完成

  1. 定时任务

13.数据权限

在系统中,权限的分配和控制主要依赖于角色。每个角色可以被赋予不同的菜单权限和数据权限,用户则通过他们的角色来继承这些权限,进而决定他们能访问哪些系统资源。

目前,系统支持以下五种数据权限类型:

全部数据权限:无限制访问所有数据,相当于拥有最高权限的通行证。

自定数据权限:用户可以根据自己的需求设定访问特定数据的规则。

部门数据权限:只能访问自己所在部门的数据,限制在本部门范围内。

部门及以下数据权限:可以访问自己部门及下属部门的数据,适用于管理层级。

仅本人数据权限:只能访问和操作自己的数据,保障个人隐私和数据隔离。

在需要数据权限控制方法上添加@DataScope注解,其中d和u用来表示表的别名

在mybatis查询底部标签添加数据范围过滤(其作用就是相当于在一个 select 语句后面拼接一个 and 条件语句,来实现查询限制)

若依数据权限底层使用了自定义注解+AOP切面+SQL拼接

通过实现AOP编程,对目标方法进行拦截(标注DataScope 注解的方法),实现了构建数据范围SQL过滤条件

仅实体继承`BaseEntity`才会进行处理,`SQL`语句会存放到`BaseEntity`对象中的`params`属性中,然后在`xml`中通过`${params.dataScope}`获取拼接后的语句。

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

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

相关文章

文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计

一、介绍 使用Python作为开发语言&#xff0c;基于文本数据集&#xff08;一个积极的xls文本格式和一个消极的xls文本格式文件&#xff09;&#xff0c;使用Word2vec对文本进行处理。通过支持向量机SVM算法训练情绪分类模型。实现对文本消极情感和文本积极情感的识别。并基于D…

推荐给大家5款小众无广告的软件

​ 你是否喜欢一些小众且无广告的软件&#xff1f;如果是的话&#xff0c;我这边有一些给你推荐的。 1.进程管理——ProcessExplorer ​ ProcessExplorer是一款高级系统进程管理工具&#xff0c;可实时查看Windows系统中所有正在运行的进程及其详细信息。它提供了比任务管理器…

autodl连接xftp

&#xff08;1&#xff09;首先打开xftp&#xff0c;新建会话 &#xff08;2&#xff09;给会话取个名字&#xff0c;然后填写主机和端口号 &#xff08;3&#xff09; 主机和端口号从autodl实例中找&#xff0c;登入指令那里 &#xff08;4&#xff09;点击复制&#xff0c;然…

②原装进口芯片一主多从RS485通讯转换器从站转地址波特率转校验位转寄存器转停止位modbus协议转换中继器

第二章主要是讲参数设置和典型接线 &#xff08;产品介绍&#xff0c;应用和特点看第一章&#xff09; 一主多从RS485通讯转换器从站转地址波特率modbus协议转换中继器 通信接口 (以 MS-M1401 为例) 转换器共有 5 组通信接口&#xff0c;S1、S2、S3、S4 通道接 RS485 从…

智能AC管理系统信息泄露漏洞

文章目录 免责声明漏洞描述搜索语法漏洞复现yaml修复建议 免责声明 本文章仅供学习与交流&#xff0c;请勿用于非法用途&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任 漏洞描述 智能AC管理系统是一个控制管理系统因存在未授权访问导致信息泄露 搜…

HT366 具有防破音功能的免电感滤波2x20W D类立体声音频功放

特点 输出功率(BTL模式) 2x22W (VDD14V,RL4Ω,THDN10%) 输出功率(PBTL模式) 34W(VDD16V,RL4Ω,THDN10%) 单电源系统&#xff0c;4.5V-16V宽电压输入范围 ACF防破音功能可选 超过90%效率&#xff0c;无需散热器 可选输出模式:BD和ISPW 扩频功能&#xff0c;免电感滤波 模拟差分…

网站在线客服插件配置

使用工具&#xff1a;百度爱番番 下载地址&#xff1a; 百度爱番番—企业的一站式智能营销管家 一、下载百度爱番番APP&#xff0c;注册账号 二、 登录app 三、点击设置——站点设置——新建站点 四、设置站点名称——站点地址——PC站点——确定 五、点击配置好的站点的获取代…

安卓13去掉下拉菜单的Dump SysUI 堆的选项 android13删除Dump SysUI 堆

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析3.1 位置13.2 位置24.代码修改5.编译6.彩蛋1.前言 客户需要去掉下拉菜单里面的Dump SysUI 堆图标,不让使用这个功能。 2.问题分析 android的下拉菜单在systemui里面,这里我们只需要定位到对应的添加代…

Hutool工具类导出Excel设置自适应宽度

Hutool工具类导出Excel设置自适应宽度。最近在用Hutool的工具类BigExcelWriter实现Excel表的导出&#xff0c;测试过程&#xff0c;发现默认是不自动适应宽度的&#xff0c;需要设置属性才能自适应 在Hutool的官方文档https://plus.hutool.cn/apidocs/cn/hutool/poi/excel/Big…

国内AI工具精选:四款软件,让效率倍增

国内的AI工具也有不少好用的&#xff0c;涵盖了视频生成、文案写作、PPT生成、AI数字人等用途&#xff0c;功能强大&#xff0c;能帮助提高效率&#xff0c;更好地完成工作。 1.AI视频生成——可灵 一款国产的智能视频生成工具&#xff0c;采用3D联合注意力机制&#xff0c;高…

攻防世界--->BABYRE

做题笔记。(可以作为例题。) 下载 查壳 64ida打开。 分析&#xff1a; 动态试一试。 跟进judge 很奇怪是一段.data(数据段) 报错&#xff0c;但是程序并没有结束&#xff1a; 我们对其进行处理&#xff1a;&#xff08;动态函数处理&#xff09; 因为call不能用在.data段&…

人工智能时代,我们依旧有无限的选择权!

人工智能时代&#xff0c;即有人两眼放光&#xff0c;又有人忧心忡忡。前者看到大量的机遇、蓝海&#xff0c;后者看到了失业和糟糕的未来&#xff0c;亦或是有人有喜有忧。但是只要你知晓一个真谛&#xff1a;凡事皆有利有弊&#xff0c;那便不用内耗了。或是选择当前的生活节…

MySQL函数:数值函数

先附一张黑马程序员的听课截图 1. 向上取整函数CEIL(X) select CEIL(1.5); //这个也就是数学中的向上去整数&#xff0c;无需解释 2. 向下取整函数 FLOOR(X) select FLOOR(1.5); //同上&#xff0c;换成向下取整3. 求模运算 MOD(N,M) 求N / M的余数 select mod(3, 4) …

关于红帽认证你想知道的都在这里啦~

大家好&#xff0c;这里是G-LAB IT实验室。近期好多人来问红帽认证&#xff0c;有些是还在校的大学生&#xff0c;有些是已经工作的&#xff0c;针对大家的困惑&#xff0c;专门做了一期解答&#xff0c;下面我们一起来看看大家都有哪些疑问吧~ 01、诸多IT资格证考哪个&#xf…

JMM:Java内存模型

Java内存模型&#xff08;JMM&#xff09; 参考&#xff1a;https://javaguide.cn/java/concurrent/jmm.html、https://www.javabetter.cn/thread/jmm.html JMM 是什么&#xff1f; JMM&#xff08;Java Memory Model&#xff09;出现的原因有两点&#xff08;如下&#xff09…

System.Data.SQLite 版本兼容问题

System.Data.SQLite 32和64位版本兼容问题 SQLite数据库小巧轻量、免费开源&#xff0c;在中小型项目或移动端项目经常使用&#xff0c;在Windows桌面端需要使用System.Data.SQLite.dll文件&#xff0c;版本特别多&#xff0c;可仔细阅读官方文档了解它们的区别。本文介绍如何…

从AI应用排行榜选择AI产品(9月)

2024年9月13日&#xff0c;OpenAI公司宣布推出其全新的AI模型&#xff1a;o1&#xff0c;在数学、编程和科学问题的解决处理能力上取得了显著进步。该模型通过自我对弈强化学习&#xff08;Self-play RL&#xff09;和思维链&#xff08;Chain of Thought, CoT&#xff09;技术…

C++入门基础知识76(实例)——实例 1【输出 “Hello, World!“】

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于C 实例 【输出 "Hello, World!&quo…

模版进阶(template)

1.非类型模版参数 模版参数分类类型形参与非类型形参。 ① 类型形参&#xff1a;出现在在模板参数列表中&#xff0c;跟在class或者typename之类的参数类型名称。 ② 非类型形参&#xff0c;就是用一个常量作为类(函数)模板的一个参数&#xff0c;在类(函数)模板中可将该参数当…

如何在算家云搭建RVC-WebUI(语音转换)

一、Retrieval-based-Voice-Conversion-WebUI简介 Retrieval-based-Voice-Conversion-WebUI&#xff08;简称 RVC&#xff09;模型是一个基于 VITS&#xff08;Variational Inference with adversarial learning for end-to-end Text-to-Speech&#xff09;的简单易用的语音转…