数据库初始化

This commit is contained in:
jinye_huang 2025-07-11 15:29:39 +08:00
parent f6a48031a0
commit bebdba3c4b
5 changed files with 796 additions and 0 deletions

89
db/database_readme.md Normal file
View File

@ -0,0 +1,89 @@
# 旅游内容创作系统数据库
本文档介绍了旅游内容创作系统的数据库结构和使用方法。
## 数据库概述
旅游内容创作系统数据库包含以下主要表:
- **用户表(user)**: 存储系统用户信息
- **素材文件夹表(material_folder)**: 管理素材文件夹结构
- **素材表(material)**: 存储各类素材信息
- **景区表(scenicSpot)**: 存储景区相关信息
- **产品表(product)**: 存储旅游产品信息
- **内容风格表(contentStyle)**: 定义内容创作风格
- **目标人群表(targetAudience)**: 定义目标受众群体
- **选题信息表(topics)**: 存储选题信息
- **关联表**: 包括选题-景区、选题-产品、选题-风格、选题-目标受众等关联表
## 初始化数据库
使用以下命令初始化数据库并插入模拟数据:
```bash
# 添加执行权限
chmod +x db/init_db.sh
# 执行初始化脚本
./db/init_db.sh
```
脚本将创建名为`travel_content`的数据库,创建所有必要的表,并插入模拟数据。
## 查询数据库
### 查看数据库信息
使用以下命令查看数据库的详细信息:
```bash
# 添加执行权限
chmod +x db/show_db_info.sh
# 执行查询脚本
./db/show_db_info.sh
```
此脚本将显示数据库中的所有表和主要数据。
## 数据库模拟数据
初始化脚本已插入以下模拟数据:
- **用户**: 3个用户管理员、张三、李四
- **景区**: 4个景区黄山风景区、张家界国家森林公园、九寨沟风景区、丽江古城
- **产品**: 4个产品黄山亲子三日游、张家界避暑五日游、九寨沟摄影六日游、云南民族文化七日游
- **内容风格**: 6种风格攻略风、清新文艺风、幽默诙谐风、专业严谨风、情感共鸣风、极力推荐风
- **目标受众**: 6种受众年轻情侣、家庭亲子、中老年群体、商务人士、学生群体、高净值人群
- **选题**: 4个选题五一黄山亲子游攻略、张家界夏季避暑游、九寨沟秋色摄影指南、云南民族文化探秘之旅
- **素材文件夹**: 5个文件夹
- **素材**: 5个素材图片、视频、文档
## 数据库结构
数据库表之间的关系如下:
1. 用户(user) 1:N 素材文件夹(material_folder)
2. 用户(user) 1:N 素材(material)
3. 素材文件夹(material_folder) 1:N 素材(material)
4. 用户(user) 1:N 景区(scenicSpot)
5. 用户(user) 1:N 产品(product)
6. 用户(user) 1:N 选题(topics)
7. 选题(topics) N:M 景区(scenicSpot) 通过 topicScenic 关联
8. 选题(topics) N:M 产品(product) 通过 topicProduct 关联
9. 选题(topics) N:M 内容风格(contentStyle) 通过 topicStyle 关联
10. 选题(topics) N:M 目标受众(targetAudience) 通过 topicAudience 关联
## 模拟数据特点
根据resource/prompt目录中的信息模拟数据具有以下特点
1. **内容风格**包含攻略风、清新文艺风等多种风格参考了resource/prompt/Style目录中的风格提示词
2. **目标受众**根据resource/prompt/Demand目录中的用户画像细化了各类受众群体的特征
3. **选题标题**添加了emoji表情使标题更有网感和吸引力
4. **产品描述**:更加详细,突出产品特色和目标受众需求
5. **时间节点**参考了resource/prompt/Refer/2025各月节日宣传节点时间表.md使用2025年的时间节点
## 密码信息
所有模拟用户的密码均为: `123456`MD5加密后存储

473
db/init_database.sql Normal file
View File

@ -0,0 +1,473 @@
-- 创建数据库
DROP DATABASE IF EXISTS travel_content;
CREATE DATABASE IF NOT EXISTS travel_content;
USE travel_content;
-- 创建用户表
CREATE TABLE IF NOT EXISTS user (
id BIGINT AUTO_INCREMENT COMMENT 'id' PRIMARY KEY,
userAccount VARCHAR(256) NOT NULL COMMENT '账号',
userPassword VARCHAR(512) NOT NULL COMMENT '密码',
userName VARCHAR(256) NULL COMMENT '用户昵称',
userAvatar VARCHAR(1024) NULL COMMENT '用户头像',
userEmail VARCHAR(255) NULL COMMENT '用户邮箱',
userProfile VARCHAR(512) NULL COMMENT '用户简介',
userRole VARCHAR(256) DEFAULT 'user' NOT NULL COMMENT '用户角色user/admin',
editTime DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL COMMENT '编辑时间',
createTime DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL COMMENT '创建时间',
updateTime DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
lastLogin DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL COMMENT '最后登录时间',
isDelete TINYINT DEFAULT 0 NOT NULL COMMENT '是否删除',
CONSTRAINT uk_userAccount UNIQUE (userAccount),
CONSTRAINT userEmail UNIQUE (userEmail)
) COMMENT '用户' COLLATE = utf8mb4_unicode_ci;
CREATE INDEX idx_user_name ON user (userName);
-- 创建素材文件夹表
CREATE TABLE IF NOT EXISTS material_folder (
id BIGINT AUTO_INCREMENT COMMENT 'id' PRIMARY KEY,
userId BIGINT NOT NULL COMMENT '创建用户id',
folderName VARCHAR(256) NOT NULL COMMENT '文件夹名称',
parentId BIGINT DEFAULT 0 NOT NULL COMMENT '父文件夹id0表示根目录',
description VARCHAR(512) NULL COMMENT '文件夹描述',
isPublic TINYINT DEFAULT 0 NOT NULL COMMENT '是否公开0私有1公开',
createTime DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL COMMENT '创建时间',
updateTime DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
isDelete TINYINT DEFAULT 0 NOT NULL COMMENT '是否删除',
CONSTRAINT uk_folder_name_user UNIQUE (folderName, userId, parentId, isDelete)
) COMMENT '素材文件夹表' COLLATE = utf8mb4_unicode_ci;
CREATE INDEX idx_material_folder_parent ON material_folder (parentId);
CREATE INDEX idx_material_folder_user ON material_folder (userId);
-- 创建素材表
CREATE TABLE IF NOT EXISTS material (
id BIGINT AUTO_INCREMENT COMMENT 'id' PRIMARY KEY,
userId BIGINT NOT NULL COMMENT '上传用户id',
folderId BIGINT DEFAULT 0 NOT NULL COMMENT '所属文件夹id0表示根目录',
materialName VARCHAR(256) NOT NULL COMMENT '素材名称',
materialType VARCHAR(32) NOT NULL COMMENT '素材类型image/video/document',
filePath VARCHAR(1024) NOT NULL COMMENT '文件存储路径',
fileSize BIGINT NOT NULL COMMENT '文件大小(字节)',
fileFormat VARCHAR(32) NOT NULL COMMENT '文件格式jpg/png/mp4/pdf/doc等',
fileUrl VARCHAR(1024) NULL COMMENT '文件访问URL',
description VARCHAR(512) NULL COMMENT '素材描述',
tags VARCHAR(512) NULL COMMENT '素材标签(逗号分隔)',
isPublic TINYINT DEFAULT 0 NOT NULL COMMENT '是否公开0私有1公开',
status VARCHAR(32) DEFAULT 'active' NOT NULL COMMENT '状态active/inactive/deleted',
viewCount INT DEFAULT 0 NOT NULL COMMENT '查看次数',
downloadCount INT DEFAULT 0 NOT NULL COMMENT '下载次数',
createTime DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL COMMENT '创建时间',
updateTime DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
isDelete TINYINT DEFAULT 0 NOT NULL COMMENT '是否删除',
CONSTRAINT uk_material_name_user_folder UNIQUE (materialName, userId, folderId)
) COMMENT '素材表' COLLATE = utf8mb4_unicode_ci;
CREATE INDEX idx_material_create_time ON material (createTime);
CREATE INDEX idx_material_folder ON material (folderId);
CREATE INDEX idx_material_public ON material (isPublic);
CREATE INDEX idx_material_status ON material (status);
CREATE INDEX idx_material_type ON material (materialType);
CREATE INDEX idx_material_user ON material (userId);
-- 创建景区表
CREATE TABLE IF NOT EXISTS scenicSpot (
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键id',
userId BIGINT NOT NULL COMMENT '用户ID',
name VARCHAR(100) NOT NULL COMMENT '景区名称',
address VARCHAR(255) NULL COMMENT '地址',
trafficInfo VARCHAR(255) NULL COMMENT '交通指南',
description TEXT NULL COMMENT '描述',
advantage TEXT NULL COMMENT '景区优势',
highlight TEXT NULL COMMENT '景区亮点',
isPublic TINYINT NOT NULL DEFAULT 0 COMMENT '是否公开0私有1公开',
isDelete TINYINT NOT NULL DEFAULT 0 COMMENT '是否删除',
createTime DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updateTime DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
) COMMENT '景区表' COLLATE = utf8mb4_unicode_ci;
CREATE INDEX idx_scenicSpot_user ON scenicSpot (userId);
CREATE INDEX idx_scenicSpot_name ON scenicSpot (name);
CREATE INDEX idx_scenicSpot_public ON scenicSpot (isPublic);
-- 创建产品表
CREATE TABLE IF NOT EXISTS product (
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键id',
userId BIGINT NOT NULL COMMENT '用户ID',
name VARCHAR(100) NOT NULL COMMENT '产品名称',
originPrice DECIMAL(10,2) NULL COMMENT '原价',
realPrice DECIMAL(10,2) NULL COMMENT '实际价格',
packageInfo VARCHAR(255) NULL COMMENT '套票详情',
salesPeriod VARCHAR(100) NULL COMMENT '售卖期',
stock INT NULL COMMENT '库存',
advantage TEXT NULL COMMENT '产品优势',
highlight TEXT NULL COMMENT '产品亮点',
description TEXT NULL COMMENT '产品描述',
isPublic TINYINT NOT NULL DEFAULT 0 COMMENT '是否公开0私有1公开',
isDelete TINYINT NOT NULL DEFAULT 0 COMMENT '是否删除',
createTime DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updateTime DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
) COMMENT '产品表' COLLATE = utf8mb4_unicode_ci;
CREATE INDEX idx_product_user ON product (userId);
CREATE INDEX idx_product_name ON product (name);
CREATE INDEX idx_product_public ON product (isPublic);
-- 创建内容风格表
CREATE TABLE IF NOT EXISTS contentStyle (
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键id',
styleName VARCHAR(100) NOT NULL COMMENT '风格名称',
description TEXT NULL COMMENT '描述',
isDelete TINYINT NOT NULL DEFAULT 0 COMMENT '是否删除',
createTime DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updateTime DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
CONSTRAINT uk_styleName UNIQUE (styleName, isDelete)
) COMMENT '内容风格表' COLLATE = utf8mb4_unicode_ci;
CREATE INDEX idx_contentStyle_name ON contentStyle (styleName);
-- 创建目标人群表
CREATE TABLE IF NOT EXISTS targetAudience (
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT 'id',
audienceName VARCHAR(100) NOT NULL COMMENT '受众名称',
description TEXT NULL COMMENT '描述',
isDelete TINYINT DEFAULT 0 NOT NULL COMMENT '是否删除',
createTime DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL COMMENT '创建时间',
updateTime DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
CONSTRAINT uk_audienceName UNIQUE (audienceName, isDelete)
) COMMENT '目标人群表' COLLATE = utf8mb4_unicode_ci;
CREATE INDEX idx_targetAudience_name ON targetAudience (audienceName);
-- 创建文档解析表
CREATE TABLE IF NOT EXISTS documentParse (
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键id',
scenicName VARCHAR(100) NULL COMMENT '景区名称',
address VARCHAR(255) NULL COMMENT '地址',
trafficInfo VARCHAR(255) NULL COMMENT '交通指南',
description TEXT NULL COMMENT '描述',
advantage TEXT NULL COMMENT '景区优势',
highlight TEXT NULL COMMENT '景区亮点',
productName VARCHAR(100) NULL COMMENT '产品名称',
originPrice DECIMAL(10,2) NULL COMMENT '原价',
realPrice DECIMAL(10,2) NULL COMMENT '实际价格',
packageInfo VARCHAR(255) NULL COMMENT '套票详情',
salesPeriod VARCHAR(100) NULL COMMENT '售卖期',
stock INT NULL COMMENT '库存',
productAdvantage TEXT NULL COMMENT '产品优势',
productHighlight TEXT NULL COMMENT '产品亮点',
productDescription TEXT NULL COMMENT '产品描述',
isDelete TINYINT NOT NULL DEFAULT 0 COMMENT '是否删除',
createTime DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updateTime DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
) COMMENT '文档解析表' COLLATE = utf8mb4_unicode_ci;
CREATE INDEX idx_documentParse_scenicName ON documentParse (scenicName);
CREATE INDEX idx_documentParse_productName ON documentParse (productName);
-- 创建选题信息表
CREATE TABLE IF NOT EXISTS topics (
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键id',
userId BIGINT NOT NULL COMMENT '用户ID',
title VARCHAR(100) NOT NULL COMMENT '选题标题',
description VARCHAR(255) NULL COMMENT '选题描述',
logic TEXT NULL COMMENT '选题逻辑',
productLogic TEXT NULL COMMENT '产品选择逻辑',
styleLogic TEXT NULL COMMENT '风格选择逻辑',
targetAudienceLogic TEXT NULL COMMENT '目标受众选择逻辑',
publicationDates TEXT NULL COMMENT '计划发布日期(如"2025-05-01,2025-05-03"或JSON',
status VARCHAR(20) NOT NULL DEFAULT 'draft' COMMENT '状态',
isLocked TINYINT NOT NULL DEFAULT 0 COMMENT '是否锁定',
isDelete TINYINT NOT NULL DEFAULT 0 COMMENT '是否删除',
createTime DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updateTime DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
) COMMENT '选题信息表' COLLATE = utf8mb4_unicode_ci;
CREATE INDEX idxTopicsUser ON topics (userId);
CREATE INDEX idxTopicsTitle ON topics (title);
CREATE INDEX idxTopicsStatus ON topics (status);
-- 创建选题-景区关联表
CREATE TABLE IF NOT EXISTS topicScenic (
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键id',
topicId BIGINT NOT NULL COMMENT '选题ID',
scenicId BIGINT NOT NULL COMMENT '景区ID'
) COMMENT '选题-景区关联表' COLLATE = utf8mb4_unicode_ci;
CREATE INDEX idx_topic_scenic_topicId ON topicScenic (topicId);
CREATE INDEX idx_topic_scenic_scenicId ON topicScenic (scenicId);
-- 创建选题-产品关联表
CREATE TABLE IF NOT EXISTS topicProduct (
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键id',
topicId BIGINT NOT NULL COMMENT '选题ID',
productId BIGINT NOT NULL COMMENT '产品ID'
) COMMENT '选题-产品关联表' COLLATE = utf8mb4_unicode_ci;
CREATE INDEX idx_topic_product_topicId ON topicProduct (topicId);
CREATE INDEX idx_topic_product_productId ON topicProduct (productId);
-- 创建选题-风格关联表
CREATE TABLE IF NOT EXISTS topicStyle (
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键id',
topicId BIGINT NOT NULL COMMENT '选题ID',
styleId BIGINT NOT NULL COMMENT '风格ID'
) COMMENT '选题-风格关联表' COLLATE = utf8mb4_unicode_ci;
CREATE INDEX idx_topic_style_topicId ON topicStyle (topicId);
CREATE INDEX idx_topic_style_styleId ON topicStyle (styleId);
-- 创建选题-目标受众关联表
CREATE TABLE IF NOT EXISTS topicAudience (
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键id',
topicId BIGINT NOT NULL COMMENT '选题ID',
audienceId BIGINT NOT NULL COMMENT '受众ID'
) COMMENT '选题-目标受众关联表' COLLATE = utf8mb4_unicode_ci;
CREATE INDEX idx_topic_audience_topicId ON topicAudience (topicId);
CREATE INDEX idx_topic_audience_audienceId ON topicAudience (audienceId);
-- 添加外键约束
ALTER TABLE material_folder
ADD CONSTRAINT fk_material_folder_user
FOREIGN KEY (userId) REFERENCES user (id)
ON DELETE CASCADE;
ALTER TABLE material
ADD CONSTRAINT fk_material_user
FOREIGN KEY (userId) REFERENCES user (id)
ON DELETE CASCADE;
ALTER TABLE material
ADD CONSTRAINT fk_material_folder
FOREIGN KEY (folderId) REFERENCES material_folder (id)
ON DELETE CASCADE;
-- 插入模拟数据
-- 插入用户数据
INSERT INTO user (userAccount, userPassword, userName, userAvatar, userEmail, userProfile, userRole)
VALUES
('admin', 'e10adc3949ba59abbe56e057f20f883e', '管理员', 'https://example.com/avatar1.jpg', 'admin@example.com', '系统管理员', 'admin'),
('user1', 'e10adc3949ba59abbe56e057f20f883e', '张三', 'https://example.com/avatar2.jpg', 'zhangsan@example.com', '旅游内容创作者', 'user'),
('user2', 'e10adc3949ba59abbe56e057f20f883e', '李四', 'https://example.com/avatar3.jpg', 'lisi@example.com', '资深旅游策划', 'user');
-- 插入素材文件夹数据
INSERT INTO material_folder (userId, folderName, parentId, description, isPublic)
VALUES
(1, '景区图片', 0, '各景区精选图片', 1),
(1, '产品介绍', 0, '各产品介绍素材', 1),
(2, '我的素材', 0, '个人素材库', 0),
(2, '风景照片', 3, '各地风景照片', 0),
(3, '宣传材料', 0, '宣传用素材', 0);
-- 插入素材数据
INSERT INTO material (userId, folderId, materialName, materialType, filePath, fileSize, fileFormat, fileUrl, description, tags, isPublic)
VALUES
(1, 1, '黄山日出', 'image', '/uploads/huangshan_sunrise.jpg', 2048000, 'jpg', 'https://example.com/huangshan_sunrise.jpg', '黄山日出美景', '黄山,日出,风景', 1),
(1, 1, '张家界全景', 'image', '/uploads/zhangjiajie_panorama.jpg', 3072000, 'jpg', 'https://example.com/zhangjiajie_panorama.jpg', '张家界全景图', '张家界,全景,自然', 1),
(1, 2, '三亚双飞5日游', 'document', '/uploads/sanya_5days.pdf', 1024000, 'pdf', 'https://example.com/sanya_5days.pdf', '三亚双飞5日游产品介绍', '三亚,旅游产品,海滩', 1),
(2, 4, '九寨沟瀑布', 'image', '/uploads/jiuzhaigou_waterfall.jpg', 2560000, 'jpg', 'https://example.com/jiuzhaigou_waterfall.jpg', '九寨沟瀑布特写', '九寨沟,瀑布,自然风光', 0),
(3, 5, '丽江古城宣传片', 'video', '/uploads/lijiang_promo.mp4', 102400000, 'mp4', 'https://example.com/lijiang_promo.mp4', '丽江古城宣传视频', '丽江,古城,文化,宣传', 0);
-- 插入景区数据
INSERT INTO scenicSpot (userId, name, address, trafficInfo, description, advantage, highlight, isPublic)
VALUES
(1, '黄山风景区', '安徽省黄山市黄山区汤口镇', '可乘坐高铁到黄山北站,再转乘景区大巴', '黄山是中国著名的山岳景区,以奇松、怪石、云海、温泉"四绝"闻名于世。', '国家5A级景区世界文化与自然双遗产云海日出景观壮观', '云海日出、迎客松、温泉、奇松怪石', 1),
(1, '张家界国家森林公园', '湖南省张家界市武陵源区', '可乘坐飞机到张家界荷花机场,再转乘景区大巴', '张家界国家森林公园是中国第一个国家森林公园,以峰林地貌为主要特色。', '阿凡达取景地,独特的石柱地貌,夏季凉爽避暑胜地', '天子山、袁家界、金鞭溪、玻璃栈道', 1),
(2, '九寨沟风景区', '四川省阿坝藏族羌族自治州九寨沟县', '可乘坐飞机到九黄机场,再转乘景区大巴', '九寨沟以彩池、瀑布、雪山、森林"四绝"闻名于世。', '水景资源丰富,色彩斑斓的湖泊,秋季层林尽染', '五花海、诺日朗瀑布、长海、树正群海', 0),
(3, '丽江古城', '云南省丽江市古城区', '可乘坐飞机到丽江三义机场,再乘坐出租车前往古城', '丽江古城是一座历史文化名城,是中国为数不多的保存相当完好的少数民族古城。', '纳西族文化,古城风貌保存完好,民族风情浓郁', '四方街、木府、黑龙潭、万古楼', 1);
-- 插入产品数据
INSERT INTO product (userId, name, originPrice, realPrice, packageInfo, salesPeriod, stock, advantage, highlight, description, isPublic)
VALUES
(1, '黄山亲子三日游', 2199.00, 1899.00, '含往返交通、住宿、门票、导游', '2025-01-01至2025-12-31', 1000, '一价全包,无隐形消费,亲子互动环节丰富', '登顶观日出,泡温泉,亲子科普活动', '黄山三日亲子游,含住宿、餐饮、交通、门票等,专业导游全程陪同,设计多个亲子互动环节,让孩子在游玩中学习自然知识。', 1),
(1, '张家界避暑五日游', 3999.00, 3599.00, '含往返机票、住宿、门票、导游', '2025-06-01至2025-08-31', 800, '全程五星酒店,专车接送,夏季避暑胜地', '玻璃栈道,天门山索道,森林氧吧', '张家界五日避暑游畅游武陵源核心景区体验玻璃栈道惊险刺激享受平均气温仅22℃的夏日清凉。', 1),
(2, '九寨沟摄影六日游', 5299.00, 4899.00, '含往返机票、住宿、门票、导游', '2025-09-15至2025-10-31', 500, '一次游两大世界遗产地,摄影师专业指导', '九寨沟彩池,黄龙钙化池,摄影技巧培训', '九寨沟+黄龙六日摄影专线,资深摄影师全程指导,选择最佳拍摄时间和机位,捕捉秋季九寨最绚丽的色彩。', 0),
(3, '云南民族文化七日游', 6299.00, 5899.00, '含往返机票、住宿、门票、导游', '2025-01-01至2025-12-31', 600, '深度体验云南民族文化,高端精品小团', '丽江古城,洱海环湖,民族村寨体验', '云南丽江+大理七日文化之旅,体验纳西族和白族文化,参与非遗手工艺制作,聆听东巴文化讲解,入住丽江古城内精品客栈。', 1);
-- 插入内容风格数据
INSERT INTO contentStyle (styleName, description)
VALUES
('攻略风', '你是景区小红书爆款文案策划,你将根据要求创作爆款文案,根据以下规则一步步执行:
++
1.1emoji18
2.
3.<>仿
<><><>
1.
2.
3. <>/宿
4. +emoji
5. 仿
6🆚6
7N种神仙打开方式
👉线
便
-
🌤
55°C~20°C穿穿
线++
-
🧳
+
穿++15穿
yao+yao+湿+
-
线/便
-
🚗76线
Day1-
Day2--
Day3--
Day4--
Day5--/
Day6--
Day7-
-
🍖
🔥Top3
💣
-
Tips
🔥 ++515穿
🔥
🔥 线2
🔥 穿穿
-
📸
穿+
穿西
PS1TB胃和256G手机内存
-
TAG标签创作
9TAG标签+
1.TAG标签的内容围绕<#产品所在地区+旅游><#产品所在省份+旅游><#产品所在地区+周边游><#产品周边一线城市+周边游>
2.TAG标签的内容围绕<#景区/酒店名称><#景区/酒店名称+攻略><#景区/酒店名称+推荐>
3.TAG标签的内容围绕<#周末去哪儿玩><#小众旅游地><##产品所在地区+周末好去处>
TAG直接按要求直出内容
'),
('极力推荐风', '你是景区小红书爆款文案策划,你将根据要求创作爆款文案,根据以下规则一步步执行:
++
1.emoji
2.
3.10
1.
2.
3.
4. +++
5.
6.
'),
-- 插入目标人群数据
INSERT INTO targetAudience (audienceName, description)
VALUES
('亲子向', '亲子向用户画像:
1.
- 25-453-12.
- 70%.
2.
- .
-
3.
1. 1-2
2. 6-8
3. 9-10
4. 4-5
5. 12
6.4
7.5-6
8.8-9
9.12-2
'),
('周边游', '周边游用户画像:
1.
- .
2.
- 3"城市名称1小时可达".
- 使"说走就走""逃离城市".
3.
- 便便便便.
- ++.
- 宿///.
4.
-
5.
1. 1-2
2. 6-8
3. 9-10
4. 4-5
5. 12
6.4
7.5-6
8.8-9
9.12-2
'),
-- 插入选题信息数据
INSERT INTO topics (userId, title, description, logic, productLogic, styleLogic, targetAudienceLogic, publicationDates, status)
VALUES
(1, '五一黄山亲子游攻略🏞️', '五一假期黄山亲子游全攻略', '针对五一假期黄山旅游人流量大的情况,提供亲子游实用攻略', '推荐黄山亲子三日游产品,错峰出行,亲子互动环节丰富', '采用攻略风风格,直接明了,提供详细实用信息', '主要面向家庭亲子群体,提供亲子互动和安全提示', '2025-04-15,2025-04-20,2025-04-25', 'published'),
(1, '张家界夏季避暑游🌲', '夏季张家界避暑旅游指南', '针对夏季炎热天气推荐张家界作为避暑胜地平均气温仅22℃', '推荐张家界避暑五日游产品,强调凉爽体验和夏季特色活动', '采用清新文艺风格,突出自然之美和凉爽体验', '主要面向家庭亲子和学生群体,暑期出游首选', '2025-06-01,2025-06-15,2025-07-01', 'draft'),
(2, '九寨沟秋色摄影指南📸', '九寨沟秋季摄影攻略', '针对九寨沟秋季绝美景色,提供专业摄影指导和最佳拍摄点', '推荐九寨沟摄影六日游产品,强调最佳拍摄时机和专业指导', '采用专业严谨风格,提供专业摄影知识和技巧', '主要面向摄影爱好者和年轻情侣,追求高质量照片', '2025-09-01,2025-09-15', 'draft'),
(3, '云南民族文化探秘之旅🏮', '探索云南多元民族文化', '深入探索云南多民族文化特色,体验不同民族风情和非遗文化', '推荐云南民族文化七日游产品,强调文化体验和民族特色', '采用情感共鸣风格,讲述动人故事和文化传承', '主要面向文化爱好者、高净值人群和学生群体', '2025-07-01,2025-07-15', 'published');
-- 插入选题-景区关联数据
INSERT INTO topicScenic (topicId, scenicId)
VALUES
(1, 1),
(2, 2),
(3, 3),
(4, 4);
-- 插入选题-产品关联数据
INSERT INTO topicProduct (topicId, productId)
VALUES
(1, 1),
(2, 2),
(3, 3),
(4, 4);
-- 插入选题-风格关联数据
INSERT INTO topicStyle (topicId, styleId)
VALUES
(1, 1),
(2, 2),
(3, 4),
(4, 5);
-- 插入选题-目标受众关联数据
INSERT INTO topicAudience (topicId, audienceId)
VALUES
(1, 2),
(2, 2),
(2, 5),
(3, 1),
(3, 6),
(4, 5),
(4, 6);

103
db/init_db.sh Executable file
View File

@ -0,0 +1,103 @@
#!/bin/bash
echo "开始初始化旅游内容创作系统数据库..."
# 检查MySQL是否安装
if ! command -v mysql &> /dev/null; then
echo "错误: MySQL未安装请先安装MySQL"
exit 1
fi
# 询问MySQL root密码
read -sp "请输入MySQL root密码如果没有设置请直接回车: " MYSQL_ROOT_PASSWORD
echo ""
# 创建环境变量配置文件
cat > .env.db <<EOF
# 数据库环境变量配置
DB_HOST=localhost
DB_USER=travel_user
DB_PASSWORD=travel123
DB_NAME=travel_content
DB_PORT=3306
EOF
echo "已创建环境变量配置文件 .env.db"
echo "可以通过以下命令加载环境变量:"
echo "source .env.db"
# 自动加载环境变量
source .env.db
echo "已自动加载环境变量"
# 根据是否有密码使用不同的命令执行SQL脚本
echo "执行SQL脚本创建数据库和表..."
if [ -z "$MYSQL_ROOT_PASSWORD" ]; then
# 无密码
mysql -u root <<EOF
-- 创建数据库
CREATE DATABASE IF NOT EXISTS travel_content DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 创建用户并授权
CREATE USER IF NOT EXISTS 'travel_user'@'localhost' IDENTIFIED BY 'travel123';
GRANT ALL PRIVILEGES ON travel_content.* TO 'travel_user'@'localhost';
GRANT ALL PRIVILEGES ON travel_content.* TO 'root'@'localhost';
-- 刷新权限
FLUSH PRIVILEGES;
-- 使用数据库
USE travel_content;
-- 执行完整的SQL脚本
source db/init_database.sql;
EOF
else
# 有密码
mysql -u root -p"$MYSQL_ROOT_PASSWORD" <<EOF
-- 创建数据库
CREATE DATABASE IF NOT EXISTS travel_content DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 创建用户并授权
CREATE USER IF NOT EXISTS 'travel_user'@'localhost' IDENTIFIED BY 'travel123';
GRANT ALL PRIVILEGES ON travel_content.* TO 'travel_user'@'localhost';
GRANT ALL PRIVILEGES ON travel_content.* TO 'root'@'localhost';
-- 刷新权限
FLUSH PRIVILEGES;
-- 使用数据库
USE travel_content;
-- 执行完整的SQL脚本
source db/init_database.sql;
EOF
fi
# 检查执行结果
if [ $? -eq 0 ]; then
echo "数据库初始化成功!"
echo "数据库名称: travel_content"
echo "用户: travel_user (密码: travel123)"
# 显示表信息
echo "已创建表:"
mysql -u travel_user -ptravel123 -e "USE travel_content; SHOW TABLES;"
# 更新配置文件
cat > config/database.json <<EOF
{
"host": "\${DB_HOST:-localhost}",
"user": "\${DB_USER:-travel_user}",
"password": "\${DB_PASSWORD:-travel123}",
"database": "\${DB_NAME:-travel_content}",
"port": "\${DB_PORT:-3306}",
"charset": "utf8mb4"
}
EOF
echo "已更新数据库配置文件"
else
echo "数据库初始化失败,请检查错误信息"
fi
echo "初始化完成"

44
db/query_topics.sql Normal file
View File

@ -0,0 +1,44 @@
USE travel_content;
-- 查询选题的完整信息,包括关联的景区、产品、风格和目标受众
SELECT
CONCAT('', t.id, '') AS '选题ID',
t.title AS '选题标题',
t.description AS '选题描述',
CASE
WHEN t.status = 'published' THEN '已发布'
WHEN t.status = 'draft' THEN '草稿'
ELSE t.status
END AS '状态',
u.userName AS '创建者',
s.name AS '关联景区',
p.name AS '关联产品',
CONCAT(p.originPrice, '', p.realPrice) AS '价格(原价→实际)',
cs.styleName AS '内容风格',
GROUP_CONCAT(DISTINCT ta.audienceName SEPARATOR '') AS '目标受众'
FROM
topics t
JOIN
user u ON t.userId = u.id
JOIN
topicScenic ts ON t.id = ts.topicId
JOIN
scenicSpot s ON ts.scenicId = s.id
JOIN
topicProduct tp ON t.id = tp.topicId
JOIN
product p ON tp.productId = p.id
JOIN
topicStyle tst ON t.id = tst.topicId
JOIN
contentStyle cs ON tst.styleId = cs.id
LEFT JOIN
topicAudience taud ON t.id = taud.topicId
LEFT JOIN
targetAudience ta ON taud.audienceId = ta.id
WHERE
t.isDelete = 0
GROUP BY
t.id, t.title, t.description, t.status, u.userName, s.name, p.name, p.originPrice, p.realPrice, cs.styleName
ORDER BY
t.status = 'published' DESC, t.id;

87
db/show_db_info.sh Executable file
View File

@ -0,0 +1,87 @@
#!/bin/bash
echo "===== 旅游内容创作系统数据库信息 ====="
echo ""
echo "【1】数据库表列表"
mysql -u root -e "USE travel_content; SHOW TABLES;"
echo ""
echo "【2】用户信息"
mysql -u root -e "USE travel_content; SELECT id, userAccount, userName, userRole, userEmail FROM user;"
echo ""
echo "【3】景区信息"
mysql -u root -e "USE travel_content; SELECT id, name, address, advantage, highlight, isPublic FROM scenicSpot;"
echo ""
echo "【4】产品信息"
mysql -u root -e "USE travel_content; SELECT id, name, originPrice, realPrice, packageInfo, advantage FROM product;"
echo ""
echo "【5】内容风格"
mysql -u root -e "USE travel_content; SELECT id, styleName, description FROM contentStyle;"
echo ""
echo "【6】目标受众"
mysql -u root -e "USE travel_content; SELECT id, audienceName, description FROM targetAudience;"
echo ""
echo "【7】选题信息"
mysql -u root -e "USE travel_content; SELECT id, title, description, status FROM topics;"
echo ""
echo "【8】选题详细信息包含关联数据"
mysql -u root -e "USE travel_content;
SELECT
CONCAT('【', t.id, '】') AS '选题ID',
t.title AS '选题标题',
t.description AS '选题描述',
CASE
WHEN t.status = 'published' THEN '已发布'
WHEN t.status = 'draft' THEN '草稿'
ELSE t.status
END AS '状态',
u.userName AS '创建者',
s.name AS '关联景区',
p.name AS '关联产品',
CONCAT(p.originPrice, ' → ', p.realPrice) AS '价格(原价→实际)',
cs.styleName AS '内容风格',
GROUP_CONCAT(DISTINCT ta.audienceName SEPARATOR '、') AS '目标受众'
FROM
topics t
JOIN
user u ON t.userId = u.id
JOIN
topicScenic ts ON t.id = ts.topicId
JOIN
scenicSpot s ON ts.scenicId = s.id
JOIN
topicProduct tp ON t.id = tp.topicId
JOIN
product p ON tp.productId = p.id
JOIN
topicStyle tst ON t.id = tst.topicId
JOIN
contentStyle cs ON tst.styleId = cs.id
LEFT JOIN
topicAudience taud ON t.id = taud.topicId
LEFT JOIN
targetAudience ta ON taud.audienceId = ta.id
WHERE
t.isDelete = 0
GROUP BY
t.id, t.title, t.description, t.status, u.userName, s.name, p.name, p.originPrice, p.realPrice, cs.styleName
ORDER BY
t.status = 'published' DESC, t.id;"
echo ""
echo "【9】素材文件夹"
mysql -u root -e "USE travel_content; SELECT id, userId, folderName, parentId, description, isPublic FROM material_folder;"
echo ""
echo "【10】素材信息"
mysql -u root -e "USE travel_content; SELECT id, userId, folderId, materialName, materialType, fileFormat, tags, isPublic FROM material;"
echo ""
echo "===== 数据库信息展示完毕 ====="