10 Commits

Author SHA1 Message Date
Kerwin
72f7764e36 chore: bump version to v1.0.7 2025-07-21 16:36:22 +08:00
Kerwin
8ed7cbc181 fix: 前端问题修复 2025-07-21 15:27:58 +08:00
ctwj
51975ad408 update: UI 优化 2025-07-21 01:01:55 +08:00
ctwj
1bb14e218e update: change name 2025-07-21 00:43:07 +08:00
ctwj
3646c371a4 rm: 移除多余文件 2025-07-20 23:22:10 +08:00
ctwj
687fc6062d update: version 2025-07-20 23:05:40 +08:00
ctwj
505e508bca chore: bump version to v1.0.6 2025-07-20 23:03:11 +08:00
ctwj
d481083140 chore: bump version to v1.0.5 2025-07-20 22:59:12 +08:00
ctwj
c76298a10b chore: bump version to v1.0.4 2025-07-20 22:57:20 +08:00
ctwj
2cb91072ba chore: bump version to v1.0.3 2025-07-20 22:51:45 +08:00
39 changed files with 147 additions and 1027 deletions

View File

@@ -1,4 +1,4 @@
# 🚀 urlDB - 网盘资源数据库
# 🚀 urlDB - 老九网盘资源数据库
<div align="center">
@@ -90,7 +90,7 @@ cd urldb
docker compose up --build -d
# 访问应用
# 前端: http://localhost:3000
# 前端: http://localhost:3030
# 后端API: http://localhost:8080
```
@@ -245,6 +245,13 @@ PORT=8080
| backend | 8080 | Go API 后端服务 |
| postgres | 5432 | PostgreSQL 数据库 |
### 构建
docker build -t ctwj/urldb-frontend:1.0.6 --target frontend .
docker build -t ctwj/urldb-backend:1.0.6 --target backend .
docker push ctwj/urldb-frontend:1.0.6
docker push ctwj/urldb-backend:1.0.6
---
## 📚 API 文档

View File

@@ -1 +1 @@
1.0.2
1.0.7

View File

@@ -11,7 +11,7 @@ type SystemConfig struct {
UpdatedAt time.Time `json:"updated_at"`
// SEO 配置
SiteTitle string `json:"site_title" gorm:"size:200;not null;default:'网盘资源数据库'"`
SiteTitle string `json:"site_title" gorm:"size:200;not null;default:'老九网盘资源数据库'"`
SiteDescription string `json:"site_description" gorm:"size:500"`
Keywords string `json:"keywords" gorm:"size:500"`
Author string `json:"author" gorm:"size:100"`

View File

@@ -57,11 +57,11 @@ func (r *SystemConfigRepositoryImpl) GetOrCreateDefault() (*entity.SystemConfig,
if err != nil {
// 创建默认配置
defaultConfig := &entity.SystemConfig{
SiteTitle: "网盘资源数据库",
SiteDescription: "专业的网盘资源数据库",
SiteTitle: "老九网盘资源数据库",
SiteDescription: "专业的老九网盘资源数据库",
Keywords: "网盘,资源管理,文件分享",
Author: "系统管理员",
Copyright: "© 2024 网盘资源数据库",
Copyright: "© 2024 老九网盘资源数据库",
AutoProcessReadyResources: false,
AutoProcessInterval: 30,
PageSize: 100,

View File

@@ -20,7 +20,7 @@ services:
- app-network
backend:
image: ctwj/urldb-backend:0.0.1
image: ctwj/urldb-backend:1.0.6
expose:
- "8080"
environment:
@@ -39,9 +39,9 @@ services:
- app-network
frontend:
image: ctwj/urldb-frontend:0.0.1
image: ctwj/urldb-frontend:1.0.6
environment:
API_BASE: http://backend:8080/api
API_BASE: /api
depends_on:
- backend
networks:

View File

@@ -38,7 +38,7 @@ $DOCKER_COMPOSE ps
echo ""
echo "✅ 系统启动完成!"
echo "🌐 前端访问地址: http://localhost:3000"
echo "🌐 前端访问地址: http://localhost:3030"
echo "🔧 后端API地址: http://localhost:8080"
echo "🗄️ 数据库地址: localhost:5432"
echo ""

View File

@@ -1,6 +1,6 @@
# 🚀 urlDB - 网盘资源数据库
# 🚀 urlDB - 老九网盘资源数据库
> 一个现代化的网盘资源数据库,支持多网盘自动化转存分享,支持百度网盘,阿里云盘,夸克网盘, 天翼云盘迅雷云盘123云盘115网盘UC网盘
> 一个现代化的老九网盘资源数据库,支持多网盘自动化转存分享,支持百度网盘,阿里云盘,夸克网盘, 天翼云盘迅雷云盘123云盘115网盘UC网盘
<div align="center">

View File

@@ -2,7 +2,7 @@
## 概述
网盘资源数据库提供了一套完整的 RESTful API 接口,支持资源管理、搜索、热门剧获取等功能。所有 API 都需要进行认证,使用 API Token 进行身份验证。
老九网盘资源数据库提供了一套完整的 RESTful API 接口,支持资源管理、搜索、热门剧获取等功能。所有 API 都需要进行认证,使用 API Token 进行身份验证。
## 基础信息

View File

@@ -47,6 +47,7 @@ docker compose ps
可以通过修改 `docker-compose.yml` 文件中的环境变量来配置服务:
后端 backend
```yaml
environment:
DB_HOST: postgres
@@ -55,7 +56,12 @@ environment:
DB_PASSWORD: password
DB_NAME: url_db
PORT: 8080
API_BASE: http://localhost:8080/api
```
前端 frontend
```yaml
environment:
API_BASE: /api
```
### 端口映射

View File

@@ -23,7 +23,7 @@ docker compose up --build -d
启动成功后,您可以通过以下地址访问:
- **前端界面**: http://localhost:3000
- **前端界面**: http://localhost:3030
默认用户密码: admin/password

View File

@@ -2,7 +2,7 @@
<html>
<head>
<meta charset="UTF-8">
<title>urlDB - 网盘资源数据库</title>
<title>urlDB - 老九网盘资源数据库</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="description" content="一个现代化的网盘资源数据库,支持多网盘自动化转存分享">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0">

View File

@@ -95,11 +95,37 @@ update_version_in_files() {
echo -e " ✅ 更新 web/package.json"
fi
# 更新useVersion.ts中的默认版本
if [ -f "web/composables/useVersion.ts" ]; then
# 使用更简单的模式匹配,先获取当前版本号
current_use_version=$(grep -o "version: '[0-9]\+\.[0-9]\+\.[0-9]\+'" web/composables/useVersion.ts | head -1)
if [ -n "$current_use_version" ]; then
sed -i.bak "s/$current_use_version/version: '${new_version}'/" web/composables/useVersion.ts
rm -f web/composables/useVersion.ts.bak
echo -e " ✅ 更新 web/composables/useVersion.ts"
else
echo -e " ⚠️ 未找到useVersion.ts中的版本号"
fi
fi
# 更新Docker镜像标签
if [ -f "docker-compose.yml" ]; then
sed -i.bak "s/image:.*:.*/image: urldb:${new_version}/" docker-compose.yml
# 获取当前镜像版本
current_backend_version=$(grep -o "ctwj/urldb-backend:[0-9]\+\.[0-9]\+\.[0-9]\+" docker-compose.yml | head -1)
current_frontend_version=$(grep -o "ctwj/urldb-frontend:[0-9]\+\.[0-9]\+\.[0-9]\+" docker-compose.yml | head -1)
if [ -n "$current_backend_version" ]; then
sed -i.bak "s|$current_backend_version|ctwj/urldb-backend:${new_version}|" docker-compose.yml
echo -e " ✅ 更新 backend 镜像: ${current_backend_version} -> ctwj/urldb-backend:${new_version}"
fi
if [ -n "$current_frontend_version" ]; then
sed -i.bak "s|$current_frontend_version|ctwj/urldb-frontend:${new_version}|" docker-compose.yml
echo -e " ✅ 更新 frontend 镜像: ${current_frontend_version} -> ctwj/urldb-frontend:${new_version}"
fi
rm -f docker-compose.yml.bak
echo -e " ✅ 更新 docker-compose.yml"
echo -e " ✅ 更新 docker-compose.yml 完成"
fi
# 更新README中的版本信息

View File

@@ -1,173 +0,0 @@
// 测试新的AdminHeader样式是否与首页完全对齐
const testAdminHeaderStyle = async () => {
console.log('测试新的AdminHeader样式是否与首页完全对齐...')
// 测试前端页面AdminHeader
console.log('\n1. 测试前端页面AdminHeader:')
const adminPages = [
{ name: '管理后台', url: 'http://localhost:3000/admin' },
{ name: '用户管理', url: 'http://localhost:3000/users' },
{ name: '分类管理', url: 'http://localhost:3000/categories' },
{ name: '标签管理', url: 'http://localhost:3000/tags' },
{ name: '系统配置', url: 'http://localhost:3000/system-config' },
{ name: '资源管理', url: 'http://localhost:3000/resources' }
]
for (const page of adminPages) {
try {
const response = await fetch(page.url)
const html = await response.text()
console.log(`\n${page.name}页面:`)
console.log(`状态码: ${response.status}`)
// 检查是否包含AdminHeader组件
if (html.includes('AdminHeader')) {
console.log('✅ 包含AdminHeader组件')
} else {
console.log('❌ 未找到AdminHeader组件')
}
// 检查是否包含首页样式(深色背景)
if (html.includes('bg-slate-800') && html.includes('dark:bg-gray-800')) {
console.log('✅ 包含首页样式(深色背景)')
} else {
console.log('❌ 未找到首页样式')
}
// 检查是否包含首页标题样式
if (html.includes('text-2xl sm:text-3xl font-bold mb-4')) {
console.log('✅ 包含首页标题样式')
} else {
console.log('❌ 未找到首页标题样式')
}
// 检查是否包含n-button组件与首页一致
if (html.includes('n-button') && html.includes('size="tiny"') && html.includes('type="tertiary"')) {
console.log('✅ 包含n-button组件与首页一致')
} else {
console.log('❌ 未找到n-button组件')
}
// 检查是否包含右上角绝对定位的按钮
if (html.includes('absolute right-4 top-4')) {
console.log('✅ 包含右上角绝对定位的按钮')
} else {
console.log('❌ 未找到右上角绝对定位的按钮')
}
// 检查是否包含首页、添加、退出按钮
if (html.includes('fa-home') && html.includes('fa-plus') && html.includes('fa-sign-out-alt')) {
console.log('✅ 包含首页、添加、退出按钮')
} else {
console.log('❌ 未找到完整的按钮组')
}
// 检查是否包含用户信息
if (html.includes('欢迎') && html.includes('管理员')) {
console.log('✅ 包含用户信息')
} else {
console.log('❌ 未找到用户信息')
}
// 检查是否包含移动端适配
if (html.includes('sm:hidden') && html.includes('hidden sm:flex')) {
console.log('✅ 包含移动端适配')
} else {
console.log('❌ 未找到移动端适配')
}
// 检查是否不包含导航链接(除了首页和添加资源)
if (!html.includes('用户管理') && !html.includes('分类管理') && !html.includes('标签管理')) {
console.log('✅ 不包含导航链接(符合预期)')
} else {
console.log('❌ 包含导航链接(不符合预期)')
}
} catch (error) {
console.error(`${page.name}页面测试失败:`, error.message)
}
}
// 测试首页样式对比
console.log('\n2. 测试首页样式对比:')
try {
const response = await fetch('http://localhost:3000/')
const html = await response.text()
console.log('首页页面:')
console.log(`状态码: ${response.status}`)
// 检查首页是否包含相同的样式
if (html.includes('bg-slate-800') && html.includes('dark:bg-gray-800')) {
console.log('✅ 首页包含相同的深色背景样式')
} else {
console.log('❌ 首页不包含相同的深色背景样式')
}
// 检查首页是否包含相同的布局结构
if (html.includes('text-2xl sm:text-3xl font-bold mb-4')) {
console.log('✅ 首页包含相同的标题样式')
} else {
console.log('❌ 首页不包含相同的标题样式')
}
// 检查首页是否包含相同的n-button样式
if (html.includes('n-button') && html.includes('size="tiny"') && html.includes('type="tertiary"')) {
console.log('✅ 首页包含相同的n-button样式')
} else {
console.log('❌ 首页不包含相同的n-button样式')
}
// 检查首页是否包含相同的绝对定位
if (html.includes('absolute right-4 top-0')) {
console.log('✅ 首页包含相同的绝对定位')
} else {
console.log('❌ 首页不包含相同的绝对定位')
}
} catch (error) {
console.error('❌ 首页测试失败:', error.message)
}
// 测试系统配置API
console.log('\n3. 测试系统配置API:')
try {
const response = await fetch('http://localhost:8080/api/system-config')
const data = await response.json()
console.log('系统配置API响应:')
console.log(`状态: ${data.success ? '✅ 成功' : '❌ 失败'}`)
if (data.success) {
console.log(`网站标题: ${data.data?.site_title || 'N/A'}`)
console.log(`版权信息: ${data.data?.copyright || 'N/A'}`)
}
if (data.success) {
console.log('✅ 系统配置API测试通过')
} else {
console.log('❌ 系统配置API测试失败')
}
} catch (error) {
console.error('❌ 系统配置API测试失败:', error.message)
}
console.log('\n✅ AdminHeader样式测试完成')
console.log('\n总结:')
console.log('- ✅ AdminHeader样式与首页完全一致')
console.log('- ✅ 使用相同的深色背景和圆角设计')
console.log('- ✅ 使用相同的n-button组件样式')
console.log('- ✅ 按钮位于右上角绝对定位')
console.log('- ✅ 包含首页、添加、退出按钮')
console.log('- ✅ 包含用户信息和角色显示')
console.log('- ✅ 响应式设计,适配移动端')
console.log('- ✅ 移除了导航链接,只保留必要操作')
console.log('- ✅ 系统配置集成正常')
}
// 运行测试
testAdminHeaderStyle()

View File

@@ -1,188 +0,0 @@
// 测试AdminHeader组件和版本显示功能
const testAdminHeader = async () => {
console.log('测试AdminHeader组件和版本显示功能...')
const { exec } = require('child_process')
const { promisify } = require('util')
const execAsync = promisify(exec)
// 测试后端版本接口
console.log('\n1. 测试后端版本接口:')
try {
const { stdout: versionOutput } = await execAsync('curl -s http://localhost:8080/api/version')
const versionData = JSON.parse(versionOutput)
console.log('版本接口响应:')
console.log(`状态: ${versionData.success ? '✅ 成功' : '❌ 失败'}`)
console.log(`版本号: ${versionData.data.version}`)
console.log(`Git提交: ${versionData.data.git_commit}`)
console.log(`构建时间: ${versionData.data.build_time}`)
if (versionData.success) {
console.log('✅ 后端版本接口测试通过')
} else {
console.log('❌ 后端版本接口测试失败')
}
} catch (error) {
console.error('❌ 后端版本接口测试失败:', error.message)
}
// 测试版本字符串接口
console.log('\n2. 测试版本字符串接口:')
try {
const { stdout: versionStringOutput } = await execAsync('curl -s http://localhost:8080/api/version/string')
const versionStringData = JSON.parse(versionStringOutput)
console.log('版本字符串接口响应:')
console.log(`状态: ${versionStringData.success ? '✅ 成功' : '❌ 失败'}`)
console.log(`版本字符串: ${versionStringData.data.version}`)
if (versionStringData.success) {
console.log('✅ 版本字符串接口测试通过')
} else {
console.log('❌ 版本字符串接口测试失败')
}
} catch (error) {
console.error('❌ 版本字符串接口测试失败:', error.message)
}
// 测试完整版本信息接口
console.log('\n3. 测试完整版本信息接口:')
try {
const { stdout: fullVersionOutput } = await execAsync('curl -s http://localhost:8080/api/version/full')
const fullVersionData = JSON.parse(fullVersionOutput)
console.log('完整版本信息接口响应:')
console.log(`状态: ${fullVersionData.success ? '✅ 成功' : '❌ 失败'}`)
if (fullVersionData.success) {
console.log(`版本信息:`, JSON.stringify(fullVersionData.data.version_info, null, 2))
}
if (fullVersionData.success) {
console.log('✅ 完整版本信息接口测试通过')
} else {
console.log('❌ 完整版本信息接口测试失败')
}
} catch (error) {
console.error('❌ 完整版本信息接口测试失败:', error.message)
}
// 测试版本更新检查接口
console.log('\n4. 测试版本更新检查接口:')
try {
const { stdout: updateCheckOutput } = await execAsync('curl -s http://localhost:8080/api/version/check-update')
const updateCheckData = JSON.parse(updateCheckOutput)
console.log('版本更新检查接口响应:')
console.log(`状态: ${updateCheckData.success ? '✅ 成功' : '❌ 失败'}`)
if (updateCheckData.success) {
console.log(`当前版本: ${updateCheckData.data.current_version}`)
console.log(`最新版本: ${updateCheckData.data.latest_version}`)
console.log(`有更新: ${updateCheckData.data.has_update}`)
console.log(`下载链接: ${updateCheckData.data.download_url || 'N/A'}`)
}
if (updateCheckData.success) {
console.log('✅ 版本更新检查接口测试通过')
} else {
console.log('❌ 版本更新检查接口测试失败')
}
} catch (error) {
console.error('❌ 版本更新检查接口测试失败:', error.message)
}
// 测试前端页面
console.log('\n5. 测试前端页面:')
const testPages = [
{ name: '管理后台', url: 'http://localhost:3000/admin' },
{ name: '用户管理', url: 'http://localhost:3000/users' },
{ name: '分类管理', url: 'http://localhost:3000/categories' },
{ name: '标签管理', url: 'http://localhost:3000/tags' },
{ name: '系统配置', url: 'http://localhost:3000/system-config' },
{ name: '资源管理', url: 'http://localhost:3000/resources' }
]
for (const page of testPages) {
try {
const response = await fetch(page.url)
const html = await response.text()
console.log(`\n${page.name}页面:`)
console.log(`状态码: ${response.status}`)
// 检查是否包含AdminHeader组件
if (html.includes('AdminHeader') || html.includes('版本管理')) {
console.log('✅ 包含AdminHeader组件')
} else {
console.log('❌ 未找到AdminHeader组件')
}
// 检查是否包含版本信息
if (html.includes('版本') || html.includes('version')) {
console.log('✅ 包含版本信息')
} else {
console.log('❌ 未找到版本信息')
}
} catch (error) {
console.error(`${page.name}页面测试失败:`, error.message)
}
}
// 测试版本管理脚本
console.log('\n6. 测试版本管理脚本:')
try {
const { stdout: scriptHelp } = await execAsync('./scripts/version.sh help')
console.log('版本管理脚本帮助信息:')
console.log(scriptHelp)
const { stdout: scriptShow } = await execAsync('./scripts/version.sh show')
console.log('当前版本信息:')
console.log(scriptShow)
console.log('✅ 版本管理脚本测试通过')
} catch (error) {
console.error('❌ 版本管理脚本测试失败:', error.message)
}
// 测试Git标签
console.log('\n7. 测试Git标签:')
try {
const { stdout: tagOutput } = await execAsync('git tag -l')
console.log('当前Git标签:')
console.log(tagOutput || '暂无标签')
const { stdout: logOutput } = await execAsync('git log --oneline -3')
console.log('最近3次提交:')
console.log(logOutput)
console.log('✅ Git标签测试通过')
} catch (error) {
console.error('❌ Git标签测试失败:', error.message)
}
console.log('\n✅ AdminHeader组件和版本显示功能测试完成')
console.log('\n总结:')
console.log('- ✅ 后端版本接口正常工作')
console.log('- ✅ 前端AdminHeader组件已集成')
console.log('- ✅ 版本信息在管理页面右下角显示')
console.log('- ✅ 首页已移除版本显示')
console.log('- ✅ 版本管理脚本功能完整')
console.log('- ✅ Git标签管理正常')
}
// 运行测试
testAdminHeader()

View File

@@ -1,155 +0,0 @@
// 测试admin layout功能
const testAdminLayout = async () => {
console.log('测试admin layout功能...')
// 测试前端页面admin layout
console.log('\n1. 测试前端页面admin layout:')
const adminPages = [
{ name: '管理后台', url: 'http://localhost:3000/admin' },
{ name: '用户管理', url: 'http://localhost:3000/users' },
{ name: '分类管理', url: 'http://localhost:3000/categories' },
{ name: '标签管理', url: 'http://localhost:3000/tags' },
{ name: '系统配置', url: 'http://localhost:3000/system-config' },
{ name: '资源管理', url: 'http://localhost:3000/resources' }
]
for (const page of adminPages) {
try {
const response = await fetch(page.url)
const html = await response.text()
console.log(`\n${page.name}页面:`)
console.log(`状态码: ${response.status}`)
// 检查是否包含AdminHeader组件
if (html.includes('AdminHeader')) {
console.log('✅ 包含AdminHeader组件')
} else {
console.log('❌ 未找到AdminHeader组件')
}
// 检查是否包含AppFooter组件
if (html.includes('AppFooter')) {
console.log('✅ 包含AppFooter组件')
} else {
console.log('❌ 未找到AppFooter组件')
}
// 检查是否包含admin layout的样式
if (html.includes('bg-gray-50 dark:bg-gray-900')) {
console.log('✅ 包含admin layout样式')
} else {
console.log('❌ 未找到admin layout样式')
}
// 检查是否包含页面加载状态
if (html.includes('正在加载') || html.includes('初始化管理后台')) {
console.log('✅ 包含页面加载状态')
} else {
console.log('❌ 未找到页面加载状态')
}
// 检查是否包含max-w-7xl mx-auto容器
if (html.includes('max-w-7xl mx-auto')) {
console.log('✅ 包含标准容器布局')
} else {
console.log('❌ 未找到标准容器布局')
}
// 检查是否不包含重复的布局代码
const adminHeaderCount = (html.match(/AdminHeader/g) || []).length
if (adminHeaderCount === 1) {
console.log('✅ AdminHeader组件只出现一次无重复')
} else {
console.log(`❌ AdminHeader组件出现${adminHeaderCount}次(可能有重复)`)
}
} catch (error) {
console.error(`${page.name}页面测试失败:`, error.message)
}
}
// 测试admin layout文件是否存在
console.log('\n2. 测试admin layout文件:')
try {
const response = await fetch('http://localhost:3000/layouts/admin.vue')
console.log('admin layout文件状态:', response.status)
if (response.status === 200) {
console.log('✅ admin layout文件存在')
} else {
console.log('❌ admin layout文件不存在或无法访问')
}
} catch (error) {
console.error('❌ admin layout文件测试失败:', error.message)
}
// 测试definePageMeta是否正确设置
console.log('\n3. 测试definePageMeta设置:')
const pagesWithLayout = [
{ name: '管理后台', file: 'web/pages/admin.vue' },
{ name: '用户管理', file: 'web/pages/users.vue' },
{ name: '分类管理', file: 'web/pages/categories.vue' }
]
for (const page of pagesWithLayout) {
try {
const fs = require('fs')
const content = fs.readFileSync(page.file, 'utf8')
if (content.includes("definePageMeta({") && content.includes("layout: 'admin'")) {
console.log(`${page.name}页面正确设置了admin layout`)
} else {
console.log(`${page.name}页面未正确设置admin layout`)
}
} catch (error) {
console.error(`${page.name}页面文件读取失败:`, error.message)
}
}
// 测试首页不使用admin layout
console.log('\n4. 测试首页不使用admin layout:')
try {
const response = await fetch('http://localhost:3000/')
const html = await response.text()
console.log('首页页面:')
console.log(`状态码: ${response.status}`)
// 检查首页是否不包含AdminHeader
if (!html.includes('AdminHeader')) {
console.log('✅ 首页不包含AdminHeader符合预期')
} else {
console.log('❌ 首页包含AdminHeader不符合预期')
}
// 检查首页是否使用默认layout
if (html.includes('bg-gray-50 dark:bg-gray-900') && html.includes('AppFooter')) {
console.log('✅ 首页使用默认layout')
} else {
console.log('❌ 首页可能使用了错误的layout')
}
} catch (error) {
console.error('❌ 首页测试失败:', error.message)
}
console.log('\n✅ admin layout测试完成')
console.log('\n总结:')
console.log('- ✅ 创建了admin layout文件')
console.log('- ✅ 管理页面使用admin layout')
console.log('- ✅ 移除了重复的布局代码')
console.log('- ✅ 统一了管理页面的样式和结构')
console.log('- ✅ 首页继续使用默认layout')
console.log('- ✅ 页面加载状态和错误处理统一')
console.log('- ✅ 响应式设计和容器布局统一')
}
// 运行测试
testAdminLayout()

View File

@@ -1,140 +0,0 @@
// 测试Footer中的版本信息显示
const testFooterVersion = async () => {
console.log('测试Footer中的版本信息显示...')
const { exec } = require('child_process')
const { promisify } = require('util')
const execAsync = promisify(exec)
// 测试后端版本接口
console.log('\n1. 测试后端版本接口:')
try {
const { stdout: versionOutput } = await execAsync('curl -s http://localhost:8080/api/version')
const versionData = JSON.parse(versionOutput)
console.log('版本接口响应:')
console.log(`状态: ${versionData.success ? '✅ 成功' : '❌ 失败'}`)
console.log(`版本号: ${versionData.data.version}`)
console.log(`Git提交: ${versionData.data.git_commit}`)
console.log(`构建时间: ${versionData.data.build_time}`)
if (versionData.success) {
console.log('✅ 后端版本接口测试通过')
} else {
console.log('❌ 后端版本接口测试失败')
}
} catch (error) {
console.error('❌ 后端版本接口测试失败:', error.message)
}
// 测试前端页面Footer
console.log('\n2. 测试前端页面Footer:')
const testPages = [
{ name: '首页', url: 'http://localhost:3000/' },
{ name: '热播剧', url: 'http://localhost:3000/hot-dramas' },
{ name: '系统监控', url: 'http://localhost:3000/monitor' },
{ name: 'API文档', url: 'http://localhost:3000/api-docs' }
]
for (const page of testPages) {
try {
const response = await fetch(page.url)
const html = await response.text()
console.log(`\n${page.name}页面:`)
console.log(`状态码: ${response.status}`)
// 检查是否包含AppFooter组件
if (html.includes('AppFooter')) {
console.log('✅ 包含AppFooter组件')
} else {
console.log('❌ 未找到AppFooter组件')
}
// 检查是否包含版本信息
if (html.includes('v1.0.0') || html.includes('version')) {
console.log('✅ 包含版本信息')
} else {
console.log('❌ 未找到版本信息')
}
// 检查是否包含版权信息
if (html.includes('© 2025') || html.includes('网盘资源数据库')) {
console.log('✅ 包含版权信息')
} else {
console.log('❌ 未找到版权信息')
}
} catch (error) {
console.error(`${page.name}页面测试失败:`, error.message)
}
}
// 测试管理页面(应该没有版本信息)
console.log('\n3. 测试管理页面(应该没有版本信息):')
const adminPages = [
{ name: '管理后台', url: 'http://localhost:3000/admin' },
{ name: '用户管理', url: 'http://localhost:3000/users' },
{ name: '分类管理', url: 'http://localhost:3000/categories' },
{ name: '标签管理', url: 'http://localhost:3000/tags' },
{ name: '系统配置', url: 'http://localhost:3000/system-config' },
{ name: '资源管理', url: 'http://localhost:3000/resources' }
]
for (const page of adminPages) {
try {
const response = await fetch(page.url)
const html = await response.text()
console.log(`\n${page.name}页面:`)
console.log(`状态码: ${response.status}`)
// 检查是否包含AdminHeader组件
if (html.includes('AdminHeader')) {
console.log('✅ 包含AdminHeader组件')
} else {
console.log('❌ 未找到AdminHeader组件')
}
// 检查是否不包含版本信息(管理页面应该没有版本显示)
if (!html.includes('v1.0.0') && !html.includes('version')) {
console.log('✅ 不包含版本信息(符合预期)')
} else {
console.log('❌ 包含版本信息(不符合预期)')
}
} catch (error) {
console.error(`${page.name}页面测试失败:`, error.message)
}
}
// 测试版本管理脚本
console.log('\n4. 测试版本管理脚本:')
try {
const { stdout: scriptShow } = await execAsync('./scripts/version.sh show')
console.log('当前版本信息:')
console.log(scriptShow)
console.log('✅ 版本管理脚本测试通过')
} catch (error) {
console.error('❌ 版本管理脚本测试失败:', error.message)
}
console.log('\n✅ Footer版本信息显示测试完成')
console.log('\n总结:')
console.log('- ✅ 后端版本接口正常工作')
console.log('- ✅ 前端AppFooter组件已集成')
console.log('- ✅ 版本信息在Footer中显示')
console.log('- ✅ 管理页面已移除版本显示')
console.log('- ✅ 版本信息显示格式:版权信息 | v版本号')
console.log('- ✅ 版本管理脚本功能完整')
}
// 运行测试
testFooterVersion()

View File

@@ -1,123 +0,0 @@
// 测试GitHub版本系统
const testGitHubVersion = async () => {
console.log('测试GitHub版本系统...')
const { exec } = require('child_process')
const { promisify } = require('util')
const execAsync = promisify(exec)
// 测试版本管理脚本
console.log('\n1. 测试版本管理脚本:')
try {
// 显示版本信息
const { stdout: showOutput } = await execAsync('./scripts/version.sh show')
console.log('版本信息:')
console.log(showOutput)
// 显示帮助信息
const { stdout: helpOutput } = await execAsync('./scripts/version.sh help')
console.log('帮助信息:')
console.log(helpOutput)
console.log('✅ 版本管理脚本测试通过')
} catch (error) {
console.error('❌ 版本管理脚本测试失败:', error.message)
}
// 测试版本API接口
console.log('\n2. 测试版本API接口:')
const baseUrl = 'http://localhost:8080'
const testEndpoints = [
'/api/version',
'/api/version/string',
'/api/version/full',
'/api/version/check-update'
]
for (const endpoint of testEndpoints) {
try {
const response = await fetch(`${baseUrl}${endpoint}`)
const data = await response.json()
console.log(`\n接口: ${endpoint}`)
console.log(`状态码: ${response.status}`)
console.log(`响应:`, JSON.stringify(data, null, 2))
if (data.success) {
console.log('✅ 接口测试通过')
} else {
console.log('❌ 接口测试失败')
}
} catch (error) {
console.error(`❌ 接口 ${endpoint} 测试失败:`, error.message)
}
}
// 测试GitHub版本检查
console.log('\n3. 测试GitHub版本检查:')
try {
const response = await fetch('https://api.github.com/repos/ctwj/urldb/releases/latest')
const data = await response.json()
console.log('GitHub API响应:')
console.log(`状态码: ${response.status}`)
console.log(`最新版本: ${data.tag_name || 'N/A'}`)
console.log(`发布日期: ${data.published_at || 'N/A'}`)
if (data.tag_name) {
console.log('✅ GitHub版本检查测试通过')
} else {
console.log('⚠️ GitHub上暂无Release')
}
} catch (error) {
console.error('❌ GitHub版本检查测试失败:', error.message)
}
// 测试前端版本页面
console.log('\n4. 测试前端版本页面:')
try {
const response = await fetch('http://localhost:3000/version')
const html = await response.text()
console.log(`状态码: ${response.status}`)
if (html.includes('版本信息') && html.includes('VersionInfo')) {
console.log('✅ 前端版本页面测试通过')
} else {
console.log('❌ 前端版本页面测试失败')
}
} catch (error) {
console.error('❌ 前端版本页面测试失败:', error.message)
}
// 测试Git标签
console.log('\n5. 测试Git标签:')
try {
const { stdout: tagOutput } = await execAsync('git tag -l')
console.log('当前Git标签:')
console.log(tagOutput || '暂无标签')
const { stdout: logOutput } = await execAsync('git log --oneline -5')
console.log('最近5次提交:')
console.log(logOutput)
console.log('✅ Git标签测试通过')
} catch (error) {
console.error('❌ Git标签测试失败:', error.message)
}
console.log('\n✅ GitHub版本系统测试完成')
}
// 运行测试
testGitHubVersion()

View File

@@ -1,83 +0,0 @@
// 测试版本系统
const testVersionSystem = async () => {
console.log('测试版本系统...')
const baseUrl = 'http://localhost:8080'
// 测试版本API接口
const testEndpoints = [
'/api/version',
'/api/version/string',
'/api/version/full',
'/api/version/check-update'
]
for (const endpoint of testEndpoints) {
console.log(`\n测试接口: ${endpoint}`)
try {
const response = await fetch(`${baseUrl}${endpoint}`)
const data = await response.json()
console.log(`状态码: ${response.status}`)
console.log(`响应:`, JSON.stringify(data, null, 2))
if (data.success) {
console.log('✅ 接口测试通过')
} else {
console.log('❌ 接口测试失败')
}
} catch (error) {
console.error(`❌ 请求失败:`, error.message)
}
}
// 测试版本管理脚本
console.log('\n测试版本管理脚本...')
const { exec } = require('child_process')
const { promisify } = require('util')
const execAsync = promisify(exec)
try {
// 显示版本信息
const { stdout: showOutput } = await execAsync('./scripts/version.sh show')
console.log('版本信息:')
console.log(showOutput)
// 生成版本信息文件
const { stdout: updateOutput } = await execAsync('./scripts/version.sh update')
console.log('生成版本信息文件:')
console.log(updateOutput)
console.log('✅ 版本管理脚本测试通过')
} catch (error) {
console.error('❌ 版本管理脚本测试失败:', error.message)
}
// 测试前端版本页面
console.log('\n测试前端版本页面...')
try {
const response = await fetch('http://localhost:3000/version')
const html = await response.text()
console.log(`状态码: ${response.status}`)
if (html.includes('版本信息') && html.includes('VersionInfo')) {
console.log('✅ 前端版本页面测试通过')
} else {
console.log('❌ 前端版本页面测试失败')
}
} catch (error) {
console.error('❌ 前端版本页面测试失败:', error.message)
}
console.log('\n✅ 版本系统测试完成')
}
// 运行测试
testVersionSystem()

4
web/components.d.ts vendored
View File

@@ -8,9 +8,13 @@ export {}
/* prettier-ignore */
declare module 'vue' {
export interface GlobalComponents {
NA: typeof import('naive-ui')['NA']
NAlert: typeof import('naive-ui')['NAlert']
NButton: typeof import('naive-ui')['NButton']
NIcon: typeof import('naive-ui')['NIcon']
NSelect: typeof import('naive-ui')['NSelect']
NTabPane: typeof import('naive-ui')['NTabPane']
NTabs: typeof import('naive-ui')['NTabs']
RouterLink: typeof import('vue-router')['RouterLink']
RouterView: typeof import('vue-router')['RouterView']
}

View File

@@ -4,7 +4,7 @@
<div class="mb-4">
<h1 class="text-2xl sm:text-3xl font-bold mb-2">
<NuxtLink to="/" class="text-white hover:text-gray-200 dark:hover:text-gray-300 no-underline">
{{ systemConfig?.site_title || '网盘资源数据库' }}
{{ systemConfig?.site_title || '老九网盘资源数据库' }}
</NuxtLink>
</h1>
<!-- 面包屑导航 -->
@@ -59,6 +59,19 @@
<span>欢迎{{ userStore.user?.username || '管理员' }}</span>
<span class="ml-2 px-2 py-1 bg-blue-600/80 rounded text-xs text-white">{{ userStore.user?.role || 'admin' }}</span>
</div>
<!-- 自动转存状态提示 -->
<div
v-if="systemConfig?.auto_transfer_enabled"
class="absolute right-4 bottom-4 flex items-center gap-2 rounded-lg px-3 py-2"
>
<div class="flex items-center gap-2">
<div class="w-2 h-2 bg-green-400 rounded-full animate-pulse"></div>
<span class="text-xs text-white font-medium">
自动转存已开启
</span>
</div>
</div>
</div>
</template>
@@ -106,7 +119,7 @@ const { data: systemConfigData } = await useAsyncData('systemConfig',
() => $fetch('/api/system-config')
)
const systemConfig = computed(() => (systemConfigData.value as any)?.data || { site_title: '网盘资源数据库' })
const systemConfig = computed(() => (systemConfigData.value as any)?.data || { site_title: '老九网盘资源数据库' })
// 退出登录
const logout = async () => {

View File

@@ -3,8 +3,16 @@
<div class="max-w-7xl mx-auto text-center text-gray-600 dark:text-gray-400 text-sm px-3 sm:px-5">
<p class="mb-2">本站内容由网络爬虫自动抓取本站不储存复制传播任何文件仅作个人公益学习请在获取后24小内删除!!!</p>
<p class="flex items-center justify-center gap-2">
<span>{{ systemConfig?.copyright || '© 2025 网盘资源数据库 By 老九' }}</span>
<span v-if="versionInfo.version" class="text-gray-400 dark:text-gray-500">| v{{ versionInfo.version }}</span>
<span>{{ systemConfig?.copyright || '© 2025 老九网盘资源数据库 By 老九' }}</span>
<span v-if="versionInfo.version" class="text-gray-400 dark:text-gray-500">| v <n-a
href="https://github.com/ctwj/urldb"
target="_blank"
rel="noopener noreferrer"
referrerpolicy="no-referrer"
aria-label=" GitHub 上查看版本信息"
class="github-link"
><span>{{ versionInfo.version }}</span></n-a>
</span>
</p>
</div>
</footer>
@@ -12,12 +20,17 @@
<script setup lang="ts">
// 使用版本信息组合式函数
const { versionInfo } = useVersion()
const { versionInfo, fetchVersionInfo } = useVersion()
// 获取系统配置
const { data: systemConfigData } = await useAsyncData('systemConfig',
() => $fetch('/api/system-config')
)
const systemConfig = computed(() => (systemConfigData.value as any)?.data || { copyright: '© 2025 网盘资源数据库 By 老九' })
const systemConfig = computed(() => (systemConfigData.value as any)?.data || { copyright: '© 2025 老九网盘资源数据库 By 老九' })
// 组件挂载时获取版本信息
onMounted(() => {
fetchVersionInfo()
})
</script>

View File

@@ -40,16 +40,16 @@ export const useSeo = () => {
if (systemConfig.value?.site_title) {
return `${systemConfig.value.site_title} - ${pageTitle}`
}
return `${pageTitle} - 网盘资源数据库`
return `${pageTitle} - 老九网盘资源数据库`
}
// 生成页面元数据
const generateMeta = (customMeta?: Record<string, string>) => {
const defaultMeta = {
description: systemConfig.value?.site_description || '专业的网盘资源数据库',
description: systemConfig.value?.site_description || '专业的老九网盘资源数据库',
keywords: systemConfig.value?.keywords || '网盘,资源管理,文件分享',
author: systemConfig.value?.author || '系统管理员',
copyright: systemConfig.value?.copyright || '© 2024 网盘资源数据库'
copyright: systemConfig.value?.copyright || '© 2024 老九网盘资源数据库'
}
return {

View File

@@ -18,7 +18,7 @@ interface VersionResponse {
export const useVersion = () => {
const versionInfo = ref<VersionInfo>({
version: '1.0.0',
version: '1.0.6',
build_time: '',
git_commit: 'unknown',
git_branch: 'unknown',

View File

@@ -38,11 +38,11 @@ export default defineNuxtConfig({
],
app: {
head: {
title: '开源网盘资源数据库',
title: '老九网盘资源数据库',
meta: [
{ charset: 'utf-8' },
{ name: 'viewport', content: 'width=device-width, initial-scale=1' },
{ name: 'description', content: '开源网盘资源数据库 - 一个现代化的资源管理系统' }
{ name: 'description', content: '老九网盘资源管理数据庫,现代化的网盘资源数据库,支持多网盘自动化转存分享,支持百度网盘,阿里云盘,夸克网盘, 天翼云盘迅雷云盘123云盘115网盘UC网盘' }
],
link: [
{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }

View File

@@ -1,6 +1,6 @@
{
"name": "res-db-web",
"version": "1.0.1",
"version": "1.0.6",
"private": true,
"type": "module",
"scripts": {

View File

@@ -133,7 +133,7 @@ const handleCancel = () => {
// 设置页面标题
useHead({
title: '添加资源 - 网盘资源数据库'
title: '添加资源 - 老九网盘资源数据库'
})
</script>

View File

@@ -232,7 +232,7 @@ const getAuthHeaders = () => {
// 页面元数据
useHead({
title: '分类管理 - 网盘资源数据库',
title: '分类管理 - 老九网盘资源数据库',
meta: [
{ name: 'description', content: '管理网盘资源分类' },
{ name: 'keywords', content: '分类管理,资源管理' }

View File

@@ -42,7 +42,7 @@
<div class="space-y-2">
<div class="flex flex-wrap gap-1 w-full text-left rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors cursor-pointer">
<div v-for="pan in pans" :key="pan.id" class="h-6 px-1 rounded-full bg-gray-100 dark:bg-gray-700 flex items-center justify-center">
<span v-html="pan.icon"></span> {{ pan.name }}
<span v-html="pan.icon"></span>&nbsp;{{ pan.name }}
</div>
</div>
</div>

View File

@@ -597,7 +597,7 @@ onMounted(async () => {
// 设置页面标题
useHead({
title: '待处理资源管理 - 网盘资源数据库'
title: '待处理资源管理 - 老九网盘资源数据库'
})
</script>

View File

@@ -18,14 +18,10 @@
<!-- 配置表单 -->
<div class="bg-white dark:bg-gray-800 rounded-lg shadow p-6">
<form @submit.prevent="saveConfig" class="space-y-6">
<!-- SEO 配置 -->
<div class="border-b border-gray-200 dark:border-gray-700 pb-6">
<h2 class="text-xl font-semibold text-gray-900 dark:text-white mb-4 flex items-center gap-2">
<i class="fas fa-search text-blue-600"></i>
SEO 配置
</h2>
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
<n-tabs type="line" animated>
<n-tab-pane name="SEO 配置" tab="seo">
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
<!-- 网站标题 -->
<div>
<label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">
@@ -36,7 +32,7 @@
type="text"
required
class="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 dark:bg-gray-700 dark:text-white"
placeholder="网盘资源数据库"
placeholder="老九网盘资源数据库"
/>
</div>
@@ -49,7 +45,7 @@
v-model="config.siteDescription"
type="text"
class="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 dark:bg-gray-700 dark:text-white"
placeholder="专业的网盘资源数据库"
placeholder="专业的老九网盘资源数据库"
/>
</div>
@@ -88,20 +84,13 @@
v-model="config.copyright"
type="text"
class="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 dark:bg-gray-700 dark:text-white"
placeholder="© 2024 网盘资源数据库"
placeholder="© 2024 老九网盘资源数据库"
/>
</div>
</div>
</div>
<!-- 自动处理配置 -->
<div class="border-b border-gray-200 dark:border-gray-700 pb-6">
<h2 class="text-xl font-semibold text-gray-900 dark:text-white mb-4 flex items-center gap-2">
<i class="fas fa-cogs text-green-600"></i>
自动处理配置
</h2>
<div class="space-y-4">
</n-tab-pane>
<n-tab-pane name="自动处理配置" tab="自动处理配置">
<div class="space-y-4">
<!-- 待处理资源自动处理 -->
<div class="flex items-center justify-between p-4 bg-gray-50 dark:bg-gray-700 rounded-lg">
<div class="flex-1">
@@ -225,16 +214,9 @@
</p>
</div>
</div>
</div>
<!-- 其他配置 -->
<div>
<h2 class="text-xl font-semibold text-gray-900 dark:text-white mb-4 flex items-center gap-2">
<i class="fas fa-info-circle text-purple-600"></i>
其他配置
</h2>
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
</n-tab-pane>
<n-tab-pane name="其他配置" tab="其他配置">
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
<!-- 每页显示数量 -->
<div>
<label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">
@@ -273,16 +255,9 @@
</div>
</div>
</div>
</div>
<!-- API配置 -->
<div class="border-b border-gray-200 dark:border-gray-700 pb-6">
<h2 class="text-xl font-semibold text-gray-900 dark:text-white mb-4 flex items-center gap-2">
<i class="fas fa-key text-orange-600"></i>
API 配置
</h2>
<div class="space-y-4">
</n-tab-pane>
<n-tab-pane name="API配置" tab="API配置">
<div class="space-y-4">
<!-- API Token -->
<div>
<label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">
@@ -324,7 +299,8 @@
</div>
</div>
</div>
</div>
</n-tab-pane>
</n-tabs>
<!-- 保存按钮 -->
<div class="flex justify-end space-x-4 pt-6">
@@ -366,11 +342,11 @@ const { getSystemConfig, updateSystemConfig } = useSystemConfigApi()
const loading = ref(false)
const config = ref({
// SEO 配置
siteTitle: '网盘资源数据库',
siteDescription: '专业的网盘资源数据库',
siteTitle: '老九网盘资源数据库',
siteDescription: '专业的老九网盘资源数据库',
keywords: '网盘,资源管理,文件分享',
author: '系统管理员',
copyright: '© 2024 网盘资源数据库',
copyright: '© 2024 老九网盘资源数据库',
// 自动处理配置
autoProcessReadyResources: false,
@@ -391,7 +367,7 @@ const systemConfig = ref(null)
// 页面元数据 - 移到变量声明之后
useHead({
title: () => systemConfig.value?.site_title ? `${systemConfig.value.site_title} - 系统配置` : '系统配置 - 网盘资源数据库',
title: () => systemConfig.value?.site_title ? `${systemConfig.value.site_title} - 系统配置` : '系统配置 - 老九网盘资源数据库',
meta: [
{
name: 'description',
@@ -418,11 +394,11 @@ const loadConfig = async () => {
// 使用新的统一响应格式直接使用response
if (response) {
config.value = {
siteTitle: response.site_title || '网盘资源数据库',
siteDescription: response.site_description || '专业的网盘资源数据库',
siteTitle: response.site_title || '老九网盘资源数据库',
siteDescription: response.site_description || '专业的老九网盘资源数据库',
keywords: response.keywords || '网盘,资源管理,文件分享',
author: response.author || '系统管理员',
copyright: response.copyright || '© 2024 网盘资源数据库',
copyright: response.copyright || '© 2024 老九网盘资源数据库',
autoProcessReadyResources: response.auto_process_ready_resources || false,
autoProcessInterval: response.auto_process_interval || 30,
autoTransferEnabled: response.auto_transfer_enabled || false, // 新增

View File

@@ -15,6 +15,7 @@
<div class="">
<div class="max-w-7xl mx-auto">
<n-alert class="mb-4" title="提交的数据中,如果包含标签,数据添加成功,会自动添加标签" type="info" />
<!-- 操作按钮 -->
<div class="flex justify-between items-center mb-4">
@@ -311,7 +312,7 @@ const getAuthHeaders = () => {
// 页面元数据
useHead({
title: '标签管理 - 网盘资源数据库',
title: '标签管理 - 老九网盘资源数据库',
meta: [
{ name: 'description', content: '管理网盘资源标签' },
{ name: 'keywords', content: '标签管理,资源管理' }

View File

@@ -15,70 +15,6 @@
<!-- 版本信息组件 -->
<VersionInfo />
<!-- 版本历史 -->
<div class="mt-8 bg-white dark:bg-gray-800 rounded-lg shadow-md p-6">
<h3 class="text-lg font-semibold text-gray-900 dark:text-white mb-4">
<i class="fas fa-history mr-2 text-green-500"></i>
版本历史
</h3>
<div class="space-y-4">
<div v-for="(version, index) in versionHistory" :key="index"
class="border-l-4 border-blue-500 pl-4 py-2">
<div class="flex items-center justify-between">
<div>
<h4 class="font-medium text-gray-900 dark:text-white">
v{{ version.version }}
</h4>
<p class="text-sm text-gray-600 dark:text-gray-400 mt-1">
{{ version.date }}
</p>
</div>
<span class="px-2 py-1 text-xs rounded-full"
:class="getVersionTypeClass(version.type)">
{{ version.type }}
</span>
</div>
<ul class="mt-2 space-y-1">
<li v-for="(change, changeIndex) in version.changes" :key="changeIndex"
class="text-sm text-gray-600 dark:text-gray-400 flex items-start">
<span class="mr-2 mt-1" :class="getChangeTypeClass(change.type)">
{{ getChangeTypeIcon(change.type) }}
</span>
{{ change.description }}
</li>
</ul>
</div>
</div>
</div>
<!-- 构建信息 -->
<div class="mt-8 bg-white dark:bg-gray-800 rounded-lg shadow-md p-6">
<h3 class="text-lg font-semibold text-gray-900 dark:text-white mb-4">
<i class="fas fa-cogs mr-2 text-purple-500"></i>
构建信息
</h3>
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
<div class="p-3 bg-gray-50 dark:bg-gray-700 rounded">
<span class="text-sm text-gray-600 dark:text-gray-400">构建环境</span>
<p class="font-mono text-gray-900 dark:text-white">Go 1.23.0</p>
</div>
<div class="p-3 bg-gray-50 dark:bg-gray-700 rounded">
<span class="text-sm text-gray-600 dark:text-gray-400">前端框架</span>
<p class="font-mono text-gray-900 dark:text-white">Nuxt.js 3.8.0</p>
</div>
<div class="p-3 bg-gray-50 dark:bg-gray-700 rounded">
<span class="text-sm text-gray-600 dark:text-gray-400">数据库</span>
<p class="font-mono text-gray-900 dark:text-white">PostgreSQL 15+</p>
</div>
<div class="p-3 bg-gray-50 dark:bg-gray-700 rounded">
<span class="text-sm text-gray-600 dark:text-gray-400">部署方式</span>
<p class="font-mono text-gray-900 dark:text-white">Docker</p>
</div>
</div>
</div>
</div>
</div>
</div>
@@ -92,7 +28,7 @@ definePageMeta({
// 页面元数据
useHead({
title: '版本信息 - 网盘资源数据库',
title: '版本信息 - 老九网盘资源数据库',
meta: [
{ name: 'description', content: '查看系统版本信息和更新状态' }
]

View File

@@ -7,7 +7,7 @@
<div class="bg-slate-800 dark:bg-gray-800 text-white dark:text-gray-100 rounded-lg shadow-lg p-4 sm:p-8 mb-4 sm:mb-8 text-center relative">
<h1 class="text-2xl sm:text-3xl font-bold mb-4">
<a href="/" class="text-white hover:text-gray-200 dark:hover:text-gray-300 no-underline">
网盘资源数据库 - API文档
老九网盘资源数据库 - API文档
</a>
</h1>
<p class="text-gray-300 max-w-2xl mx-auto">公开API接口文档支持资源添加搜索和热门剧获取等功能</p>
@@ -354,14 +354,14 @@ curl -X GET "http://localhost:8080/api/public/hot-dramas?page=1&page_size=5" \
<script setup>
// 设置页面布局
definePageMeta({
layout: 'admin'
layout: 'default'
})
// 页面元数据
useHead({
title: 'API文档 - 网盘资源数据库',
title: 'API文档 - 老九网盘资源数据库',
meta: [
{ name: 'description', content: '网盘资源数据库的公开API接口文档' },
{ name: 'description', content: '老九网盘资源数据库的公开API接口文档' },
{ name: 'keywords', content: 'API,接口文档,网盘资源管理' }
]
})

View File

@@ -205,7 +205,7 @@
<script setup>
// 设置页面布局
definePageMeta({
layout: 'admin'
layout: 'default'
})
import { ref, computed, onMounted, watch } from 'vue'

View File

@@ -20,7 +20,7 @@
<div class="bg-slate-800 dark:bg-gray-800 text-white dark:text-gray-100 rounded-lg shadow-lg p-4 sm:p-8 mb-4 sm:mb-8 text-center relative">
<h1 class="text-2xl sm:text-3xl font-bold mb-4">
<a href="/" class="text-white hover:text-gray-200 dark:hover:text-gray-300 no-underline">
{{ systemConfig?.site_title || '网盘资源数据库' }}
{{ systemConfig?.site_title || '老九网盘资源数据库' }}
</a>
</h1>
@@ -240,9 +240,9 @@
<script setup lang="ts">
// 页面元数据
useHead({
title: '网盘资源数据库 - 首页',
title: '老九网盘资源数据库 - 首页',
meta: [
{ name: 'description', content: '网盘资源数据库 - 一个现代化的资源管理系统' },
{ name: 'description', content: '老九网盘资源管理系统, 一个现代化的网盘资源数据库,支持多网盘自动化转存分享,支持百度网盘,阿里云盘,夸克网盘, 天翼云盘迅雷云盘123云盘115网盘UC网盘' },
{ name: 'keywords', content: '网盘资源,资源管理,数据库' }
]
})
@@ -307,7 +307,7 @@ const total = (resourcesData.value as any)?.data?.total as number
const safeResources = computed(() => (resourcesData.value as any)?.data?.resources || [])
const safeStats = computed(() => (statsData.value as any)?.data || { total_resources: 0, total_categories: 0, total_tags: 0, total_views: 0, today_updates: 0 })
const platforms = computed(() => panList || [])
const systemConfig = computed(() => sysConfig || { site_title: '网盘资源数据库' })
const systemConfig = computed(() => sysConfig || { site_title: '老九网盘资源数据库' })
const safeLoading = computed(() => pending.value)
// 计算属性

View File

@@ -155,7 +155,7 @@ const handleLogin = async () => {
// 设置页面标题
useHead({
title: '管理员登录 - 网盘资源数据库'
title: '管理员登录 - 老九网盘资源数据库'
})
</script>

View File

@@ -241,7 +241,7 @@
<script setup lang="ts">
// 设置页面布局
definePageMeta({
layout: 'admin'
layout: 'default'
})
import { ref, onMounted, onUnmounted, computed } from 'vue'

View File

@@ -210,7 +210,7 @@ const handleRegister = async () => {
// 设置页面标题
useHead({
title: '用户注册 - 网盘资源数据库'
title: '用户注册 - 老九网盘资源数据库'
})
</script>

View File

@@ -15,11 +15,11 @@ export default defineEventHandler(async (event) => {
console.error('服务端获取系统配置失败:', error)
// 返回默认配置而不是抛出错误
return {
site_title: '网盘资源数据库',
site_title: '老九网盘资源数据库',
site_description: '一个现代化的资源管理系统',
keywords: '网盘资源,资源管理,数据库',
author: '老九',
copyright: '© 2025 网盘资源数据库'
copyright: '© 2025 老九网盘资源数据库'
}
}
})