ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] **林风社交论坛项目官网**:https://www.linfengtech.cn 备用官网:https://net.linfeng.tech 更多演示可关注“林风科技”公众号。 林风社交论坛项目标准商业版`二次开发`基础指导: ## 1.用户端后端创建新接口 在该包下新建接口开发你的**用户端**二开内容 ~~~ io.linfeng.modules.app ~~~ ### (1)接口登录拦截 如果该接口需要当前用户信息,则在接口入参上添加@LoginUser注解注入用户信息,并添加@Login注解。如下所示: ~~~ /** * 评论区评论点赞 */ @Login @PostMapping("/addThumbs") @NoRepeatSubmit public R thumbs(@RequestBody AddThumbsParam request,@LoginUser AppUserEntity user){ commentThumbsService.addThumbs(request,user); return R.ok(); } ~~~ 注意:使用@LoginUser注解就必须使用@Login注解!!!不然会报空指针异常。 反过来,使用@Login注解则不一定需要@LoginUser注解,除非你需要获取用户信息。 如上代码中,我们发现还有一个@NoRepeatSubmit注解,该注解是防止接口的重复提交操作,保持接口幂等性的。 ### (2)获取用户信息 如果确定你的新接口需要用户登录,那么你只需要按照第(1)条的说明进行操作,但是按照第(1)条的说明进行操作的话,会出现一个问题,即:如果用户端未登录,那么用户端会强制跳转到登录页。如果你不希望这样,那么就按照如下操作进行: 首先,controller接口处不再添加第(1)条的两个注解,你只需要注入LocalUser这个Bean,调用getUser()方法并判断该方法返回的当前用户信息是否为空即可。直接看代码: ~~~ @Override public AppPageUtils lastPost(Integer currPage) { Page<PostEntity> page = new Page<>(currPage,10); QueryWrapper<PostEntity> queryWrapper=new QueryWrapper<>(); queryWrapper.lambda().eq(PostEntity::getStatus,Constant.POST_NORMAL); queryWrapper.orderByDesc("post_top","id"); AppUserEntity user = localUser.getUser(); if(ObjectUtil.isNull(user)){ return this.mapPostList(page, queryWrapper, 0); } return this.mapPostList(page, queryWrapper, user.getUid()); } ~~~ 提取关键代码即如下所示: ~~~ @Autowired private LocalUser localUser; ... ... ... AppUserEntity user = localUser.getUser(); if(ObjectUtil.isNull(user)){ //未登录时的业务逻辑 }else{ //登录时的业务逻辑 } ~~~ ### (3)响应体 接口响应体支持两种形式:`new Result<>.ok()`和`R.ok()`,可根据实际需求选择使用。 * **`new Result<>.ok()`** 适用于需要明确响应体字段结构的场景。该方法要求预先定义好响应体的 VO(View Object)结构,便于 Swagger 生成清晰的接口文档,方便前端理解返回字段。 * **`R.ok().put("key", value)`** 适用于需要灵活返回数据的场景。使用该方法时,无需提前创建 VO 对象,可直接通过`.put()`方法动态添加返回字段。但由于其底层基于 HashMap 结构,Swagger 无法自动识别具体返回字段,因此不会在swagger接口文档中显示详细字段说明。 两种方式在本项目中均可使用,请根据实际场景和开发习惯进行选择。 ## 2.创建新的定时任务 在该包下创建你的类 ~~~ io.linfeng.modules.job.task ~~~ 该类的类名需要和后台管理系统创建的“bean名称”一致。 比如:下图和对应的代码保持了一致的名称。参数即为传入的值。cron依照自己的需求设定时间。依葫芦画瓢即可。 ![](https://img.kancloud.cn/75/0a/750aae37bedc197337d6964a8ab37346_1894x838.png) ~~~ /** * * 定期清理所有消息定时任务 * * * @author linfeng */ @Component("messageTask") public class MessageTask implements ITask { private Logger logger = LoggerFactory.getLogger(getClass()); @Autowired @Lazy private MessageService messageService; @Override public void run(String params){ logger.debug("messageTask定时任务正在执行,参数为:{}", params); //必须是整数而且为正数,代表清除几个月前的数据 if(NumberUtil.isInteger(params)&&Integer.valueOf(params)>0){ messageService.deleteMessageByMonth(Integer.valueOf(params)); } } } ~~~ ## 3.前端开发参考文档 1.Uniapp官方文档: https://uniapp.dcloud.net.cn/component/ 2.UView官方文档(1.X版本,不要看2.X文档): https://v1.uviewui.com/components/intro.html V1.25.0开始升级为uniapp(vue3),请参考文档:https://vkuviewdoc.fsq.pub/components/intro.html 3.Element-Plus文档: https://element-plus.org/zh-CN/ Vue3文档: https://cn.vuejs.org/ 4.v1.24.0版本之前的目录结构: ![](https://img.kancloud.cn/c5/c2/c5c28a8b1fb6b35c0bb4dc7f2970ae00_665x529.png) v1.25.0版本及之后的目录结构: ![](https://img.kancloud.cn/ee/50/ee5082018e9d37fa4e4a26a38c79129d_743x529.png) 如果你要二次开发微信小程序,**新增的页面请放在分包subpages下**。不然微信小程序打包有可能超出最大限制。 ## 4.后台管理端 #### 1.如何获取当前登录管理员 继承抽象类AbstractController,调用`getUser()`即可。 如果只要管理员用户id,调用`getUserId()`即可。 ~~~ package io.linfeng.modules.sys.controller public abstract class AbstractController { ....... } ~~~ #### 2.如何记录后台管理端的敏感操作日志 在后台管理端接口controller上添加注解@SysLog("描述内容") ~~~ @SysLog("需要描述内容的信息") ~~~ 例如: ~~~ @SysLog("修改圈子分类") @PostMapping("/updateCategory") @RequiresPermissions("admin:category:update") @ApiOperation("修改圈子分类") public R update(@RequestBody CategoryParam param){ categoryService.updateCategory(param); return R.ok(); } ~~~ #### 3.如何创建后台管理系统后端接口 在该包下新建接口开发你的**管理端**二开内容 ~~~ io.linfeng.modules.admin ~~~ 如下为后台管理端接口示例: ~~~ @GetMapping("/detail/{id}") @RequiresPermissions("admin:recharge:info") @ApiOperation("充值方案详情") public R detail(@PathVariable("id") Integer id){ RechargeEntity recharge = rechargeService.getById(id); return R.ok().put("recharge", recharge); } ~~~ 其中,权限注解`@RequiresPermissions("admin:recharge:info")`中的授权标识`admin:recharge:info`需要在后台管理系统菜单管理里面的授权标识配置对应上。 #### 4.如何创建后台管理系统的页面 首先,请在后台管理系统的菜单管理中新增你的页面。如下图位置。 ![](https://img.kancloud.cn/e3/72/e3720b13db444def4f275a43409795ec_1893x876.png) 然后,进入后台管理系统项目创建页面,一般的业务模块在admin模块下创建即可,路径如下: ``` linfeng-community-vue\src\views\modules\admin ``` 最后,只要参考其他模块,编写代码即可。 ## 5. Swagger的文档使用 访问地址: 本地:localhost:8080/doc.html 线上: 域名+/doc.html 后端项目的application-prod.yml里面设置线上接口文档是否开启。注意:如果没开启是无法访问到的。 ``` 注意:v3.0.0版本起更新了Swagger文档版本,比v1.25.0版本及之前的版本更好用。 ``` (1)v3.0.0版本起,如果测试的是后台管理系统的接口,那么在如下图所示的地方设置token(移动端也是这个地方设置)。参数名称填:token,参数值为token的值,参数类型选header。 ![](https://img.kancloud.cn/01/6d/016d72c973d276eeacd4df0863a5ce67_1914x873.png) v1.25.0版本以及之前的版本,如果测试的是后台管理系统的接口,那么在如下图所示的地方设置token(移动端也是这个地方设置),记得点击保存。 ![](https://img.kancloud.cn/7b/1b/7b1b9f2388d531375650bfa070eeae8f_1919x873.png) ***** (2)管理端的token值可以直接从已登录后台的请求路径获取,直接复制过来。如下图所示: ![](https://img.kancloud.cn/97/51/97510f4761c6de1b43d365910dadc1c7_1899x878.png) (3)用户端的token值可以通过用户端登录或注册接口请求获取token,此外,也可以通过如下图方式复制token值。注意前提是已登录状态,否则找不到token值。 ![](https://img.kancloud.cn/00/07/0007d3047f08400447a5b7468d36a5a8_1853x878.png) 很多用户由于没有设置token值,会导致swagger文档接口请求失败,响应内容如下所示:响应码401就是未登录,也就是没有设置token或token无效。 ![](https://img.kancloud.cn/f7/09/f709a7fcf5b9e51f37a0946994f4899d_1498x855.png)