- 博客(34)
- 收藏
- 关注
原创 easymall---一对多xml修改问题(知识点)
"sp_property_id": "6799219674", // ❌ 属性ID变成了平级字段。"sp_property_id": "1001", // ⚠️ 这是子分类的属性。"categoryName": "数码家电", // ⚠️ 重复的分类信息。"sp_property_id": "3941671992", // ⚠️ 新的属性。"sp_property_name": "红色", // ⚠️ 新的属性值。
2026-02-07 15:53:29
561
原创 easymall---图片上传以及图片展示
因为要展示图片最后肯定要返回图片路径给前端,让前端可以找到图片存储的位置,同时也要为上传的图片存储到本地,为了便于区分以及习惯,文件夹以年月份的形式区分,文件名用随机字符串,缩略图添加_****作为区分。logger.error("执行命令失败cmd{}失败:{} ", cmd, e.getMessage());这一段就是为了把设定的头路径+年月份给弄出来,因为缩略图的名字和文件的名字不一样所以到这里之前他们的文件路径是相同的。logger.info("执行命令{}结果{}", cmd, result);
2026-02-07 13:03:00
684
原创 easymall---管理端商品管理数据库建立思路以及基础产品展示
然后再思考,商品不能只是单独的存在,例如商店搜索可以通过分类查找搜索商品,所以必须与商品分类搭边,商品分类表与商品表是1比多的关系,所以商品表要带上逻辑外键,又因为商品分类表有父id这种分类方式,所以商品表要加上本身的分类以及父id分类。然后一款相同的商品有不同的大小 款式,例如鞋子有36码也有37码,避免商品表过于冗余,创建一个商品属性表,商品表与商品属性表是1:多的关系,所以商品属性表需要加上商品表的逻辑外键。商品属性id,商品id(外键),商品属性名字,属性上传时间,商品属性具体值。
2026-02-06 16:32:00
602
原创 easymall---管理后端商品属性管理
摘要:本文设计了一个商品属性管理系统,包含数据库表设计和业务实现。数据库表sysproductProperty包含property_id(主键)、cover_type(标识是否含图片)、category_id(所属分类)、p_category_id(父分类ID,优化查询)、property_name(属性名)和property_sort(排序字段)。实现层通过判断property_id是否存在来决定新增或更新操作,新增时自动生成10位随机ID并设置排序值。图片采用本地存储方式,仅保存路径而非图片数据。系统通
2026-02-04 15:55:34
316
原创 easymall----管理后端分类展示
这部分需要细讲,要如图展示需要人为对类进行改造,要给sysCategory类加上List<sysCategory> children属性,便于树形展示 convertLine2Tree对查找到的所有数据进行递归 将子分类加入到children中。"categoryName": "手机通讯","categoryName": "电脑办公","categoryName": "数码影音","categoryName": "家用电器","categoryName": "数码家电","info": "请求成功",
2026-02-04 15:15:54
713
原创 application.yml或者yaml文件不显示绿色问题
查看springboot的这个包是否引入 可以多尝试几次mvn clean install -U命令。我添加了application.yml 这个可加可不加 主要检查是否存在*.yaml以及*.yml。2.检查file-setting-file type中的yaml文件识别。3.打开project struct。1.pom.xml文件引包问题。将resource点亮为如图。直到在maven侧边拦看见。最后就识别到绿叶子啦。
2026-02-03 14:32:07
24
原创 easychat项目复盘---管理端
思路:获取最新版本,保存新版本的版本号一定要高于往期的所有版本,将所有版本倒序搜索集合成list,再取开头第一个即为最新版本,如何判断大小呢,如图,一般的版本号都是1.0.0 1.0.1 只要把.去掉那就是100 101 那么101大于100 则1.0.1大于1.0.0 下述有两个if 是分别为更新(有id)与创建(无id)的版本判断。throw new BusinessException("当前版本必须大于历史版本");随后创建插入,id为自增长主键,若有文件则处理文件路径,保存文件。
2025-12-30 16:52:39
634
原创 easychat项目复盘---管理端之用户与群组
发送消息告诉此用户他已经被下线,在send2USER中不仅发送了这条消息,而且还判断了消息类型(强制下线消息),如果是强制下线消息,则将此用户的id踢出频道,即断开与服务器的websocket链接,实现客户端与服务端的主动式断联,forceoffLine方法仅仅是编写了消息。思路:删除群组其实不难,就是将群组状态改为解散状态即可,但是难就难在你要向所有群组里的人播报消息,并且要在contact表中将关系给删除(逻辑删除),接下来分段讲解。此段就是删除群组的代码,比较简单不再赘述(逻辑删除)
2025-12-26 14:02:41
773
原创 easychat项目复盘----聊天部分发送信息上传文件下载文件
但创建群组的消息除外,因为创建群组的消息可能是系统消息,不需要加昵称。对于某些类型的消息(聊天、创建群组、添加好友、媒体聊天),需要生成或更新会话,并保存消息到数据库。最后一句话有发送的信息,群组的创建,好友的添加等均要显示,群组的最后一句话需要用户id:消息内容的形式(为代码中的枚举类 CHAT GROUP_CREATE等)会话需要会话id,会话id要避免重复,除了使用uuid,可以使用两个用户的用户id拼接,保证会话id唯一 ,群组的会话id则使用uuid。如果是群聊,则直接使用群ID作为会话ID。
2025-12-23 14:40:39
623
原创 easychat项目复盘---聊天部分netty篇
再次回归到事件循环组,事件循环组会不断循环解决io问题,如果事件循环组没有结束,idlestatehandler会一直接收到消息,一但idlestatehandler接受不到则代表事件循环组已经结束,意味着客户端与服务器断开,则需要一个处理器去关闭通道,所以handlerheartbeat应运而生。事件循环组的含义就是无限循环去不断的处理io事件,不断循环就达到了实时的目的,因为他永不停歇,只要一发送信息就会处理,另一方就可以接受到信息。// 对http协议的支持,使用http的编码器,解码器。
2025-12-21 17:21:15
496
原创 easychat项目复盘---获取联系人列表,联系人详细,删除拉黑联系人
解释:写法不唯一,如果前端不传入contactType时,就需要后端自己分类,会比较耗费时间,所以前端传入contactType是最优解(前端展示是区分的,即上述图片两个区域分别调用了loadContact方法 但是传入的contactType分别为用户与群组,所以就不需要而外再区分用户与群组的方法)思路:删除联系人不只有直接删除,还有拉黑的状态,所以需要传入删除的类型,所以需要当前用户id,对象,和删除类型。实现层思路:主要是要修改两次user_contact表 因为互为好友 实现简单不贴代码。
2025-12-10 17:16:02
566
原创 easychat项目复盘---搜索,申请,获取好友申请列表,处理好友申请
思路:判断对象id是否存在 操作类型是否为枚举类中的几种 若为同意修改user_contact表 插入两条记录(因为互为好友) 若为拒绝则此请求直接作废不做任何处理 若为拉黑修改user_contact表 插入两条(拉黑与被拉黑) 处理user_contact_apply 把此记录改成已处理。思路:前端传参:需要申请人信息(当前用户) 对象(被申请人或群组) 当前两人的状态 申请信息(可有可无)思路:当前用户id,对象id,操作类型(同意,拉黑,拒绝)思路:前端参数:当前用户与被搜索人(群组)
2025-12-09 21:22:23
901
原创 easychat---创建,获取,获取详细,退群,解散,添加与移除群组
思路:群主不可以退群(前端群组不可能退群只有解散群主,避免不法分子调接口),退群为当前用户行为,所以需要当前用户信息,以及群id,用来删除contact表中的关系,这部分需要物理删除,直接在数据库中删除此记录,页面session需要显示人数,所以要人数减去退群人数,本功能依旧需要涉及信息所以只提供代码片段。思路:创建群组需要知道谁创的,群的id,群的名字,群的加入方式,群的头像,群的公告 这些就是我们需要的参数,有部分是可以不传的。//创建者不能退出群聊,只能解散群。//将自己添加为联系人。
2025-12-04 17:11:01
562
原创 一句话一视频智能体---langchain框架代码实现以及低代码平台总结
大部分代码可以通过ai进行生成,如安全验证,video_maker_tool此工具,以及manim代码的使用与生成,作为调用ai的人员,主要工作是构思系统以及选用工具,不只有manim库可以达到这种效果,moviepy也可以,但是trea使用moviepy会有bug所以这里不做选用,调用大模型要锻炼自身对prompt的编写,不提供prompt也是这个原因。return "未找到生成的视频文件""""工具函数:根据脚本生成manim动画代码并渲染成视频。# 将 \\n 转换为 \n,将 \\" 转换为 "
2025-12-04 14:15:43
676
原创 easypan项目复盘---外部分享
sessionWebDto.getFileId就是我的测试为根目录 现在开始递归 进入checkFilePid 验证神这个文件夹是否在我的测试里面 虽然网页前端进入神这个文件夹想要查看屏幕截图 就再次调用此方法验证屏幕截图的根目录是不是我的测试 可以理解一下 这段代码算比较复杂的代码。例如现在有一个文件结构如下:tPXRa2PKfl(我的测试) ← fLQQyJ7vrS(神) ← 6TDu1l30NX(屏幕截图)备注:难以理解 作用为防止别人越权查看未分享的文件 逻辑复杂 这里简单讲解。
2025-10-13 10:37:08
872
原创 easypan项目实战---回收站,还原,彻底删除
实现层:findAllSubFolderFileList作用是找出文件夹下的子文件夹 这段代码我个人理解是先找出所有文件夹将他们变回使用中 再找出所有的文件 最后检查重命名 但是这一段代码中包含对根目录的查询 我个人是不太理解这一段代码的 但是ai给出的结果是这段代码必不可少(注释带有查询所有根目录的文件) 感兴趣可以思考下为什么。//查询所有所选文件 将目录下的所有删除的文件给你更新为使用中。//删除所有选文件,子目录中的文件。//找到所选文件子目录文件ID。//查询所有根目录的文件。
2025-10-11 13:31:25
597
原创 easypan项目复盘----文件删除
解惑:我个人觉得这段代码相当别扭 findAllSubFolderFileList方法是用来递归查找子文件夹 但是传入的时候也传入了普通文件id 导致delFilePidList里面有文件夹 子文件夹 以及普通第一次选的文件 虽然使用mapper时候文件id不影响 功能正常 但是就是觉得相当别扭 觉得可以优化的朋友可以自己尝试优化下代码。//将选中文件更新为回收站。
2025-10-10 10:41:07
435
原创 easypan项目复盘---文件下载链接生成与文件下载
if (request.getHeader("User-Agent").toLowerCase().indexOf("msie") > 0) {//IE浏览器。
2025-10-10 09:50:54
867
原创 easypan项目复盘---文件重命名移动文件
实现层:整体思路就是找出要移动到的目录中有的文件 以及选择要移动的文件 然后对比是否同名 同名则重命名 不同名直接移动 整体逻辑实现不难 看代码可以明白。获取可移动目录: 十分简单 要注意的就是setExcludeFileIdArray 若自己为文件夹 把自己排除出可移动目录中 防止将自己移动进自己里。throw new BusinessException("此目录下已经存在同名文件,请修改名称");throw new BusinessException("文件不存在");//将所选文件重命名。
2025-10-09 15:21:59
643
原创 easypan项目复盘---创建目录获取目录路径
思路:如果只传最外层的文件夹id 想要获取其中的文件信息 只能递归 所以这里选择传递所有文件夹id(这里仅用于 。throw new BusinessException("此目录下已经存在同名文件,请修改名称");思想:一般需要用户id 文件夹名 以及父类id 因为可能会在文件夹中创建文件夹。实现层: 非常简单的逻辑不做赘述。
2025-10-09 09:40:41
501
原创 easypan项目复盘---文件预览
文件读取视频一般先读文件id(index.m3u8)获取时间秒数 接着读每一个视频的分片 所以对于视频而言读取逻辑不一样 当不带ts时 需要找到index.m3u8读取 当带ts时要读取各个分片 当读取的是图片或者ppt时候 直接读取对于的文件路径即可。文件预览主要两步 告诉浏览器这是图片故imageSuffix到response.setHeader为固定不变的 第二部就为读取文件即readFile。log.error("IO异常", e);log.error("读取文件异常", e);
2025-10-09 09:10:22
2010
原创 easypan项目复盘---文件列表,秒传,分片上传,文件合并
实现层:总体思路就是处理第一片分片(处理秒传) 处理中间分片(提示用户正在上传种) 然后处理最后一片分片(提示用户上传成功以及写入数据库) 再处理最后一片分片前 将所有的上传的分片放入临时的目录中。log.error("文件转码失败,文件id:{},userId:{}",fileId,webUserDto.getUserId(),e);log.error("合并分片失败", e);log.error("合并分片失败", e);log.error("文件上传失败",e);//更新用户使用空间。
2025-10-06 11:32:46
782
原创 easypan项目复盘----找回密码上传头像获取信息等
分析:头像文件为MultipartFile 其中逻辑为先创建文件夹 然后再创建头像的文件即targetFile 其中avatar.transferTo()是将文件保存到指定路径 将webUserInfo.setAvatar(null)是为了让网页强制重新获取头像。controller层: 一般找回密码需要账号 重设的密码 以及验证码 此处还加入了session是因为本项目用户信息存入了session中 checkcode为图形验证码 为了防止机器人恶意侵入 最后使用finally移除了邮箱验证码。
2025-10-03 15:47:01
988
原创 easypan项目复盘----参数校验&登录校验
此文章参数校验部分仅供学习 因为可以使用validated进行参数校验 对于具体项目没有非常具体的帮助 登录校验前面的文章有这里不做赘述。throw new BusinessException("系统运行异常");log.error("全局拦截器异常", e);log.error("全局拦截器异常", e);log.error("全局拦截器异常", e);log.error("校验参数失败", e);log.error("校验参数失败", e);// * 校验管理员。
2025-10-03 12:57:33
807
原创 easypan项目复盘---验证码+发送邮件
分析:发送邮件必备邮件以及验证码 因为此时验证码在session中 所以也需要传入session type为具体业务需要 比如区分是注册还是找回密码时候的应用 与设计表有关 可根据业务需要传入。分析:sendEmailCode方法 最值得学习的地方为取消之前发送验证码的方法 即disableEmailCode()方法 发送一个新的验证码将旧验证码置为无效。// a为要画出来的东西,x和y表示要画的东西最左侧字符的基线位于此图形上下文坐标系的(x,y)位置处。// 验证码图片Buffer。
2025-10-03 11:03:00
1001
原创 easylive项目学习---aop切面实现登录校验与发送信息
登录校验需要的是前置通知Before 使用了注解一般就使用@annotation 若是习惯使用pointcut也可以没有区别 在annotation后写入注解类的地址。重点解释saveMessage方法其中arguments是方法中实际的传参值即加入user(String userId,String nickName)我传入jf,shuaige argument中的数据就是jf,shuaige 而parameters是方法参数 里面就是userId 与 nickName 其他皆可自己理解含义并不复杂。
2025-09-16 10:41:58
1564
原创 easylive项目学习---个人中心视频列表
1.展示视频列表参数:此代码只有一行但是难度很大主要难度在于xml层中的表联查相关表结构:user_video_seriesmapper:xml:FROM (LIMIT 1) t</select>这里十分难以理解 作者本人目前来说也很难理解 有见解的高手可以评论一下。
2025-09-14 11:12:29
1807
原创 easylive项目学习---个人中心
有两种构建表的方法:第一种就是双表 一张表为关注表 一张为粉丝表 便于理解但是会降低数据库效率 因为双表就代表着要查询两次 修改两次表 第二种如图所示 单表 虽然还是需要查询两次 但修改只需要一次 提高了数据库效率。2.第二部缓存中用户信息 便于接下来的参数查询(否则你在此接口修改信息后 redis中的信息依旧是旧信息 再后面的接口访问时候调用redis就会发生参数不一致的现象)关注的实现类注意点:验证身份 不可以自己关注自己 关注的人是否存在(避免恶意传参数导致数据库崩溃)具体实现非常简单不再赘述。
2025-09-13 14:11:38
665
原创 easylive项目学习---评论
分析:需要知道哪个视频下的评论则需要videoId,因为是加载评论需要分页所以需要pageNo,因为有置顶功能所以需要orderType。以下是具体实现一二级评论的代码: 注意其中replycomment是被回复的评论。分页可以使用pageHelper实现也可以自己创建page类自己编写。获取每一页的评论列表再将置顶评论插入每一页的评论列表中。评论分为一级评论以及回复即二级评论。删除评论简单这里不在赘述。
2025-09-06 18:58:05
786
原创 easylive项目学习---弹幕数添加问题
弹幕数添加问题与抢购优惠卷类似,均需要注意并发导致的数量添加不正确,脏数据等问题。一下是几种解决方法:1.乐观锁乐观锁是一种并发控制机制,它假设多用户并发访问数据时不会产生冲突,因此不会立即加锁,而是在数据更新时检查是否被其他事务修改过。
2025-09-04 12:49:18
262
原创 Netty服务端学习
/netty中整合所有的组件为Bootstrap 类似与装满工具的工具包 所有的handler可以理解为工具 服务端则是ServerBootStrap。serverBootstrap.channel(NioServerSocketChannel.class).handler(new LoggingHandler(LogLevel.DEBUG)).//channel函数作用明确I/O模型。log.info("Netty服务启动成功,端口:{}",appConfig.getWsPort());
2025-09-01 20:00:03
542
原创 项目复盘 easymeeting
初次使用需要注意事项有 ArithmeticCaptcha返回的是图片但代码返回需要通过解析才能获取到验证码答案 即captcha.toBase64()后才为验证码答案 checkCodeKey是uuid 其作用用于redis保存 保证验证码对于当前用户唯一 引入的依赖也为下图。之前不是很理解向上抛出与trycatch解决异常,其实向上抛出仅仅是在上一层去解决异常 如impl类的异常向上抛出 就会在引用了相对应impl类中的controller中去trycatch去处理异常 仅此而已。
2025-08-12 10:37:26
1044
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅