学习官方的文档手册时写下这篇。
文档地址
注意数据库引擎为新版,连接数据库的URL(需要加上时区),username,password需要写好。
项目为war包部署。
bootstrap
的轻量级表格插件bootstrap-table(opens new window)mybatis
的轻量级分页插件pageHelper这两个点后续补上。
// 自定义查询,search查询用户名
function queryParams(params) {
var search = $.table.queryParams(params);
search.userName = $("#userName").val(); // 获取用户名
return search; // 返回查询的某个条件
}
@PostMapping("/list")
@ResponseBody
public TableDataInfo list(User user)
{
startPage(); // 此方法配合前端完成自动分页
List<User> list = userService.selectUserList(user);
return getDataTable(list);
}
在需要被导入导出的实体类属性添加@Excel
注解
// 添加$.table.exportExcel按钮事件,导入为importExcel
<a class="btn btn-warning" onclick="$.table.exportExcel()">
<i class="fa fa-download">i> 导出
a>
// 举例说明,还有很多参数
@Excel(name = "用户性别", readConverterExp = "0=男,1=女,2=未知")
private String sex;
@PostMapping("/export")
@ResponseBody
public AjaxResult export(User user)
{
List<User> list = userService.selectUserList(user); // 取出数据到List
ExcelUtil<User> util = new ExcelUtil<User>(User.class); // ExcelUtil的初始化,给一个类
return util.exportExcel(list, "用户数据"); // 使用函数导出
}
导入后端实现:
@PostMapping("/importData")
@ResponseBody
public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
{
ExcelUtil util = new ExcelUtil(SysUser.class); // util
List userList = util.importExcel(file.getInputStream());// 内容导入到List
String operName = ShiroUtils.getSysUser().getLoginName();//通过Shiro获取操作者信息
String message = userService.importUser(userList, updateSupport, operName);
return AjaxResult.success(message);
}
导出导入自定义标题:(核心代码)
util.exportExcel(list, "用户数据", "用户列表");
List<SysUser> userList = util.importExcel(file.getInputStream(), 1);
自定义数据处理器:没看
上传:
@PostMapping("/add")
@ResponseBody
public AjaxResult addSave(@RequestParam("file") MultipartFile file, FileInfo fileInfo) throws IOException
{
// 上传文件路径
String filePath = RuoYiConfig.getUploadPath();
// 上传并返回新文件名称
String fileName = FileUploadUtils.upload(filePath, file); //file为前端传过来的参数
fileInfo.setFilePath(fileName); // 设置fileInfo的参数
return toAjax(fileInfoService.insertFileInfo(fileInfo));
}
下载:
function downloadFile(value){
window.location.href = ctx + "common/download/resource?resource=" + value;
}
/**
* 本地资源通用下载
*/
@GetMapping("/common/download/resource")
public void resourceDownload(String resource, HttpServletRequest request, HttpServletResponse response)
throws Exception
{
// 本地资源路径
String localPath = Global.getProfile();
// 数据库资源地址
String downloadPath = localPath + StringUtils.substringAfter(resource, Constants.RESOURCE_PREFIX);
// 下载名称
String downloadName = StringUtils.substringAfterLast(downloadPath, "/");
response.setCharacterEncoding("utf-8");
response.setContentType("multipart/form-data");
response.setHeader("Content-Disposition",
"attachment;fileName=" + FileUtils.setFileDownloadHeader(request, downloadName));
FileUtils.writeBytes(downloadPath, response.getOutputStream());
}
权限这一块托给Shiro负责。
@RequiresAuthentication
使用该注解标注的类,实例,方法在访问或调用时,当前Subject必须在当前session中已经过认证。@RequiresGuest
使用该注解标注的类,实例,方法在访问或调用时,当前Subject可以是gust身份,不需要经过认证或者在原先的session中存在记录。@RequiresPermissions
当前Subject需要拥有某些特定的权限时,才能执行被该注解标注的方法。如果当前Subject不具有这样的权限,则方法不会被执行。@RequiresRoles
当前Subject必须拥有所有指定的角色时,才能访问被该注解标注的方法。如果当天Subject不同时拥有所有指定角色,则方法不会执行还会抛出AuthorizationException异常。@RequiresUser
当前Subject必须是应用的用户,才能访问或调用被该注解标注的类,实例,方法@Transactional
注解只能应用到public可见度的方法上,可以被应用于接口定义和接口方法,方法会覆盖类上面声明的事务。
事务的传播机制是指如果在开始当前事务之前,一个事务上下文已经存在,此时有若干选项可以指定一个事务性方法的执行行为。
即:在执行一个@Transactinal注解标注的方法时,开启了事务;当该方法还在执行中时,另一个人也触发了该方法;那么此时怎么算事务呢,这时就可以通过事务的传播机制来指定处理方式。
我们在可能发生异常的方法里throw
抛给控制器,然后由全局异常处理器对异常进行统一处理。 所谓全局异常处理器就是使用@ControllerAdvice
注解。
@RestControllerAdvice
public class GlobalExceptionHandler
{
private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);
/**
* 登录异常
*/
@ExceptionHandler(LoginException.class)
public AjaxResult loginException(LoginException e)
{
log.error(e.getMessage(), e);
return AjaxResult.error(e.getMessage());
}
}
在全局处理类中定义各种各样的异常处理函数,如果A出现异常,可以直接写throw new 异常处理函数
。
异常处理函数有很多个,不同的错误对应不同的函数,函数中写的是错误处理。
可以用@Validated
来校验数据,如果数据异常则会统一抛出异常,方便异常中心统一处理。
使用:
// 首先在controller上声明 @Validated 需要对数据进行校验。
public AjaxResult add(@Validated @RequestBody SysUser user)
{
.....
}
// 然后在对应字段Get方法加上参数校验注解,如果不符合验证要求,则会以message的信息为准,返回给前端。
@NotBlank(message = "用户账号不能为空")
@Size(min = 0, max = 30, message = "用户账号长度不能超过30个字符")
public String getUserName()
{
return userName;
}
// 也可以直接放在字段上面声明。
@Size(min = 0, max = 30, message = "用户昵称长度不能超过30个字符")
private String nickName;
在需要被记录日志的controller
方法上添加@Log
注解,使用方法如下:
@Log(title = "用户管理", businessType = BusinessType.INSERT)
public AjaxResult addSave(...)
{
return success(...);
}
log()有许多参数(自行查阅)
需要设置用户只能查看哪些部门的数据,这种情况一般称为数据权限。
默认系统管理员admin
拥有所有数据权限(userId=1)
参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
deptAlias | String | 空 | 部门表的别名 |
userAlias | String | 空 | 用户表的别名 |
在需要数据权限控制方法上添加@DataScope
注解。
说明:接口实现类中添加注解,例如 SysDeptServiceImpl.java文件中:
/**
* 查询部门管理树
*
* @param dept 部门信息
* @return 所有部门信息
*/
@Override
@DataScope(deptAlias = "d")
public List<Ztree> selectDeptTree(SysDept dept)
{
List<SysDept> deptList = deptMapper.selectDeptList(dept);
List<Ztree> ztrees = initZtree(deptList);
return ztrees;
}
在实际开发中,经常可能遇到在一个应用中可能需要访问多个数据库的情况,在项目中使用注解来完成此项功能。
在需要被切换数据源的Service
或Mapper
方法上添加@DataSource
注解,使用方法如下:
// 其中value用来表示数据源名称,除MASTER和SLAVE其他均需要进行配置。
@DataSource(value = DataSourceType.MASTER)
public List<...> select(...)
{
return mapper.select(...);
}
在加入其他的数据库时,需要很多配置,在手册上都有明细说明。
很多代码是重复或者是差不多的,比如select,这时代码生成香的一批。
建表后,代码生成步骤:
1、登录系统(系统工具 -> 代码生成 -> 导入对应表)
2、代码生成列表中找到需要表(可预览、编辑、同步、删除生成配置)
3、点击生成代码会得到一个ruoyi.zip
执行sql
文件,按照包内目录结构复制到自己的项目中即可
开发流程的一般步骤:
1 创建数据库表
2 根据表字段设计实体类
3 编写增删改查dao
4 根据业务写service层
5 web层代码和前台页面
cron代码生成地址:入口
1、在控制层Controller
中添加注解来描述接口信息如:
@Api("参数配置")
@Controller
@RequestMapping("/system/config")
public class ConfigController {...}
2、在方法中配置接口的标题信息
@ApiOperation("查询参数列表")
@ResponseBody
public TableDataInfo list(Config config)
{
startPage();
List<Config> list = configService.selectConfigList(config);
return getDataTable(list);
}
3、在系统工具-系统接口
测试相关接口
在接口方法上添加@RepeatSubmit
注解即可,注解参数说明:
参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
interval | int | 5000 | 间隔时间(ms),小于此时间视为重复提交 |
message | String | 不允许重复提交,请稍后再试 | 提示消息 |
本文仅供参考