feat(database): 添加 MySQL 数据库支持并迁移数据表结构

- 新增 MySQL 5.7.44 建表脚本,包含分组、图片、Markdown文件等7张表
- 添加 SQLite 转 MySQL 的数据库迁移脚本
- 配置开发环境使用 MySQL 数据源连接
- 更新生产环境配置注释 SQLite 配置并预留 MySQL 配置位置
- 修改前端笔记编辑器保存逻辑,完善笔记更新功能
- 替换 SQLite 驱动为 MySQL 连接器依赖
- 添加 commons-codec 依赖用于 SHA256 计算功能
This commit is contained in:
ikmkj
2026-01-06 21:18:06 +08:00
parent 2c1abafee7
commit a0991db83e
7 changed files with 328 additions and 21 deletions

View File

@@ -71,11 +71,11 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!-- sqlite -->
<!-- MySQL Driver -->
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.36.0.3</version>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
@@ -110,6 +110,7 @@
<!-- 密码加密-->
<!-- SHA256计算工具 -->
<dependency>
<groupId>commons-codec</groupId>

View File

@@ -1,18 +1,31 @@
spring:
datasource:
driver-class-name: org.sqlite.JDBC
url: jdbc:sqlite:C:\it\houtaigunli\biji\mydatabase.db
# driver-class-name: org.sqlite.JDBC
# url: jdbc:sqlite:C:\it\houtaigunli\biji\mydatabase.db
# jpa:
# hibernate:
# ddl-auto: none
# show-sql: true
# properties:
# hibernate:
# format_sql: true
# dialect: org.hibernate.dialect.SQLiteDialect
#
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://panel-jp.998521.xyz:37857/biji_db?useSSL=false&serverTimezone=UTC&characterEncoding=utf8
username: root
password: Ll@12331100
jpa:
hibernate:
ddl-auto: none
ddl-auto: update
show-sql: true
properties:
hibernate:
format_sql: true
dialect: org.hibernate.dialect.SQLiteDialect
dialect: org.hibernate.dialect.MySQLDialect
# MyBatis-Plus??
# MyBatis-Plus配置
mybatis-plus:
mapper-locations: classpath:mapper/*.xml
configuration:

View File

@@ -1,15 +1,17 @@
spring:
datasource:
driver-class-name: org.sqlite.JDBC
url: jdbc:sqlite:/data/mydatabase.db
jpa:
hibernate:
ddl-auto: none
show-sql: false
properties:
hibernate:
format_sql: false
dialect: org.hibernate.dialect.SQLiteDialect
# datasource:
# driver-class-name: org.sqlite.JDBC
# url: jdbc:sqlite:/data/mydatabase.db
# jpa:
# hibernate:
# ddl-auto: none
# show-sql: false
# properties:
# hibernate:
# format_sql: false
# dialect: org.hibernate.dialect.SQLiteDialect

View File

@@ -117,6 +117,19 @@ onBeforeUnmount(() => {
if (vditor.value) {
vditor.value.destroy();
}
if (bijiId.value){
// 发送完整的笔记对象,确保包含所有必要字段
updateMarkdown({
id: bijiId.value,
content: vditor.value.getValue(),
title: props.editData.title,
groupingId: props.editData.groupingId,
fileName: props.editData.fileName,
isPrivate: props.editData.isPrivate
});
}
// 离开页面后清空 bijiId.value 变量
bijiId.value = null;
});
watch(() => props.editData, (newVal, oldVal) => {

Binary file not shown.

183
sql/all.sql Normal file
View File

@@ -0,0 +1,183 @@
/*
Navicat Premium Dump SQL
Source Server : biji数据库
Source Server Type : SQLite
Source Server Version : 3045000 (3.45.0)
Source Schema : main
Target Server Type : SQLite
Target Server Version : 3045000 (3.45.0)
File Encoding : 65001
Date: 06/01/2026 20:48:23
*/
PRAGMA foreign_keys = false;
-- ----------------------------
-- Table structure for grouping
-- ----------------------------
DROP TABLE IF EXISTS "grouping";
CREATE TABLE "grouping" (
"id" INTEGER NOT NULL DEFAULT 0,
"grouping" TEXT NOT NULL,
"parentId" INTEGER,
"is_deleted" INTEGER DEFAULT 0,
"deleted_at" DATETIME,
"deleted_by" INTEGER,
PRIMARY KEY ("id")
);
PRAGMA foreign_keys = true;
PRAGMA foreign_keys = false;
-- ----------------------------
-- Table structure for image
-- ----------------------------
DROP TABLE IF EXISTS "image";
CREATE TABLE "image" (
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
"markdown_id" INTEGER,
"original_name" TEXT NOT NULL,
"stored_name" TEXT NOT NULL,
"url" TEXT NOT NULL,
"size" INTEGER NOT NULL,
"content_type" TEXT NOT NULL,
"created_at" DATETIME DEFAULT CURRENT_TIMESTAMP,
UNIQUE ("stored_name" ASC)
);
-- ----------------------------
-- Auto increment value for image
-- ----------------------------
UPDATE "sqlite_sequence" SET seq = 25 WHERE name = 'image';
PRAGMA foreign_keys = true;
PRAGMA foreign_keys = false;
-- ----------------------------
-- Table structure for image_name
-- ----------------------------
DROP TABLE IF EXISTS "image_name";
CREATE TABLE "image_name" (
"id" INTEGER NOT NULL,
"markdown_id" INTEGER NOT NULL,
"file_name" text NOT NULL,
PRIMARY KEY ("id")
);
PRAGMA foreign_keys = true;
PRAGMA foreign_keys = false;
-- ----------------------------
-- Table structure for markdown_file
-- ----------------------------
DROP TABLE IF EXISTS "markdown_file";
CREATE TABLE "markdown_file" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"grouping_id" integer NOT NULL DEFAULT 1,
"title" TEXT NOT NULL,
"file_name" TEXT NOT NULL,
"content" TEXT NOT NULL,
"created_at" datetime DEFAULT CURRENT_TIMESTAMP,
"updated_at" datetime DEFAULT CURRENT_TIMESTAMP,
"is_deleted" INTEGER DEFAULT 0,
"deleted_at" DATETIME,
"deleted_by" INTEGER,
"is_private" integer DEFAULT 0
);
-- ----------------------------
-- Auto increment value for markdown_file
-- ----------------------------
PRAGMA foreign_keys = true;
PRAGMA foreign_keys = false;
-- ----------------------------
-- Table structure for registration_codes
-- ----------------------------
DROP TABLE IF EXISTS "registration_codes";
CREATE TABLE "registration_codes" (
"id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
"code" TEXT NOT NULL,
"expiry_time" TEXT NOT NULL,
"created_by" TEXT,
"created_at" TEXT DEFAULT (datetime('now','localtime'))
);
-- ----------------------------
-- Auto increment value for registration_codes
-- ----------------------------
UPDATE "sqlite_sequence" SET seq = 2 WHERE name = 'registration_codes';
-- ----------------------------
-- Indexes structure for table registration_codes
-- ----------------------------
CREATE UNIQUE INDEX "uk_code"
ON "registration_codes" (
"code" ASC
);
PRAGMA foreign_keys = true;
PRAGMA foreign_keys = false;
-- ----------------------------
-- Table structure for system_settings
-- ----------------------------
DROP TABLE IF EXISTS "system_settings";
CREATE TABLE "system_settings" (
"setting_key" TEXT NOT NULL,
"setting_value" TEXT,
"description" TEXT,
PRIMARY KEY ("setting_key")
);
PRAGMA foreign_keys = true;
PRAGMA foreign_keys = false;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS "user";
CREATE TABLE "user" (
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
"username" TEXT NOT NULL,
"password" TEXT NOT NULL,
"email" TEXT,
"created_at" DATETIME DEFAULT CURRENT_TIMESTAMP,
"updated_at" DATETIME DEFAULT CURRENT_TIMESTAMP,
"token" TEXT,
"token_enddata" DATETIME,
UNIQUE ("username" ASC)
);
-- ----------------------------
-- Auto increment value for user
-- ----------------------------
UPDATE "sqlite_sequence" SET seq = 5 WHERE name = 'user';
PRAGMA foreign_keys = true;

95
sql/mysql/all.sql Normal file
View File

@@ -0,0 +1,95 @@
-- MySQL 5.7.44 建表脚本(由 SQLite 转换)
-- 统一字符集与引擎
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- 1. 分组表
DROP TABLE IF EXISTS `grouping`;
CREATE TABLE `grouping` (
`id` bigintBIGINT(20) NOT NULL AUTO_INCREMENT,
`grouping` VARCHAR(255) NOT NULL,
`parentId` BIGINT(20) DEFAULT NULL,
`is_deleted` TINYINT(1) DEFAULT 0,
`deleted_at` DATETIME DEFAULT NULL,
`deleted_by` BIGINT(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 2. 图片表
DROP TABLE IF EXISTS `image`;
CREATE TABLE `image` (
`id` BIGINT(20) NOT NULL AUTO_INCREMENT,
`markdown_id` BIGINT(20) DEFAULT NULL,
`original_name` VARCHAR(255) NOT NULL,
`stored_name` VARCHAR(255) NOT NULL,
`url` VARCHAR(500) NOT NULL,
`size` BIGINT NOT NULL,
`content_type` VARCHAR(100) NOT NULL,
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_stored_name` (`stored_name`)
) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8mb4;
-- 3. 图片名称映射表
DROP TABLE IF EXISTS `image_name`;
CREATE TABLE `image_name` (
`id` BIGINT(20) NOT NULL AUTO_INCREMENT,
`markdown_id` BIGINT(20) NOT NULL,
`file_name` TEXT NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 4. Markdown 文件表
DROP TABLE IF EXISTS `markdown_file`;
CREATE TABLE `markdown_file` (
`id` BIGINT(20) NOT NULL AUTO_INCREMENT,
`grouping_id` BIGINT(20) NOT NULL DEFAULT 1,
`title` VARCHAR(255) NOT NULL,
`file_name` VARCHAR(255) NOT NULL,
`content` LONGTEXT NOT NULL,
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`is_deleted` TINYINT(1) DEFAULT 0,
`deleted_at` DATETIME DEFAULT NULL,
`deleted_by` BIGINT(20) DEFAULT NULL,
`is_private` TINYINT(1) DEFAULT 0,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 5. 注册邀请码表
DROP TABLE IF EXISTS `registration_codes`;
CREATE TABLE `registration_codes` (
`id` BIGINT(20) NOT NULL AUTO_INCREMENT,
`code` VARCHAR(255) NOT NULL,
`expiry_time` DATETIME NOT NULL,
`created_by` VARCHAR(100) DEFAULT NULL,
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_code` (`code`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4;
-- 6. 系统设置表
DROP TABLE IF EXISTS `system_settings`;
CREATE TABLE `system_settings` (
`setting_key` VARCHAR(100) NOT NULL,
`setting_value` TEXT,
`description` TEXT,
PRIMARY KEY (`setting_key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 7. 用户表
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` BIGINT(20) NOT NULL AUTO_INCREMENT,
`username` VARCHAR(50) NOT NULL,
`password` VARCHAR(255) NOT NULL,
`email` VARCHAR(100) DEFAULT NULL,
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`token` VARCHAR(255) DEFAULT NULL,
`token_enddata` DATETIME DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_username` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4;
SET FOREIGN_KEY_CHECKS = 1;