{"_id":"@cqsjjb/yn-applet-study-player","name":"@cqsjjb/yn-applet-study-player","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"@cqsjjb/yn-applet-study-player","version":"1.0.0","description":"学时监管小程序SDK","private":false,"main":"src/components/jjb-player/jjb-player","miniprogram":"src","author":"","publishConfig":{"access":"public"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"node  ./scripts/build.js"},"_id":"@cqsjjb/yn-applet-study-player@1.0.0","_nodeVersion":"22.19.0","_npmVersion":"10.9.3","dist":{"integrity":"sha512-FSyg8+nE5oLQZOyZ3X+sojMggjaCwal0FNL11HKFsAuHdGlanxHwRo6s7avxlKta8W7EZx9PzaPN/0MOCAedcw==","shasum":"fce54ba92c69000f6a39f3089e07c7e2dc39a249","tarball":"https://registry.npmjs.org/@cqsjjb/yn-applet-study-player/-/yn-applet-study-player-1.0.0.tgz","fileCount":62,"unpackedSize":84971,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCQbeja4ldhEirGh1ZxMogoTE3yJAwZwDB7GpP8IY2r8gIhAKbmiOM4i/VKEYogOZ+JJOI5nIVznno/OLLP9LI7U0Mw"}]},"_npmUser":{"name":"cqjjb","email":"995934055@qq.com"},"directories":{},"maintainers":[{"name":"cqjjb","email":"995934055@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/yn-applet-study-player_1.0.0_1777511050278_0.963095976669514"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-30T01:04:10.160Z","1.0.0":"2026-04-30T01:04:10.415Z","modified":"2026-04-30T01:04:10.691Z"},"maintainers":[{"name":"cqjjb","email":"995934055@qq.com"}],"description":"学时监管小程序SDK","readme":"# 微信小程序学时监管 SDK 说明文档\n\n## 描述\n\n`@cqsjjb/yn-applet-study-player`用于微信小程序点播课的实时学时监管\n\n## 使用场景\n\n1、课程视频学习时使用，集成了 Video 播放器、学时监管、随机验证等；\n2、只需引入组件，传入对应参数，即可开始学习，不需要再自己写视频学习逻辑。\n\n## 支持验证方式\n\n1、FACE 拍照人脸验证；\n2、LIVINGBODY 活体验证；\n3、SLIDER 滑块拖动验证；\n4、NUMBER 数字验证；\n5、IDCARD 学员身份证号后四位验证。\n\n## 使用教程\n\n### 微信小程序原生使用：\n\n1. 安装插件\n   ```bash\n   npm install @cqsjjb/yn-applet-study-player\n   ```\n2. 构建 npm\n   ```bash\n   在微信开发者工具中，选择“工具”->“构建npm”\n   ```\n3. 引入组件\n   在需要使用的页面的 json 文件中引入组件\n   ```json\n   {\n     \"usingComponents\": {\n       \"jjb-player\": \"@cqsjjb/yn-applet-study-player/components/jjb-player/jjb-player\"\n     }\n   }\n   ```\n4. 使用组件\n   在需要使用的页面的 wxml 文件中引入组件\n   ```xml\n   <jjb-player></jjb-player>\n   ```\n\n### 在 uni-app 中使用\n\n1. 安装插件\n   ```bash\n   npm install @cqsjjb/yn-applet-study-player\n   ```\n2. 构建脚本\n\n由于`uni-app`并不支持直接引入微信小程序原生组件，需要使用脚本把 npm 安装的包复制到特定目录。\n\n在项目根目录新建`scripts/pkg-copy.js`文件，内容如下：\n\n```js\n// scripts/pkg-copy.js\n// 本脚本用于将原生 npm 组件复制到 wxcomponents 文件夹\nconst fs = require(\"fs-extra\");\nconst path = require(\"path\");\n\n// 需要复制的包\nconst pkgList = [\n  {\n    from: \"@cqsjjb/yn-applet-study-player/src\",\n    to: \"yn-applet-study-player\",\n  },\n];\n\nconst npmPath = path.join(__dirname, \"../node_modules\");\nconst distPath = path.join(__dirname, \"../src/wxcomponents\");\n\nfunction copyPkg(pkg) {\n  const from = `${npmPath}/${pkg.from}`;\n  const to = `${distPath}/${pkg.to}`;\n  fs.copySync(from, to);\n}\n\n// 复制所有包\npkgList.forEach(copyPkg);\n```\n\n在`package.json`新增脚本：\n\n```json\n{\n  \"scripts\": {\n    \"postinstall\": \"node scripts/pkg-copy\"\n  }\n}\n```\n\n执行`npm install`会把包复制到`src/wxcomponents`目录下\n\n3. 引入组件\n   在配置微信小程序的 page 的 json 文件中引入组件（一般是在`pages.json`中）：\n   ```json\n   {\n     \"path\": \"xxxxx\",\n     \"style\": {\n       \"usingComponents\": {\n         \"jjb-player\": \"/wxcomponents/yn-applet-study-player/components/jjb-player/jjb-player\"\n       }\n     }\n   }\n   ```\n4. 使用组件\n   在需要使用的页面的 vue 文件中使用组件\n   ```xml\n   <jjb-player></jjb-player>\n   ```\n\n## 参数说明\n\n### baseUrl\n\n类型：`string`\n说明：自定义接口请求地址(末尾不带斜杠`/`)，例：`https://xxx.com`，末尾不能带`/`。请求地址须在微信小程序后台配置`Request白名单`、`Upload白名单`。\n\n### videoSty\n\n类型：`string`，选填\n说明：播放器样式，默认`width: 100%; height: 420rpx`\n\n### options\n\n类型：`object`，必填\n说明：学习所需参数，见下方\n\n### appId\n\n类型：`string`，必填\n说明：接口鉴权 appId，对接的时候会给。\n\n#### options 参数说明：\n\n| 字段          | 类型             | 描述                                  | 是否必传 |\n| ------------- | ---------------- | ------------------------------------- | -------- |\n| url           | String           | 视频地址，如`.mp4`、`.m3u8`           |          |\n| appKey        | String           | 学时监管的 appkey，授权使用，对接提供 | 是       |\n| courseCode    | String \\| Number | 课程 id                               | 是       |\n| courseName    | String           | 课程名称                              | 是       |\n| duration      | Number           | 当前视频时长                          | 是       |\n| durationAll   | Number           | 该岗位的需修学时                      | 是       |\n| sectionCode   | String \\| Number | 课程小节 id                           | 是       |\n| sectionName   | String           | 课程小节名称                          | 是       |\n| trainPostCode | String \\| Number | 培训岗位 code                         | 是       |\n| trainPostName | String           | 培训岗位名称                          | 是       |\n| trainTypeEnum | String           | 培训类型（值只能是下面两个）          | 是       |\n|               | 'SEND_JXJY'      | 继续教育                              |          |\n|               | 'SEND_GQPX'      | 岗前培训                              |          |\n| idCard        | String           | 学员身份证                            | 是       |\n| studentName   | String           | 学员姓名                              | 是       |\n| studyId       | Number \\| String | 学员 id                               | 是       |\n| poster        | String           | 视频封面                              | 否       |\n\n\n\n### 事件\n\n#### bind:error\n\n类型：`function`\n说明：视频播放 video 抛错时会显示错误提示弹窗，点击重试触发该事件，此时可重新获取视频数据，或自定义业务逻辑\n\n#### bind:end\n\n类型：`function`\n说明：当前视频播放结束后触发\n\n## 使用说明\n\n请参照**使用教程**正确引入组件，以下仅为代码示例，根据实际场景传入正确的参数\n\n### 原生开发\n\n在js 中初始化插件，并处理好组件需要的参数\n\n```js\nPage({\n  data: {\n    baseUrl: 'xxxx',\n    appId: 'xxxx',\n    videoSty: \"width: 100%; height: 420rpx\", // video样式\n    options: {\n      appKey: \"xxxxxxxxxxxxxxxxx\", // APPKEY\n      courseCode: \"xxxxxxx\", // 课程CODE/课程版本id\n      courseName: \"xxxxxxx\", // 课程名称\n      duration: \"1623\", // 当前视频时长(秒)\n      durationAll: \"27\", // 总视频时长(小时)\n      sectionCode: \"xxxxxxx\", // 课程小节CODE\n      sectionName: \"xxxxxxx\", // 课程小节名称\n      trainPostCode: \"xxxxxxx\", // 培训岗位code\n      trainPostName: \"xxxxxxx\", // 培训岗位名称\n      idCard: \"xxxxxxxxxxxxxxxxxx\", // 身份证号码\n      studentName: \"xxx\", // 学员名称\n      trainTypeEnum: \"SEND_GQPX\", // 继续教育:SEND_JXJY，岗前培训：SEND_GQPX\n      studyId: \"xxxxxxx\", // 继续教育任务ID或岗前培训计划ID\n      url: \"https://xxx.com/xxx/xxx.mp4\",  // 视频地址\n      poster: \"https://xx.com/xxx/xxx.png\", // 视频封面\n    },\n  },\n  methods: {\n    /**\n     * @todo 播放出错处理\n     * @description 视频播放video抛错时会显示错误提示弹窗，点击重试触发该事件，此时可重新获取视频数据，或自定义业务逻辑\n     */\n    onError() {},\n    /**\n     * @todo 视频播放结束\n     * @description 视频播放结束触发\n     */\n    onEnd() {},\n  },\n});\n```\n\n4、study.wxml 中使用 jjb-player（在 json 文件中定义的组件名称）组件，传入所需参数\n\n```wxml\n<jjb-player baseUrl=\"{{baseUrl}}\" appId=\"{{appId}}\" options=\"{{options}}\" bind:error=\"onError\" bind:end=\"onEnd\"></jjb-player>\n```\n\n### UNIAPP 开发\n\n基本与原生一致\n\n3、在页面中使用 jjb-player（在 json 文件中定义的组件名称）组件，传入所需参数\n\n```vue\n<template>\n  <jjb-player\n    :baseUrl=\"baseUrl\"\n    :appId=\"appId\"\n    :options=\"options\"\n    @error=\"onError\"\n    @end=\"onEnd\"\n  ></jjb-player>\n</template>\n<script setup>\nconst baseUrl = \"xxxxx\";\nconst appId = \"xxxxx\";\nconst options = ref({\n  appKey: \"xxxxxxxxxxxxxxxxx\", // APPKEY\n      courseCode: \"xxxxxxx\", // 课程CODE/课程版本id\n      courseName: \"xxxxxxx\", // 课程名称\n      duration: \"1623\", // 当前视频时长(秒)\n      durationAll: \"27\", // 总视频时长(小时)\n      sectionCode: \"xxxxxxx\", // 课程小节CODE\n      sectionName: \"xxxxxxx\", // 课程小节名称\n      trainPostCode: \"xxxxxxx\", // 培训岗位code\n      trainPostName: \"xxxxxxx\", // 培训岗位名称\n      idCard: \"xxxxxxxxxxxxxxxxxx\", // 身份证号码\n      studentName: \"xxx\", // 学员名称\n      trainTypeEnum: \"SEND_GQPX\", // 继续教育:SEND_JXJY，岗前培训：SEND_GQPX\n      studyId: \"xxxxxxx\", // 继续教育任务ID或岗前培训计划ID\n      url: \"https://xxx.com/xxx/xxx.mp4\",  // 视频地址\n      poster: \"https://xx.com/xxx/xxx.png\", // 视频封面\n});\n\n/**\n * @todo 播放出错处理\n * @description 视频播放video抛错时会显示错误提示弹窗，点击重试触发该事件，此时可重新获取视频数据，或自定义业务逻辑\n */\nconst onError = () => {};\n/**\n * @todo 视频播放结束\n * @description 视频播放结束触发\n */\nconst onEnd = () => {};\n</script>\n```\n","readmeFilename":"README.md","_rev":"1-d54e582acc896b171a3bf818a08ecc24"}