SpringBoot+SpringCloud+vue+Element开发项目——业务功能实现
Posted Jansens
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot+SpringCloud+vue+Element开发项目——业务功能实现相关的知识,希望对你有一定的参考价值。
一、工程结构规划
jansens-common:公共代码模块、主要放置一些工具类。
jansens-core:核心业务代码模块,主要封装公共业务模块。
jansens-admin:后台管理模块,包含用户、角色、菜单管理,权限管理等。
jansens-pom:聚合模块,仅为简化打包,一键执行打包所有模块。
新建空的maven工程 jansens-common、jansens-core、jansens-pom并且添加依赖
jansens-core下的pom.xml内添加jansens-common为dependency依赖,然后执行编译打包命令。
jansens-admin下的pom.xml内添加jansens-core为dependency依赖,然后执行编译打包命令。
jansens-pom下的pom.xml内添加 jansens-admin、 jansens-admin、jansens-core为dependency依赖,然后执行编译打包命令。
二、业务代码封装
CurdService.java
import com.read.core.page.PageRequest; import com.read.core.page.PageResult; import java.sql.SQLException; import java.util.List; public interface CurdService<T> { /** * 保存操作 * @param record * @return */ int save(T record); /** * 删除操作 * @param record * @return */ int delete(T record); /** * 批量删除操作 * @param record * @return */ int delete(List<T> record); /** * 根据ID查询 * @param id * @return */ T findById(Long id); /** * 分页查询 * @param pageRequest * @return */ PageResult findPage(PageRequest pageRequest); }
分页请求封装 PageRequest.java Param.java
public class PageRequest { /** * 当前页码 */ private int pageNum = 1; /** * 每页数量 */ private int pageSize = 10; /** * 查询参数 */ private List<Param> params = new ArrayList<Param>(); public int getPageNum() { return pageNum; } public void setPageNum(int pageNum) { this.pageNum = pageNum; } public int getPageSize() { return pageSize; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } public List<Param> getParams() { return params; } }
/** * 分页参数 */ public class Param { private String name; private String value; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } }
分页结果封装 PageResult.java
public class PageResult { /** * 当前页码 */ private int pageNum; /** * 每页数量 */ private int pageSize; /** * 记录总数 */ private long totalSize; /** * 页码总数 */ private int totalPages; /** * 分页数据 */ private List<?> content; public int getPageNum() { return pageNum; } public void setPageNum(int pageNum) { this.pageNum = pageNum; } public int getPageSize() { return pageSize; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } public long getTotalSize() { return totalSize; } public void setTotalSize(long totalSize) { this.totalSize = totalSize; } public int getTotalPages() { return totalPages; } public void setTotalPages(int totalPages) { this.totalPages = totalPages; } public List<?> getContent() { return content; } public void setContent(List<?> content) { this.content = content; } }
分页助手封装 MybatisPageHelper.java
/** * MyBatis 分页查询助手 */ public class MybatisPageHelper { public static final String findPage = "findPage"; /** * 分页查询, 约定查询方法名为 “findPage” * @param pageRequest 分页请求 * @param mapper Dao对象,MyBatis的 Mapper * @return */ public static PageResult findPage(PageRequest pageRequest, Object mapper) { return findPage(pageRequest, mapper, findPage); } /** * 调用分页插件进行分页查询 * @param pageRequest 分页请求 * @param mapper Dao对象,MyBatis的 Mapper * @param queryMethodName 要分页的查询方法名 * @param args 方法参数 * @return */ @SuppressWarnings({ "unchecked", "rawtypes" }) public static PageResult findPage(PageRequest pageRequest, Object mapper, String queryMethodName, Object... args) { // 设置分页参数 int pageNum = pageRequest.getPageNum(); int pageSize = pageRequest.getPageSize(); PageHelper.startPage(pageNum, pageSize); // 利用反射调用查询方法 Object result = ReflectionUtils.invoke(mapper, queryMethodName, args); return getPageResult(pageRequest, new PageInfo((List) result)); } /** * 将分页信息封装到统一的接口 * @param pageRequest * @return */ private static PageResult getPageResult(PageRequest pageRequest, PageInfo<?> pageInfo) { PageResult pageResult = new PageResult(); pageResult.setPageNum(pageInfo.getPageNum()); pageResult.setPageSize(pageInfo.getPageSize()); pageResult.setTotalSize(pageInfo.getTotal()); pageResult.setTotalPages(pageInfo.getPages()); pageResult.setContent(pageInfo.getList()); return pageResult; } }
Http 结果封装 HttpResult.java
/** * HTTP结果封装 */ public class HttpResult { private int code = 200; private String msg; private Object data; public static HttpResult error() { return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, "未知异常,请联系管理员"); } public static HttpResult error(String msg) { return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, msg); } public static HttpResult error(int code, String msg) { HttpResult r = new HttpResult(); r.setCode(code); r.setMsg(msg); return r; } public static HttpResult ok(String msg) { HttpResult r = new HttpResult(); r.setMsg(msg); return r; } public static HttpResult ok(Object data) { HttpResult r = new HttpResult(); r.setData(data); return r; } public static HttpResult ok() { return new HttpResult(); } public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public Object getData() { return data; } public void setData(Object data) { this.data = data; } }
/** * HTTP结果封装 */ public class HttpResult { private int code = 200; private String msg; private Object data; public static HttpResult error() { return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, "未知异常,请联系管理员"); } public static HttpResult error(String msg) { return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, msg); } public static HttpResult error(int code, String msg) { HttpResult r = new HttpResult(); r.setCode(code); r.setMsg(msg); return r; } public static HttpResult ok(String msg) { HttpResult r = new HttpResult(); r.setMsg(msg); return r; } public static HttpResult ok(Object data) { HttpResult r = new HttpResult(); r.setData(data); return r; } public static HttpResult ok() { return new HttpResult(); } public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public Object getData() { return data; } public void setData(Object data) { this.data = data; } }
三、MyBatis分页查询
在jansens-core下的pom.xml文件内添加分页插件依赖包
<!-- pagehelper --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.5</version> </dependency>
在jansens-admin配置文件内容添加分页插件配置
# pagehelper pagehelper: helperDialect: mysql reasonable: true supportmethodsArguments: true params: count=countSql
在DAO添加分页查询的方法
SysUserMapper.java
List<SysUser> findPage();
给SysUserMapper.xml添加查询的方法
SysUserMapper.xml
<select id="findPage" resultMap="BaseResultMap"> select <include refid="Base_Column_List" /> from sys_user </select>
服务层调用DAO层完成分页查询,让SysUserService继承CurdService接口。
SysUserService.java
public interface SysUserService extends CurdService<SysUser> { /** * 查找所有的用户 * @return */ List<SysUser> findAll(); }
SysUserServiceImpl.java
@Service public class SysUserServiceImpl implements SysUserService { @Autowired private SysUserRoleMapper sysUserRoleMapper; @Override public PageResult findPage(PageRequest pageRequest) { return MybatisPageHelper.findPage(pageRequest, sysUserMapper); } }
SysUserController.java
@RestController @RequestMapping("user") public class SysUserController { @Autowired private SysUserService sysUserService; @PostMapping(value="/findPage") public HttpResult findPage(@RequestBody PageRequest pageRequest) { return HttpResult.ok(sysUserService.findPage(pageRequest)); } }
四、导出Excel报表
在jansens-common下的pom文件添加依赖包
<!-- poi --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.0.1</version> </dependency>
SysUserService.java
/** * 生成用户信息Excel文件 * @param pageRequest 要导出的分页查询参数 * @return */ File createUserExcelFile(PageRequest pageRequest);
SysUserServiceImpl.java
@Override public File createUserExcelFile(PageRequest pageRequest) { PageResult pageResult = findPage(pageRequest); return createUserExcelFile(pageResult.getContent()); } public static File createUserExcelFile(List<?> records) { if (records == null) { records = new ArrayList<>(); } Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet(); Row row0 = sheet.createRow(0); int columnIndex = 0; row0.createCell(columnIndex).setCellValue("No"); row0.createCell(++columnIndex).setCellValue("ID"); row0.createCell(++columnIndex).setCellValue("用户名"); row0.createCell(++columnIndex).setCellValue("昵称"); row0.createCell(++columnIndex).setCellValue("机构"); row0.createCell(++columnIndex).setCellValue("角色"); row0.createCell(++columnIndex).setCellValue("邮箱"); row0.createCell(++columnIndex).setCellValue("手机号"); row0.createCell(++columnIndex).setCellValue("状态"); row0.createCell(++columnIndex).setCellValue("头像"); row0.createCell(++columnIndex).setCellValue("创建人"); row0.createCell(++columnIndex).setCellValue("创建时间"); row0.createCell(++columnIndex).setCellValue("最后更新人"); row0.createCell(++columnIndex).setCellValue("最后更新时间"); for (int i = 0; i < records.size(); i++) { SysUser user = (SysUser) records.get(i); Row row = sheet.createRow(i + 1); for (int j = 0; j < columnIndex + 1; j++) { row.createCell(j); } columnIndex = 0; row.getCell(columnIndex).setCellValue(i + 1); row.getCell(++columnIndex).setCellValue(user.getId()); row.getCell(++columnIndex).setCellValue(user.getName()); row.getCell(++columnIndex).setCellValue(user.getNickName()); row.getCell(++columnIndex).setCellValue(user.getDeptName()); row.getCell(++columnIndex).setCellValue(user.getRoleNames()); row.getCell(++columnIndex).setCellValue(user.getEmail()); row.getCell(++columnIndex).setCellValue(user.getStatus()); row.getCell(++columnIndex).setCellValue(user.getAvatar()); row.getCell(++columnIndex).setCellValue(user.getCreateBy()); row.getCell(++columnIndex).setCellValue(DateTimeUtils.getDateTime(user.getCreateTime())); row.getCell(++columnIndex).setCellValue(user.getLastUpdateBy()); row.getCell(++columnIndex).setCellValue(DateTimeUtils.getDateTime(user.getLastUpdateTime())); } return PoiUtils.createExcelFile(workbook, "download_user"); }
SysUserController.java
@PostMapping(value="/exportUserExcelFile") public void exportUserExcelFile(@RequestBody PageRequest pageRequest,HttpServletResponse res) { File file=sysUserService.createUserExcelFile(pageRequest); FileUtils.downloadFile(res,file,file.getName()); }
工具类代码 jansens-common
PoiUtils.java
/** * POI相关操作 */ public class PoiUtils { /** * 生成Excel文件 * @param workbook * @param fileName * @return */ public static File createExcelFile(Workbook workbook, String fileName) { OutputStream stream = null; File file = null; try { file = File.createTempFile(fileName, ".xlsx"); stream = new FileOutputStream(file.getAbsoluteFile()); workbook.write(stream); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { IOUtils.closeQuietly(workbook); IOUtils.closeQuietly(stream); } return file; } }
FileUtils.java
/** * 文件相关操作 */ public class FileUtils { /** * 下载文件 * @param response * @param file * @param newFileName */ public static void downloadFile(HttpServletResponse response, File file, String newFileName) { try { response.setHeader("Content-Disposition", "attachment; filename=" + new String(newFileName.getBytes("ISO-8859-1"), "UTF-8")); BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream()); InputStream is = new FileInputStream(file.getAbsolutePath()); BufferedInputStream bis = new BufferedInputStream(is); int length = 0; byte[] temp = new byte[1 * 1024 * 10]; while ((length = bis.read(temp)) != -1) { bos.write(temp, 0, length); } bos.flush(); bis.close(); bos.close(); is.close(); } catch (Exception e) { e.printStackTrace(); } } }
以上是关于SpringBoot+SpringCloud+vue+Element开发项目——业务功能实现的主要内容,如果未能解决你的问题,请参考以下文章