• 肝了一个半月的 Java 项目快速开发脚手架:Chewing


    前言

    闲来无事,整一个 Java 项目快速开发脚手架。

    正文

    一、简介

    Chewing 是一个简单的 Java 项目快速开发脚手架。既适合需要开发小型项目的小伙伴使用,也适合刚入门的新手用来学习一些常用的技术。

    二、源码

    三、核心技术

    1、后端

    • SpringBoot:Web 应用框架。
    • MyBatis:持久层框架。
    • MySQL:关系型数据库。
    • Redis:缓存数据库。
    • RabbitMQ:消息队列中间件。

    2、前端

    • Thymeleaf:模板引擎。
    • Bootstrap:UI 框架。

    四、环境部署

    1、准备工作

    • JDK 1.8
    • MySQL 5.7
    • Maven 3.x
    • Redis
    • RabbitMQ

    2、必要配置

    • application.properties 配置文件:数据库、Redis、RabbitMQ、邮箱等配置。
    • config/myconfig.properties 配置文件:系统相关的自定义配置。

    五、项目介绍

    1、文件结构

    src/main/java
        |— com.jingqueyimu
            |— annotation        // 注解
            |— aspect        // 切面
            |— config        // 配置
            |— constant        // 常量
            |— context        // 上下文
            |— controller        // 控制层
            |— exception        // 异常
            |— factory        // 工厂
            |— filter        // 过滤器
            |— handler        // 处理器
            |— init        // 初始化
            |— interceptor        // 拦截器
            |— mapper        // 持久层
            |— model        // 数据模型
            |— mq        // 消息队列
            |— schedule        // 调度
            |— service        // 服务层
            |— util        // 工具
            MyAppcation.java        // 应用启动类
    src/main/resources
        |— config        // 配置文件
        |— mapper        // 映射文件
        |— static        // 静态文件
        |— templates        // 页面文件
        application.properties        // 应用配置文件
        quartz.properties        // 调度配置文件
    

    2、代码说明

    (1)路由

    • /api/xxx:需要用户登录。
    • /console/xxx:需要管理员登录,登录、登出等部分接口除外。

    (2)接口规范

    • 页面请求:GET、URL 参数。
    • 接口请求:POST、JSON 参数。

    (3)数据库初始化

    • 初始化配置文件:config/dbinit.json。
    • 配置初始化标识及 SQL 语句。

    初始化示例:

    [
        {
            "initKey": "site_config_20210110",
            "sqls": [
                "INSERT INTO t_site_config (id, code, name, content, description, public_flag, gmt_create) VALUES(NULL, 'site_record_no', '网站备案号', '<a href="https://beian.miit.gov.cn" class="ml-2" target="_blank">备案号</a>', '网站备案号', true, NOW());"
            ]
        }
    ]
    

    (4)文件上传下载

    • 上传单个文件:/file/upload。
    • 上传多个文件:/file/uploads。
    • 下载文件:/file/download。

    (5)Excel 导入导出

    • Excel 导入导出方法:ExcelUtil.importExcel()、ExcelUtil.exportExcel()。
    • Excel 导入导出处理器接口:IExcelImportHandler、IExcelExportHandler。

    导入示例:

    String msg = null;
    try {
        String[] keys = new String[] {"username", "realName", "mobile"};
        msg = ExcelUtil.importExcel(file.getInputStream(), keys, new IExcelImportHandler() {
            
            @Override
            public void handle(JSONObject data) {
                if (StringUtils.isBlank(data.getString("username"))) {
                    throw new RuntimeException("用户名不能为空");
                }
                if (StringUtils.isBlank(data.getString("mobile"))) {
                    throw new RuntimeException("手机号不能为空");
                }
                // 业务处理
            }
        });
        log.info(msg);
    } catch (IOException e) {
        e.printStackTrace();
    }
    

    导出示例:

    ServletOutputStream os = null;
    try {
        String fileName = "用户列表";
        ...
        // 用户列表数据
        List<User> list = userService.list(params);
        // 表头
        String[] headers = new String[] {"编号 ", "用户名", "姓名", "手机号", "邮箱", "注册方式", "注册时间", "上次登录时间", "是否VIP"};
        os = response.getOutputStream();
        // 导出
        ExcelUtil.exportExcel(fileName, list, headers, os, new IExcelExportHandler<User>() {
            
            @Override
            public List<Object> handle(User user) {
                List<Object> rowDatas = new ArrayList<>();
                rowDatas.add(user.getId());
                rowDatas.add(user.getUsername());
                rowDatas.add(user.getRealName());
                rowDatas.add(user.getMobile());
                rowDatas.add(user.getEmail());
                rowDatas.add(RegisterType.getEnum(user.getRegisterType()).getValue());
                rowDatas.add(DateUtil.format(user.getRegisterTime(), "yyyy-MM-dd HH:mm:ss"));
                rowDatas.add(user.getLastLoginTime() == null ? "" : DateUtil.format(user.getLastLoginTime(), "yyyy-MM-dd HH:mm:ss"));
                rowDatas.add(Boolean.TRUE.equals(user.getVipFlag()) ? "是" : "否");
                return rowDatas;
            }
        });
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        ...
    }
    

    (6)获取字典

    • 获取单个字典:/common/dict。
    • 获取多个字典:/common/dicts。

    (7)上下文信息

    • UserContext:用户上下文信息。
    • AdminContext:管理员上下文信息。

    (8)调度

    • 新增调度任务:继承 BaseJob。
    • 调度接口
      • 执行调度任务:/console/schedule_job/run。
      • 修改调度状态:/console/schedule_job/update_status。
      • 修改调度频率:/console/schedule_job/update_cron。

    (9)注解

    • @Lock:分布式锁。
    • @Perm:标注需要管理员权限的接口。

    (10)配置文件

    • 由于个人习惯,项目中使用的是 properties 配置文件,对于习惯使用 yml 配置文件的,请手动修改。
    • 如果要加载自定义的 yml 配置文件,可以使用项目中提供的 YAML 属性源工厂类:YamlPropertySourceFactory。

    代码示例:

    @Component
    @ConfigurationProperties(prefix="test")
    @PropertySource(value="classpath:config/test.yml", encoding="UTF-8", factory=YamlPropertySourceFactory.class)
    public class TestYmlConfig {
        ...
    }
    

    (11)属性名后缀匹配查询条件

    BaseService 中以 JSON 对象为参数的方法,可通过在属性名后面添加后缀,来匹配查询条件。

    • xxx_begin:大于等于。
    • xxx_end:小于等于。
    • xxx_in:IN 查询。
    • xxx_like:模糊查询。
    • xxx_llike:左模糊查询。
    • xxx_rlike:右模糊查询。
    • 其他:等于。
    • 属性值为空:不参与查询。

    代码示例:

    @Test
    public void test() {
        JSONObject params = new JSONObject();
        params.put("username_like", "test");
        List<User> user = userService.list(params);
        System.out.println(user);
    }
    
    @Test
    public void test2() {
        JSONObject params = new JSONObject();
        params.put("username_in", Arrays.asList("test"));
        List<User> user = userService.list(params);
        System.out.println(user);
    }
    

    (12)...

    六、演示图

    1、前台

    2、后台

    结语

    目前,Chewing 还只是提供了一些较为常用的功能(实在是肝不动了)。但是,后续会不断完善、新增功能。有时间的话,也会整一个微服务版的。

    敬请期待~

    交流区


    微信公众号:惊却一目
    个人博客:惊却一目

  • 相关阅读:
    配置VRRP主备功能
    网络拓扑实例02:MSTP功能
    网络拓扑实例01:RSTP功能
    配置PoE交换机功能
    交换机基于接口划分VLAN(汇聚层设备作为网关)
    交换机基于接口划分VLAN(接入层设备作为网关)
    配置交换机Trunk接口流量本地优先转发(集群/堆叠)
    配置交换机之间直连链路聚合-LACP模式
    配置交换机之间直连链路聚合-手工模式
    配置交换机接口二三层切换
  • 原文地址:https://www.cnblogs.com/jingqueyimu/p/14364213.html
Copyright © 2020-2023  润新知