RuoYi学习笔记

RuoYi

学习官方的文档手册时写下这篇。

文档地址

环境部署

注意数据库引擎为新版,连接数据库的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;
    }

多数据源

在实际开发中,经常可能遇到在一个应用中可能需要访问多个数据库的情况,在项目中使用注解来完成此项功能。

在需要被切换数据源的ServiceMapper方法上添加@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 不允许重复提交,请稍后再试 提示消息

本文仅供参考

你可能感兴趣的:(学习,mybatis,java)