mirror of
https://github.com/ctwj/urldb.git
synced 2025-11-26 03:44:55 +08:00
Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
72f7764e36 | ||
|
|
8ed7cbc181 | ||
|
|
51975ad408 | ||
|
|
1bb14e218e | ||
|
|
3646c371a4 | ||
|
|
687fc6062d | ||
|
|
505e508bca | ||
|
|
d481083140 | ||
|
|
c76298a10b | ||
|
|
2cb91072ba |
11
README.md
11
README.md
@@ -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 文档
|
||||
|
||||
@@ -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"`
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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 ""
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# 🚀 urlDB - 网盘资源数据库
|
||||
# 🚀 urlDB - 老九网盘资源数据库
|
||||
|
||||
> 一个现代化的网盘资源数据库,支持多网盘自动化转存分享,支持百度网盘,阿里云盘,夸克网盘, 天翼云盘,迅雷云盘,123云盘,115网盘,UC网盘
|
||||
> 一个现代化的老九网盘资源数据库,支持多网盘自动化转存分享,支持百度网盘,阿里云盘,夸克网盘, 天翼云盘,迅雷云盘,123云盘,115网盘,UC网盘
|
||||
|
||||
<div align="center">
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
## 概述
|
||||
|
||||
网盘资源数据库提供了一套完整的 RESTful API 接口,支持资源管理、搜索、热门剧获取等功能。所有 API 都需要进行认证,使用 API Token 进行身份验证。
|
||||
老九网盘资源数据库提供了一套完整的 RESTful API 接口,支持资源管理、搜索、热门剧获取等功能。所有 API 都需要进行认证,使用 API Token 进行身份验证。
|
||||
|
||||
## 基础信息
|
||||
|
||||
|
||||
@@ -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
|
||||
```
|
||||
|
||||
### 端口映射
|
||||
|
||||
@@ -23,7 +23,7 @@ docker compose up --build -d
|
||||
|
||||
启动成功后,您可以通过以下地址访问:
|
||||
|
||||
- **前端界面**: http://localhost:3000
|
||||
- **前端界面**: http://localhost:3030
|
||||
默认用户密码: admin/password
|
||||
|
||||
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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中的版本信息
|
||||
|
||||
@@ -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()
|
||||
@@ -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()
|
||||
@@ -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()
|
||||
@@ -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()
|
||||
@@ -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()
|
||||
@@ -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
4
web/components.d.ts
vendored
@@ -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']
|
||||
}
|
||||
|
||||
@@ -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 () => {
|
||||
|
||||
@@ -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>
|
||||
@@ -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 {
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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' }
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "res-db-web",
|
||||
"version": "1.0.1",
|
||||
"version": "1.0.6",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
|
||||
@@ -133,7 +133,7 @@ const handleCancel = () => {
|
||||
|
||||
// 设置页面标题
|
||||
useHead({
|
||||
title: '添加资源 - 网盘资源数据库'
|
||||
title: '添加资源 - 老九网盘资源数据库'
|
||||
})
|
||||
</script>
|
||||
|
||||
|
||||
@@ -232,7 +232,7 @@ const getAuthHeaders = () => {
|
||||
|
||||
// 页面元数据
|
||||
useHead({
|
||||
title: '分类管理 - 网盘资源数据库',
|
||||
title: '分类管理 - 老九网盘资源数据库',
|
||||
meta: [
|
||||
{ name: 'description', content: '管理网盘资源分类' },
|
||||
{ name: 'keywords', content: '分类管理,资源管理' }
|
||||
|
||||
@@ -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> {{ pan.name }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -597,7 +597,7 @@ onMounted(async () => {
|
||||
|
||||
// 设置页面标题
|
||||
useHead({
|
||||
title: '待处理资源管理 - 网盘资源数据库'
|
||||
title: '待处理资源管理 - 老九网盘资源数据库'
|
||||
})
|
||||
</script>
|
||||
|
||||
|
||||
@@ -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, // 新增
|
||||
|
||||
@@ -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: '标签管理,资源管理' }
|
||||
|
||||
@@ -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: '查看系统版本信息和更新状态' }
|
||||
]
|
||||
|
||||
@@ -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,接口文档,网盘资源管理' }
|
||||
]
|
||||
})
|
||||
|
||||
@@ -205,7 +205,7 @@
|
||||
<script setup>
|
||||
// 设置页面布局
|
||||
definePageMeta({
|
||||
layout: 'admin'
|
||||
layout: 'default'
|
||||
})
|
||||
|
||||
import { ref, computed, onMounted, watch } from 'vue'
|
||||
|
||||
@@ -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)
|
||||
|
||||
// 计算属性
|
||||
|
||||
@@ -155,7 +155,7 @@ const handleLogin = async () => {
|
||||
|
||||
// 设置页面标题
|
||||
useHead({
|
||||
title: '管理员登录 - 网盘资源数据库'
|
||||
title: '管理员登录 - 老九网盘资源数据库'
|
||||
})
|
||||
</script>
|
||||
|
||||
|
||||
@@ -241,7 +241,7 @@
|
||||
<script setup lang="ts">
|
||||
// 设置页面布局
|
||||
definePageMeta({
|
||||
layout: 'admin'
|
||||
layout: 'default'
|
||||
})
|
||||
|
||||
import { ref, onMounted, onUnmounted, computed } from 'vue'
|
||||
|
||||
@@ -210,7 +210,7 @@ const handleRegister = async () => {
|
||||
|
||||
// 设置页面标题
|
||||
useHead({
|
||||
title: '用户注册 - 网盘资源数据库'
|
||||
title: '用户注册 - 老九网盘资源数据库'
|
||||
})
|
||||
</script>
|
||||
|
||||
|
||||
@@ -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 老九网盘资源数据库'
|
||||
}
|
||||
}
|
||||
})
|
||||
Reference in New Issue
Block a user