若依脚手架

wxvirus2023年5月25日
大约 5 分钟

若依脚手架

项目修改

  1. 全局查找替换:com.ruoyi替换成你自己的一个名称,例如:xxx.xxx;选择scope范围会大一点,然后点击replace all

  2. 全体查找替换:3.8.*(后面可能是别的版本了) 是一个脚手架的版本号,改成自己的版本号

  3. 全局查找替换:ruoyi改成自己的项目名,注意:这里要勾选上匹配大小写,将小写的ruoyi进行替换

  4. 若依中文改成自己的项目名

  5. 按下shift F6重命名模块名,选择出现的弹框的第三个,rename module and directory

  6. shift F6修改项目名改成自己的

  7. 修改包名,只修改根包就行,选择修改所有的,此时会出现一堆com包,可以将之删除

  8. 全局搜索一些你现在修改的包的xxx.xxx.common,可能还会有漏掉的一些没改掉,这里还会有一个xxx.xxx.项目.common这样的格式

  9. 搜索“验证码文本生成器”,这里的验证码的配置的包也要改一下

    properties.setProperty(KAPTCHA_TEXTPRODUCER_IMPL, "xxx.xxx.项目名.framework.config.KaptchaTextCreator");
    
  10. 修改xxx-common模块下的config/RuoYiConfig改成自己的名称【可选】

  11. 修改启动类的名称【可选】

  12. 若依启动的图标修改【可选】

  13. 最后退出idea,打开项目目录修改目录名称为项目名

  14. .imltarget以及.idea文件都删了

  15. 重新打开后,发现还有未改的,全局搜索xxx.xxx.system改成xxx.xxx.项目.system

  16. 再次启动之后,配合着若依的前端查看是否有用

  17. banner调整:https://bootschool.net/asciiopen in new window 【可选】

  18. 因为是全局修改的,所以里面自带的一些 SQL 的里面的内容也被修改了,如果已经生成表数据了,也可以选择重新执行一下

前端调整(RuoYi-Vue3)

  • 你可以选择改项目名和文件夹名

  • 以及src/utils/ruoyi.js改成src/utils/youwant.js

    这就得全局搜索@/utils/ruoyi进行批量替换

  • src/assets/styles/ruoyi.scss你也可以选择修改,但是同时也得修改引用它的地方

项目结构分析

  • 依赖链最底层的是common,主要提供一些工具方法和一些依赖
  • 上一层是framework主打配置相关
  • system是系统管理
  • generator是代码生成
  • quartz是做定时任务
  • admin统一入口,controller基本在这个里面写的,会调用上面 3 个各自的service

验证码响应结果分析

{
    "msg": "操作成功",
    "img": "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",
    "code": 200,
    "captchaEnabled": true,
    "uuid": "39858fa857894f69a43a5f27ae71675b"
}

xxx-framework/src/main/java/xxx.xxx.项目.framework.config.CaptchaConfig.java还有一个KaptchaTextCreator.java


槽点:

// KAPTCHA_SESSION_KEY
// 字面意思:将来生产验证码的时候,会自动将验证码的文本存储到 session 中
properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCodeMath");

我们从session里获取的时候,却是null;确实是配置到session里的,上面是自定义接口返回的内容,如果不自定义的话,直接使用kaptcha提供的一个controller,有一个Servlet注册的BeanServletRegistrationBean

@Configuration
public class CaptchaConfig {
    ServletRegistrationBean<HttpServlet> captchaServlet() {
        ServletRegistrationBean<HttpServlet> bean = new ServletRegistrationBean<HttpServlet>();
        bean.setServlet(new KaptchaServlet());
        bean.addUrlMapping("/image");
        bean.addInitParameter(KAPTCHA_BORDER, "yes");
        Properties properties = new Properties();
        // 是否有边框 默认为true 我们可以自己设置yes,no
        properties.setProperty(KAPTCHA_BORDER, "yes");
        // 边框颜色 默认为Color.BLACK
        properties.setProperty(KAPTCHA_BORDER_COLOR, "105,179,90");
        // 验证码文本字符颜色 默认为Color.BLACK
        properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "blue");
        // 验证码图片宽度 默认为200
        properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160");
        // 验证码图片高度 默认为50
        properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60");
        // 验证码文本字符大小 默认为40
        properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "35");
        // KAPTCHA_SESSION_KEY
        properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCodeMath");
        // 验证码文本生成器
        properties.setProperty(KAPTCHA_TEXTPRODUCER_IMPL, "top.wjstar.tienchin.framework.config.KaptchaTextCreator");
        // 验证码文本字符间距 默认为2
        properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_SPACE, "3");
        // 验证码文本字符长度 默认为5
        properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "6");
        // 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize)
        properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier");
        // 验证码噪点颜色 默认为Color.BLACK
        properties.setProperty(KAPTCHA_NOISE_COLOR, "white");
        // 干扰实现类
        properties.setProperty(KAPTCHA_NOISE_IMPL, "com.google.code.kaptcha.impl.NoNoise");
        // 图片样式 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpy
        properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy");
        bean.setInitParameters(new HashMap<>((Map)properties));
        return bean;
    }
}

如果使用kaptcha它提供的,这样配置,session里获取就是有效的;如果是自己写的接口,这个文本需要自己手动写到session里。所以这一行配置可以不需要,一方面这个接口是自定义的,另一方面这里是前后端分离,没有使用session

Loading...