ReturnTmp's Blog ReturnTmp's Blog
首页
基础课程
编程语言
框架技术
运维笔记
人工智能
随笔摘录
  • 友链
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

ReturnTmp

分享有趣好玩的计算机知识
首页
基础课程
编程语言
框架技术
运维笔记
人工智能
随笔摘录
  • 友链
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • GLIBC_2.28 not found 问题解决
  • Monorepo 多项目单仓库
  • Renovate 第三方依赖更新监控
  • 【IDEA】Maven 构建项目生成文件解析
  • K8s

  • Zotero 使用指南
  • package-lock.json 是否提交问题
  • 『ARM』和『x86』处理器架构解析指南
  • GlassFish 安装配置
  • 手把手教你安装配置『Oracle Database 19c』
  • Oracle Database 19c 彻底卸载
  • 语雀故障回顾
  • OpenStack 云计算平台 Nova 计算服务学习指南
  • Vue devServer 教程
  • Swagger 导出 API 文档
  • MapStruct POJO 映射框架指南
  • IDEA 代码热部署和热加载
  • SpringBoot 启动参数配置
  • Nacos 入门指南
  • seleuim 指南
  • Spring 服务降级熔断
  • Maven BOM 解析
  • .vscode 文件夹
  • Spring Security Token 认证
  • SpringBoot 基于 Actuator 和 Admin 实现应用监控管理
  • SPM/SCM 流量跟踪体系
  • Netty 入门
  • Flyway 数据库版本管理实战指南
  • Swagger 2 和 3 安装区别
  • MP 配置分页
  • MySQL 分库分表
  • Git Commit 提交规范,变更日志、版本发布自动化和 Emoji 提交标准
  • VSCode 插件 i18n Ally 进行国家化配置
  • Vue3 组合式 全局挂载
  • TS 教程
  • 架构解析:同城双活、异地多活、单元化架构
  • Spring 跨域配置
  • SpringCloud 微服务实战
  • Sentinel 流量治理组件教程
  • leetcode 上分
  • JMeter 压测
  • Netty IM 系统
  • IDEA 插件开发
  • SpringBoot 邮件服务 集成配置 详解
  • Maven 依赖包冲突问题解决
  • 社区项目 forest 修改
    • 前言
    • 开始
    • 数据库
    • 修改简介
    • 一键改包
      • 后端(数据库)
      • 前端
    • 修复
    • 其他
    • 检索引擎
    • 安全性
    • 参考链接
  • Maven 项目命名规范
  • 新版 PyCharm 设置 Conda 虚拟环境
  • 框架工具
ReturnTmp
2024-03-22
目录

社区项目 forest 修改

# 前言

本文为 RYMCU (opens new window) 社区系统项目学习记录,我将会在 review 项目的过程中逐步改进不合理代码,同时修改部分 bug,最后加入部分新 feature,最后

# 开始

# 数据库

目前所有表前缀均为 forest,并不合理,需要集体修改表名称,根据不同功能划分不同前缀,粗略分为

  • system:用于存储系统级别的配置信息或者系统管理相关的表。例如,存储系统设置、权限管理等信息。
  • member:用于存储与会员、用户或者客户相关的信息。例如,用户账户信息、会员等级信息、用户日志等。
  • infra:用于存储基础设施或者基础数据相关的表。例如,存储地区信息、货币信息、语言信息等。
  • qrtz:用于存储与调度、定时任务相关的表。例如,存储定时任务的调度信息、任务执行记录等。

手动修改 mysql 表前缀可能比较麻烦,可以使用类似下面 sql 语句实现

下面的语句会生成对应的表 alter 修改语句,之后自行执行得到的 alter 修改语句,即可使得所有 forest 前缀的表转换为 system 前缀(当然 alter 语句可以自行修改)

SELECT  
    CONCAT(  
        'ALTER TABLE ',  
        table_name,  
        ' RENAME TO system_',  
        SUBSTRING(table_name, 8),
        ';'  
    )  
FROM  
    information_schema.TABLES  
WHERE  
    table_name LIKE 'forest%';
1
2
3
4
5
6
7
8
9
10
11
12

注意,里面的数字 8 是截取字符串的长度,长度为前缀(forest)字母长度加 2,所以其他表需要自行修改

entity,mapper 修改脚本如下,依次执行,之后删除原本文件夹,重命名新文件夹即可

public class FilePrefixProcessTests {
    public static void main(String[] args) {
        //String sourceFolder = "/path/to/source/folder";
        //String destinationFolder = "/path/to/destination/folder";
        String sourceFolder = "E:\\Internship\\Projects\\BBS论坛\\forest\\src\\main\\java\\com\\rymcu\\forest\\entity";
        String destinationFolder = "E:\\Internship\\Projects\\BBS论坛\\forest\\src\\main\\java\\com\\rymcu\\forest\\entity2";

        File sourceDir = new File(sourceFolder);
        File destDir = new File(destinationFolder);

        // 创建目标文件夹
        if (!destDir.exists()) {
            destDir.mkdirs();
        }

        // 获取源文件夹下的所有 Java 文件
        File[] files = sourceDir.listFiles((dir, name) -> name.endsWith(".java"));

        if (files != null) {
            for (File file : files) {
                try {
                    processFile(file, destDir);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        } else {
            System.out.println("No Java files found in the source folder.");
        }
    }

    private static void processFile(File file, File destDir) throws IOException {
        BufferedReader reader = new BufferedReader(new FileReader(file));
        String line;
        StringBuilder content = new StringBuilder();

        // 逐行读取文件内容并进行处理
        while ((line = reader.readLine()) != null) {
            // 判断当前行是否包含 @Table(name = "forest_*")
            if (line.contains("@Table(name = \"forest_")) {
                // 使用正则表达式替换
                line = line.replaceAll("@Table\\(name = \"forest_(.*?)\"\\)", "@Table(name = \"system_$1\")");
            }
            content.append(line).append("\n");
        }
        reader.close();

        // 创建目标文件并写入处理后的内容
        String destFilePath = destDir.getAbsolutePath() + File.separator + file.getName();
        BufferedWriter writer = new BufferedWriter(new FileWriter(destFilePath));
        writer.write(content.toString());
        writer.close();

        System.out.println("Processed file: " + file.getName());
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57

注意文件 src/main/java/com/rymcu/forest/lucene/model/UserDic.java 文件中也定义表,需要手动修改

数据库表补充,原作者删除了这些表,应该是前端不再使用相关接口

CREATE TABLE system_special_day (  
    id bigint NOT NULL AUTO_INCREMENT COMMENT '主键',  
    special_day_name varchar(255) DEFAULT NULL COMMENT '名称',  
    weights int DEFAULT NULL COMMENT '权重/优先级,小数优秀',  
    start_time datetime DEFAULT NULL COMMENT '开始时间',  
    expiration_time datetime DEFAULT NULL COMMENT '过期时间',  
    is_repeat int DEFAULT NULL COMMENT '是否重复',  
    repeat_cycle int DEFAULT NULL COMMENT '重复周期',  
    repeat_cycle_unit int DEFAULT NULL COMMENT '0:天1:周2:月3:年',  
    created_time datetime DEFAULT NULL COMMENT '创建时间',  
    img_url varchar(255) DEFAULT NULL COMMENT '图片路径',  
    css_style varchar(255) DEFAULT NULL COMMENT '执行全局样式',  
    PRIMARY KEY (id)  
) COMMENT '特殊日期' ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE system_permission (
    id bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
    permission_category varchar(255) DEFAULT NULL COMMENT '权限标识',
    PRIMARY KEY (id)
) COMMENT='权限表' ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 修改简介

技术开发分享社区,你可以在这里分享有关技术开发的独特见解,或是

数据库 system_article、system_article_content 不建议直接修改数据库内部,可以在前端删除文章,再重新创建

给新人的一封信内容

您好,欢迎来到 RYMCU 社区,RYMCU 是一个嵌入式知识学习交流平台。RY 取自”容易”的首字母,寓意为让电子设计变得 so easy。

## 新手的疑问

初学者都有很多疑问,在这里对这些疑问进行一一解答。

- 我英语不好,可以学习编程吗?
  对于初学者来说,英语不是主要的障碍,国内有着充足的中文教程。但在接下来的学习过程中,需要阅读大量的英文文档,所以还是需要有一些英语基础和理解学习能力,配合翻译工具(如百度翻译)进行理解。
- 我数学不好,可以学习编程吗?
  对于初学者来说,有必要掌握数学逻辑思维和解决问题的思路,这些能力都在数学学习中得到锻炼,想必学习编程的人数学成绩肯定不错。初学者不需要多高的数学知识水平,但在未来的学习过程中需要更高级的数学知识,应随时做好接受学习新知识的准备。
- 我想学习编程,大佬可以教教我吗?
  一般我是拒绝的,我认为学习是互相促进的过程,而不是单方面的输出,并且我也有很多事情要做。不仅是我,绝大多数人都会拒绝。
- 学习编程是使用 IDE 好还是 Notepad 好?
  最近看到有人在争论这个问题,使用 IDE 是新手的不二选择。
- 好吧,我自学编程,有问题可以问大佬吗?
  可以,但是我拒绝回答书中的基础问题和可以通过搜索引擎解决的问题。
- 学习编程是看书好还是看视频好?
  萝卜青菜,各有所爱,关键是看哪种方式能让你更好理解和学习。我个人是喜爱书本,可以随时查阅资料,非常方便。
- 我学习了很久,但没有成效,我是不是没有天赋?
  我个人觉得对于入门的学习来说,天赋对于学习的影响微乎其微,如果你的学习效率低下,考虑是不是以下原因:

  - 单纯的努力不足,三天打鱼两天晒网。如果不能改正,不如考虑干点别的。
  - 数学逻辑思维和解决问题的能力不足。这个可以学习一些简单易懂的教程,看看视频等,慢慢锻炼,没有任何捷径。
  - 学习方法不对,主要是练得少。只翻书和看视频是没有用的,必须配合大量的练习。个人推荐的方法是:
    - 看完书以后把书上给出的例题再敲一遍,不是照着书上写。
    - 把课后习题都给做了。
    - 做几个自己感兴趣的项目。
    - 对于自己不懂的问题,先看看书,再百度谷歌,最后才询问他人。

## 提问的方法

当你遇到**使用搜索引擎、查阅相关文档、进行 Debug**(如果没有做过上述操作的话,请立刻去做)也无法解决的问题的时候,你可能会向别人求助。现在就来讲讲如何正确提问。

当你进行提问时,请保证你准确提供了以下信息:

- 准确的描述你的需求和实际问题情况。
- 准确的描述你所在的平台的信息。例如:
  - 开发板型号
  - 运行程序( IDE 等)名称及其版本
  - Windows/Linux/MacOS 任一平台及其版本
  - 依赖的类库及其版本
- 提供你的源代码,将源代码包括开发环境完整上传至源码托管平台(如 Github)。
- 提供你的完整日志、异常输出。

如果你在社区提问,请在你的标题也简略的包含问题描述和平台信息。例如 `stm32f103x 开发板` `win10` 运行串口通信程序时,中文显示乱码

如果你想学习更多关于提问的方法、技巧、礼仪,看看[提问的智慧](https://rymcu.com/article/80)会给予你许多帮助。

## 自学的方法

- 每当学习到新知识的时候应该及时的练习和实践
- 多看看开发文档,每次你都能获得新的收获
- 多看看别人的源代码,很多问题都能得到解决
- 搜索引擎是一个好东西
- 写学习笔记和博客是记录知识的好方式,但不是死记知识点
- 好的提问方式才能获得正确答案
- 合理的规划学习时间,而不是三天打鱼两天晒网

## C 语言基础教程

- [C 语言中文教程](https://doc.yonyoucloud.com/doc/wiki/project/c/c-intro.html)
- [C语言小白变怪兽](http://c.biancheng.net/c/)

## 单片机基础教程

- [51 单片机入门教程(Keil4 版)](https://rymcu.com/portfolio/42)
- [STM32 独家入门秘籍](https://rymcu.com/portfolio/11)
- [51 单片机入门教程(VS Code 版)](https://rymcu.com/portfolio/41)

## 其他教程

- [markdown 教程](https://rymcu.com/guides/markdown)
- [社区编辑器使用教程](https://rymcu.com/guides/vditor)

## 推荐书籍

- 《C 程序设计语言( 第 2 版 ) 》 —— [美] 布莱恩·W.克尼汉(Brian W.Kernighan),[美] 丹尼斯·M.里奇(Dennis M.Ritchie) 著
- 《软技能: 代码之外的生存指南》—— [美] 约翰 Z.森梅兹(John Z.Sonmez) 著
- 《大教堂与集市》—— [美] Eric S Raymond 著
- 《黑客与画家》—— [美] Paul Graham 著

## 愿景

> 关于更多的信息请阅读 [《RYMCU 白皮书》](https://rymcu.com/article/115)

我们致力于构建一个即严谨又活泼、专业又不失有趣的开源嵌入式知识平台。在这里我们可以畅所欲言、以平等、自由的身份获取和分享知识。在这里共同学习、交流、进步、成长。

## 行为准则

> 详细行为准则请参考 [参与者公约](https://rymcu.com/article/20)

无论问题简单与否,欢迎大家积极留言、评论、交流。对他人多一些理解和包容,帮助他人解决问题和自我提升是我们的终极目标。
欢迎您发表原创文章、分享独到见解、作出有价值的评论。所有原创内容著作权均归作者本人所有。所发表内容不得侵犯企业或个人的合法权益,包括但不限于涉及个人隐私、造谣与诽谤、商业侵权。

## 其他

### 微信公众号

![qrcodeforgh245b3234e782258.jpg](https://static.rymcu.com/article/1642081054095.jpg)

### github

[RYMCU](https://github.com/rymcu)

### gitee

[RYMCU 社区](https://gitee.com/rymcu-community)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109

# 一键改包

# 后端(数据库)

与项目名称有关系的有如下

每个文件的包位置,导入的包位置,entity 实体类数据库表对应,xml 中的数据库表

pom 中相关代码,还有讲启动类也是与项目名有关,也需要更改

数据库名称之后需自行修改

application.yml

# 以下需要手动改动
logging:  
  level:  
    com:  
      rymcu: info
1
2
3
4
5

我默认没有替换 sql 内容(只有 sql 文件名改变),所以建议按照上面章节自行修改数据库和代码后,再生成新 sql 文件

对于 docker-compose.yml ,有两个自定义容器名修改,可自行改动

项目根目录 Dockerfile 有关 rymcu 自行修改

最后修改 mysql 数据库名即可,或是直接新建数据库再导入数据也可以(推荐)

# 前端

针对后端接口 config\api.config.js

# 修复

# 其他

部分文件夹下添加 pacakge-info.java,提供包级的文档说明或者是包级的注释,示例如下

/**
* This is domain module, the core business logic is implemented here.
*
*/
package com.rickie.tracking.domain;
1
2
3
4
5

注意,只不过创建该文件在 idea 中应该选择普通文件,如果选择创建 Java Class 则会失败

# 检索引擎

lucene 初始创建是比较耗时间的,

这部分设计者选用 lucene 而不是 solr,我猜测应该是想要实现更加细节的 api,对检索实现更细粒度的控制

分词器默认字典,题词字典,扩展字典,停止词字典等均在 resources/lucene 目录下

我暂时不清楚设计者的意图,后面会逐步修改

# 安全性

JwtConstants.JWT_SECRET 签名密钥(也叫做盐)直接硬编码在源代码中,不够安全(虽然设计者在注释中强调上线需变更),并且修改起来也不够方便

加盐(Salt)是将随机数添加到原始密码数据中,以增加密码的复杂度,并防止密码散列的彩虹表攻击

# 参考链接

  • MYSQL批量修改表前缀与表名sql语句 - 慕尘 - 博客园 (cnblogs.com) (opens new window)
  • 开源项目 package-info.java 文件-腾讯云开发者社区-腾讯云 (tencent.com) (opens new window)
  • 如何使用分页插件 (pagehelper.github.io) (opens new window)
  • Shiro安全框架【快速入门】就这一篇! - 我没有三颗心脏 - 博客园 (cnblogs.com) (opens new window)
  • TransactionalEventListener使用场景以及实现原理,最后要躲个大坑 - 掘金 (juejin.cn) (opens new window)
  • Lucene还可以这样玩?SpringBoot集成Lucene实现自己的轻量级搜索引擎 (opens new window)
  • jwt生成token 加盐-掘金 (juejin.cn) (opens new window)
编辑 (opens new window)
上次更新: 2024/03/24, 08:31:38
Maven 依赖包冲突问题解决
Maven 项目命名规范

← Maven 依赖包冲突问题解决 Maven 项目命名规范→

最近更新
01
百度网盘加速
03-24
02
新版 PyCharm 设置 Conda 虚拟环境
03-24
03
腾讯云域名转到阿里云
03-24
更多文章>
Theme by Vdoing | Copyright © 2023-2024 ReturnTmp | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式