1.代码生成导入错误
代码生成过程中用到了MySql的系统库information_schema以及若依自己的库,如果两者字符集信息不同,则会报错;
- 解决办法:
创建若依数据库时参考information_schema库的字符集,确保两者一致,一般同为utf8_genreal_ci或utf8_unicode_ci
2.自定义业务表
准备好业务表SQL,参考 代码生成 部分指导,导出代码包,然后执行下述步骤
- 在若依工程下新建自己的Maven模块,并添加对ruoyi-common的依赖;
- 在若依根工程下pom.xml中添加对此模块的依赖,以及module包含;
- 在ruoyi-admin下添加对此模块的依赖;
- 将代码包中的后台代码放入Maven模块,前端代码放入ruoyi-ui,注意目录对齐;
- 在后端项目中,如果是idea,则需要手动更新下maven依赖缓存,然后再启动项目;
3.自定义业务包路径问题
如果自定义业务包路径不是com.ruoyi开头,则上述操作后,系统运行会出错,管理界面可以出来,但前后台不通;原因是新增的业务逻辑没有加载到,需要手动做如下更改(假设新增业务包com.litian.app):
- 首先,修改application.yml中的mybatis配置,增加新增的实体类包搜索路径:
mybatis:
# 搜索指定包别名
typeAliasesPackage: com.ruoyi.**.domain, com.litian.**.domain
- 然后,修改 RuoYiApplication 启动类,添加新的Mapper搜索路径以及Spring 组件的搜索路径(需要注意的是,ComponentScan默认不配置时,搜索当前包及子包,但一旦配置则只会按照配置的包开始搜索,所以需要把当前的默认包也配置上去; 而MapperScan的行为则不同,当前包不需要配置,否则反而会报错):
@ComponentScan({"com.ruoyi", "com.litian"})
@MapperScan({"com.litian.**.mapper"})
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
public class RuoYiApplication
4.前端页面中使用字典
如果在前端页面中使用到了字典,不管是自定义还是系统预置,均需要手工声明,否则若依的表现就是页面挂起空白;如页面中使用到了如下字典内容:
<el-form-item label="爱好" prop="studentHobby">
<el-select v-model="form.studentHobby" placeholder="请选择爱好">
<el-option
v-for="dict in dict.type.app_user_hobby"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
其中用到了字典类型app_user_hobby,则需要在当前页面的导出部分声明(多值用逗号分隔):
export default {
name: .....,
dicts: ['app_user_hobby'],
5.导出表格选中行
默认情况下,若依会根据当前的查询条件导出所有数据(会把查询参数请求到后台),但是忽略了界面的行选择信息;因此需要手工处理导出选中行的功能;
- 前端的this.ids变量保存了选中记录的ID信息;
- Mapper中新增根据ID查找记录的语句,因为单个分页记录数不多,直接用IN查询:
<select id="selectSysStudentByStudentIds" resultMap="SysStudentResult">
<include refid="selectSysStudentVo"/>
where student_id in
<foreach collection="array" item="id" index="index" open="(" separator="," close=")">
#{id}
</foreach>
</select>
- 在Service及Mapper代码中增加相应的接口:
/**
* 查询学生信息
*
* @param ids 学生信息主键
* @return 学生信息
*/
public List<SysStudent> selectSysStudentByStudentIds(String[] ids);
- 修改Controller,增加一个单独的选择导出方法(其它都和默认导出一样,只修改路径和参数):
/**
* 导出选中学生信息列表
*/
@PreAuthorize("@ss.hasPermi('app:student:export')")
@Log(title = "学生信息", businessType = BusinessType.EXPORT)
@PostMapping("/exports")
public void export(HttpServletResponse response, @RequestParam(value = "ids") String ids)
{
List<SysStudent> list = sysStudentService.selectSysStudentByStudentIds(ids.split(","));
ExcelUtil<SysStudent> util = new ExcelUtil<SysStudent>(SysStudent.class);
util.exportExcel(response, list, "学生信息数据");
}
- 前端页面中,增加分支处理选择导出:
if(this.ids.length > 0){
this.download('app/student/exports', {'ids':this.ids.join(',')}, `student_${new Date().getTime()}.xlsx`)
}else {
this.download('app/student/export', {
...this.queryParams
}, `student_${new Date().getTime()}.xlsx`)
}
至于,为何将ids拼装后再拆分使用,是因为若依的通用download方法会将请求参数进行转换,会将数组对象拆开,后端不方便处理,所以前端将数组拼装成字符串,后端再拆分使用。