Appearance
路由、模板、变量映射参考
本文档按模块列出全部路由 → 控制器方法 → 模板文件 → 注入变量的完整映射关系。主题开发者可根据此表了解每个页面会渲染哪个 EJS 模板、模板中可使用哪些由控制器 assign() 注入的变量。
路径说明:所有前端路由统一挂载在
/index前缀下(Fastify 的 prefix),对外 URL 去除该前缀。即/index/song/:id的实际访问地址是/song/:id。
约定
| 标记 | 含义 |
|---|---|
| fetch | 调用的 EJS 模板路径(相对于 view/,不含 .ejs 后缀) |
| assign | 控制器通过 this.assign() 注入的变量及说明 |
| layout | 使用的布局名(false=无布局, 'default'=默认, 'author'=作者布局) |
| noNeedLogin | 该方法是否无需登录 |
| AJAX | 是否通过 x-requested-with: XMLHttpRequest 头区分返回格式 |
| ⚠ | 动态路径参数(:id 等),对应模板中通过 request.params 获取 |
首页 (Index)
| URL | 方法 | fetch | assign | layout | 免登录 |
|---|---|---|---|---|---|
GET / | index | index/index | title, keywords, description | default | ✓ |
GET /sitemap | sitemap | index/sitemap | — | default | ✓ |
GET /link?type=&id= | link | —(重定向到详情页) | — | — | ✓ |
音乐 (Music)
| URL | 方法 | fetch | assign | layout | 免登录 |
|---|---|---|---|---|---|
GET /song/⚠:id | detail | music/detail | downloadurl, title, keywords, description, obj(音乐数据对象) | default | ✓ |
专辑 (Album)
| URL | 方法 | fetch | assign | layout | 免登录 |
|---|---|---|---|---|---|
GET /album/⚠:id | detail | album/detail | obj, type, title, keywords, description, downloadurl | default | ✓ |
视频 (Video)
| URL | 方法 | fetch | assign | layout | 免登录 |
|---|---|---|---|---|---|
GET /video/⚠:id | detail | video/single 或 video/multiple(动态) | obj, title, keywords, description(条件:total, videoInfo, videoData, sid, nid) | default | ✓ |
创作者 (Author)
| URL | 方法 | fetch | assign | layout | 免登录 |
|---|---|---|---|---|---|
GET /author/⚠:id | detail | author/detail | typeList, title, keywords, description, obj, by, type | default | ✓ |
GET /author/creator | creator | author/creator | obj, weeklyStats, newStats, title | author | — |
GET /author/apply | apply | author/apply | category, obj, links, musicianDisclaimer, city_area, isApply, title | author | — |
GET|POST /author/update/⚠:id | update | author/update | category, obj, links, jump | author | — |
GET|POST /author/post_music | postMusic | author/post_music | typeList, source_type, playbitrate, row, tree | author | — |
GET|POST /author/post_album | postAlbum | author/post_album | list, row, query, tree | author | — |
GET|POST /author/music | music | author/music(非AJAX) | by, list, page, title | author | — |
GET|POST /author/album | album | author/album | by, list, page, title | author | — |
GET|POST /author/following | following | author/following | list, page, title | author | — |
GET|POST /author/follower | follower | author/follower | list, page, title | author | — |
GET|POST /author/income | income | author/income | obj, list, page, title | author | — |
GET|POST /author/withdraw | withdraw | author/withdraw | list, page, obj, chineseMap, status, title | author | — |
GET /author/ajax_image | ajax_image | author/ajax_image | list, total, pageSize, pageNum, pageCount, type | false(AJAX) | — |
GET /author/ajax_withdraw | ajax_withdraw | author/ajax_withdraw | min_withdrawal, paymentMethods, obj | false(AJAX) | — |
分类 (Type)
| URL | 方法 | fetch | assign | layout | 免登录 |
|---|---|---|---|---|---|
GET /type/⚠:id | detail | 动态(如 music/list) | obj, parent, children, sameLevel | default | ✓ |
搜索 (Search)
| URL | 方法 | fetch | assign | layout | 免登录 |
|---|---|---|---|---|---|
GET /search/ | index | search/index | __list__, page, wd(搜索词), by, allCount | default | ✓ |
GET /search/album | album | search/album | 同上(私有方法 #handleSearch 统一注入) | default | ✓ |
GET /search/special | special | search/special | 同上 | default | ✓ |
GET /search/author | author | search/author | 同上 | default | ✓ |
GET /search/circle | circle | search/circle | 同上 | default | ✓ |
GET /search/goods | goods | search/goods | 同上 | default | ✓ |
商品 (Goods)
| URL | 方法 | fetch | assign | layout | 免登录 |
|---|---|---|---|---|---|
GET /goods/⚠:id | detail | goods/detail | title, keywords, description, obj, comment | default | ✓ |
GET|POST /goods/buy | buy | goods/buy | coupon_list(条件), default_paytype, shopList, postage, paytype, pink_id, address, productAttrValue, order_id, productResult, product, quantity, type, title | default | — |
GET|POST /goods/confirm_order | confirm_order | goods/confirm | encrypt, self_package, self_collection, shopList, title, list, paytype, default_paytype, address, defaultAddress, currency, total, totalNum, postage, coupon_list | default | — |
GET /goods/comment | comment | goods/comment | id, all, hasImage, totalAdditional, list, currentType, page | false(AJAX) | ✓ |
圈子 (Circle)
| URL | 方法 | fetch | assign | layout | 免登录 |
|---|---|---|---|---|---|
GET /circle/⚠:id | detail | circle/detail | title, keywords, description, obj | default | ✓ |
GET|POST /circle/create | create | circle/create | — | false(弹窗) | — |
GET /circle/hot | hot | circle/hot | — | default | ✓ |
GET /circle/home | home | circle/home | query | default | ✓ |
GET|POST /circle/favs | favs | circle/favs | type, ids, query(非AJAX) / modeName, query, orderway, orderby, tplid, pageNum(AJAX) | default | — |
GET|POST /circle/likes | likes | circle/likes(非AJAX)ajax/index(AJAX) | ids, type, query(非AJAX) | default | — |
用户 (User)
| URL | 方法 | fetch | assign | layout | 免登录 |
|---|---|---|---|---|---|
GET /user/index | index | user/index | newTrack, event_list, userDataCount, title | default | — |
GET|POST /user/login | login | user/login | title | default | ✓ |
GET|POST /user/register | register | user/register | reg_verify_type, title | default | ✓ |
GET /user/ajax_login | ajax_login | user/ajax_login | — | false(弹窗) | ✓ |
GET /user/ajax_reg | ajax_register | user/ajax_register | reg_verify_type | false(弹窗) | ✓ |
GET /user/ajax_resetpwd | ajax_resetpwd | user/ajax_resetpwd | — | false(弹窗) | ✓ |
GET /user/profile | profile | user/profile | — | default | — |
GET|POST /user/favs | favs | user/favs | type, rows, title | default | — |
GET|POST /user/likes | likes | user/likes | type, rows | default | — |
GET|POST /user/follow | follow | user/follow | list, page | default | — |
GET|POST /user/record | record | user/record | — | default | — |
GET|POST /user/download | download | user/download | list, page, type, title | default | — |
GET|POST /user/address | address | user/address | rows, title | default | — |
GET|POST /user/ajax_address | ajax_address | user/ajax_address | obj, id | false(弹窗) | — |
订单 (Order)
| URL | 方法 | fetch | assign | layout | 免登录 |
|---|---|---|---|---|---|
GET /order/index | index | order/index | list, page, status | default | — |
GET /order/detail/⚠:id | detail | order/detail | title, order, timeline | default | — |
GET /order/goods | goods | order/goods | status, keyword, list, page, title, shippingStatus | default | — |
GET /order/video | video | order/video | list, page, status, keyword | default | — |
GET /order/circle | circle | order/circle | list, page, status, keyword | default | — |
GET /order/album | album | order/album | list, page, status, keyword | default | — |
GET|POST /order/wechat | wechat | order/wechat | isWechat, isMobile, payData, orderData, type, title | default | — |
GET|POST /order/alipay | alipay | order/alipay | isWechat, isMobile, payData, orderData, type, title | default | — |
GET /order/track_ajax | track_ajax | order/track_ajax | list | false(AJAX) | — |
GET|POST /order/comment/⚠:oid | comment | order/comment | title, order, product, comments | default | — |
购物车 (Cart)
| URL | 方法 | fetch | assign | layout | 免登录 |
|---|---|---|---|---|---|
GET|POST /cart/index | index | cart/index | title, typeMenu, list, page, type, paymentType | default | — |
VIP (Vip)
| URL | 方法 | fetch | assign | layout | 免登录 |
|---|---|---|---|---|---|
GET /vip/index | index | vip/index | vipList | default | — |
GET /vip/ajax_vip | ajax_vip | vip/ajax_vip | vipList, level | false(弹窗) | — |
GET /vip/ajax_redeem | ajax_redeem | vip/ajax_redeem | error(条件), obj(条件), vip_down(条件) | false(弹窗) | — |
充值 (Recharge)
| URL | 方法 | fetch | assign | layout | 免登录 |
|---|---|---|---|---|---|
GET /recharge/index | index | recharge/index | rechargeConfig, title | default | — |
GET /recharge/moneylog | moneylog | recharge/moneylog | list, total, page, rechargeConfig, title | default | — |
通知 (Notify)
| URL | 方法 | fetch | assign | layout | 免登录 |
|---|---|---|---|---|---|
GET /notify/index | index | notify/index | title, list, page | default | — |
GET /notify/follower | follower | notify/follower | title, list, page | default | — |
GET /notify/atte | atte | notify/atte | title, list, page | default | — |
GET /notify/comments | comments | notify/comments | title, list, page | default | — |
GET /notify/like | like | notify/like | title, list, page | default | — |
GET /notify/detail | detail | notify/detail | obj | default | — |
消息 (Message)
| URL | 方法 | fetch | assign | layout | 免登录 |
|---|---|---|---|---|---|
GET /message/index | index | message/index | — | default | — |
歌单 (Special)
| URL | 方法 | fetch | assign | layout | 免登录 |
|---|---|---|---|---|---|
GET /special/index | index | special/index | — | default | ✓ |
GET /special/my | my | special/my | title, rows | default | — |
GET /special/⚠:id | detail | special/detail | by, rows, obj, author, title, type | default | ✓ |
GET|POST /special/create | create | special/create | obj(条件), title | default | — |
GET|POST /special/package | package | special/package | status, rows, title | default | — |
签到 (Signin)
| URL | 方法 | fetch | assign | layout | 免登录 |
|---|---|---|---|---|---|
GET /signin/index | index | signin/index | signInRule, smakeList, signinData, signinRank, title | default | — |
秒杀 (Seckill)
| URL | 方法 | fetch | assign | layout | 免登录 |
|---|---|---|---|---|---|
GET /seckill/index | index | seckill/index | — | default | ✓ |
GET /seckill/⚠:id | detail | 动态(如 seckill/product_detail) | title, keywords, description, obj | default | ✓ |
团购 (Combination)
| URL | 方法 | fetch | assign | layout | 免登录 |
|---|---|---|---|---|---|
GET /combination/detail/⚠:id | detail | 动态(如 combination/product_detail) | title, keywords, description, obj, comment | default | ✓ |
GET /combination/pink/⚠:id | pink | combination/pink | title, keywords, description, obj | default | ✓ |
优惠券 (Coupon)
| URL | 方法 | fetch | assign | layout | 免登录 |
|---|---|---|---|---|---|
GET /coupon/index | index | 优惠券列表 | — | — | — |
GET /coupon/my | my | user/coupon | list, type | default | — |
卡密 (Cdkey)
| URL | 方法 | fetch | assign | layout | 免登录 |
|---|---|---|---|---|---|
GET /cdkey/ajax_cdkey | ajax_cdkey | cdkey/ajax_cdkey | sale_url, cdkey_remark, type, title | false(弹窗) | — |
第三方 (Third)
| URL | 方法 | fetch | assign | layout | 免登录 |
|---|---|---|---|---|---|
GET|POST /third/prepare/⚠:platform | prepare | third/prepare | userinfo, platform, jump, bindurl, title | default | ✓ |
AI 搜索 (Agent)
| URL | 方法 | fetch | assign | layout | 免登录 |
|---|---|---|---|---|---|
| — | search | agent/search | — | — | — |
频道 (Channel)
| URL | 方法 | fetch | assign | layout | 免登录 |
|---|---|---|---|---|---|
GET /channel/⚠:id | detail | channel/detail | — | default | ✓ |
GET|POST /channel/apply | apply | channel/apply | — | default | — |
RSS (Rss)
| URL | 方法 | fetch | assign | layout | 免登录 |
|---|---|---|---|---|---|
GET /rss/ | index | rss/index | — | false | ✓ |
GET /rss/baidu | baidu | rss/baidu | — | false | ✓ |
GET /rss/google | google | rss/google | — | false | ✓ |
GET /rss/bing | bing | rss/bing | — | false | ✓ |
GET /rss/sm | sm | rss/sm | — | false | ✓ |
GET /rss/so | so | rss/so | — | false | ✓ |
GET /rss/sogou | sogou | rss/sogou | — | false | ✓ |
RSS 页面全部
layout(false),返回 XML 格式内容
AJAX 通用接口 (Ajax)
这些方法不走 fetch() 渲染模板,直接返回 JSON 或 HTML 片段。
| URL | 方法 | 说明 | 免登录 |
|---|---|---|---|
GET /ajax/index | index | AJAX 列表加载(→ ajax/index),注入 modeName, query, orderway, orderby, tplid, pageNum, limit | ✓ |
POST /ajax/buyDownload | buyDownload | 购买下载判断 | — |
POST /ajax/collect | collect | 收藏/取消 | — |
POST /ajax/share | share | 获取分享链接 | ✓ |
POST /ajax/follow | follow | 关注/取消 | ✓ |
GET /ajax/audioplayer | audioplayer | 音频播放数据(WASM 加密) | ✓ |
POST /ajax/sendEmail | sendEmail | 发送邮件验证码 | ✓ |
POST /ajax/sendSms | sendSms | 发送短信验证码 | ✓ |
POST /ajax/uploadConfig | uploadConfig | 上传配置(签名字段) | — |
POST /ajax/uploadNotify | uploadNotify | 上传回调通知 | — |
GET /ajax/pinyin | pinyin | 汉字转拼音 | — |
GET /ajax/checkExist | checkExist | 检查字段值是否存在 | — |
POST /ajax/signature | signature | 生成下载签名 | — |
GET /ajax/download | download | 文件下载 | — |
POST /ajax/reactions | reactions | 点赞/踩 | — |
GET /ajax/get_city | get_city | 获取城市数据 | — |
GET /ajax/getNotifyCount | getNotifyCount | 未读通知数量 | — |
GET /ajax/getCartCount | getCartCount | 购物车数量 | — |
GET /ajax/captcha | captcha | 点选验证码 | ✓ |
POST /ajax/mkzip | mkzip | 创建打包文件 | — |
POST /ajax/download_package | download_package | 下载打包文件 | — |
动态页面 (Dynamic)
动态页面不由静态路由配置,而是由数据库中的 dynamic_page 集合数据动态注册。路由在系统启动时从数据库读取,注册到 Fastify。
当命中动态页面路由时:
js
// controller/Dynamic.js
const dynamic = reply.routeOptions.config; // 从数据中读取页面配置
this.assign('obj', dynamic);
this.assign('title', dynamic.title + " - " + site_name);
this.assign('keywords', dynamic.keywords.join(","));
this.assign('description', dynamic.description);
this.assign('query', request.query);
this.assign('page_model', dynamic.model_name);
this.fetch(dynamic.tpl); // 模板由数据中的 tpl 字段指定模板中的可用变量:
| 变量 | 说明 |
|---|---|
obj | 动态页面的完整配置对象(title、seotitle、keywords、description、route、model_name 等) |
query | 当前请求的 query 参数 |
page_model | 关联的数据模型名(如 MusicSong) |
动态页面的 diyname 用于分组:
header→ 顶部导航栏event→ 活动类导航下拉agreement→ 协议类页面(页脚)
全局模板变量(所有页面共有)
无论哪个控制器,Base 基类的 setupRequestHooks() 和 view() 方法都会向每个模板注入以下变量,无需在控制器中手动 assign:
| 变量 | 来源 | 说明 |
|---|---|---|
title | setDefaultVariables | 页面标题(控制器可覆盖) |
keywords | setDefaultVariables | SEO 关键词 |
description | setDefaultVariables | SEO 描述 |
user | getSafeUser | 当前用户对象(含 isLogin/isGuest/_id/nickname/avatar 等) |
cookie | request | 当前请求 Cookie 对象 |
request | Fastify | 完整请求对象(含 query/params/raw/session 等) |
site | initConfig | 站点配置对象(site_name/logo/icp/copyright 等) |
site_name | site 展开 | 站点名称 |
site_logo | site 展开 | Logo URL |
design | getTemplateDesign | 装修布局数据对象 |
__TPL_STATIC__ | 自动注入 | 主题静态资源路径(如 /default_pc/) |
__STATIC__ | defaultContext | 全局静态资源路径(/) |
currentTheme | 自动注入 | 当前主题名 |
themeType | 自动注入 | 设备类型(pc / wap) |
dev | defaultContext | 开发模式标识 |
isWechat | 自动注入 | 是否来自微信浏览器 |
isMobile | 自动注入 | 是否移动端 |
isAjax | 自动注入 | 是否 AJAX 请求 |
global.DJ_VERSION | defaultContext | 系统版本号 |
page_model | 控制器设置 | 当前页面的数据模型名 |
source_type | defaultContext | 资源来源类型 |