[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依照自己的需求设定时间。依葫芦画瓢即可。

~~~
/**
*
* 定期清理所有消息定时任务
*
*
* @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版本之前的目录结构:

v1.25.0版本及之后的目录结构:

如果你要二次开发微信小程序,**新增的页面请放在分包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.如何创建后台管理系统的页面
首先,请在后台管理系统的菜单管理中新增你的页面。如下图位置。

然后,进入后台管理系统项目创建页面,一般的业务模块在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。

v1.25.0版本以及之前的版本,如果测试的是后台管理系统的接口,那么在如下图所示的地方设置token(移动端也是这个地方设置),记得点击保存。

*****
(2)管理端的token值可以直接从已登录后台的请求路径获取,直接复制过来。如下图所示:

(3)用户端的token值可以通过用户端登录或注册接口请求获取token,此外,也可以通过如下图方式复制token值。注意前提是已登录状态,否则找不到token值。

很多用户由于没有设置token值,会导致swagger文档接口请求失败,响应内容如下所示:响应码401就是未登录,也就是没有设置token或token无效。

