2026-01-15 13:51:44 +08:00
/*
Navicat Premium Dump SQL
Source Server : 开 发 环 境 - 本 地
Source Server Type : MySQL
Source Server Version : 80407 ( 8 . 4 . 7 )
Source Host : localhost : 3306
Source Schema : nl_blog
Target Server Type : MySQL
Target Server Version : 80407 ( 8 . 4 . 7 )
File Encoding : 65001
2026-01-19 14:01:37 +08:00
Date : 19 / 01 / 2026 13 : 58 : 42
2026-01-15 13:51:44 +08:00
* /
SET NAMES utf8mb4 ;
SET FOREIGN_KEY_CHECKS = 0 ;
2026-01-15 15:37:34 +08:00
-- ----------------------------
-- Table structure for about_profiles
-- ----------------------------
DROP TABLE IF EXISTS ` about_profiles ` ;
CREATE TABLE ` about_profiles ` (
` id ` int NOT NULL AUTO_INCREMENT ,
` name ` varchar ( 255 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL ,
` avatar ` varchar ( 255 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT ' ' ,
` location ` varchar ( 255 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT ' ' ,
` bio ` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL ,
` email ` varchar ( 255 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT ' ' ,
` wechat ` varchar ( 255 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT ' ' ,
` tech_stack ` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT ' JSON string or comma separated list ' ,
2026-01-15 16:44:00 +08:00
` experiences ` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT ' JSON string of experience list ' ,
2026-01-15 15:37:34 +08:00
` is_primary ` tinyint ( 1 ) NULL DEFAULT 0 ,
2026-01-16 13:01:21 +08:00
` created_at ` bigint NOT NULL DEFAULT 0 ,
` updated_at ` bigint NOT NULL DEFAULT 0 ,
` deleted_at ` bigint NOT NULL DEFAULT 0 ,
2026-01-15 15:37:34 +08:00
PRIMARY KEY ( ` id ` ) USING BTREE
2026-01-16 13:38:52 +08:00
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = DYNAMIC ;
2026-01-15 15:37:34 +08:00
-- ----------------------------
-- Records of about_profiles
-- ----------------------------
2026-01-19 16:14:08 +08:00
INSERT IGNORE INTO ` about_profiles ` ( ` id ` , ` name ` , ` avatar ` , ` location ` , ` bio ` , ` email ` , ` wechat ` , ` tech_stack ` , ` experiences ` , ` is_primary ` , ` created_at ` , ` updated_at ` , ` deleted_at ` ) VALUES ( 3 , ' 年糕崽崽 ' , ' https://api.dicebear.com/7.x/avataaars/svg?seed=NianGao&backgroundColor=b6e3f4 ' , ' 中国 · 浙江杭州 ' , ' 嗨!我是年糕崽崽,一名热衷于探索数字边界的前端架构师。我的职业生涯始于对像素级完美的执念。从早期的 jQuery 插件开发到如今的 WebGL 3D 场景构建,我始终认为:<strong>技术是骨架,艺术是灵魂。</strong><br><br>目前,我专注于高性能 B 端应用的体验升级, 以及探索生成式艺术( Generative Art) 在网页中的应用。闲暇之余, 我喜欢在杭州的西湖边散步, 或者捣腾我的客制化机械键盘。 ' , ' liqiworker@gmail.com ' , ' ngzz_0218 ' , ' [\\\"Vue 3\\\",\\\"React\\\",\\\"TypeScript\\\",\\\"Three.js\\\",\\\"Golang\\\",\\\"Tailwind CSS\\\",\\\"Rust\\\",\\\"Wails\\\"] ' , ' [{\\\"year\\\":\\\"2024 - 至今\\\",\\\"role\\\":\\\"技术负责人\\\",\\\"company\\\":\\\"某医疗平台公司\\\"},{\\\"year\\\":\\\"2020 - 2024\\\",\\\"role\\\":\\\"PHP开发工程师\\\",\\\"company\\\":\\\"某电商公司\\\"}] ' , 0 , 0 , 0 , 0 ) ;
2026-01-15 15:37:34 +08:00
2026-01-15 13:51:44 +08:00
-- ----------------------------
-- Table structure for access_logs
-- ----------------------------
DROP TABLE IF EXISTS ` access_logs ` ;
CREATE TABLE ` access_logs ` (
` id ` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT ' 主键ID ' ,
` ip ` varchar ( 45 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 访问者IP地址 ' ,
` user_agent ` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT ' 访问者浏览器信息 ' ,
` path ` varchar ( 255 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 访问路径 ' ,
` method ` varchar ( 10 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' HTTP方法 ' ,
` status_code ` int UNSIGNED NOT NULL COMMENT ' HTTP状态码 ' ,
` response_time ` int UNSIGNED NOT NULL COMMENT ' 响应时间(毫秒) ' ,
2026-01-16 13:01:21 +08:00
` deleted_at ` bigint NOT NULL DEFAULT 0 ,
2026-01-16 13:38:52 +08:00
` created_at ` bigint NOT NULL DEFAULT 0 ,
2026-01-15 13:51:44 +08:00
PRIMARY KEY ( ` id ` ) USING BTREE ,
INDEX ` idx_path ` ( ` path ` ASC ) USING BTREE COMMENT ' 按访问路径查询索引 ' ,
INDEX ` idx_status_code ` ( ` status_code ` ASC ) USING BTREE COMMENT ' 按状态码查询索引 '
2026-01-16 13:38:52 +08:00
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = ' 访问日志表 ' ROW_FORMAT = DYNAMIC ;
2026-01-15 13:51:44 +08:00
-- ----------------------------
-- Records of access_logs
-- ----------------------------
2026-01-16 17:03:34 +08:00
-- ----------------------------
-- Table structure for categories
-- ----------------------------
DROP TABLE IF EXISTS ` categories ` ;
CREATE TABLE ` categories ` (
` id ` int UNSIGNED NOT NULL AUTO_INCREMENT COMMENT ' 分类ID ' ,
` name ` varchar ( 50 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 分类名称 ' ,
` slug ` varchar ( 50 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 分类别名 ' ,
` description ` varchar ( 200 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT ' 描述 ' ,
` sort_order ` int UNSIGNED NULL DEFAULT 0 COMMENT ' 排序 ' ,
` deleted_at ` bigint NOT NULL DEFAULT 0 ,
` created_at ` bigint NOT NULL DEFAULT 0 ,
` updated_at ` bigint NOT NULL DEFAULT 0 ,
PRIMARY KEY ( ` id ` ) USING BTREE ,
UNIQUE INDEX ` uk_slug ` ( ` slug ` ASC ) USING BTREE ,
INDEX ` idx_sort_order ` ( ` sort_order ` ASC ) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = ' 文章分类表 ' ROW_FORMAT = DYNAMIC ;
-- ----------------------------
-- Records of categories
-- ----------------------------
INSERT INTO ` categories ` VALUES ( 1 , ' 工程化 ' , ' 工程化 ' , NULL , 0 , 0 , 0 , 0 ) ;
INSERT INTO ` categories ` VALUES ( 2 , ' 图形渲染 ' , ' 图形渲染 ' , NULL , 0 , 0 , 0 , 0 ) ;
INSERT INTO ` categories ` VALUES ( 3 , ' 设计思维 ' , ' 设计思维 ' , NULL , 0 , 0 , 0 , 0 ) ;
INSERT INTO ` categories ` VALUES ( 4 , ' Go语言 ' , ' Go语言 ' , NULL , 0 , 0 , 0 , 0 ) ;
-- ----------------------------
-- Table structure for column_posts
-- ----------------------------
DROP TABLE IF EXISTS ` column_posts ` ;
CREATE TABLE ` column_posts ` (
` column_id ` int UNSIGNED NOT NULL COMMENT ' 专栏ID ' ,
` post_id ` int UNSIGNED NOT NULL COMMENT ' 文章ID ' ,
` sort_order ` int UNSIGNED NULL DEFAULT 0 COMMENT ' 排序 ' ,
` created_at ` bigint NOT NULL DEFAULT 0 ,
PRIMARY KEY ( ` column_id ` , ` post_id ` ) USING BTREE ,
INDEX ` idx_post_id ` ( ` post_id ` ASC ) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = ' 专栏文章关联表 ' ROW_FORMAT = DYNAMIC ;
-- ----------------------------
-- Records of column_posts
-- ----------------------------
INSERT INTO ` column_posts ` VALUES ( 1 , 1 , 0 , 0 ) ;
INSERT INTO ` column_posts ` VALUES ( 2 , 2 , 0 , 0 ) ;
INSERT INTO ` column_posts ` VALUES ( 3 , 3 , 0 , 0 ) ;
INSERT INTO ` column_posts ` VALUES ( 4 , 4 , 0 , 0 ) ;
INSERT INTO ` column_posts ` VALUES ( 4 , 5 , 0 , 0 ) ;
INSERT INTO ` column_posts ` VALUES ( 4 , 6 , 0 , 0 ) ;
-- ----------------------------
-- Table structure for columns
-- ----------------------------
DROP TABLE IF EXISTS ` columns ` ;
CREATE TABLE ` columns ` (
` id ` int UNSIGNED NOT NULL AUTO_INCREMENT COMMENT ' 专栏ID ' ,
` name ` varchar ( 100 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 专栏名称 ' ,
` description ` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT ' 专栏描述 ' ,
` cover ` varchar ( 255 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT ' 专栏封面 ' ,
` is_active ` tinyint ( 1 ) NOT NULL DEFAULT 1 COMMENT ' 是否启用 ' ,
` sort_order ` int UNSIGNED NULL DEFAULT 0 COMMENT ' 排序 ' ,
` deleted_at ` bigint NOT NULL DEFAULT 0 ,
` created_at ` bigint NOT NULL DEFAULT 0 ,
` updated_at ` bigint NOT NULL DEFAULT 0 ,
PRIMARY KEY ( ` id ` ) USING BTREE ,
INDEX ` idx_sort_order ` ( ` sort_order ` ASC ) USING BTREE
2026-01-19 14:01:37 +08:00
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = ' 专栏表 ' ROW_FORMAT = DYNAMIC ;
2026-01-16 17:03:34 +08:00
-- ----------------------------
-- Records of columns
-- ----------------------------
2026-01-19 14:01:37 +08:00
INSERT INTO ` columns ` VALUES ( 1 , ' Goravel ' , ' Goravel入门手册 ' , ' https://www.goravel.dev/logo.png ' , 1 , 0 , 0 , 1768552230 , 1768552230 ) ;
2026-01-16 17:03:34 +08:00
2026-01-16 09:08:29 +08:00
-- ----------------------------
-- Table structure for email_suffixes
-- ----------------------------
DROP TABLE IF EXISTS ` email_suffixes ` ;
CREATE TABLE ` email_suffixes ` (
` id ` int NOT NULL AUTO_INCREMENT ,
` suffix ` varchar ( 50 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 邮箱后缀 ' ,
` is_active ` tinyint ( 1 ) NOT NULL DEFAULT 1 COMMENT ' 是否启用 ' ,
` sort_order ` int NOT NULL DEFAULT 0 COMMENT ' 排序 ' ,
2026-01-16 13:38:52 +08:00
` deleted_at ` bigint NOT NULL DEFAULT 0 ,
2026-01-16 13:01:21 +08:00
` created_at ` bigint NOT NULL DEFAULT 0 ,
` updated_at ` bigint NOT NULL DEFAULT 0 ,
2026-01-16 09:08:29 +08:00
PRIMARY KEY ( ` id ` ) USING BTREE ,
UNIQUE INDEX ` uk_suffix ` ( ` suffix ` ASC ) USING BTREE
2026-01-16 13:38:52 +08:00
) ENGINE = InnoDB AUTO_INCREMENT = 15 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = ' 邮箱后缀配置表 ' ROW_FORMAT = DYNAMIC ;
2026-01-16 09:08:29 +08:00
-- ----------------------------
-- Records of email_suffixes
-- ----------------------------
2026-01-16 13:38:52 +08:00
INSERT INTO ` email_suffixes ` VALUES ( 1 , ' @gmail.com ' , 1 , 1 , 0 , 1768523866 , 1768538954 ) ;
INSERT INTO ` email_suffixes ` VALUES ( 2 , ' @163.com ' , 1 , 2 , 0 , 1768523866 , 1768538954 ) ;
INSERT INTO ` email_suffixes ` VALUES ( 3 , ' @qq.com ' , 1 , 3 , 0 , 1768523866 , 1768538954 ) ;
INSERT INTO ` email_suffixes ` VALUES ( 4 , ' @outlook.com ' , 1 , 4 , 0 , 1768523866 , 1768538954 ) ;
INSERT INTO ` email_suffixes ` VALUES ( 5 , ' @foxmail.com ' , 1 , 5 , 0 , 1768523866 , 1768538954 ) ;
INSERT INTO ` email_suffixes ` VALUES ( 6 , ' @sina.com ' , 1 , 6 , 0 , 1768523866 , 1768538954 ) ;
INSERT INTO ` email_suffixes ` VALUES ( 7 , ' @126.com ' , 1 , 7 , 0 , 1768523866 , 1768538954 ) ;
2026-01-16 09:08:29 +08:00
-- ----------------------------
-- Table structure for inquiries
-- ----------------------------
DROP TABLE IF EXISTS ` inquiries ` ;
CREATE TABLE ` inquiries ` (
` id ` int NOT NULL AUTO_INCREMENT ,
` name ` varchar ( 100 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 姓名 ' ,
` company ` varchar ( 100 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT ' 公司/组织 ' ,
` contact_method ` varchar ( 20 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 联系方式类型(email/wechat/phone) ' ,
` contact_value ` varchar ( 100 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 联系方式值 ' ,
` budget ` varchar ( 50 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT ' 预算范围 ' ,
` description ` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT ' 需求描述 ' ,
` status ` tinyint NOT NULL DEFAULT 0 COMMENT ' 状态: 0-未读, 1-已读, 2-已联系 ' ,
2026-01-16 13:38:52 +08:00
` deleted_at ` bigint NOT NULL DEFAULT 0 ,
2026-01-16 13:01:21 +08:00
` created_at ` bigint NOT NULL DEFAULT 0 ,
` updated_at ` bigint NOT NULL DEFAULT 0 ,
2026-01-16 09:08:29 +08:00
PRIMARY KEY ( ` id ` ) USING BTREE
2026-01-16 13:38:52 +08:00
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = ' 合作咨询表 ' ROW_FORMAT = DYNAMIC ;
2026-01-16 09:08:29 +08:00
-- ----------------------------
-- Records of inquiries
-- ----------------------------
2026-01-15 15:37:34 +08:00
-- ----------------------------
-- Table structure for operation_logs
-- ----------------------------
2026-01-19 16:14:08 +08:00
-- Ensure table is dropped even if it has dependencies
SET FOREIGN_KEY_CHECKS = 0 ;
2026-01-15 15:37:34 +08:00
DROP TABLE IF EXISTS ` operation_logs ` ;
2026-01-19 16:14:08 +08:00
SET FOREIGN_KEY_CHECKS = 1 ;
2026-01-15 15:37:34 +08:00
CREATE TABLE ` operation_logs ` (
` id ` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT ' 主键ID ' ,
` user_id ` bigint UNSIGNED NOT NULL COMMENT ' 操作用户ID ' ,
` username ` varchar ( 50 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 操作用户名 ' ,
` ip ` varchar ( 45 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 操作IP地址 ' ,
` path ` varchar ( 255 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 操作路径 ' ,
` method ` varchar ( 10 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' HTTP方法 ' ,
` params ` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT ' 请求参数 ' ,
` status ` int NOT NULL COMMENT ' 响应状态码 ' ,
` duration ` int NOT NULL COMMENT ' 响应时间(毫秒) ' ,
2026-01-16 13:01:21 +08:00
` deleted_at ` bigint NOT NULL DEFAULT 0 ,
2026-01-16 13:38:52 +08:00
` created_at ` bigint NOT NULL DEFAULT 0 ,
2026-01-15 15:37:34 +08:00
PRIMARY KEY ( ` id ` ) USING BTREE ,
2026-01-16 13:38:52 +08:00
INDEX ` idx_user_id ` ( ` user_id ` ASC ) USING BTREE
2026-01-19 14:01:37 +08:00
) ENGINE = InnoDB AUTO_INCREMENT = 644 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = ' 操作日志表 ' ROW_FORMAT = DYNAMIC ;
2026-01-15 15:37:34 +08:00
2026-01-16 09:08:29 +08:00
-- ----------------------------
-- Table structure for partners
-- ----------------------------
DROP TABLE IF EXISTS ` partners ` ;
CREATE TABLE ` partners ` (
` id ` int UNSIGNED NOT NULL AUTO_INCREMENT COMMENT ' 主键ID ' ,
` name ` varchar ( 100 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 合作伙伴名称 ' ,
` logo ` varchar ( 500 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT ' 合作伙伴Logo URL ' ,
` description ` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT ' 合作伙伴介绍 ' ,
` url ` varchar ( 500 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT ' 合作伙伴官网链接 ' ,
` sort_order ` int UNSIGNED NULL DEFAULT 0 COMMENT ' 排序权重 ' ,
2026-01-16 13:01:21 +08:00
` deleted_at ` bigint NOT NULL DEFAULT 0 ,
2026-01-16 13:38:52 +08:00
` created_at ` bigint NOT NULL DEFAULT 0 ,
` updated_at ` bigint NOT NULL DEFAULT 0 ,
2026-01-16 09:08:29 +08:00
PRIMARY KEY ( ` id ` ) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = ' 合作伙伴表 ' ROW_FORMAT = DYNAMIC ;
-- ----------------------------
-- Records of partners
-- ----------------------------
2026-01-16 13:38:52 +08:00
INSERT INTO ` partners ` VALUES ( 1 , ' Vercel ' , ' https://upload.wikimedia.org/wikipedia/commons/5/5e/Vercel_logo_black.svg ' , ' 前端部署平台 ' , ' https://vercel.com ' , 0 , 0 , 1768482993 , 1768538953 ) ;
INSERT INTO ` partners ` VALUES ( 2 , ' Supabase ' , ' https://seeklogo.com/images/S/supabase-logo-DCC676FFE2-seeklogo.com.png ' , ' 开源 Firebase 替代方案 ' , ' https://supabase.com ' , 0 , 0 , 1768482993 , 1768538953 ) ;
INSERT INTO ` partners ` VALUES ( 3 , ' Stripe ' , ' https://upload.wikimedia.org/wikipedia/commons/b/ba/Stripe_Logo%2C_revised_2016.svg ' , ' 在线支付基础设施 ' , ' https://stripe.com ' , 0 , 0 , 1768482993 , 1768538953 ) ;
INSERT INTO ` partners ` VALUES ( 4 , ' Algolia ' , ' https://upload.wikimedia.org/wikipedia/commons/6/69/Algolia-logo.svg ' , ' 搜索即服务 API ' , ' https://algolia.com ' , 0 , 0 , 1768482993 , 1768538953 ) ;
INSERT INTO ` partners ` VALUES ( 5 , ' Prisma ' , ' https://seeklogo.com/images/P/prisma-logo-3805665B69-seeklogo.com.png ' , ' 下一代 ORM ' , ' https://prisma.io ' , 0 , 0 , 1768482993 , 1768538953 ) ;
2026-01-15 15:37:34 +08:00
-- ----------------------------
-- Table structure for permissions
-- ----------------------------
DROP TABLE IF EXISTS ` permissions ` ;
CREATE TABLE ` permissions ` (
` id ` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT ' 主键ID ' ,
` name ` varchar ( 50 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 权限名称 ' ,
` resource ` varchar ( 50 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 资源名称 ' ,
` action ` varchar ( 50 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 操作名称 ' ,
2026-01-16 13:01:21 +08:00
` deleted_at ` bigint NOT NULL DEFAULT 0 ,
2026-01-16 13:38:52 +08:00
` created_at ` bigint NOT NULL DEFAULT 0 ,
` updated_at ` bigint NOT NULL DEFAULT 0 ,
2026-01-15 15:37:34 +08:00
PRIMARY KEY ( ` id ` ) USING BTREE ,
UNIQUE INDEX ` unique_resource_action ` ( ` resource ` ASC , ` action ` ASC ) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 31 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = ' 权限表 ' ROW_FORMAT = DYNAMIC ;
-- ----------------------------
-- Records of permissions
-- ----------------------------
2026-01-16 13:38:52 +08:00
INSERT INTO ` permissions ` VALUES ( 1 , ' Create User ' , ' users ' , ' create ' , 0 , 1768452892 , 1768538956 ) ;
INSERT INTO ` permissions ` VALUES ( 2 , ' Read User ' , ' users ' , ' read ' , 0 , 1768452892 , 1768538956 ) ;
INSERT INTO ` permissions ` VALUES ( 3 , ' Update User ' , ' users ' , ' update ' , 0 , 1768452892 , 1768538956 ) ;
INSERT INTO ` permissions ` VALUES ( 4 , ' Delete User ' , ' users ' , ' delete ' , 0 , 1768452892 , 1768538956 ) ;
INSERT INTO ` permissions ` VALUES ( 5 , ' Create Role ' , ' roles ' , ' create ' , 0 , 1768452892 , 1768538956 ) ;
INSERT INTO ` permissions ` VALUES ( 6 , ' Read Role ' , ' roles ' , ' read ' , 0 , 1768452892 , 1768538956 ) ;
INSERT INTO ` permissions ` VALUES ( 7 , ' Update Role ' , ' roles ' , ' update ' , 0 , 1768452892 , 1768538956 ) ;
INSERT INTO ` permissions ` VALUES ( 8 , ' Delete Role ' , ' roles ' , ' delete ' , 0 , 1768452892 , 1768538956 ) ;
INSERT INTO ` permissions ` VALUES ( 9 , ' Create Post ' , ' posts ' , ' create ' , 0 , 1768452892 , 1768538956 ) ;
INSERT INTO ` permissions ` VALUES ( 10 , ' Read Post ' , ' posts ' , ' read ' , 0 , 1768452892 , 1768538956 ) ;
INSERT INTO ` permissions ` VALUES ( 11 , ' Update Post ' , ' posts ' , ' update ' , 0 , 1768452892 , 1768538956 ) ;
INSERT INTO ` permissions ` VALUES ( 12 , ' Delete Post ' , ' posts ' , ' delete ' , 0 , 1768452892 , 1768538956 ) ;
INSERT INTO ` permissions ` VALUES ( 13 , ' Create Work ' , ' works ' , ' create ' , 0 , 1768452892 , 1768538956 ) ;
INSERT INTO ` permissions ` VALUES ( 14 , ' Read Work ' , ' works ' , ' read ' , 0 , 1768452892 , 1768538956 ) ;
INSERT INTO ` permissions ` VALUES ( 15 , ' Update Work ' , ' works ' , ' update ' , 0 , 1768452892 , 1768538956 ) ;
INSERT INTO ` permissions ` VALUES ( 16 , ' Delete Work ' , ' works ' , ' delete ' , 0 , 1768452892 , 1768538956 ) ;
INSERT INTO ` permissions ` VALUES ( 17 , ' Create Snippet ' , ' snippets ' , ' create ' , 0 , 1768452892 , 1768538956 ) ;
INSERT INTO ` permissions ` VALUES ( 18 , ' Read Snippet ' , ' snippets ' , ' read ' , 0 , 1768452892 , 1768538956 ) ;
INSERT INTO ` permissions ` VALUES ( 19 , ' Update Snippet ' , ' snippets ' , ' update ' , 0 , 1768452892 , 1768538956 ) ;
INSERT INTO ` permissions ` VALUES ( 20 , ' Delete Snippet ' , ' snippets ' , ' delete ' , 0 , 1768452892 , 1768538956 ) ;
INSERT INTO ` permissions ` VALUES ( 21 , ' Create Setting ' , ' settings ' , ' create ' , 0 , 1768452892 , 1768538956 ) ;
INSERT INTO ` permissions ` VALUES ( 22 , ' Read Setting ' , ' settings ' , ' read ' , 0 , 1768452892 , 1768538956 ) ;
INSERT INTO ` permissions ` VALUES ( 23 , ' Update Setting ' , ' settings ' , ' update ' , 0 , 1768452892 , 1768538956 ) ;
INSERT INTO ` permissions ` VALUES ( 24 , ' Delete Setting ' , ' settings ' , ' delete ' , 0 , 1768452892 , 1768538956 ) ;
INSERT INTO ` permissions ` VALUES ( 25 , ' Create Tag ' , ' tags ' , ' create ' , 0 , 1768452892 , 1768538956 ) ;
INSERT INTO ` permissions ` VALUES ( 26 , ' Read Tag ' , ' tags ' , ' read ' , 0 , 1768452892 , 1768538956 ) ;
INSERT INTO ` permissions ` VALUES ( 27 , ' Update Tag ' , ' tags ' , ' update ' , 0 , 1768452892 , 1768538956 ) ;
INSERT INTO ` permissions ` VALUES ( 28 , ' Delete Tag ' , ' tags ' , ' delete ' , 0 , 1768452892 , 1768538956 ) ;
INSERT INTO ` permissions ` VALUES ( 29 , ' Read Operation Log ' , ' operation_logs ' , ' read ' , 0 , 1768452892 , 1768538956 ) ;
INSERT INTO ` permissions ` VALUES ( 30 , ' Read Dashboard ' , ' dashboard ' , ' read ' , 0 , 1768452892 , 1768538956 ) ;
2026-01-15 15:37:34 +08:00
2026-01-16 17:03:34 +08:00
-- ----------------------------
-- Table structure for post_history
-- ----------------------------
DROP TABLE IF EXISTS ` post_history ` ;
CREATE TABLE ` post_history ` (
` id ` int UNSIGNED NOT NULL AUTO_INCREMENT COMMENT ' 历史记录ID ' ,
` post_id ` int UNSIGNED NOT NULL COMMENT ' 文章ID ' ,
` version ` int UNSIGNED NOT NULL DEFAULT 1 COMMENT ' 版本号 ' ,
` title ` varchar ( 200 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 文章标题 ' ,
` category_id ` int UNSIGNED NOT NULL DEFAULT 0 COMMENT ' 文章分类ID ' ,
` excerpt ` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT ' 文章摘要 ' ,
` content ` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 文章内容 ' ,
` is_published ` tinyint ( 1 ) NULL DEFAULT 1 COMMENT ' 是否已发布 ' ,
` modified_by ` int UNSIGNED NOT NULL DEFAULT 0 COMMENT ' 修改人ID ' ,
` modified_at ` bigint NOT NULL DEFAULT 0 COMMENT ' 修改时间 ' ,
` created_at ` bigint NOT NULL DEFAULT 0 ,
` deleted_at ` bigint NOT NULL DEFAULT 0 ,
PRIMARY KEY ( ` id ` ) USING BTREE ,
INDEX ` idx_post_id ` ( ` post_id ` ASC ) USING BTREE ,
INDEX ` idx_version ` ( ` version ` ASC ) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = ' 文章历史记录表 ' ROW_FORMAT = DYNAMIC ;
-- ----------------------------
-- Records of post_history
-- ----------------------------
2026-01-15 13:51:44 +08:00
-- ----------------------------
-- Table structure for post_tags
-- ----------------------------
DROP TABLE IF EXISTS ` post_tags ` ;
CREATE TABLE ` post_tags ` (
` tag_id ` bigint UNSIGNED NOT NULL COMMENT ' 关联的标签ID ' ,
2026-01-15 16:53:36 +08:00
` post_id ` int UNSIGNED NOT NULL COMMENT ' 关联的文章ID ' ,
2026-01-16 13:38:52 +08:00
` created_at ` bigint NOT NULL DEFAULT 0 ,
2026-01-15 13:51:44 +08:00
PRIMARY KEY ( ` post_id ` , ` tag_id ` ) USING BTREE ,
2026-01-16 17:03:34 +08:00
INDEX ` idx_tag_id ` ( ` tag_id ` ASC ) USING BTREE
2026-01-15 15:37:34 +08:00
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = ' 文章标签关联表 ' ROW_FORMAT = DYNAMIC ;
2026-01-15 13:51:44 +08:00
-- ----------------------------
-- Records of post_tags
-- ----------------------------
-- ----------------------------
-- Table structure for posts
-- ----------------------------
DROP TABLE IF EXISTS ` posts ` ;
CREATE TABLE ` posts ` (
2026-01-15 16:53:36 +08:00
` id ` int UNSIGNED NOT NULL AUTO_INCREMENT COMMENT ' 文章唯一标识( 自增ID) ' ,
` original_id ` varchar ( 50 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT ' 原始字符串ID备份 ' ,
2026-01-15 13:51:44 +08:00
` title ` varchar ( 200 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 文章标题 ' ,
2026-01-16 17:03:34 +08:00
` category_id ` int UNSIGNED NOT NULL DEFAULT 0 COMMENT ' 文章分类ID ' ,
2026-01-19 16:14:08 +08:00
` column_id ` int UNSIGNED NULL DEFAULT NULL COMMENT ' 专栏ID( 可选) ' ,
2026-01-15 13:51:44 +08:00
` excerpt ` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT ' 文章摘要 ' ,
` content ` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 文章内容 ' ,
` read_count ` int UNSIGNED NULL DEFAULT 0 COMMENT ' 阅读量 ' ,
` is_published ` tinyint ( 1 ) NULL DEFAULT 1 COMMENT ' 是否已发布( 0: 草稿, 1: 已发布) ' ,
2026-01-16 13:01:21 +08:00
` deleted_at ` bigint NOT NULL DEFAULT 0 ,
2026-01-16 13:38:52 +08:00
` created_at ` bigint NOT NULL DEFAULT 0 ,
` updated_at ` bigint NOT NULL DEFAULT 0 ,
2026-01-15 13:51:44 +08:00
PRIMARY KEY ( ` id ` ) USING BTREE ,
2026-01-19 14:01:37 +08:00
INDEX ` idx_category_id ` ( ` category_id ` ASC ) USING BTREE COMMENT ' 按分类查询索引 ' ,
2026-01-19 16:14:08 +08:00
INDEX ` idx_column_id ` ( ` column_id ` ASC ) USING BTREE COMMENT ' 按专栏查询索引 ' ,
2026-01-15 13:51:44 +08:00
INDEX ` idx_is_published ` ( ` is_published ` ASC ) USING BTREE COMMENT ' 按发布状态查询索引 ' ,
2026-01-16 17:03:34 +08:00
INDEX ` idx_original_id ` ( ` original_id ` ASC ) USING BTREE ,
2026-01-19 14:01:37 +08:00
FULLTEXT INDEX ` idx_title_content ` ( ` title ` , ` content ` ) COMMENT ' 标题和内容全文索引,用于搜索 '
2026-01-15 16:53:36 +08:00
) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = ' 博客文章表(新结构) ' ROW_FORMAT = DYNAMIC ;
2026-01-15 13:51:44 +08:00
-- ----------------------------
-- Records of posts
-- ----------------------------
2026-01-19 16:14:08 +08:00
INSERT IGNORE INTO ` posts ` ( ` id ` , ` original_id ` , ` title ` , ` category_id ` , ` column_id ` , ` excerpt ` , ` content ` , ` read_count ` , ` is_published ` , ` deleted_at ` , ` created_at ` , ` updated_at ` ) VALUES ( 1 , ' refactor ' , ' 重构的艺术:如何优雅地处理遗留代码 ' , 4 , NULL , ' 在本文中,我们将探讨重构的核心原则和实用技巧,帮助你优雅地处理遗留代码,提高代码质量和可维护性。 ' , ' <h2>什么是代码重构?</h2><p>代码重构是在不改变代码外部行为的前提下,优化代码内部结构的过程...</p> ' , 5 , 1 , 0 , 1768291814 , 1768538949 ) ;
INSERT IGNORE INTO ` posts ` ( ` id ` , ` original_id ` , ` title ` , ` category_id ` , ` column_id ` , ` excerpt ` , ` content ` , ` read_count ` , ` is_published ` , ` deleted_at ` , ` created_at ` , ` updated_at ` ) VALUES ( 2 , ' shader ' , ' 着色器魔法:从零开始写一个噪声生成器 ' , 2 , NULL , ' 深入了解WebGL着色器, 学习如何从零开始实现一个高性能的噪声生成器, 为你的3D作品增添独特的视觉效果。 ' , ' <p>GLSL (OpenGL Shading Language) 是一门让人生畏但也充满魅力的语言。它运行在 GPU 上,能够并行处理数百万个像素,创造出惊人的视觉效果。</p>\r\n <h2>什么是柏林噪声?</h2>\r\n <p>柏林噪声( Perlin Noise) 是一种梯度噪声, 它比普通的随机数生成的噪声看起来更自然、更平滑。它常被用来模拟云彩、地形、火焰等自然现象。</p>\r\n <h2>Three.js 中的实现</h2>\r\n <p>在 Three.js 中,我们可以通过 <code>ShaderMaterial</code> 直接编写 GLSL 代码。</p>\r\n <pre><code><span class=\"code-comment\">// 简单的顶点着色器</span>\r\n<span class=\"code-keyword\">varying</span> <span class=\"code-keyword\">vec2</span> vUv;\r\n<span class=\"code-keyword\">void</span> <span class=\"code-func\">main</span>() {\r\n vUv = uv;\r\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n}</code></pre>\r\n <p>通过调整噪声的频率和振幅,我们可以得到各种不同的纹理效果。在我的个人网站背景中,就使用了这种技术来生成流动的极光效果。</p>\r\n ' , 1 , 1 , 0 , 1768291815 , 1768538949 ) ;
INSERT IGNORE INTO ` posts ` ( ` id ` , ` original_id ` , ` title ` , ` category_id ` , ` column_id ` , ` excerpt ` , ` content ` , ` read_count ` , ` is_published ` , ` deleted_at ` , ` created_at ` , ` updated_at ` ) VALUES ( 3 , ' ux ' , ' 用户体验设计:从认知心理学到交互实践 ' , 3 , NULL , ' 探索用户体验设计的核心原理,结合认知心理学知识,学习如何设计出真正符合用户需求的交互界面。 ' , ' <h2>认知心理学在UX设计中的应用</h2><p>了解用户的认知过程是设计良好用户体验的基础...</p> ' , 0 , 1 , 0 , 1768291816 , 1768538949 ) ;
INSERT IGNORE INTO ` posts ` ( ` id ` , ` original_id ` , ` title ` , ` category_id ` , ` column_id ` , ` excerpt ` , ` content ` , ` read_count ` , ` is_published ` , ` deleted_at ` , ` created_at ` , ` updated_at ` ) VALUES ( 4 , ' goravel-guide-1 ' , ' Goravel 入门指南 (一):环境搭建与 Hello World ' , 4 , 1 , ' 本文将带你了解 Go 语言领域的 Laravel —— Goravel 框架,并演示如何快速搭建环境及运行第一个 Web 服务。 ' , ' ## 什么是 Goravel? \n\nGoravel 是一个基于 Go 语言的 Web 开发框架,它的设计理念深受 PHP Laravel 框架的启发。如果你是一名从 PHP 转 Go 的开发者,或者你喜欢 Laravel 那种“开箱即用、优雅简洁”的开发体验,那么 Goravel 绝对是你的不二之选。\n\n它集成了丰富的功能模块, 包括但不限于: \n- 强大的路由系统\n- ORM( 基于 GORM 封装)\n- 依赖注入容器\n- 队列与任务调度\n- 缓存与文件存储\n\n## 环境搭建\n\nGoravel 提供了一个名为 `knit` 的命令行工具(类似 Laravel 的 artisan) , 可以帮助我们快速初始化项目。\n\n### 1. 安装 Knit CLI\n\n确保你已经安装了 Go (1.20+),然后运行以下命令:\n\n```bash\ngo install github.com/goravel/knit/cmd/knit@latest\n```\n\n### 2. 创建新项目\n\n使用 `knit new` 命令创建项目:\n\n```bash\nknit new my-goravel-app\ncd my-goravel-app\n```\n\n### 3. 安装依赖\n\n```bash\ngo mod tidy\n```\n\n## 目录结构\n\n打开项目, 你会发现它的目录结构非常清晰, 带有浓厚的 Laravel 风格:\n\n- **app/**: 核心业务代码( Http 控制器、模型、服务提供者等)\n- **config/**: 配置文件(应用配置、数据库配置等)\n- **routes/**: 路由定义文件\n- **database/**: 数据库迁移与填充\n- **public/**: 静态资源文件\n\n## 运行 Hello World\n\nGoravel 的入口文件是根目录下的 `main.go`。在运行之前,我们先看一眼路由定义。打开 `routes/web.go`: \n\n```go\npackage routes\n\nimport (\n \"github.com/goravel/framework/contracts/http\"\n \"github.com/goravel/framework/facades\"\n)\n\nfunc Web() {\n facades.Route().Get(\"/\", func(ctx http.Context) http.Response {\n return ctx.Response().Json(200, http.Json{\n \"Hello\": \"Goravel\",\n })\n })\n}\n```\n\n非常直观! 现在让我们启动服务: \n\n```bash\ngo run .\n```\n\n默认情况下, 服务会运行在 `http://localhost:3000`。打开浏览器访问,你应该能看到 JSON 响应:\n\n```json\n{\n \"Hello\": \"Goravel\"\n}\n```\n\n至此, 你已经成功运行了你的第一个 Goravel 应用!在下一篇文章中,我们将深入探讨路由与控制器的使用。 ' , 1210 , 1 , 0 , 1768465932 , 1768538949 ) ;
INSERT IGNORE INTO ` posts ` ( ` id ` , ` original_id ` , ` title ` , ` category_id ` , ` column_id ` , ` excerpt ` , ` content ` , ` read_count ` , ` is_published ` , ` deleted_at ` , ` created_at ` , ` updated_at ` ) VALUES ( 5 , ' goravel-guide-2 ' , ' Goravel 入门指南 (二):路由与控制器 ' , 4 , 1 , ' 深入理解 Goravel 的 HTTP 层,学习如何定义 RESTful 路由、创建控制器以及处理 HTTP 请求与响应。 ' , ' ## 路由系统\n\n在 Goravel 中,路由定义通常位于 `routes/` 目录下。`api.go` 用于定义 API 路由,`web.go` 用于定义网页路由。Goravel 使用 `facades.Route()` 来定义路由,这得益于其强大的依赖注入系统。\n\n### 基础路由\n\n```go\n// GET 请求\nfacades.Route().Get(\"/users\", func(ctx http.Context) http.Response {\n return ctx.Response().String(200, \"User List\")\n})\n\n// POST 请求\nfacades.Route().Post(\"/users\", func(ctx http.Context) http.Response {\n return ctx.Response().Success().Json(http.Json{\"id\": 1})\n})\n```\n\n### 路由参数\n\n获取 URL 中的动态参数非常简单:\n\n```go\nfacades.Route().Get(\"/users/{id}\", func(ctx http.Context) http.Response {\n id := ctx.Request().Input(\"id\")\n return ctx.Response().Success().Json(http.Json{\"user_id\": id})\n})\n```\n\n## 控制器 (Controllers)\n\n随着应用变大, 我们不可能把所有逻辑都写在路由闭包里。这时候就需要控制器了。\n\n### 创建控制器\n\n使用 `knit` 工具可以快速生成控制器:\n\n```bash\nknit make:controller UserController\n```\n\n这会在 `app/http/controllers` 目录下生成 `user_controller.go`。让我们修改它来添加一个 `Show` 方法:\n\n```go\npackage controllers\n\nimport (\n \"github.com/goravel/framework/contracts/http\"\n)\n\ntype UserController struct {\n // 可以在这里注入服务\n}\n\nfunc NewUserController() *UserController {\n return &UserController{}\n}\n\nfunc (r *UserController) Show(ctx http.Context) http.Response {\n id := ctx.Request().Input(\"id\")\n // 模拟数据库查询\n return ctx.Response().Success().Json(http.Json{\n \"id\": id,\n \"name\": \"Goravel User\",\n })\n}\n```\n\n### 注册控制器路由\n\n回到 `routes/api.go`,我们需要先实例化控制器,然后绑定路由:\n\n```go\nimport \"my-goravel-app/app/http/controllers\"\n\nfunc Api() {\n userController := controllers.NewUserController()\n \n // 绑定到控制器方法\n facades.Route().Get(\"/users/{id}\", userController.Show)\n}\n```\n\n## 请求与响应\n\n在控制器方法中, `ctx` (http.Context) 是核心:\n\n- **获取输入**: `ctx.Request().Input(\"key\")`\n- **获取 JSON**: `ctx.Request().Bind(&user)`\n- **返回 JSON**: `ctx.Response().Json(200, data)`\n- **设置状态码**: `ctx.Response().Status(404)`\n\n通过这种方式, Goravel 让 HTTP 层的处理变得异常清晰和标准化。下一章,我们将学习如何通过 ORM 操作数据库。 ' , 901 , 1 , 0 , 1768465933 , 1768538949 ) ;
INSERT IGNORE INTO ` posts ` ( ` id ` , ` original_id ` , ` title ` , ` category_id ` , ` column_id ` , ` excerpt ` , ` content ` , ` read_count ` , ` is_published ` , ` deleted_at ` , ` created_at ` , ` updated_at ` ) VALUES ( 6 , ' goravel-guide-3 ' , ' Goravel 入门指南 (三): ORM 数据库操作 ' , 4 , 1 , ' 掌握 Goravel 强大的 ORM 功能, 从数据库配置、模型定义到执行增删改查( CRUD) 操作。 ' , ' ## Goravel ORM 简介\n\nGoravel 的 ORM 基于著名的 GORM 库构建,但它进行了一层优雅的封装,使其调用方式更接近 Laravel 的 Eloquent ORM。这意味着你可以使用 Facade 模式轻松调用数据库,且支持自动迁移。\n\n## 配置数据库\n\n打开 `config/database.go` 或 `.env` 文件,配置你的 MySQL 连接信息:\n\n```env\nDB_CONNECTION=mysql\nDB_HOST=127.0.0.1\nDB_PORT=3306\nDB_DATABASE=goravel\nDB_USERNAME=root\nDB_PASSWORD=password\n```\n\n## 定义模型\n\n使用 `knit` 生成模型:\n\n```bash\nknit make:model Post\n```\n\n生成的模型文件位于 `app/models/post.go`。我们需要定义结构体字段:\n\n```go\npackage models\n\nimport (\n \"github.com/goravel/framework/database/orm\"\n)\n\ntype Post struct {\n orm.Model\n Title string `gorm:\"size:255;not null\"`\n Content string `gorm:\"type:text\"`\n UserID uint\n}\n```\n\n## 数据库迁移\n\n虽然 GORM 支持 AutoMigrate, 但 Goravel 推荐使用迁移文件来管理数据库变更。\n\n```bash\nknit make:migration create_posts_table\n```\n\n编辑生成的迁移文件 (`database/migrations/xxxx_create_posts_table.go`),定义表结构,然后运行:\n\n```bash\nknit migrate\n```\n\n## CRUD 操作\n\n有了模型, 我们就可以愉快地操作数据库了。所有操作都通过 `facades.Orm()` 入口。\n\n### 创建 (Create)\n\n```go\npost := models.Post{\n Title: \"My First Post\",\n Content: \"Content goes here...\",\n}\nerr := facades.Orm().Query().Create(&post)\n```\n\n### 查询 (Read)\n\n```go\nvar post models.Post\n// 根据主键查询\nfacades.Orm().Query().Find(&post, 1)\n\n// 条件查询\nvar posts []models.Post\nfacades.Orm().Query().Where(\"title\", \"My First Post\").Get(&posts)\n```\n\n### 更新 (Update)\n\n```go\nvar post models.Post\nfacades.Orm().Query().Find(&post, 1)\n\npost.Title = \"Updated Title\"\nfacades.Orm().Query().Save(&post)\n```\n\n### 删除 (Delete)\n\n```go\nvar post models.Post\nfacades.Orm().Query().Delete(&post, 1)\n```\n\nGoravel 的 ORM 让 Go 语言的数据库操作不再繁琐,极大地提高了开发效率。配合之前的路由和控制器知识,你现在已经具备了开发完整 RESTful API 的能力! ' , 1569 , 1 , 0 , 1768465934 , 1768538949 ) ;
2026-01-15 13:51:44 +08:00
2026-01-15 15:37:34 +08:00
-- ----------------------------
-- Table structure for role_permissions
-- ----------------------------
DROP TABLE IF EXISTS ` role_permissions ` ;
CREATE TABLE ` role_permissions ` (
` role_id ` bigint UNSIGNED NOT NULL COMMENT ' 角色ID ' ,
` permission_id ` bigint UNSIGNED NOT NULL COMMENT ' 权限ID ' ,
PRIMARY KEY ( ` role_id ` , ` permission_id ` ) USING BTREE ,
2026-01-16 17:03:34 +08:00
INDEX ` role_permissions_ibfk_2 ` ( ` permission_id ` ASC ) USING BTREE
2026-01-15 15:37:34 +08:00
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = ' 角色权限关联表 ' ROW_FORMAT = DYNAMIC ;
-- ----------------------------
-- Records of role_permissions
-- ----------------------------
INSERT INTO ` role_permissions ` VALUES ( 1 , 1 ) ;
INSERT INTO ` role_permissions ` VALUES ( 1 , 2 ) ;
INSERT INTO ` role_permissions ` VALUES ( 3 , 2 ) ;
INSERT INTO ` role_permissions ` VALUES ( 1 , 3 ) ;
INSERT INTO ` role_permissions ` VALUES ( 1 , 4 ) ;
INSERT INTO ` role_permissions ` VALUES ( 1 , 5 ) ;
INSERT INTO ` role_permissions ` VALUES ( 1 , 6 ) ;
INSERT INTO ` role_permissions ` VALUES ( 3 , 6 ) ;
INSERT INTO ` role_permissions ` VALUES ( 1 , 7 ) ;
INSERT INTO ` role_permissions ` VALUES ( 1 , 8 ) ;
INSERT INTO ` role_permissions ` VALUES ( 1 , 9 ) ;
INSERT INTO ` role_permissions ` VALUES ( 2 , 9 ) ;
INSERT INTO ` role_permissions ` VALUES ( 1 , 10 ) ;
INSERT INTO ` role_permissions ` VALUES ( 2 , 10 ) ;
INSERT INTO ` role_permissions ` VALUES ( 3 , 10 ) ;
INSERT INTO ` role_permissions ` VALUES ( 1 , 11 ) ;
INSERT INTO ` role_permissions ` VALUES ( 2 , 11 ) ;
INSERT INTO ` role_permissions ` VALUES ( 1 , 12 ) ;
INSERT INTO ` role_permissions ` VALUES ( 2 , 12 ) ;
INSERT INTO ` role_permissions ` VALUES ( 1 , 13 ) ;
INSERT INTO ` role_permissions ` VALUES ( 1 , 14 ) ;
INSERT INTO ` role_permissions ` VALUES ( 3 , 14 ) ;
INSERT INTO ` role_permissions ` VALUES ( 1 , 15 ) ;
INSERT INTO ` role_permissions ` VALUES ( 1 , 16 ) ;
INSERT INTO ` role_permissions ` VALUES ( 1 , 17 ) ;
INSERT INTO ` role_permissions ` VALUES ( 1 , 18 ) ;
INSERT INTO ` role_permissions ` VALUES ( 3 , 18 ) ;
INSERT INTO ` role_permissions ` VALUES ( 1 , 19 ) ;
INSERT INTO ` role_permissions ` VALUES ( 1 , 20 ) ;
INSERT INTO ` role_permissions ` VALUES ( 1 , 21 ) ;
INSERT INTO ` role_permissions ` VALUES ( 1 , 22 ) ;
INSERT INTO ` role_permissions ` VALUES ( 3 , 22 ) ;
INSERT INTO ` role_permissions ` VALUES ( 1 , 23 ) ;
INSERT INTO ` role_permissions ` VALUES ( 1 , 24 ) ;
INSERT INTO ` role_permissions ` VALUES ( 1 , 25 ) ;
INSERT INTO ` role_permissions ` VALUES ( 1 , 26 ) ;
INSERT INTO ` role_permissions ` VALUES ( 3 , 26 ) ;
INSERT INTO ` role_permissions ` VALUES ( 1 , 27 ) ;
INSERT INTO ` role_permissions ` VALUES ( 1 , 28 ) ;
INSERT INTO ` role_permissions ` VALUES ( 1 , 29 ) ;
INSERT INTO ` role_permissions ` VALUES ( 3 , 29 ) ;
INSERT INTO ` role_permissions ` VALUES ( 1 , 30 ) ;
INSERT INTO ` role_permissions ` VALUES ( 3 , 30 ) ;
-- ----------------------------
-- Table structure for roles
-- ----------------------------
DROP TABLE IF EXISTS ` roles ` ;
CREATE TABLE ` roles ` (
` id ` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT ' 主键ID ' ,
` name ` varchar ( 50 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 角色名称 ' ,
` description ` varchar ( 200 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT ' 角色描述 ' ,
2026-01-16 13:01:21 +08:00
` deleted_at ` bigint NOT NULL DEFAULT 0 ,
2026-01-16 13:38:52 +08:00
` created_at ` bigint NOT NULL DEFAULT 0 ,
` updated_at ` bigint NOT NULL DEFAULT 0 ,
2026-01-15 15:37:34 +08:00
PRIMARY KEY ( ` id ` ) USING BTREE ,
UNIQUE INDEX ` name ` ( ` name ` ASC ) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = ' 角色表 ' ROW_FORMAT = DYNAMIC ;
-- ----------------------------
-- Records of roles
-- ----------------------------
2026-01-16 13:38:52 +08:00
INSERT INTO ` roles ` VALUES ( 1 , ' admin ' , ' 系统管理员 ' , 0 , 1768452892 , 1768538956 ) ;
INSERT INTO ` roles ` VALUES ( 2 , ' editor ' , ' 内容编辑 ' , 0 , 1768452892 , 1768538956 ) ;
INSERT INTO ` roles ` VALUES ( 3 , ' viewer ' , ' 普通访客 ' , 0 , 1768452892 , 1768538956 ) ;
2026-01-15 15:37:34 +08:00
2026-01-15 13:51:44 +08:00
-- ----------------------------
-- Table structure for settings
-- ----------------------------
DROP TABLE IF EXISTS ` settings ` ;
CREATE TABLE ` settings ` (
` id ` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT ' 主键ID ' ,
` key_name ` varchar ( 100 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 配置项键名 ' ,
` value ` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT ' 配置项值 ' ,
` description ` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT ' 配置项描述 ' ,
2026-01-16 13:01:21 +08:00
` deleted_at ` bigint NOT NULL DEFAULT 0 ,
2026-01-16 13:38:52 +08:00
` created_at ` bigint NOT NULL DEFAULT 0 ,
` updated_at ` bigint NOT NULL DEFAULT 0 ,
2026-01-15 13:51:44 +08:00
PRIMARY KEY ( ` id ` ) USING BTREE ,
UNIQUE INDEX ` key_name ` ( ` key_name ` ASC ) USING BTREE ,
INDEX ` idx_key_name ` ( ` key_name ` ASC ) USING BTREE COMMENT ' 按键名查询索引 '
2026-01-15 15:37:34 +08:00
) ENGINE = InnoDB AUTO_INCREMENT = 15 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = ' 网站配置表 ' ROW_FORMAT = DYNAMIC ;
2026-01-15 13:51:44 +08:00
-- ----------------------------
-- Records of settings
-- ----------------------------
2026-01-16 13:38:52 +08:00
INSERT INTO ` settings ` VALUES ( 1 , ' site_title ' , ' 年糕博客 ' , ' 网站标题 ' , 0 , 1768291814 , 1768538952 ) ;
INSERT INTO ` settings ` VALUES ( 2 , ' site_description ' , ' 分享前端技术、交互设计以及数字艺术的深度思考 ' , ' 网站描述 ' , 0 , 1768291814 , 1768538952 ) ;
INSERT INTO ` settings ` VALUES ( 3 , ' site_author ' , ' 年糕崽崽 ' , ' 网站作者 ' , 0 , 1768291814 , 1768538952 ) ;
INSERT INTO ` settings ` VALUES ( 4 , ' site_keywords ' , ' 前端, 设计, 技术博客 ' , ' 网站关键词 ' , 0 , 1768291814 , 1768538952 ) ;
INSERT INTO ` settings ` VALUES ( 5 , ' posts_per_page ' , ' 10 ' , ' 每页显示的文章数量 ' , 0 , 1768291814 , 1768538952 ) ;
INSERT INTO ` settings ` VALUES ( 6 , ' works_per_page ' , ' 6 ' , ' 每页显示的作品数量 ' , 0 , 1768291814 , 1768538952 ) ;
INSERT INTO ` settings ` VALUES ( 7 , ' snippets_per_page ' , ' 8 ' , ' 每页显示的代码片段数量 ' , 0 , 1768291814 , 1768538952 ) ;
2026-01-15 13:51:44 +08:00
-- ----------------------------
-- Table structure for snippets
-- ----------------------------
DROP TABLE IF EXISTS ` snippets ` ;
CREATE TABLE ` snippets ` (
` id ` varchar ( 50 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 代码片段唯一标识 ' ,
` title ` varchar ( 200 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 代码片段标题 ' ,
` code ` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 代码内容 ' ,
` type ` varchar ( 50 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 代码类型( 如: javascript、css、html等) ' ,
` description ` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT ' 代码片段描述 ' ,
` view_count ` int UNSIGNED NULL DEFAULT 0 COMMENT ' 查看次数 ' ,
2026-01-16 13:01:21 +08:00
` deleted_at ` bigint NOT NULL DEFAULT 0 ,
2026-01-16 13:38:52 +08:00
` created_at ` bigint NOT NULL DEFAULT 0 ,
` updated_at ` bigint NOT NULL DEFAULT 0 ,
2026-01-15 13:51:44 +08:00
PRIMARY KEY ( ` id ` ) USING BTREE ,
INDEX ` idx_type ` ( ` type ` ASC ) USING BTREE COMMENT ' 按代码类型查询索引 ' ,
INDEX ` idx_view_count ` ( ` view_count ` ASC ) USING BTREE COMMENT ' 按查看次数查询索引 '
2026-01-15 15:37:34 +08:00
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = ' 代码片段表 ' ROW_FORMAT = DYNAMIC ;
2026-01-15 13:51:44 +08:00
-- ----------------------------
-- Records of snippets
-- ----------------------------
2026-01-19 14:01:37 +08:00
INSERT INTO ` snippets ` VALUES ( ' 1 ' , ' React 鼠标追踪 Hook ' , ' import { useState, useEffect } from \ ' react \ ' ;\r\n\r\nexport const useMousePosition = () => {\r\n const [pos, setPos] = useState({ x: 0, y: 0 });\r\n useEffect(() => {\r\n const update = (e) => setPos({ x: e.clientX, y: e.clientY });\r\n window.addEventListener(\ ' mousemove \ ' , update);\r\n return () => window.removeEventListener(\ ' mousemove \ ' , update);\r\n }, []);\r\n return pos;\r\n}; ' , ' mouse ' , ' 这是一个鼠标追踪 ' , 2 , 0 , 1768350739 , 1768538952 ) ;
2026-01-15 13:51:44 +08:00
-- ----------------------------
-- Table structure for tags
-- ----------------------------
2026-01-19 16:14:08 +08:00
-- Ensure table is dropped even if it has dependencies
SET FOREIGN_KEY_CHECKS = 0 ;
2026-01-15 13:51:44 +08:00
DROP TABLE IF EXISTS ` tags ` ;
CREATE TABLE ` tags ` (
` id ` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT ' 主键ID ' ,
` name ` varchar ( 50 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 标签名称 ' ,
` slug ` varchar ( 50 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 标签别名, 用于URL ' ,
2026-01-16 13:01:21 +08:00
` deleted_at ` bigint NOT NULL DEFAULT 0 ,
2026-01-16 13:38:52 +08:00
` created_at ` bigint NOT NULL DEFAULT 0 ,
` updated_at ` bigint NOT NULL DEFAULT 0 ,
2026-01-15 13:51:44 +08:00
PRIMARY KEY ( ` id ` ) USING BTREE ,
UNIQUE INDEX ` name ` ( ` name ` ASC ) USING BTREE ,
UNIQUE INDEX ` slug ` ( ` slug ` ASC ) USING BTREE ,
INDEX ` idx_slug ` ( ` slug ` ASC ) USING BTREE COMMENT ' 按别名查询索引 '
2026-01-19 14:01:37 +08:00
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = ' 标签表 ' ROW_FORMAT = DYNAMIC ;
2026-01-15 13:51:44 +08:00
-- ----------------------------
-- Records of tags
-- ----------------------------
2026-01-19 16:14:08 +08:00
INSERT IGNORE INTO ` tags ` ( ` id ` , ` name ` , ` slug ` , ` deleted_at ` , ` created_at ` , ` updated_at ` ) VALUES ( 1 , ' Goravel ' , ' ' , 0 , 1768550858 , 1768550858 ) ;
2026-01-15 13:51:44 +08:00
2026-01-16 09:08:29 +08:00
-- ----------------------------
-- Table structure for testimonials
-- ----------------------------
DROP TABLE IF EXISTS ` testimonials ` ;
CREATE TABLE ` testimonials ` (
` id ` int UNSIGNED NOT NULL AUTO_INCREMENT COMMENT ' 主键ID ' ,
` name ` varchar ( 100 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 客户姓名 ' ,
` role ` varchar ( 100 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT ' 客户职位 ' ,
` content ` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 评价内容 ' ,
` avatar ` varchar ( 500 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT ' 客户头像URL ' ,
` rating ` tinyint UNSIGNED NULL DEFAULT 5 COMMENT ' 评分(1-5) ' ,
` sort_order ` int UNSIGNED NULL DEFAULT 0 COMMENT ' 排序权重 ' ,
2026-01-16 13:01:21 +08:00
` deleted_at ` bigint NOT NULL DEFAULT 0 ,
2026-01-16 13:38:52 +08:00
` created_at ` bigint NOT NULL DEFAULT 0 ,
` updated_at ` bigint NOT NULL DEFAULT 0 ,
2026-01-16 09:08:29 +08:00
PRIMARY KEY ( ` id ` ) USING BTREE
2026-01-16 13:38:52 +08:00
) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = ' 客户评价表 ' ROW_FORMAT = DYNAMIC ;
2026-01-16 09:08:29 +08:00
-- ----------------------------
-- Records of testimonials
-- ----------------------------
2026-01-16 13:38:52 +08:00
INSERT INTO ` testimonials ` VALUES ( 1 , ' Alex Chen ' , ' Product Owner @ TechFlow ' , ' 年糕不仅技术过硬,对设计细节的把控更是令人惊叹。 ' , ' https://api.dicebear.com/7.x/avataaars/svg?seed=Alex ' , 5 , 0 , 0 , 1768482993 , 1768538954 ) ;
INSERT INTO ` testimonials ` VALUES ( 2 , ' Sarah Wu ' , ' Design Director @ ArtSpace ' , ' 很少见到能把代码写得像诗一样的工程师,合作非常愉快! ' , ' https://api.dicebear.com/7.x/avataaars/svg?seed=Sarah ' , 5 , 0 , 0 , 1768482993 , 1768538954 ) ;
INSERT INTO ` testimonials ` VALUES ( 3 , ' Mike Zhang ' , ' CTO @ FutureWave ' , ' 交付质量远超预期,特别是在性能优化方面做得非常出色。 ' , ' https://api.dicebear.com/7.x/avataaars/svg?seed=Mike ' , 5 , 0 , 0 , 1768482993 , 1768538954 ) ;
INSERT INTO ` testimonials ` VALUES ( 4 , ' Jessica Li ' , ' Founder @ ZenMode ' , ' 从交互动效到整体架构,都体现了极高的专业水准。 ' , ' https://api.dicebear.com/7.x/avataaars/svg?seed=Jessica ' , 5 , 0 , 0 , 1768482993 , 1768538954 ) ;
INSERT INTO ` testimonials ` VALUES ( 5 , ' David Wang ' , ' Tech Lead @ Innovate ' , ' 代码结构清晰,注释完善,后续维护非常轻松。 ' , ' https://api.dicebear.com/7.x/avataaars/svg?seed=David ' , 5 , 0 , 0 , 1768482993 , 1768538954 ) ;
INSERT INTO ` testimonials ` VALUES ( 6 , ' ' , ' CTO ' , ' 服务很贴心,技术够硬 ' , ' https://api.dicebear.com/7.x/avataaars/svg?seed=David ' , 5 , 0 , 0 , 20260116130552 , 20260116130552 ) ;
2026-01-16 09:08:29 +08:00
2026-01-16 10:19:30 +08:00
-- ----------------------------
-- Table structure for user_access_logs
-- ----------------------------
DROP TABLE IF EXISTS ` user_access_logs ` ;
CREATE TABLE ` user_access_logs ` (
` id ` int NOT NULL AUTO_INCREMENT ,
` user_id ` int NULL DEFAULT 0 COMMENT ' 用户ID( 未登录用户为0) ' ,
` user_ip ` varchar ( 45 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT ' 用户IP地址 ' ,
` user_location ` varchar ( 100 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT ' 用户归属地 ' ,
` article_id ` int NOT NULL COMMENT ' 访问的文章ID ' ,
2026-01-16 13:01:21 +08:00
` deleted_at ` bigint NOT NULL DEFAULT 0 ,
2026-01-16 13:38:52 +08:00
` access_time ` bigint NOT NULL DEFAULT 0 ,
2026-01-16 10:19:30 +08:00
PRIMARY KEY ( ` id ` ) USING BTREE ,
INDEX ` idx_user_id ` ( ` user_id ` ASC ) USING BTREE ,
2026-01-16 13:38:52 +08:00
INDEX ` idx_article_id ` ( ` article_id ` ASC ) USING BTREE
2026-01-19 14:01:37 +08:00
) ENGINE = InnoDB AUTO_INCREMENT = 19 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = ' 用户访问记录表 ' ROW_FORMAT = DYNAMIC ;
2026-01-16 10:19:30 +08:00
-- ----------------------------
-- Records of user_access_logs
-- ----------------------------
2026-01-19 14:01:37 +08:00
INSERT INTO ` user_access_logs ` VALUES ( 13 , 0 , ' ::1 ' , ' Unknown ' , 6 , 0 , 20260116160835 ) ;
INSERT INTO ` user_access_logs ` VALUES ( 14 , 0 , ' ::1 ' , ' Unknown ' , 6 , 0 , 20260116165800 ) ;
INSERT INTO ` user_access_logs ` VALUES ( 15 , 0 , ' ::1 ' , ' Unknown ' , 6 , 0 , 20260119133107 ) ;
INSERT INTO ` user_access_logs ` VALUES ( 16 , 0 , ' ::1 ' , ' Unknown ' , 6 , 0 , 20260119133147 ) ;
INSERT INTO ` user_access_logs ` VALUES ( 17 , 0 , ' ::1 ' , ' Unknown ' , 6 , 0 , 20260119133216 ) ;
INSERT INTO ` user_access_logs ` VALUES ( 18 , 0 , ' ::1 ' , ' Internal ' , 6 , 0 , 1768801962 ) ;
2026-01-16 10:19:30 +08:00
2026-01-15 13:51:44 +08:00
-- ----------------------------
-- Table structure for users
-- ----------------------------
DROP TABLE IF EXISTS ` users ` ;
CREATE TABLE ` users ` (
` id ` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT ' 主键ID ' ,
` username ` varchar ( 50 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 用户名 ' ,
` email ` varchar ( 100 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 邮箱地址 ' ,
` password_hash ` varchar ( 255 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 密码哈希值 ' ,
2026-01-15 15:37:34 +08:00
` role_id ` bigint UNSIGNED NULL DEFAULT NULL COMMENT ' 角色ID ' ,
2026-01-15 13:51:44 +08:00
` role ` enum ( ' admin ' , ' editor ' , ' viewer ' ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT ' viewer ' COMMENT ' 用户角色(兼容旧版) ' ,
` is_active ` tinyint ( 1 ) NULL DEFAULT 1 COMMENT ' 是否激活( 0: 禁用, 1: 激活) ' ,
2026-01-16 13:01:21 +08:00
` deleted_at ` bigint NOT NULL DEFAULT 0 ,
2026-01-16 13:38:52 +08:00
` created_at ` bigint NOT NULL DEFAULT 0 ,
` updated_at ` bigint NOT NULL DEFAULT 0 ,
2026-01-15 13:51:44 +08:00
PRIMARY KEY ( ` id ` ) USING BTREE ,
UNIQUE INDEX ` username ` ( ` username ` ASC ) USING BTREE ,
UNIQUE INDEX ` email ` ( ` email ` ASC ) USING BTREE ,
INDEX ` idx_username ` ( ` username ` ASC ) USING BTREE COMMENT ' 按用户名查询索引 ' ,
INDEX ` idx_email ` ( ` email ` ASC ) USING BTREE COMMENT ' 按邮箱查询索引 ' ,
INDEX ` idx_role ` ( ` role ` ASC ) USING BTREE COMMENT ' 按角色查询索引 ' ,
2026-01-16 17:03:34 +08:00
INDEX ` users_ibfk_1 ` ( ` role_id ` ASC ) USING BTREE
2026-01-15 16:44:00 +08:00
) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = ' 用户表 ' ROW_FORMAT = DYNAMIC ;
2026-01-15 13:51:44 +08:00
-- ----------------------------
-- Records of users
-- ----------------------------
2026-01-19 16:14:08 +08:00
INSERT IGNORE INTO ` users ` ( ` id ` , ` username ` , ` email ` , ` password_hash ` , ` role_id ` , ` role ` , ` is_active ` , ` deleted_at ` , ` created_at ` , ` updated_at ` ) VALUES ( 1 , ' lq ' , ' liqiworker@gmail.com ' , ' $2a$14$OqZ7svgz3S68yuuXTJWz1.0CuqI2i3WvwC1jIGBy4l0mcJW9Kqvy2 ' , 1 , ' admin ' , 1 , 0 , 1768291814 , 1768538951 ) ;
INSERT IGNORE INTO ` users ` ( ` id ` , ` username ` , ` email ` , ` password_hash ` , ` role_id ` , ` role ` , ` is_active ` , ` deleted_at ` , ` created_at ` , ` updated_at ` ) VALUES ( 2 , ' editor ' , ' editor@example.com ' , ' $2a$14$OqZ7svgz3S68yuuXTJWz1.0CuqI2i3WvwC1jIGBy4l0mcJW9Kqvy2 ' , 2 , ' editor ' , 1 , 0 , 1768291814 , 1768538951 ) ;
INSERT IGNORE INTO ` users ` ( ` id ` , ` username ` , ` email ` , ` password_hash ` , ` role_id ` , ` role ` , ` is_active ` , ` deleted_at ` , ` created_at ` , ` updated_at ` ) VALUES ( 5 , ' cs ' , ' cs@nailaoyun.cn ' , ' $2a$14$OqZ7svgz3S68yuuXTJWz1.0CuqI2i3WvwC1jIGBy4l0mcJW9Kqvy2 ' , 3 , ' viewer ' , 1 , 0 , 1768462115 , 1768538951 ) ;
2026-01-15 13:51:44 +08:00
-- ----------------------------
-- Table structure for work_gallery
-- ----------------------------
DROP TABLE IF EXISTS ` work_gallery ` ;
CREATE TABLE ` work_gallery ` (
` id ` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT ' 主键ID ' ,
` work_id ` varchar ( 50 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 关联的作品ID ' ,
` image_url ` varchar ( 500 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 图片URL ' ,
` sort_order ` int UNSIGNED NULL DEFAULT 0 COMMENT ' 排序顺序,数值越小越靠前 ' ,
` description ` varchar ( 200 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT ' ' COMMENT ' 图片描述 ' ,
2026-01-16 13:38:52 +08:00
` deleted_at ` bigint NOT NULL DEFAULT 0 ,
` created_at ` bigint NOT NULL DEFAULT 0 ,
2026-01-15 13:51:44 +08:00
PRIMARY KEY ( ` id ` ) USING BTREE ,
INDEX ` idx_work_id ` ( ` work_id ` ASC ) USING BTREE ,
2026-01-16 17:03:34 +08:00
INDEX ` idx_sort_order ` ( ` sort_order ` ASC ) USING BTREE
2026-01-15 15:37:34 +08:00
) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = ' 作品图库表 ' ROW_FORMAT = DYNAMIC ;
2026-01-15 13:51:44 +08:00
-- ----------------------------
-- Records of work_gallery
-- ----------------------------
2026-01-16 13:38:52 +08:00
INSERT INTO ` work_gallery ` VALUES ( 1 , ' nova ' , ' https://images.unsplash.com/photo-1642543492481-44e81e3914a7?q=80&w=2070 ' , 1 , ' Nova 交易平台首页 ' , 0 , 1768291937 ) ;
INSERT INTO ` work_gallery ` VALUES ( 2 , ' nova ' , ' https://images.unsplash.com/photo-1551288049-bebda4e38f71?q=80&w=2070 ' , 2 , ' Nova 交易平台交易界面 ' , 0 , 1768291937 ) ;
INSERT INTO ` work_gallery ` VALUES ( 3 , ' archdaily ' , ' https://images.unsplash.com/photo-1503387762-592deb58ef4e?q=80&w=2089 ' , 1 , ' ArchDaily 网站首页 ' , 0 , 1768291937 ) ;
INSERT INTO ` work_gallery ` VALUES ( 4 , ' archdaily ' , ' https://images.unsplash.com/photo-1518005020951-ecc859466abc?q=80&w=1920 ' , 2 , ' ArchDaily 文章详情页 ' , 0 , 1768291937 ) ;
2026-01-15 13:51:44 +08:00
-- ----------------------------
-- Table structure for work_tech_stack
-- ----------------------------
DROP TABLE IF EXISTS ` work_tech_stack ` ;
CREATE TABLE ` work_tech_stack ` (
` id ` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT ' 主键ID ' ,
` work_id ` varchar ( 50 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 关联的作品ID ' ,
` category ` varchar ( 100 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 技术分类(如:前端、后端、数据库等) ' ,
` item ` varchar ( 100 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 具体技术项( 如: Vue 3、Golang、MySQL等) ' ,
2026-01-16 13:38:52 +08:00
` deleted_at ` bigint NOT NULL DEFAULT 0 ,
` created_at ` bigint NOT NULL DEFAULT 0 ,
2026-01-15 13:51:44 +08:00
PRIMARY KEY ( ` id ` ) USING BTREE ,
INDEX ` idx_work_id ` ( ` work_id ` ASC ) USING BTREE ,
2026-01-16 17:03:34 +08:00
INDEX ` idx_category ` ( ` category ` ASC ) USING BTREE
2026-01-15 15:37:34 +08:00
) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = ' 作品技术栈表 ' ROW_FORMAT = DYNAMIC ;
2026-01-15 13:51:44 +08:00
-- ----------------------------
-- Records of work_tech_stack
-- ----------------------------
2026-01-16 13:38:52 +08:00
INSERT INTO ` work_tech_stack ` VALUES ( 1 , ' nova ' , ' 前端层 ' , ' React 18 ' , 0 , 1768291937 ) ;
INSERT INTO ` work_tech_stack ` VALUES ( 2 , ' nova ' , ' 前端层 ' , ' TypeScript ' , 0 , 1768291937 ) ;
INSERT INTO ` work_tech_stack ` VALUES ( 3 , ' nova ' , ' 前端层 ' , ' D3.js ' , 0 , 1768291937 ) ;
INSERT INTO ` work_tech_stack ` VALUES ( 4 , ' nova ' , ' 后端服务 ' , ' Golang ' , 0 , 1768291937 ) ;
INSERT INTO ` work_tech_stack ` VALUES ( 5 , ' nova ' , ' 后端服务 ' , ' gRPC ' , 0 , 1768291937 ) ;
INSERT INTO ` work_tech_stack ` VALUES ( 6 , ' archdaily ' , ' 核心前端 ' , ' Vue 3 ' , 0 , 1768291937 ) ;
INSERT INTO ` work_tech_stack ` VALUES ( 7 , ' archdaily ' , ' 核心前端 ' , ' Nuxt.js ' , 0 , 1768291937 ) ;
INSERT INTO ` work_tech_stack ` VALUES ( 8 , ' archdaily ' , ' 核心前端 ' , ' GSAP ' , 0 , 1768291937 ) ;
INSERT INTO ` work_tech_stack ` VALUES ( 9 , ' archdaily ' , ' CMS ' , ' Strapi ' , 0 , 1768291937 ) ;
2026-01-15 13:51:44 +08:00
-- ----------------------------
-- Table structure for works
-- ----------------------------
DROP TABLE IF EXISTS ` works ` ;
CREATE TABLE ` works ` (
` id ` varchar ( 50 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 作品唯一标识 ' ,
` title ` varchar ( 200 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 作品标题 ' ,
` category ` varchar ( 100 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 作品分类 ' ,
` year ` varchar ( 10 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 创作年份 ' ,
` hero_img ` varchar ( 500 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 作品主图URL ' ,
` description ` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 作品详细描述 ' ,
` is_featured ` tinyint ( 1 ) NULL DEFAULT 0 COMMENT ' 是否为精选作品( 0: 否, 1: 是) ' ,
2026-01-16 13:01:21 +08:00
` deleted_at ` bigint NOT NULL DEFAULT 0 ,
2026-01-16 13:38:52 +08:00
` created_at ` bigint NOT NULL DEFAULT 0 ,
` updated_at ` bigint NOT NULL DEFAULT 0 ,
2026-01-15 13:51:44 +08:00
PRIMARY KEY ( ` id ` ) USING BTREE ,
INDEX ` idx_category ` ( ` category ` ASC ) USING BTREE COMMENT ' 按分类查询索引 ' ,
INDEX ` idx_year ` ( ` year ` ASC ) USING BTREE COMMENT ' 按年份查询索引 ' ,
INDEX ` idx_is_featured ` ( ` is_featured ` ASC ) USING BTREE COMMENT ' 按精选状态查询索引 '
2026-01-15 15:37:34 +08:00
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = ' 作品表 ' ROW_FORMAT = DYNAMIC ;
2026-01-15 13:51:44 +08:00
-- ----------------------------
-- Records of works
-- ----------------------------
2026-01-19 16:14:08 +08:00
INSERT IGNORE INTO ` works ` VALUES ( ' archdaily ' , ' ArchDaily 网站重构 ' , ' 建筑设计 ' , ' 2022 ' , ' https://images.unsplash.com/photo-1487958449943-2429e8be8625?q=80&w=2070 ' , ' ArchDaily 是全球最受欢迎的建筑网站之一。这次重构的目标是提升移动端体验。我们使用了 Nuxt 3 进行服务端渲染( SSR) 。 ' , 1 , 0 , 1768291814 , 1768538952 ) ;
INSERT IGNORE INTO ` works ` VALUES ( ' nova ' , ' Nova 交易平台 ' , ' 金融科技 ' , ' 2023 ' , ' https://images.unsplash.com/photo-1487958449943-2429e8be8625?q=80&w=2070 ' , ' Nova 是一个专为机构交易员设计的高频交易终端。我们面临的最大挑战是如何在处理毫秒级市场数据的同时,保持界面的流畅响应。我们采用 Web Worker 来处理繁重的数据计算,避免阻塞主线程。 ' , 1 , 0 , 1768291814 , 1768538952 ) ;
-- ----------------------------
-- Table structure for search_logs
-- ----------------------------
DROP TABLE IF EXISTS ` search_logs ` ;
CREATE TABLE ` search_logs ` (
` id ` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT ' 主键ID ' ,
` keyword ` varchar ( 255 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 搜索关键词 ' ,
` search_type ` varchar ( 20 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 搜索类型: category/tag/column/keyword ' ,
` user_ip ` varchar ( 45 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 用户IP地址 ' ,
` user_location ` varchar ( 100 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT ' 用户归属地 ' ,
` deleted_at ` bigint NOT NULL DEFAULT 0 ,
` created_at ` bigint NOT NULL DEFAULT 0 ,
PRIMARY KEY ( ` id ` ) USING BTREE ,
INDEX ` idx_search_type ` ( ` search_type ` ASC ) USING BTREE ,
INDEX ` idx_created_at ` ( ` created_at ` ASC ) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = ' 搜索记录表 ' ROW_FORMAT = DYNAMIC ;
-- ----------------------------
-- Records of search_logs
-- ----------------------------
-- ----------------------------
-- Table structure for attachment_categories
-- ----------------------------
DROP TABLE IF EXISTS ` attachment_categories ` ;
CREATE TABLE ` attachment_categories ` (
` id ` int UNSIGNED NOT NULL AUTO_INCREMENT COMMENT ' 主键ID ' ,
` name ` varchar ( 100 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 分类名称 ' ,
` description ` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT ' 分类描述 ' ,
` sort_order ` int UNSIGNED NULL DEFAULT 0 COMMENT ' 排序 ' ,
` deleted_at ` bigint NOT NULL DEFAULT 0 ,
` created_at ` bigint NOT NULL DEFAULT 0 ,
` updated_at ` bigint NOT NULL DEFAULT 0 ,
PRIMARY KEY ( ` id ` ) USING BTREE ,
INDEX ` idx_sort_order ` ( ` sort_order ` ASC ) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = ' 附件分类表 ' ROW_FORMAT = DYNAMIC ;
-- ----------------------------
-- Records of attachment_categories
-- ----------------------------
-- ----------------------------
-- Table structure for oss_configs
-- ----------------------------
DROP TABLE IF EXISTS ` oss_configs ` ;
CREATE TABLE ` oss_configs ` (
` id ` int UNSIGNED NOT NULL AUTO_INCREMENT COMMENT ' 主键ID ' ,
` name ` varchar ( 100 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 配置名称 ' ,
` storage_type ` varchar ( 20 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 存储类型: local/qcloud/aliyun/qiniu ' ,
` access_key ` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' Access Key (AES加密) ' ,
` secret_key ` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' Secret Key (AES加密) ' ,
` bucket ` varchar ( 255 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT ' 存储桶名称 ' ,
` region ` varchar ( 100 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT ' 区域 ' ,
` domain ` varchar ( 500 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT ' 访问域名 ' ,
` is_active ` tinyint ( 1 ) NOT NULL DEFAULT 0 COMMENT ' 是否启用 ' ,
` deleted_at ` bigint NOT NULL DEFAULT 0 ,
` created_at ` bigint NOT NULL DEFAULT 0 ,
` updated_at ` bigint NOT NULL DEFAULT 0 ,
PRIMARY KEY ( ` id ` ) USING BTREE ,
INDEX ` idx_storage_type ` ( ` storage_type ` ASC ) USING BTREE ,
INDEX ` idx_is_active ` ( ` is_active ` ASC ) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = ' OSS配置表 ' ROW_FORMAT = DYNAMIC ;
-- ----------------------------
-- Records of oss_configs
-- ----------------------------
-- ----------------------------
-- Table structure for attachments
-- ----------------------------
DROP TABLE IF EXISTS ` attachments ` ;
CREATE TABLE ` attachments ` (
` id ` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT ' 主键ID ' ,
` category_id ` int UNSIGNED NULL DEFAULT NULL COMMENT ' 附件分类ID ' ,
` original_name ` varchar ( 255 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 原始文件名 ' ,
` stored_name ` varchar ( 255 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 存储文件名 ' ,
` file_path ` varchar ( 500 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 文件路径 ' ,
` file_url ` varchar ( 500 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ' 文件访问URL ' ,
` file_size ` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT ' 文件大小(字节) ' ,
` file_type ` varchar ( 50 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT ' 文件类型: image/video/document/other ' ,
` mime_type ` varchar ( 100 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT ' MIME类型 ' ,
` storage_type ` varchar ( 20 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT ' local ' COMMENT ' 存储类型: local/qcloud/aliyun/qiniu ' ,
` oss_config_id ` int UNSIGNED NULL DEFAULT NULL COMMENT ' OSS配置ID ' ,
` deleted_at ` bigint NOT NULL DEFAULT 0 ,
` created_at ` bigint NOT NULL DEFAULT 0 ,
` updated_at ` bigint NOT NULL DEFAULT 0 ,
PRIMARY KEY ( ` id ` ) USING BTREE ,
INDEX ` idx_category_id ` ( ` category_id ` ASC ) USING BTREE ,
INDEX ` idx_storage_type ` ( ` storage_type ` ASC ) USING BTREE ,
INDEX ` idx_file_type ` ( ` file_type ` ASC ) USING BTREE ,
INDEX ` idx_created_at ` ( ` created_at ` ASC ) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = ' 附件表 ' ROW_FORMAT = DYNAMIC ;
-- ----------------------------
-- Records of attachments
-- ----------------------------
2026-01-15 13:51:44 +08:00
2026-01-15 15:37:34 +08:00
SET FOREIGN_KEY_CHECKS = 1 ;