ThinkSSL🔒 一键申购 5分钟快速签发 30天无理由退款 购买更放心 广告
# 组件化设计 组件化设计用于组建V5组件库的最小元件 > Bootstrap@3.4.1 > Jquery@1.12.4 > **两个样式库和JS库将强制引入页面中,页面组件设计时应注意处理冲突问题或插件的依赖问题(统一或适配该版本)** 示例组件 **https://cloud.189.cn/t/fYnuAbIBf6vm** (访问码:nnh9) ## 一、组件文件结构构成 ``` 组件根目录 -------- |---config.json 组件属性、设置 |---component.html 可视化组件代码(可包含js、css、htmll) |---widget.html 后台调用组件 |---js.js 组件js脚本 |---style.css 组件样式表 |---assets 各类资源 | |---images 图片资源(暂不予支持) | |---xxx.png | |---xxx.jpg ``` ## 二、config.json文件内容结构 ``` json { "uuid": "3b5d1139-1fa8-4809-af20-813025d32111", //UUID唯一不重复,不可自行定义,总部分发 "name": "package-slide-003", //组件名称package-为前缀,分隔符使用英文中划线 - "version": "5.0.1", //版本,自定 "demo_url": "http://www.ctrl.cn", //示例网址,自定 "icon": "http://www.ctrl.cn", //图标网址,自定(统一,图片审核) "preview_picture": "http://www.ctrl.cn", //示例截图网址,自定(统一,图片审核) "author": "SMO技术运营部", //作者声明,自定 "author_url": "http://www.ctrl.cn", //作者网址,自定 "slug": "介绍", //介绍,自定(审核) "keywords": "二合一,材料", //组件关键词,自定(审核) "description": "二合一,材料", //详细描述,自定(审核) "type": [ "slide", "picture" ], //根据分类,自定选择 "dependencies": { //依赖网址,自定(代码审核,代码托管) "css": [ "//lib.baomitu.com/tiny-slider/2.9.2/tiny-slider.css" ], "js": [ "//lib.baomitu.com/tiny-slider/2.9.2/min/tiny-slider.js" ] }, "tpl": "widget.html", //组件模板代码,html后缀,文件地址 "html": "component.html", //组件拖拽代码,html后缀,文件地址 "js": "js.js", //JS脚本(代码审核,代码托管) "style": "style.css", //样式表(代码审核,代码托管) "assets": [ "assets/images/xxx.jpg" ] //使用资源(文件地址) } ``` ## 三、component.html文件结构 ``` html <!-- 组件开始 --> <!-- component --> <!-- 组件内的内容 --> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <title></title> <link rel="stylesheet" href="//lib.baomitu.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css"> <link rel="stylesheet" href="//lib.baomitu.com/font-awesome/4.7.0/css/font-awesome.min.css"> <link rel="stylesheet" href="//lib.baomitu.com/animate.css/3.7.2/animate.min.css"> <link rel="stylesheet" href="//lib.baomitu.com/layer/3.1.1/theme/default/layer.css"> <link rel="stylesheet" href="http://cdn.ctrlcloud.peakjs.top/static/dist/style/common.css"> <!-- css还需要在config.dependencies.css中声明引入 绝对地址引入 --> <link rel="stylesheet" href="//lib.baomitu.com/video.js/7.6.6/video-js.min.css"> <style> /*组件样式定义*/ /*component style*/ .player { width: 100%; } /* 样式表内容定义,覆盖style.css*/ /* 尽量使用bs、common.css中已定义样式,减少代码量增加稳定性 */ /*component style*/ </style> </head> <body> <div class="container-fluid"> <div class="row"> <!-- component html --> <!-- 组件的dom结构 --> <section class="component-wrapper package-video-001" data-uuid="0000" data-name="package-video-001"> <div class="component-icon need-cleared"> <img src="http://cdn.ctrlcloud.peakjs.top/static/assets/preview/gap001-2.png" class="img-responsive" alt="视频组件103"> </div> <div class="component-preview need-cleared"> <img src="http://cdn.ctrlcloud.peakjs.top/static/assets/preview/gap001-2.png" class="img-responsive" alt="视频组件103"> </div> <div class="component"> <div class="player"> <video id="video-player" class="video-js vjs-big-play-centered vjs-fluid" controls preload="meta" poster="http://demo-videos.qnsdk.com/movies/qiniu.mp4?vframe/jpg/offset/10" data-setup='{"autoplay":"true"}'> <!-- <source src="http://demo-videos.qnsdk.com/movies/qiniu.mp4" type="video/mp4"> --> <!-- <source src="http://video.cdn.ctrl.cn.peakjs.top/rick.and.morty.s04e02.m3u8" type="application/x-mpegURL"> --> <source src="https://d2zihajmogu5jn.cloudfront.net/bipbop-advanced/bipbop_16x9_variant.m3u8" type="application/x-mpegURL"> </video> </div> </div> </section> <!-- component html --> </div> </div> </body> <script src="//lib.baomitu.com/jquery/1.12.4/jquery.min.js"></script> <script src="//lib.baomitu.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script> <script src="//lib.baomitu.com/wow/1.1.2/wow.min.js"></script> <script src="//lib.baomitu.com/layer/3.1.1/layer.js"></script> <script src="//cdn.ctrlcloud.peakjs.top/static/dist/js/common.js"></script> <!-- 以上为必选js库 --> <!-- js还需要在config.dependencies.js中声明引入 绝对地址引入 --> <script src="//lib.baomitu.com/video.js/7.6.6/video.min.js"></script> <script> /*component script*/ /*组件JS代码脚本,覆盖js.js*/ (function () { var player = videojs('#video-player', { muted: true, preload: 'meta', autoplay: !true, controls: true }, function () { console.log('play') // this.play() this.on('loadeddata', function () { }); this.on('ended', function () { }); }) })() /*component script*/ $(function ($) { //注意该段位置 移出 保存区块 backgroundImage(); var wow = new WOW ({ boxClass:'wow', animateClass:'animated', offset:0, mobile:false, live:true }) wow.init(); }) </script> </html> <!-- component --> <!-- 组件结束 --> ``` ## 四、widget.html文件结构 原则上与thinkphp模板代码要求一致 ## 在模板中使用模板控件 在前台模板中,我们把所有模板控件放在`$theme_widgets`中,`$theme_widgets`就是一个数组,要使用模板控件只要把它当成`$theme_widgets`中的值就可以了,如: 组件名称要求使用**小写、下划线分隔** ``` <php> print_r($theme_widgets['widget_name_001']);//记得要判断一下这个控件是否存在! </php> ``` 同时我们也增加一个 `widget`标签 ``` <widget name="widget_name_001"> <!--输出控件标题--> {$widget.title} <!--调用控件的变量--> {$widget.vars.varName1|default=''} 或: <php> echo $widget['vars']['varName1'];//记得要判断一下这个变量是否存在! </php> </widget> ``` 如果是**公共模板**文件,应该加上`is_public`属性,并且设置值为` 1 `,这时这个配置文件里的变量和控件变成公共变量和控件,在每个页面都加载,如`simpleboot3/public/config.html`的配置文件`simpleboot3/public/config.json` ``` { "name": "模板全局配置", "action": "public/Config", "description": "模板全局配置文件", "is_public": "1",/*默认值为0,开启后会在每个页面加载这个配置*/ "order": 0.0, "more": { "vars": { "enable_mobile": { "title": "手机注册", "value": "0", "type": "select", "value": 1, "options": { "1": "开启", "0": "关闭" }, "tip": "" } } } } ```