插件[友情链接]开发教程(二):创建插件

上一节,讲了友情链接插件的需求分析,以及建好了cmswing_ext_link表,有了需求之后我们就可以开始动手创建插件了。


后台添加插件

进入后台,扩展-》插件管理-》新增插件,添加一个名为 友情链接的插件,如下图

43D67F90-28EE-449E-9BEA-3013C4CD4232.png

插件目录:link,这个很重要,要跟接下来创建插件目录的名称一致。

是否有后台管理:我们这里需要后台管理,所以选择“有”。

其他按照需要填写即可。


创建插件目录

cmswing所有的插件都放在ext目录下

在ext/controller目录下创建 目录名为link的插件,然后创建index.js,和admin.js两个控制器

E2F55A58-927C-43AC-89CF-0351DFA8D683.png

link/idnex.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()
    }

  }
}

link/admin.js控制器详解

'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();
      }

  }

}


网站导航