#🌌 后台功能
后台功能模块,包含主控面板,开发管理,日志管理,系统监控,通知公告,文件管理,定时任务。
#1. 主控面饭
主控面板展示了系统的一些统计信息,采用默认的ant design pro框架自带的界面。可以根据需要调整为系统需要的图表等信息。
#2. 开发管理
开发管理包含一些开发上会用到的一些配置或者功能,利用这些功能,可以规范一些约束,也可后端人员进行开发。
#2.1 系统配置
对系统中的变量、常量进行在线维护。
在线维护的好处是配置一目了然,并且使用时实时更新,程序中拿到这个配置,可以控制某些业务开关或业务属性。
👍 强烈建议过目一遍所有配置,心中有个印象!开发时候可以联想到就行! 👍
#2.1.1 新增和编辑参数介绍
👉唯一编码:一般以大写单词下划线分割的方式。
👉系统参数:系统参数为系统运行中的核心机制会用到的参数,如果选定是系统参数,则这个参数不能被删除,但是允许修改。
👉所属分类:为了方便区分这些常量的用途而加的分类。这个下拉的选项在字典里配置,如下图。
👉参数值:字符串类型。
#2.1.2 程序中使用配置
首先在线添加一个配置,例如添加了一个验证码开关的配置。
第二步,在程序ConstantContextHolder中添加一个方法,用于获取参数值。
第三步,在程序任何位置都可以通过静态调用的方式来调用这个值了。
#2.2 字典管理
字典维护了系统和业务层级的一些枚举属性。字典相关的接口查看SysDictTypeController
类。
👉字典的唯一编码一般用小写单词下划线分割的方式。
#2.3 接口文档
接口文档使用了swagger
#2.3.1 使用注解创建swagger文档
👉 @Api
注解加到控制器上,如下示例:
@Api("系统应用控制器")
@RestController
public class SysAppController {
...
}
👉 @ApiOperation
注解加在控制器方法上,response
用来写返回类型,如下示例:
@ApiOperation(value = "查询应用列表", response = SysApp.class)
public ResponseData page(SysAppParam sysAppParam) {return new SuccessResponseData(sysAppService.page(sysAppParam));
}
👉 @ApiModel
加在请求和返回参数类的类上,如下示例:
@ApiModel
public class SysAppParam extends BaseParam {
}
👉 @ApiModelProperty
加在请求和返回参数类的类中的属性上,如下示例:
@ApiModelProperty("名称")
private String name;
#2.4 短信
短信,文件,邮件的发送封装在如下的开源代码库,目的是为了封装一些通用的第三方组件给每个项目使用:
https://gitee.com/stylefeng-Roses/roses-kernel/tree/new-cloud/
#2.4.1 如何发送短信
👉 首先引入kernel-sms包
<dependency><groupId>cn.stylefeng.roses</groupId><artifactId>kernel-sms</artifactId><version>3.0.4</version>
</dependency>
👉 如果是用阿里云的短信,就再加上阿里云的sdk
<dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId><version>4.4.6</version>
</dependency>
<dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-ecs</artifactId><version>4.17.6</version>
</dependency>
如果用腾讯云就再加上腾讯云的sdk
<dependency><groupId>com.tencentcloudapi</groupId><artifactId>tencentcloud-sdk-java</artifactId><version>3.1.57</version>
</dependency>
👉 在管理系统后台,配置相关的key和secret属性
👉 在Configuration类中配置短信发送器SmsSender,如果是用腾讯云,对应的就用TencentSmsSender
/*** 短信发送配置,短信发送的配置属性都在数据库的sys_config表中* <p>* 默认开启了阿里云的短信配置** @author stylefeng* @date 2020/6/6 22:27*/
@Configuration
public class SmsSenderConfig {/*** 短信发送器(阿里云)** @author stylefeng* @date 2020/6/6 22:30*/@Beanpublic SmsSender aliyunSmsSender() {// 从数据库配置读取阿里云配置AliyunSmsConfigs aliyunSmsConfigs = ConstantContextHolder.getAliyunSmsConfigs();AliyunSmsProperties aliyunSmsProperties = new AliyunSmsProperties();BeanUtil.copyProperties(aliyunSmsConfigs, aliyunSmsProperties);return new AliyunSmsSender(new MapBasedMultiSignManager(), aliyunSmsProperties);}}
👉 之后,在程序中,就可以注入SmsSender来发送短信了,参考cn.stylefeng.guns.sys.modular.sms.controller.SmsSenderController
类
/*** 发送短信* <p>* 如果是腾讯云,params要用LinkedHashMap,保证顺序** @param phone 电话号码* @param templateCode 模板号码* @param params 模板里参数的集合* @author fengshuonan* @date 2018/7/6 下午2:32*/
void sendSms(String phone, String templateCode, Map<String, Object> params);
#2.5 邮件
👉 同发送短信一样,首先引入发送邮件的核心包
<!--邮件发送服务-->
<dependency><groupId>cn.stylefeng.roses</groupId><artifactId>kernel-email</artifactId>
</dependency>
👉 在后台界面,配置邮件发送需要的一些参数
👉 在Configuration中配置发送邮件用的类
/*** 邮件发送控制器** @author stylefeng* @date 2020/6/6 22:27*/
@Configuration
public class MailSenderConfig {/*** 邮件发射器** @author stylefeng* @date 2020/6/9 23:13*/@Beanpublic MailSender mailSender() {EmailConfigs emailConfigs = ConstantContextHolder.getEmailConfigs();MailAccount mailAccount = new MailAccount();BeanUtil.copyProperties(emailConfigs, mailAccount);return new SimpleMailSender(mailAccount);}}
👉 这样就可以通过MailSender来发送邮件了,参考cn.stylefeng.guns.sys.modular.email.controler.EmailControlle
r类
/*** 邮件收发统一接口** @author fengshuonan* @date 2018-07-08-下午3:26*/
public interface MailSender {/*** 发送普通邮件** @author fengshuonan* @Date 2018/7/8 下午3:34*/void sendMail(SendMailParam sendMailParam);/*** 发送html的邮件** @author fengshuonan* @date 2020/6/9 22:58*/void sendMailHtml(SendMailParam sendMailParam);}
#3. 日志管理
日志包含了用户的访问日志和操作日志。
#3.1 访问日志
在用户登录和登出时,记录的日志。
#3.2 操作日志
在用户进行业务操作时候记录的日志,查看详情可以看请求类,参数,响应结果。
👉 如何记录操作日志?
一般操作日志加在controller层,只需要通过@BusinessLog
注解即可完成,opType可以设置操作的类型。
例如:
@BusinessLog(title = "系统用户_查询", opType = LogAnnotionOpTypeEnum.QUERY)
public ResponseData page(SysUserParam sysUserParam) {return new SuccessResponseData(sysUserService.page(sysUserParam));
}
#4. 系统监控
系统监控指对系统运行环境,在线用户,数据源管理的监控。通过监控页面可以实时看到系统运行的一些情况。
#4.1 服务监控
对服务器的运行状态,内存,虚拟机信息进行查看。
#4.2 在线用户
可以对当前系统的在线用户进行查看。还可以在线踢人。
#4.3 数据监控
这个页面是一个内嵌的iframe,引用的外部地址,所以要先看下菜单配置的这个url是否正确。
👉 检查一下这个外链地址,根据你的情况配置,如果是本机,就配置成http://localhost:82/druid/login.html
👉 点开之后,需要登录:
👉 账号密码,在开发管理->系统配置中进行设置,如下:
👉 可以看到,默认设置了空值(因为处于安全考虑),如果是空的话,会在系统启动时候,自动初始化一个随机的账号密码:
在这里可以看到账号和密码
#5. 通知公告
在线进行通知和公告的发布。
#5.1 通知公告
#5.1.1 新增通知和公告
发布公告时候,输入标题,类型,内容,选择收件人即可发起通知。
👉 通知和公告的区别,这里没有实际业务意义,只是一个标识。
#5.2 已收公告
发布公告给对应的人员后,可通过已收公告功能,查看已收的信息。
#6. 文件管理
文件管理菜单包含对系统内文件的查看,也可以在本页面上传文件。
#6.1 系统文件
系统文件包含了系统内所有的文件信息记录。针对已经上传的文件,可以进行下载,如果是图片类型,本页面还包含在线预览的功能。
👉 本系统的文件都存在sys_file_info
表中,文件表中包含了文件id,文件大小,文件存储的位置和bucket等等。
👉 特地说一下,文件的存储位置,目前有4中,第一种是阿里云oss,第二个是腾讯云的cos,第三个是minio服务器,第四个是本地存储。
默认激活的是本地存储文件。
👉 bucket是抽象出的概念,其实就是文件夹的意思。
👉 下面分开说一下每种存储的用法和注意事项。
另外,文件存储的代码也都封装在roses-kernel包中,目的是为了给任何项目都可以用。
https://gitee.com/stylefeng-Roses/roses-kernel/tree/new-cloud/
#6.1.1 阿里云存储文件
阿里云存储文件需要先去阿里云申请key和secret(此处略)。
👉 pom中增加对阿里云oss的引用:
<!--阿里云和腾讯云oss-->
<dependency><groupId>cn.stylefeng.roses</groupId><artifactId>kernel-file</artifactId><version>3.0.4</version>
</dependency>
<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.8.0</version>
</dependency>
👉 之后在config包中增加oss的配置类。
/*** 阿里云的文件上传配置** @author fengshuonan* @date 2020/9/13 10:10*/
@Bean
public AliyunFileOperator fileOperator() {AliyunOssProperties aliyunOssProperties = new AliyunOssProperties();aliyunOssProperties.setAccessKeyId("xxxx");aliyunOssProperties.setAccessKeySecret("xxxx");return new AliyunFileOperator(aliyunOssProperties);
}
👉 系统默认激活的是本地存储,启动其他存储方式,先把FileConfig中的其他FileOperator删除掉。
👉 之后就可以用FileOperator类的接口进行文件操作了。
#6.1.2 腾讯云cos
👉 第一步先pom加引用:
<!--阿里云和腾讯云oss-->
<dependency><groupId>cn.stylefeng.roses</groupId><artifactId>kernel-file</artifactId><version>3.0.4</version>
</dependency>
<dependency><groupId>com.qcloud</groupId><artifactId>cos_api</artifactId><version>5.6.23</version>
</dependency>
👉 第二步增加Configuration配置:
/*** 腾讯云文件配置** @author fengshuonan* @date 2020/9/13 10:23*/
@Bean
public TenFileOperator fileOperator() {TenCosProperties tenCosProperties = new TenCosProperties();tenCosProperties.setSecretId("xxxx");tenCosProperties.setSecretKey("xxxx");return new TenFileOperator(tenCosProperties);
}
#6.1.2 minio
暂无封装
#6.1.3 本地文件
系统默认激活的是本地文件上传,可以在FileConfig中查看配置。
/*** 本地文件操作客户端** @author stylefeng* @date 2020/6/9 21:39*/
@Bean
public FileOperator fileOperator() {LocalFileProperties localFileProperties = new LocalFileProperties();String fileUploadPathForWindows = ConstantContextHolder.getDefaultFileUploadPathForWindows();if (ObjectUtil.isNotEmpty(fileUploadPathForWindows)) {localFileProperties.setLocalFileSavePathWin(fileUploadPathForWindows);}String fileUploadPathForLinux = ConstantContextHolder.getDefaultFileUploadPathForLinux();if (ObjectUtil.isNotEmpty(fileUploadPathForLinux)) {localFileProperties.setLocalFileSavePathLinux(fileUploadPathForLinux);}return new LocalFileOperator(localFileProperties);
}
#6.2 上传文件
👉 上传文件的操作可以在SysFileInfoController控制器中找到相关的代码。
在业务中若需要使用文件上传功能,一般都先用通用的上传文件接口/sysFileInfo/upload
,调用上传文件接口上传后,会返回给你一个文件id,也就是sys_file_info表的主键id
之后,在你的业务表中加一个文件id字段维护这个文件就可以了。
/sysFileInfo/upload
这个接口的核心业务只有两个,第一个是调用fileOperator进行文件上传,第二个是把文件信息存入sys_file_info表中。
#7 定时任务
定时任务采用了hutool的定时任务工具类。
#7.1 新建定时任务
新增定时任务前,需要先创建定时任务类。
👉 定时任务类需要遵循一定的规范,也就是实现TimerTaskRunner
接口,并且需要把这个类装配到spring容器中。
例如,下边就是一个标准的定时任务类:
import cn.stylefeng.guns.core.timer.TimerTaskRunner;
import org.springframework.stereotype.Component;/*** 这是一个定时任务的示例程序** @author stylefeng* @date 2020/6/30 22:09*/
@Component
public class SystemOutTaskRunner implements TimerTaskRunner {@Overridepublic void action() {System.out.println("一直往南方开!一直往南方开!");}}
👉 创建完定时任务类之后,就可以在界面上添加定时任务类了。
添加定时任务需要遵守以下几个规范:
👉 任务class类名直接下拉选,系统初始化的时候会读取所有TimerTaskRunner的实现类。
👉 任务表达式是5-7端的cron表达式,可以使用这个工具生成https://cron.qqe2.com/