Showcase — 产品展示平台
Sage 平台的内容展示模块,支持多种媒体类型发布、社交互动和 KTV 付费下载。
功能概览
展示平台
- 5 种媒体类型:音乐、MTV、短视频、长视频、KTV
- Feed 流:按类型筛选、分页浏览、卡片瀑布流布局
- 社交互动:点赞(toggle 防刷)、评论(支持嵌套回复)、浏览计数
- 作品详情:完整信息展示、点赞状态、购买状态
KTV 付费下载
- 付费作品购买下载(模拟支付)
- 购买记录管理(防重复购买)
- 下载计数统计
数据表(4 张)
| 表名 | 说明 | 关键字段 |
|---|---|---|
showcase_posts |
作品主表 (24 字段) | media_type, content_url, price, like_count, view_count |
showcase_comments |
评论表 (12 字段) | parent_id (嵌套回复), reply_count |
showcase_likes |
点赞表 (4 字段) | UNIQUE(post_id, user_id) 防刷 |
showcase_downloads |
KTV 下载记录 (8 字段) | payment_status, UNIQUE(post_id, user_id) |
所有表使用 sage 数据库。
API 端点(11 个)
| 端点 | 方法 | 说明 |
|---|---|---|
showcase_feed.dspy |
GET | Feed 列表(分页 + media_type 筛选) |
showcase_post_detail.dspy |
GET | 作品详情(含点赞/购买状态,自动 +view_count) |
showcase_post_create.dspy |
POST | 创建作品(自动填充 author_id) |
showcase_post_update.dspy |
POST | 更新作品 |
showcase_post_delete.dspy |
POST | 删除作品 |
showcase_comment_create.dspy |
POST | 创建评论/回复(自动更新 comment_count 和 reply_count) |
showcase_comment_update.dspy |
POST | 更新评论 |
showcase_comment_delete.dspy |
POST | 删除评论 |
showcase_comments_list.dspy |
GET | 获取某作品全部评论 |
showcase_like_toggle.dspy |
POST | 切换点赞(返回 liked: true/false) |
showcase_download_purchase.dspy |
POST | KTV 购买下载(检查重复购买) |
CRUD 管理界面(3 个)
| CRUD 别名 | 表 | 功能 |
|---|---|---|
showcase_posts_list |
showcase_posts | 作品管理(搜索:标题/类型/状态) |
showcase_comments_list |
showcase_comments | 评论管理 |
showcase_downloads_list |
showcase_downloads | 下载记录管理 |
通过 xls2crud 自动生成,运行时由 build.sh 产出。
目录结构
showcase/
├── showcase/ # Python 包
│ ├── __init__.py # 导出所有函数
│ └── init.py # ServerEnv 注册 + 业务逻辑
├── models/ # 数据表定义 (JSON)
│ ├── showcase_posts.json
│ ├── showcase_comments.json
│ ├── showcase_likes.json
│ └── showcase_downloads.json
├── json/ # CRUD 定义 (JSON)
│ ├── showcase_posts_list.json
│ ├── showcase_comments_list.json
│ └── showcase_downloads_list.json
├── wwwroot/
│ ├── index.ui # Feed 主页(卡片流 + 类型筛选)
│ ├── detail.ui # 作品详情页
│ ├── showcase.css # 样式
│ ├── showcase.js # 前端逻辑(feed 加载/卡片渲染)
│ └── api/ # 11 个 dspy 端点
├── init/
│ └── data.json # 初始化数据(media_type 编码)
├── scripts/
│ └── load_path.py # RBAC 权限注册
├── pyproject.toml
└── README.md
Sage 集成步骤
1. 安装模块
cd ~/repos/showcase && ~/repos/sage/py3/bin/pip install .
2. 注册模块加载
编辑 ~/repos/sage/app/sage.py:
from showcase.init import load_showcase
# 在 init() 函数中添加:
load_showcase()
3. 添加到 build.sh
编辑 ~/repos/sage/build.sh,在安装循环中添加 showcase:
for m in appbase rbac ... showcase
4. wwwroot 软链接
cd ~/repos/sage/wwwroot
ln -sf ~/repos/showcase/wwwroot showcase
5. RBAC 权限
cd ~/repos/sage && ./py3/bin/python ~/repos/showcase/scripts/load_path.py
6. 菜单入口
编辑 ~/repos/sage/wwwroot/global_menu.ui,在 items 数组中添加:
,{"name":"showcase","label":"展示平台","icon":"fa fa-photo-film","url":"{{entire_url('/showcase/index.ui')}}","target":"app.sage_main_content"}
7. 建表
cd ~/repos/showcase
~/repos/sage/py3/bin/json2ddl mysql models/ > mysql.ddl.sql
# 然后在 MySQL 中执行 mysql.ddl.sql
8. 生成 CRUD 界面
cd ~/repos/showcase
~/repos/sage/py3/bin/xls2crud -m models -o wwwroot showcase json/*.json
技术要点
- 点赞防刷:
showcase_likes表有UNIQUE(post_id, user_id)唯一索引 - 计数冗余:
like_count/comment_count/view_count冗余存储在 posts 表,避免 Feed 流 COUNT 查询 - 嵌套评论:
parent_id指向同表 id,支持无限层级回复 - 付费隔离:KTV 作品设置
price > 0,购买后is_purchased=True才返回 content_url - dspy 规范:零 import、零 print、零 uuid,使用预加载全局函数
Description
Languages
Python
65.1%
JavaScript
20.5%
CSS
13.9%
Shell
0.5%