上一节,讲了友情链接插件的需求分析,以及建好了cmswing_ext_link表,有了需求之后我们就可以开始动手创建插件了。
进入后台,扩展-》插件管理-》新增插件,添加一个名为 友情链接的插件,如下图
插件目录:link,这个很重要,要跟接下来创建插件目录的名称一致。
是否有后台管理:我们这里需要后台管理,所以选择“有”。
其他按照需要填写即可。
cmswing所有的插件都放在ext目录下
在ext/controller目录下创建 目录名为link的插件,然后创建index.js,和admin.js两个控制器
'use strict'; /** * 插件前台控制器 * 如果插件有前台展示业务,写在这个控制器里面 * 插件如需建立表务必遵循下面格式: * 单表:表前缀_ext_插件目录名 * 多表:表前缀_ext_插件目录名,表前缀_ext_插件目录名_分表1,表前缀_ext_插件目录名_分表2... */ import Base from '../index.js'; export default class extends Base { /** * index action * * @return {Promise} [] */ async indexAction(){ //auto render template file index_index.html let table ="ext_"+this.ext.ext; console.log(table); //获取当前分类 this.assign("type",await this.gettype()); //获取友情链接 let data = await this.model(table).where({passed:1}).order("sort ASC").select(); console.log(data); this.assign("list",data) return this.display(); } async applyAction(){ if(this.setting.ispost==0){ this.http.error = new Error('已关闭申请,请在后台插件设置开启!'); return think.statusAction(702, this.http); } if(this.isPost()){ let data = this.post(); data.passed=0; if(data.linktype==1){ if(think.isEmpty(data.logo)){ return this.fail("logo链接类型,请填写logo地址!") } } let res = await this.model("ext_link").add(data); if(res){ return this.success({name:"申请成功!",url:"/ext/link/index"}) }else { return this.fail("添加失败!") } }else { //获取当前分类 this.assign("type",await this.gettype()); return this.display() } } }
'use strict'; /** * 插件后台控制器 * 如果插件有后台管理业务写在这个控制器里面 */ import Base from '../admin.js'; export default class extends Base { /** * index action * 插件管理入口 * 友情链接管理列表 * @return {Promise} [] */ async indexAction(){ //auto render template file index_index.html let typeid = this.get("typeid")||0; this.assign("typeid",typeid); let map = {} if(typeid>0){ map.typeid =typeid } //获取友情链接 let data = await this.model("ext_link").where(map).page(this.get('page')).countSelect(); //console.log(data); let Pages = think.adapter("pages", "page"); //加载名为 dot 的 Template Adapter let pages = new Pages(this.http); //实例化 Adapter let page = pages.pages(data); this.assign('pagerData', page); //分页展示使用 this.assign('list', data.data); //获取当前插件的分类 this.assign("type",await this.gettype()); return this.display(); } /** * 添加友情链接 * @returns {*} */ async ajaxaddAction(){ if(this.isPost()){ let data = this.post(); if(data.linktype==1){ if(think.isEmpty(data.logo)){ return this.fail("logo链接类型,请填写logo地址!") } } let res = await this.model("ext_link").add(data); if(res){ return this.success({name:"添加成功!"}) }else { return this.fail("添加失败!") } }else { //获取当前插件的分类 this.assign("type",await this.gettype()); this.meta_title="添加友情链接"; return this.display(); } } /** * 修改友情链接 */ async ajaxeditAction(){ if(this.isPost()){ let data = this.post(); if(data.linktype==1){ if(think.isEmpty(data.logo)){ return this.fail("logo链接类型,请填写logo地址!") } } let res = await this.model("ext_link").where({id:data.id}).update(data); if(res){ return this.success({name:"修改成功!"}) }else { return this.fail("修改失败!") } }else { let id = this.get("id"); let link = await this.model("ext_link").find(id); console.log(link); this.assign("link",link); //获取当前插件的分类 this.assign("type",await this.gettype()); this.meta_title="添加友情链接"; return this.display(); } } async delAction(){ let ids = this.param("ids"); //console.log(ids); let res = await this.model("ext_link").where({id:["IN",ids]}).delete() if(res){ return this.success({name:"删除成功!"}) }else { return this.fail("删除失败!") } } /** * 友情链接审核申请 * @returns {*} */ async applyAction(){ if(this.isPost()){ let ids = this.post("ids"); let res = await this.model("ext_link").where({id:["IN",ids]}).update({passed:1}); if(res){ return this.success({name:"审核成功!"}) }else { return this.fail("审核失败!") } }else { //获取友情链接 let data = await this.model("ext_link").where({passed:0}).page(this.get('page')).countSelect(); //console.log(data); let Pages = think.adapter("pages", "page"); //加载名为 dot 的 Template Adapter let pages = new Pages(this.http); //实例化 Adapter let page = pages.pages(data); this.assign('pagerData', page); //分页展示使用 this.assign('list', data.data); return this.display(); } } }