尧图精选

前后端分离文学创作社交论坛实战:SpringBoot+Vue全栈拆解与部署避坑指南

🕒 发布时间:2026/10/2 9:54:26 📁 来源:尧图网络
做全栈项目最忌讳一上来就急着敲代码。今天拆解的这个前后端分离文学创作社交论坛_xabo系统,如果只看标题你可能觉得只是个普通CRUD项目但真把它当成一个小型社区产品来打磨的时候里面的坑和细节其实是很多的。这系统技术栈锁定在SpringBoot、Vue、MyBatis、MySQL,典型的前后端分离架构适合正在学全栈的开发者练手也适合用来做毕业设计或者个人作品集。我当初在搭建这类论坛系统时从数据库设计到前端路由守卫再到后端拦截器走了不少弯路趁这个机会把源码层面和部署层面的关键节点一并聊聊。1. 文学创作论坛的整体架构与边界划分很多人以为论坛系统就是几个页面加几张表但真正涉及“文学创作”场景时产品逻辑就变得微妙起来。它既要承载社交属性比如关注、评论、点赞、私信又要兼容创作属性比如章节发布、草稿箱、作品审核、分类标签甚至还要考虑阅读时的目录和书签。_xabo系统在这里承担了一个典型的平台型中间层任务。1.1 前后端分离的真实边界在哪里传统单体JSP项目把页面、控制层、数据库访问全揉在一起改一个小按钮都要重新部署整个项目。而这套系统选用了前后端分离核心就一句话前端只干渲染和交互后端只干数据和权限。Vue负责处理路由跳转、状态管理、HTTP请求封装SpringBoot只暴露JSON接口通过RESTful API通信。这个分离带来的最大好处是前端团队和后端团队可以完全并行开发谁也不阻塞谁。从实际代码层面看前端工程通常是Vue CLI或者Vite创建的独立项目后端则是Maven构建的SpringBoot应用。两者唯一的连接点就是约定好的接口文档。我在这个项目里前端用的是Vue 2.6脚手架用的Vue CLI 4.x后端用的是SpringBoot 2.3.12MyBatis用的是mybatis-spring-boot-starter2.1.4MySQL版本用的5.7。这组版本是我实测下来兼容性最稳的一套组合新手直接照抄能少掉很多头发。1.2 论坛系统的核心功能模块拆分一个文学创作论坛的用户其实分两类一类是来写书的一类是来看书的。这两类人诉求完全不同但底层用户表是同一条数据。所以权限控制非常关键如果不在一开始把角色和状态字段设计好后面加权限就像往火山口上堆雪。_xabo系统在权限上划分了三种角色普通读者、创作者、系统管理员。读者可以浏览、收藏、评论、点赞创作者额外拥有发布作品、管理章节、查看数据看板的权限管理员则负责审核内容、封禁违规账号、修改全站公告。这套权限模型在SpringBoot里通常用拦截器加自定义注解实现而不是简单地在前端把按钮藏起来。前端路由守卫只是用户体验层面的盖子后端的访问控制才是真正的锁。数据库层面核心表至少包含用户表、角色表、作品表、章节表、评论表、点赞表、收藏表、关注表、系统通知表。如果再加上积分或打赏功能还要加一张交易流水表。这张表不涉及支付网关只做账务记录所以并不复杂。2. 后端SpringBoot核心机制与MyBatis持久层深度解析后端这块SpringBoot框架本身的自动装配已经把大部分复杂工作都消化掉了。但这不代表你可以把application.yml一写就完事很多隐藏的坑恰恰出现在配置细节上。2.1 SpringBoot项目构建与版本选择的实操经验用IDEA新建SpringBoot项目很多人喜欢直接在Spring Initializr里面选最新版本结果一引入旧版依赖就报错。这个项目我强烈建议使用SpringBoot 2.3.x原因很简单稳定、资料多、遇到问题搜索引擎能直接给答案。SpringBoot 3.x不是不好但它默认JDK 17起步而且javax包改名成了jakarta很多老教程里的代码直接复制是跑不起来的。Maven项目构建方法在_xabo系统里遵循标准结构src/main/java下面按controller、service、mapper、entity、config、common六层分包。controller层只做参数接收和结果封装service层管业务逻辑和事务边界mapper层是MyBatis的接口层XML文件统一放在src/main/resources/mapper目录下。这样做的好处是当某个接口报错时你能迅速顺着请求链路定位到问题层不至于在几百个文件里大海捞针。启动类上除了SpringBootApplication还需要配合MapperScan注解扫描Mapper接口。如果你忘了加这个注解Spring容器启动时会直接抛出Invalid mapper interface异常但这个报错信息往往不会第一时间指向Mapper目录而是会指向一个无关的Bean初始化错误新手排查起来非常耗时。2.2 MyBatis第一二级缓存机制与TypeHandler在实际场景中的取舍MyBatis的缓存机制一直是面试高频题也是实际项目里容易出幺蛾子的地方。一级缓存是SqlSession级别的同一个会话里执行两次相同的SQL会走缓存但如果中间发生增删改操作缓存会自动清空。这个机制在Spring整合MyBatis时注意Mapper接口方法默认一个方法一个新SqlSession的所以一级缓存基本形同虚设。二级缓存是Mapper级别的跨SqlSession生效。这个缓存虽然能提升性能但在多表联查场景中容易导致脏读。原因在于二级缓存只感知到当前Mapper的增删改如果A表关联B表而B表的数据被另一个Mapper修改了AMapper的二级缓存不会自动失效。所以_xabo系统在开发阶段会直接关闭二级缓存等到用户量和数据量上来之后再考虑引入Redis或者使用Caffeine配合Spring Cache而不是依赖MyBatis自带的二级缓存。再说说TypeHandler。MyBatis在处理数据库字段和Java实体属性转换时默认支持常见类型但遇到JSON字符串、枚举类型、时间范围时就需要自定义TypeHandler。举个我实际改过的例子作品表里有一个status字段在Java里是枚举类型WorkStatus.DRAFT、WorkStatus.PUBLISH数据库里存的是整型0、1。如果你不做任何处理MyBatis只会把它当成普通int然后你必须在Service层写一堆if-else来转换。自定义TypeHandler的本质就是把这片if-else从业务代码搬到映射层让实体类更干净。2.3 SpringBoot整合MyBatis的配置细节与SSL连接错误排查在application.yml里配置数据源时有一个非常常见的坑。spring: datasource: url: jdbc:mysql://localhost:3306/xabo?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver这里的useSSLfalse是为了本地开发时避免MySQL 8.x版本SSL握手导致的警告甚至连接失败。如果你用的是MySQL 5.7这个参数加不加都行但MySQL 8.0的默认驱动是com.mysql.cj.jdbc.Driver它默认尝试使用SSL连接如果没有正确配置证书就会爆出SSL connection error。很多新手以为是自己密码写错了反复改密码其实问题出在连接URL上。另外字符集和时区这两个参数也必须显式声明。serverTimezoneAsia/Shanghai不写的话如果你的数据库服务器和代码运行的机器不在同一个时区时间字段会差8小时。这个Bug排查起来非常隐蔽因为数据看起来是有的只是时间错了会导致前端展示的“发布时间”比实际时间早了或者晚了8个小时很多开发者在界面层和数据库层翻来覆去找原因唯独忽略了JDBC连接串。2.4 SpringBoot跨域配置与拦截器鉴权实现前后端分离项目里跨域是一个绕不开的坎。前端跑在localhost:8081后端跑在localhost:8080浏览器因为同源策略会直接拦截带自定义Header的请求。这里的解决方案不是在前端代理上省事而是后端彻底开放跨域资源配置。_xabo系统用的是SpringBoot的CorsRegistry配置加上CrossOrigin注解的双保险方案。具体来说写一个CorsConfig类实现WebMvcConfigurer在addCorsMappings里面允许所有路径、所有来源开发阶段、允许所有请求头但允许的请求方法里要精确列出GET, POST, PUT, DELETE, OPTIONS。如果漏了OPTIONS预检请求直接失败前端控制台会报红色的CORS policy错误。鉴权方面我用了拦截器加自定义RequireLogin注解的方式。用户登录成功后后端发一个JWT Token前端在每次Axios请求时通过拦截器把Token放进Authorization头里。后端写一个LoginInterceptor在preHandle方法里解析Token如果解析失败直接返回401状态码前端路由守卫根据401跳转到登录页。这里有一个经验千万别把Token放在localStorage里做持久化刷新页面后Token虽然还在但如果用户在隐私模式下操作localStorage的读取可能会受限。更好的方案是localStorage配合sessionStorage双写或者在内存里管理Token状态刷新后重新登录。3. 数据库表结构与MyBatis映射关系设计数据库是论坛系统的地基。一张设计不合理的表后期运维时想死的心都有。很多新手在设计表时喜欢把所有的标签、状态、备注都塞进一个text字段里表面上看很省事实际上一到统计报表的时候SQL写得像天书一样。3.1 文学论坛核心表设计思路与SQL示例用户表设计上我用user表承载基础信息字段包括id、username、password、nickname、avatar、email、role、create_time。注意一点密码不要用明文存储而是用BCryptPasswordEncoder进行哈希。如果你用MD5一旦数据库泄露用户在其他平台的密码同步泄露。作品表work和章节表chapter是文学创作的灵魂。work表字段id、user_id、work_title、work_desc、category、cover_url、status、word_count、create_time、update_time。chapter表字段id、work_id、chapter_title、content、sort_order、view_count、create_time。这里有一个细节content字段如果存纯文本单章字数在2000字左右VARCHAR完全够用。但如果作品里含富文本编辑器生成的HTML标签就必须升级为MEDIUMTEXT类型。因为VARCHAR在MySQL里最多只有65535字节一篇章节加上p、br标签很容易就超标了我当时在测试时就是因为这个问题章节保存到一半就报错一度以为是数据库连接被切断。3.2 MyBatis XML映射文件的多表联查与动态SQL编写技巧MyBatis的XML才是它的精髓所在。很多人图省事直接用注解Select但一旦SQL复杂起来注解里写的SQL字符串又长又难调试还容易因为换行少了空格而报错。_xabo系统在复杂查询里统一使用XML映射。举例一个“首页推荐作品”的查询需要联查work表和user表同时统计每个作品的点赞数和评论数。这个SQL如果写在注解里你大概率的处理方式是拆成多条SQL在Service层做拼接但这样会带来N1查询问题前端就明显卡顿。更优雅的做法是在Mapper XML中用一次LEFT JOIN加子查询把结果集封装成WorkDetailVO。动态where标签的使用也很关键。比如管理后台的筛选条件作品名、分类、状态都可能为空。如果不加where你在拼接SQL时会遇到多一个AND的尴尬问题。MyBatis的where标签会在有WHERE条件时自动去掉多余的AND或OR这比直接在Java代码里拼接SQL要安全得多。3.3 MySQL索引优化与排序机制在论坛场景中的运用阅读列表排序时order by create_time desc是老生常谈。但如果你表里只有几万条数据感受不到差别一旦数据量到百万级不带索引的排序会让数据库CPU瞬间飙高。我的实际做法是在work表的create_time字段上建索引在chapter表的work_id字段上建索引并在user表的username上建唯一索引。要理解MySQL的排序机制你至少得知道MySQL 8.0的优化器在order by时优先走索引扫描如果查询条件里没有匹配的索引就会触发Using filesort也就是在磁盘上生成临时表来排序。这个操作非常消耗IO也是慢查询日志里面最需要警惕的条目。一个实际提速的案例当时_xabo系统的“最新更新”列表查询耗时在800ms左右加了(status, update_time)的联合索引之后降到80ms。这个提升不是说MySQL有多神奇而是索引让排序直接从文件排序变成了索引顺序读取。4. 基于Vue的前端工程化与阅读体验优化前端这块Vue的生态非常成熟但正因为太成熟很多人反而不知道该怎么组合这些工具。从零搭建Vue项目时官方推荐Vite但对于老项目或者需要兼容性更高的场景Vue CLI仍然是保底方案。4.1 Vue路由配置与动态路由实现解读文学论坛的典型页面包括首页、作品详情页、阅读页章节内容页、创作后台、用户主页、登录注册页。这些页面全部通过Vue Router来跳转。初次加载时如果全量打包路由main.js的体积会非常吓人首次打开白屏时间会拉得很长。所以_xabo系统采用的是路由懒加载机制通过() import(/views/ReadChapter.vue)的方式按需加载。动态路由的核心思想是根据用户的角色或者后端返回的权限列表来生成可访问的路由表。游客登录时路由表里只有/home、/work/:id、/login创作者登录时额外注入/author前缀下的所有子路由。前端通过router.addRoutes()来实现这一操作。4.2 前端HTTP请求封装与Axios拦截器统一封装Axios是一项非常值得做的工作。封装的核心点有两个。第一个是请求拦截器从指定的存储位置读取Token并放进Authorization头。第二个是响应拦截器当HTTP状态码为401时清空用户信息并跳转登录页当HTTP状态码为200但业务状态码是500时统一弹出提示组件。service.interceptors.response.use(response { const res response.data if (res.code ! 200) { Message.error(res.message || 系统异常) if (res.code 401) { store.commit(resetUser) router.push(/login) } return Promise.reject(new Error(res.message)) } return res })这段代码里最难处理的戏码是code字段的定义。很多人前后端协作时这边后端返回code200那边前端判断code0结果所有接口全部进入异常分支在联调时浪费大量时间。建议大家在项目启动第一天就把接口返回结构的规范定下来{ code, message, data }code200代表成功。全项目统一标准才不会自己人坑自己人。4.3 Vue阅读器组件封装与M3U8视频流播放方案文学论坛常需要在页面中呈现富文本内容但富文本的样式很容易被全局样式污染。_xabo系统的阅读页的章节内容我用的是v-html渲染后端返回的HTML字符串同时在父组件上加了/deep/穿透样式来专门控制正文内部的元素比如首行缩进、行高、字体大小。针对阅读场景用户其实非常挑剔字体渲染正文部分最好禁掉全局的letter-spacing和font-family单独给一个衬线字体族比如中文宋体或者思源宋体。另一个很现实的需求是部分文学作品可能会附带音频或者作者访谈视频。如果视频格式是M3U8在Vue项目里的播放方案选择我建议直接在ReadChapter.vue里对接hls.js库。M3U8不是普通的前端可以直接进video.src的文件它必须通过Hls实例加载并附加到video元素上。if (Hls.isSupported()) { var hls new Hls({ maxBufferLength: 30, maxMaxBufferLength: 60 }) hls.loadSource(videoUrl) hls.attachMedia(videoElement) }使用hls.js的时候需要特别注意跨域问题。如果视频文件放在独立域名比如CDN上服务端必须在响应头里加Access-Control-Allow-Origin: *否则hls.js的M3U8请求会被浏览器拦截哪怕你通过forward代理也未必能彻底解决当年我排查这个问题一度从头文件Header找到Nginx配置最后发现其实是视频服务商默认没开CORS。4.4 Vue状态管理与用户登录态的持久化Vue项目里用来存全局状态的首选是VuexVue 2或PiniaVue 3。在_xabo系统里I用Vuex来维护userInfo、token、routeLoaded三个核心状态。userInfo存储当前登录用户的基本资料token存储JWT字符串routeLoaded是一个布尔值用来标记动态路由是否已经加载完成防止页面刷新时路由挂载不起来导致白屏。有一个隐藏的坑页面刷新时Vuex数据会清空。所以必须在main.js里或App.vue的created钩子里根据localStorage的token去调拽/user/info接口重新拉取用户信息并灌回Vuex。如果这一步没做好用户明明登录了刷新一下就变成未登录体验感直接降级。5. 部署实施、性能优化与常见问题排查实录部署环节是“从能跑”到“能上线”的分水岭。本地Dev环境开着热部署代码一改立刻生效但服务器上不会给你这么舒服的开发体验。5.1 前端打包配置与Nginx反向代理部署实战Vue项目打包在本地很容易npm run build会生成dist目录。但打包之前有两个配置务必检查。第一个是vue.config.js里的publicPath如果你要部署在www.domain.com根目录设成/如果要部署在/blog/子目录必须设成/blog/。第二个是proxy配置开发环境里可以借助webpack-dev-server代理解析/api请求但打包之后这个代理就失效了线上请求必须由Nginx转发到后端服务。Nginx配置的核心点是把前端所有路由请求都交给index.html这样才能配合Vue Router的History模式。如果你用默认的hash模式把路由写成/#/home倒是不会出现刷新404但URL非常难看。所以推荐History模式加Nginx的try_files回退server { listen 80; server_name yourdomain.com; root /data/www/xabo/dist; index index.html; location / { try_files $uri $uri/ /index.html; } location /api { proxy_pass http://127.0.0.1:8080; } }这里面的proxy_pass后面的URL末尾有没有斜杠坑也很深。proxy_pass http://127.0.0.1:8080;会把/api/user/login完整转发给后端但如果你写proxy_pass http://127.0.0.1:8080/;后端接收到的路径在原本基础上直接被抹掉/api前缀导致路由匹配失败404成片。我调试这个问题时急到差点把浏览器缓存清了结果只是少打了一个斜杠。5.2 SpringBoot Jar包构建与服务器环境部署流程后端部署时_xabo系统采用的是打Jar包的标准方式。先在Maven面板里执行clean package命令然后在target目录下拿到xabo-system-0.0.1-SNAPSHOT.jar文件。放到服务器上以后通过nohup java -jar xabo-system-0.0.1-SNAPSHOT.jar --spring.profiles.activeprod logs/xabo.log 21 这个命令有几点值得展开。--spring.profiles.activeprod表示加载application-prod.yml配置文件生产环境的数据库账号密码、文件存储路径、日志级别都必须和开发环境区分开。如果不区分你本地调试时连的是本地库部署后连的也是本地库非常危险。日志输出重定向到logs/xabo.log这是一个简单但实用的操作。如果没有加这个重定向控制台一旦断开进程可能直接终止。nohup配合则让程序在后台持续运行。关于服务器的部署注意项我建议新建一个普通用户来运行Java进程不要直接用root。Jar包以高权限用户运行一旦有安全漏洞整个服务器就没了。5.3 MySQL部署参数与远程连接SSL错误排查MySQL的线上部署往往不是最费事的最费事的是客户端连接服务端时遇到的SSL问题。如果你用Navicat连接服务器MySQL 8.0默认开启SSL后会报错Authentication plugin caching_sha2_password cannot be loaded。出现这个报错一般两种处理方案一是修改MySQL用户把default_authentication_plugin改成mysql_native_password二是在连接字符串里明确加上allowPublicKeyRetrievaltrueuseSSLfalseJAVA后端只需要在旁边加上这两个参数就能解决大部分问题。如果你用的是RPM方式安装MySQL 5.7那么字符集配置需要仔细确认。默认的MySQL 5.7字符集是latin1如果用户评论中包含中文插入时会直接报错或出现乱码。必须在my.cnf中设置[mysqld] character-set-serverutf8mb4 collation-serverutf8mb4_unicode_ciutf8mb4和utf8的区别在于utf8在MySQL中只能存3字节的字符遇到生僻字、特殊符号或者Emoji都会直接报错而utf8mb4完全兼容4字节Unicode字符。这一类文学创作论坛标题、章节内容里出现古汉语生僻字非常频繁不用utf8mb4作为默认字符集基本就是一种慢性折磨。5.4 部署排查端口占用、依赖冲突与缓存失效问题部署新版本时端口被占用是最常见的。SpringBoot默认端口是8080如果服务器上还有其他Java进程启动时就会报Port already in use。解决办法是直接杀掉旧进程lsof -i:8080 | awk {print $2} | grep -v PID获取进程ID然后kill -9。但如果你用kill -9杀得多了会发现有些服务明明杀干净了还是启动不了那你就要检查是不是systemd服务通知重启了。Maven依赖冲突也是一个高频问题。比如你同时引入了mybatis-spring-boot-starter和mybatis-plus-boot-starter两个包里都含SqlSessionFactory的自动配置类启动时会出现重复注册的错误。解决思路很直接二选一别同时用。如果你的项目严重依赖MyBatis Plus的LambdaQueryWrapper就彻底放弃原生的MyBatis XML开发或者反过来。缓存这块是最容易引发线上怪异行为的。如果你在开发环境开了MyBatis二级缓存改完代码重启后旧数据依然能从缓存里读到体验极其糟糕。我的习惯是本地开发一律关闭二级缓存上线之后根据压力测试结果再决定要不要引入Redis。如果非要用MyBatis自带的二级缓存务必给每个Mapper设置evictionLRU并且限制flushInterval。6. 项目扩展方向与补充工具链的巧妙接入架构搭完、功能上线只是第一步。一个合格的全栈项目还要有继续成长的空间。_xabo系统虽然当前已经完成了论坛核心链路但其实有很多可以低成本接入的增强组件。6.1 MinIO对象存储接入SpringBoot实现文学创作素材管理文学创作者在写作过程中除了正文往往还需要管理大量图片素材、封面素材甚至视频素材。如果直接把文件存入MySQL数据库数据库的体积很快就会被撑爆。这时候就需要引入一个独立的对象存储组件。MinIO是一个几乎零成本就能部署到SpringBoot体系里的对象存储工具。它的API完全兼容AWS S3协议但部署起来比搭建一个真正的S3轻量得多。你只需要在本地或者服务器上跑一个MinIO实例然后在后端的pom.xml里引入MinIO SDK写一个MinioConfig类提供客户端Bean接着写一个FileService来处理文件上传和URL签名。接入MinIO的关键经验是上传文件时必须给对象自动生成唯一名称。如果用户上传的封面的文件名是novel.jpg一旦第二个用户也上传了同名文件后一个就会覆盖前一个导致之前的作品封面全部丢失。我当时用UUID加上后缀的方式解决String objectName UUID.randomUUID().toString().replaceAll(-, ) suffix。更完善的方案是文件夹分级/cover/2024/08/27/{uuid}.jpg。前端在做这种上传时会通过后端拿到一个临时上传凭证而非直接连MinIO。后端生成一个Presigned URL给前端前端把本地文件直接PUT到预签地址这样做的好处是减轻后端带宽压力也不会把文件流经Java内存。6.2 Maven项目多环境配置与IDEA调试技巧IDEA在运行SpringBoot项目时经常遇到端口冲突或环境变量不一致的问题。很多人直接在Edit Configurations里面改端口但忽略了一个事实IDEA的启动配置可以注入Environment variables这些变量的优先级高于application.yml。如果你的配置文件里写了server.port8081但IDEA的运行环境里设置了SERVER_PORT8080最终生效的是8080。排查这类问题优先看一下Run/Debug Configurations中的Environment variables。在依赖层面Maven项目的构建过程也容易出现诡异错误。比如你改了一行代码package时报出程序包com.xxx不存在但代码里明明已经导入。这种情况多半是因为本地仓库里的依赖版本和项目里的版本对不上。解决方案就是执行一次mvn clean install -U强制刷新快照版本或者直接把本地仓库里那个残留的旧版本目录删掉再重新reimport一下Maven项目。6.3 小说论坛的SEO优化与阅读排名机制文学论坛一旦上线PV量往往会迅速上升这时的流量入口不能只依赖首页推荐搜索引擎的收录非常关键。前端Vue的SPA应用天然对SEO不友好搜索引擎爬虫抓到的只是空荡荡的div idapp/div不会渲染出任何章节内容。要想让搜索引擎收录你的作品详情页方案有三个层级。最简单的守旧路线是使用vue-meta动态修改title和description让爬虫至少抓到meta标签。进阶路线是后端为每一个/work/:id的页面单独渲染一套纯静态的HTML快照提供给需要SEO的爬虫。最高级的路线是直接重构成Nuxt.js的SSR渲染彻底解决首屏白屏和SEO收录问题。对于_xabo系统这类中小型项目目前开源的prerender-spa-plugin插件已经能解决大部分收录需求。阅读排名机制方面可以在首页直接用一个ORDER BY view_count DESC来展示热门书籍。但只看浏览量容易被刷量。一个可行的简单方案是引入热度值hot_score view_count * 0.5 favorite_count * 1.5 comment_count * 2.0然后在视图中按hot_score排序。这个数值不用实时计算可以每天凌晨跑一个定时任务去更新到work表的热度字段里。7. 从零到一实际项目迭代过程的总结与避坑心得整个_xabo系统从立项到第一版可运行产品我前后大概花了三周时间。前一周在做数据库设计和接口文档第二周推后端CRUD和权限第三周做前端页面联调。进度看上去还行但实际上在联调阶段破防了无数次几乎每一次破防都源于前期的规矩没定好。关于接口返回字段的类型约定是最让我后悔的一件小事。后端id用的Long类型传到前端后String然后在JSON序列化时发现Long精度丢失最后几位全变成0。这个问题在JS中被称为大整数精度丢失。解决方案是在Java端对比较大的Long字段加上JsonSerialize(using ToStringSerializer.class)注解或者是直接把统一返回对象data里的id都统一成String类型彻底避开精度坑。关于状态码的约定和错误提示风格也一定要提前写入接口文档。大多数人做项目时喜欢口头沟通“你传个0我判断成功”最后会导致前端对待code字段的态度完全混乱。最好所有人都守着统一的返回工具类Result.success(data)和Result.error(500, msg)谁的情况都不许例外。我非常推荐在项目最开始就给每个开发者装上一个接口管理工具比如Apifox。它不止能调试接口还能生成非常友好的接口文档前后端联调的时候有文档和没文档完全是两种效率。尤其是后端字段一变更文档能第一时间同步及时地在界面上提示前端变化。最后一个特别想分享的经验是日志打印的重要性。很多玩家觉得本地调试用System.out.println就行但上线后那是完全不够用的。_xabo系统在日志方面使用的是Slf4j加Logback生产环境的日志级别配在INFO同时把SQL执行日志单独导出到文件。这样排查问题时你可以直接在后端日志里看到某条接口到底执行了什么SQL参数是什么耗时多久。这个习惯能救命遇到联调说不清谁错了的Bug直接把日志文件拉开看一劳永逸。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →