Lumin Admin 应用市场:发现和安装优质应用
📌 概述
应用市场是 Lumin Admin 的扩展功能入口,提供精选应用的发现和安装服务。与插件系统不同,应用市场展示的是更完整的功能模块,安装后会在插件列表中出现。
本功能当前为展示型实现,应用数据内置在后端,后续可扩展为远程仓库加载。
一、应用分类
| 分类 | Key | 中文 | 说明 |
|---|---|---|---|
| 外观 | appearance | 外观 | 主题和视觉相关 |
| 统计 | analytics | 统计 | 数据分析相关 |
| 功能 | feature | 功能 | 核心功能增强 |
| 互动 | engagement | 互动 | 用户互动相关 |
| 内容 | content | 内容 | 内容管理增强 |
| 媒体 | media | 媒体 | 媒体文件相关 |
二、精选应用列表
| 应用 ID | 名称 | 版本 | 评分 | 下载量 | 分类 | 大小 |
|---|---|---|---|---|---|---|
lumin-dark-mode | 暗黑模式 | 1.2.0 | 4.8 | 1.3k | 外观 | 12 KB |
lumin-analytics | 访问统计 | 2.0.1 | 4.6 | 960 | 统计 | 28 KB |
lumin-search | 全文搜索 | 1.5.0 | 4.7 | 840 | 功能 | 45 KB |
lumin-i18n | 国际化 | 1.0.0 | 4.3 | 520 | 功能 | 18 KB |
lumin-newsletter | 邮件订阅 | 1.1.0 | 4.2 | 380 | 互动 | 22 KB |
lumin-watermark | 图片水印 | 1.0.2 | 4.5 | 650 | 媒体 | 15 KB |
lumin-table-of-contents | 文章目录 | 1.3.0 | 4.9 | 1.1k | 内容 | 8 KB |
lumin-code-copy | 代码复制 | 1.1.0 | 4.7 | 920 | 内容 | 5 KB |
lumin-reading-time | 阅读时间 | 1.0.0 | 4.4 | 470 | 内容 | 3 KB |
lumin-social-share | 社交分享 | 1.2.0 | 4.5 | 780 | 互动 | 16 KB |
三、后端实现
3.1 应用数据定义
1const MARKETPLACE_APPS = [
2 {
3 id: 'lumin-dark-mode',
4 name: '暗黑模式',
5 desc: '为博客添加暗黑模式切换功能,自动跟随系统偏好',
6 icon: 'Moon',
7 version: '1.2.0',
8 author: 'Lumin Team',
9 downloads: 1280,
10 rating: 4.8,
11 category: 'appearance',
12 tags: ['主题', '暗黑'],
13 size: '12 KB'
14 },
15 // ... 其他应用
16]
3.2 API 接口
1// 获取应用列表(支持分类筛选和搜索)
2app.get('/api/marketplace', (req, res) => {
3 let apps = [...MARKETPLACE_APPS]
4
5 if (req.query.category && req.query.category !== 'all') {
6 apps = apps.filter(a => a.category === req.query.category)
7 }
8
9 if (req.query.search) {
10 const s = req.query.search.toLowerCase()
11 apps = apps.filter(a =>
12 a.name.toLowerCase().includes(s) ||
13 a.desc.toLowerCase().includes(s) ||
14 a.tags.some(t => t.includes(s))
15 )
16 }
17
18 const categories = [...new Set(MARKETPLACE_APPS.map(a => a.category))]
19 ok(res, { apps, categories })
20})
21
22// 获取单个应用详情
23app.get('/api/marketplace/:id', (req, res) => {
24 const app = MARKETPLACE_APPS.find(a => a.id === req.params.id)
25 if (!app) return fail(res, 404, 'App not found')
26 ok(res, app)
27})
3.3 搜索功能
搜索支持三个维度的匹配:
| 维度 | 说明 | 示例 |
|---|---|---|
| 名称 | 应用名称 | 搜索「搜索」→ 全文搜索 |
| 描述 | 应用描述 | 搜索「水印」→ 图片水印 |
| 标签 | 应用标签 | 搜索「分享」→ 社交分享 |
四、前端实现
4.1 应用卡片
每个应用以卡片形式展示,包含:
- 分类图标:不同分类使用不同渐变色
- 应用名称和作者
- 文件大小标签
- 应用描述
- 标签列表
- 底部统计:下载量、评分、版本号
- 安装按钮
1.app-icon {
2 &.icon--appearance { background: linear-gradient(135deg, #8950fc, #7c3aed); }
3 &.icon--analytics { background: linear-gradient(135deg, #3699ff, #1e90ff); }
4 &.icon--feature { background: linear-gradient(135deg, #0bb783, #4caf50); }
5 &.icon--engagement { background: linear-gradient(135deg, #f64e60, #e91e63); }
6 &.icon--content { background: linear-gradient(135deg, #ffa800, #ff9800); }
7 &.icon--media { background: linear-gradient(135deg, #00bcd4, #0097a7); }
8}
4.2 分类筛选
1<el-radio-group v-model="categoryFilter" @change="loadApps">
2 <el-radio-button value="all">全部</el-radio-button>
3 <el-radio-button v-for="cat in categories" :key="cat" :value="cat">
4 {{ categoryLabels[cat] || cat }}
5 </el-radio-button>
6</el-radio-group>
4.3 下载量格式化
1function formatNumber(num) {
2 if (num >= 1000) return (num / 1000).toFixed(1) + 'k'
3 return num
4}
4.4 安装流程
当前安装为模拟操作,安装后提示用户到插件页面管理:
1function installApp(app) {
2 ElMessage.success(`${app.name} 安装成功!可在「插件」页面管理`)
3}
五、与插件系统的关系
1应用市场 插件管理
2┌─────────────────┐ ┌─────────────────┐
3│ 发现新应用 │ │ 管理已安装插件 │
4│ 查看评分/下载量 │ ───→ │ 启用/禁用 │
5│ 一键安装 │ │ 卸载 │
6└─────────────────┘ └─────────────────┘
应用市场安装的应用会出现在插件列表中,由插件系统统一管理启用/禁用状态。
六、后续规划
- 远程仓库:从 GitHub 仓库加载应用列表
- 版本更新:检测已安装应用的更新
- 应用详情页:展示完整的更新日志和截图
- 用户评价:支持用户评分和评论
- 安装进度:显示下载和安装进度
七、文件变更清单
| 文件 | 变更 |
|---|---|
admin/backend/server.js | 新增 2 个应用市场 API |
admin/frontend/src/views/Marketplace/Index.vue | 新建应用市场页面 |
admin/frontend/src/api/index.js | 新增 2 个应用市场 API 函数 |
admin/frontend/src/router/index.js | /marketplace 路由从 Placeholder 改为真实页面 |
留言评论
期待你的想法评论加载中