当前位置: 首页 > news >正文

若依框架---为什么把添加和更新分成两个接口

👏作者简介:大家好,我是小童,Java开发工程师,CSDN博客博主,Java领域新星创作者
📕系列专栏:前端、Java、Java中间件大全、微信小程序、微信支付、若依框架、Spring全家桶
📧如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦
🍂博主正在努力完成2023计划中:以梦为马,扬帆起航,2023追梦人 

  

问题起源

最近因为自己在给公司开发新的管理系统,参考了开源系统若依中的很多地方,尤其是若依系统中的菜单管理,角色管理,用户管理部分。在学习研究这几个版块时,发现一个比较“怪”的现象,在若依系统中添加操作,通常我们称为add编辑操作,通常称为update,在其系统中大多数,或者至少目前看到的情况均是拆分开的两个独立接口。

例如,添加菜单与更新菜单的接口:

添加菜单

/*** 新增菜单*/@PreAuthorize("@ss.hasPermi('system:menu:add')")@Log(title = "菜单管理", businessType = BusinessType.INSERT)@PostMappingpublic AjaxResult add(@Validated @RequestBody SysMenu menu){if (UserConstants.NOT_UNIQUE.equals(menuService.checkMenuNameUnique(menu))){return AjaxResult.error("新增菜单'" + menu.getMenuName() + "'失败,菜单名称已存在");}else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath())){return AjaxResult.error("新增菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头");}menu.setCreateBy(getUsername());return toAjax(menuService.insertMenu(menu));}

更新菜单

/*** 修改菜单*/@PreAuthorize("@ss.hasPermi('system:menu:edit')")@Log(title = "菜单管理", businessType = BusinessType.UPDATE)@PutMappingpublic AjaxResult edit(@Validated @RequestBody SysMenu menu){if (UserConstants.NOT_UNIQUE.equals(menuService.checkMenuNameUnique(menu))){return AjaxResult.error("修改菜单'" + menu.getMenuName() + "'失败,菜单名称已存在");}else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath())){return AjaxResult.error("修改菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头");}else if (menu.getMenuId().equals(menu.getParentId())){return AjaxResult.error("修改菜单'" + menu.getMenuName() + "'失败,上级菜单不能选择自己");}menu.setUpdateBy(getUsername());return toAjax(menuService.updateMenu(menu));}

 

又比如添加角色与更新角色的接口:

添加角色

/*** 新增角色*/@PreAuthorize("@ss.hasPermi('system:role:add')")@Log(title = "角色管理", businessType = BusinessType.INSERT)@PostMappingpublic AjaxResult add(@Validated @RequestBody SysRole role){if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role))){return AjaxResult.error("新增角色'" + role.getRoleName() + "'失败,角色名称已存在");}else if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role))){return AjaxResult.error("新增角色'" + role.getRoleName() + "'失败,角色权限已存在");}role.setCreateBy(getUsername());return toAjax(roleService.insertRole(role));}

更新角色

/*** 修改保存角色*/@PreAuthorize("@ss.hasPermi('system:role:edit')")@Log(title = "角色管理", businessType = BusinessType.UPDATE)@PutMappingpublic AjaxResult edit(@Validated @RequestBody SysRole role){roleService.checkRoleAllowed(role);if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role))){return AjaxResult.error("修改角色'" + role.getRoleName() + "'失败,角色名称已存在");}else if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role))){return AjaxResult.error("修改角色'" + role.getRoleName() + "'失败,角色权限已存在");}role.setUpdateBy(getUsername());if (roleService.updateRole(role) > 0){// 更新缓存用户权限LoginUser loginUser = getLoginUser();if (StringUtils.isNotNull(loginUser.getUser()) && !loginUser.getUser().isAdmin()){loginUser.setPermissions(permissionService.getMenuPermission(loginUser.getUser()));loginUser.setUser(userService.selectUserByUserName(loginUser.getUser().getUserName()));tokenService.setLoginUser(loginUser);}return AjaxResult.success();}return AjaxResult.error("修改角色'" + role.getRoleName() + "'失败,请联系管理员");}

在比如用户版块:

添加用户

/*** 新增用户*/@PreAuthorize("@ss.hasPermi('system:user:add')")@Log(title = "用户管理", businessType = BusinessType.INSERT)@PostMappingpublic AjaxResult add(@Validated @RequestBody SysUser user){if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(user.getUserName()))){return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,登录账号已存在");}else if (StringUtils.isNotEmpty(user.getPhonenumber())&& UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))){return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,手机号码已存在");}else if (StringUtils.isNotEmpty(user.getEmail())&& UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))){return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在");}user.setCreateBy(getUsername());user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));return toAjax(userService.insertUser(user));}

更新用户

/*** 修改用户*/@PreAuthorize("@ss.hasPermi('system:user:edit')")@Log(title = "用户管理", businessType = BusinessType.UPDATE)@PutMappingpublic AjaxResult edit(@Validated @RequestBody SysUser user){userService.checkUserAllowed(user);if (StringUtils.isNotEmpty(user.getPhonenumber())&& UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))){return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,手机号码已存在");}else if (StringUtils.isNotEmpty(user.getEmail())&& UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))){return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在");}user.setUpdateBy(getUsername());return toAjax(userService.updateUser(user));}

猜测其接口拆分的原因

更新接口与添加接口,一般都会有很多判断的先决条件,如判断数据是否合法,包括手机号唯一性,邮箱账号唯一性,菜单名称唯一性等等,这些通常无论更新与添加都是需要判断的。

以菜单接口为例,其添加接口判断参数合法性包括:菜单名称唯一,外链数据合法性;

菜单更新接口除判断这两个数据外,还需要判断更新时所选择的上级菜单不是自己;

另外菜单添加与更新的区别是,菜单添加设置的字段为 createBy与 createTime,而更新菜单时,需要设置的是 updateBy与 updateTime

更新角色与添加角色的区别在于,更新角色时,还需要通过SpringSecurity来更新用户的权限数据。

添加用户时需要设置其密码字段,而更新用户时则不需要。

我们分析,其将接口拆分的主要原因是,这样会使得程序逻辑更加的简单,清晰,而不用每次需要什么操作都额外判断添加与更新问题。

专栏:若依框架 

 

                                                                       关注公众号,领取资料。 

相关文章:

若依框架---为什么把添加和更新分成两个接口

👏作者简介:大家好,我是小童,Java开发工程师,CSDN博客博主,Java领域新星创作者 📕系列专栏:前端、Java、Java中间件大全、微信小程序、微信支付、若依框架、Spring全家桶 &#x1f4…...

图论算法:Floyd算法

文章目录Floyd算法例题:灾后重建Floyd算法 Floyd算法用于求图中任意两点之间的最短路径,该算法主要运用了动态规划的思想。 思考: 给你几个点与边,可以组成一张图,那么如何求得任意两点之间的最短路径呢?…...

回顾 | .NET MAUI 跨平台应用开发 - 用 .NET MAUI 开发一个无人机应用(下)

点击蓝字关注我们编辑:Alan Wang排版:Rani Sun微软 Reactor 为帮助广开发者,技术爱好者,更好的学习 .NET Core, C#, Python,数据科学,机器学习,AI,区块链, IoT 等技术,将…...

部署有多个仓库的svn服务

centos7自带svn服务,现需要创建多个仓库,并实现用户读写功能 创建svn版本库 mkdir /home/svn mkdir /home/svn/confmkdir /home/svn/yk1 mkdir /home/svn/yk2 svnadmin create /home/svn/yk1 svnadmin create /home/svn/yk2 进入版本库yk1的配置文件路…...

Mapper文件注入问题

Mapper文件注入问题UserMapper that could not be found.原因分析解决方案程序正常运行,但是注入类爆红问题原因分析解决方法UserMapper’ that could not be found. 原因分析 撰写了mapper文件,但是没有注入spring容器 解决方案 添加mybatis.mapper-…...

基于微信小程序的国产动漫论坛小程序

文末联系获取源码 开发语言:Java 框架:ssm JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7/8.0 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven3.3.9 浏览器…...

常用限流算法

简单时间窗口 算法逻辑:设置周期时间内的最大并发量问题:在周期尾端进去阈值并发后,进入下一周期时,又进入阈值并发量,则会出现瞬时并发量是阈值的2倍。 滑动时间窗口(优化) 算法逻辑&#xf…...

前端面经详解

目录 css 盒子充满屏幕 A.给div设置定位 B.设置html,body的宽高 C.相对当前屏幕高度(强烈推荐) 三列布局:左右固定,中间自适应 flex布局(强烈推荐) grid布局 magin负值法 自身浮动 绝对定位 圣…...

网页CAD开发快速入门

演示说明 提示:目前提供两种在网页中浏览编辑CAD图纸方案,详细说明见:MxDraw帮助 网页中打开CAD最简步骤: 第一步: 安装插件运行环境,下载安装(可能需要退杀毒软件):https://demo.mxdraw3d.com:3562/MxDrawx86Setup…...

C#开发的OpenRA的mod.yaml文件

C#开发的OpenRA的mod.yaml文件 在OpenRA游戏里,会看到这样一段代码: Manifest LoadMod(string id, string path){IReadOnlyPackage package = null;try{if (!Directory.Exists(path)){Log.Write("debug", path + " is not a valid mod package");return …...

【ESP32+freeRTOS学习笔记-(七)中断管理】

目录1、概述2、在ISR中使用FreeRTOS中专用的API2.1 独立的用于ISR中的API2.2 关于xHigherPriorityTaskWoken 参数的初步理解3、延迟中断处理的方法-将中断中的处理推迟到任务中去4 方法一:用二进制信号量来同步ISR与”延时处理的任务“4.1 二进制信号量4.2 函数用法…...

【总结】1591- 从入门到精通:使用 TypeScript 开发超强的 CLI 工具

作为一名开发者,掌握 CLI 工具的开发能力是非常重要的。本文将指导你如何使用 TypeScript 和 CAC 库开发出功能强大的 CLI 工具。快速入门首先,需要先安装 Node.js 和 npm(Node Package Manager),然后在项目目录中创建…...

【Java】int和Integer的区别?为什么有包装类?

int和Integer的区别?为什么有包装类? java是一种强类型的语言,所以所有的属性都必须要有一个数据类型。 PS:java10有了局部变量类型推导,可以使用var来代替某个具体的数据类型,但是在字节码阶段&#xff0…...

【LeetCode】石子游戏 IV [H](动态规划)

1510. 石子游戏 IV - 力扣(LeetCode) 一、题目 Alice 和 Bob 两个人轮流玩一个游戏,Alice 先手。 一开始,有 n 个石子堆在一起。每个人轮流操作,正在操作的玩家可以从石子堆里拿走 任意 非零 平方数 个石子。 如果石…...

修改Vue项目运行的IP和端口

前言 我们在使用VsCode启动Vue项目的时候,我发现:默认的端口号好像和tomcat一样,默认都是8080,如果8080被占用了,就会使用8081,8082这样的方式以此类推。 那么,我们是否可以像后端一样,通过修改…...

【C++提高编程】map/ multimap 容器详解(附测试用例与结果图)

目录1. map/ multimap容器1.1 map基本概念1.2 map构造和赋值1.3 map大小和交换1.4 map插入和删除1.5 map查找和统计1.6 map容器排序1.7 案例-员工分组1.7.1 案例描述1.7.2 实现步骤1. map/ multimap容器 1.1 map基本概念 简介: map中所有元素都是pairpair中第一个…...

laravel操作redis和缓存操作

一:操作redis1:redis拓展安装composer require predis/predis或者你也可以通过 PECL 安装 PhpRedis PHP 扩展,安装方法比较复杂,个人不推荐2:配置redis在config/database.php文件中配置redis(1):单个redis配置redis > [client …...

目标检测论文阅读:GaFPN算法笔记

标题:Construct Effective Geometry Aware Feature Pyramid Network for Multi-Scale Object Detection 会议:AAAI2022 论文地址:https://ojs.aaai.org/index.php/AAAI/article/view/19932 文章目录Abstract1. Introduction2. Related Work2.…...

【转】Generative Pretrained Transformer

原文链接:https://www.cnblogs.com/yifanrensheng/p/13167796.html一、GPT简介1.1 背景目前大多数深度学习方法依靠大量的人工标注信息,这限制了在很多领域的应用。此外,即使在可获得相当大的监督语料情况下,以无监督学习的方式学…...

day34|343. 整数拆分、96.不同的二叉搜索树

343. 整数拆分 给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k > 2 ),并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 示例 1: 输入: n 2 输出: 1 解释: 2 1 1, 1 1 1。 示例 2: 输入: n 10 输出: 36 解…...

django filter 统计数量 按属性去重

在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

Python 训练营打卡 Day 47

注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...

macOS 终端智能代理检测

🧠 终端智能代理检测:自动判断是否需要设置代理访问 GitHub 在开发中,使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新,例如: fatal: unable to access https://github.com/ohmyzsh/oh…...

Q1起重机指挥理论备考要点分析

Q1起重机指挥理论备考要点分析 一、考试重点内容概述 Q1起重机指挥理论考试主要包含三大核心模块:安全技术知识(占40%)、指挥信号规范(占30%)和法规标准(占30%)。考试采用百分制,8…...

FTPS、HTTPS、SMTPS以及WebSockets over TLS的概念及其应用场景

一、什么是FTPS? FTPS,英文全称File Transfer Protocol with support for Transport Layer Security (SSL/TLS),安全文件传输协议,是一种对常用的文件传输协议(FTP)添加传输层安全(TLS)和安全套接层(SSL)加密协议支持的扩展协议。…...

[学习笔记]使用git rebase做分支差异化同步

在一个.NET 项目中,使用了Volo.Abp库,但出于某种原因,需要源码调试,因此,使用源码方式集成的项目做了一个分支archive-abp-source 其中引用方式变更操作的提交为:7de53907 后续,在master分支中…...

民锋视角下的资金流效率与账户行为建模

民锋视角下的资金流效率与账户行为建模 在当前复杂多变的金融环境中,资金流效率已成为衡量一家金融服务机构专业能力的重要指标。民锋在账户管理与资金调配的实战经验中,逐步建立起一套以资金流路径为核心的行为建模方法,用以评估客户行为、交…...