## 前言
之所以特別說明這個目錄,是因為這個目錄其實是類似于koa的middleware的中間攔截器目錄,可以攔截到所有的請求。
## 追本溯源
在kk-koa-framework的模塊源碼中,我們可以找到這樣的代碼,在其setup文件夾中有policy的文件,其作用就是識別config目錄中的policy文件,如果是文件夾,那么遍歷文件夾內的所有文件,然后對所有的路由執行這個文件內的方法。**這個執行要優先于控制器的執行代碼**。
```
const fs = require('fs')
const path = require('path')
var Router = require('koa-router')
module.exports = app => {
let filepath = path.join(app.$$.CONFIG_DIR, 'policy.js')
if (!fs.existsSync(filepath)) {
return
}
var router = new Router()
let cfg = require(filepath)
for (let k in cfg) {
let files = cfg[k] || []
files.map(file => path.join(app.$$.SOURCE_DIR, 'policy', file + '.js'))
.filter(file => fs.existsSync(file)).map(file => {
router.all(k, require(file))
})
}
app.use(router.routes()).use(router.allowedMethods())
}
```
## config/policy.js
需要特殊處理的路由配置
```
module.exports = {
'/:identity/:userId/:lessonId/:periodId/:partId': ['lesson'],
'/playback/:lessonId/:periodId/:partId':['lesson'],
'/online/playback/:periodId':['lesson'],
'/vroom/:identity/:userId/:lessonId/:periodId/:partId':['lesson']
};
```
## policy/lesson.js
所有我們配置到policy目錄的路由,配置了lesson的都會進入到lesson.js攔截,在這個文件里,主要是針對特定參數進行查詢與使用:
```
const {
userId,
identity,
lessonId,
periodId,
partId
} = ctx.params;
console.log("lessonUrl:", ctx.originalUrl, new Date().toString())
if (lessonId && periodId && partId) {
// 驗證部分
httpParametersVerify
}
```
解析轉換xml文件的信息,使用parseFile這個方法,得到的數據是:包括了場景需要的行為,屬性,資源,場景等。場景是全部的。

獲取ppt圖片信息,在這個過程中將需要的信息都放到了ctx的上下文中。
```
let json = {
userId: userId || 0,
identity: identity || "guest",
lessonId,
periodId,
partId,
sign: ctx.query.sign || "",
time: ctx.query.time || ctx.query.t || 0,
controlPanel: ctx.query.controlPanel === undefined ? true : !!+ctx.query.controlPanel,
KKClient: getKKClient(ctx.headers['user-agent']),
commonResouces
}
let data = await getPPTImageForApi(periodId, lessonId)
```
- 相關資源鏈接
- 米樂星球小程序內調研
- 項目結構說明
- 交互課件說明
- server項目說明
- 項目說明
- 項目啟動
- app.js做的事情
- 獲取互動課件的地址
- 分析互動課件地址的參數
- policy目錄--lesson.js
- 解析ppt--api/lesson.js
- 信令中的key:template
- 信令中的key:media
- kk-talkee-engine.js
- Message
- 課件模板頁的識別過程
- 解析課件模板的源文件
- 場景與模板的對應關系
- 所有場景的基類
- choiceScence為例
- 注意事項
- ws
- online項目的說明
- online消息
- 課件編輯項目
- 資源鏈接
- 基本項目信息
- electron項目結構分析
- ipc
- 模板題組
- 普通題組
- 游戲題組
- 課件導出內容分析
- 課件模板分類明細
- 圖片題
- 視頻題
- 音頻題
- 選擇題
- 判斷題
- 轉盤
- 篩子
- 圖層拖拽
- 動畫題
- 翻拍題
- 語音題
- 201908變更
- 課件制作流程分析
- 菜單配置
- 入口操作
- 定義模板布局與初始化
- 選擇素材
- 導出過程
- egret
- interface
- ad選擇器模板
- ab選擇器模板
- 圖層拖拽模板
- 判斷題模板
- xml
- 轉盤
- events
- components
- 父類組件
- 基本組件
- 判斷題組件
- 龍骨動畫調研
- 基本了解
- 產品原型
- 白板Client項目
- 消息類型
- 白板項目分析
- 入口