【20211207】CmsWing代码分析 - src/controller/home/index.js(二)

2021SC@SDUSC

view/home/index_index.html

上一篇博客介绍了主页的模板继承部分,下面让我们回到index_index.html。HTML文件的主要作用是界定界面元素,这一部分让我们暂且跳过,我们的重点是分析HTML文件调用了哪些文件。

{%topic data = "slider",limit= "5",position='home',issub="1"%}
{%for val in slider%}
{%if val.model_id==4%} {% set pic = val.pics|strToArray%}{%else%}{%set pic = val.cover_id%}{%endif%}

这一段起到了设置主题图片的作用。其他调用具体数据的也大体和这一段类似。

src/controller/home/index.js

  async indexAction() {
    // let p = this.get();
    // return this.body="dfdfdfd";
    // let ss = think.service("geetest");
    // let sss = new ss();

    // console.log(this.config("view").nunjucks.extname);
    // auto render template file index_index.html
    this.meta_title = '首页';// 标题1
    this.keywords = this.config('setup.WEB_SITE_KEYWORD') ? this.config('setup.WEB_SITE_KEYWORD') : '';// seo关键词
    this.description = this.config('setup.WEB_SITE_DESCRIPTION') ? this.config('setup.WEB_SITE_DESCRIPTION') : '';// seo描述
    this.active = ['/', '/index', '/index.html'];
    // 首页内容钩子
    await this.hook('hometitle');
    await this.hook('homelist');
    // 右边的钩子

    await this.hook('homeright');
    }

这里是定义钩子和变量赋值。

    if (this.isMobile) {
      const map = {
        'pid': 0,
        'status': 1
      };
      // 排序
      const o = {};
      let order = this.get('order') || 100;
      // console.log(order);
      order = Number(order);
      switch (order) {
        case 1:
          o.update_time = 'ASC';
          break;
        case 2:
          o.view = 'DESC';
          break;
        case 3:
          o.view = 'ASC';
          break;
        default:
          o.update_time = 'DESC';
      }

依旧和之前一样是判断浏览客户端,这里还写了一段排序。

      this.assign('order', order);
      const data = await this.model('document').where(map).page(this.get('page'), 10).order(o).countSelect();
      this.assign('list', data);
      // console.log(data);
      if (this.isAjax('get')) {
        for (const v of data.data) {
          if (!think.isEmpty(v.pics)) {
            const arr = [];
            for (const i of v.pics.split(',')) {
              arr.push(await get_pic(i, 1, 300, 300));
            }
            v.pics = arr;
          }
          if (!think.isEmpty(v.cover_id)) {
            v.cover_id = await get_pic(v.cover_id, 1, 300, 169);
          }
          if (!think.isEmpty(v.price)) {
            if (!think.isEmpty(get_price_format(v.price, 2))) {
              v.price2 = get_price_format(v.price, 2);
            }
            v.price = get_price_format(v.price, 1);
          }
          v.uid = await get_nickname(v.uid);
          v.url = get_url(v.name, v.id);
          v.update_time = this.moment(v.update_time).fromNow();
        }
        return this.json(data);
      }
      return this.display(this.mtpl());
    } else {
      // debugger;
      // console.log(think.datetime(new Date(), "YYYY-MM-DD"));
      await this.hook('homeEnd');
      return this.display();
    }

最长的最复杂的一段。这部分让我们了解一下JQuery中使用Ajax发送GET。https://thinkjs.org/zh-cn/doc/3.0/context.html#toc-677提到了这一问题:判断是否是 ajax 请求(通过 header 中 x-requested-with 值是否为 XMLHttpRequest 判断),如果执行了 method,那么也会判断请求类型是否一致。

总结

通过最近的几次分析,大概对纯前端HTML页面和后台如何交互产生了认知。之后的分析我们将会回归核心逻辑部分,对JS文件的纯逻辑分析将会增加。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值