miya-system作为一个业务模块,可直接启动,也可被其他业务模块依赖。
- 默认密码
新建用户的默认密码和重置用户密码时的默认密码可通过创建SysUserCustomizer
bean来修改,如果你想设置初始密码为手机号后六位,那可以:
@Bean
public SysUserCustomizer sysUserCustomizer() {
return SysUserCustomizer.builder().passwordGeneratorForNewUser(u -> {
String phone = u.getPhone();
return phone.substring(phone.length() - 7, phone.length() - 1);
}).build();
}
- 用户首选项
TODO
非常朴实无华的部门管理功能,暂无任何扩展点
-
功能定义
miya认为web系统中的功能是一组前端资源(路由/按钮/其他业务组件)和一组后端接口的组合。 且定义功能时,功能正在开发。由此,功能的定义是在后端的classpath中的
business.json
文件中编写,如:
[
{
"name": "系统",
"code": "sys",
"children": [
{
"name": "角色",
"code": "role",
"children": [
{
"name": "查看",
"code": "view"
},
{
"name": "新增",
"code": "add"
}
]
}
]
}
]
以上文件描述了系统中角色模块中有两个功能,查看和新增。其中每一个功能都对应一个code,将功能节点的code和所有父节点用:连接起来即是该功能的fullCode,
Miya使用fullCode来表示一个功能的唯一性,如【角色查看】功能的fullCode为sys:role:view
,前端也通过fullCode来控制菜单、路由、或其他组件的显隐
Miya默认搜索以下位置的business.json文件来作为功能定义文件config/business.json, business.json, business/*.json, config/business/*.json
你也可以通过以下方式更改这个设置
@Bean
public SysUserCustomizer sysUserCustomizer() {
return SysUserCustomizer.builder().businessFileName(Collections.singletonList("function.json")).build();
}
- api权限控制
定义好了功能文件,配置功能权限变的简单起来,只需在controller方法上加上注解@Acl(business = "sys:user:add")
- 无需登录即可访问 加上
@Acl(userType = Acl.NotNeedLogin.class)
- 区分系统中有多种类型的用户
如后台的管理员用户SysUser和手机app的客户Customer,你需要防止app用户带着token访问后端接口,那只需要标明用户类型即可,
如
@Acl(business = "sys:user:view", userType = SysUser.class)
- 类级别配置 你也可以在controller class上指定这些,该类中所有方法将会生效,且可被方法级别的注解覆盖
- 无需登录即可访问 加上
- 系统默认角色
开发中总是会遇到有特殊的角色需进行特殊处理。这时只需定义枚举类且实现
DefaultRole
接口,方便判断。
boolean isAdmin = SysDefaultRoles.ADMIN.hasThisRole(user);
- 数据权限
TODO
Emmm, 好像没什么可说的,非常常用和普通的数据字典模块,几乎不需要扩展点,直接用就好。
Miya编写了3套存储文件的实现,使用方式如下
- 裸文件系统
BareSysFileService
config.oss.type=bare
# 指定文件存储位置
config.oss.bare.upload-absolute-path=/upload
- Minio
MinioSysFileService
config.oss.type=minio
config.oss.minio.endpoint=
config.oss.minio.bucket-name=
config.oss.minio.access-key=
config.oss.minio.secret-key=
如果bucket没有被创建,服务会自动创建bucket
3. Aliyun Oss AliyunSysFileService
config.oss.type=aliyun
config.oss.aliyun.endpoint=
config.oss.aliyun.bucket-name=
config.oss.aliyun.secret-key=
config.oss.aliyun.access-key=
如果bucket没有被创建,服务会自动创建bucket
实现SysFileService
接口并注册为bean即可。
- 事件方式记录日志(可将业务事件继承自LogEvent,则会同时记录日志,不必单独分发LogEvent事件)
LogEvent event = new LogEvent(content, operationType, businessId, extra);
applicationContext.publishEvent(event);
- 日志服务记录日志
logService.log(content, operationType, businessId, extra);
可管理对系统的动态调整配置,可存放业务配置
配置发件邮箱
@Bean
public MailAccount mailAccount(){
MailAccount account = new MailAccount();
account.setHost("smtp.qq.com");
account.setPort(587);
account.setAuth(true);
account.setFrom("from");
account.setUser("user");
account.setPass("pass");
return account;
}
然后
private final EMailService emailService;
emailService.sendText(emails, "subject", "content");
TODO ResponseCode
TODO
TODO
TODO
TODO
TODO
很多系统中将功能定义放置到数据库中,且配有界面方便进行动态配置,但其实我们在UI界面增加这一菜单后,只是多了个菜单,并不意味着 这个功能开发好了。功能的菜单和实现功能的代码是强耦合的,独立的菜单是无意义的。 将需要控制权限的功能放在json中,在开发功能时去维护,功能标识code和功能代码同时维护是合理的。前后端通过fullCode统一
mvn clean install org.apache.maven.plugins:maven-deploy-plugin:2.8:deploy -DskipTests
* 数据库
* 邮件 (optional)
* Aliyun SMS (optional)
* 阿里云 OSS (optional)
* Redis (optional)
* ElasicSearch (optional)