编程导航直播总结话题讨论

直播总结

17 参与
分享

快来分享你的内容吧~

点击登录,快来和大家讨论吧~
表情
图片
话题
打卡
综合
交流
文章
问答

伙伴匹配项目 笔记

伙伴匹配系统总结 伙伴匹配系统应该算烂尾了,前面那些都还好了,问题出在优化的地方了。我想着实现好友以及聊天室等功能的,包括添加好友、同意好友、删除好友,私聊队伍聊大厅聊等等,这些是参考星球众多大佬的,包括但不限于 沙鱼、柒木 等大佬,这里就不一一列举了,总之非常感谢。 关于项目名,最开始我打算叫友缘的,但我看星球大佬们叫的聚友园,我就打算改成聚友缘了,这里也是借鉴各位大佬的了。 其实按照测试后端的接口来看,我应该也没什么大问题,应该算是优化成功了的。只是我尝试复用星球大佬的前端代码时,就出现各种问题了,而且因为有些字段名包括代码命名习惯上也各种不同,更主要的是我前端不会,导致我花了两天后除了把页面弄出来外,还有的就是大厅聊天了,别的啥也不是,因此我打算放弃这部分优化了,我觉得这不是我目前最具有性价比的事情。而且这次项目就不上线了,我觉得就这么个也没啥必要了,少点真实性就少点吧,我觉得完全吃透项目才是目前更具性价比的事情。 又因为仅仅优化后端接口,而且这部分实在太乱了,我也就没整理了,也就不发出来了,发出来的都是些自用的直播笔记,没什么价值,看星球其他大佬总结的也是一样的。 https://www.yuque.com/hsu4814/gg5tht?# 《https://wx.zsxq.com/mweb/views/weread/search.html?keyword=伙伴匹配系统》 下面的是一些这次的收获: 1. 前端的一些应用(仅存在于笔记中) 2. 数据库表的设计,扩展字段(用户表多加 tags 字段)、添加关联关系表(方便正查反查) 3. 搜索标签的方式:SQL查询、内存查询的优劣及其应用场景(后面几十万百万数据时,SQL查询速度秒杀内存查询) 4. JSON 序列化库 Gson 的使用 5. Stream API 的使用,集合通过stream()转为流对象,再通过 filter() 过滤数据,再通过 map() 转为对象,再通过 collect() 收集在集合中。留意 stream() 和 parallelStream() 的区别 6. 接口文档的作用,Swagger、Knife4j 的简单使用 7. 简单爬虫 8. EasyExcel,通过 Java 处理 Excel 9. 写业务代码校验逻辑时,把需要查数据库的校验写后面一点,这样在前面逻辑有不符的情况时就能少查点数据库 10. Session 共享后端分布式登录 11. QuickRedis 的使用 12. 这里可能不太算收获:将 User 的 id 从 Long 改为 long,可以避免频繁判空,但我感觉还好其实 13. 批量插入数据:普通批量插入(5000 条 13s)、并发批量插入(100000 条 关闭日志后 39s) 14. 分页查询,MyBatisPlus 配置 15. 分布式缓存 Redis,自己配置 Redis 序列化器,不配置是用Java原生的,不好用。查询缓存后,从 1.26s 变为 20ms左右(除了第一次要 500ms)(前后都用到了分页查询) 16. 缓存预热,定时任务,为了解决第一次加载要 500ms 的问题,现在第一次加载只需要 27ms 17. 接触到了 cron 表达式 18. 分布式锁。普通锁只能处理单个JVM进程内的锁,分布式系统的多个JVM就得分布式锁来解决线程安全问题 19. Redisson客户端配置,缓存预热实现推荐用户 20. dto,Data Transfer Object,不同层间传输数据。避免暴露敏感数据,也能简化接口。同理 request、vo(View Object)包装类也是同理,vo 是只传输只读数据,request 是封装请求参数。dto、vo 这部分其实我感觉区别不大,可能只是更好分类吧,网上文章也看不懂 21. 事务注解,方便回滚 22. 匹配算法,编辑距离算法,大数据推荐思想。取 TOP 数据,我这 30w 数据取10个,关闭日志耗时 2.7s 23. 分布式锁解决重复入队问题 说完收获就说点值得反思的事情。这次项目优化不同于上次用户中心的,这次设计到很多我想实现的功能,都需要涉及到数据库表设计什么的,还有一些代码的大改,我觉得这些我需要在最开始就有点大概的想法,就说聊天室这个功能,鱼皮哥直播不说我真没想到,后端部分优化都还好了,最难的是前端。下一个是 API 开放平台,我觉得我在开始前就得看看这个课程计划,看看大概有什么,包括项目名也开始自己就想好,然后下次后端部分功能优化完后,前端代码就不套用大佬的了,要么就自己从0实现,要么就彻底放弃。 只是近期估计先不做项目了,这两天把简历写好后开投,然后就边投边学习测试和设计模式了,设计模式学完才会抽时间开始 API 项目了。我也不知道能不能找到实习,也只能听天由命了,有就去,没有就学技术了,看开点,什么能力匹配什么待遇,挺现实的事情,普通人一个,平平淡淡才是真。后续就是设计模式 测试 八股 算法 期末,八股和算法针对性复习了。

手写 RPC 框架 笔记

大概花了十天左右,中间还过了两天清明节,总算是把RPC项目搞定 Github地址:https://github.com/JOHNCHEN27/RPC-Framework 作为24应届,可能是由于缺少好的、少见的项目经验(简历上只写了一个黑马的微服务项目)导致从春招到现在工作一直还没着落,期间投递了很多简历,只拿到一个上海Java实习生的线下面试机会,但是因为三月份在校暂时有点事就没去,此后一直投递简历无果,后来思考了下觉得还新增一个项目,再稍微修改一下简历可能会好很多,刚好看到鱼皮哥新完结的RPC项目,就决定上手写到简历中。 此前学习Java中没有接触过框架项目,甚至RPC是我第一次了解到,一开始可能觉得有点胆怯,毕竟没接触过,但看了一章项目后感觉还好,从这个示例中我也了解到了RPC框架,由于之前学过微服务的一些组件,如Nacos、消息队列,所以对这个RPC框架理解起来也快,大概写一下项目的收获吧 全局配置加载:学习到了自定义配置设计思路,第一次使用到了Hutool工具类中的Props,通过编写工具类来读取配置并返回配置对象,对于框架初始化用到了设计模式中的单例模式,也是第一次单例模式的应用,之前只学过理论,对于实现有着模糊的概念,这次更加清晰。 认识Mock:Mock也是第一次接触,代指模拟对象,用来测试代码,Mock服务代理也是通过代理工厂的形式来获取Mock代理对象,工厂模式的设计让创建对象更简易。 序列化器和SPI机制: 重新认识了一下序列化器的种类,之前写项目只用过JSON,Hessian、Kryo也只是听说,这一章实现了这三种序列化器,SPI机制也是第一次认识,SPI机制给我的感觉就是太秒了,支持用户扩展,自定义自己想要的配置,对反射也有了一个全新的认识。 注册中心:使用的是Etcd,这个也是第一次接触,不过很好理解,学过redis更容易上手这个,小白也能上手,简单易用,注册中心的思想跟nacos这种类似,基于键过期机制和定时任务来实现心跳机制和续期,用到了JVM的ShutdownHook来让服务节点正常下线,还添加了一个本地缓存来存储节点信息列表,提高性能 自定义协议:Vert.x的TCP服务器的使用TCP进行网络传输,科班学过计网,对TCP协议的结构了解,自定义消息栈这块也比较理解,接触到真正设计协议内容,有了一个更好的理解,设计非常巧妙。 负载均衡、重试、容错机制:这三张章的内容在之前学过的消息队列中见到了其影子,还是比较容易理解上手,针对系统出错或异常的几个机制,提高框架的可靠性。 启动机制和注解驱动:第一次写自定义的注解,写到后面对项目的执行流程更加畅通的理解,反射这块很久没用都有点忘了,这个项目直接拉回我的记忆。 学习到了Vert.x、全局配置加载、SPI机制、动态代理、注册中心Etcd实现、工厂模式和单例模式的实践、自定义协议实践、负载均衡、重试、容错机制,启动机制和注解驱动等。 Github中项目的REAMD.md中记录了实现项目的思路,以及大致的学习笔记,接下来继续巩固一下项目,回顾一下涉及到的知识点加深影响 今天重新调整了一下简历内容,把这个项目写上去了,之后就是继续投递简历,争取拿到一个相对不错的工作,一边看八股投简历一边再尝试着完成一个项目加强自己对开发的熟悉,希望收到一个好的结果。

API 开放平台 笔记

这还是我第一次交作业[敲打] 项目后端的完成度距离我预想的还差点儿,不过后面再慢慢优化, 项目完成的功能如下: 1.使用Gateway Openfeign 实现系统结构,远程调用子系统的接口 2.用Gateway做API网关,实现路由转发。访问控制,请求参数校验等业务,并且集成Swagger,实现统一管理项目开发文档 3.使用Nacos作为注册中心和配置中心,实现访问控制(白名单)和Sentinel 限流规则的动态配置 4.设计API签名认证算法,为用户分配唯一的ak/sk以鉴权,保障接口的安全性,防止接口被恶意调用 5.基于Spring Boot Starter 开发了客户端SDK,基于配置简化接口调用,实现一行代码即可调用接口,提高接口调用体验 比较有亮点的功能就是这些了。。感觉做的不是很好 我预想的功能但没实现的有: 1.Nacos配置动态推送,没找到相关的文章,后面慢慢摸索 2.流量报警:在接口调用出现大量异常或者访问过多导致接口无法正常访问,利用Sentinel的熔断机制,自动下线接口,并给管理员发邮箱(实践起来发现太复杂了,没做成,自己的Sentinel也是用的不熟练) 3.redis 缓存请求结果,在短时间内的请求可以直接从redis取出请求结果,减缓接口的压力 项目经验不丰富,只想到了这些功能,后面在慢慢添加吧,哈哈哈,, 在这次做项目的过程中我的收获 在整个开发过程中,刚开始我是看鱼总的视频,后面就突发奇想,想着将这个项目改造一下,换成自己熟悉技术栈,从设计开始,一步一步完成,当然数据库的设计就是完完全全参照鱼总的,在设计到开发的过程中,刚开始的设计真的很重要,项目开发计划的制定也很重要,这两步就大概率决定了这个项目的开发效率,但是我的项目计划做的不太好,经常打乱仗,不知道下一步该做什么,所以在Gitee上面的提交也乱糟糟的 做项目也是一次很好的复习机会,在做项目的过程中,经常会碰见一些奇奇怪怪的问题,这些问题大概率都会帮助我复习一下框架的知识,但是有些bug就让人头疼。例如环境问题[撇嘴] 下面是项目地址,由于前端我不太会,所以项目也不准备上线了 https://gitee.com/liujunjie12330/api-open-platform 下面是开发这个项目时的随手笔记,里面有我遇见的一些bug,有时候也忘记写了,笔记也不算完整,后面整理了再发一次

用户中心项目总结(不完全踩坑记录)

<html> <head></head> <body> <div class="content ql-editor"> <p>#用户中心项目总结</p> <p><br></p> <p>花了两个星期大致完成了在星球的第一个项目,中间过了个年,鸽了好几天😢,下面分享一下个人的踩坑记录和一些心得。</p> <p><br></p> <p>因为之前没有用过类似的框架,这个项目的ant design pro前端属实让我琢磨了好一阵。</p> <p><br></p> <p>首先是跟着鱼皮大大安装初始化脚手架,创建前端项目。</p> <p><br></p> <p>Mybatis 新增用户时出现</p> <p><br></p> <p><a href="http://about:blank" target="_blank">java.sql.SQLSyntaxErrorException:</a> Unknown column 'user_account' in</p> <p>'field list'的bug,这是因为数据库字段没有下划线,mybatis默认会采用驼峰命名法,在配置关掉即可</p> <p><br></p> <p><img src="https://pic.code-nav.cn/planet_post_image/1750768007606444034/alhuzp56.jpeg"></p> <p><br></p> <p><img src="https://pic.code-nav.cn/planet_post_image/1750768007606444034/778rpudd.jpeg"></p> <p>然后还学会了通过idea自带的测试工具发送请求。</p> <p><br></p> <p>还有一个新的知识点(对我来说),</p> <p><span style="background-color: white; color: rgb(79, 79, 79);">session的校验机制--</span>HttpServletRequest request,详细可以看鱼总的视频。</p> <p><br></p> <p>之前数据库操作都是mybatis,这次运用了一些mybatis-plus的操作。如selectOne、removeByid等。</p> <p><br></p> <p>#bug</p> <p><br></p> <p>前端页面出现umibundling50%</p> <p>error -</p> <p>./src/.umi/core/<a href="http://about:blank" target="_blank">route.tsx:109:23-115</a></p> <p><br></p> <p>Module</p> <p>not found: Error: [CaseSensitivePathsPlugin] `D:\java\YUPI\用户中心\myapp\src\pages\User\register\<a href="http://index.tsx" target="_blank">index.tsx</a>`</p> <p>does not match the corresponding path on disk `Register`</p> <p><br></p> <p>错误信息中提到的路径是<span style="color: rgb(36, 41, 47);">D:\java\YUPI\用户中心\myapp\src\pages\User\register\</span><a href="http://index.tsx" target="_blank" style="color: rgb(36, 41, 47);">index.tsx</a>,而对应的路径名应该是<span style="color: rgb(36, 41, 47);">Register</span>。根据错误信息,可以猜测是因为路径大小写不匹配导致了这个错误。</p> <p><br></p> <p><br></p> <p>后端</p> <p>控制台输出报错:Note: further occurrences of</p> <p>HTTP request parsing errors will be logged at DEBUG level.</p> <p><br></p> <p>看来是在解析HTTP请求行时出现了问题。具体地,错误消息指出在方法名中发现了无效字符,导致无法正确解析HTTP请求。</p> <p><br></p> <p><span style="background-color: rgb(244, 246, 248);">根据HTTP协议规范,HTTP方法名必须是令牌(token),也就是说,它们必须由ASCII可打印字符组成,且不能包含空格或特殊字符。</span></p> <p><br></p> <p>所以在vscode全局搜索token,找到应该是requestErrorConfig这里,注释掉</p> <p><br></p> <p><img src="https://pic.code-nav.cn/planet_post_image/1750768007606444034/6nx2ub6q.jpeg"></p> <p><br></p> <p></p> <p><br></p> <p>然后还是报一样的错:</p> <p><br></p> <p>Note: further</p> <p>occurrences of HTTP request parsing errors will be logged at DEBUG level.</p> <p><br></p> <p>发现原来是在<a href="http://proxy.ts" target="_blank">proxy.ts</a>这里http后多加了“s”,删掉后问题解决</p> <p><br></p> <p><img src="https://pic.code-nav.cn/planet_post_image/1750768007606444034/1hlcaobt.jpeg"></p> <p><br></p> <p>复现3.25笔记时出现了bug:子路由无法渲染出来。</p> <p><br></p> <p>找了很久,折腾了好久呜呜呜,在github的issue区<a href="https://github.com/ant-design/ant-design-pro/issues/11142" target="_blank">🧐[问题 | question] 子路由渲染问题 · Issue #11142 ·</a></p> <p><a href="https://github.com/ant-design/ant-design-pro/issues/11142" target="_blank">ant-design/ant-design-pro · GitHub</a>找到答案,</p> <p><br></p> <p>只需要在父级路由使用&lt;Outlet/&gt;渲染子路由,手动导入'umi',即可成功渲染出右侧./Admin/UserManage</p> <p><br></p> <p><img src="https://pic.code-nav.cn/planet_post_image/1750768007606444034/owuei7e6.jpeg"></p> <p><br></p> <p>部署时,我尝试了从0到1和宝塔两种方式,特别是第一种,中间遇到了很多问题,比如</p> <p><img src="https://pic.code-nav.cn/planet_post_image/1750768007606444034/gvx2m7m1.jpeg"></p> <p><span style="color: rgb(250, 0, 0);">修改url为url: jdbc:mysql://120.26.218.238:3306/user_center</span>,然后重新package打成jar包即可。</p> <p><br></p> <p>部署前端时遇到一些端口问题,知道网站默认端口号是80,要改成自己在nginx.conf设置的端口号,才可以正确渲染。可以参考这篇文章:</p> <p><a href="https://ww.dandelioncloud.cn/article/details/1510953291075932161" target="_blank">https://ww.dandelioncloud.cn/article/details/1510953291075932161</a></p> <p><br></p> <p>后端部署安装java,参考</p> <p><a href="https://blog.csdn.net/LiuLiYanSha/article/details/132494473?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170791190616800197057740%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&amp;request_id=170791190616800197057740&amp;biz_id=0&amp;utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-132494473-null-null.142%5ev99%5epc_search_result_base9&amp;utm_term=%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%AE%89%E8%A3%85java17&amp;spm=1018.2226.3001.4187" target="_blank">https://blog.csdn.net/LiuLiYanSha/article/details/132494473?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170791190616800197057740%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&amp;request_id=170791190616800197057740&amp;biz_id=0&amp;utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-132494473-null-null.142^v99^pc_search_result_base9&amp;utm_term=%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%AE%89%E8%A3%85java17&amp;spm=1018.2226.3001.4187</a></p> <p>然后就是结合大大们的笔记和视频</p> <p><br></p> <p>不过有个疑问:进程进行中,当然可以连接到后端,如果服务器开着,但是没有人为执行进程,也可以正常连接到后端吗?</p> <p><br></p> <p>##宝塔部署</p> <p><br></p> <p>在添加站点,输入网址出现bug</p> <p><br></p> <p><img src="https://pic.code-nav.cn/planet_post_image/1750768007606444034/g7hgpi2b.jpeg"></p> <p><br></p> <p>Npm run build 构建前端项目</p> <p>找了一通发现原来是上传dist文件时出错,应该上传dist文件夹内的所有文件,不用把dist这个文件夹也上传。</p> <p><br></p> <p><span style="color: rgb(204, 0, 0);">部署后端时,有个现象让我百思不得其解,有懂的小伙伴麻烦告诉我!!!感谢!</span></p> <p><span style="color: rgb(204, 0, 0);">这个是在本地vscode运行的,直接发送请求给后端了,相当于postman,但是端口号理论上应该是8989(我后端端口号是8989),而不是8000(居然也能成功获得返回结果)!?</span></p> <p><br></p> <p><img src="https://pic.code-nav.cn/planet_post_image/1750768007606444034/q7uchgho.jpeg"></p> <p>部署前端时,直接输入公网ip可以渲染出界面,但是刷新一下或者手动输入/user/login,则会报错404 Not found</p> <p>在配置文件加入以下代码</p> <p><br></p> <ol> <li data-list="ordered"><span class="ql-ui"></span><span style="color: rgb(51, 51, 51); background-color: white;">location / {</span></li> <li data-list="ordered"><span class="ql-ui"></span><span style="color: rgb(51, 51, 51); background-color: white;">try_files $uri $uri/ @router;</span></li> <li data-list="ordered"><span class="ql-ui"></span><span style="color: rgb(51, 51, 51); background-color: white;">index </span><a href="http://index.html" target="_blank" style="color: rgb(51, 51, 51); background-color: white;">index.html</a><span style="color: rgb(51, 51, 51); background-color: white;">;</span></li> <li data-list="ordered"><span class="ql-ui"></span><span style="color: rgb(51, 51, 51); background-color: white;">}</span></li> <li data-list="ordered"><span class="ql-ui"></span><span style="color: rgb(51, 51, 51); background-color: white;">location @router {</span></li> <li data-list="ordered"><span class="ql-ui"></span><span style="color: rgb(51, 51, 51); background-color: white;">rewrite ^.*$ /</span><a href="http://index.html" target="_blank" style="color: rgb(51, 51, 51); background-color: white;">index.html</a><span style="color: rgb(51, 51, 51); background-color: white;"> last;</span></li> <li data-list="ordered"><span class="ql-ui"></span><span style="color: rgb(51, 51, 51); background-color: white;">}</span></li> </ol> <p>则不会出现以上问题辣。</p> <p><br></p> <p>##docker安装镜像</p> <p><br></p> <p>Docker部署</p> <p><br></p> <p>在宝塔安装docker后,</p> <p><br></p> <p>在后端新建Dockerfile文件(鱼皮大大版本)</p> <p><br></p> <p>FROM</p> <p>maven:3.5-jdk-8-alpine as builder</p> <p><br></p> <p># Copy local code to</p> <p>the container image.</p> <p><br></p> <p>WORKDIR /app</p> <p><br></p> <p>COPY <a href="http://pom.xml" target="_blank">pom.xml</a> .</p> <p><br></p> <p>COPY src ./src</p> <p><br></p> <p># Build a release</p> <p>artifact.</p> <p><br></p> <p>RUN mvn package</p> <p>-DskipTests</p> <p><br></p> <p># Run the web</p> <p>service on container startup.</p> <p><br></p> <p>CMD</p> <p>["java","-jar","/app/target/<a href="http://user-center-backend-0.0.1-SNAPSHOT.jar" target="_blank">user-center-backend-0.0.1-SNAPSHOT.jar</a>","<a href="http://--spring.profiles.active=prod" target="_blank">--spring.profiles.active=prod</a>"]</p> <p><br></p> <p>然后重新git上传后,宝塔终端拉下来</p> <p><br></p> <p><img src="https://pic.code-nav.cn/planet_post_image/1750768007606444034/wpd5jo3c.jpeg"></p> <p><br></p> <p><span style="color: rgb(204, 0, 0);">但是部署后查不到对应的docker,或者说报错了应该是maven的问题</span></p> <p><br></p> <p>找不到解决方案后我重新找了一份dockerfile文件</p> <p><br></p> <p>FROM</p> <p>openjdk:8-jdk-alpine</p> <p><br></p> <p># Copy local code to</p> <p>the container image.</p> <p><br></p> <p>WORKDIR /app</p> <p><br></p> <p>COPY</p> <p>./target/<a href="http://user-center-0.0.1-SNAPSHOT.jar" target="_blank">user-center-0.0.1-SNAPSHOT.jar</a> /app/<a href="http://user-center.jar" target="_blank">user-center.jar</a></p> <p><br></p> <p># Build a release</p> <p>artifact.</p> <p><br></p> <p>EXPOSE 8989</p> <p><br></p> <p># Run the web</p> <p>service on container startup.</p> <p><br></p> <p>CMD</p> <p>["java","-jar","<a href="http://user-center.jar" target="_blank">user-center.jar</a>","<a href="http://--spring.profiles.active=prod" target="_blank">--spring.profiles.active=prod</a>"]</p> <p><br></p> <p></p> <p><br></p> <p><img src="https://pic.code-nav.cn/planet_post_image/1750768007606444034/u9hgchgm.jpeg"></p> <p>构建成功!</p> <p><br></p> <p><br></p> <p>这里我又遇到个bug</p> <p><br></p> <p><img src="https://pic.code-nav.cn/planet_post_image/1750768007606444034/nr5fo2ac.jpeg"></p> <p><br></p> <p>这应该是jdk版本问题 服务器java版本是jdk17</p> <p><br></p> <p><img src="https://pic.code-nav.cn/planet_post_image/1750768007606444034/qtilkn61.jpeg"></p> <p><br></p> <p>而我刚开始dockerfile中版本是jdk8,所以docker拉取不到java运行版本的镜像,所以更新dockerfile即可。</p> <p><br></p> <p>FROM openjdk:<span style="color: rgb(250, 0, 0);">17</span>-jdk-alpine</p> <p><br></p> <p># Copy local code to</p> <p>the container image.</p> <p><br></p> <p>WORKDIR /app</p> <p><br></p> <p>COPY</p> <p>./target/<a href="http://user-center-0.0.1-SNAPSHOT.jar" target="_blank">user-center-0.0.1-SNAPSHOT.jar</a> /app/<a href="http://user-center.jar" target="_blank">user-center.jar</a></p> <p><br></p> <p># Build a release</p> <p>artifact.</p> <p><br></p> <p>EXPOSE 8989</p> <p><br></p> <p># Run the web</p> <p>service on container startup.</p> <p><br></p> <p>CMD</p> <p>["java","-jar","<a href="http://user-center.jar" target="_blank">user-center.jar</a>","<a href="http://--spring.profiles.active=prod" target="_blank">--spring.profiles.active=prod</a>"]</p> <p><br></p> <p>测试一下,访问后端,成功</p> <p><br></p> <p><img src="https://pic.code-nav.cn/planet_post_image/1750768007606444034/nuqruivg.jpeg"></p> <p><br></p> <p><span style="color: rgb(204, 0, 0);">这里我又想向大佬们提问:</span></p> <p><span style="color: rgb(204, 0, 0);">①宝塔面板需要在纯净环境下安装软件,那如果在服务器终端安装某些软件,那在宝塔软件商店也可以重复安装吗,会不会有冲突呢?</span></p> <p><span style="color: rgb(204, 0, 0);">②还有宝塔面板的“安全“一栏,有显示开放的端口号,这和云服务器的安全组一致吗,服务器的防火墙所罗列的端口号又有什么关系呢</span></p> <p><img src="https://pic.code-nav.cn/planet_post_image/1750768007606444034/tfm7uwvm.jpeg"></p> <p><img src="https://pic.code-nav.cn/planet_post_image/1750768007606444034/rmj4bxc6.jpeg"></p> <p><img src="https://pic.code-nav.cn/planet_post_image/1750768007606444034/w8gs9q2e.jpeg"></p> <p><span style="color: rgb(204, 0, 0);">③部署前端时,我发现在前端的proxy,ts有对‘api’代理,但是宝塔的站点也有专门的反向代理,甚至可以在“配置文件”和“反向代理”一栏更改,那会不会冲突呢?</span><img src="https://pic.code-nav.cn/planet_post_image/1750768007606444034/xd1qgr61.jpeg"></p> <p>以上不完全记录,感谢大家浏览,大家晚安!</p> <p><br></p> <p>#用户中心项目 #项目总结</p> </div> </body> </html>

2024.1.30&&BI项目总结:

<html> <head></head> <body> <div class="content ql-editor"> <p>2024.1.30&amp;&amp;BI项目总结:</p> <p><br></p> <p>至此,BI项目终于结束了。这个项目我只做了后端(暂时没做扩展点),前端直接拉了源码,就不贴源码了,嫌丢人哈哈哈。</p> <p>总的来说,这个项目是非常不错的,含金量很高。我听完后受益颇多,尤其是对于线程池和RabbitMQ的讲解非常细致,即使你没学过MQ也可以做。整体来说这个项目的编码并不算多,多数是讲思维和引用某技术时需要注意的事项和使用场景,这也是鱼皮哥直播的讲解特色了。我依次说一下,我在此项目中,学到的东西吧!</p> <ol> <li data-list="ordered"><span class="ql-ui"></span>了解AI的使用、如何调教和优化AI和AI提问技巧。鱼皮哥在项目中,从0到1给我们以鱼聪明AI为例向我们演示如何通过高效的提问和系统预设获得目标内容,以及3种调用AI的方式。真正得做到让AI为我们服务,编码。</li> <li data-list="ordered"><span class="ql-ui"></span>分库分表的思想。本项目将用户上传的excel原始数据、生成代码、生成结果等多种信息存放在chart表这一个表中,如果用户想修改原始数据就会非常麻烦。因为原始数据是以字段的形式存在chart表中,难以对原始数据进行精细化修改和操作,因此引入了分库分表的思想,以原始数据每一列作为表的字段,原chart表的id作为表名,配合MyBatis自定义创建表的DDL语句。</li> <li data-list="ordered"><span class="ql-ui"></span>对接口进行限流。由于生成图表的接口依赖AI,其成本巨大,为了被用户刷流量。鱼皮哥讲了4种限流算法,最后基于Redisson限流器实现限流并且支持分布式。又偷学一招了,开心。</li> <li data-list="ordered"><span class="ql-ui"></span>了解线程池的基本概念、参数和执行流程。基于线程池异步调用AI生成图表。线程池这里我听得迷迷瞪瞪的,只了解基本概念,实际编码我去额不会。看鱼皮哥用它生成AI的流程我也是一知半解,所以说菜还得多练。</li> <li data-list="ordered"><span class="ql-ui"></span>最后一个就是RabbitMQ了。鱼皮哥讲得巨细,比针还细,加上之前学过所以这部分也能听得明白,建议大家都学学,童叟无欺。最后基于MQ实现图表生成异步化,让我基本了解MQ在项目中的使用吧,以前只知道它能发消息,哪知道怎么异步执行代码啊,我以为是把执行的代码塞到队列里呢,哈哈哈。这次学完后,是真正知道它在项目里的运用了,又偷学到了,哈哈哈哈。</li> </ol> <p>总结和点评(bushi):主要是这五个部分吧,每个部分都值得学习并且讲得都很好,面面俱到。同时AI是目前最火的话题了,通过调用SDK/API生成图表或者其他东西是本项目的亮点,跟上时代的同时还提高的自己思维、编码能力,我10星推荐好吧。好了本项目暂时告段落,晚安,各位。</p> <p><br></p> </div> </body> </html>

第一个项目,用户中心系统!完结! 初来星球,用户中心是我的第一个项目,做的真的还是很有感受。不得不说,整个项目从0到1做下来还是很累的,我之前有学SSM SpringBoot单独学习(后面我会自我介绍的,只不过我现在还没想好哈哈,主要是希望自我介绍的时候顺便问一些问题哈哈)单独听每个技术的课程和做整个项目真的还是有点差距,跟着🐟总做再次熟悉了整个后端的流程。 不得不说部署真的菜了好多坑,项目坐下来做的很快,但是被部署拖了好久,最后自己的免费领的az教育服务器太小了,不够用。不过我在本地运行, 并截图展示(我录视频了,但是这个交作业的地方好像不能放视频,只能放图片,星球写文章的地方可以放视频,呜呜呜下次一定部署上线!)乘着自己还没有遗忘来说说自己的收获。 1.明确了做一个项目的应该有的技术选型,和项目的计划。做项目应该先完成,后完美。 2.后端用户的数据库表的设计(又熟悉了mysql语句),梳理了后端整个项目文件夹,还有MyBatisX逆向工程的使用,还有一些插件,比如检查语法规范的、快速生成set方法的... 3.开发完成基本的功能实现。先想好接口逻辑,再写代码实现。登录的时候,service层查询需要和数据库进行交互,应该放到检查之后(校验之间需要梳理先后关系)。应该返回给前端脱敏后的用户数据,并且记录用户的登录态到session中。controller层形参中我们需要接收前端传递过来的json对象,单独封装一个对象UserRegisterRequest。添加注解@RequestBody(复习了一遍常用的注解什么@RequestMapping()...) 4.跟着🐟总完成了前端的设计,包括前后端的交互,修改全局前缀路径。在写前端的时候,还知道遇到跨域问题解决办法。知道了正向代理和反向代理的区别..。 5.后面进一步完善后端,抽取鉴权的常量到接口中,快速处理返回 使用stream流处理用户脱敏,编写全局异常处理器,以及前端全局响应处理器(作用,优势,和实现。 🐟这里说过度封装了有点,但是我觉得也没什么,毕竟练习,即便这里封装有点多余,起码将来用得上,也算是学习了) 6.遇到问题之后的解决办法,参考官方文档,通过debug调试,f12查看网络中发送到的请求的信息... 7.原生部署和docker我踩了不少坑,目前真的不太会用docker部署,应该抽点时间学习一下,不过我感觉前端用宝塔部署是真的快,后端可以用原生部署(我后面会去学docker部署的呜呜呜,之前我会把linux的命令也系统的学一下,这两天天天踩坑,linux都熟悉了很多) 实际上还有很多很多收获,一时半会想不起来。我都积累到我的笔记中了。我的笔记中有不少的解决问题的方案,在笔记中如果图片没有处理好,暴露了自己的服务器ip地址,还希望大家不要打[流泪]放过小白。 #用户中心项目# 打卡 项目 Java 学习总结 ![4p7mt025](https://pic.code-nav.cn/planet_post_image/1743849100182298626/h4c5t0mt.jpeg) ![sfjkpe5l](https://pic.code-nav.cn/planet_post_image/1743849100182298626/zbmtwysx.jpeg) ![b8d6l3v6](https://pic.code-nav.cn/planet_post_image/1743849100182298626/ouyezmto.jpeg)

伙伴匹配项目 笔记

第二个星球项目(伙伴匹配系统)完结撒花!昨天刚结束趁着热乎劲来写下项目总结!感谢鱼皮哥和星球,又学到了好多新知识!从这个项目开始写博客,到项目结束居然已经写了 32 篇,有 400 粉丝了嘿~~ 后端技术收获 1、数据库表设计:新增模块时在原有表的基础上新增字段还是新增一张表?设计好之后考虑现有的字段能否满足系统要求,应用到使用场景中进行考虑,进行补充 2、整合 Swagger 接口文档和 Kife4j 接口文档:引入依赖,添加配置类,浏览器查看接口文档,还可以使用 @ApiOperation 等注解个性化定制接口文档 3、跨域问题:前端网关支持(用户中心用的是 Nginx 添加跨域配置) / 后端支持(添加注解或编写跨域配置✔) 4、爬虫的基本思路:网络请求中查看请求地址、查看接口信息、查看网络请求复制 curl 5、使用 EasyExcel 导入 Excel 表格数据:引入依赖、创建读对象、将表格表头与 Java 对象属性关联起来、创建监听器读取数据、清洗数据后导入数据库 6、SQL 查询与内存查询(查询用户标签):前者使用 Mybatis-plus 提供的 like 模糊查询,使用简单;后者先查询出所有用户,然后再内存中计算过滤用户,两者各有优缺点,视情况单独使用或结合使用 7、IDEA 在本地启动多个 SpringBoot 后端服务模拟集群 8、单机登录升级为分布式 Session 登录:登录流程(Session)、单机登录的局限性(登录态只保存在一台服务器上,服务器之间不共享数据)和用 Redis 实现分布式 Session 的实现方式(共享登录态)。重点是理解为什么要使用分布式 Session,理解思路和原理 9、导入数据的几种方式:用可视化界面、执行 SQL 语句(数据量小的情况)、编写程序控制导入(for循环 / 一次性任务) 10、在 Java 中通过 SpringDataRedis 操作 Redis:引入依赖、编写 Redis 配置、注入 RedisTemplate 调用方法来操作 Redis 11、使用 Redis 要注意的问题:缓存穿透、缓存雪崩、误删锁、锁的续期(Redisson 的看门狗机制)问题、锁的主从一致性(在每台 Redis 都要获取锁,所有都获取成功才算获取锁成功) 12、查询性能优化的方向:开启分页查询、使用缓存提前保存需要的数据、只查询需要的字段、取消数据库查询的日志输出、维护固定长度的集合减少占用内存空间 13、使用定时任务进行缓存预热:缓存预热的原因:防止首个进入系统的用户加载缓慢,影响用户体验;定时任务:使用 @EnableScheduling 开启框架对定时任务的支持,在执行的定时任务方法上使用 @Scheduled 注解,通过 cron 表达式指定定时任务执行时机 14、使用 Redisson 提供的分布式锁控制定时任务的执行:普通锁的缺点(锁只对单个服务器有效) 15、请求和响应参数包装类:请求封装 DTO、响应封装 VO, 16、用户匹配思路:使用编辑距离算法根据用户标签匹配用户 Junit 单元测试:写好一个接口 / 工具类 / 算法后先写一个测试类看看有没有 bug 17、Java 8 的 lambda 表达式:简化集合的操作(现在还比较生疏,平时要多用) 18、工具类:Gson 序列化和反序列化、BeanUtils 两个对象的属性快速复制、StringUtils 判断空串、CollectionUtils 判断空集合 19、插件使用:使用 MybatisX 插件简化开发、使用 GenerateAllSetter 快速为对象赋值、浏览器插件 FeHelper 美化接口响应数据查看 JSON 前端技术收获 1、使用 Vue Cli 快速初始化前端项目 2、快速上手 Vant 组件库:查看官方文档,复制示例代码,按需修改 3、vue-router 的使用:查看官方文档,引入路由组件 / 初始化时直接引入,在配置文件中配置路由路径和对应的视图组件;跨页面传参:使用 vue-router 提供的钩子函数 useRoute() 在跨页面时携带参数,通过 query 取出参数(useRouter() 是用来进行页面跳转 / 返回等) 4、使用 Axios 发送请求:安装 Axios 库后按照官方文档示例,封装自己的请求实例 myAxios,添加全局请求拦截器和响应拦截器(统一添加请求地址的前缀、打印日志、登录拦截等) 5、前后端联调数据格式不匹配的问题:安装 qs 库,将 Axios 的请求传参序列化、前端使用 JSON.parse() 解析后端响应的 JSON 格式的字符串 6、组件复用思想:用户信息 / 队伍卡片在多个视图组件中都会用到,将卡片抽取出来,在需要展示的地方引用,减少重复代码,方便后续统一修改样式等操作 编程能力提升 1、遇到报错或与预期不符的异常能通过查看网络请求、前端请求负载、后端响应值和 Debug 来解决 2、测试:后端写完一个接口后通过接口文档发送请求并查看响应数据以及 MySQL / Redis 数据库的变化来判断代码是否有 Bug,响应数据与预期不符再 Debug 寻找问题、解决问题 3、需求分析和接口设计:组队功能分析各个接口的需求、设计接口(请求路径、封装请求参数、封装响应参数)等 后端源码(直接接着用户中心写的):https://github.com/lvxinxinL/user-center 前端源码:https://github.com/lvxinxinL/langhua-frontend 博客:https://blog.csdn.net/m0_74059961?spm=1000.2115.3001.5343 #项目# ![ol1k2u73](https://pic.code-nav.cn/planet_post_image/1676441078540013570/yyzwfrce.jpeg) ![p84k6r48](https://pic.code-nav.cn/planet_post_image/1676441078540013570/ocrlq4tk.jpeg) ![xvuixqwk](https://pic.code-nav.cn/planet_post_image/1676441078540013570/i302at53.jpeg) ![eleg2a21](https://pic.code-nav.cn/planet_post_image/1676441078540013570/te9dcppv.jpeg) ![z1bj2gk3](https://pic.code-nav.cn/planet_post_image/1676441078540013570/7ubw9ykq.jpeg) ![uw8t1i2e](https://pic.code-nav.cn/planet_post_image/1676441078540013570/us1jyja2.jpeg) ![efq2k4dl](https://pic.code-nav.cn/planet_post_image/1676441078540013570/lg4y1no6.jpeg) ![aknsebl5](https://pic.code-nav.cn/planet_post_image/1676441078540013570/8t3cb597.jpeg) ![xey66r8u](https://pic.code-nav.cn/planet_post_image/1676441078540013570/rcvukh1s.jpeg)

用户中心项目 笔记

智能-BI项目分享

<html> <head></head> <body> <div class="content ql-editor"> <p><strong>加入星球快三个月了</strong>,确实学到了挺多新东西,做完了<strong>智能-BI项目和oj-在线判题系统项目</strong>,都做了一些扩展和自己的实现,今天先跟大家分享一下智能-BI项目。</p> <p>在学习之前,就觉得这个项目很有趣,结合了当下热门的AI智能问答;我学习这个项目的时候,鱼聪明已经没有免费的会员赠送了,所以当时每天的额度不够用,我就想着另辟蹊径,调研了一下国内的AI大模型,最后选择了科大讯飞的星火大模型,不但免费赠送一年的使用额度还有很多的扩展。</p> <p>但是当我使用星火大模型的api时又遇到一个<strong>问题</strong>,因为它是继承<strong>WebSocketListener</strong>来实现的,没有封装好能够直接调用的api,获取信息都是在重写<strong>onMessage()</strong>方法中拿到的,当时我就想到了在之前项目使用过的<strong>Redis分布式锁;</strong>我在调用类中创建一个阻塞获取最终结果的方法,当ai将所有结果都返回后,就向Redis中写入一条信息,获取结果的方法就不断轮询查Redis,拿到信息就返回。</p> <div class="ql-code-block-container"> <div class="ql-code-block"> // 等待服务端返回完毕后关闭 </div> <div class="ql-code-block"> <span class="ql-token hljs-keyword">while</span> (<span class="ql-token hljs-literal">true</span>) { </div> <div class="ql-code-block"> Thread.sleep(<span class="ql-token hljs-number">200</span>); </div> <div class="ql-code-block"> <span class="ql-token hljs-keyword">if</span> (wsCloseFlag) { </div> <div class="ql-code-block"> <span class="ql-token hljs-keyword">break</span>; </div> <div class="ql-code-block"> } </div> <div class="ql-code-block"> } </div> <div class="ql-code-block"> <span class="ql-token hljs-comment">//ai数据生成完毕哦,向redis写入键</span> </div> <div class="ql-code-block"> RBucket&lt;String&gt; bucket = redissonClient.getBucket(<span class="ql-token hljs-string">"complete"</span> + questionId); </div> <div class="ql-code-block"> bucket.set(<span class="ql-token hljs-string">"true"</span>); </div> </div> <p><strong>轮询等待</strong></p> <div class="ql-code-block-container"> <div class="ql-code-block"><span class="ql-token hljs-keyword">public</span> String <span class="ql-token hljs-title">getReturn()</span> { </div> <div class="ql-code-block"> <span class="ql-token hljs-comment">// 创建一个新的线程</span> </div> <div class="ql-code-block"> sleepThread = <span class="ql-token hljs-keyword">new</span> <span class="ql-token hljs-title">Thread</span>(() -&gt; { </div> <div class="ql-code-block"> <span class="ql-token hljs-keyword">try</span> { </div> <div class="ql-code-block"> <span class="ql-token hljs-comment">//循环等待ai生成完毕</span> </div> <div class="ql-code-block"> <span class="ql-token hljs-type">int</span> <span class="ql-token hljs-variable">times</span> <span class="ql-token hljs-operator">=</span> <span class="ql-token hljs-number">0</span>;<span class="ql-token hljs-comment">//现在循环次数</span> </div> <div class="ql-code-block"> <span class="ql-token hljs-keyword">while</span> (<span class="ql-token hljs-literal">true</span>) { </div> <div class="ql-code-block"> <span class="ql-token hljs-keyword">if</span> (times &gt; <span class="ql-token hljs-number">90</span>) </div> <div class="ql-code-block"> <span class="ql-token hljs-keyword">break</span>; </div> <div class="ql-code-block"> Thread.sleep(<span class="ql-token hljs-number">2000</span>); </div> <div class="ql-code-block"> RBucket&lt;String&gt; bucket = redissonClient.getBucket(<span class="ql-token hljs-string">"complete"</span> + questionId); </div> <div class="ql-code-block"> <span class="ql-token hljs-type">String</span> <span class="ql-token hljs-variable">res</span> <span class="ql-token hljs-operator">=</span> bucket.get(); </div> <div class="ql-code-block"> <span class="ql-token hljs-keyword">if</span> (Objects.equals(res, <span class="ql-token hljs-string">"true"</span>)) { </div> <div class="ql-code-block"> bucket.delete();<span class="ql-token hljs-comment">//取完就删除</span> </div> <div class="ql-code-block"> <span class="ql-token hljs-keyword">break</span>; </div> <div class="ql-code-block"> } </div> <div class="ql-code-block"> times++; </div> <div class="ql-code-block"> } </div> <div class="ql-code-block"> } <span class="ql-token hljs-keyword">catch</span> (InterruptedException e) { </div> <div class="ql-code-block"> e.printStackTrace(); </div> <div class="ql-code-block"> } </div> <div class="ql-code-block"> System.err.println(<span class="ql-token hljs-string">"Sleep thread finished"</span>); </div> <div class="ql-code-block"> }); </div> </div> <p><br></p> <p><strong>我对这个项目增加了扩展:用户上传一张图片和分析要求,给出图片的分析结果;上传一张图片分析出图片中的文字信息。</strong></p> <p>项目图片展示:</p> <p><img src="https://pic.code-nav.cn/planet_post_image/1731283205841088514/vl3xydvm.jpeg"><img src="https://pic.code-nav.cn/planet_post_image/1731283205841088514/2ikkzxln.jpeg"><img src="https://pic.code-nav.cn/planet_post_image/1731283205841088514/rpal4d8n.jpeg"><img src="https://pic.code-nav.cn/planet_post_image/1731283205841088514/875ocnlh.jpeg"></p> <p><strong>源码地址:https://github.com/lxiaonan</strong></p> <p><strong>喜欢可以点个star,谢谢</strong></p> <p><img src="https://pic.code-nav.cn/planet_post_image/1731283205841088514/nfi5kdj5.jpeg"></p> </div> </body> </html>

伙伴匹配总结

<html> <head></head> <body> <div class="content ql-editor"> <p>从看视频到上线部署花费的时间还是挺久的,拖的时间比较长,我就分享下上线遇到的坑与解决办法吧,我用宝塔上线部署的(个人觉得比较方便),哈哈</p> <h3><strong style="color: rgb(51, 51, 51);">1.前端</strong></h3> <p>修改运行build时的请求后端的地址:修改为后端在服务器的地址</p> <p>然后执行npm run build进行打包,生成一个dist文件</p> <p>将文件放入服务器</p> <h3><strong style="color: rgb(51, 51, 51);">2.后端</strong></h3> <p>编写prod的配置</p> <p>修改数据库,redis为线上数据库</p> <p>将项目打包放入服务器</p> <p>指定端口和配置的代码</p> <div class="ql-code-block-container"> <div class="ql-code-block"> --server.port=8080 --spring.profiles.active=prod </div> </div> <h3><strong>3.前后端跨域问题</strong></h3> <p>1.前端地址:http://localhost:3000</p> <p>后端地址:http://localhost:8081/api</p> <p>我自己测试实现方法:</p> <p><strong>方法一:</strong></p> <p>编写配置WebMvcConfigurer,我这里将所有的跨域请求都可以通过,我知道应该存在风险,但是这也是一种简单的方法。</p> <div class="ql-code-block-container"> <div class="ql-code-block"> @Configuration </div> <div class="ql-code-block"> public class WebMvcConfg implements WebMvcConfigurer { </div> <div class="ql-code-block"> </div> <div class="ql-code-block"> @Override </div> <div class="ql-code-block"> public void addCorsMappings(CorsRegistry registry) { </div> <div class="ql-code-block"> //设置允许跨域的路径 </div> <div class="ql-code-block"> registry.addMapping ("/**") </div> <div class="ql-code-block"> //设置允许跨域请求的域名 </div> <div class="ql-code-block"> .allowedOriginPatterns ("*") </div> <div class="ql-code-block"> //是否允许证书 </div> <div class="ql-code-block"> .allowCredentials (true) </div> <div class="ql-code-block"> //设置允许的方法 </div> <div class="ql-code-block"> .allowedMethods ("*") </div> <div class="ql-code-block"> //设置允许的header属性 </div> <div class="ql-code-block"> .allowedHeaders ("*") </div> <div class="ql-code-block"> //允许跨域时间 </div> <div class="ql-code-block"> .maxAge (3600); </div> <div class="ql-code-block"> } </div> <div class="ql-code-block"> } </div> </div> <p><strong>方法二:</strong></p> <p>写nginx配置,让服务器告诉浏览器:允许跨域</p> <div class="ql-code-block-container"> <div class="ql-code-block"> location ^~ /api/ { </div> <div class="ql-code-block"> proxy_pass http://域名或者服务器地址:8081/api/; </div> <div class="ql-code-block"> add_header 'Access-Control-Allow-Origin' $http_origin; </div> <div class="ql-code-block"> add_header 'Access-Control-Allow-Credentials' 'true'; </div> <div class="ql-code-block"> add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS'; </div> <div class="ql-code-block"> add_header Access-Control-Allow-Headers '*'; </div> <div class="ql-code-block"> if ($request_method = 'OPTIONS') { </div> <div class="ql-code-block"> add_header 'Access-Control-Allow-Credentials' 'true'; </div> <div class="ql-code-block"> add_header 'Access-Control-Allow-Origin' $http_origin; </div> <div class="ql-code-block"> add_header 'Access-Control-Allow-Methods' 'GET, POST, </div> <div class="ql-code-block"> OPTIONS'; </div> <div class="ql-code-block"> add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,XRequested-With,If-Modified-Since,Cache-Control,Content-Type,Range'; </div> <div class="ql-code-block"> add_header 'Access-Control-Max-Age' 1728000; </div> <div class="ql-code-block"> add_header 'Content-Type' 'text/plain; charset=utf-8'; </div> <div class="ql-code-block"> add_header 'Content-Length' 0; </div> <div class="ql-code-block"> return 204; </div> <div class="ql-code-block"> } </div> <div class="ql-code-block"> } </div> </div> <p><strong>方法三:添加注解(在本地测试可以,但是上线我失败了,有伙伴成功了告诉我怎么搞)</strong></p> <p><br></p> <p>在controller添加@CrossOrigin注解</p> <div class="ql-code-block-container"> <div class="ql-code-block"> @CrossOrigin注解 </div> <div class="ql-code-block"> origins: 允许可访问的域列表,将前端地址放入 </div> <div class="ql-code-block"> @CrossOrigin(origins = {"http://localhost:3000"},allowCredentials = "true") </div> </div> <p>如果这个方法失败了,可以用全局配置类解决,上述方法一。</p> <p>好了,基本就是这些东西了,总结我想这几天把用户中心和伙伴匹配一起总结下。</p> </div> </body> </html>

下载 APP