feat: 系统优化和功能完善

主要更新:
- 调整并发配置为50人(数据库连接池30,Tomcat线程150,异步线程池5/20)
- 实现无界阻塞队列(LinkedBlockingQueue)任务处理
- 实现分镜视频保存功能(保存到uploads目录)
- 统一管理页面导航栏和右上角样式
- 添加日活用户统计功能
- 优化视频拼接和保存逻辑
- 添加部署文档和快速部署指南
- 更新.gitignore排除敏感配置文件
This commit is contained in:
AIGC Developer
2025-11-07 19:09:50 +08:00
parent b5820d9be2
commit 1e71ae6a26
146 changed files with 10720 additions and 3032 deletions

View File

@@ -51,7 +51,7 @@
<div class="header-right">
<div class="points">
<el-icon><Star /></el-icon>
<span>25 | 首购优惠</span>
<span>{{ userInfo.points - (userInfo.frozenPoints || 0) }} | 首购优惠</span>
</div>
<div class="notifications">
<el-icon><Bell /></el-icon>
@@ -67,12 +67,13 @@
<section class="profile-section">
<div class="profile-info">
<div class="avatar">
<div class="avatar-icon"></div>
<img v-if="userInfo.avatar" :src="userInfo.avatar" alt="avatar" class="avatar-image" />
<div v-else class="avatar-icon"></div>
</div>
<div class="user-details">
<h2 class="username">mingzi_FBx7foZYDS7inLQb</h2>
<p class="profile-status">还没有设置个人简介,点击填写</p>
<p class="user-id">ID 2994509784706419</p>
<h2 class="username">{{ userInfo.nickname || userInfo.username || '未设置用户名' }}</h2>
<p class="profile-status" v-if="userInfo.bio">{{ userInfo.bio }}</p>
<p class="user-id">ID {{ userInfo.id || '加载中...' }}</p>
</div>
</div>
</section>
@@ -166,6 +167,7 @@ import {
Film
} from '@element-plus/icons-vue'
import { getMyWorks } from '@/api/userWorks'
import { getCurrentUser } from '@/api/auth'
const router = useRouter()
const userStore = useUserStore()
@@ -174,6 +176,18 @@ const userStore = useUserStore()
const showUserMenu = ref(false)
const userStatusRef = ref(null)
// 用户信息
const userInfo = ref({
username: '',
nickname: '',
bio: '',
avatar: '',
id: '',
points: 0,
frozenPoints: 0
})
const userLoading = ref(false)
// 视频数据
const videos = ref([])
const loading = ref(false)
@@ -288,6 +302,37 @@ const transformWorkData = (work) => {
}
}
// 加载用户信息
const loadUserInfo = async () => {
userLoading.value = true
try {
const response = await getCurrentUser()
console.log('获取用户信息响应:', response)
if (response && response.data && response.data.success && response.data.data) {
const user = response.data.data
console.log('用户数据:', user)
userInfo.value = {
username: user.username || '',
nickname: user.nickname || user.username || '',
bio: user.bio || '',
avatar: user.avatar || '',
id: user.id ? String(user.id) : '',
points: user.points || 0,
frozenPoints: user.frozenPoints || 0
}
console.log('设置后的用户信息:', userInfo.value)
} else {
console.error('获取用户信息失败:', response?.data?.message || '未知错误')
ElMessage.error('获取用户信息失败')
}
} catch (error) {
console.error('加载用户信息失败:', error)
ElMessage.error('加载用户信息失败: ' + (error.message || '未知错误'))
} finally {
userLoading.value = false
}
}
// 加载用户作品列表
const loadVideos = async () => {
loading.value = true
@@ -296,21 +341,31 @@ const loadVideos = async () => {
page: 0,
size: 6 // 只加载前6个作品
})
console.log('获取作品列表响应:', response)
if (response.data.success) {
if (response && response.data && response.data.success) {
const data = response.data.data || []
console.log('作品数据:', data)
// 转换数据格式
videos.value = data.map(transformWorkData)
console.log('转换后的作品列表:', videos.value)
} else {
console.error('获取作品列表失败:', response.data.message)
console.error('获取作品列表失败:', response?.data?.message || '未知错误')
}
} catch (error) {
console.error('加载作品列表失败:', error)
ElMessage.error('加载作品列表失败: ' + (error.message || '未知错误'))
} finally {
loading.value = false
}
}
// 编辑个人资料
const editProfile = () => {
// TODO: 可以跳转到编辑页面或打开编辑对话框
ElMessage.info('个人简介编辑功能待实现')
}
// 点击外部关闭菜单
const handleClickOutside = (event) => {
const userStatus = event.target.closest('.user-status')
@@ -343,6 +398,7 @@ const onVideoLoaded = (event) => {
onMounted(() => {
document.addEventListener('click', handleClickOutside)
loadUserInfo()
loadVideos()
})
@@ -642,6 +698,13 @@ onUnmounted(() => {
border-radius: 2px;
}
.avatar-image {
width: 100%;
height: 100%;
border-radius: 50%;
object-fit: cover;
}
.user-details {
flex: 1;
}