024-从零搭建微服务-系统服务(六)
写在最前
如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。
源码地址(后端):https://gitee.com/csps/mingyue
源码地址(前端):https://gitee.com/csps/mingyue-ui
文档地址:https://gitee.com/csps/mingyue/wikis
本节概要
mingyue-ui
目前与后端交互只有登录登出接口,本节从用户入手,完成用户前后端交互增删改查。
分页查询用户
分页查询通用类
@Data
@Schema(description = "分页查询通用类")
public class PageCommon implements Serializable {private static final long serialVersionUID = 1L;@Schema(description = "分页大小")private Integer pageSize;@Schema(description = "当前页数")private Integer pageNum;@Schema(description = "排序列")private String orderByColumn;@Schema(description = "排序的方向 desc 或者 asc")private String isAsc;/*** 当前记录起始索引 默认值*/public static final int DEFAULT_PAGE_NUM = 1;/*** 每页显示记录数 默认值 默认查全部*/public static final int DEFAULT_PAGE_SIZE = Integer.MAX_VALUE;public <T> Page<T> build() {Integer pageNum = ObjectUtil.defaultIfNull(getPageNum(), DEFAULT_PAGE_NUM);Integer pageSize = ObjectUtil.defaultIfNull(getPageSize(), DEFAULT_PAGE_SIZE);if (pageNum <= 0) {pageNum = DEFAULT_PAGE_NUM;}Page<T> page = new Page<>(pageNum, pageSize);List<OrderItem> orderItems = buildOrderItem();if (CollUtil.isNotEmpty(orderItems)) {page.addOrder(orderItems);}return page;}/*** 构建排序** 支持的用法如下: {isAsc:"asc",orderByColumn:"id"} order by id asc* {isAsc:"asc",orderByColumn:"id,createTime"} order by id asc,create_time asc* {isAsc:"desc",orderByColumn:"id,createTime"} order by id desc,create_time desc* {isAsc:"asc,desc",orderByColumn:"id,createTime"} order by id asc,create_time desc*/private List<OrderItem> buildOrderItem() {if (StrUtil.isBlank(orderByColumn) || StrUtil.isBlank(isAsc)) {return null;}String orderBy = SqlUtil.escapeOrderBySql(orderByColumn);orderBy = StrUtil.toUnderlineCase(orderBy);String[] orderByArr = orderBy.split(StrUtil.COMMA);String[] isAscArr = isAsc.split(StrUtil.COMMA);if (isAscArr.length != 1 && isAscArr.length != orderByArr.length) {throw new ServiceException("排序参数有误");}List<OrderItem> list = new ArrayList<>();// 每个字段各自排序for (int i = 0; i < orderByArr.length; i++) {String orderByStr = orderByArr[i];String isAscStr = isAscArr.length == 1 ? isAscArr[0] : isAscArr[i];if ("asc".equals(isAscStr)) {list.add(OrderItem.asc(orderByStr));}else if ("desc".equals(isAscStr)) {list.add(OrderItem.desc(orderByStr));}else {throw new ServiceException("排序参数有误");}}return list;}}
接口层
@GetMapping("list")
@SaCheckPermission("system:user:list")
@Operation(summary = "获取所有用户信息")
public R<IPage<SysUserVo>> getSysUsers(PageCommon page, UserQueryDto dto) {return R.ok(sysUserService.getSysUsers(page, dto));
}
逻辑层
@Override
public IPage<SysUserVo> getSysUsers(PageCommon page, UserQueryDto dto) {return sysUserMapper.getUserVosPage(page.build(), dto);
}
数据层
<select id="getUserVosPage" resultType="com.csp.mingyue.system.api.vo.SysUserVo">SELECT su.*,sr.role_name, sr.role_codeFROM sys_user suLEFT JOIN sys_user_role sur ON sur.user_id = su.user_idLEFT JOIN sys_role sr ON sur.role_id = sr.role_id<where>su.is_deleted = '0'<if test="query.username != null and query.username != ''"><bind name="usernameLike" value="'%' + query.username + '%'" />and su.username LIKE #{usernameLike}</if></where>ORDER BY su.create_time DESC</select>
接口测试
非排序入参
curl -X 'GET' \'http://mingyue-gateway:9100/system/sysUser/list?pageSize=10&pageNum=1&username=' \-H 'accept: */*' \-H 'Authorization: vhiqUYS3NtT5zpvyzwudffAhyu3vswAV'
排序入参
curl -X 'GET' \'http://mingyue-gateway:9100/system/sysUser/list?pageSize=10&pageNum=2&orderByColumn=userId&isAsc=desc&username=' \-H 'accept: */*' \-H 'Authorization: vhiqUYS3NtT5zpvyzwudffAhyu3vswAV'
添加或编辑用户
接口层
@PostMapping("addOrEdit")
@Operation(summary = "添加或编辑用户")
public R<Boolean> addOrEdit(@Valid @RequestBody UserAddOrEditDto dto) {return R.ok(sysUserService.addOrEdit(dto));
}
逻辑层
@Override
@Transactional(rollbackFor = Exception.class)
public boolean addOrEdit(UserAddOrEditDto dto) {SysUser sysUser = BeanUtil.copyProperties(dto, SysUser.class);// 添加用户if (Objects.isNull(sysUser.getUserId())) {// 密码加密sysUser.setPassword(BCrypt.hashpw(sysUser.getPassword(), userPasswordProperties.getSalt()));}boolean flag = this.saveOrUpdate(sysUser);if (!flag) {throw new UserException("用户信息保存异常");}// 保存角色关系flag = sysRoleService.addUserRole(sysUser.getUserId(), dto.getRoleCode());if (!flag) {throw new UserException("用户角色信息保存异常");}return true;
}
删除用户
接口层
@DeleteMapping("{userId}")
@Operation(summary = "删除用户", parameters = { @Parameter(name = "userId", description = "用户ID", required = true) })
public R<Boolean> delUser(@PathVariable Long userId) {return R.ok(sysUserService.delUser(userId));
}
逻辑层
@Override
public boolean delUser(Long userId) {return sysUserMapper.deleteByIdLogic(userId) > 0;
}
数据层
<delete id="deleteByIdLogic">UPDATE sys_user su SET su.is_deleted = '1' WHERE su.user_id = #{userId}
</delete>
mingyue-ui 接口交互
接口定义
list: (page: object) => {return request({url: '/api/system/sysUser/list',method: 'get',params: page});
},
addOrEdit: (data: object) => {return request({url: '/api/system/sysUser/addOrEdit',method: 'post',data: data});
},
del: (userId: number) => {return request({url: '/api/system/sysUser/' + userId,method: 'delete'});
}
分页查询
src/views/system/user/index.vue
const getTableData = async () => {state.tableData.loading = true;const res = await getUserList();state.tableData.data = res.data.records;state.tableData.total = res.data.total;state.tableData.loading = false;
};
添加或编辑用户
src/views/system/user/dialog.vue
const onSubmit = () => {userApi().addOrEdit(state.ruleForm).then(res => {if (res.data) {closeDialog();emit('refresh');state.dialog.type === 'add' ? ElMessage.success('添加成功') : ElMessage.success('修改成功');} else {state.dialog.type === 'add' ? ElMessage.error('添加失败') : ElMessage.error('修改失败');}})
};
删除用户
src/views/system/user/index.vue
const onRowDel = (row: RowUserType) => {ElMessageBox.confirm(`此操作将永久删除账户名称:“${row.username}”,是否继续?`, '提示', {confirmButtonText: '确认',cancelButtonText: '取消',type: 'warning',}).then(() => {userApi().del(row.userId).then(() => {getTableData();ElMessage.success('删除成功');});}).catch(() => {});
};
小结
用户管理已经可以交互接口完成真实的增删改查了。
目前 mingyue
已经包含了 统一网关服务
、统一认证服务
、统一系统服务
、统一推送服务
,距离目标还差
统一文件服务
、统一定时服务
、统一搜索服务
等等。接下来搞一搞 统一文件服务
吧!
本人后端一枚,前端粗通,等后续后端服务基本完成后,再去抽时间完善前端代码哈~~ 见谅《 - 。- 》
相关文章:
024-从零搭建微服务-系统服务(六)
写在最前 如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。 源码地址(后端):https://gitee.com/csps/mingyue 源码地址(前端):https://gitee.com/csps…...
Arduino驱动TCS3200传感器(颜色传感器篇)
目录 1、传感器特性 2、硬件原理图 3、控制器和传感器连线图 4、驱动程序 TCS3200颜色传感器是一款全彩的颜色检测器,包括了一块TAOS TCS3200RGB感应芯片和4个白色LED灯,TCS3200能在一定的范围内检测和测量几乎所有的可见光。TCS3200有大量的光检测器,每个都有红绿蓝和清…...
基于Matlab实现多个数字水印案例(附上源码+数据集)
数字水印是一种在数字图像或视频中嵌入特定信息的技术,以保护知识产权和防止盗版。在本文中,我们将介绍如何使用Matlab实现数字水印。 文章目录 实现步骤源码数据集下载 实现步骤 首先,我们需要选择一个用于嵌入水印的图像。这可以是原始图像…...
C语言之指针进阶篇(2)
目录 函数指针 函数名和&函数名 函数指针的定义 函数指针的使用 函数指针陷阱 代码1 代码2 注意 函数指针数组定义 函数指针数组的使用 指向函数指针数组的指针 书写 终于军训圆满结束了,首先回顾一下指针进阶篇(1)主要是…...
C++ 进制转化入门知识(1)
一、什么是进制 进制是一种用来表示数值的系统或方法,它是基于一个特定的基数来工作的。在我们常见的几种进制中,有: 1. **二进制(基数 2)**: 二进制只用两个数字:0和1。这是计算机内部使用…...
【React】React学习:从初级到高级(四)
React学习[四] 4 应急方案4.1 使用ref引用值4.1.1 给组件添加ref4.1.2 ref和state的不同之处4.1.3 何时使用ref 4.2 使用ref操作DOM4.2.1 获取指向节点的ref4.2.3 使用 ref 回调管理 ref 列表4.2.4 访问另一个组件的DOM节点4.2.5 用 flushSync 同步更新 state 4.3 使用Effect同…...
微信小程序登录问题(思路简略笔记)
配置问题 这是小程序登录问题,必要的两个配置。 流程思路 1. 微信小程序端,会返回一个code。 2. 查看需要返回给微信小程序端的数据。 3. 既然需要返回三个数据,先看openid如何拿到 WX-Login https://api.weixin.qq.com/sns/jscode2ses…...
Go 锁扩展
文章目录 TryLock统计 goroutine数量读写锁读锁写锁常见死锁情况写锁重入写锁中调用读锁循环依赖 TryLock 源码中自带的(我的go是 1.20版本)TryLock 会尝试获取锁,如果获取不到返回false,并不会进行休眠阻塞(和 Lock的主要区别) func (m *Mutex) TryLo…...
Docker的简介及安装
[shouce]http://shouce.jb51.net/docker_practice/栾一峰菜鸟教程参考文献 1 环境配置的难题 软件开发最大的麻烦事之一,就是环境配置。用户计算机的环境都不相同,你怎么知道自家的软件,能在那些机器跑起来? 用户必须保证两件事…...
安卓核心板的不同核心规格及架构介绍
安卓核心板是将核心功能封装的一块电子主板,集成芯片、存储器和功放器件等,并提供标准接口的芯片。 其特点: ● 能跑 Android 等操作系统 强大的功能及丰富的接口 支持 LCD/TP,Audio,Camera,Video&#…...
flume1.11.0安装部署
1、准备安装包apache-flume-1.11.0-bin.tar.gz; 上传; 2、安装flume-1.11.0; 解压; tar -zxvf apache-flume-1.11.0-bin.tar.gz -C /opt/server 进入conf目录,修改flume-env.sh,配置JAVA_HOME;…...
通过wordpress 自定义主题的额外CSS删除指定区块
最近用wordpress建站,想要删除指定区块,发现相关的教程蛮少的,作为小白的我搜了相关教程,好像没找到,只能自己慢慢摸索了,看了很多,终于尝试实现了,特记录下,免得自己忘了…...
Rokid Jungle--Max pro
介绍和功能开发 YodaOS-Master操作系统:以交换计算为核心,实现单目SLAM空间交互,具有高精度、实时性和稳定性。发布UXR2.0SDK,为构建空间内容提供丰富的开发套件 多模态交互 算法原子化 多种开发工具协同 多生态支持 骁龙XR2…...
【LeetCode算法系列题解】第61~65题
CONTENTS LeetCode 61. 旋转链表(中等)LeetCode 62. 不同路径(中等)LeetCode 63. 不同路径 II(中等)LeetCode 64. 最小路径和(中等)LeetCode 65. 有效数字(困难ÿ…...
MATLAB中fillmissing函数用法
目录 语法 说明 示例 包含 NaN 值的向量 由 NaN 值组成的矩阵 插入缺失数据 使用移动中位数方法 使用自定义填充方法 包含缺失端点的矩阵 包含多个数据类型的表 fillmissing函数的功能是填充缺失的条目。 语法 F fillmissing(A,constant,v) F fillmissing(A,meth…...
电脑同时连接有线和无线网络怎么设置网络的优先级
电脑同时连接有线和无线网络怎么设置网络的优先级: 我们知道在 笔记本电脑系统 中,可以通过有线或无线网络进行联网。如果电脑在有线网络和无线网络同时存在的情况,应该怎么设置有线网络优先连接呢?对此我们提供下面的方法可以让电脑在有Wi…...
el-form表单动态校验(场景: 输入框根据单选项来动态校验表单 没有选中的选项就不用校验)
el-form表单动态校验 el-form常规校验方式: // 结构部分 <el-form ref"form" :model"form" :rules"rules"><el-form-item label"活动名称: " prop"name" required><el-input v-model"form.name" /…...
Java 数据结构与算法应该如何学习?
学习数据结构是计算机科学和软件工程领域中的重要基础知识之一。掌握数据结构对于编写高效、可扩展和可维护的代码至关重要。 1、掌握基本概念 首先,你需要掌握数据结构的基本概念。了解不同类型的数据结构,如数组、链表、栈、队列、树、图等ÿ…...
力扣(LeetCode)算法_C++——有效的数独
请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图) …...
制造企业如何优化物料控制?
导 读 ( 文/ 2127 ) 物料控制是指对制造过程中所涉及的物料流动和库存进行有效管理和控制的过程。它包括物料需求计划、供应商管理、物料采购、物料接收和入库、物料库存管理以及物料发放和使用等关键环节。通过精确的物料需求计划和库存管理,物料控制可以确保物料供…...
《Go语言在微服务中的崛起:为什么Go是下一个后端之星?》
🌷🍁 博主猫头虎🐅🐾 带您进入 Golang 语言的新世界✨✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文并茂…...
因为axios请求后端,接收不到token的问引出的问题
vue axios请求后端接受不到token的问题。 相关概念 什么是跨域? 跨域指的是在浏览器环境下,当发起请求的域(或者网站)与请求的资源所在的域之间存在协议、主机或端口中的任何一个条件不同的情况。换句话说,只要协议、…...
Stable Diffusion 免费升级 SDXL 1.0,哪些新特性值得关注?体验如何?5 分钟带你体验!
一、引言 7 月 26 日,Stability AI 发布了 SDXL 1.0,号称目前为止,最厉害的开放式图像生成大模型。 它到底有没有网上说的那么炸裂?真的已经实现了像 midjourney 一样 靠嘴出图 的功能吗?相对于之前的版本,…...
【广州华锐互动】煤矿设备AR远程巡检系统实现对井下作业的远程监控和管理
煤矿井下作业环境复杂,安全隐患较多。传统的巡检方式存在诸多弊端,如巡检人员难以全面了解井下情况,巡检效率低下,安全隐患难以及时发现和整改等。为了解决这些问题,提高煤矿安全生产水平,越来越多的企业开…...
C语言与Java语言传输数据 需要转位
在Java语言中,可以通过将整数反转并修改字节顺序来实现低位转高位的转换。下面是一个示例代码,可以将一个整数从低位转高位: public static int toHH(int n) {byte[] bytes ByteBuffer.allocate(4).putInt(n).array();for (int i 0; i <…...
Framework开发——系统默认语言修改
Android 系统原版默认的语言为英文,但是对于中国大陆 Android 产品厂商来说,我们定制系统可能需要用户一开机就是简体中文。所以把 Android 系统出厂设置为简体中文对于 Android 系统产品化非常重要,我们可以通过修改系统属性来达到默认语言的作用。本文主要是在 Android 11…...
浅谈原型链
一.在掌握原型链之前首先要了解这三点 1.每个函数都有prototype这个属性我们称为原型对象 2.每个对象都有__proto__这个属性 3.对象的__proto__可以访问原型对象上的方法和变量,如果访问不了,就会向上进行查找,直到找不到为止,会出现报错的情况l。 二.例子 1.代码: let arr …...
合宙Air724UG LuatOS-Air LVGL API控件-截屏(Screenshots)
截屏(Screenshots) 分 享导出pdf 截屏功能,core版本号要>3211 示例代码 -- 创建图片控件img lvgl.img_create(lvgl.scr_act(), nil)-- 设置图片显示的图像lvgl.img_set_src(img, "/lua/test.png")-- 图片居中lvgl.obj_align(…...
【系统设计系列】 负载均衡和反向代理
系统设计系列初衷 System Design Primer: 英文文档 GitHub - donnemartin/system-design-primer: Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. 中文版: https://github.com/donnemart…...
Halcon实现3维点云平面拟合
Halcon实现3维点云平面拟合 function main()WindowHandle open_window()ObjectModel3D load_3D_model("1.om3")ObjectModel3DSelected remove_noise(ObjectModel3D)[X, Y, Z] extract_coordinates(ObjectModel3DSelected)[NX, NY, NZ, C] fit_plane(X, Y, Z)vi…...
苏州网站建设制作/重庆网站网络推广
JPEG压缩算法可以用失真的压缩方式来处理图像,但失真的程度却是肉眼所无法辩认的。这也就是为什么JPEG会有如此满意的压缩比例的原因。 一.JPEG压缩过程 JPEG压缩分四个步骤实现: 1.颜色模式转换及采样; 2.DCT变换; 3.量化&a…...
企业网站的基本内容/佛山关键词排名效果
MYSQL长字符截断即使没有任何注入漏洞,攻击者也可能登录到后台管理页面1、相关资料2、sql-mode的各项设置MySQL5.0以上版本支持三种sql_mode模式:ANSI、TRADITIONAL和STRICT_TRANS_TABLES。1、ANSI模式:宽松模式,更改语法和行为&a…...
赣州网站建设较好的公司/谷歌优化seo
\quad这几天看SVM,优化问题那里习惯上函数间隔设为1,一直没看到比较令人信服的详解,这里我提一下。 线性可分支持向量机的约束优化原始问题: maxw,bγ^∣∣w∣∣s.t.yi(w⋅xib)≥γ^,i1,2,...,N\max \limits_{w,b} \quad \frac…...
163网易邮箱/代哥seo
小编这有自学的过程中有一些资源可以免费共享, 【内涵Java学习80g视频,大厂面试题库,Java学习书籍,或者技术指导】 加微信领取【备注007】 程序员如何快速成长? 万事万物都要讲究科学方法,个人成长也不例…...
长沙个人做网站/石家庄网络营销
转载于:https://www.cnblogs.com/xiaoqi/archive/2008/08/15/1268836.html...
浏览器兼容测试网站/外贸推广网站
什么是A-GPS?所谓A-GPS(AssistedGPS)是一种结合网络基站信息和GPS信息对移动台进行定位的技术,暨利用全球卫星定位系统GPS,又利用移动基站,解决了GPS覆盖的问题,可以在GSM/GPRS、WCDMA和CDMA2000网络中使用。由于借用网络数据定位…...