2991692032 3 weeks ago
parent 79d07d4fae
commit 84099dfc58

@ -1,6 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="SqlDialectMappings">
<file url="file://$USER_HOME$/AppData/Local/Temp/mybatisCodeHelper_unilife_CategoryMapper.sql" dialect="MySQL" />
<file url="file://$PROJECT_DIR$/unilife-server/src/main/resources/db/init.sql" dialect="MySQL" />
<file url="file://$PROJECT_DIR$/unilife-server/src/main/resources/db/rebuild-database.sql" dialect="MySQL" />
<file url="file://$PROJECT_DIR$/unilife-server/src/main/resources/db/test-data.sql" dialect="MySQL" />
</component>
</project>

File diff suppressed because it is too large Load Diff

@ -22,6 +22,7 @@
"vue-router": "^4.5.1"
},
"devDependencies": {
"@stagewise/toolbar-vue": "^0.1.2",
"@tsconfig/node22": "^22.0.1",
"@types/node": "^22.15.22",
"@vitejs/plugin-vue": "^5.2.3",

@ -1,11 +1,36 @@
<template>
<div id="app">
<router-view />
<!-- Stagewise工具栏 - 仅在开发模式下显示 -->
<component :is="stagewiseComponent" v-if="isDevelopment && stagewiseComponent" :config="stagewiseConfig" />
</div>
</template>
<script setup lang="ts">
// UniLife
import { ref, onMounted, type Component } from 'vue'
//
const isDevelopment = import.meta.env.DEV
// Stagewise
const stagewiseComponent = ref<Component | null>(null)
// Stagewise
const stagewiseConfig = {
plugins: []
}
// stagewise
if (isDevelopment) {
onMounted(async () => {
try {
const { StagewiseToolbar } = await import('@stagewise/toolbar-vue')
stagewiseComponent.value = StagewiseToolbar as Component
} catch (error) {
console.warn('Stagewise toolbar not available:', error)
}
})
}
</script>
<style>

@ -49,6 +49,12 @@ const router = createRouter({
component: () => import('@/views/schedule/ScheduleView.vue'),
meta: { requiresAuth: true }
},
{
path: '/tasks',
name: 'tasks',
component: () => import('@/views/schedule/TaskView.vue'),
meta: { requiresAuth: true }
},
{
path: '/profile',
name: 'profile',

@ -175,6 +175,7 @@
<a href="#">论坛</a>
<a href="#">资源库</a>
<a href="#">课程表</a>
<a href="#">日程管理</a>
</div>
<div class="link-group">
<h4>支持</h4>
@ -206,42 +207,42 @@ import {
ChatDotRound,
FolderOpened,
Calendar,
TrendCharts,
School,
Trophy
Clock,
UserFilled,
TrendCharts
} from '@element-plus/icons-vue'
//
const features = ref([
{
icon: ChatDotRound,
title: '校园论坛',
description: '与同学们畅所欲言,分享学习心得,讨论校园生活,建立深厚友谊'
title: '活跃论坛',
description: '与同学们自由讨论学习、生活话题,分享经验与见解,建立有意义的连接'
},
{
icon: FolderOpened,
title: '资源共享',
description: '海量学习资料,课件笔记,考试真题,助力学业进步'
description: '上传和下载学习资料、课件、笔记等,让知识在同学之间自由流转'
},
{
icon: Calendar,
title: '课程管理',
description: '智能课程表,日程提醒,让你的学习生活井井有条'
description: '智能课程表管理,清晰展示课程安排,再也不用担心忘记上课时间'
},
{
icon: TrendCharts,
title: '学习统计',
description: '详细的学习数据分析,帮助你更好地规划学习时间'
icon: Clock,
title: '日程管理',
description: '个人日程安排,重要事项提醒,让你的大学生活井井有条'
},
{
icon: School,
title: '校园服务',
description: '集成校园各类服务,让校园生活更便捷'
icon: UserFilled,
title: '个人中心',
description: '个性化用户资料,记录学习轨迹,展示你的大学成长历程'
},
{
icon: Trophy,
title: '成就系统',
description: '完成任务获得成就,让学习变得更有趣'
icon: TrendCharts,
title: '数据统计',
description: '学习数据可视化,了解自己的学习习惯,制定更好的学习计划'
}
])

@ -16,6 +16,7 @@
<router-link to="/forum" class="nav-item active">论坛</router-link>
<router-link to="/resources" class="nav-item">资源</router-link>
<router-link to="/schedule" class="nav-item">课程表</router-link>
<router-link to="/tasks" class="nav-item">日程管理</router-link>
</div>
<div class="nav-actions">

@ -16,6 +16,7 @@
<router-link to="/forum" class="nav-item">论坛</router-link>
<router-link to="/resources" class="nav-item active">资源</router-link>
<router-link to="/schedule" class="nav-item">课程表</router-link>
<router-link to="/tasks" class="nav-item">日程管理</router-link>
</div>
<div class="nav-actions">
@ -147,77 +148,77 @@
<!-- 加载状态 -->
<div v-loading="loading" class="loading-container">
<!-- 资源列表 -->
<!-- 资源列表 -->
<div class="resources-list" v-if="!loading">
<div
<div
v-for="resource in resources"
:key="resource.id"
class="resource-card card-light animate-fade-in-up"
:key="resource.id"
class="resource-card card-light animate-fade-in-up"
@click="goToResourceDetail(resource.id)"
>
<div class="resource-header">
<div class="file-icon">
<el-icon :size="32" :color="getFileTypeColor(resource.fileType)">
<Document />
</el-icon>
</div>
>
<div class="resource-header">
<div class="file-icon">
<el-icon :size="32" :color="getFileTypeColor(resource.fileType)">
<Document />
</el-icon>
</div>
<div class="resource-info">
<h3 class="resource-title">{{ resource.title }}</h3>
<p class="resource-description">{{ resource.description }}</p>
<div class="resource-info">
<h3 class="resource-title">{{ resource.title }}</h3>
<p class="resource-description">{{ resource.description }}</p>
<div class="resource-meta">
<span class="file-size">{{ formatFileSize(resource.fileSize) }}</span>
<span class="file-type">{{ getFileTypeLabel(resource.fileType) }}</span>
<div class="resource-meta">
<span class="file-size">{{ formatFileSize(resource.fileSize) }}</span>
<span class="file-type">{{ getFileTypeLabel(resource.fileType) }}</span>
<span class="upload-time">{{ formatDate(resource.createdAt) }}</span>
</div>
</div>
</div>
<div class="resource-actions" @click.stop>
<el-button type="primary" @click="downloadResource(resource)" :loading="resource.downloading">
<el-icon><Download /></el-icon>
下载
</el-button>
<el-icon><Download /></el-icon>
下载
</el-button>
<el-button
:text="!resource.isLiked"
:type="resource.isLiked ? 'danger' : 'default'"
@click="toggleLike(resource)"
:loading="resource.liking"
>
<el-icon><Star /></el-icon>
{{ resource.likeCount }}
</el-button>
</div>
<el-icon><Star /></el-icon>
{{ resource.likeCount }}
</el-button>
</div>
</div>
<div class="resource-footer">
<div class="uploader-info">
<el-avatar :size="24" :src="resource.avatar">
{{ resource.nickname?.charAt(0) }}
</el-avatar>
<span class="uploader-name">{{ resource.nickname }}</span>
</div>
<div class="resource-stats">
<span class="stat-item">
<el-icon><Download /></el-icon>
{{ resource.downloadCount }}
</span>
<span class="stat-item">
<el-icon><Star /></el-icon>
{{ resource.likeCount }}
</span>
</div>
<div class="resource-footer">
<div class="uploader-info">
<el-avatar :size="24" :src="resource.avatar">
{{ resource.nickname?.charAt(0) }}
</el-avatar>
<span class="uploader-name">{{ resource.nickname }}</span>
</div>
<div class="resource-stats">
<span class="stat-item">
<el-icon><Download /></el-icon>
{{ resource.downloadCount }}
</span>
<span class="stat-item">
<el-icon><Star /></el-icon>
{{ resource.likeCount }}
</span>
</div>
</div>
</div>
<!-- 空状态 -->
<!-- 空状态 -->
<div v-if="resources.length === 0 && !loading" class="empty-state">
<el-empty description="暂无资源">
<el-button type="primary" @click="showUploadDialog = true">
上传第一个资源
</el-button>
</el-empty>
<el-empty description="暂无资源">
<el-button type="primary" @click="showUploadDialog = true">
上传第一个资源
</el-button>
</el-empty>
</div>
</div>
@ -534,7 +535,7 @@ const downloadResource = async (resource: ExtendedResource) => {
ElMessage.success('下载开始')
} else {
ElMessage.error(response.message || '下载失败')
}
}
} catch (error) {
console.error('下载失败:', error)
ElMessage.error('下载失败')
@ -552,9 +553,9 @@ const toggleLike = async (resource: ExtendedResource) => {
console.log('点赞API响应:', response)
if (response.code === 200) {
resource.isLiked = !resource.isLiked
resource.likeCount += resource.isLiked ? 1 : -1
ElMessage.success(resource.isLiked ? '点赞成功' : '取消点赞')
resource.isLiked = !resource.isLiked
resource.likeCount += resource.isLiked ? 1 : -1
ElMessage.success(resource.isLiked ? '点赞成功' : '取消点赞')
} else {
ElMessage.error(response.message || '操作失败')
}
@ -608,7 +609,7 @@ const handleUploadResource = async () => {
console.log('上传资源API响应:', response)
if (response.code === 200) {
ElMessage.success('资源上传成功!')
ElMessage.success('资源上传成功!')
showUploadDialog.value = false
resetUploadForm()
loadResources() //

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -15,6 +15,7 @@
<spring-boot.version>3.4.3</spring-boot.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-ai.version>1.0.0</spring-ai.version>
</properties>
<dependencyManagement>
@ -26,6 +27,13 @@
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>${spring-ai.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
@ -134,6 +142,11 @@
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.15.0</version>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-openai</artifactId>
</dependency>
</dependencies>
<build>

@ -0,0 +1,20 @@
package com.unilife.config;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AiConfig {
@Bean
public ChatClient chatClient(OpenAiChatModel model) {
return ChatClient.builder(model)
.defaultAdvisors(new SimpleLoggerAdvisor())
.build();
}
}

@ -0,0 +1,27 @@
package com.unilife.controller;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
@RestController
@Slf4j
@RequestMapping("/ai")
@Tag(name = "AI对话")
@AllArgsConstructor
public class AiController {
private final ChatClient chatClient;
@RequestMapping(value = "/chat",produces = "text/html;charset=UTF-8")
public Flux<String>chat(String prompt,String chatId){
return chatClient.prompt(prompt)
.stream()
.content();
}
}

@ -30,4 +30,46 @@ public interface UserMapper {
* @return
*/
List<User> searchUsers(@Param("keyword") String keyword);
/**
* status0
* @param id ID
*/
void deleteUser(Long id);
/**
*
* @param userId ID
*/
void deleteUserPosts(Long userId);
/**
*
* @param userId ID
*/
void deleteUserComments(Long userId);
/**
*
* @param userId ID
*/
void deleteUserResources(Long userId);
/**
*
* @param userId ID
*/
void deleteUserCourses(Long userId);
/**
*
* @param userId ID
*/
void deleteUserSchedules(Long userId);
/**
*
* @param userId ID
*/
void deleteUserLikes(Long userId);
}

@ -46,7 +46,7 @@ public class CreateScheduleDTO {
/**
*
*/
private Byte reminder;
private Integer reminder;
/**
*

@ -62,7 +62,7 @@ public class Schedule implements Serializable {
/**
*
*/
private Byte reminder;
private Integer reminder;
/**
*

@ -58,7 +58,7 @@ public class ScheduleVO {
/**
*
*/
private Byte reminder;
private Integer reminder;
/**
*

@ -36,4 +36,12 @@ public interface UserService {
// 用户最近帖子
Result getUserRecentPosts(Long userId, Integer limit);
/**
*
* 使
* @param userId ID
* @return
*/
Result deleteUser(Long userId);
}

@ -543,32 +543,81 @@ public class UserServiceImpl implements UserService {
@Override
public Result getUserRecentPosts(Long userId, Integer limit) {
// 检查用户是否存在
User user = userMapper.getUserById(userId);
if (user == null) {
return Result.error(404, "用户不存在");
}
try {
// 获取用户信息,验证用户是否存在
User user = userMapper.getUserById(userId);
if (user == null) {
return Result.error(404, "用户不存在");
}
// 参数校验
if (limit == null || limit <= 0) {
limit = 5;
}
if (limit > 20) {
limit = 20; // 限制最大数量
}
// 获取用户最近的帖子
List<Post> recentPosts = postMapper.getListByUserId(userId, "time");
// 如果指定了限制数量,则截取
if (limit != null && limit > 0 && recentPosts.size() > limit) {
recentPosts = recentPosts.subList(0, limit);
}
// 获取用户最近的帖子
List<Post> recentPosts = postMapper.getListByUserId(userId, "latest");
// 限制数量
if (recentPosts.size() > limit) {
recentPosts = recentPosts.subList(0, limit);
Map<String, Object> result = new HashMap<>();
result.put("posts", recentPosts);
result.put("totalCount", postMapper.getCountByUserId(userId));
return Result.success(result, "获取用户最近帖子成功");
} catch (Exception e) {
log.error("获取用户最近帖子失败: userId={}", userId, e);
return Result.error(500, "获取用户最近帖子失败");
}
}
@Override
public Result deleteUser(Long userId) {
try {
// 验证用户是否存在
User user = userMapper.getUserById(userId);
if (user == null) {
return Result.error(404, "用户不存在");
}
// 检查用户状态,避免重复删除
if (user.getStatus() == 0) {
return Result.error(400, "用户已被删除");
}
log.info("开始删除用户及其相关数据: userId={}, username={}", userId, user.getUsername());
// 1. 软删除用户的所有帖子
userMapper.deleteUserPosts(userId);
log.info("已删除用户的所有帖子: userId={}", userId);
// 2. 软删除用户的所有评论
userMapper.deleteUserComments(userId);
log.info("已删除用户的所有评论: userId={}", userId);
// 3. 软删除用户的所有资源
userMapper.deleteUserResources(userId);
log.info("已删除用户的所有资源: userId={}", userId);
// 4. 删除用户的所有课程(物理删除,因为是个人课程安排)
userMapper.deleteUserCourses(userId);
log.info("已删除用户的所有课程: userId={}", userId);
// 5. 删除用户的所有日程(物理删除,因为是个人日程安排)
userMapper.deleteUserSchedules(userId);
log.info("已删除用户的所有日程: userId={}", userId);
// 6. 删除用户的所有点赞记录(物理删除)
userMapper.deleteUserLikes(userId);
log.info("已删除用户的所有点赞记录: userId={}", userId);
// 7. 最后软删除用户本身
userMapper.deleteUser(userId);
log.info("已删除用户账号: userId={}, username={}", userId, user.getUsername());
return Result.success(null, "用户及其相关数据删除成功");
} catch (Exception e) {
log.error("删除用户失败: userId={}", userId, e);
return Result.error(500, "删除用户失败:" + e.getMessage());
}
// 返回结果
Map<String, Object> data = new HashMap<>();
data.put("list", recentPosts);
return Result.success(data);
}
}

@ -1,6 +1,17 @@
server:
port: 8087
spring:
ai:
openai:
base-url: https://dashscope.aliyuncs.com/compatible-mode
api-key: ${OPENAI_API_KEY:}
chat:
options:
model: qwen-max-latest
embedding:
options:
model: text-embedding-v3
dimensions: 1024
datasource:
url: jdbc:mysql://localhost:3306/UniLife?allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=UTC&characterEncoding=UTF-8
username: root
@ -9,8 +20,8 @@ spring:
mail:
host: smtp.163.com
port: 465
username: c2991692032@163.com
password: VPq5u3NcAAqtG9GT
username: ${MAIL_USERNAME:}
password: ${MAIL_PASSWORD:}
properties:
mail:
smtp:

@ -65,9 +65,7 @@ CREATE TABLE IF NOT EXISTS `posts` (
INDEX `idx_user_id` (`user_id`),
INDEX `idx_category_id` (`category_id`),
INDEX `idx_status` (`status`),
INDEX `idx_created_at` (`created_at`),
FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE,
FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE CASCADE
INDEX `idx_created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='帖子表';
-- 评论表
@ -84,10 +82,7 @@ CREATE TABLE IF NOT EXISTS `comments` (
INDEX `idx_post_id` (`post_id`),
INDEX `idx_user_id` (`user_id`),
INDEX `idx_parent_id` (`parent_id`),
INDEX `idx_status` (`status`),
FOREIGN KEY (`post_id`) REFERENCES `posts` (`id`) ON DELETE CASCADE,
FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE,
FOREIGN KEY (`parent_id`) REFERENCES `comments` (`id`) ON DELETE SET NULL
INDEX `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='评论表';
-- 点赞表(用户-帖子)
@ -97,8 +92,8 @@ CREATE TABLE IF NOT EXISTS `post_likes` (
`post_id` BIGINT NOT NULL COMMENT '帖子ID',
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
UNIQUE KEY `uk_user_post` (`user_id`, `post_id`),
FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE,
FOREIGN KEY (`post_id`) REFERENCES `posts` (`id`) ON DELETE CASCADE
INDEX `idx_user_id` (`user_id`),
INDEX `idx_post_id` (`post_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='帖子点赞表';
-- 点赞表(用户-评论)
@ -108,8 +103,8 @@ CREATE TABLE IF NOT EXISTS `comment_likes` (
`comment_id` BIGINT NOT NULL COMMENT '评论ID',
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
UNIQUE KEY `uk_user_comment` (`user_id`, `comment_id`),
FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE,
FOREIGN KEY (`comment_id`) REFERENCES `comments` (`id`) ON DELETE CASCADE
INDEX `idx_user_id` (`user_id`),
INDEX `idx_comment_id` (`comment_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='评论点赞表';
-- 点赞表(用户-资源)
@ -119,8 +114,8 @@ CREATE TABLE IF NOT EXISTS `resource_likes` (
`resource_id` BIGINT NOT NULL COMMENT '资源ID',
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
UNIQUE KEY `uk_user_resource` (`user_id`, `resource_id`),
FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE,
FOREIGN KEY (`resource_id`) REFERENCES `resources` (`id`) ON DELETE CASCADE
INDEX `idx_user_id` (`user_id`),
INDEX `idx_resource_id` (`resource_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='资源点赞表';
-- 资源表
@ -140,9 +135,7 @@ CREATE TABLE IF NOT EXISTS `resources` (
`updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX `idx_user_id` (`user_id`),
INDEX `idx_category_id` (`category_id`),
INDEX `idx_status` (`status`),
FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE,
FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE CASCADE
INDEX `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='资源表';
-- 课程表
@ -163,8 +156,7 @@ CREATE TABLE IF NOT EXISTS `courses` (
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX `idx_user_id` (`user_id`),
INDEX `idx_semester` (`semester`),
FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE
INDEX `idx_semester` (`semester`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='课程表';
-- 日程表
@ -183,8 +175,7 @@ CREATE TABLE IF NOT EXISTS `schedules` (
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX `idx_user_id` (`user_id`),
INDEX `idx_start_time` (`start_time`),
FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE
INDEX `idx_start_time` (`start_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='日程表';
-- 初始化分类数据

@ -0,0 +1,386 @@
-- UniLife数据库完整重建脚本
-- 此脚本将删除现有数据库并重新创建,然后插入测试数据
-- 注意:执行前请确保已备份重要数据!
-- ==========================================
-- 第一步:删除并重新创建数据库
-- ==========================================
-- 删除现有数据库(如果存在)
DROP DATABASE IF EXISTS UniLife;
-- 创建新数据库
CREATE DATABASE UniLife DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 使用数据库
USE UniLife;
-- ==========================================
-- 第二步:创建表结构(无外键约束)
-- ==========================================
-- 用户表
CREATE TABLE `users` (
`id` BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '用户ID',
`username` VARCHAR(50) NOT NULL UNIQUE COMMENT '用户名',
`email` VARCHAR(100) NOT NULL UNIQUE COMMENT '邮箱地址(学校邮箱)',
`password` VARCHAR(255) NOT NULL COMMENT '密码(加密存储)',
`nickname` VARCHAR(50) NOT NULL COMMENT '昵称',
`avatar` VARCHAR(255) DEFAULT NULL COMMENT '头像URL',
`bio` TEXT DEFAULT NULL COMMENT '个人简介',
`gender` TINYINT DEFAULT 0 COMMENT '性别0-未知, 1-男, 2-女)',
`student_id` VARCHAR(20) UNIQUE DEFAULT NULL COMMENT '学号',
`department` VARCHAR(100) DEFAULT NULL COMMENT '院系',
`major` VARCHAR(100) DEFAULT NULL COMMENT '专业',
`grade` VARCHAR(20) DEFAULT NULL COMMENT '年级',
`points` INT DEFAULT 0 COMMENT '积分',
`role` TINYINT DEFAULT 0 COMMENT '角色0-普通用户, 1-版主, 2-管理员)',
`status` TINYINT DEFAULT 1 COMMENT '状态0-禁用, 1-启用)',
`is_verified` TINYINT DEFAULT 0 COMMENT '是否验证0-未验证, 1-已验证)',
`login_ip` VARCHAR(50) DEFAULT NULL COMMENT '最近登录IP',
`login_time` DATETIME DEFAULT NULL COMMENT '最近登录时间',
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX `idx_email` (`email`),
INDEX `idx_username` (`username`),
INDEX `idx_student_id` (`student_id`),
INDEX `idx_role` (`role`),
INDEX `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表';
-- 分类表
CREATE TABLE `categories` (
`id` BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '分类ID',
`name` VARCHAR(50) NOT NULL UNIQUE COMMENT '分类名称',
`description` VARCHAR(255) DEFAULT NULL COMMENT '分类描述',
`icon` VARCHAR(255) DEFAULT NULL COMMENT '分类图标',
`sort` INT DEFAULT 0 COMMENT '排序',
`status` TINYINT DEFAULT 1 COMMENT '状态0-禁用, 1-启用)',
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX `idx_status` (`status`),
INDEX `idx_sort` (`sort`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='分类表';
-- 帖子表
CREATE TABLE `posts` (
`id` BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '帖子ID',
`user_id` BIGINT NOT NULL COMMENT '发布用户ID',
`title` VARCHAR(100) NOT NULL COMMENT '帖子标题',
`content` TEXT NOT NULL COMMENT '帖子内容',
`category_id` BIGINT NOT NULL COMMENT '分类ID',
`view_count` INT DEFAULT 0 COMMENT '浏览次数',
`like_count` INT DEFAULT 0 COMMENT '点赞次数',
`comment_count` INT DEFAULT 0 COMMENT '评论次数',
`status` TINYINT DEFAULT 1 COMMENT '状态0-删除, 1-正常, 2-置顶)',
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX `idx_user_id` (`user_id`),
INDEX `idx_category_id` (`category_id`),
INDEX `idx_status` (`status`),
INDEX `idx_created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='帖子表';
-- 评论表
CREATE TABLE `comments` (
`id` BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '评论ID',
`post_id` BIGINT NOT NULL COMMENT '帖子ID',
`user_id` BIGINT NOT NULL COMMENT '评论用户ID',
`content` TEXT NOT NULL COMMENT '评论内容',
`parent_id` BIGINT DEFAULT NULL COMMENT '父评论ID回复某条评论',
`like_count` INT DEFAULT 0 COMMENT '点赞次数',
`status` TINYINT DEFAULT 1 COMMENT '状态0-删除, 1-正常)',
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX `idx_post_id` (`post_id`),
INDEX `idx_user_id` (`user_id`),
INDEX `idx_parent_id` (`parent_id`),
INDEX `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='评论表';
-- 点赞表(用户-帖子)
CREATE TABLE `post_likes` (
`id` BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '点赞ID',
`user_id` BIGINT NOT NULL COMMENT '用户ID',
`post_id` BIGINT NOT NULL COMMENT '帖子ID',
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
UNIQUE KEY `uk_user_post` (`user_id`, `post_id`),
INDEX `idx_user_id` (`user_id`),
INDEX `idx_post_id` (`post_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='帖子点赞表';
-- 点赞表(用户-评论)
CREATE TABLE `comment_likes` (
`id` BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '点赞ID',
`user_id` BIGINT NOT NULL COMMENT '用户ID',
`comment_id` BIGINT NOT NULL COMMENT '评论ID',
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
UNIQUE KEY `uk_user_comment` (`user_id`, `comment_id`),
INDEX `idx_user_id` (`user_id`),
INDEX `idx_comment_id` (`comment_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='评论点赞表';
-- 点赞表(用户-资源)
CREATE TABLE `resource_likes` (
`id` BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '点赞ID',
`user_id` BIGINT NOT NULL COMMENT '用户ID',
`resource_id` BIGINT NOT NULL COMMENT '资源ID',
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
UNIQUE KEY `uk_user_resource` (`user_id`, `resource_id`),
INDEX `idx_user_id` (`user_id`),
INDEX `idx_resource_id` (`resource_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='资源点赞表';
-- 资源表
CREATE TABLE `resources` (
`id` BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '资源ID',
`user_id` BIGINT NOT NULL COMMENT '上传用户ID',
`title` VARCHAR(100) NOT NULL COMMENT '资源标题',
`description` TEXT DEFAULT NULL COMMENT '资源描述',
`file_url` VARCHAR(255) NOT NULL COMMENT '文件URL',
`file_size` BIGINT NOT NULL COMMENT '文件大小(字节)',
`file_type` VARCHAR(100) NOT NULL COMMENT '文件类型',
`category_id` BIGINT NOT NULL COMMENT '分类ID',
`download_count` INT DEFAULT 0 COMMENT '下载次数',
`like_count` INT DEFAULT 0 COMMENT '点赞次数',
`status` TINYINT DEFAULT 1 COMMENT '状态0-删除, 1-正常)',
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX `idx_user_id` (`user_id`),
INDEX `idx_category_id` (`category_id`),
INDEX `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='资源表';
-- 课程表
CREATE TABLE `courses` (
`id` BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '课程ID',
`user_id` BIGINT NOT NULL COMMENT '用户ID',
`name` VARCHAR(100) NOT NULL COMMENT '课程名称',
`teacher` VARCHAR(50) DEFAULT NULL COMMENT '教师姓名',
`location` VARCHAR(100) DEFAULT NULL COMMENT '上课地点',
`day_of_week` TINYINT NOT NULL COMMENT '星期几1-7',
`start_time` TIME NOT NULL COMMENT '开始时间',
`end_time` TIME NOT NULL COMMENT '结束时间',
`start_week` SMALLINT NOT NULL COMMENT '开始周次',
`end_week` SMALLINT NOT NULL COMMENT '结束周次',
`semester` VARCHAR(20) DEFAULT NULL COMMENT '学期2023-1',
`color` VARCHAR(20) DEFAULT NULL COMMENT '显示颜色',
`status` TINYINT DEFAULT 1 COMMENT '状态0-删除, 1-正常)',
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX `idx_user_id` (`user_id`),
INDEX `idx_semester` (`semester`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='课程表';
-- 日程表
CREATE TABLE `schedules` (
`id` BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '日程ID',
`user_id` BIGINT NOT NULL COMMENT '用户ID',
`title` VARCHAR(100) NOT NULL COMMENT '日程标题',
`description` TEXT DEFAULT NULL COMMENT '日程描述',
`start_time` DATETIME NOT NULL COMMENT '开始时间',
`end_time` DATETIME NOT NULL COMMENT '结束时间',
`location` VARCHAR(100) DEFAULT NULL COMMENT '地点',
`is_all_day` TINYINT DEFAULT 0 COMMENT '是否全天0-否, 1-是)',
`reminder` INT DEFAULT NULL COMMENT '提醒时间(分钟)',
`color` VARCHAR(20) DEFAULT NULL COMMENT '显示颜色',
`status` TINYINT DEFAULT 1 COMMENT '状态0-删除, 1-正常)',
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX `idx_user_id` (`user_id`),
INDEX `idx_start_time` (`start_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='日程表';
-- ==========================================
-- 第三步:插入初始分类数据
-- ==========================================
INSERT INTO `categories` (`name`, `description`, `icon`, `sort`, `status`) VALUES
('学习交流', '讨论学习相关话题', 'icon-study', 1, 1),
('校园生活', '分享校园生活点滴', 'icon-campus', 2, 1),
('兴趣爱好', '交流各类兴趣爱好', 'icon-hobby', 3, 1),
('求职就业', '分享求职经验和就业信息', 'icon-job', 4, 1),
('资源共享', '分享各类学习资源', 'icon-resource', 5, 1);
-- 初始化管理员账号
INSERT INTO `users` (`username`, `email`, `password`, `nickname`, `role`, `status`, `is_verified`) VALUES
('admin', 'admin@unilife.com', '123456', '系统管理员', 2, 1, 1);
-- ==========================================
-- 第四步:插入测试数据
-- ==========================================
-- 更新现有分类数据(更贴合武汉大学实际)
UPDATE `categories` SET
`name` = '学术交流',
`description` = '学术讨论、科研分享、竞赛经验',
`icon` = '📚'
WHERE `name` = '学习交流';
UPDATE `categories` SET
`description` = '武汉大学校园生活、社团活动、文化娱乐',
`icon` = '🏫'
WHERE `name` = '校园生活';
UPDATE `categories` SET
`name` = '就业实习',
`description` = '实习经验、求职心得、职业规划',
`icon` = '💼'
WHERE `name` = '求职就业';
-- 插入新的分类
INSERT INTO `categories` (`name`, `description`, `icon`, `sort`, `status`) VALUES
('学院专区', '各学院学生交流专区', '🎓', 6, 1),
('考研考公', '研究生入学考试、公务员考试', '📖', 7, 1),
('生活服务', '二手交易、失物招领、校园服务', '🛍️', 8, 1);
-- 插入武汉大学学生用户数据
INSERT INTO `users` (`username`, `email`, `password`, `nickname`, `bio`, `gender`, `student_id`, `department`, `major`, `grade`, `points`, `role`, `status`, `is_verified`, `created_at`) VALUES
-- 文理学部学生
('czq2024', 'czq@whu.edu.cn', '123456', '珞珈数学狗', '数学与统计学院2022级数学类热爱数学建模ACM银牌选手', 1, '2022301140001', '数学与统计学院', '数学类', '2022级', 150, 0, 1, 1, '2024-09-01 09:00:00'),
('lihua_cs', 'lihua@whu.edu.cn', '123456', '代码诗人', '计算机学院2021级软件工程全栈开发爱好者开源项目贡献者', 1, '2021301120001', '计算机学院', '软件工程', '2021级', 230, 0, 1, 1, '2024-09-01 10:00:00'),
('wangming_law', 'wangming@whu.edu.cn', '123456', '法学小白', '法学院2023级法学专业模拟法庭常客梦想成为大律师', 1, '2023301080001', '法学院', '法学', '2023级', 80, 0, 1, 1, '2024-09-01 11:00:00'),
('zhangwei_chem', 'zhangwei@whu.edu.cn', '123456', '化学实验员', '化学与分子科学学院2022级化学专业实验室常驻合成达人', 1, '2022301130001', '化学与分子科学学院', '化学', '2022级', 120, 0, 1, 1, '2024-09-01 12:00:00'),
('liuxin_econ', 'liuxin@whu.edu.cn', '123456', '经济观察者', '经济与管理学院2021级经济学关注宏观经济政策券商实习生', 2, '2021301110001', '经济与管理学院', '经济学', '2021级', 200, 0, 1, 1, '2024-09-01 13:00:00'),
-- 工学部学生
('chenfei_water', 'chenfei@whu.edu.cn', '123456', '水利工程师', '水利水电学院2022级水利水电工程三峡实习经历立志建设美丽中国', 1, '2022301320001', '水利水电学院', '水利水电工程', '2022级', 90, 0, 1, 1, '2024-09-01 14:00:00'),
('sunhao_power', 'sunhao@whu.edu.cn', '123456', '电气小子', '电气与自动化学院2023级电气工程及其自动化电力系统仿真专家', 1, '2023301330001', '电气与自动化学院', '电气工程及其自动化', '2023级', 70, 0, 1, 1, '2024-09-01 15:00:00'),
('wujing_civil', 'wujing@whu.edu.cn', '123456', '土木妹子', '土木建筑工程学院2022级土木工程桥梁设计爱好者BIM技术达人', 2, '2022301340001', '土木建筑工程学院', '土木工程', '2022级', 110, 0, 1, 1, '2024-09-01 16:00:00'),
-- 信息学部学生
('liqiang_remote', 'liqiang@whu.edu.cn', '123456', '遥感专家', '遥感信息工程学院2021级遥感科学与技术无人机航拍爱好者', 1, '2021301210001', '遥感信息工程学院', '遥感科学与技术', '2021级', 180, 0, 1, 1, '2024-09-01 17:00:00'),
('zhaoli_survey', 'zhaoli@whu.edu.cn', '123456', '测绘达人', '测绘学院2022级测绘工程GPS定位技术研究者野外作业经验丰富', 1, '2022301220001', '测绘学院', '测绘工程', '2022级', 95, 0, 1, 1, '2024-09-01 18:00:00'),
-- 医学部学生
('huangyan_med', 'huangyan@whu.edu.cn', '123456', '未来医生', '基础医学院2020级临床医学人民医院实习生立志救死扶伤', 2, '2020301410001', '基础医学院', '临床医学', '2020级', 250, 0, 1, 1, '2024-09-01 19:00:00'),
('wangpeng_dental', 'wangpeng@whu.edu.cn', '123456', '口腔医师', '口腔医学院2021级口腔医学口腔医院见习关注口腔健康科普', 1, '2021301420001', '口腔医学院', '口腔医学', '2021级', 160, 0, 1, 1, '2024-09-01 20:00:00'),
-- 人文社科学部学生
('luxiaoya_chinese', 'luxiaoya@whu.edu.cn', '123456', '文学少女', '文学院2022级汉语言文学古典文学爱好者诗词社社长', 2, '2022301050001', '文学院', '汉语言文学', '2022级', 140, 0, 1, 1, '2024-09-01 21:00:00'),
('zhoujie_history', 'zhoujie@whu.edu.cn', '123456', '史学研究生', '历史学院研究生,中国古代史方向,博物馆志愿者', 1, '2024302050001', '历史学院', '中国史', '2024级', 100, 0, 1, 1, '2024-09-01 22:00:00'),
('tanglei_news', 'tanglei@whu.edu.cn', '123456', '新传人', '新闻与传播学院2021级新闻学校媒记者关注社会热点', 1, '2021301070001', '新闻与传播学院', '新闻学', '2021级', 170, 0, 1, 1, '2024-09-01 23:00:00');
-- 插入论坛帖子数据使用已存在的用户ID
INSERT INTO `posts` (`user_id`, `category_id`, `title`, `content`, `view_count`, `like_count`, `comment_count`, `status`, `created_at`) VALUES
-- 学术交流类帖子
(2, 1, '数学建模美赛经验分享', '刚刚结束的美国大学生数学建模竞赛我们团队获得了M奖分享一下参赛经验和技巧希望对学弟学妹们有帮助。数模比赛不仅考验数学能力更重要的是团队协作和论文写作能力。首先要选择合适的队友最好是数学、编程、英语各有所长的组合...', 256, 42, 8, 2, '2024-12-20 09:30:00'),
(3, 1, 'ACM-ICPC区域赛总结', '参加了西安站的ACM区域赛虽然没能拿到金牌但收获很大。分享一下刷题心得和比赛策略特别是动态规划和图论算法的练习方法。建议大家多在Codeforces和AtCoder上练习这些平台的题目质量很高...', 189, 35, 6, 1, '2024-12-19 16:45:00'),
(6, 1, '宏观经济学课程研讨:通胀与货币政策', '最近在学习宏观经济学,对当前的通胀形势和央行货币政策有一些思考。想和大家讨论一下利率调整对经济的影响机制,特别是在当前全球经济形势下的作用...', 145, 28, 4, 1, '2024-12-18 14:20:00'),
-- 校园生活类帖子
(14, 2, '武大樱花季摄影大赛作品展示', '樱花季刚过分享一些在樱花大道拍摄的照片。今年的樱花开得特别美虽然人很多但还是拍到了一些不错的角度。附上拍摄技巧分享使用的是佳能5D4光圈f/2.8ISO400后期用LR调色...', 1234, 156, 12, 2, '2024-04-10 10:15:00'),
(16, 2, '校运动会志愿者招募!', '第55届田径运动会即将开始现招募志愿者工作内容包括引导、记分、颁奖等。参与志愿服务可获得志愿时长认证还有纪念品哦有意向的同学请在评论区留言或私信联系我', 456, 89, 5, 1, '2024-12-15 08:00:00'),
(11, 2, '测绘学院野外实习日记', '刚从庐山实习回来分享一下野外测量的酸甜苦辣。早上5点起床背着仪器爬山虽然辛苦但收获满满。珞珈山的风景真是看不够啊学到了很多实际操作技能...', 234, 45, 7, 1, '2024-12-14 19:30:00'),
-- 学院专区类帖子
(4, 6, '法学院模拟法庭大赛预告', '一年一度的"枫叶杯"模拟法庭大赛即将开始!欢迎各年级同学组队参加。比赛分为民事组和刑事组,优胜者将代表学院参加全国比赛。这是提升法律实务能力的绝佳机会...', 345, 67, 9, 2, '2024-12-16 11:00:00'),
(5, 6, '化学实验安全注意事项提醒', '最近实验室发生了几起小事故,提醒大家一定要注意安全!特别是使用强酸强碱时,护目镜和手套必须佩戴。实验无小事,安全第一!同时要做好实验记录...', 178, 34, 3, 1, '2024-12-17 15:20:00'),
-- 就业实习类帖子
(6, 3, '券商实习面试经验分享', '刚刚拿到某头部券商的实习offer分享一下面试经验。金融行业对专业能力和综合素质要求都很高准备过程中要注意这几个方面扎实的专业基础、良好的表达能力、对市场的敏感度...', 423, 78, 11, 1, '2024-12-21 14:00:00'),
(3, 3, 'IT互联网春招总结', '经历了春招季最终选择了某大厂的后端开发岗位。分享一下投递简历、技术面试、HR面试的全流程经验希望对计算机专业的同学有帮助。技术面试主要考察数据结构、算法、系统设计...', 567, 89, 15, 2, '2024-05-18 09:15:00'),
-- 考研考公类帖子
(15, 7, '历史学考研经验贴', '成功上岸北师大中国史专业!分享一下备考经验:如何选择学校、如何制定复习计划、如何准备专业课等。考研路上不孤单,加油!专业课复习要注意史料分析和论述题...', 389, 72, 13, 1, '2024-12-10 22:00:00'),
-- 生活服务类帖子
(9, 8, '出售工科教材一批', '即将毕业,出售一些专业课教材:《结构力学》《材料力学》《工程制图》等,八成新,价格优惠。有需要的学弟学妹可以联系我~都是正版教材,保存得很好', 156, 12, 2, 1, '2024-12-22 18:30:00'),
(13, 8, '寻找珞珈山丢失的口腔器械包', '昨天在樱花大道丢失了一个蓝色器械包,里面有重要的口腔实习用具。如有好心人捡到,请联系我,必有重谢!器械包上有我的姓名标签', 89, 8, 1, 1, '2024-12-23 07:45:00');
-- 插入评论数据
INSERT INTO `comments` (`post_id`, `user_id`, `content`, `parent_id`, `like_count`, `status`, `created_at`) VALUES
-- 对数学建模帖子的评论
(1, 3, '恭喜学长!我们正在准备下半年的国赛,请问有什么推荐的学习资料吗?', NULL, 5, 1, '2024-12-20 10:30:00'),
(1, 6, '数模确实需要很强的团队协作能力,我们当时就是沟通不够充分才没拿到好成绩', NULL, 3, 1, '2024-12-20 11:15:00'),
(1, 2, '推荐《数学建模方法与分析》这本书MATLAB和Python都要熟练掌握', 1, 2, 1, '2024-12-20 12:00:00'),
-- 对樱花帖子的评论
(4, 10, '照片拍得真美!求拍摄参数和后期处理方法', NULL, 8, 1, '2024-04-10 14:30:00'),
(4, 16, '武大的樱花确实是一绝,每年都要来打卡', NULL, 4, 1, '2024-04-10 15:45:00'),
-- 对法学院帖子的评论
(7, 15, '法学院的模拟法庭一直很有名,想去观摩学习', NULL, 3, 1, '2024-12-16 13:00:00'),
(7, 4, '欢迎其他学院的同学来观摩!比赛时间是下周五晚上', 6, 1, 1, '2024-12-16 14:30:00'),
-- 对实习帖子的评论
(9, 2, '金融行业竞争确实激烈,学长有什么建议给想进入这个行业的同学吗?', NULL, 4, 1, '2024-12-21 15:30:00'),
(9, 6, '建议先把CFA一级考出来然后多参加实习积累经验', 8, 6, 1, '2024-12-21 16:45:00');
-- 插入点赞数据
INSERT INTO `post_likes` (`user_id`, `post_id`, `created_at`) VALUES
-- 用户点赞帖子
(2, 4, '2024-04-10 11:00:00'),
(2, 7, '2024-12-16 12:00:00'),
(3, 1, '2024-12-20 10:00:00'),
(3, 4, '2024-04-10 16:00:00'),
(4, 1, '2024-12-20 11:30:00'),
(4, 9, '2024-12-21 15:00:00'),
(5, 2, '2024-12-19 17:30:00'),
(6, 1, '2024-12-20 13:00:00'),
(6, 10, '2024-05-18 10:00:00');
-- 插入学习资源数据
INSERT INTO `resources` (`user_id`, `title`, `description`, `file_url`, `file_size`, `file_type`, `category_id`, `download_count`, `like_count`, `status`) VALUES
(2, '数据结构课程设计报告', '包含完整的数据结构课程设计实验报告,涵盖栈、队列、树、图等数据结构的实现和应用。', '/files/data-structure-report.pdf', 2048576, 'application/pdf', 1, 15, 8, 1),
(3, '算法导论学习笔记', '详细的算法导论学习笔记,包含排序算法、图算法、动态规划等重要算法的分析和实现。', '/files/algorithm-notes.docx', 1572864, 'application/msword', 1, 25, 12, 1),
(2, '高等数学期末复习资料', '高等数学期末考试复习资料合集,包含重要公式、定理证明和典型习题解答。', '/files/calculus-review.pdf', 3145728, 'application/pdf', 1, 32, 18, 1),
(6, '宏观经济学PPT课件', '经济学专业课件,包含货币政策、财政政策等核心内容。', '/files/macro-economics.pptx', 5242880, 'application/vnd.ms-powerpoint', 1, 20, 15, 1),
(14, '校园生活指南', '新生校园生活指南,包含宿舍管理、食堂介绍、图书馆使用等实用信息。', '/files/campus-guide.pdf', 1048576, 'application/pdf', 2, 45, 28, 1),
(3, '计算机网络实验代码', '计算机网络课程实验代码合集包含Socket编程、HTTP协议实现等。', '/files/network-lab-code.zip', 4194304, 'application/zip', 5, 18, 10, 1);
-- 插入课程数据
INSERT INTO `courses` (`user_id`, `name`, `teacher`, `location`, `day_of_week`, `start_time`, `end_time`, `start_week`, `end_week`, `semester`, `color`, `status`) VALUES
-- 数学学院学生的课程
(2, '高等代数', '张教授', '数学学院楼201', 1, '08:00:00', '09:40:00', 1, 16, '2024-2', '#409EFF', 1),
(2, '实变函数', '李老师', '数学学院楼301', 3, '14:00:00', '15:40:00', 1, 16, '2024-2', '#67C23A', 1),
(2, '数学建模', '王教授', '计算中心机房', 5, '19:00:00', '21:00:00', 1, 16, '2024-2', '#E6A23C', 1),
-- 计算机学院学生的课程
(3, '数据结构与算法', '赵教授', '信息学部计算机楼', 2, '10:00:00', '11:40:00', 1, 16, '2024-2', '#409EFF', 1),
(3, '软件工程', '钱老师', '信息学部B楼302', 4, '14:00:00', '15:40:00', 1, 16, '2024-2', '#67C23A', 1),
(3, '算法竞赛训练', 'ACM教练', '信息学部机房', 6, '19:30:00', '21:30:00', 1, 16, '2024-2', '#E6A23C', 1),
-- 法学院学生的课程
(4, '民法学', '孙教授', '法学院模拟法庭', 1, '10:00:00', '11:40:00', 1, 16, '2024-2', '#409EFF', 1),
(4, '法理学', '周老师', '法学院研讨室', 3, '15:50:00', '17:30:00', 1, 16, '2024-2', '#67C23A', 1),
-- 经管学院学生的课程
(6, '宏观经济学', '吴教授', '经管大楼B201', 1, '08:00:00', '09:40:00', 1, 16, '2024-2', '#409EFF', 1),
(6, '计量经济学', '郑老师', '经管大楼机房', 2, '10:00:00', '11:40:00', 1, 16, '2024-2', '#67C23A', 1);
-- 插入日程数据
INSERT INTO `schedules` (`user_id`, `title`, `description`, `start_time`, `end_time`, `location`, `is_all_day`, `reminder`, `color`, `status`) VALUES
-- 学习相关日程
(2, '高等代数期末复习', '准备高等代数期末考试,重点复习线性变换和特征值', '2025-01-10 19:00:00', '2025-01-10 22:00:00', '图书馆总馆3楼', 0, 30, '#409EFF', 1),
(3, '算法竞赛训练', 'ACM周赛讲解动态规划专题', '2025-01-12 19:30:00', '2025-01-12 21:30:00', '信息学部机房', 0, 15, '#67C23A', 1),
(4, '模拟法庭准备', '准备"枫叶杯"模拟法庭大赛材料', '2025-01-08 14:00:00', '2025-01-08 17:00:00', '法学院研讨室', 0, 60, '#E6A23C', 1),
-- 社团活动
(14, '诗词社例会', '讨论新学期诗词创作活动安排', '2025-01-15 18:30:00', '2025-01-15 20:00:00', '樱园学生活动中心', 0, 30, '#909399', 1),
(16, '校报编辑部会议', '讨论下期专题策划和采访安排', '2025-01-16 17:00:00', '2025-01-16 18:30:00', '学生事务中心', 0, 15, '#909399', 1),
-- 实习实践
(6, '券商实习面试', '参加XX证券公司实习生面试', '2025-01-20 14:00:00', '2025-01-20 16:00:00', '金融街', 0, 60, '#F56C6C', 1),
(12, '医院见习', '跟随带教老师查房学习', '2025-01-18 07:30:00', '2025-01-18 12:00:00', '人民医院', 0, 120, '#C0C4CC', 1),
-- 个人安排
(2, '期末考试', '高等代数期末考试', '2025-01-25 08:00:00', '2025-01-25 10:00:00', '数学学院楼201', 0, 1440, '#F56C6C', 1),
(3, '项目答辩', '软件工程课程设计项目答辩', '2025-01-22 14:00:00', '2025-01-22 17:00:00', '信息学部B楼', 0, 720, '#E6A23C', 1),
(6, '考研复试准备', '准备经济学研究生复试材料', '2025-01-30 09:00:00', '2025-01-30 18:00:00', '图书馆', 1, 2880, '#9B59B6', 1);
-- ==========================================
-- 完成提示
-- ==========================================
SELECT 'UniLife数据库重建完成所有表和测试数据已成功插入。' AS result;
SELECT '数据库结构:无外键约束,使用应用层维护数据一致性。' AS architecture;
SELECT CONCAT('总共创建了 ', COUNT(*), ' 个表') AS table_count FROM information_schema.tables WHERE table_schema = 'UniLife';
SELECT '可以开始启动应用服务了!' AS next_step;

@ -1,36 +1,195 @@
-- 测试数据插入脚本
-- 武汉大学学生论坛测试数据
-- 使用数据库
USE UniLife;
-- 插入测试用户数据
INSERT INTO `users` (`username`, `email`, `password`, `nickname`, `role`, `status`, `is_verified`, `student_id`, `department`, `major`, `grade`) VALUES
('testuser1', 'test1@student.edu.cn', '123456', '张小明', 0, 1, 1, '2021001001', '计算机科学与技术学院', '计算机科学与技术', '2021'),
('testuser2', 'test2@student.edu.cn', '123456', '李小红', 0, 1, 1, '2021001002', '数学与统计学院', '数学与应用数学', '2021'),
('testuser3', 'test3@student.edu.cn', '123456', '王小刚', 0, 1, 1, '2021001003', '物理学院', '物理学', '2021');
-- 清空现有测试数据(保留表结构和管理员账号)
DELETE FROM resource_likes;
DELETE FROM post_likes;
DELETE FROM comment_likes;
DELETE FROM comments;
DELETE FROM posts;
DELETE FROM resources;
DELETE FROM schedules;
DELETE FROM courses;
DELETE FROM users WHERE id > 1; -- 保留管理员账号
-- 插入测试资源数据
-- 清空可能存在的重复分类
DELETE FROM categories WHERE name IN ('学院专区', '考研考公', '生活服务');
-- 重置自增ID
ALTER TABLE users AUTO_INCREMENT = 2;
ALTER TABLE posts AUTO_INCREMENT = 1;
ALTER TABLE comments AUTO_INCREMENT = 1;
ALTER TABLE post_likes AUTO_INCREMENT = 1;
ALTER TABLE comment_likes AUTO_INCREMENT = 1;
ALTER TABLE resources AUTO_INCREMENT = 1;
ALTER TABLE resource_likes AUTO_INCREMENT = 1;
ALTER TABLE courses AUTO_INCREMENT = 1;
ALTER TABLE schedules AUTO_INCREMENT = 1;
ALTER TABLE categories AUTO_INCREMENT = 6;
-- 更新现有分类数据(更贴合武汉大学实际)
UPDATE `categories` SET
`name` = '学术交流',
`description` = '学术讨论、科研分享、竞赛经验',
`icon` = '📚'
WHERE `name` = '学习交流';
UPDATE `categories` SET
`description` = '武汉大学校园生活、社团活动、文化娱乐',
`icon` = '🏫'
WHERE `name` = '校园生活';
UPDATE `categories` SET
`name` = '就业实习',
`description` = '实习经验、求职心得、职业规划',
`icon` = '💼'
WHERE `name` = '求职就业';
-- 插入新的分类
INSERT INTO `categories` (`name`, `description`, `icon`, `sort`, `status`) VALUES
('学院专区', '各学院学生交流专区', '🎓', 6, 1),
('考研考公', '研究生入学考试、公务员考试', '📖', 7, 1),
('生活服务', '二手交易、失物招领、校园服务', '🛍️', 8, 1);
-- 1. 插入武汉大学学生用户数据
INSERT INTO `users` (`username`, `email`, `password`, `nickname`, `bio`, `gender`, `student_id`, `department`, `major`, `grade`, `points`, `role`, `status`, `is_verified`, `created_at`) VALUES
-- 文理学部学生
('czq2024', 'czq@whu.edu.cn', '123456', '珞珈数学狗', '数学与统计学院2022级数学类热爱数学建模ACM银牌选手', 1, '2022301140001', '数学与统计学院', '数学类', '2022级', 150, 0, 1, 1, '2024-09-01 09:00:00'),
('lihua_cs', 'lihua@whu.edu.cn', '123456', '代码诗人', '计算机学院2021级软件工程全栈开发爱好者开源项目贡献者', 1, '2021301120001', '计算机学院', '软件工程', '2021级', 230, 0, 1, 1, '2024-09-01 10:00:00'),
('wangming_law', 'wangming@whu.edu.cn', '123456', '法学小白', '法学院2023级法学专业模拟法庭常客梦想成为大律师', 1, '2023301080001', '法学院', '法学', '2023级', 80, 0, 1, 1, '2024-09-01 11:00:00'),
('zhangwei_chem', 'zhangwei@whu.edu.cn', '123456', '化学实验员', '化学与分子科学学院2022级化学专业实验室常驻合成达人', 1, '2022301130001', '化学与分子科学学院', '化学', '2022级', 120, 0, 1, 1, '2024-09-01 12:00:00'),
('liuxin_econ', 'liuxin@whu.edu.cn', '123456', '经济观察者', '经济与管理学院2021级经济学关注宏观经济政策券商实习生', 2, '2021301110001', '经济与管理学院', '经济学', '2021级', 200, 0, 1, 1, '2024-09-01 13:00:00'),
-- 工学部学生
('chenfei_water', 'chenfei@whu.edu.cn', '123456', '水利工程师', '水利水电学院2022级水利水电工程三峡实习经历立志建设美丽中国', 1, '2022301320001', '水利水电学院', '水利水电工程', '2022级', 90, 0, 1, 1, '2024-09-01 14:00:00'),
('sunhao_power', 'sunhao@whu.edu.cn', '123456', '电气小子', '电气与自动化学院2023级电气工程及其自动化电力系统仿真专家', 1, '2023301330001', '电气与自动化学院', '电气工程及其自动化', '2023级', 70, 0, 1, 1, '2024-09-01 15:00:00'),
('wujing_civil', 'wujing@whu.edu.cn', '123456', '土木妹子', '土木建筑工程学院2022级土木工程桥梁设计爱好者BIM技术达人', 2, '2022301340001', '土木建筑工程学院', '土木工程', '2022级', 110, 0, 1, 1, '2024-09-01 16:00:00'),
-- 信息学部学生
('liqiang_remote', 'liqiang@whu.edu.cn', '123456', '遥感专家', '遥感信息工程学院2021级遥感科学与技术无人机航拍爱好者', 1, '2021301210001', '遥感信息工程学院', '遥感科学与技术', '2021级', 180, 0, 1, 1, '2024-09-01 17:00:00'),
('zhaoli_survey', 'zhaoli@whu.edu.cn', '123456', '测绘达人', '测绘学院2022级测绘工程GPS定位技术研究者野外作业经验丰富', 1, '2022301220001', '测绘学院', '测绘工程', '2022级', 95, 0, 1, 1, '2024-09-01 18:00:00'),
-- 医学部学生
('huangyan_med', 'huangyan@whu.edu.cn', '123456', '未来医生', '基础医学院2020级临床医学人民医院实习生立志救死扶伤', 2, '2020301410001', '基础医学院', '临床医学', '2020级', 250, 0, 1, 1, '2024-09-01 19:00:00'),
('wangpeng_dental', 'wangpeng@whu.edu.cn', '123456', '口腔医师', '口腔医学院2021级口腔医学口腔医院见习关注口腔健康科普', 1, '2021301420001', '口腔医学院', '口腔医学', '2021级', 160, 0, 1, 1, '2024-09-01 20:00:00'),
-- 人文社科学部学生
('luxiaoya_chinese', 'luxiaoya@whu.edu.cn', '123456', '文学少女', '文学院2022级汉语言文学古典文学爱好者诗词社社长', 2, '2022301050001', '文学院', '汉语言文学', '2022级', 140, 0, 1, 1, '2024-09-01 21:00:00'),
('zhoujie_history', 'zhoujie@whu.edu.cn', '123456', '史学研究生', '历史学院研究生,中国古代史方向,博物馆志愿者', 1, '2024302050001', '历史学院', '中国史', '2024级', 100, 0, 1, 1, '2024-09-01 22:00:00'),
('tanglei_news', 'tanglei@whu.edu.cn', '123456', '新传人', '新闻与传播学院2021级新闻学校媒记者关注社会热点', 1, '2021301070001', '新闻与传播学院', '新闻学', '2021级', 170, 0, 1, 1, '2024-09-01 23:00:00');
-- 2. 插入论坛帖子数据使用已存在的用户ID
INSERT INTO `posts` (`user_id`, `category_id`, `title`, `content`, `view_count`, `like_count`, `comment_count`, `status`, `created_at`) VALUES
-- 学术交流类帖子
(2, 1, '数学建模美赛经验分享', '刚刚结束的美国大学生数学建模竞赛我们团队获得了M奖分享一下参赛经验和技巧希望对学弟学妹们有帮助。数模比赛不仅考验数学能力更重要的是团队协作和论文写作能力。首先要选择合适的队友最好是数学、编程、英语各有所长的组合...', 256, 42, 8, 2, '2024-12-20 09:30:00'),
(3, 1, 'ACM-ICPC区域赛总结', '参加了西安站的ACM区域赛虽然没能拿到金牌但收获很大。分享一下刷题心得和比赛策略特别是动态规划和图论算法的练习方法。建议大家多在Codeforces和AtCoder上练习这些平台的题目质量很高...', 189, 35, 6, 1, '2024-12-19 16:45:00'),
(6, 1, '宏观经济学课程研讨:通胀与货币政策', '最近在学习宏观经济学,对当前的通胀形势和央行货币政策有一些思考。想和大家讨论一下利率调整对经济的影响机制,特别是在当前全球经济形势下的作用...', 145, 28, 4, 1, '2024-12-18 14:20:00'),
-- 校园生活类帖子
(14, 2, '武大樱花季摄影大赛作品展示', '樱花季刚过分享一些在樱花大道拍摄的照片。今年的樱花开得特别美虽然人很多但还是拍到了一些不错的角度。附上拍摄技巧分享使用的是佳能5D4光圈f/2.8ISO400后期用LR调色...', 1234, 156, 12, 2, '2024-04-10 10:15:00'),
(16, 2, '校运动会志愿者招募!', '第55届田径运动会即将开始现招募志愿者工作内容包括引导、记分、颁奖等。参与志愿服务可获得志愿时长认证还有纪念品哦有意向的同学请在评论区留言或私信联系我', 456, 89, 5, 1, '2024-12-15 08:00:00'),
(11, 2, '测绘学院野外实习日记', '刚从庐山实习回来分享一下野外测量的酸甜苦辣。早上5点起床背着仪器爬山虽然辛苦但收获满满。珞珈山的风景真是看不够啊学到了很多实际操作技能...', 234, 45, 7, 1, '2024-12-14 19:30:00'),
-- 学院专区类帖子
(4, 6, '法学院模拟法庭大赛预告', '一年一度的"枫叶杯"模拟法庭大赛即将开始!欢迎各年级同学组队参加。比赛分为民事组和刑事组,优胜者将代表学院参加全国比赛。这是提升法律实务能力的绝佳机会...', 345, 67, 9, 2, '2024-12-16 11:00:00'),
(5, 6, '化学实验安全注意事项提醒', '最近实验室发生了几起小事故,提醒大家一定要注意安全!特别是使用强酸强碱时,护目镜和手套必须佩戴。实验无小事,安全第一!同时要做好实验记录...', 178, 34, 3, 1, '2024-12-17 15:20:00'),
-- 就业实习类帖子
(6, 3, '券商实习面试经验分享', '刚刚拿到某头部券商的实习offer分享一下面试经验。金融行业对专业能力和综合素质要求都很高准备过程中要注意这几个方面扎实的专业基础、良好的表达能力、对市场的敏感度...', 423, 78, 11, 1, '2024-12-21 14:00:00'),
(3, 3, 'IT互联网春招总结', '经历了春招季最终选择了某大厂的后端开发岗位。分享一下投递简历、技术面试、HR面试的全流程经验希望对计算机专业的同学有帮助。技术面试主要考察数据结构、算法、系统设计...', 567, 89, 15, 2, '2024-05-18 09:15:00'),
-- 考研考公类帖子
(15, 7, '历史学考研经验贴', '成功上岸北师大中国史专业!分享一下备考经验:如何选择学校、如何制定复习计划、如何准备专业课等。考研路上不孤单,加油!专业课复习要注意史料分析和论述题...', 389, 72, 13, 1, '2024-12-10 22:00:00'),
-- 生活服务类帖子
(9, 8, '出售工科教材一批', '即将毕业,出售一些专业课教材:《结构力学》《材料力学》《工程制图》等,八成新,价格优惠。有需要的学弟学妹可以联系我~都是正版教材,保存得很好', 156, 12, 2, 1, '2024-12-22 18:30:00'),
(13, 8, '寻找珞珈山丢失的口腔器械包', '昨天在樱花大道丢失了一个蓝色器械包,里面有重要的口腔实习用具。如有好心人捡到,请联系我,必有重谢!器械包上有我的姓名标签', 89, 8, 1, 1, '2024-12-23 07:45:00');
-- 3. 插入评论数据
INSERT INTO `comments` (`post_id`, `user_id`, `content`, `parent_id`, `like_count`, `status`, `created_at`) VALUES
-- 对数学建模帖子的评论
(1, 3, '恭喜学长!我们正在准备下半年的国赛,请问有什么推荐的学习资料吗?', NULL, 5, 1, '2024-12-20 10:30:00'),
(1, 6, '数模确实需要很强的团队协作能力,我们当时就是沟通不够充分才没拿到好成绩', NULL, 3, 1, '2024-12-20 11:15:00'),
(1, 2, '推荐《数学建模方法与分析》这本书MATLAB和Python都要熟练掌握', 1, 2, 1, '2024-12-20 12:00:00'),
-- 对樱花帖子的评论
(4, 10, '照片拍得真美!求拍摄参数和后期处理方法', NULL, 8, 1, '2024-04-10 14:30:00'),
(4, 16, '武大的樱花确实是一绝,每年都要来打卡', NULL, 4, 1, '2024-04-10 15:45:00'),
-- 对法学院帖子的评论
(7, 15, '法学院的模拟法庭一直很有名,想去观摩学习', NULL, 3, 1, '2024-12-16 13:00:00'),
(7, 4, '欢迎其他学院的同学来观摩!比赛时间是下周五晚上', 6, 1, 1, '2024-12-16 14:30:00'),
-- 对实习帖子的评论
(9, 2, '金融行业竞争确实激烈,学长有什么建议给想进入这个行业的同学吗?', NULL, 4, 1, '2024-12-21 15:30:00'),
(9, 6, '建议先把CFA一级考出来然后多参加实习积累经验', 8, 6, 1, '2024-12-21 16:45:00');
-- 4. 插入点赞数据
INSERT INTO `post_likes` (`user_id`, `post_id`, `created_at`) VALUES
-- 用户点赞帖子
(2, 4, '2024-04-10 11:00:00'),
(2, 7, '2024-12-16 12:00:00'),
(3, 1, '2024-12-20 10:00:00'),
(3, 4, '2024-04-10 16:00:00'),
(4, 1, '2024-12-20 11:30:00'),
(4, 9, '2024-12-21 15:00:00'),
(5, 2, '2024-12-19 17:30:00'),
(6, 1, '2024-12-20 13:00:00'),
(6, 10, '2024-05-18 10:00:00');
-- 5. 插入学习资源数据
INSERT INTO `resources` (`user_id`, `title`, `description`, `file_url`, `file_size`, `file_type`, `category_id`, `download_count`, `like_count`, `status`) VALUES
(2, '数据结构课程设计报告', '包含完整的数据结构课程设计实验报告,涵盖栈、队列、树、图等数据结构的实现和应用。', 'https://example.com/files/data-structure-report.pdf', 2048576, 'application/pdf', 1, 15, 8, 1),
(2, '算法导论学习笔记', '详细的算法导论学习笔记,包含排序算法、图算法、动态规划等重要算法的分析和实现。', 'https://example.com/files/algorithm-notes.docx', 1572864, 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 1, 25, 12, 1),
(3, '高等数学期末复习资料', '高等数学期末考试复习资料合集,包含重要公式、定理证明和典型习题解答。', 'https://example.com/files/calculus-review.pdf', 3145728, 'application/pdf', 1, 32, 18, 1),
(3, '线性代数PPT课件', '线性代数完整PPT课件包含矩阵运算、向量空间、特征值等核心内容。', 'https://example.com/files/linear-algebra.pptx', 5242880, 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 1, 20, 15, 1),
(4, '校园生活指南', '新生校园生活指南,包含宿舍管理、食堂介绍、图书馆使用等实用信息。', 'https://example.com/files/campus-guide.pdf', 1048576, 'application/pdf', 2, 45, 28, 1),
(2, '计算机网络实验代码', '计算机网络课程实验代码合集包含Socket编程、HTTP协议实现等。', 'https://example.com/files/network-lab-code.zip', 4194304, 'application/zip', 5, 18, 10, 1);
-- 插入测试课程数据
(2, '数据结构课程设计报告', '包含完整的数据结构课程设计实验报告,涵盖栈、队列、树、图等数据结构的实现和应用。', '/files/data-structure-report.pdf', 2048576, 'application/pdf', 1, 15, 8, 1),
(3, '算法导论学习笔记', '详细的算法导论学习笔记,包含排序算法、图算法、动态规划等重要算法的分析和实现。', '/files/algorithm-notes.docx', 1572864, 'application/msword', 1, 25, 12, 1),
(2, '高等数学期末复习资料', '高等数学期末考试复习资料合集,包含重要公式、定理证明和典型习题解答。', '/files/calculus-review.pdf', 3145728, 'application/pdf', 1, 32, 18, 1),
(6, '宏观经济学PPT课件', '经济学专业课件,包含货币政策、财政政策等核心内容。', '/files/macro-economics.pptx', 5242880, 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 1, 20, 15, 1),
(14, '校园生活指南', '新生校园生活指南,包含宿舍管理、食堂介绍、图书馆使用等实用信息。', '/files/campus-guide.pdf', 1048576, 'application/pdf', 2, 45, 28, 1),
(3, '计算机网络实验代码', '计算机网络课程实验代码合集包含Socket编程、HTTP协议实现等。', '/files/network-lab-code.zip', 4194304, 'application/zip', 5, 18, 10, 1);
-- 6. 插入课程数据
INSERT INTO `courses` (`user_id`, `name`, `teacher`, `location`, `day_of_week`, `start_time`, `end_time`, `start_week`, `end_week`, `semester`, `color`, `status`) VALUES
(2, '数据结构', '张教授', '教学楼A201', 1, '08:00:00', '09:40:00', 1, 16, '2024-1', '#409EFF', 1),
(2, '算法设计与分析', '李老师', '教学楼B301', 3, '10:00:00', '11:40:00', 1, 16, '2024-1', '#67C23A', 1),
(2, '计算机网络', '王教授', '实验楼C102', 5, '14:00:00', '15:40:00', 1, 16, '2024-1', '#E6A23C', 1),
(3, '高等数学', '赵老师', '教学楼A101', 2, '08:00:00', '09:40:00', 1, 16, '2024-1', '#F56C6C', 1),
(3, '线性代数', '钱教授', '教学楼A203', 4, '10:00:00', '11:40:00', 1, 16, '2024-1', '#909399', 1),
(4, '大学物理', '孙老师', '物理楼101', 1, '14:00:00', '15:40:00', 1, 16, '2024-1', '#9B59B6', 1),
(4, '物理实验', '周教授', '物理实验室', 3, '16:00:00', '17:40:00', 1, 16, '2024-1', '#3498DB', 1);
-- 插入测试日程数据
-- 数学学院学生的课程
(2, '高等代数', '张教授', '数学学院楼201', 1, '08:00:00', '09:40:00', 1, 16, '2024-2', '#409EFF', 1),
(2, '实变函数', '李老师', '数学学院楼301', 3, '14:00:00', '15:40:00', 1, 16, '2024-2', '#67C23A', 1),
(2, '数学建模', '王教授', '计算中心机房', 5, '19:00:00', '21:00:00', 1, 16, '2024-2', '#E6A23C', 1),
-- 计算机学院学生的课程
(3, '数据结构与算法', '赵教授', '信息学部计算机楼', 2, '10:00:00', '11:40:00', 1, 16, '2024-2', '#409EFF', 1),
(3, '软件工程', '钱老师', '信息学部B楼302', 4, '14:00:00', '15:40:00', 1, 16, '2024-2', '#67C23A', 1),
(3, '算法竞赛训练', 'ACM教练', '信息学部机房', 6, '19:30:00', '21:30:00', 1, 16, '2024-2', '#E6A23C', 1),
-- 法学院学生的课程
(4, '民法学', '孙教授', '法学院模拟法庭', 1, '10:00:00', '11:40:00', 1, 16, '2024-2', '#409EFF', 1),
(4, '法理学', '周老师', '法学院研讨室', 3, '15:50:00', '17:30:00', 1, 16, '2024-2', '#67C23A', 1),
-- 经管学院学生的课程
(6, '宏观经济学', '吴教授', '经管大楼B201', 1, '08:00:00', '09:40:00', 1, 16, '2024-2', '#409EFF', 1),
(6, '计量经济学', '郑老师', '经管大楼机房', 2, '10:00:00', '11:40:00', 1, 16, '2024-2', '#67C23A', 1);
-- 7. 插入日程数据
INSERT INTO `schedules` (`user_id`, `title`, `description`, `start_time`, `end_time`, `location`, `is_all_day`, `reminder`, `color`, `status`) VALUES
(2, '期末考试复习', '准备数据结构期末考试', '2024-06-15 19:00:00', '2024-06-15 22:00:00', '图书馆', 0, 30, '#409EFF', 1),
(2, '项目讨论会', '讨论课程设计项目进展', '2024-06-20 14:00:00', '2024-06-20 16:00:00', '实验室', 0, 15, '#67C23A', 1),
(3, '社团活动', '参加数学建模社团活动', '2024-06-18 00:00:00', '2024-06-18 23:59:59', '学生活动中心', 1, 60, '#E6A23C', 1),
(3, '导师面谈', '与导师讨论学习进度', '2024-06-22 10:00:00', '2024-06-22 11:00:00', '办公楼A305', 0, 30, '#F56C6C', 1),
(4, '实验报告提交', '提交物理实验报告', '2024-06-25 23:59:00', '2024-06-25 23:59:59', '在线提交', 0, 1440, '#9B59B6', 1);
-- 学习相关日程
(2, '高等代数期末复习', '准备高等代数期末考试,重点复习线性变换和特征值', '2025-01-10 19:00:00', '2025-01-10 22:00:00', '图书馆总馆3楼', 0, 30, '#409EFF', 1),
(3, '算法竞赛训练', 'ACM周赛讲解动态规划专题', '2025-01-12 19:30:00', '2025-01-12 21:30:00', '信息学部机房', 0, 15, '#67C23A', 1),
(4, '模拟法庭准备', '准备"枫叶杯"模拟法庭大赛材料', '2025-01-08 14:00:00', '2025-01-08 17:00:00', '法学院研讨室', 0, 60, '#E6A23C', 1),
-- 社团活动
(14, '诗词社例会', '讨论新学期诗词创作活动安排', '2025-01-15 18:30:00', '2025-01-15 20:00:00', '樱园学生活动中心', 0, 30, '#909399', 1),
(16, '校报编辑部会议', '讨论下期专题策划和采访安排', '2025-01-16 17:00:00', '2025-01-16 18:30:00', '学生事务中心', 0, 15, '#909399', 1),
-- 实习实践
(6, '券商实习面试', '参加XX证券公司实习生面试', '2025-01-20 14:00:00', '2025-01-20 16:00:00', '金融街', 0, 60, '#F56C6C', 1),
(12, '医院见习', '跟随带教老师查房学习', '2025-01-18 07:30:00', '2025-01-18 12:00:00', '人民医院', 0, 120, '#C0C4CC', 1),
-- 个人安排
(2, '期末考试', '高等代数期末考试', '2025-01-25 08:00:00', '2025-01-25 10:00:00', '数学学院楼201', 0, 1440, '#F56C6C', 1),
(3, '项目答辩', '软件工程课程设计项目答辩', '2025-01-22 14:00:00', '2025-01-22 17:00:00', '信息学部B楼', 0, 720, '#E6A23C', 1),
(6, '考研复试准备', '准备经济学研究生复试材料', '2025-01-30 09:00:00', '2025-01-30 18:00:00', '图书馆', 1, 2880, '#9B59B6', 1);

@ -159,4 +159,57 @@
</if>
ORDER BY created_at DESC
</select>
<!-- 删除用户及其相关数据的SQL -->
<!-- 软删除用户 -->
<update id="deleteUser">
UPDATE users
SET status = 0,
updated_at = NOW()
WHERE id = #{id}
</update>
<!-- 软删除用户的所有帖子 -->
<update id="deleteUserPosts">
UPDATE posts
SET status = 0,
updated_at = NOW()
WHERE user_id = #{userId}
</update>
<!-- 软删除用户的所有评论 -->
<update id="deleteUserComments">
UPDATE comments
SET status = 0,
updated_at = NOW()
WHERE user_id = #{userId}
</update>
<!-- 软删除用户的所有资源 -->
<update id="deleteUserResources">
UPDATE resources
SET status = 0,
updated_at = NOW()
WHERE user_id = #{userId}
</update>
<!-- 删除用户的所有课程 -->
<delete id="deleteUserCourses">
DELETE FROM courses
WHERE user_id = #{userId}
</delete>
<!-- 删除用户的所有日程 -->
<delete id="deleteUserSchedules">
DELETE FROM schedules
WHERE user_id = #{userId}
</delete>
<!-- 删除用户的所有点赞记录 -->
<delete id="deleteUserLikes">
DELETE FROM post_likes WHERE user_id = #{userId};
DELETE FROM comment_likes WHERE user_id = #{userId};
DELETE FROM resource_likes WHERE user_id = #{userId};
</delete>
</mapper>

@ -0,0 +1,123 @@
# 问题修复和Stagewise集成说明
## 🔧 已修复的问题
### 1. Schedule实体类reminder字段类型错误
**问题描述**
```
Value '1440' is outside of valid range for type java.lang.Byte
```
**根本原因**
- 数据库中schedules表的reminder字段已修改为INT类型
- 但Java实体类中的reminder字段仍然是Byte类型范围-128到127
- 测试数据中有1440、720等超出Byte范围的值
**解决方案**
修改了以下文件中的reminder字段类型从Byte改为Integer
- `unilife-server/src/main/java/com/unilife/model/entity/Schedule.java`
- `unilife-server/src/main/java/com/unilife/model/vo/ScheduleVO.java`
- `unilife-server/src/main/java/com/unilife/model/dto/CreateScheduleDTO.java`
### 2. 评论显示问题分析
**问题描述**
前端显示评论数量9条但实际只显示2条评论
**初步分析**
- 数据库中确实存在评论数据
- 一级评论和回复查询逻辑正常
- 可能是前端渲染或API调用的问题
**需要进一步调试**
- 检查浏览器网络请求
- 查看前端控制台错误
- 验证API返回数据
## 🚀 Stagewise开发工具集成
### 安装的包
```bash
npm install @stagewise/toolbar-vue --save-dev
```
### 集成位置
修改了 `unilife-frontend/src/App.vue` 文件:
```vue
<template>
<div id="app">
<router-view />
<!-- Stagewise工具栏 - 仅在开发模式下显示 -->
<component :is="stagewiseComponent" v-if="isDevelopment && stagewiseComponent" :config="stagewiseConfig" />
</div>
</template>
<script setup lang="ts">
import { ref, onMounted, type Component } from 'vue'
// 检查是否为开发环境
const isDevelopment = import.meta.env.DEV
// Stagewise组件引用
const stagewiseComponent = ref<Component | null>(null)
// Stagewise配置
const stagewiseConfig = {
plugins: []
}
// 仅在开发模式下动态加载stagewise组件
if (isDevelopment) {
onMounted(async () => {
try {
const { StagewiseToolbar } = await import('@stagewise/toolbar-vue')
stagewiseComponent.value = StagewiseToolbar as Component
} catch (error) {
console.warn('Stagewise toolbar not available:', error)
}
})
}
</script>
```
### 特性
1. ✅ **仅在开发模式运行**:使用 `import.meta.env.DEV` 检查
2. ✅ **动态导入**避免在生产环境中包含stagewise代码
3. ✅ **错误处理**:如果包未安装或导入失败,会优雅降级
4. ✅ **TypeScript支持**:正确的类型定义避免编译错误
5. ✅ **Vue 3兼容**使用组合式API和动态组件
### 使用方法
1. 启动开发服务器:`npm run dev`
2. 打开浏览器访问应用
3. stagewise工具栏将在开发模式下自动显示
4. 可以选择页面元素并添加AI编辑注释
## 📝 后续步骤
### 立即处理
1. **重启后端服务**以应用Schedule实体类修改
2. **测试日程功能**确保reminder字段正常工作
3. **调试评论显示问题**
### 评论问题调试步骤
1. 在浏览器中访问帖子详情页
2. 打开开发者工具检查网络请求
3. 查看 `/comments/post/{postId}` API的返回数据
4. 检查前端控制台是否有JavaScript错误
5. 验证CommentVO的数据映射是否正确
### Stagewise工具测试
1. 确认工具栏在开发模式下可见
2. 测试选择页面元素功能
3. 验证不会在生产构建中包含
## 🎯 预期结果
1. **Schedule功能**日程提醒时间可以正常设置为大于127分钟的值
2. **评论功能**:所有评论应该正确显示,包括回复
3. **Stagewise工具**在开发模式下提供AI驱动的页面编辑能力
---
*最后更新2025年5月29日*
Loading…
Cancel
Save