闫增涛
2024-03-05 e03417edfeaf52c017e4a5539f3b41ad0204a2f0
Merge branch 'master' of http://182.92.203.7:2001/r/jsek-applet
22个文件已删除
38个文件已修改
27个文件已添加
1 文件已重命名
7608 ■■■■ 已修改文件
app.json 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
components/goods-card/index.wxss 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/aboutUs/index.js 142 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/aboutUs/index.json 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/aboutUs/index.wxml 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/aboutUs/index.wxss 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/bibliographyList/index.js 269 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/bibliographyList/index.json 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/bibliographyList/index.wxml 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/bibliographyList/index.wxss 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/bookExhibitionDetails/index.js 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/bookExhibitionDetails/index.wxss 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/bookExhibitionList/index.js 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/bookExhibitionList/index.wxml 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/bookExhibitionList/index.wxss 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/bookServices/assort/index.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/cart/components/cart-bar/index.js 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/cart/components/cart-bar/index.json 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/cart/components/cart-bar/index.wxml 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/cart/components/cart-bar/index.wxss 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/cart/components/cart-empty/index.js 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/cart/components/cart-empty/index.json 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/cart/components/cart-empty/index.wxml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/cart/components/cart-empty/index.wxss 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/cart/components/cart-group/index.js 166 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/cart/components/cart-group/index.json 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/cart/components/cart-group/index.wxml 152 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/cart/components/cart-group/index.wxs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/cart/components/cart-group/index.wxss 335 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/cart/components/cart-group/utils.wxs 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/cart/components/goods-card/index.js 243 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/cart/components/goods-card/index.json 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/cart/components/goods-card/index.wxml 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/cart/components/goods-card/index.wxss 260 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/cart/components/specs-popup/index.js 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/cart/components/specs-popup/index.json 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/cart/components/specs-popup/index.wxml 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/cart/components/specs-popup/index.wxss 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/cart/index.js 366 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/cart/index.json 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/cart/index.wxml 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/cart/index.wxss 176 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/cart/paymentPage/index.js 200 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/cart/paymentPage/index.json 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/cart/paymentPage/index.wxml 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/cart/paymentPage/index.wxss 144 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/cart/paymentPage/js/weapp.qrcode.js 1281 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/goods/details/components/buy-bar/index.js 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/goods/details/components/buy-bar/index.wxml 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/home/home.js 126 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/home/home.wxml 53 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/home/home.wxss 56 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/personalCenter/certificate/index.wxss 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/personalCenter/components/user-center-card/index.wxml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/personalCenter/feedBack/index.js 169 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/personalCenter/feedBack/index.json 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/personalCenter/feedBack/index.wxml 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/personalCenter/feedBack/index.wxss 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/personalCenter/feedBackSubmit/index.js 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/personalCenter/feedBackSubmit/index.wxml 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/personalCenter/feedBackSubmit/index.wxss 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/personalCenter/index.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/personalCenter/myCollection/index.js 171 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/personalCenter/myCollection/index.json 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/personalCenter/myCollection/index.wxml 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/personalCenter/myCollection/index.wxss 145 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/personalCenter/myMassage/index.js 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/personalCenter/myOrder/index.js 186 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/personalCenter/myOrder/index.json 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/personalCenter/myOrder/index.wxml 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/personalCenter/myOrder/index.wxss 169 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/resourceDetails/index.js 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/resourceDetails/index.json 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/resourceDetails/index.wxml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/resourceDetails/index.wxss 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/retrievalPage/index.js 522 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/retrievalPage/index.json 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/retrievalPage/index.wxml 164 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/retrievalPage/index.wxss 289 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
services/cart/cart.js 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
services/home/home.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
static/images/bibliographyList/download.png 补丁 | 查看 | 原始文档 | blame | 历史
static/images/bibliographyList/downloadshiftin.png 补丁 | 查看 | 原始文档 | blame | 历史
static/images/bookExhibitionList/banner.png 补丁 | 查看 | 原始文档 | blame | 历史
static/images/default-book-img.png 补丁 | 查看 | 原始文档 | blame | 历史
static/images/personal/quxiaoshoucang.png 补丁 | 查看 | 原始文档 | blame | 历史
static/images/personal/suggestion.png 补丁 | 查看 | 原始文档 | blame | 历史
static/video/sea.mp4 补丁 | 查看 | 原始文档 | blame | 历史
app.json
@@ -1,11 +1,17 @@
{
  "pages": [
    "pages/resourceDetails/index",
    "pages/retrievalPage/index",
    "pages/cart/paymentPage/index",
    "pages/cart/index",
    "pages/home/home",
    "pages/aboutUs/index",
    "pages/bookServices/assort/index",
    "pages/bookServices/detail/index",
    "pages/bookServices/list/index",
    "pages/bookExhibitionList/index",
    "pages/bookExhibitionDetails/index",
    "pages/bibliographyList/index",
    "pages/usercenter/index",
    "pages/usercenter/person-info/index",
    "pages/usercenter/address/list/index",
@@ -15,7 +21,6 @@
    "pages/goods/category/index",
    "pages/goods/search/index",
    "pages/goods/result/index",
    "pages/cart/index",
    "pages/order/order-confirm/index",
    "pages/order/receipt/index",
    "pages/order/pay-result/index",
@@ -96,7 +101,8 @@
    "backgroundTextStyle": "light",
    "navigationBarBackgroundColor": "#fff",
    "navigationBarTitleText": "京师E课",
    "navigationBarTextStyle": "black"
    "navigationBarTextStyle": "black",
    " navigationStyle": "custom"
  },
  "sitemapLocation": "sitemap.json",
  "permission": {
components/goods-card/index.wxss
@@ -130,4 +130,4 @@
.spec-for-symbol {
  font-size: 24rpx;
}
}
pages/aboutUs/index.js
New file
@@ -0,0 +1,142 @@
// pages/aboutUs/index.js
const app = getApp()
// import drawQrcode from './js/weapp.qrcode'
Page({
  /**
   * 页面的初始数据
   */
  data: {
    aboutText: null,
    swiperList: null,
    current: 1,//轮播图参数
    autoplay: true, //轮播图参数
    duration: '500',//轮播图参数
    interval: 5000,//轮播图参数
    navigation: { type: 'dots' },//轮播图参数
    bannerList: [], //轮播图列表
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {
    this.getBanner()
    this.getAboutText()
    // drawQrcode({
    //   width: 200, // 必须,二维码宽度,与canvas的width保持一致
    //   height: 200, // 必须,二维码高度,与canvas的height保持一致
    //   canvasId: 'myQrcode',
    //   background: '#ffffff', //    非必须,二维码背景颜色,默认值白色
    //   foreground: '#000', // 非必须,二维码前景色,默认值黑色     '#000000'
    //   // ctx: wx.createCanvasContext('myQrcode'), // 非必须,绘图上下文,可通过 wx.createCanvasContext('canvasId') 获取,v1.0.0+版本支持
    //   text: '13216549865',  // 必须,二维码内容
    //   // v1.0.0+版本支持在二维码上绘制图片
    //   image: {
    //     // imageResource: '../../images/icon.png', // 指定二维码小图标
    //     dx: 70,
    //     dy: 70,
    //     dWidth: 60,
    //     dHeight: 60
    //   }
    // })
  },
  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady() {
  },
  /**
   * 生命周期函数--监听页面显示
   */
  onShow() {
  },
  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide() {
  },
  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload() {
  },
  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh() {
  },
  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom() {
  },
  /**
   * 用户点击右上角分享
   */
  onShareAppMessage() {
  },
  getBanner() {
    app.MG.resource.getItem({
      path: 'jsek_banner\\jsek_aboutUsBanner',
      paging: { start: 0, size: 9 },
      fields: {
        jsek_link: []
      }
    }).then(res => {
      this.setData({
        bannerList: res.datas[0].icon,
        swiperList: res.datas[0].icon
      })
      console.log(this.data.bannerList, 789);
    })
  },
  getAboutText() {
    app.MG.resource.getItem({
      path: 'jsek_aboutUs',
      fields: {
        content: []
      },
      coverSize: {
        width: 750
      },
    }).then(res => {
      console.log(res);
      this.setData({
        aboutText: res.datas[0].content
      })
    })
  }
})
pages/aboutUs/index.json
New file
@@ -0,0 +1,7 @@
{
  "component": true,
  "usingComponents": {
    "t-swiper": "tdesign-miniprogram/swiper/swiper",
    "t-swiper-nav": "tdesign-miniprogram/swiper-nav/swiper-nav"
  }
}
pages/aboutUs/index.wxml
New file
@@ -0,0 +1,31 @@
<!--pages/aboutUs/index.wxml-->
<!-- <text>关于我们</text> -->
<!-- 二维码展示 -->
<!-- <view class="">
    <canvas style="width: 200px; height: 200px;margin:0 auto" canvas-id="myQrcode"></canvas>
</view> -->
<!-- <view class="swiper-wrap">
  <t-swiper list="{{bannerList}}" current="{{current}}" autoplay="{{autoplay}}" duration="{{duration}}" interval="{{interval}}" navigation="{{navigation}}" />
</view> -->
<view class="aboutUs">
  <view class="imageBox">
    <image src="{{swiperList}}" alt="" />
  </view>
  <view class="aboutText">
    <rich-text nodes="{{aboutText}}"></rich-text>
  </view>
</view>
pages/aboutUs/index.wxss
New file
@@ -0,0 +1,20 @@
/* pages/aboutUs/index.wxss */
image {
  width: 100%;
  height: 100%;
}
.imageBox {
  width: 690rpx;
  height: 300rpx;
  margin-bottom: 35rpx;
}
.aboutUs {
  margin: 30rpx;
}
.aboutText {
  padding-bottom: 100rpx;
}
pages/bibliographyList/index.js
New file
@@ -0,0 +1,269 @@
// pages/bibliographyList/index.js
const app = getApp()
const config =
  Page({
    /**
     * 页面的初始数据
     */
    data: {
      higherList: [],
      vocationalList: [],
      teacherList: [],
      higherTotal: 0,
      vocationalTotal: 0,
      teacherTotal: 0,
      value: '',
      BarHeight: '',
      navBarHeight: ''
    },
    /**
     * 生命周期函数--监听页面加载
     */
    onLoad(options) {
      this.higherGet()
      this.vocationalGet()
      this.teacherGet()
      //获取系统信息,状态栏高度为sysInfo['statusBarHeight'];
      let sysInfo = wx.getSystemInfoSync();
      let menu = wx.getMenuButtonBoundingClientRect(); //胶囊信息
      let navBarHeight = (menu.top - sysInfo.statusBarHeight) * 2 + menu.height; // 导航栏高度
      this.setData({
        BarHeight: sysInfo.statusBarHeight, navBarHeight: navBarHeight
      })
    },
    /**
     * 生命周期函数--监听页面初次渲染完成
     */
    onReady() {
    },
    /**
     * 生命周期函数--监听页面显示
     */
    onShow() {
      console.log(this.data.value);
    },
    /**
     * 生命周期函数--监听页面隐藏
     */
    onHide() {
    },
    /**
     * 生命周期函数--监听页面卸载
     */
    onUnload() {
    },
    /**
     * 页面相关事件处理函数--监听用户下拉动作
     */
    onPullDownRefresh() {
    },
    /**
     * 页面上拉触底事件的处理函数
     */
    onReachBottom() {
    },
    /**
     * 用户点击右上角分享
     */
    onShareAppMessage() {
    },
    onTabsChange(event) {
      console.log(`Change tab, tab-panel value is ${event.detail.value}.`);
    },
    onTabsClick(event) {
      console.log(`Click tab, tab-panel value is ${event.detail.value}.`);
    },
    //高等教育
    higherGet(keyword) {
      let searchObj = {
        'Name*': keyword,
        '||author*': keyword,
        '||isbn*': keyword
      }
      app.MG.resource.getItem({
        path: 'jsek_biblioClassification\\jsek_bCHigherEducation',
        queryType: '*',
        paging: {
          start: '0',
          size: '999'
        },
        coverSize: {
          width: 260
        },
        fields: {
          jsek_link: [],
          content: [],
          subtitle: [],
          fileType: [],
          jsek_resource: [],
          freeFile: [],
          ...searchObj,
        },
        SysType: 'CmsItem'
      }).then(res => {
        res.datas.forEach(item => {
          item.determine = true
        })
        console.log(res, 789111);
        this.setData({
          higherList: res.datas,
          higherTotal: res.total
        })
        console.log(this.data.higherList, '5555');
      })
    },
    //教师教育
    vocationalGet(keyword) {
      let searchObj = {
        'Name*': keyword,
        '||author*': keyword,
        '||isbn*': keyword
      }
      app.MG.resource.getItem({
        path: 'jsek_biblioClassification\\jsek_bCVocationalEducation',
        queryType: '*',
        paging: {
          start: '0',
          size: '999'
        },
        coverSize: {
          width: 260
        },
        fields: {
          jsek_link: [],
          content: [],
          subtitle: [],
          fileType: [],
          jsek_resource: [],
          freeFile: [],
          ...searchObj
        },
        SysType: 'CmsItem'
      }).then(res => {
        res.datas.forEach(item => {
          item.determine = true
        })
        this.setData({
          vocationalList: res.datas,
          vocationalTotal: res.total
        })
      })
    },
    // 职业教育
    teacherGet(keyword) {
      let searchObj = {
        'Name*': keyword,
        '||author*': keyword,
        '||isbn*': keyword
      }
      app.MG.resource.getItem({
        path: 'jsek_biblioClassification\\jsek_bCTeacherEducation',
        queryType: '*',
        paging: {
          start: '0',
          size: '999'
        },
        coverSize: {
          width: 260
        },
        fields: {
          jsek_link: [],
          content: [],
          subtitle: [],
          fileType: [],
          jsek_resource: [],
          freeFile: [],
          ...searchObj
        },
        SysType: 'CmsItem'
      }).then(res => {
        res.datas.forEach(item => {
          item.determine = true
        })
        this.setData({
          teacherList: res.datas,
          teacherTotal: res.total
        })
      })
    },
    downloadData(event) {
      console.log(111);
      const item = event.currentTarget.dataset.item;
      // console.log(item.datas.freeFile.Value);
      const URL = 'http://182.92.203.7:3001/file/api/ApiDownload?md5=' + item.datas.freeFile.Value
      item.determine = false
      setTimeout(() => {
        if (URL) {
          item.determine = true
        }
      }, 600)
      wx.downloadFile({
        url: URL,
        success: function (res) {
          const filePath = res.tempFilePath;
          wx.openDocument({
            filePath: filePath,
            success: function (res) {
              console.log('打开文档成功');
            },
            fail: function (res) {
              console.log('打开文档失败', res);
            }
          });
        },
        fail: function (res) {
          console.log('下载文件失败', res);
        }
      });
    },
    onSearchSubmit: function (e) {
      const keyword = e.detail.value;
      // 处理搜索逻辑,例如发送搜索请求等
      console.log('搜索关键词:', keyword);
      this.higherGet(keyword)
      this.vocationalGet(keyword)
      this.teacherGet(keyword)
    },
  })
pages/bibliographyList/index.json
New file
@@ -0,0 +1,9 @@
{
  "component": true,
  "usingComponents": {
    "t-tabs": "tdesign-miniprogram/tabs/tabs",
    "t-tab-panel": "tdesign-miniprogram/tab-panel/tab-panel",
    "t-search": "tdesign-miniprogram/search/search"
  },
  "navigationStyle": "custom"
}
pages/bibliographyList/index.wxml
New file
@@ -0,0 +1,84 @@
<!--pages/bibliographyList/index.wxml-->
<view class="example-search">
  <t-search model:value="{{value}}" placeholder="请输入书目名称" bind:submit="onSearchSubmit" />
</view>
<!--状态栏高度 -->
<!-- <view style="width: 100%; height:{{BarHeight}}px;"></view>
<view style="width: 70%; height:{{navBarHeight}}px;">
  <view style="position: relative; padding-top: 10rpx;">
    <view class="iconfont icon-sousuo search_icones"></view>
    <input class="nav_input" model:value="{{ name }}" placeholder-class="placeholder_class" maxlength="30" bindfocus="bindfocus" bindconfirm="doSearch" placeholder="输入充电站" />
  </view>
</view> -->
<t-tabs defaultValue="{{0}}" bind:change="onTabsChange" bind:click="onTabsClick" t-class="custom-tabs" t-class-content="custom-panel">
  <t-tab-panel label="高等教育({{higherTotal}})" value="0">
    <view class="outsideHigherBox">
      <view class="higherBox" wx:for="{{higherList}}" wx:key="index" wx:for-item="item" wx:for-index="index">
        <view class="outsideHigherImageBox">
          <image class="higherImageBox" src="{{item.icon}}" mode="" />
          <view class="downloadIcon" bind:tap="downloadData" data-item="{{item}}">
            <image wx:if="{{determine}}" class="download" src="/static/images/bibliographyList/downloadshiftin.png" mode="" />
            <image wx:else="" class="downloadshiftin" src="/static/images/bibliographyList/download.png" mode="" />
          </view>
        </view>
        <view class="higherTextBox">{{item.name}}</view>
      </view>
    </view>
  </t-tab-panel>
  <t-tab-panel label="职业教育({{vocationalTotal}})" value="1">
    <view class="outsideHigherBox">
      <view class="higherBox" wx:for="{{vocationalList}}" wx:key="index" wx:for-item="item" wx:for-index="index">
        <view class="outsideHigherImageBox">
          <image class="higherImageBox" src="{{item.icon}}" mode="" />
          <view class="downloadIcon" bind:tap="downloadData" data-item="{{item}}">
            <image wx:if="{{determine}}" class="download" src="/static/images/bibliographyList/downloadshiftin.png" mode="" />
            <image wx:else="" class="downloadshiftin" src="/static/images/bibliographyList/download.png" mode="" />
          </view>
        </view>
        <view class="higherTextBox">{{item.name}}</view>
      </view>
    </view>
  </t-tab-panel>
  <t-tab-panel label="教师教育({{teacherTotal}})" value="2">
    <view class="outsideHigherBox">
      <view class="higherBox" wx:for="{{teacherList}}" wx:key="index" wx:for-item="item" wx:for-index="index">
        <view class="outsideHigherImageBox">
          <image class="higherImageBox" src="{{item.icon}}" mode="" />
          <view class="downloadIcon" bind:tap="downloadData" data-item="{{item}}">
            <image wx:if="{{determine}}" class="download" src="/static/images/bibliographyList/downloadshiftin.png" mode="" />
            <image wx:else="" class="downloadshiftin" src="/static/images/bibliographyList/download.png" mode="" />
          </view>
        </view>
        <view class="higherTextBox">{{item.name}}</view>
      </view>
    </view>
  </t-tab-panel>
</t-tabs>
pages/bibliographyList/index.wxss
New file
@@ -0,0 +1,97 @@
/* pages/bibliographyList/index.wxss */
/* .custom-tabs {
  margin-bottom: 32rpx;
}
.custom-panel {
  height: 120px;
} */
.higherBox {
  width: 220rpx;
  /* height: 390rpx; */
  box-shadow: 10rpx 10rpx 10rpx 10rpx rgba(0, 0, 0, 0.08);
  margin: 30rpx 15rpx;
}
.outsideHigherBox {
  display: flex;
  flex-wrap: wrap;
}
.higherImageBox {
  width: 190rpx;
  height: 255rpx;
  margin: 15rpx;
}
.higherTextBox {
  font-weight: bold;
  font-size: 25rpx;
  color: #333333;
  padding: 15rpx;
  margin-bottom: 10rpx;
}
.outsideHigherImageBox {
  position: relative;
}
.downloadIcon {
  width: 34rpx;
  height: 34rpx;
  border-radius: 5rpx 5rpx 5rpx 5rpx;
  background: rgba(0, 0, 0, 0.3);
  position: absolute;
  top: 15rpx;
  right: 15rpx;
  padding: 10rpx;
}
.download {
  /* background-color: #8bc34a; */
  width: 100%;
  height: 100%;
}
.downloadshiftin {
  width: 100%;
  height: 100%;
}
.example-search {
  background-color: #fff;
  padding: 16rpx 32rpx;
}
.search_icones {
  position: absolute;
  font-size: 32rpx;
  height: 32rpx;
  width: 32rpx;
  color: var(--gry-col);
  top: 0px;
  bottom: 0px;
  margin: auto 0;
  padding-left: 30rpx;
  padding-top: 10rpx;
  line-height: 32rpx;
}
/*输入框*/
.nav_input {
  border: 1px solid var(--egry-col);
  border-radius: 40rpx;
  padding-left: 72rpx;
  background-color: var(--whi-col);
  padding-right: 16rpx;
  font-size: 28rpx;
  box-sizing: border-box;
  line-height: 75rpx;
  height: 75rpx;
}
pages/bookExhibitionDetails/index.js
@@ -6,11 +6,11 @@
   * 页面的初始数据
   */
  data: {
    bookName: null,
    bookBeginDate: null,
    bookCreator: null,
    bookContent: null,
    bookImage: null,
    bookName: '',
    bookBeginDate: '',
    bookCreator: '',
    bookContent: '',
    bookImage: '',
    bookExhibitionList: []
  },
pages/bookExhibitionDetails/index.wxss
@@ -1,13 +1,13 @@
/* pages/bookExhibitionDetails/index.wxss */
.headBox {
  /* width: 750rpx; */
  text-align: center;
}
.headBox {}
.titleBox {
  font-weight: 800;
  font-size: 45rpx;
  display: flex;
  justify-content: center;
  padding: 0 30rpx;
  /* text-indent: 6%; */
}
.informationBox {
@@ -51,21 +51,20 @@
  margin: 20rpx;
  background: #FFFFFF;
  box-shadow: 0rpx 0rpx 18rpx 2rpx rgba(0, 0, 0, 0.08);
  padding: 10rpx;
  box-sizing: border-box;
}
.booksImageBox {
  width: 240rpx;
  height: 300rpx;
  margin: 30rpx;
}
.outsideBooksImageBox {
  background: #F5F5F5;
  width: 300rpx;
  width: 100%;
  margin: 0 auto;
  margin-top: 15rpx;
}
.booksTextBox {
pages/bookExhibitionList/index.js
@@ -8,6 +8,8 @@
   * 页面的初始数据
   */
  data: {
    value: '',
    keyword: '',
    nameSort: null,
    total: null,
    page: {
@@ -17,7 +19,6 @@
    keynoteValue: null,
    filteredItems: [],
    newValue: null,
    value: '',
    bookExhibitionList: [],
    sorter: {
      value: 'default',
@@ -138,7 +139,10 @@
    wx.showLoading({
      title: '加载中...',
    })
    let searchObj = {
      'Name*': this.data.keyword,
      '||subtitle*': this.data.keyword
    }
    // console.log(this.data.keynoteValue);
    let sort = {
      Name: this.data.nameSort || 'Desc'
@@ -149,7 +153,8 @@
      queryType: '*',
      fields: {
        jsek_link: [],
        'bookClassification*': this.data.keynoteValue || []
        'bookClassification*': this.data.keynoteValue || [],
        ...searchObj
      },
      paging: this.data.page,
      sort: sort,
@@ -290,13 +295,32 @@
  },
  onSwapRight() {
    // console.log('xxxxxx');
    this.data.nameSort = 'Asc'
    // this.data.nameSort = 'Asc'
    if (!this.data.nameSort) {
      this.setData({
        nameSort: 'Desc',
      });
    } else if (this.data.nameSort == 'Desc') {
      this.setData({
        nameSort: 'Asc',
      });
    } else if (this.data.nameSort == 'Asc') {
      this.setData({
        nameSort: '',
      });
    }
    this.bookExhibitionGet()
  },
  onSwapLeft() {
    this.data.nameSort = 'Desc'
    // console.log('sssssss');
    this.bookExhibitionGet()
  },
  onBookExhibitionDetails: function (event) {
    const item = event.currentTarget.dataset.item;
@@ -304,5 +328,13 @@
    wx.navigateTo({
      url: '/pages/bookExhibitionDetails/index?id=' + item.id // 假设跳转到详情页面,并传递了id参数
    });
  },
  // 搜索框
  onSearchSubmit(e) {
    this.setData({
      keyword: e.detail.value
    })
    console.log(this.data.keyword, 'keyword');
    this.bookExhibitionGet()
  }
})
pages/bookExhibitionList/index.wxml
@@ -5,7 +5,7 @@
<view class="example-search">
  <t-search model:value="{{value}}" placeholder="请输入关键词/书目/ISBN/作者" />
  <t-search model:value="{{value}}" placeholder="请输入关键词/书目/ISBN/作者" bind:submit="onSearchSubmit" />
</view>
@@ -24,24 +24,26 @@
  </t-dropdown-menu>
  <view class="sortBox">
  <view class="sortBox" bind:tap="onSwapRight">
    <text>排序</text>
    <view class="iconBox">
      <t-icon class="swapRight" name="swap-right" size="48rpx" bind:click="onSwapRight" />
      <t-icon class="swapLeft" name="swap-right" size="48rpx" bind:click="onSwapLeft" />
      <t-icon class="swapRight" name="swap-right" size="35rpx" color="{{nameSort == 'Asc' ? '#ff6c00' : ''}}" />
      <t-icon class="swapLeft" name="swap-right" size="35rpx" color="{{nameSort == 'Desc' ? '#ff6c00' : ''}}" />
    </view>
  </view>
</view>
<view class="titleBox">
  <view class="frameBox"></view> <text class="titleTextBox"> 线上书展</text>
</view>
<view class="outside">
  <view class="contentBox" wx:for="{{bookExhibitionList}}" wx:key="index" wx:for-item="item" wx:for-index="index" bindtap="onBookExhibitionDetails" data-item="{{item}}">
    <image wx:if="{{item.icon}}" src="{{item.icon}}" mode="" />
    <image wx:else="" src="./img/banner.png" mode="" />
    <view class="textBox"> <text>{{item.name}}</text></view>
<view class="assembleContent">
  <view class="titleBox">
    <view class="frameBox"></view> <text class="titleTextBox"> 线上书展</text>
  </view>
  <view class="outside">
    <view class="contentBox" wx:for="{{bookExhibitionList}}" wx:key="index" wx:for-item="item" wx:for-index="index" bindtap="onBookExhibitionDetails" data-item="{{item}}">
      <image wx:if="{{item.icon}}" src="{{item.icon}}" mode="" />
      <image wx:else="" src="/static/images/bookExhibitionList/banner.png" mode="" />
      <view class="textBox" title="{{item.name}}"> <text>{{item.name}}</text></view>
    </view>
  </view>
</view>
pages/bookExhibitionList/index.wxss
@@ -7,54 +7,54 @@
  flex-wrap: wrap;
  justify-content: space-between;
  margin: 15px;
}
.contentBox {
  width: 330rpx;
  height: 130rpx;
  /* height: 231rpx; */
  /* border: 1px #000 solid; */
  margin: 10px 0;
  background-color: #fff;
}
image {
  width: 100%;
  height: 85%;
  width: 327rpx;
  height: 128rpx;
}
.textBox {
  width: 280rpx;
  /* height: 75rpx; */
  font-size: 25rpx;
  width: 320rpx;
  font-size: 20rpx;
  /* display: flex;
  justify-content: center; */
  overflow: hidden;
  text-overflow: ellipsis;
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 1;
  text-align: center;
  -webkit-line-clamp: 2;
  /* text-align: center; */
  margin: 20rpx;
}
.example-search {
  width: 300px;
  /* width: 300px; */
  background-color: #fff;
  /* padding: 16rpx 32rpx; */
}
.iconBox {
  transform: rotate(90deg);
  /* margin: 10px;
  margin-right: 20px; */
  margin-left: 30rpx;
  margin-left: 10rpx;
}
.swapRight {
  /* margin-right: 10px; */
  height: 20rpx;
}
.swapLeft {
@@ -62,11 +62,14 @@
}
.sortBox {
  color: #999999;
  display: flex;
  border-bottom: 1px #ededed solid;
  /* border-bottom: 1px #ededed solid; */
  align-items: center;
  height: 86rpx;
  width: 195rpx;
  margin-top: 8rpx;
  font-size: 30rpx;
}
@@ -75,6 +78,7 @@
  display: flex;
  margin: 10px;
  margin-left: 0;
  padding-top: 30rpx;
}
.frameBox {
@@ -94,9 +98,16 @@
.classification {
  width: 550rpx;
  /* margin-bottom: 50rpx; */
}
.menuBox {
  display: flex;
  height: 75rpx;
}
.assembleContent {
  background-color: #F2F3F8;
}
pages/bookServices/assort/index.js
@@ -79,7 +79,9 @@
      sort: { type: 'Asc', field: 'LinkOrder' },
    };
    app.MG.store.getStoreChannelList(query).then((res) => {
      const list = res.datas.filter((item) => item.refCode != 'jsek_homepageBookService');
      this.setData({
        assortList: list,
      });
@@ -118,6 +120,8 @@
      sort: { type: 'Asc', field: 'LinkOrder' },
    };
    app.MG.store.getStoreChannelList(query).then(async (res) => {
      console.log(res, 'res');
      // 一级分类选中
      this.setData({
        startCheck: res.datas[0].refCode,
pages/cart/components/cart-bar/index.js
File was deleted
pages/cart/components/cart-bar/index.json
File was deleted
pages/cart/components/cart-bar/index.wxml
File was deleted
pages/cart/components/cart-bar/index.wxss
File was deleted
pages/cart/components/cart-empty/index.js
File was deleted
pages/cart/components/cart-empty/index.json
File was deleted
pages/cart/components/cart-empty/index.wxml
File was deleted
pages/cart/components/cart-empty/index.wxss
File was deleted
pages/cart/components/cart-group/index.js
File was deleted
pages/cart/components/cart-group/index.json
File was deleted
pages/cart/components/cart-group/index.wxml
File was deleted
pages/cart/components/cart-group/index.wxs
File was deleted
pages/cart/components/cart-group/index.wxss
File was deleted
pages/cart/components/cart-group/utils.wxs
File was deleted
pages/cart/components/goods-card/index.js
File was deleted
pages/cart/components/goods-card/index.json
File was deleted
pages/cart/components/goods-card/index.wxml
File was deleted
pages/cart/components/goods-card/index.wxss
File was deleted
pages/cart/components/specs-popup/index.js
File was deleted
pages/cart/components/specs-popup/index.json
File was deleted
pages/cart/components/specs-popup/index.wxml
File was deleted
pages/cart/components/specs-popup/index.wxss
File was deleted
pages/cart/index.js
@@ -1,294 +1,120 @@
import Dialog from 'tdesign-miniprogram/dialog/index';
import Toast from 'tdesign-miniprogram/toast/index';
import { fetchCartGroupData } from '../../services/cart/cart';
const app = getApp();
// import { getPublicImage } from '@/assets/js/middleGround/tool.js'
import { getPublicImage } from '../../assets/js/middleGround/tool';
Page({
  data: {
    cartGroupData: null,
    imgUrl: [],
    shoppingCartData: [],
    checkAll: false,
    checkedList: [],
    selectedCount: 0,
    totalPrice: 0.00
  },
  // 调用自定义tabbar的init函数,使页面与tabbar激活状态保持一致
  onShow() {
    this.getTabBar().init();
  onLoad(options) {
    wx.setNavigationBarTitle({
      title: '购物车'
    });
    this.shoppingCartGet();
  },
  onLoad() {
    this.refreshData();
  },
  refreshData() {
    this.getCartGroupData().then((res) => {
      let isEmpty = true;
      const cartGroupData = res.data;
      // 一些组件中需要的字段可能接口并没有返回,或者返回的数据结构与预期不一致,需要在此先对数据做一些处理
      // 统计门店下加购的商品是否全选、是否存在缺货/无货
      for (const store of cartGroupData.storeGoods) {
        store.isSelected = true; // 该门店已加购商品是否全选
        store.storeStockShortage = false; // 该门店已加购商品是否存在库存不足
        if (!store.shortageGoodsList) {
          store.shortageGoodsList = []; // 该门店已加购商品如果库存为0需单独分组
        }
        for (const activity of store.promotionGoodsList) {
          activity.goodsPromotionList = activity.goodsPromotionList.filter((goods) => {
            goods.originPrice = undefined;
            // 统计是否有加购数大于库存数的商品
            if (goods.quantity > goods.stockQuantity) {
              store.storeStockShortage = true;
            }
            // 统计是否全选
            if (!goods.isSelected) {
              store.isSelected = false;
            }
            // 库存为0(无货)的商品单独分组
            if (goods.stockQuantity > 0) {
              return true;
            }
            store.shortageGoodsList.push(goods);
            return false;
          });
          if (activity.goodsPromotionList.length > 0) {
            isEmpty = false;
          }
        }
        if (store.shortageGoodsList.length > 0) {
          isEmpty = false;
        }
      }
      cartGroupData.invalidGoodItems = cartGroupData.invalidGoodItems.map((goods) => {
        goods.originPrice = undefined;
        return goods;
      });
      cartGroupData.isNotEmpty = !isEmpty;
      this.setData({ cartGroupData });
  onDelete(e) {
    const item = e.currentTarget.dataset.item;
    app.MG.store.delShoppingCart({
      ids: [item.id]
    }).then(res => {
      this.shoppingCartGet();
      wx.showToast({ title: '你点击了删除', icon: 'none' });
    });
  },
  findGoods(spuId, skuId) {
    let currentStore;
    let currentActivity;
    let currentGoods;
    const { storeGoods } = this.data.cartGroupData;
    for (const store of storeGoods) {
      for (const activity of store.promotionGoodsList) {
        for (const goods of activity.goodsPromotionList) {
          if (goods.spuId === spuId && goods.skuId === skuId) {
            currentStore = store;
            currentActivity = currentActivity;
            currentGoods = goods;
            return {
              currentStore,
              currentActivity,
              currentGoods,
            };
          }
        }
      }
    }
    return {
      currentStore,
      currentActivity,
      currentGoods,
  shoppingCartGet() {
    let query = {
      start: 0,
      size: 999,
      filterList: [],
      searchList: []
    };
  },
  // 注:实际场景时应该调用接口获取购物车数据
  getCartGroupData() {
    const { cartGroupData } = this.data;
    if (!cartGroupData) {
      return fetchCartGroupData();
    }
    return Promise.resolve({ data: cartGroupData });
  },
  // 选择单个商品
  // 注:实际场景时应该调用接口更改选中状态
  selectGoodsService({ spuId, skuId, isSelected }) {
    this.findGoods(spuId, skuId).currentGoods.isSelected = isSelected;
    return Promise.resolve();
  },
  // 全选门店
  // 注:实际场景时应该调用接口更改选中状态
  selectStoreService({ storeId, isSelected }) {
    const currentStore = this.data.cartGroupData.storeGoods.find((s) => s.storeId === storeId);
    currentStore.isSelected = isSelected;
    currentStore.promotionGoodsList.forEach((activity) => {
      activity.goodsPromotionList.forEach((goods) => {
        goods.isSelected = isSelected;
    app.MG.store.getShoppingCartProductList(query).then(res => {
      res.datas.forEach(item => {
        item.imgUrl = getPublicImage(item.productMonWithLinkDto.product.icon, '', '160');
      });
    });
    return Promise.resolve();
  },
  // 加购数量变更
  // 注:实际场景时应该调用接口
  changeQuantityService({ spuId, skuId, quantity }) {
    this.findGoods(spuId, skuId).currentGoods.quantity = quantity;
    return Promise.resolve();
  },
  // 删除加购商品
  // 注:实际场景时应该调用接口
  deleteGoodsService({ spuId, skuId }) {
    function deleteGoods(group) {
      for (const gindex in group) {
        const goods = group[gindex];
        if (goods.spuId === spuId && goods.skuId === skuId) {
          group.splice(gindex, 1);
          return gindex;
        }
      }
      return -1;
    }
    const { storeGoods, invalidGoodItems } = this.data.cartGroupData;
    for (const store of storeGoods) {
      for (const activity of store.promotionGoodsList) {
        if (deleteGoods(activity.goodsPromotionList) > -1) {
          return Promise.resolve();
        }
      }
      if (deleteGoods(store.shortageGoodsList) > -1) {
        return Promise.resolve();
      }
    }
    if (deleteGoods(invalidGoodItems) > -1) {
      return Promise.resolve();
    }
    return Promise.reject();
  },
  // 清空失效商品
  // 注:实际场景时应该调用接口
  clearInvalidGoodsService() {
    this.data.cartGroupData.invalidGoodItems = [];
    return Promise.resolve();
  },
  onGoodsSelect(e) {
    const {
      goods: { spuId, skuId },
      isSelected,
    } = e.detail;
    const { currentGoods } = this.findGoods(spuId, skuId);
    Toast({
      context: this,
      selector: '#t-toast',
      message: `${isSelected ? '选择' : '取消'}"${
        currentGoods.title.length > 5 ? `${currentGoods.title.slice(0, 5)}...` : currentGoods.title
      }"`,
      icon: '',
    });
    this.selectGoodsService({ spuId, skuId, isSelected }).then(() => this.refreshData());
  },
  onStoreSelect(e) {
    const {
      store: { storeId },
      isSelected,
    } = e.detail;
    this.selectStoreService({ storeId, isSelected }).then(() => this.refreshData());
  },
  onQuantityChange(e) {
    const {
      goods: { spuId, skuId },
      quantity,
    } = e.detail;
    const { currentGoods } = this.findGoods(spuId, skuId);
    const stockQuantity = currentGoods.stockQuantity > 0 ? currentGoods.stockQuantity : 0; // 避免后端返回的是-1
    // 加购数量超过库存数量
    if (quantity > stockQuantity) {
      // 加购数量等于库存数量的情况下继续加购
      if (currentGoods.quantity === stockQuantity && quantity - stockQuantity === 1) {
        Toast({
          context: this,
          selector: '#t-toast',
          message: '当前商品库存不足',
        });
        return;
      }
      Dialog.confirm({
        title: '商品库存不足',
        content: `当前商品库存不足,最大可购买数量为${stockQuantity}件`,
        confirmBtn: '修改为最大可购买数量',
        cancelBtn: '取消',
      })
        .then(() => {
          this.changeQuantityService({
            spuId,
            skuId,
            quantity: stockQuantity,
          }).then(() => this.refreshData());
        })
        .catch(() => {});
      return;
    }
    this.changeQuantityService({ spuId, skuId, quantity }).then(() => this.refreshData());
  },
  goCollect() {
    /** 活动肯定有一个活动ID,用来获取活动banner,活动商品列表等 */
    const promotionID = '123';
    wx.navigateTo({
      url: `/pages/promotion-detail/index?promotion_id=${promotionID}`,
    });
  },
  goGoodsDetail(e) {
    const { spuId, storeId } = e.detail.goods;
    wx.navigateTo({
      url: `/pages/goods/details/index?spuId=${spuId}&storeId=${storeId}`,
    });
  },
  clearInvalidGoods() {
    // 实际场景时应该调用接口清空失效商品
    this.clearInvalidGoodsService().then(() => this.refreshData());
  },
  onGoodsDelete(e) {
    const {
      goods: { spuId, skuId },
    } = e.detail;
    Dialog.confirm({
      content: '确认删除该商品吗?',
      confirmBtn: '确定',
      cancelBtn: '取消',
    }).then(() => {
      this.deleteGoodsService({ spuId, skuId }).then(() => {
        Toast({ context: this, selector: '#t-toast', message: '商品删除成功' });
        this.refreshData();
      this.setData({
        shoppingCartData: res.datas
      });
    });
  },
  onSelectAll(event) {
    const { isAllSelected } = event?.detail ?? {};
    Toast({
      context: this,
      selector: '#t-toast',
      message: `${isAllSelected ? '取消' : '点击'}了全选按钮`,
  bottomChange(e) {
    const checked = e.detail.value.length > 0;
    const items = this.data.shoppingCartData.map(item => {
      item.checked = checked;
      return item;
    });
    // 调用接口改变全选
    this.setData({
      shoppingCartData: items,
      checkAll: checked
    });
    this.calculateSelectedCount();
    this.calculateTotalPrice();
  },
  onToSettle() {
    const goodsRequestList = [];
    this.data.cartGroupData.storeGoods.forEach((store) => {
      store.promotionGoodsList.forEach((promotion) => {
        promotion.goodsPromotionList.forEach((m) => {
          if (m.isSelected == 1) {
            goodsRequestList.push(m);
          }
        });
      });
  HandelItemChange(e) {
    const { item } = e.target.dataset;
    const items = this.data.shoppingCartData
    items.map(eitem => {
      if (eitem.id == item.id) {
        eitem.checked = e.detail.checked
      }
    })
    const data = items.filter(item => item.checked)
    const checkAll = data.length == this.data.shoppingCartData.length
    this.setData({
      shoppingCartData: items,
      checkAll
    });
    wx.setStorageSync('order.goodsRequestList', JSON.stringify(goodsRequestList));
    wx.navigateTo({ url: '/pages/order/order-confirm/index?type=cart' });
    this.calculateSelectedCount();
    this.calculateTotalPrice();
  },
  onGotoHome() {
    wx.switchTab({ url: '/pages/home/home' });
  calculateSelectedCount() {
    const selectedItems = this.data.shoppingCartData.filter(item => item.checked);
    const selectedCount = selectedItems.length;
    this.setData({
      selectedCount
    });
  },
  calculateTotalPrice() {
    const selectedItems = this.data.shoppingCartData.filter(item => item.checked);
    const totalPrice = selectedItems.reduce((total, item) => total + parseFloat(item.saleMethod.price), 0);
    this.setData({
      totalPrice: totalPrice.toFixed(2)
    });
  },
  goPaymentPage() {
    const selectedItems = this.data.shoppingCartData.filter(item => item.checked);
    console.log(selectedItems, 789);
    const selectedIds = selectedItems.map(item => item.id);
    console.log('选中的商品 id:', selectedIds);
    app.MG.store.shoppingCartCreateOrder({ linkIds: selectedIds }).then(res => {
      console.log(res.orderNumber, 456);
      const url = '/pages/cart/paymentPage/index?orderNumber=' + res.orderNumber
      wx.navigateTo({
        url
      });
    })
  }
});
pages/cart/index.json
@@ -1,10 +1,9 @@
{
  "navigationBarTitleText": "购物车",
  "component": true,
  "usingComponents": {
    "cart-group": "./components/cart-group/index",
    "cart-empty": "./components/cart-empty/index",
    "cart-bar": "./components/cart-bar/index",
    "t-toast": "tdesign-miniprogram/toast/toast",
    "t-dialog": "tdesign-miniprogram/dialog/dialog"
    "t-checkbox": "tdesign-miniprogram/checkbox/checkbox",
    "t-swipe-cell": "tdesign-miniprogram/swipe-cell/swipe-cell",
    "t-cell": "tdesign-miniprogram/cell/cell",
    "t-button": "tdesign-miniprogram/button/button"
  }
}
pages/cart/index.wxml
@@ -1,31 +1,38 @@
<!-- 分层购物车 -->
<block wx:if="{{cartGroupData.isNotEmpty}}">
  <cart-group
    store-goods="{{ cartGroupData.storeGoods }}"
    invalid-good-items="{{ cartGroupData.invalidGoodItems }}"
    bindselectgoods="onGoodsSelect"
    bindselectstore="onStoreSelect"
    bindchangequantity="onQuantityChange"
    bindgocollect="goCollect"
    bindgoodsclick="goGoodsDetail"
    bindclearinvalidgoods="clearInvalidGoods"
    binddelete="onGoodsDelete"
  />
<view class="outsideContentBox">
  <!-- <checkbox-group bindchange="HandelItemChange"> -->
  <t-swipe-cell wx:for="{{shoppingCartData}}" wx:key="index" wx:for-item="item" wx:for-index="index">
    <!-- <view class="contentBox"> -->
    <!-- <view class="contentCheckbox">
          <checkbox value="{{item.id}}" checked="{{item.checked}}"></checkbox>
        </view> -->
    <view class="itemWarp">
      <t-cell bordered="{{false}}" title="{{item.productMonWithLinkDto.product.name}}" description="¥{{item.saleMethod.price}}">
        <view slot="left-icon" class="left-icon">
          <view class="contentCheckbox">
            <t-checkbox icon="rectangle" value=" {{item.id}}" data-item="{{item}}" checked="{{item.checked}}" bindchange="HandelItemChange" />
          </view>
          <view class="left-image">
            <image src="{{item.imgUrl}}" class="imageStyle" mode="" />
          </view>
        </view>
      </t-cell>
    </view>
    <!-- </view> -->
    <view slot="right" class="btn delete-btn" bind:tap="onDelete" data-item="{{item}}">删除</view>
  </t-swipe-cell>
  <!-- </checkbox-group> -->
</view>
  <view class="gap" />
  <!-- 商品小计以及结算按钮 -->
  <cart-bar
    is-all-selected="{{cartGroupData.isAllSelected}}"
    total-amount="{{cartGroupData.totalAmount}}"
    total-goods-num="{{cartGroupData.selectedGoodsCount}}"
    total-discount-amount="{{cartGroupData.totalDiscountAmount}}"
    fixed="{{true}}"
    bottomHeight="{{112}}"
    bindhandleSelectAll="onSelectAll"
    bindhandleToSettle="onToSettle"
  />
</block>
<!-- 购物车空态 -->
<cart-empty wx:else bind:handleClick="onGotoHome" />
<t-toast id="t-toast" />
<t-dialog id="t-dialog" />
<view class="bottomBox">
  <view class="checkGroupBox">
    <checkbox-group bindchange="bottomChange">
      <checkbox value="全选" checked="{{checkAll}}">全选</checkbox>
    </checkbox-group>
  </view>
  <view class="settlementBox">
    <view class="totalPrice">总价:<text class="totalPriceText">¥{{totalPrice}}</text></view>
    <view class="buttonBox">
      <t-button class="tButtonBox" size="small" shape="round" bind:tap="goPaymentPage">去结算({{selectedCount}})</t-button>
    </view>
  </view>
</view>
pages/cart/index.wxss
@@ -1,13 +1,169 @@
:host {
  padding-bottom: 100rpx;
/* pages/cart/item.wxss */
.btn-wrapper {
  height: 100%;
}
.gap {
  height: 100rpx;
.btn {
  display: inline-flex;
  justify-content: center;
  align-items: center;
  width: 120rpx;
  height: 100%;
  color: white;
}
.delete-btn {
  background-color: #e34d59;
}
.edit-btn {
  background-color: #ed7b2f;
}
.favor-btn {
  background-color: #0052d9;
}
.outsideContentBox {
  padding: 30rpx;
  background: #F2F3F8;
  border-radius: 18rpx 18rpx 18rpx 18rpx;
  padding-bottom: 230rpx;
  /* height: 260rpx; */
}
.bottomBox {
  background-color: #0052d9;
  position: fixed;
  bottom: 0;
  left: 0;
  right: 0;
  padding-bottom: 53px;
  height: 112rpx;
  background: #FFFFFF;
  box-shadow: 0rpx -2rpx 0rpx 2rpx rgba(0, 0, 0, 0.08);
  display: flex;
  align-items: center;
}
.checkGroupBox {
  /* flex: 1; */
  margin: 0 30rpx;
  width: 120rpx;
}
.settlementBox {
  /* width: 100%; */
  display: flex;
  align-items: center;
  /* justify-content: space-between; */
}
.totalPrice {
  /* margin: 0 50rpx; */
}
.buttonBox {
  /* margin: 0 30rpx; */
  margin-left: 140rpx;
}
.tButtonBox {
  background-color: #FF6C00;
  width: 200rpx;
  height: 80rpx;
}
checkbox .wx-checkbox-input {
  /* border-radius: 50%; */
  /* 圆角 */
  /* width: 46rpx; */
  /* 背景的宽 */
  /* height: 46rpx; */
  /* 背景的高 */
  width: 30rpx;
  height: 30rpx;
}
/* 选中后的 背景样式*/
checkbox .wx-checkbox-input.wx-checkbox-input-checked {
  border: 1rpx solid #FF6C00;
  background: #FF6C00;
}
checkbox .wx-checkbox-input.wx-checkbox-input-checked::before {
  border-radius: 50%;
  /* 圆角 */
  width: 40rpx;
  /* 选中后对勾大小,不要超过背景的尺寸 */
  height: 40rpx;
  /* 选中后对勾大小,不要超过背景的尺寸 */
  line-height: 40rpx;
  text-align: center;
  font-size: 30rpx;
  /* 对勾大小 30rpx */
  color: #fff;
  /* 对勾颜色 白色 */
  background: transparent;
  transform: translate(-50%, -50%) scale(1);
  -webkit-transform: translate(-50%, -50%) scale(1);
}
.contentBox {
  display: flex;
  align-items: center;
  background-color: #fff;
  margin: 30rpx 0;
  border-radius: 18rpx 18rpx 18rpx 18rpx;
  height: 260rpx;
}
.totalPriceText {
  color: #FF6C00;
}
.LaelBox {
  margin: 50rpx;
}
.itemWarp {
  margin: 15rpx 0;
}
.t-cell {
  border-radius: 18rpx;
}
.t-cell__left-image {
  width: 150rpx;
  height: 210rpx;
}
.contentCheckbox {
  width: 100rpx;
}
.left-icon {
  display: flex;
  justify-content: flex-start;
  align-items: center;
}
.left-image {
  width: 152rpx;
  height: 212rpx;
  background: #FFFFFF;
  border-radius: 0rpx 0rpx 0rpx 0rpx;
}
.imageStyle {
  width: 100%;
}
.t-button {
  --td-button-default-color: #000;
  --td-button-primary-text-color: #fa4126;
}
  height: 100%;
}
pages/cart/paymentPage/index.js
New file
@@ -0,0 +1,200 @@
// pages/cart/paymentPage/index.js
const app = getApp()
import { getPublicImage } from '../../../assets/js/middleGround/tool';
import drawQrcode from './js/weapp.qrcode'
Page({
  /**
   * 页面的初始数据
   */
  data: {
    orderNumber: null,
    navBarHeight: '',
    barHeight: '',
    selectedIds: '',
    purchasedIds: [],
    productList: [],
    payPrice: '',
    drawQrcodeText: 'https://www.baidu.com/',
    orderGoods: '',
    confirmBtn: { content: '确定', variant: 'base' },
    dialogKey: 'false',
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {
    const systInfo = wx.getSystemInfoSync();
    const menu = wx.getMenuButtonBoundingClientRect(); // 胶囊信息
    const navBarHeight = (menu.top - systInfo.statusBarHeight) * 2 + menu.height; // 导航栏高度
    this.setData({
      orderNumber: options.orderNumber,
      navBarHeight: navBarHeight,
      barHeight: systInfo.statusBarHeight,
      selectedIds: options.selectedIds
    })
    console.log('接收到的订单号:', this.data.orderNumber);
    this.getOrderByOrderNum()
    drawQrcode({
      width: 200, // 必须,二维码宽度,与canvas的width保持一致
      height: 200, // 必须,二维码高度,与canvas的height保持一致
      canvasId: 'myQrcode',
      background: '#ffffff', //    非必须,二维码背景颜色,默认值白色
      foreground: '#2bb15e', // 非必须,二维码前景色,默认值黑色     '#000000'
      // ctx: wx.createCanvasContext('myQrcode'), // 非必须,绘图上下文,可通过 wx.createCanvasContext('canvasId') 获取,v1.0.0+版本支持
      text: this.data.drawQrcodeText,  // 必须,二维码内容
      // v1.0.0+版本支持在二维码上绘制图片
      image: {
        // imageResource: '../../images/icon.png', // 指定二维码小图标
        dx: 70,
        dy: 70,
        dWidth: 60,
        dHeight: 60
      }
    })
  },
  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady() {
  },
  /**
   * 生命周期函数--监听页面显示
   */
  onShow() {
  },
  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide() {
  },
  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload() {
  },
  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh() {
  },
  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom() {
  },
  /**
   * 用户点击右上角分享
   */
  onShareAppMessage() {
  },
  goBack() {
    wx.navigateBack();
  },
  getOrderByOrderNum() {
    let query = {
      orderNum: this.data.orderNumber,
      fields: {
        content: [],
        subtitle: [],
      }
    }
    app.MG.store.getOrderByOrderNum(query).then(res => {
      this.setData({
        orderGoods: res.orderNumber
      })
      console.log(this.data.orderGoods, 'res.orderNumber');
      console.log(res.payPrice);
      this.setData({
        payPrice: res.payPrice.toFixed(2)
      })
      res.saleMethodLinks.forEach(item => {
        item.paymentIcon = getPublicImage(item.orderSaleMethod.product.icon)
        this.setData({
          productList: res.saleMethodLinks
        })
      })
    })
  },
  confirmOrderGet() {
    let query = {
      orderNum: this.data.orderGoods
    }
    app.MG.store.confirmOrder(query).then(res => {
      this.makeWeChatQrPayGet()
    })
    // 调取微信二维码支付
  },
  // 调取微信二维码支付
  makeWeChatQrPayGet() {
    let query = {
      orderNum: this.data.orderGoods
    }
    app.MG.store.makeWeChatQrPay(query).then((res) => {
      this.setData({
        drawQrcodeText: res
      })
      this.data.dialogKey = true
      console.log(this.data.drawQrcodeText, 'drawQrcodeText');
    })
  },
  showDialog(e) {
    const { key } = e.currentTarget.dataset;
    this.setData({ [key]: true, dialogKey: key });
  },
  closeDialog() {
    const { dialogKey } = this.data;
    this.setData({ [dialogKey]: false });
  },
})
pages/cart/paymentPage/index.json
New file
@@ -0,0 +1,10 @@
{
  "component": true,
  "usingComponents": {
    "t-icon": "tdesign-miniprogram/icon/icon",
    "t-button": "tdesign-miniprogram/button/button",
    "t-dialog": "tdesign-miniprogram/dialog/dialog"
  },
  "navigationStyle": "custom"
}
pages/cart/paymentPage/index.wxml
New file
@@ -0,0 +1,74 @@
<!--pages/cart/paymentPage/index.wxml-->
<view style="width: 100%; height: {{barHeight}}px; "></view>
<view class="nacigationBar" style="width: 70%; height: {{navBarHeight}}px;">
  <view>
    <t-icon name="chevron-left" size="30" data-name="{{item}}" bind:click="goBack" />
  </view>
  <view class="navbar-title">提交订单</view>
</view>
<view class="content">
  <t-button t-class="wrapper" theme="primary" size="large" variant="outline" data-key="showCloseBtn" bind:tap="showDialog" block>
    带关闭按钮
  </t-button>
  <t-dialog visible="{{showCloseBtn}}" close-btn bind:confirm="closeDialog" bind:cancel="closeDialog">
    <view slot="content" class="slotContent">
      <view class="myQrcodeBox">
        <canvas style="width: 200px; height: 200px;margin:0 auto" canvas-id="myQrcode"></canvas>
        <view class="myQrcodeTextBox">微信扫码支付</view>
      </view>
    </view>
  </t-dialog>
  <view class="shoppingCartList">
    <view class="cartList" wx:for="{{productList}}" wx:key="index" wx:for-item="item" wx:for-index="index">
      <image src="{{item.paymentIcon }}" mode="" />
      <view class="cartListContent">
        <view class="cartListDetails">{{item.orderSaleMethod.product.name}}</view>
        <view class="textBox">图书服务-电子书</view>
        <view class="priceBox">¥{{item.payPrice}}</view>
      </view>
    </view>
  </view>
  <view class="priceBreakdown">
    <view class="priceBreakdownContent">价格明细</view>
    <view class="amountMoney">
      <view>商品金额</view>
      <view>¥{{payPrice}}</view>
    </view>
    <view class="amount">
      <view>合计:¥{{payPrice}}</view>
    </view>
  </view>
  <view class="interval"></view>
  <view class="paymentBox">
    <view class="residue">待支付:<text class="residueTextBox">¥{{payPrice}}</text></view>
    <view>
      <t-button class="buttonBox" shape="round" bind:tap="confirmOrderGet">微信支付</t-button>
    </view>
  </view>
</view>
pages/cart/paymentPage/index.wxss
New file
@@ -0,0 +1,144 @@
/* pages/cart/paymentPage/index.wxss */
.nacigationBar {
  background-color: #fff;
  display: flex;
  align-items: center;
}
.navbar-title {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  color: #0F1214;
  font-size: 40rpx;
  font-weight: bold;
  margin-bottom: 5rpx;
}
.content {
  width: 100%;
  height: 1250rpx;
  background-color: #F2F3F8;
  padding: 40rpx 0;
  padding-top: 1rpx;
}
.shoppingCartList {
  height: 1000rpx;
  background: #FFFFFF;
  border-radius: 20px;
  margin: 30rpx 0;
}
image {
  width: 150rpx;
  height: 210rpx;
  margin: 30rpx;
}
.cartListContent {
  /* margin: 0 auto; */
}
.cartList {
  display: flex;
}
.cartListContent {
  margin-top: 30rpx;
}
.cartListDetails {
  margin-bottom: 50rpx;
  font-family: PingFang SC, PingFang SC;
  font-weight: bold;
  font-size: 29rpx;
  color: #333333;
}
.textBox {
  font-family: PingFang SC, PingFang SC;
  font-weight: 400;
  font-size: 25rpx;
  color: #333333;
  /* margin: 10rpx 0; */
  margin-bottom: 20rpx;
}
.priceBox {
  font-weight: 500;
  font-size: 31rpx;
  color: #0F1214;
}
.priceBreakdown {
  height: 280rpx;
  background: #fff;
  padding: 30rpx;
}
.priceBreakdownContent {
  font-weight: bold;
  font-size: 32rpx;
  color: #0F1214;
  margin-bottom: 50rpx;
}
.amountMoney {
  display: flex;
  justify-content: space-between;
  font-weight: 500;
  font-size: 33rpx;
  color: #0F1214;
  border-bottom: 2rpx solid #EDEDED;
  padding-bottom: 38rpx;
}
.amount {
  display: flex;
  justify-content: flex-end;
  margin: 30rpx 0;
}
.interval {
  width: 100%;
  height: 30rpx;
  background-color: #F2F3F8;
}
.paymentBox {
  /* margin-top: 50rpx; */
  display: flex;
  justify-content: space-between;
  padding: 30rpx;
  align-items: center;
}
.residue {
  color: #949494;
}
.residueTextBox {
  font-weight: bold;
  font-size: 38rpx;
  color: #FF6C00;
}
.buttonBox {
  background-color: #FF6C00;
  border: #fff;
}
.myQrcodeBox {
  margin: 30rpx;
}
.myQrcodeTextBox {
  text-align: center;
  margin: 30rpx 0;
}
pages/cart/paymentPage/js/weapp.qrcode.js
New file
@@ -0,0 +1,1281 @@
/**
 * weapp.qrcode.js v1.0.0 (https://github.com/yingye/weapp-qrcode#readme)
 */
(function (global, factory) {
    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
    typeof define === 'function' && define.amd ? define(factory) :
    (global.drawQrcode = factory());
}(this, (function () { 'use strict';
var hasOwn = Object.prototype.hasOwnProperty;
var toStr = Object.prototype.toString;
var defineProperty = Object.defineProperty;
var gOPD = Object.getOwnPropertyDescriptor;
var isArray = function isArray(arr) {
    if (typeof Array.isArray === 'function') {
        return Array.isArray(arr);
    }
    return toStr.call(arr) === '[object Array]';
};
var isPlainObject = function isPlainObject(obj) {
    if (!obj || toStr.call(obj) !== '[object Object]') {
        return false;
    }
    var hasOwnConstructor = hasOwn.call(obj, 'constructor');
    var hasIsPrototypeOf = obj.constructor && obj.constructor.prototype && hasOwn.call(obj.constructor.prototype, 'isPrototypeOf');
    // Not own constructor property must be Object
    if (obj.constructor && !hasOwnConstructor && !hasIsPrototypeOf) {
        return false;
    }
    // Own properties are enumerated firstly, so to speed up,
    // if last one is own, then all properties are own.
    var key;
    for (key in obj) { /**/ }
    return typeof key === 'undefined' || hasOwn.call(obj, key);
};
// If name is '__proto__', and Object.defineProperty is available, define __proto__ as an own property on target
var setProperty = function setProperty(target, options) {
    if (defineProperty && options.name === '__proto__') {
        defineProperty(target, options.name, {
            enumerable: true,
            configurable: true,
            value: options.newValue,
            writable: true
        });
    } else {
        target[options.name] = options.newValue;
    }
};
// Return undefined instead of __proto__ if '__proto__' is not an own property
var getProperty = function getProperty(obj, name) {
    if (name === '__proto__') {
        if (!hasOwn.call(obj, name)) {
            return void 0;
        } else if (gOPD) {
            // In early versions of node, obj['__proto__'] is buggy when obj has
            // __proto__ as an own property. Object.getOwnPropertyDescriptor() works.
            return gOPD(obj, name).value;
        }
    }
    return obj[name];
};
var extend = function extend() {
    var options, name, src, copy, copyIsArray, clone;
    var target = arguments[0];
    var i = 1;
    var length = arguments.length;
    var deep = false;
    // Handle a deep copy situation
    if (typeof target === 'boolean') {
        deep = target;
        target = arguments[1] || {};
        // skip the boolean and the target
        i = 2;
    }
    if (target == null || (typeof target !== 'object' && typeof target !== 'function')) {
        target = {};
    }
    for (; i < length; ++i) {
        options = arguments[i];
        // Only deal with non-null/undefined values
        if (options != null) {
            // Extend the base object
            for (name in options) {
                src = getProperty(target, name);
                copy = getProperty(options, name);
                // Prevent never-ending loop
                if (target !== copy) {
                    // Recurse if we're merging plain objects or arrays
                    if (deep && copy && (isPlainObject(copy) || (copyIsArray = isArray(copy)))) {
                        if (copyIsArray) {
                            copyIsArray = false;
                            clone = src && isArray(src) ? src : [];
                        } else {
                            clone = src && isPlainObject(src) ? src : {};
                        }
                        // Never move original objects, clone them
                        setProperty(target, { name: name, newValue: extend(deep, clone, copy) });
                    // Don't bring in undefined values
                    } else if (typeof copy !== 'undefined') {
                        setProperty(target, { name: name, newValue: copy });
                    }
                }
            }
        }
    }
    // Return the modified object
    return target;
};
//---------------------------------------------------------------------
// QRCode for JavaScript
//
// Copyright (c) 2009 Kazuhiko Arase
//
// URL: http://www.d-project.com/
//
// Licensed under the MIT license:
//   http://www.opensource.org/licenses/mit-license.php
//
// The word "QR Code" is registered trademark of
// DENSO WAVE INCORPORATED
//   http://www.denso-wave.com/qrcode/faqpatent-e.html
//
//---------------------------------------------------------------------
//---------------------------------------------------------------------
// QR8bitByte
//---------------------------------------------------------------------
function QR8bitByte(data) {
  this.mode = QRMode.MODE_8BIT_BYTE;
  this.data = data;
}
QR8bitByte.prototype = {
  getLength: function (buffer) {
    return this.data.length;
  },
  write: function (buffer) {
    for (var i = 0; i < this.data.length; i++) {
      // not JIS ...
      buffer.put(this.data.charCodeAt(i), 8);
    }
  }
};
//---------------------------------------------------------------------
// QRCode
//---------------------------------------------------------------------
function QRCode(typeNumber, errorCorrectLevel) {
  this.typeNumber = typeNumber;
  this.errorCorrectLevel = errorCorrectLevel;
  this.modules = null;
  this.moduleCount = 0;
  this.dataCache = null;
  this.dataList = new Array();
}
QRCode.prototype = {
  addData: function (data) {
    var newData = new QR8bitByte(data);
    this.dataList.push(newData);
    this.dataCache = null;
  },
  isDark: function (row, col) {
    if (row < 0 || this.moduleCount <= row || col < 0 || this.moduleCount <= col) {
      throw new Error(row + "," + col);
    }
    return this.modules[row][col];
  },
  getModuleCount: function () {
    return this.moduleCount;
  },
  make: function () {
    // Calculate automatically typeNumber if provided is < 1
    if (this.typeNumber < 1) {
      var typeNumber = 1;
      for (typeNumber = 1; typeNumber < 40; typeNumber++) {
        var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, this.errorCorrectLevel);
        var buffer = new QRBitBuffer();
        var totalDataCount = 0;
        for (var i = 0; i < rsBlocks.length; i++) {
          totalDataCount += rsBlocks[i].dataCount;
        }
        for (var i = 0; i < this.dataList.length; i++) {
          var data = this.dataList[i];
          buffer.put(data.mode, 4);
          buffer.put(data.getLength(), QRUtil.getLengthInBits(data.mode, typeNumber));
          data.write(buffer);
        }
        if (buffer.getLengthInBits() <= totalDataCount * 8) break;
      }
      this.typeNumber = typeNumber;
    }
    this.makeImpl(false, this.getBestMaskPattern());
  },
  makeImpl: function (test, maskPattern) {
    this.moduleCount = this.typeNumber * 4 + 17;
    this.modules = new Array(this.moduleCount);
    for (var row = 0; row < this.moduleCount; row++) {
      this.modules[row] = new Array(this.moduleCount);
      for (var col = 0; col < this.moduleCount; col++) {
        this.modules[row][col] = null; //(col + row) % 3;
      }
    }
    this.setupPositionProbePattern(0, 0);
    this.setupPositionProbePattern(this.moduleCount - 7, 0);
    this.setupPositionProbePattern(0, this.moduleCount - 7);
    this.setupPositionAdjustPattern();
    this.setupTimingPattern();
    this.setupTypeInfo(test, maskPattern);
    if (this.typeNumber >= 7) {
      this.setupTypeNumber(test);
    }
    if (this.dataCache == null) {
      this.dataCache = QRCode.createData(this.typeNumber, this.errorCorrectLevel, this.dataList);
    }
    this.mapData(this.dataCache, maskPattern);
  },
  setupPositionProbePattern: function (row, col) {
    for (var r = -1; r <= 7; r++) {
      if (row + r <= -1 || this.moduleCount <= row + r) continue;
      for (var c = -1; c <= 7; c++) {
        if (col + c <= -1 || this.moduleCount <= col + c) continue;
        if (0 <= r && r <= 6 && (c == 0 || c == 6) || 0 <= c && c <= 6 && (r == 0 || r == 6) || 2 <= r && r <= 4 && 2 <= c && c <= 4) {
          this.modules[row + r][col + c] = true;
        } else {
          this.modules[row + r][col + c] = false;
        }
      }
    }
  },
  getBestMaskPattern: function () {
    var minLostPoint = 0;
    var pattern = 0;
    for (var i = 0; i < 8; i++) {
      this.makeImpl(true, i);
      var lostPoint = QRUtil.getLostPoint(this);
      if (i == 0 || minLostPoint > lostPoint) {
        minLostPoint = lostPoint;
        pattern = i;
      }
    }
    return pattern;
  },
  createMovieClip: function (target_mc, instance_name, depth) {
    var qr_mc = target_mc.createEmptyMovieClip(instance_name, depth);
    var cs = 1;
    this.make();
    for (var row = 0; row < this.modules.length; row++) {
      var y = row * cs;
      for (var col = 0; col < this.modules[row].length; col++) {
        var x = col * cs;
        var dark = this.modules[row][col];
        if (dark) {
          qr_mc.beginFill(0, 100);
          qr_mc.moveTo(x, y);
          qr_mc.lineTo(x + cs, y);
          qr_mc.lineTo(x + cs, y + cs);
          qr_mc.lineTo(x, y + cs);
          qr_mc.endFill();
        }
      }
    }
    return qr_mc;
  },
  setupTimingPattern: function () {
    for (var r = 8; r < this.moduleCount - 8; r++) {
      if (this.modules[r][6] != null) {
        continue;
      }
      this.modules[r][6] = r % 2 == 0;
    }
    for (var c = 8; c < this.moduleCount - 8; c++) {
      if (this.modules[6][c] != null) {
        continue;
      }
      this.modules[6][c] = c % 2 == 0;
    }
  },
  setupPositionAdjustPattern: function () {
    var pos = QRUtil.getPatternPosition(this.typeNumber);
    for (var i = 0; i < pos.length; i++) {
      for (var j = 0; j < pos.length; j++) {
        var row = pos[i];
        var col = pos[j];
        if (this.modules[row][col] != null) {
          continue;
        }
        for (var r = -2; r <= 2; r++) {
          for (var c = -2; c <= 2; c++) {
            if (r == -2 || r == 2 || c == -2 || c == 2 || r == 0 && c == 0) {
              this.modules[row + r][col + c] = true;
            } else {
              this.modules[row + r][col + c] = false;
            }
          }
        }
      }
    }
  },
  setupTypeNumber: function (test) {
    var bits = QRUtil.getBCHTypeNumber(this.typeNumber);
    for (var i = 0; i < 18; i++) {
      var mod = !test && (bits >> i & 1) == 1;
      this.modules[Math.floor(i / 3)][i % 3 + this.moduleCount - 8 - 3] = mod;
    }
    for (var i = 0; i < 18; i++) {
      var mod = !test && (bits >> i & 1) == 1;
      this.modules[i % 3 + this.moduleCount - 8 - 3][Math.floor(i / 3)] = mod;
    }
  },
  setupTypeInfo: function (test, maskPattern) {
    var data = this.errorCorrectLevel << 3 | maskPattern;
    var bits = QRUtil.getBCHTypeInfo(data);
    // vertical
    for (var i = 0; i < 15; i++) {
      var mod = !test && (bits >> i & 1) == 1;
      if (i < 6) {
        this.modules[i][8] = mod;
      } else if (i < 8) {
        this.modules[i + 1][8] = mod;
      } else {
        this.modules[this.moduleCount - 15 + i][8] = mod;
      }
    }
    // horizontal
    for (var i = 0; i < 15; i++) {
      var mod = !test && (bits >> i & 1) == 1;
      if (i < 8) {
        this.modules[8][this.moduleCount - i - 1] = mod;
      } else if (i < 9) {
        this.modules[8][15 - i - 1 + 1] = mod;
      } else {
        this.modules[8][15 - i - 1] = mod;
      }
    }
    // fixed module
    this.modules[this.moduleCount - 8][8] = !test;
  },
  mapData: function (data, maskPattern) {
    var inc = -1;
    var row = this.moduleCount - 1;
    var bitIndex = 7;
    var byteIndex = 0;
    for (var col = this.moduleCount - 1; col > 0; col -= 2) {
      if (col == 6) col--;
      while (true) {
        for (var c = 0; c < 2; c++) {
          if (this.modules[row][col - c] == null) {
            var dark = false;
            if (byteIndex < data.length) {
              dark = (data[byteIndex] >>> bitIndex & 1) == 1;
            }
            var mask = QRUtil.getMask(maskPattern, row, col - c);
            if (mask) {
              dark = !dark;
            }
            this.modules[row][col - c] = dark;
            bitIndex--;
            if (bitIndex == -1) {
              byteIndex++;
              bitIndex = 7;
            }
          }
        }
        row += inc;
        if (row < 0 || this.moduleCount <= row) {
          row -= inc;
          inc = -inc;
          break;
        }
      }
    }
  }
};
QRCode.PAD0 = 0xEC;
QRCode.PAD1 = 0x11;
QRCode.createData = function (typeNumber, errorCorrectLevel, dataList) {
  var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, errorCorrectLevel);
  var buffer = new QRBitBuffer();
  for (var i = 0; i < dataList.length; i++) {
    var data = dataList[i];
    buffer.put(data.mode, 4);
    buffer.put(data.getLength(), QRUtil.getLengthInBits(data.mode, typeNumber));
    data.write(buffer);
  }
  // calc num max data.
  var totalDataCount = 0;
  for (var i = 0; i < rsBlocks.length; i++) {
    totalDataCount += rsBlocks[i].dataCount;
  }
  if (buffer.getLengthInBits() > totalDataCount * 8) {
    throw new Error("code length overflow. (" + buffer.getLengthInBits() + ">" + totalDataCount * 8 + ")");
  }
  // end code
  if (buffer.getLengthInBits() + 4 <= totalDataCount * 8) {
    buffer.put(0, 4);
  }
  // padding
  while (buffer.getLengthInBits() % 8 != 0) {
    buffer.putBit(false);
  }
  // padding
  while (true) {
    if (buffer.getLengthInBits() >= totalDataCount * 8) {
      break;
    }
    buffer.put(QRCode.PAD0, 8);
    if (buffer.getLengthInBits() >= totalDataCount * 8) {
      break;
    }
    buffer.put(QRCode.PAD1, 8);
  }
  return QRCode.createBytes(buffer, rsBlocks);
};
QRCode.createBytes = function (buffer, rsBlocks) {
  var offset = 0;
  var maxDcCount = 0;
  var maxEcCount = 0;
  var dcdata = new Array(rsBlocks.length);
  var ecdata = new Array(rsBlocks.length);
  for (var r = 0; r < rsBlocks.length; r++) {
    var dcCount = rsBlocks[r].dataCount;
    var ecCount = rsBlocks[r].totalCount - dcCount;
    maxDcCount = Math.max(maxDcCount, dcCount);
    maxEcCount = Math.max(maxEcCount, ecCount);
    dcdata[r] = new Array(dcCount);
    for (var i = 0; i < dcdata[r].length; i++) {
      dcdata[r][i] = 0xff & buffer.buffer[i + offset];
    }
    offset += dcCount;
    var rsPoly = QRUtil.getErrorCorrectPolynomial(ecCount);
    var rawPoly = new QRPolynomial(dcdata[r], rsPoly.getLength() - 1);
    var modPoly = rawPoly.mod(rsPoly);
    ecdata[r] = new Array(rsPoly.getLength() - 1);
    for (var i = 0; i < ecdata[r].length; i++) {
      var modIndex = i + modPoly.getLength() - ecdata[r].length;
      ecdata[r][i] = modIndex >= 0 ? modPoly.get(modIndex) : 0;
    }
  }
  var totalCodeCount = 0;
  for (var i = 0; i < rsBlocks.length; i++) {
    totalCodeCount += rsBlocks[i].totalCount;
  }
  var data = new Array(totalCodeCount);
  var index = 0;
  for (var i = 0; i < maxDcCount; i++) {
    for (var r = 0; r < rsBlocks.length; r++) {
      if (i < dcdata[r].length) {
        data[index++] = dcdata[r][i];
      }
    }
  }
  for (var i = 0; i < maxEcCount; i++) {
    for (var r = 0; r < rsBlocks.length; r++) {
      if (i < ecdata[r].length) {
        data[index++] = ecdata[r][i];
      }
    }
  }
  return data;
};
//---------------------------------------------------------------------
// QRMode
//---------------------------------------------------------------------
var QRMode = {
  MODE_NUMBER: 1 << 0,
  MODE_ALPHA_NUM: 1 << 1,
  MODE_8BIT_BYTE: 1 << 2,
  MODE_KANJI: 1 << 3
};
//---------------------------------------------------------------------
// QRErrorCorrectLevel
//---------------------------------------------------------------------
var QRErrorCorrectLevel = {
  L: 1,
  M: 0,
  Q: 3,
  H: 2
};
//---------------------------------------------------------------------
// QRMaskPattern
//---------------------------------------------------------------------
var QRMaskPattern = {
  PATTERN000: 0,
  PATTERN001: 1,
  PATTERN010: 2,
  PATTERN011: 3,
  PATTERN100: 4,
  PATTERN101: 5,
  PATTERN110: 6,
  PATTERN111: 7
};
//---------------------------------------------------------------------
// QRUtil
//---------------------------------------------------------------------
var QRUtil = {
  PATTERN_POSITION_TABLE: [[], [6, 18], [6, 22], [6, 26], [6, 30], [6, 34], [6, 22, 38], [6, 24, 42], [6, 26, 46], [6, 28, 50], [6, 30, 54], [6, 32, 58], [6, 34, 62], [6, 26, 46, 66], [6, 26, 48, 70], [6, 26, 50, 74], [6, 30, 54, 78], [6, 30, 56, 82], [6, 30, 58, 86], [6, 34, 62, 90], [6, 28, 50, 72, 94], [6, 26, 50, 74, 98], [6, 30, 54, 78, 102], [6, 28, 54, 80, 106], [6, 32, 58, 84, 110], [6, 30, 58, 86, 114], [6, 34, 62, 90, 118], [6, 26, 50, 74, 98, 122], [6, 30, 54, 78, 102, 126], [6, 26, 52, 78, 104, 130], [6, 30, 56, 82, 108, 134], [6, 34, 60, 86, 112, 138], [6, 30, 58, 86, 114, 142], [6, 34, 62, 90, 118, 146], [6, 30, 54, 78, 102, 126, 150], [6, 24, 50, 76, 102, 128, 154], [6, 28, 54, 80, 106, 132, 158], [6, 32, 58, 84, 110, 136, 162], [6, 26, 54, 82, 110, 138, 166], [6, 30, 58, 86, 114, 142, 170]],
  G15: 1 << 10 | 1 << 8 | 1 << 5 | 1 << 4 | 1 << 2 | 1 << 1 | 1 << 0,
  G18: 1 << 12 | 1 << 11 | 1 << 10 | 1 << 9 | 1 << 8 | 1 << 5 | 1 << 2 | 1 << 0,
  G15_MASK: 1 << 14 | 1 << 12 | 1 << 10 | 1 << 4 | 1 << 1,
  getBCHTypeInfo: function (data) {
    var d = data << 10;
    while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15) >= 0) {
      d ^= QRUtil.G15 << QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15);
    }
    return (data << 10 | d) ^ QRUtil.G15_MASK;
  },
  getBCHTypeNumber: function (data) {
    var d = data << 12;
    while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18) >= 0) {
      d ^= QRUtil.G18 << QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18);
    }
    return data << 12 | d;
  },
  getBCHDigit: function (data) {
    var digit = 0;
    while (data != 0) {
      digit++;
      data >>>= 1;
    }
    return digit;
  },
  getPatternPosition: function (typeNumber) {
    return QRUtil.PATTERN_POSITION_TABLE[typeNumber - 1];
  },
  getMask: function (maskPattern, i, j) {
    switch (maskPattern) {
      case QRMaskPattern.PATTERN000:
        return (i + j) % 2 == 0;
      case QRMaskPattern.PATTERN001:
        return i % 2 == 0;
      case QRMaskPattern.PATTERN010:
        return j % 3 == 0;
      case QRMaskPattern.PATTERN011:
        return (i + j) % 3 == 0;
      case QRMaskPattern.PATTERN100:
        return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 == 0;
      case QRMaskPattern.PATTERN101:
        return i * j % 2 + i * j % 3 == 0;
      case QRMaskPattern.PATTERN110:
        return (i * j % 2 + i * j % 3) % 2 == 0;
      case QRMaskPattern.PATTERN111:
        return (i * j % 3 + (i + j) % 2) % 2 == 0;
      default:
        throw new Error("bad maskPattern:" + maskPattern);
    }
  },
  getErrorCorrectPolynomial: function (errorCorrectLength) {
    var a = new QRPolynomial([1], 0);
    for (var i = 0; i < errorCorrectLength; i++) {
      a = a.multiply(new QRPolynomial([1, QRMath.gexp(i)], 0));
    }
    return a;
  },
  getLengthInBits: function (mode, type) {
    if (1 <= type && type < 10) {
      // 1 - 9
      switch (mode) {
        case QRMode.MODE_NUMBER:
          return 10;
        case QRMode.MODE_ALPHA_NUM:
          return 9;
        case QRMode.MODE_8BIT_BYTE:
          return 8;
        case QRMode.MODE_KANJI:
          return 8;
        default:
          throw new Error("mode:" + mode);
      }
    } else if (type < 27) {
      // 10 - 26
      switch (mode) {
        case QRMode.MODE_NUMBER:
          return 12;
        case QRMode.MODE_ALPHA_NUM:
          return 11;
        case QRMode.MODE_8BIT_BYTE:
          return 16;
        case QRMode.MODE_KANJI:
          return 10;
        default:
          throw new Error("mode:" + mode);
      }
    } else if (type < 41) {
      // 27 - 40
      switch (mode) {
        case QRMode.MODE_NUMBER:
          return 14;
        case QRMode.MODE_ALPHA_NUM:
          return 13;
        case QRMode.MODE_8BIT_BYTE:
          return 16;
        case QRMode.MODE_KANJI:
          return 12;
        default:
          throw new Error("mode:" + mode);
      }
    } else {
      throw new Error("type:" + type);
    }
  },
  getLostPoint: function (qrCode) {
    var moduleCount = qrCode.getModuleCount();
    var lostPoint = 0;
    // LEVEL1
    for (var row = 0; row < moduleCount; row++) {
      for (var col = 0; col < moduleCount; col++) {
        var sameCount = 0;
        var dark = qrCode.isDark(row, col);
        for (var r = -1; r <= 1; r++) {
          if (row + r < 0 || moduleCount <= row + r) {
            continue;
          }
          for (var c = -1; c <= 1; c++) {
            if (col + c < 0 || moduleCount <= col + c) {
              continue;
            }
            if (r == 0 && c == 0) {
              continue;
            }
            if (dark == qrCode.isDark(row + r, col + c)) {
              sameCount++;
            }
          }
        }
        if (sameCount > 5) {
          lostPoint += 3 + sameCount - 5;
        }
      }
    }
    // LEVEL2
    for (var row = 0; row < moduleCount - 1; row++) {
      for (var col = 0; col < moduleCount - 1; col++) {
        var count = 0;
        if (qrCode.isDark(row, col)) count++;
        if (qrCode.isDark(row + 1, col)) count++;
        if (qrCode.isDark(row, col + 1)) count++;
        if (qrCode.isDark(row + 1, col + 1)) count++;
        if (count == 0 || count == 4) {
          lostPoint += 3;
        }
      }
    }
    // LEVEL3
    for (var row = 0; row < moduleCount; row++) {
      for (var col = 0; col < moduleCount - 6; col++) {
        if (qrCode.isDark(row, col) && !qrCode.isDark(row, col + 1) && qrCode.isDark(row, col + 2) && qrCode.isDark(row, col + 3) && qrCode.isDark(row, col + 4) && !qrCode.isDark(row, col + 5) && qrCode.isDark(row, col + 6)) {
          lostPoint += 40;
        }
      }
    }
    for (var col = 0; col < moduleCount; col++) {
      for (var row = 0; row < moduleCount - 6; row++) {
        if (qrCode.isDark(row, col) && !qrCode.isDark(row + 1, col) && qrCode.isDark(row + 2, col) && qrCode.isDark(row + 3, col) && qrCode.isDark(row + 4, col) && !qrCode.isDark(row + 5, col) && qrCode.isDark(row + 6, col)) {
          lostPoint += 40;
        }
      }
    }
    // LEVEL4
    var darkCount = 0;
    for (var col = 0; col < moduleCount; col++) {
      for (var row = 0; row < moduleCount; row++) {
        if (qrCode.isDark(row, col)) {
          darkCount++;
        }
      }
    }
    var ratio = Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5;
    lostPoint += ratio * 10;
    return lostPoint;
  }
};
//---------------------------------------------------------------------
// QRMath
//---------------------------------------------------------------------
var QRMath = {
  glog: function (n) {
    if (n < 1) {
      throw new Error("glog(" + n + ")");
    }
    return QRMath.LOG_TABLE[n];
  },
  gexp: function (n) {
    while (n < 0) {
      n += 255;
    }
    while (n >= 256) {
      n -= 255;
    }
    return QRMath.EXP_TABLE[n];
  },
  EXP_TABLE: new Array(256),
  LOG_TABLE: new Array(256)
};
for (var i = 0; i < 8; i++) {
  QRMath.EXP_TABLE[i] = 1 << i;
}
for (var i = 8; i < 256; i++) {
  QRMath.EXP_TABLE[i] = QRMath.EXP_TABLE[i - 4] ^ QRMath.EXP_TABLE[i - 5] ^ QRMath.EXP_TABLE[i - 6] ^ QRMath.EXP_TABLE[i - 8];
}
for (var i = 0; i < 255; i++) {
  QRMath.LOG_TABLE[QRMath.EXP_TABLE[i]] = i;
}
//---------------------------------------------------------------------
// QRPolynomial
//---------------------------------------------------------------------
function QRPolynomial(num, shift) {
  if (num.length == undefined) {
    throw new Error(num.length + "/" + shift);
  }
  var offset = 0;
  while (offset < num.length && num[offset] == 0) {
    offset++;
  }
  this.num = new Array(num.length - offset + shift);
  for (var i = 0; i < num.length - offset; i++) {
    this.num[i] = num[i + offset];
  }
}
QRPolynomial.prototype = {
  get: function (index) {
    return this.num[index];
  },
  getLength: function () {
    return this.num.length;
  },
  multiply: function (e) {
    var num = new Array(this.getLength() + e.getLength() - 1);
    for (var i = 0; i < this.getLength(); i++) {
      for (var j = 0; j < e.getLength(); j++) {
        num[i + j] ^= QRMath.gexp(QRMath.glog(this.get(i)) + QRMath.glog(e.get(j)));
      }
    }
    return new QRPolynomial(num, 0);
  },
  mod: function (e) {
    if (this.getLength() - e.getLength() < 0) {
      return this;
    }
    var ratio = QRMath.glog(this.get(0)) - QRMath.glog(e.get(0));
    var num = new Array(this.getLength());
    for (var i = 0; i < this.getLength(); i++) {
      num[i] = this.get(i);
    }
    for (var i = 0; i < e.getLength(); i++) {
      num[i] ^= QRMath.gexp(QRMath.glog(e.get(i)) + ratio);
    }
    // recursive call
    return new QRPolynomial(num, 0).mod(e);
  }
};
//---------------------------------------------------------------------
// QRRSBlock
//---------------------------------------------------------------------
function QRRSBlock(totalCount, dataCount) {
  this.totalCount = totalCount;
  this.dataCount = dataCount;
}
QRRSBlock.RS_BLOCK_TABLE = [
// L
// M
// Q
// H
// 1
[1, 26, 19], [1, 26, 16], [1, 26, 13], [1, 26, 9],
// 2
[1, 44, 34], [1, 44, 28], [1, 44, 22], [1, 44, 16],
// 3
[1, 70, 55], [1, 70, 44], [2, 35, 17], [2, 35, 13],
// 4
[1, 100, 80], [2, 50, 32], [2, 50, 24], [4, 25, 9],
// 5
[1, 134, 108], [2, 67, 43], [2, 33, 15, 2, 34, 16], [2, 33, 11, 2, 34, 12],
// 6
[2, 86, 68], [4, 43, 27], [4, 43, 19], [4, 43, 15],
// 7
[2, 98, 78], [4, 49, 31], [2, 32, 14, 4, 33, 15], [4, 39, 13, 1, 40, 14],
// 8
[2, 121, 97], [2, 60, 38, 2, 61, 39], [4, 40, 18, 2, 41, 19], [4, 40, 14, 2, 41, 15],
// 9
[2, 146, 116], [3, 58, 36, 2, 59, 37], [4, 36, 16, 4, 37, 17], [4, 36, 12, 4, 37, 13],
// 10
[2, 86, 68, 2, 87, 69], [4, 69, 43, 1, 70, 44], [6, 43, 19, 2, 44, 20], [6, 43, 15, 2, 44, 16],
// 11
[4, 101, 81], [1, 80, 50, 4, 81, 51], [4, 50, 22, 4, 51, 23], [3, 36, 12, 8, 37, 13],
// 12
[2, 116, 92, 2, 117, 93], [6, 58, 36, 2, 59, 37], [4, 46, 20, 6, 47, 21], [7, 42, 14, 4, 43, 15],
// 13
[4, 133, 107], [8, 59, 37, 1, 60, 38], [8, 44, 20, 4, 45, 21], [12, 33, 11, 4, 34, 12],
// 14
[3, 145, 115, 1, 146, 116], [4, 64, 40, 5, 65, 41], [11, 36, 16, 5, 37, 17], [11, 36, 12, 5, 37, 13],
// 15
[5, 109, 87, 1, 110, 88], [5, 65, 41, 5, 66, 42], [5, 54, 24, 7, 55, 25], [11, 36, 12],
// 16
[5, 122, 98, 1, 123, 99], [7, 73, 45, 3, 74, 46], [15, 43, 19, 2, 44, 20], [3, 45, 15, 13, 46, 16],
// 17
[1, 135, 107, 5, 136, 108], [10, 74, 46, 1, 75, 47], [1, 50, 22, 15, 51, 23], [2, 42, 14, 17, 43, 15],
// 18
[5, 150, 120, 1, 151, 121], [9, 69, 43, 4, 70, 44], [17, 50, 22, 1, 51, 23], [2, 42, 14, 19, 43, 15],
// 19
[3, 141, 113, 4, 142, 114], [3, 70, 44, 11, 71, 45], [17, 47, 21, 4, 48, 22], [9, 39, 13, 16, 40, 14],
// 20
[3, 135, 107, 5, 136, 108], [3, 67, 41, 13, 68, 42], [15, 54, 24, 5, 55, 25], [15, 43, 15, 10, 44, 16],
// 21
[4, 144, 116, 4, 145, 117], [17, 68, 42], [17, 50, 22, 6, 51, 23], [19, 46, 16, 6, 47, 17],
// 22
[2, 139, 111, 7, 140, 112], [17, 74, 46], [7, 54, 24, 16, 55, 25], [34, 37, 13],
// 23
[4, 151, 121, 5, 152, 122], [4, 75, 47, 14, 76, 48], [11, 54, 24, 14, 55, 25], [16, 45, 15, 14, 46, 16],
// 24
[6, 147, 117, 4, 148, 118], [6, 73, 45, 14, 74, 46], [11, 54, 24, 16, 55, 25], [30, 46, 16, 2, 47, 17],
// 25
[8, 132, 106, 4, 133, 107], [8, 75, 47, 13, 76, 48], [7, 54, 24, 22, 55, 25], [22, 45, 15, 13, 46, 16],
// 26
[10, 142, 114, 2, 143, 115], [19, 74, 46, 4, 75, 47], [28, 50, 22, 6, 51, 23], [33, 46, 16, 4, 47, 17],
// 27
[8, 152, 122, 4, 153, 123], [22, 73, 45, 3, 74, 46], [8, 53, 23, 26, 54, 24], [12, 45, 15, 28, 46, 16],
// 28
[3, 147, 117, 10, 148, 118], [3, 73, 45, 23, 74, 46], [4, 54, 24, 31, 55, 25], [11, 45, 15, 31, 46, 16],
// 29
[7, 146, 116, 7, 147, 117], [21, 73, 45, 7, 74, 46], [1, 53, 23, 37, 54, 24], [19, 45, 15, 26, 46, 16],
// 30
[5, 145, 115, 10, 146, 116], [19, 75, 47, 10, 76, 48], [15, 54, 24, 25, 55, 25], [23, 45, 15, 25, 46, 16],
// 31
[13, 145, 115, 3, 146, 116], [2, 74, 46, 29, 75, 47], [42, 54, 24, 1, 55, 25], [23, 45, 15, 28, 46, 16],
// 32
[17, 145, 115], [10, 74, 46, 23, 75, 47], [10, 54, 24, 35, 55, 25], [19, 45, 15, 35, 46, 16],
// 33
[17, 145, 115, 1, 146, 116], [14, 74, 46, 21, 75, 47], [29, 54, 24, 19, 55, 25], [11, 45, 15, 46, 46, 16],
// 34
[13, 145, 115, 6, 146, 116], [14, 74, 46, 23, 75, 47], [44, 54, 24, 7, 55, 25], [59, 46, 16, 1, 47, 17],
// 35
[12, 151, 121, 7, 152, 122], [12, 75, 47, 26, 76, 48], [39, 54, 24, 14, 55, 25], [22, 45, 15, 41, 46, 16],
// 36
[6, 151, 121, 14, 152, 122], [6, 75, 47, 34, 76, 48], [46, 54, 24, 10, 55, 25], [2, 45, 15, 64, 46, 16],
// 37
[17, 152, 122, 4, 153, 123], [29, 74, 46, 14, 75, 47], [49, 54, 24, 10, 55, 25], [24, 45, 15, 46, 46, 16],
// 38
[4, 152, 122, 18, 153, 123], [13, 74, 46, 32, 75, 47], [48, 54, 24, 14, 55, 25], [42, 45, 15, 32, 46, 16],
// 39
[20, 147, 117, 4, 148, 118], [40, 75, 47, 7, 76, 48], [43, 54, 24, 22, 55, 25], [10, 45, 15, 67, 46, 16],
// 40
[19, 148, 118, 6, 149, 119], [18, 75, 47, 31, 76, 48], [34, 54, 24, 34, 55, 25], [20, 45, 15, 61, 46, 16]];
QRRSBlock.getRSBlocks = function (typeNumber, errorCorrectLevel) {
  var rsBlock = QRRSBlock.getRsBlockTable(typeNumber, errorCorrectLevel);
  if (rsBlock == undefined) {
    throw new Error("bad rs block @ typeNumber:" + typeNumber + "/errorCorrectLevel:" + errorCorrectLevel);
  }
  var length = rsBlock.length / 3;
  var list = new Array();
  for (var i = 0; i < length; i++) {
    var count = rsBlock[i * 3 + 0];
    var totalCount = rsBlock[i * 3 + 1];
    var dataCount = rsBlock[i * 3 + 2];
    for (var j = 0; j < count; j++) {
      list.push(new QRRSBlock(totalCount, dataCount));
    }
  }
  return list;
};
QRRSBlock.getRsBlockTable = function (typeNumber, errorCorrectLevel) {
  switch (errorCorrectLevel) {
    case QRErrorCorrectLevel.L:
      return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 0];
    case QRErrorCorrectLevel.M:
      return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 1];
    case QRErrorCorrectLevel.Q:
      return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 2];
    case QRErrorCorrectLevel.H:
      return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 3];
    default:
      return undefined;
  }
};
//---------------------------------------------------------------------
// QRBitBuffer
//---------------------------------------------------------------------
function QRBitBuffer() {
  this.buffer = new Array();
  this.length = 0;
}
QRBitBuffer.prototype = {
  get: function (index) {
    var bufIndex = Math.floor(index / 8);
    return (this.buffer[bufIndex] >>> 7 - index % 8 & 1) == 1;
  },
  put: function (num, length) {
    for (var i = 0; i < length; i++) {
      this.putBit((num >>> length - i - 1 & 1) == 1);
    }
  },
  getLengthInBits: function () {
    return this.length;
  },
  putBit: function (bit) {
    var bufIndex = Math.floor(this.length / 8);
    if (this.buffer.length <= bufIndex) {
      this.buffer.push(0);
    }
    if (bit) {
      this.buffer[bufIndex] |= 0x80 >>> this.length % 8;
    }
    this.length++;
  }
};
// support Chinese
function utf16to8(str) {
  var out, i, len, c;
  out = '';
  len = str.length;
  for (i = 0; i < len; i++) {
    c = str.charCodeAt(i);
    if (c >= 0x0001 && c <= 0x007F) {
      out += str.charAt(i);
    } else if (c > 0x07FF) {
      out += String.fromCharCode(0xE0 | c >> 12 & 0x0F);
      out += String.fromCharCode(0x80 | c >> 6 & 0x3F);
      out += String.fromCharCode(0x80 | c >> 0 & 0x3F);
    } else {
      out += String.fromCharCode(0xC0 | c >> 6 & 0x1F);
      out += String.fromCharCode(0x80 | c >> 0 & 0x3F);
    }
  }
  return out;
}
function drawQrcode(options) {
  options = options || {};
  options = extend(true, {
    width: 256,
    height: 256,
    x: 0,
    y: 0,
    typeNumber: -1,
    correctLevel: QRErrorCorrectLevel.H,
    background: '#ffffff',
    foreground: '#000000',
    image: {
      imageResource: '',
      dx: 0,
      dy: 0,
      dWidth: 100,
      dHeight: 100
    }
  }, options);
  if (!options.canvasId && !options.ctx) {
    console.warn('please set canvasId or ctx!');
    return;
  }
  createCanvas();
  function createCanvas() {
    // create the qrcode itself
    var qrcode = new QRCode(options.typeNumber, options.correctLevel);
    qrcode.addData(utf16to8(options.text));
    qrcode.make();
    // get canvas context
    var ctx;
    if (options.ctx) {
      ctx = options.ctx;
    } else {
      ctx = options._this ? wx.createCanvasContext && wx.createCanvasContext(options.canvasId, options._this) : wx.createCanvasContext && wx.createCanvasContext(options.canvasId);
    }
    // compute tileW/tileH based on options.width/options.height
    var tileW = options.width / qrcode.getModuleCount();
    var tileH = options.height / qrcode.getModuleCount();
    // draw in the canvas
    for (var row = 0; row < qrcode.getModuleCount(); row++) {
      for (var col = 0; col < qrcode.getModuleCount(); col++) {
        var style = qrcode.isDark(row, col) ? options.foreground : options.background;
        ctx.setFillStyle(style);
        var w = Math.ceil((col + 1) * tileW) - Math.floor(col * tileW);
        var h = Math.ceil((row + 1) * tileW) - Math.floor(row * tileW);
        ctx.fillRect(Math.round(col * tileW) + options.x, Math.round(row * tileH) + options.y, w, h);
      }
    }
    if (options.image.imageResource) {
      ctx.drawImage(options.image.imageResource, options.image.dx, options.image.dy, options.image.dWidth, options.image.dHeight);
    }
    ctx.draw(false, function (e) {
      options.callback && options.callback(e);
    });
  }
}
return drawQrcode;
})));
pages/goods/details/components/buy-bar/index.js
@@ -40,6 +40,7 @@
  data: {
    fillPrice: false,
    shoppingCartGetId: null
  },
  methods: {
@@ -47,6 +48,24 @@
      const { isStock } = this.properties;
      if (!isStock) return;
      this.triggerEvent('toAddCart');
      // let query = {
      //   start: 0,
      //   size: 999,
      //   filterList: [],
      //   searchList: []
      // }
      // app.MG.store.getShoppingCartProductList(query).then(res => {
      //   res.datas.forEach((item) => {
      //     console.log(item.saleMethod.id, 'item.saleMethod.id');
      //     this.setData({
      //       shoppingCartGetId: item.saleMethod.id
      //     })
      //   })
      // })
    },
    toBuyNow(e) {
pages/goods/details/components/buy-bar/index.wxml
@@ -1,38 +1,29 @@
<view class="flex soldout flex-center wr-sold-out" wx:if="{{soldout ||  !isStock}}">
    {{soldout ? '商品已下架' : '商品已售馨'}}
  {{soldout ? '商品已下架' : '商品已售馨'}}
</view>
<view class="footer-cont flex flex-between wr-class">
    <view class="flex flex-between bottom-operate-left" wx:if="{{jumpArray.length > 0}}">
        <view
          wx:for="{{jumpArray}}"
          wx:key="index"
          class="icon-warp operate-wrap"
          bindtap="toNav"
          data-ele="foot_navigation"
          data-index="{{index}}"
          data-url="{{item.url}}"
        >
            <view>
                <text wx:if="{{shopCartNum > 0 && item.showCartNum}}" class="tag-cart-num">
                    {{shopCartNum > 99 ? '99+' : shopCartNum}}
                </text>
                <t-icon prefix="wr" name="{{item.iconName}}" size="40rpx" />
                <view class="operate-text">{{item.title}}</view>
            </view>
        </view>
    </view>
    <block wx:if="{{buttonType === 1}}">
        <view class="flex buy-buttons">
            <view class="bar-separately {{soldout || !isStock ? 'bar-addCart-disabled' : ''}}" bindtap="toAddCart">
                加入购物车
            </view>
            <view class="bar-buy {{soldout || !isStock ? 'bar-buyNow-disabled' : ''}}" bindtap="toBuyNow">
                立即购买
            </view>
        </view>
    </block>
    <block wx:if="{{isSlotButton}}">
        <slot name="buyButton" />
    </block>
</view>
  <view class="flex flex-between bottom-operate-left" wx:if="{{jumpArray.length > 0}}">
    <view wx:for="{{jumpArray}}" wx:key="index" class="icon-warp operate-wrap" bindtap="toNav" data-ele="foot_navigation" data-index="{{index}}" data-url="{{item.url}}">
      <view>
        <text wx:if="{{shopCartNum > 0 && item.showCartNum}}" class="tag-cart-num">
          {{shopCartNum > 99 ? '99+' : shopCartNum}}
        </text>
        <t-icon prefix="wr" name="{{item.iconName}}" size="40rpx" />
        <view class="operate-text">{{item.title}}</view>
      </view>
    </view>
  </view>
  <block wx:if="{{buttonType === 1}}">
    <view class="flex buy-buttons">
      <view class="bar-separately {{soldout || !isStock ? 'bar-addCart-disabled' : ''}}" bindtap="toAddCart">
        加入购物车
      </view>
      <view class="bar-buy {{soldout || !isStock ? 'bar-buyNow-disabled' : ''}}" bindtap="toBuyNow">
        立即购买
      </view>
    </view>
  </block>
  <block wx:if="{{isSlotButton}}">
    <slot name="buyButton" />
  </block>
</view>
pages/home/home.js
@@ -24,7 +24,8 @@
    booksList: [],
    readBookList: [], //数字阅读
    textbookList: [], //数字教材
    rankingList: []//排行榜
    rankingList: [],//排行榜
    shoppingCartGetId: []
  },
  onShow() {
    this.getTabBar().init();
@@ -60,7 +61,8 @@
    this.getBookTypeList();
    this.getReadBookList();
    this.getTextbookListList();
    this.getRankingList()
    this.getRankingList();
    this.getShoppingCartList()
  },
  // 获取测试登录时的token
  getTestLoginInfo() {
@@ -181,9 +183,15 @@
  toPages(item) {
    let info = item.target.dataset.info
    if (info.url) {
      wx.navigateTo({
        url: info.url
      })
      if (info.text == "图书服务") {
        wx.switchTab({
          url: info.url
        })
      } else {
        wx.navigateTo({
          url: info.url
        })
      }
    } else {
      wx.showToast({
        title: "建设中",
@@ -222,6 +230,7 @@
      })
    })
  },
  //精选课程分类
  getCourseTypeListList() {
@@ -329,6 +338,7 @@
  //图书服务
  tabBookClick(item) {
    let info = this.data.bookTypeList[item.detail.value]
    console.log(info, 123)
    this.getBooksList(info)
  },
  //数字阅读
@@ -378,17 +388,29 @@
  //获取排行榜
  getRankingList() {
    const obj = {
      storeInfo: app.config.digitalTextbooks,
      path: 'jsek_homepageDigitalTextbooks',
      storeInfo: app.config.goodsStore,
      path: '*',
      queryType: '*',
      coverSize: {
        width: 150
      },
      paging: {
        start: 0,
        size: 6
        size: 10
      },
      fields: {
        author: [],
      },
      filterList: [
        {
          value: 'Normal',
          field: 'state'
        }
      ],
      sort: {
        Name: 'Asc',
        BaseType: ''
      }
    }
    app.MG.store.getProductList(obj).then((res) => {
@@ -397,6 +419,94 @@
      })
    })
  },
  // 跳转图书详情
  goDetail(e) {
    const { book } = e.currentTarget.dataset;
    wx.navigateTo({
      url: `/pages/bookServices/detail/index?id=${book.id}&name=${book.name}`,
    });
  },
  getShoppingCartList() {
    let query = {
      start: 0,
      size: 999,
      filterList: [],
      searchList: []
    }
    app.MG.store.getShoppingCartProductList(query).then((res) => {
      let idList = [];
      res.datas.forEach((item) => {
        idList.push(item.saleMethod.id)
      })
      this.setData({
        shoppingCartGetId: idList
      })
    })
  },
  addCart(e) {
    const { info } = e.currentTarget.dataset;
    console.log(info)
    if (wx.getStorageSync(app.config.tokenKey)) {
      let query = {
        start: 0,
        size: 999,
        filterList: [],
        searchList: []
      }
      try {
        if (
          this.data.shoppingCartGetId.includes(
            info.defaultSaleMethodId
          )
        ) {
          wx.showToast({
            title: "该书已在购物车,请勿重复添加空",
            icon: 'none',
            duration: 1000
          })
        } else {
          let query = {
            requests: [
              {
                saleMethodId: info.defaultSaleMethodId,
                storeEventId: null,
                agentCode: '电子书'
              }
            ]
          }
          const addRes = app.MG.store.addShoppingCart(query)
          if (addRes) {
            wx.showToast({
              title: "添加成功",
              icon: 'success',
              duration: 1000
            })
          }
          this.getShoppingCartList()
        }
      } catch (error) {
        console.error('出错了:', error)
      }
    }
  },
  onMoreGuide(e) {
    let type = e.currentTarget.dataset.info
    console.log(e, 1)
    if (type == "tushufuwu") {
      wx.navigateTo({
        url: '/pages/bookServices/list/index'
      })
    } else {
      wx.showToast({
        title: "建设中",
        icon: 'none',
        duration: 2000
      })
    }
  },
  onPageScroll(e) {
    this.setData({
pages/home/home.wxml
@@ -28,13 +28,13 @@
      <view class="icon">
        <t-image src="/static/images/home/zhuantitaolun.png" mode="heightFix" class="iconImage" />
      </view>
      <view bindtap="onMoreGuide" class="flex">
      <view data-info="{{'zhuantitaolun'}}" bindtap="onMoreGuide" class="flex">
        <text class="more">更多</text>
        <t-icon name="chevron-right" size="32rpx" color="#ff6d00" />
      </view>
    </view>
    <view class="listBox">
      <view wx:for="{{specialSubjectList}}" wx:for-item="item" wx:for-index="index" wx:key="index" bindtap="toList" data-info="{{item}}" class="listItemBox">
      <view wx:for="{{specialSubjectList}}" wx:for-item="item" wx:for-index="index" wx:key="index" class="listItemBox">
        <view class="listItem">
          <view class="specialSubject-img">
            <image src="{{item.icon}}" mode="aspectFill" class="img" />
@@ -57,7 +57,7 @@
      <view class="icon">
        <t-image src="/static/images/home/jingxuankecheng@2x.png" mode="heightFix" class="iconImage" />
      </view>
      <view bindtap="onMoreGuide" class="flex">
      <view data-info="{{'jingxuankecheng'}}" bindtap="onMoreGuide" class="flex">
        <text class="more">更多</text>
        <t-icon name="chevron-right" size="32rpx" color="#ff6d00" />
      </view>
@@ -69,7 +69,7 @@
    </view>
    <view class="listBox1">
      <view wx:if="{{courseList.length>0}}">
        <view wx:for="{{courseList}}" wx:for-item="item" wx:for-index="index" wx:key="index" bindtap="toList" data-info="{{item}}" class="listItemBox">
        <view wx:for="{{courseList}}" wx:for-item="item" wx:for-index="index" wx:key="index" class="listItemBox">
          <view class="listItem flex">
            <view class="specialSubject-img">
              <image src="{{item.icon}}" mode="aspectFill" class="img" />
@@ -83,7 +83,7 @@
              <view class="priceBox flex jc-sb">
                <text class="price" wx:if="{{item.price == 0}}">免费</text>
                <text class="price" wx:if="{{item.price !== 0}}">¥{{item.price}}</text>
                <image src="/static/images/home/home-cart.png" mode="aspectFill" class="addCartImg" />
                <image src="/static/images/home/home-cart.png" mode="aspectFill" class="addCartImg" bind:tap="addCart" data-info="{{item}}" />
              </view>
            </view>
          </view>
@@ -97,7 +97,7 @@
      <view class="icon">
        <t-image src="/static/images/home/tushufuwu@2x.png" mode="heightFix" class="iconImage" />
      </view>
      <view bindtap="onMoreGuide" class="flex">
      <view data-info="{{'tushufuwu'}}" bindtap="onMoreGuide" class="flex">
        <text class="more">更多</text>
        <t-icon name="chevron-right" size="32rpx" color="#ff6d00" />
      </view>
@@ -109,8 +109,8 @@
    </view>
    <view class="listBox2">
      <view wx:if="{{booksList.length > 0}}" class="flex">
        <view wx:for="{{booksList}}" wx:for-item="item" wx:for-index="index" wx:key="index" bindtap="toList" data-info="{{item}}" class="booksListItemBox">
          <view class="listItem">
        <view wx:for="{{booksList}}" wx:for-item="item" wx:for-index="index" wx:key="index" class="booksListItemBox">
          <view class="listItem" bind:tap="goDetail" data-book="{{item}}">
            <view class="specialSubject-img">
              <image src="{{item.icon}}" mode="aspectFill" class="img" />
            </view>
@@ -129,13 +129,13 @@
      <view class="icon">
        <t-image src="/static/images/home/shuziyuedu1@2x.png" mode="heightFix" class="iconImage" />
      </view>
      <view bindtap="onMoreGuide" class="flex">
      <view data-info="{{'shuziyuedu'}}" bindtap="onMoreGuide" class="flex">
        <text class="more">更多</text>
        <t-icon name="chevron-right" size="32rpx" color="#ff6d00" />
      </view>
    </view>
    <view class="listBox2 flex">
      <view wx:for="{{readBookList}}" wx:for-item="item" wx:for-index="index" wx:key="index" bindtap="toList" data-info="{{item}}" class="booksListItemBox">
      <view wx:for="{{readBookList}}" wx:for-item="item" wx:for-index="index" wx:key="index" class="booksListItemBox">
        <view class="listItem">
          <view class="specialSubject-img">
            <image src="{{item.icon}}" mode="aspectFill" class="img" />
@@ -151,14 +151,14 @@
      <view class="icon">
        <t-image src="/static/images/home/shuzijiaocai1@2x.png" mode="heightFix" class="iconImage" />
      </view>
      <view bindtap="onMoreGuide" class="flex">
      <view data-info="{{'shuzijiaocai'}}" bindtap="onMoreGuide" class="flex">
        <text class="more">更多</text>
        <t-icon name="chevron-right" size="32rpx" color="#ff6d00" />
      </view>
    </view>
    <view class="listBox3">
      <view wx:if="{{textbookList.length > 0}}" class="listBox3">
        <view wx:for="{{textbookList}}" wx:for-item="item" wx:for-index="index" wx:key="index" bindtap="toList" data-info="{{item}}" class="textbooksItemBox">
        <view wx:for="{{textbookList}}" wx:for-item="item" wx:for-index="index" wx:key="index" class="textbooksItemBox">
          <view class="listItem flex">
            <view class="specialSubject-img">
              <image src="{{item.icon}}" mode="aspectFill" class="img" />
@@ -170,7 +170,7 @@
              <view class="priceBox flex jc-sb">
                <text class="price" wx:if="{{item.price == 0}}">免费</text>
                <text class="price" wx:if="{{item.price !== 0}}">¥{{item.price}}</text>
                <image src="/static/images/home/home-cart.png" mode="aspectFill" class="addCartImg" />
                <image src="/static/images/home/home-cart.png" mode="aspectFill" class="addCartImg" bind:tap="addCart" data-info="{{item}}" />
              </view>
            </view>
          </view>
@@ -184,23 +184,22 @@
      <view class="icon">
        <t-image src="/static/images/home/paihangbang@2x.png" mode="heightFix" class="iconImage" />
      </view>
      <view bindtap="onMoreGuide" class="flex">
        <text class="more">更多</text>
        <t-icon name="chevron-right" size="32rpx" color="#ff6d00" />
      </view>
    </view>
    <view class="listBox2 rankingList flex">
      <view wx:for="{{rankingList}}" wx:for-item="item" wx:for-index="index" wx:key="index" bindtap="toList" data-info="{{item}}" class="booksListItemBox">
        <view class="listItem">
          <view class="specialSubject-img">
            <image src="{{item.icon}}" mode="aspectFill" class="img" />
          </view>
          <view class="body-info">
            <view class="name">{{item.name}}</view>
            <view class="author">{{item.author}}</view>
    <view class="rankingList">
      <scroll-view class="srcolbox" scroll-x scroll-with-animation='true'>
        <view wx:for="{{rankingList}}" wx:for-item="item" wx:for-index="index" wx:key="index" class="booksListItemBox">
          <view class="listItem" bind:tap="goDetail" data-book="{{item}}">
            <view class="specialSubject-img">
              <image src="{{item.icon}}" mode="aspectFill" class="img" wx:if="{{item.icon}}" />
              <image src="/static/images/default-book-img.png" mode="aspectFill" class="img" wx:else />
            </view>
            <view class="body-info">
              <view class="name">{{item.name}}</view>
              <view class="author">{{item.author}}</view>
            </view>
          </view>
        </view>
      </view>
      </scroll-view>
    </view>
  </view>
  <load-more list-is-empty="{{!goodsList.length}}" status="{{goodsListLoadStatus}}" bind:retry="onReTry" />
pages/home/home.wxss
@@ -201,13 +201,18 @@
}
.listBox1 .listItemBox {
  height: 220rpx;
  height: 210rpx;
  margin-bottom: 30rpx;
}
.listBox1 .specialSubject-img {
  width: 400rpx;
  height: 218rpx;
  width: 480rpx;
  height: 210rpx;
  flex: 1;
}
.listBox1 .body-info {
  flex: 1;
}
.listBox1 .addCartImg,
@@ -217,7 +222,7 @@
}
.listBox1 .priceBox {
  margin-top: 14rpx;
  margin-top: 10rpx;
}
.listBox2 {
@@ -240,7 +245,7 @@
}
.listBox2 .specialSubject-img {
  height: 300rpx;
  height: 280rpx;
  width: 100%;
  box-shadow: 0px 0px 20rpx 2px #f1f1f1;
}
@@ -273,7 +278,7 @@
.listBox3 .textbooksItemBox .specialSubject-img {
  width: 190rpx;
  height: 260rpx;
  height: 250rpx;
  box-shadow: 0px 0px 20rpx 2px #f1f1f1;
}
@@ -313,4 +318,43 @@
.readList {
  overflow: auto;
}
.rankingList .listItem {
  padding: 20rpx 0;
}
.srcolbox {
  width: 100%;
  height: 480rpx;
  white-space: nowrap;
}
.srcolbox .booksListItemBox {
  display: inline-block;
  width: 188rpx;
  margin-right: 30rpx;
}
.rankingList .specialSubject-img {
  height: 254rpx;
  width: 100%;
  box-shadow: 0px 0px 20rpx 2px #f1f1f1;
}
.rankingList .body-info {
  padding: 20rpx 0;
}
.rankingList .author {
  height: 30rpx;
  color: #333333;
  font-weight: bold;
  line-height: 30rpx;
  display: -webkit-box;
  margin-bottom: 10rpx;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 1;
  overflow: hidden;
  text-overflow: ellipsis;
}
pages/personalCenter/certificate/index.wxss
@@ -0,0 +1 @@
/* pages/personalCenter/certificate/index.wxss */
pages/personalCenter/components/user-center-card/index.wxml
@@ -4,7 +4,7 @@
    <view class="user-center-card__header" bind:tap="gotoUserEditPage">
      <t-avatar image="{{userInfo.avatarUrl || defaultAvatarUrl}}" class="user-center-card__header__avatar" />
      <view class="user-center-card__header__name">{{'请登录'}}</view>
      <view class="setting">
      <view class="setting" bind:tap="gotoUserEditPage">
        <image src="/static/images/personal/setting.png" mode="heightFix" class="img" />
        <text>设置</text>
      </view>
pages/personalCenter/feedBack/index.js
@@ -1,10 +1,41 @@
// pages/personalCenter/feedBack/index.js
import moment from 'moment'
const app = getApp();
Page({
  /**
   * 页面的初始数据
   */
  data: {
    active: 0,
    activeName: "proposition",
    tabList: [
      {
        label: '图书建议',
        key: 0,
        value: 'proposition'
      },
      {
        label: '意见反馈',
        key: 1,
        value: "feedback"
      }
    ],
    list: [
      {
        name: "ceshi",
      }
    ],
    //分页
    page: 1,
    limit: 10,
    pageTotalCount: 0,
    bottomLoading: false,
    isMoreData: false,
    // 返回顶部
    isBackTop: false,
    setScrollValue: 0,
    skeletonLoding: true,
  },
@@ -13,6 +44,11 @@
   */
  onLoad(options) {
    console.log(options);
    // if (this.data.activeName == "proposition") {
    //   this.getDataList("bookOpinion", false);
    // } else {
    //   this.getDataList("feedback", false);
    // }
  },
  /**
@@ -28,14 +64,6 @@
  onShow() {
  },
  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide() {
  },
  /**
   * 生命周期函数--监听页面卸载
   */
@@ -43,18 +71,141 @@
  },
  tabBookClick(item) {
    console.log(item, 1)
    let that = this;
    let info = this.data.tabList[item.detail.value]
    that.setData({
      skeletonLoding: true,
      active: item.detail.value,
      activeName: info.value,
      list: [],
      page: 1,
      bottomLoading: false,
      isMoreData: false,
    })
    if (info.value == "proposition") {
      that.getDataList("bookOpinion", false);
    } else {
      that.getDataList("feedback", false);
    }
  },
  getDataList(code, isReachBottom) {
    app.MG.ugc.getTopicMessageList({
      appRefCode: app.config.appRefCode,
      topicIdOrRefCode: code,
      start: this.data.page * this.data.limit - this.data.limit,
      size: this.data.limit,
      sort: {
        type: "Desc",
        field: "CreateDate"
      }
    })
      .then(res => {
        try {
          if (res.datas.length > 0) {
            // res.datas.forEach((item) => {
            //   item.title = JSON.parse(item.content).content;
            //   item.createDate = moment(item.createDate).format("YYYY-MM-DD");
            //   item.updateDate = moment(item.updateDate).format("YYYY-MM-DD");;
            //   item.feedBack = item.feedBack ? item.feedBack : "-";
            // });
            let dataList = res.datas;
            //触底加载新数据并保留老数据
            if (isReachBottom) {
              dataList = [...this.data.list, ...dataList] //将新数据加入老数据中
            }
            this.setData({
              list: dataList,
              pageTotalCount: res.totalSize,
              bottomLoading: false,
              isMoreData: dataList.length > 0 ? false : true,
              skeletonLoding: false,
            })
            console.log(this.data.list, 333)
          } else {
            this.setData({
              skeletonLoding: false,
            })
          }
        } catch (error) {
          console.log(error)
        }
      })
  },
  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh() {
    if (this._freshing) return
    this.setData({
      page: 1,
      limit: 10,
      pageTotalCount: 0,
      bottomLoading: false,
      isMoreData: false
    })
    this._freshing = true;
    this.setData({
      triggered: false,
    })
    if (this.data.activeName == "proposition") {
      this.getDataList("bookOpinion", false);
    } else {
      this.getDataList("feedback", false);
    }
    this._freshing = false
  },
  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom() {
    this.setData({
      bottomLoading: true,
      isMoreData: false
    })
    let bool = false;
    if (this.data.pageTotalCount > this.data.list.length) {
      bool = true;
      this.setData({
        page: this.data.page + 1,
      })
    } else {
      setTimeout(() => {
        this.setData({
          bottomLoading: false,
          isMoreData: true
        })
      }, 100)
      return false;
    }
    if (this.data.activeName == "proposition") {
      this.getDataList("bookOpinion", bool);
    } else {
      this.getDataList("feedback", bool);
    }
  },
  // 监听滚动距离
  onPageScroll(e) {
    if (e && e.scrollTop >= 1000) {
      this.setData({
        isBackTop: true
      })
    } else {
      this.setData({
        isBackTop: false
      })
    }
  },
  goSubmit() {
    wx.navigateTo({
      url: "/pages/personalCenter/feedBackSubmit/index",
    });
  },
  /**
pages/personalCenter/feedBack/index.json
@@ -1,4 +1,12 @@
{
  "navigationBarTitleText": "建议与反馈",
  "usingComponents": {}
  "usingComponents": {
    "t-tabs": "tdesign-miniprogram/tabs/tabs",
    "t-tab-panel": "tdesign-miniprogram/tab-panel/tab-panel",
    "t-back-top": "tdesign-miniprogram/back-top/back-top",
    "t-pull-down-refresh": "tdesign-miniprogram/pull-down-refresh/pull-down-refresh",
    "t-loading": "tdesign-miniprogram/loading/loading",
    "t-image": "tdesign-miniprogram/image/image",
    "t-empty": "tdesign-miniprogram/empty/empty"
  }
}
pages/personalCenter/feedBack/index.wxml
@@ -1,2 +1,55 @@
<!--pages/personalCenter/feedBack/index.wxml-->
<text>pages/personalCenter/feedBack/index.wxml</text>
<view class="container">
  <t-tabs t-class="t-tabs" t-class-active="tabs-external__active" t-class-item="tabs-external__item" defaultValue="{{active}}" space-evenly="{{false}}" bind:change="tabBookClick">
    <t-tab-panel wx:for="{{tabList}}" wx:for-index="index" wx:key="index" label="{{item.label}}" value="{{index}}">
      <view class="pageInfo">
        <scroll-view class="scroll content" bind:scroll="onPageScroll" model:scroll-top="{{setScrollValue}}" scroll-y refresher-enabled="{{true}}" lower-threshold="{{200}}" refresher-threshold="{{80}}" refresher-default-style="none" refresher-triggered="{{triggered}}" bindrefresherpulling="{{refresh.onPulling}}" bindrefresherrefresh="onPullDownRefresh" bindscrolltolower="onReachBottom">
          <view slot="refresher" class="refresh-container">
            <view class="loading">
              <t-loading theme="circular" size="40rpx" text="正在刷新..." class="wrapper" />
            </view>
          </view>
          {{list}}
          <view class="list">
            <view wx:if="{{activeName == 'bookOpinion'}}" class="listBox">
              <view class="content-item" wx:for="{{list}}" wx:for-item="item" wx:for-index="index" wx:key="index">
                <view class="icon">
                  <t-image src="{{item.icon}}" mode="heightFix" class="img" />
                </view>
                <view class="item-con">
                  <view class="titleBox">
                    <view class="item-title">{{item.name}}</view>
                  </view>
                </view>
              </view>
            </view>
            <!-- <view wx:if="{{activeName == 'feedback'}}">
              <view class="content-item" wx:for="{{list}}" wx:for-item="item" wx:for-index="index" wx:key="index">
                <view class="item-con">
                  <view class="titleBox">
                    <view class="item-title">{{item.name}}</view>
                  </view>
                </view>
              </view>
            </view> -->
          </view>
          <view wx:if="{{list.length == 0}}" class="empyt">
            <t-empty icon="folder-open" description="暂无数据" />
          </view>
          <view class="bottom-loading" wx:if="{{bottomLoading}}">
            <t-loading theme="circular" size="40rpx" text="加载中..." class="wrapper" />
          </view>
          <view class="bottom-loading" style="color: #ccc;font-size: 28rpx;" wx:if="{{isMoreData}}">
            <text>没有更多了</text>
          </view>
        </scroll-view>
      </view>
    </t-tab-panel>
  </t-tabs>
  <view class="submitBox" bindtap="goSubmit" wx:if="{{activeName == 'feedback'}}">
    <view class="box">
      <t-image src="/static/images/personal/suggestion.png" mode="heightFix" class="img" />
      <text>我要反馈</text>
    </view>
  </view>
  <t-back-top theme="round" wx:if="{{isBackTop}}" text="顶部" bind:to-top="onToTop"></t-back-top>
</view>
pages/personalCenter/feedBack/index.wxss
@@ -1 +1,103 @@
/* pages/personalCenter/feedBack/index.wxss */
page {
  background-color: #f0f2f5;
  box-sizing: border-box;
  padding: 0 24rpx;
}
.t-tabs__track {
  display: none;
}
.t-tabs {
  margin-top: 20rpx;
  background: none !important;
}
.t-tabs__wrapper {
  background: none !important;
}
.t-tabs__nav :nth-child(1) {
  border-radius: 30rpx 30rpx 0 0rpx;
}
.t-tabs__nav :nth-child(2) {
  border-radius: 0rpx 30rpx 0 30rpx;
}
.t-tabs__item {
  flex: 1 !important;
  background: #E6E8F1;
  height: 76rpx !important;
  margin-top: 16rpx;
  border-radius: 30rpx 0 30rpx 0rpx !important;
}
.t-tabs__item--active {
  color: #333 !important;
  background: #fff;
  height: 96rpx;
  font-size: 32rpx;
  margin-top: 0;
  height: 96rpx !important;
  border-radius: 30rpx 30rpx 0 0rpx !important;
}
.t-tabs__item--active+.t-tabs__item {
  border-radius: 0 30rpx 0 30rpx !important;
}
.refresh-container {
  margin: 0 auto;
}
.bottom-loading,
.loading {
  padding: 20rpx;
  text-align: center;
}
.content {
  height: calc(100vh - env(safe-area-inset-bottom));
  box-sizing: border-box;
}
.content-item {
  background: #fff;
}
.listBox:nth-child(1) {
  margin-top: -30rpx;
  padding-top: 30rpx;
}
.submitBox {
  width: 220rpx;
  height: 80rpx;
  line-height: 80rpx;
  background: #ff6d00;
  color: #fff;
  border-radius: 50rpx 0 0 50rpx;
  position: fixed;
  bottom: 20%;
  right: 0;
}
.submitBox .box {
  display: flex;
  margin: 0 auto;
  width: 160rpx;
  align-items: center;
  text-align: center;
  font-size: 28rpx;
}
.submitBox .img {
  width: 40rpx;
  height: 40rpx;
  margin-right: 10rpx;
}
.empyt {
  padding: 200rpx 0;
}
pages/personalCenter/feedBackSubmit/index.js
@@ -1,11 +1,15 @@
// pages/personalCenter/feedBackSubmit/index.js
const app = getApp();
Page({
  /**
   * 页面的初始数据
   */
  data: {
    userName: "",
    mannder: "",
    content: "",
    lock: true,
  },
  /**
@@ -26,7 +30,6 @@
   * 生命周期函数--监听页面显示
   */
  onShow() {
  },
  /**
@@ -56,11 +59,82 @@
  onReachBottom() {
  },
  bindTnputBlur: function (e) {
    this.setData({
      userName: e.detail.value,
    });
  },
  bindTnputBlur1: function (e) {
    this.setData({
      mannder: e.detail.value,
    });
  },
  bindTextAreaBlur: function (e) {
    this.setData({
      content: e.detail.value,
    });
  },
  /**
   * 用户点击右上角分享
   */
  onShareAppMessage() {
  submit() {
    if (this.data.lock) {
      this.data.lock = false;
      if (this.data.userName) {
        if (this.data.mannder) {
          if (this.data.content) {
            let submitData = {
              content: this.data.content,
              name: this.data.userName,
              email: "",
              phone: this.data.mannder
            };
            var data = {
              topicIdOrRefCode: "feedback",
              name: "意见反馈",
              content: JSON.stringify(submitData),
              type: "opinionFeedback",
              state: "WaitAudit",
              cmsTypeRefCode: "",
              newDataListRequest: []
            };
            app.MG.ugc.newTopicMessage(data).then(res => {
              this.data.lock = true;
              if (res) {
                wx.showToast({
                  title: "提交成功",
                  icon: 'success',
                  duration: 1000,
                  success: function () {
                    setTimeout(function () {
                      wx.navigateBack();
                    }, 1000) //延迟时间
                  }
                })
              }
            });
          } else {
            this.data.lock = true;
            wx.showToast({
              title: "反馈内容不能为空",
              icon: 'none',
              duration: 1000
            })
          }
        } else {
          this.data.lock = true;
          wx.showToast({
            title: "联系方式不能为空",
            icon: 'none',
            duration: 1000
          })
        }
      } else {
        this.data.lock = true;
        wx.showToast({
          title: "联系人不能为空不能为空",
          icon: 'none',
          duration: 1000
        })
      }
    }
  }
})
pages/personalCenter/feedBackSubmit/index.wxml
@@ -1,2 +1,25 @@
<!--pages/personalCenter/feedBackSubmit/index.wxml-->
<text>pages/personalCenter/feedBackSubmit/index.wxml</text>
<view class="container">
  <view class="page-body">
    <view class="from-item">
      <view class="label"> 联系人: </view>
      <view class="item-content">
        <input class="weui-input" name="userName" auto-focus="true" adjust-position="true" value="{{userName}}" placeholder="请输入联系人" bindinput="bindTnputBlur" />
      </view>
    </view>
    <view class="from-item">
      <view class="label"> 联系方式: </view>
      <view class="item-content">
        <input class="weui-input" name="mannder" auto-focus="true" adjust-position="true" value="{{mannder}}" placeholder="请输入联系方式" bindinput="bindTnputBlur1" />
      </view>
    </view>
    <view class="from-item">
      <view class="label"> 反馈内容: </view>
      <view class="item-content">
        <textarea name="content" rows="4" cols="52" placeholder="请输入反馈内容" auto-focus="true" adjust-position="true" value="{{content}}" bindinput="bindTextAreaBlur"></textarea>
      </view>
    </view>
    <view class="btn-area">
      <button class="submit" bindtap="submit">提交</button>
    </view>
  </view>
</view>
pages/personalCenter/feedBackSubmit/index.wxss
@@ -1 +1,30 @@
/* pages/personalCenter/feedBackSubmit/index.wxss */
/* pages/personalCenter/feedBackSubmit/index.wxss */
page {
  box-sizing: border-box;
  padding: 0 24rpx;
}
.page-body {
  padding: 20rpx;
  font-size: 28rpx;
}
.from-item {
  margin-bottom: 20rpx;
}
.from-item .label {
  width: 240rpx;
  height: 68rpx;
  line-height: 68rpx;
}
.from-item .item-content {
  border: 2rpx solid #D9D9D9;
  padding: 10rpx;
}
.submit {
  background: #ff6c00;
  color: #fff;
}
pages/personalCenter/index.js
@@ -59,7 +59,7 @@
  {
    title: '建议与反馈',
    icon: '/static/images/personal/feedback.png',
    url: '/pages/personalCenter/feedback/index',
    url: '/pages/personalCenter/feedBack/index',
    type: 'feedback',
  }
];
@@ -179,7 +179,7 @@
  //点击目录
  toPages(item) {
    console.log(item)
    let info = item.target.dataset.info
    let info = item.currentTarget.dataset.info
    if (info.url) {
      wx.navigateTo({
        url: info.url
pages/personalCenter/myCollection/index.js
@@ -1,10 +1,35 @@
const app = getApp();
Page({
  /**
   * 页面的初始数据
   */
  data: {
    active: 0,
    activeName: "FavoriteBookCity",
    tabList: [
      {
        label: '图书',
        key: 0,
        linkType: 'FavoriteBookCity',
      },
      {
        label: '课程',
        key: 1,
        linkType: 'Favoriteclass',
      }
    ],
    list: [],
    //分页
    page: 1,
    limit: 12,
    pageTotalCount: 0,
    bottomLoading: false,
    isMoreData: false,
    // 返回顶部
    isBackTop: false,
    setScrollValue: 0,
    skeletonLoding: true,
  },
  /**
@@ -12,6 +37,7 @@
   */
  onLoad(options) {
    console.log(options);
    this.getDataList();
  },
  /**
@@ -21,41 +47,142 @@
  },
  /**
   * 生命周期函数--监听页面显示
   */
  onShow() {
  tabBookClick(item) {
    console.log(item, 1)
    let that = this;
    let info = this.data.tabList[item.detail.value]
    that.setData({
      skeletonLoding: true,
      active: item.detail.value,
      activeName: info.linkType,
      list: [],
      page: 1,
      bottomLoading: false,
      isMoreData: false,
    })
    that.getDataList(false);
  },
  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide() {
  getDataList(isReachBottom) {
    app.MG.store.getProductList({
      handelEBooK: true,
      queryType: "AppUserProductLink",
      linkType: this.data.activeName,
      paging: {
        start: this.data.page * this.data.limit - this.data.limit,
        size: this.data.limit
      },
      fields: {
        author: []
      }
    }).then((res) => {
      try {
        if (res.datas.length > 0) {
          let dataList = res.datas;
          //触底加载新数据并保留老数据
          if (isReachBottom) {
            dataList = [...this.data.list, ...dataList] //将新数据加入老数据中
          }
          this.setData({
            list: dataList,
            pageTotalCount: res.total,
            bottomLoading: false,
            isMoreData: dataList.length > 0 ? false : true,
            skeletonLoding: false,
            loading: false
          })
        } else {
          this.setData({
            skeletonLoding: false,
            loading: false
          })
        }
      } catch (error) {
        console.log(error)
      }
    })
  },
  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload() {
  },
  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh() {
    if (this._freshing) return
    this.setData({
      // list: [],
      page: 1,
      limit: 18,
      pageTotalCount: 0,
      bottomLoading: false,
      isMoreData: false
    })
    this._freshing = true;
    this.setData({
      triggered: false,
    })
    this.getDataList(false);
    this._freshing = false
  },
  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom() {
    this.setData({
      bottomLoading: true,
      isMoreData: false
    })
    let bool = false;
    if (this.data.pageTotalCount > this.data.list.length) {
      bool = true;
      this.setData({
        page: this.data.page + 1,
      })
    } else {
      setTimeout(() => {
        this.setData({
          bottomLoading: false,
          isMoreData: true
        })
      }, 100)
      return false;
    }
    this.getDataList(bool);
  },
  setCoolect(itemData) {
    let that = this;
    let info = itemData.currentTarget.dataset.info;
    wx.showModal({
      title: '提示', //提示的标题
      content: '确定要取消收藏?', //提示的内容
      success: function (res) {
        if (res.confirm) {
          app.MG.store
            .delProductLink({
              productIds: [info.id],
              linkType: that.data.activeName,
            })
            .then(() => {
              wx.showToast({
                title: "收藏已取消",
                icon: 'success',
                duration: 1000,
              })
              this.getDataList(false)
            });
        } else if (res.cancel) {
          console.log('用户点击了取消')
        }
      }
    })
  },
  goBookDetails(itemData) {
    let info = itemData.currentTarget.dataset.info;
    // wx.navigateTo({
    //   url: "/pages/personalCenter/myMassage/massageDetail/index?id=" + info.id,
    // });
  },
  /**
   * 用户点击右上角分享
   */
pages/personalCenter/myCollection/index.json
@@ -1,4 +1,12 @@
{
  "navigationBarTitleText": "我的收藏",
  "usingComponents": {}
  "usingComponents": {
    "t-tabs": "tdesign-miniprogram/tabs/tabs",
    "t-tab-panel": "tdesign-miniprogram/tab-panel/tab-panel",
    "t-back-top": "tdesign-miniprogram/back-top/back-top",
    "t-pull-down-refresh": "tdesign-miniprogram/pull-down-refresh/pull-down-refresh",
    "t-loading": "tdesign-miniprogram/loading/loading",
    "t-image": "tdesign-miniprogram/image/image",
    "t-empty": "tdesign-miniprogram/empty/empty"
  }
}
pages/personalCenter/myCollection/index.wxml
@@ -1 +1,50 @@
<text>我的收藏</text>
<view class="container">
  <t-tabs t-class="t-tabs" t-class-active="tabs-external__active" t-class-item="tabs-external__item" defaultValue="{{active}}" space-evenly="{{false}}" bind:change="tabBookClick">
    <t-tab-panel wx:for="{{tabList}}" wx:for-index="index" wx:key="index" label="{{item.label}}" value="{{index}}">
      <view class="pageInfo">
        <scroll-view class="scroll content" bind:scroll="onPageScroll" model:scroll-top="{{setScrollValue}}" scroll-y refresher-enabled="{{true}}" lower-threshold="{{200}}" refresher-threshold="{{80}}" refresher-default-style="none" refresher-triggered="{{triggered}}" bindrefresherpulling="{{refresh.onPulling}}" bindrefresherrefresh="onPullDownRefresh" bindscrolltolower="onReachBottom">
          <view slot="refresher" class="refresh-container">
            <view class="loading">
              <t-loading theme="circular" size="40rpx" text="正在刷新..." class="wrapper" />
            </view>
          </view>
          <view class="list" wx:if="{{list.length > 0}}">
            <view wx:if="{{activeName == 'FavoriteBookCity'}}" class="listBox">
              <view class="content-item" wx:for="{{list}}" wx:for-item="item" wx:for-index="index" wx:key="index">
                <view class="icon" data-info="{{item}}" bindtap="goBookDetails">
                  <t-image src="{{item.icon}}" mode="" class="img" />
                </view>
                <view class="body-info" data-info="{{item}}" bindtap="goBookDetails">
                  <view class="name">{{item.name}}</view>
                  <view class="author">{{item.author}}</view>
                </view>
                <view class="currentBtn" data-info="{{item}}" bindtap="setCoolect">
                  <t-image src="/static/images/personal/quxiaoshoucang.png" mode="heightFix" class="img" />
                </view>
              </view>
            </view>
            <!-- <view wx:if="{{activeName == 'Favoriteclass'}}">
              <view class="content-item" wx:for="{{list}}" wx:for-item="item" wx:for-index="index" wx:key="index">
                <view class="item-con">
                  <view class="titleBox">
                    <view class="item-title">{{item.name}}</view>
                  </view>
                </view>
              </view>
            </view> -->
          </view>
          <view wx:if="{{list.length == 0}}" class="empyt">
            <t-empty icon="folder-open" description="暂无数据" />
          </view>
          <view class="bottom-loading" wx:if="{{bottomLoading}}">
            <t-loading theme="circular" size="40rpx" text="加载中..." class="wrapper" />
          </view>
          <view class="bottom-loading" style="color: #ccc;font-size: 28rpx;" wx:if="{{isMoreData}}">
            <text>没有更多了</text>
          </view>
        </scroll-view>
      </view>
    </t-tab-panel>
  </t-tabs>
  <t-back-top theme="round" wx:if="{{isBackTop}}" text="顶部" bind:to-top="onToTop"></t-back-top>
</view>
pages/personalCenter/myCollection/index.wxss
@@ -0,0 +1,145 @@
page {
  background-color: #F2F3F8;
  box-sizing: border-box;
}
.t-tabs__track {
  display: none;
}
.t-tabs {
  margin-top: 20rpx;
  background: none !important;
}
.t-tabs__wrapper {
  background: none !important;
}
.t-tabs__nav :nth-child(1) {
  border-radius: 30rpx 30rpx 0 0rpx;
}
.t-tabs__nav :nth-child(2) {
  border-radius: 0rpx 30rpx 0 30rpx;
}
.t-tabs__item {
  flex: 1 !important;
  background: #E6E8F1;
  height: 76rpx !important;
  margin-top: 16rpx;
  border-radius: 30rpx 0 30rpx 0rpx !important;
}
.t-tabs__item--active {
  color: #333 !important;
  background: #fff;
  height: 96rpx;
  font-size: 32rpx;
  margin-top: 0;
  height: 96rpx !important;
  border-radius: 30rpx 30rpx 0 0rpx !important;
}
.t-tabs__item--active+.t-tabs__item {
  border-radius: 0 30rpx 0 30rpx !important;
}
.refresh-container {
  margin: 0 auto;
}
.bottom-loading,
.loading {
  padding: 20rpx;
  text-align: center;
}
.content {
  height: calc(100vh - env(safe-area-inset-bottom));
  box-sizing: border-box;
}
.t-tabs__content {
  background: #fff !important;
  margin-top: -30rpx;
  padding-top: 30rpx;
}
.listBox {
  display: flex;
  flex-flow: row wrap;
  padding: 30rpx 0;
}
.content-item {
  width: calc(100%/3 - 40rpx);
  margin-bottom: 30rpx;
  margin: 0 20rpx;
  align-self: stretch;
  position: relative;
}
.content-item .icon {
  height: 300rpx;
  width: 210rpx;
  box-shadow: 0px 0px 20rpx 2px rgba(0, 0, 0, 0.16);
}
.content-item .icon .t-image {
  width: 100%;
  height: 100%;
  object-fit: contain;
}
.body-info {
  padding: 20rpx 0;
}
.body-info .name {
  font-size: 32rpx;
  height: 88rpx;
  color: #333333;
  font-weight: bold;
  line-height: 44rpx;
  display: -webkit-box;
  margin-bottom: 10rpx;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  overflow: hidden;
  text-overflow: ellipsis;
}
.body-info .author {
  height: 30rpx;
  color: #333333;
  line-height: 30rpx;
  display: -webkit-box;
  margin-bottom: 10rpx;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 1;
  overflow: hidden;
  text-overflow: ellipsis;
}
.currentBtn {
  position: absolute;
  top: 10rpx;
  right: 10rpx;
  background: #FF6C00;
  border-radius: 8rpx;
  padding: 6rpx;
  width: 36rpx;
  height: 36rpx;
}
.currentBtn .img {
  width: 100%;
  height: 100%;
}
.empyt {
  padding: 200rpx 0;
}
pages/personalCenter/myMassage/index.js
@@ -43,6 +43,7 @@
            res.datas.forEach((item) => {
              item.createDate = moment(item.createDate).format("YYYY-MM-DD HH:mm");
            });
            let dataList = res.datas;
            //触底加载新数据并保留老数据
@@ -51,7 +52,7 @@
            }
            this.setData({
              list: dataList,
              pageTotalCount: res.total,
              pageTotalCount: res.totalSize,
              bottomLoading: false,
              isMoreData: dataList.length > 0 ? false : true,
              skeletonLoding: false,
pages/personalCenter/myOrder/index.js
@@ -1,10 +1,49 @@
const app = getApp();
import moment from 'moment'
import tool2 from "../../../assets/js/toolClass.js"
import { getPublicImage } from "../../../assets/js/middleGround/tool.js";
Page({
  /**
   * 页面的初始数据
   */
  data: {
    active: 0,
    activeName: "FavoriteBookCity",
    tabList: [
      {
        label: '全部',
        key: 0,
        value: 'all',
      },
      {
        label: '待支付',
        key: 1,
        value: 'WaitPay',
      },
      {
        label: '已完成',
        key: 1,
        value: 'Success',
      },
      {
        label: '已取消',
        key: 1,
        value: 'Cancel',
      }
    ],
    list: [],
    //分页
    page: 1,
    limit: 12,
    pageTotalCount: 0,
    bottomLoading: false,
    isMoreData: false,
    // 返回顶部
    isBackTop: false,
    setScrollValue: 0,
    skeletonLoding: true,
    queryFilter: []
  },
  /**
@@ -12,6 +51,7 @@
   */
  onLoad(options) {
    console.log(options);
    this.getDataList(false)
  },
  /**
@@ -20,40 +60,148 @@
  onReady() {
  },
  /**
   * 生命周期函数--监听页面显示
   */
  onShow() {
  tabBookClick(item) {
    console.log(item, 1)
    let that = this;
    let info = this.data.tabList[item.detail.value]
    that.setData({
      skeletonLoding: true,
      active: item.detail.value,
      activeName: info.value,
      queryFilter: info.value == 'all' ? [] : [{ field: 'State', value: info.value }],
      list: [],
      page: 1,
      bottomLoading: false,
      isMoreData: false,
    })
    that.getDataList(false);
  },
  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide() {
  getDataList(isReachBottom) {
    const data = {
      start: this.data.page * this.data.limit - this.data.limit,
      size: this.data.limit,
      filterList: this.data.queryFilter,
      sort: {
        type: 'Desc',
        field: 'CreateDate'
      }
    }
    app.MG.store.getUserOrderList(data).then((res) => {
      try {
        if (res.datas.length > 0) {
          res.datas.forEach((item, index) => {
            item.payPrice = tool2.toDecimal2(item.payPrice)
            item.createDate = moment(item.createDate).format("YYYY-MM-DD HH:mm:ss");
            item.finishedDate = moment(item.finishedDate).format("YYYY-MM-DD HH:mm:ss");
            if (item.state == "Success") {
              item.colorName = 'success';
              item.CustomState = "已完成";
            }
            if (item.state == "Cancel") {
              item.colorName = 'cancal';
              item.CustomState = "已取消";
            }
            if (item.state == "WaitPay") {
              item.colorName = 'waitPay';
              item.CustomState = "待支付";
            }
            if (item.state == "WaitDeliver") {
              item.colorName = 'waitDeliver';
              item.CustomState = "正在支付";
            }
            if (item.state == "GroupPaySuccess") {
              item.colorName = 'success';
              item.CustomState = "等待拼团"
            }
            if (item.state == "ReFounding") {
              item.colorName = 'ReFounding';
              item.CustomState = "退款中"
            }
            if (item.state == "ReFoundFinished") {
              item.colorName = 'ReFoundFinished';
              item.CustomState = "退款完成"
            }
            let oldlist = [];
            oldlist = item.saleMethodLinks
            oldlist.forEach(istrue => {
              istrue.name = istrue.orderSaleMethod.product.name
              istrue.payPrice = tool2.toDecimal2(istrue.payPrice)
              istrue.icon = getPublicImage(istrue.orderSaleMethod.product.icon, "", 400)
            })
          })
          let dataList = res.datas;
          //触底加载新数据并保留老数据
          if (isReachBottom) {
            dataList = [...this.data.list, ...dataList] //将新数据加入老数据中
          }
          this.setData({
            list: dataList,
            pageTotalCount: res.total,
            bottomLoading: false,
            isMoreData: dataList.length > 0 ? false : true,
            skeletonLoding: false,
            loading: false
          })
        } else {
          this.setData({
            skeletonLoding: false,
            loading: false
          })
        }
      } catch (error) {
        console.log(error)
      }
    })
  },
  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload() {
  },
  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh() {
    if (this._freshing) return
    this.setData({
      // list: [],
      page: 1,
      limit: 18,
      pageTotalCount: 0,
      bottomLoading: false,
      isMoreData: false
    })
    this._freshing = true;
    this.setData({
      triggered: false,
    })
    this.getDataList(false);
    this._freshing = false
  },
  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom() {
    this.setData({
      bottomLoading: true,
      isMoreData: false
    })
    let bool = false;
    if (this.data.pageTotalCount > this.data.list.length) {
      bool = true;
      this.setData({
        page: this.data.page + 1,
      })
    } else {
      setTimeout(() => {
        this.setData({
          bottomLoading: false,
          isMoreData: true
        })
      }, 100)
      return false;
    }
    this.getDataList(bool);
  },
  /**
pages/personalCenter/myOrder/index.json
@@ -1,4 +1,14 @@
{
  "navigationBarTitleText": "我的订单",
  "usingComponents": {}
  "usingComponents": {
    "t-search": "tdesign-miniprogram/search/search",
    "t-icon": "tdesign-miniprogram/icon/icon",
    "t-tabs": "tdesign-miniprogram/tabs/tabs",
    "t-tab-panel": "tdesign-miniprogram/tab-panel/tab-panel",
    "t-back-top": "tdesign-miniprogram/back-top/back-top",
    "t-pull-down-refresh": "tdesign-miniprogram/pull-down-refresh/pull-down-refresh",
    "t-loading": "tdesign-miniprogram/loading/loading",
    "t-image": "tdesign-miniprogram/image/image",
    "t-empty": "tdesign-miniprogram/empty/empty"
  }
}
pages/personalCenter/myOrder/index.wxml
@@ -1,2 +1,74 @@
<!--pages/personalCenter/myOrder/index.wxml-->
<text>pages/personalCenter/myOrder/index.wxml</text>
<view class="container">
  <view class="search">
    <t-search t-class-input="t-search__input" t-class-input-container="t-search__input-container" placeholder="请输入订单编号" leftIcon="">
      <t-icon slot="left-icon" prefix="wr" name="search" size="40rpx" color="#bbb" bind:tap="navToSearchPage" />
    </t-search>
  </view>
  <t-tabs t-class="t-tabs" t-class-active="tabs-external__active" t-class-item="tabs-external__item" defaultValue="{{active}}" space-evenly="{{false}}" bind:change="tabBookClick">
    <t-tab-panel wx:for="{{tabList}}" wx:for-index="index" wx:key="index" label="{{item.label}}" value="{{index}}">
      <view class="pageInfo">
        <scroll-view class="scroll content" bind:scroll="onPageScroll" model:scroll-top="{{setScrollValue}}" scroll-y refresher-enabled="{{true}}" lower-threshold="{{200}}" refresher-threshold="{{80}}" refresher-default-style="none" refresher-triggered="{{triggered}}" bindrefresherpulling="{{refresh.onPulling}}" bindrefresherrefresh="onPullDownRefresh" bindscrolltolower="onReachBottom">
          <view slot="refresher" class="refresh-container">
            <view class="loading">
              <t-loading theme="circular" size="40rpx" text="正在刷新..." class="wrapper" />
            </view>
          </view>
          <view class="list" wx:if="{{list.length > 0}}">
            <view class="content-item" wx:for="{{list}}" wx:for-item="items" wx:for-index="index" wx:key="index">
              <view class="order-cent">
                <text class="order-cent-one">订单号: {{items.orderNumber}}</text>
                <text class="right {{items.colorName}}">{{items.CustomState}}</text>
              </view>
              <view class="order-centent">
                <view class="bookBox {{items.saleMethodLinks.length == 1 ? 'flex' : ''}}" wx:for="{{items.saleMethodLinks}}" wx:for-item="itemes" wx:for-index="idx" wx:key="idx" bindtap="onOrderDetail" data-info="{{itemes}}">
                  <view class="leftCon {{items.saleMethodLinks.length == 1 ? 'fl' : ''}}">
                    <!-- 获取图片 -->
                    <image class="purchasedIcon" wx:if="{{itemes.icon}}" src="{{itemes.icon}}" mode="aspectFit" />
                    <image class="purchasedIcon" wx:else src="/static/images/default-book-img.png" mode="aspectFit" />
                  </view>
                  <!-- 获取名称 -->
                  <view class="rightCon">
                    <view class="productTitle">{{itemes.name}}</view>
                    <view>
                      <text class="typeBox">{{
                        itemes.orderSaleMethod.type == 'defaultSaleMethod'
                        ? '图书服务-电子书'
                        : itemes.orderSaleMethod.type == 'createProductSaleMethod' && itemes.orderSaleMethod.cmsItemList == 0 ? '图书服务-组卷' : '图书服务-云学习'
                        }}</text>
                    </view>
                    <!-- <text wx:if="{{itemes.payPrice >0}}" class="price">¥{{itemes.payPrice}}<text wx:if="{{itemes.oldPrice >0}}" class="oldPrice">(原定价:¥{{items.oldPrice}})</text></text>
                    <text wx:else class="freePrice">免费</text> -->
                    <!-- <text class="productTop"><text>创建时间</text>:{{items.createDate}}</text> -->
                  </view>
                </view>
                <view class="count">
                  <text wx:if="{{items.saleMethodLinks.length > 1 }}">共{{items.saleMethodLinks.length}}件</text>
                  <text wx:if="{{items.saleMethodLinks.length == 1 }}">¥{{items.payPrice}}</text>
                </view>
              </view>
              <view class="order-top">
                <text class="finishedDate" wx:if="{{items.state == 'Success'}}">{{items.finishedDate}}</text>
                <text class="order-top-price" wx:if="{{items.state == 'WaitPay'}}">应付:<text class="">¥{{items.payPrice}}</text></text>
                <view class="button-example" wx:if="{{items.state == 'WaitPay'}}">
                  <button class="button" bindtap="onCancel" data-order-num="{{items.orderNumber}}">取消订单</button>
                  <button class="unfollow" bindtap="onPayment" data-order-num="{{items.orderNumber}}">立即支付</button>
                </view>
                <view wx:if="{{items.state == 'Cancel'}}" class="button-bottem">总计:<text class="price">¥{{items.payPrice}}</text> </view>
              </view>
            </view>
          </view>
          <view wx:if="{{list.length == 0}}" class="empyt">
            <t-empty icon="folder-open" description="暂无数据" />
          </view>
          <view class="bottom-loading" wx:if="{{bottomLoading}}">
            <t-loading theme="circular" size="40rpx" text="加载中..." class="wrapper" />
          </view>
          <view class="bottom-loading" style="color: #ccc;font-size: 28rpx;" wx:if="{{isMoreData}}">
            <text>没有更多了</text>
          </view>
        </scroll-view>
      </view>
    </t-tab-panel>
  </t-tabs>
  <t-back-top theme="round" wx:if="{{isBackTop}}" text="顶部" bind:to-top="onToTop"></t-back-top>
</view>
pages/personalCenter/myOrder/index.wxss
@@ -0,0 +1,169 @@
.t-search__input {
  font-size: 28rpx !important;
  color: rgb(116, 116, 116) !important;
}
.t-search {
  width: 90%;
  margin: 0 auto;
}
.t-search__input-box--square {
  border-radius: 50rpx !important;
}
.t-tabs__item {
  flex: 1 !important;
}
.t-tabs__track {
  /* left: 28rpx !important; */
  background-color: #FF6C00 !important;
}
.t-tabs__item--active {
  font-size: 30rpx;
  color: #FF6C00 !important;
}
.pageInfo {
  background: #F2F3F8;
}
.list {
  padding: 0 24rpx;
}
.content-item {
  background-color: #fff;
  border-radius: 18rpx;
  margin-top: 20rpx;
  padding: 30rpx;
  box-shadow: 0px 0px 20rpx 2px #f1f1f1;
}
.order-cent {
  padding: 10rpx 0;
}
.right {
  float: right;
}
.cancal {
  color: #949494
}
.success {
  color: #1FBC1F
}
.waitPay {
  color: #F03939
}
.price {
  color: #FF6C00;
  font-weight: bold;
}
.order-centent {
  display: flex;
  border-bottom: 2rpx solid #EFF0F1;
}
.bookBox {
  flex: 1;
  padding: 30rpx 0;
}
.bookBox .leftCon {
  width: 150rpx;
  height: 210rpx;
  box-shadow: 0px 0px 20rpx 2px #f1f1f1;
}
.fl {
  float: left;
  margin-right: 20rpx;
}
.bookBox .leftCon .purchasedIcon {
  width: 100%;
  height: 100%;
  object-fit: contain;
}
.productTitle {
  font-size: 32rpx;
  height: 88rpx;
  color: #333333;
  font-weight: bold;
  line-height: 44rpx;
  display: -webkit-box;
  margin-bottom: 30rpx;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  overflow: hidden;
  text-overflow: ellipsis;
}
.flex .rightCon {
  margin-left: 160rpx;
}
.rightCon {
  margin-top: 10rpx;
  margin-right: 20rpx;
}
.count {
  display: flex;
  align-items: center;
  margin-left: 30rpx;
}
.typeBox {
  background: rgba(255, 108, 0, 0.24);
  border-radius: 9rpx 9rpx 9rpx 9rpx;
  padding: 8rpx 20rpx;
  color: #FF6C00;
}
.order-top {
  padding-top: 30rpx;
  display: flex;
  justify-content: space-between;
  align-items: center;
}
.button-example {
  display: flex;
}
.button {
  background-color: #fff;
  height: 60rpx;
  line-height: 60rpx;
  font-size: 28rpx;
}
.unfollow {
  height: 60rpx;
  line-height: 60rpx;
  font-size: 28rpx;
  background: #FF6C00;
  color: #fff;
  margin-left: 10rpx;
  border-color: #FF6C00;
}
.empyt {
  padding: 200rpx 0;
  background: #fff;
}
pages/resourceDetails/index.js
New file
@@ -0,0 +1,76 @@
// pages/resourceDetails/index.js
Page({
  /**
   * 页面的初始数据
   */
  data: {
    navBarHeight: '',
    barHeight: '',
    vURL: 'http://wxsnsdy.tc.qq.com/105/20210/snsdyvideodownload?filekey=30280201010421301f0201690402534804102ca905ce620b1241b726bc41dcff44e00204012882540400&bizid=1023&hy=SH&fileparam=302c020101042530230204136ffd93020457e3c4ff02024ef202031e8d7f02030f42400204045a320a0201000400'
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {
    const systInfo = wx.getSystemInfoSync();
    const menu = wx.getMenuButtonBoundingClientRect(); // 胶囊信息
    const navBarHeight = (menu.top - systInfo.statusBarHeight) * 2 + menu.height; // 导航栏高度
    this.setData({
      navBarHeight: navBarHeight,
      barHeight: systInfo.statusBarHeight,
    })
  },
  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady() {
  },
  /**
   * 生命周期函数--监听页面显示
   */
  onShow() {
  },
  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide() {
  },
  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload() {
  },
  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh() {
  },
  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom() {
  },
  /**
   * 用户点击右上角分享
   */
  onShareAppMessage() {
  }
})
pages/resourceDetails/index.json
New file
@@ -0,0 +1,6 @@
{
  "usingComponents": {
    "t-icon": "tdesign-miniprogram/icon/icon"
  },
  "navigationStyle": "custom"
}
pages/resourceDetails/index.wxml
New file
@@ -0,0 +1,13 @@
<view style="width: 100%; height: {{barHeight}}px; "></view>
<view class="nacigationBar" style="width: 70%; height: {{navBarHeight}}px;">
  <view>
    <t-icon name="chevron-left" size="30" data-name="{{item}}" bind:click="goBack" />
  </view>
  <view class="navbar-title">资源详情</view>
</view>
<view class="videoBox">
  <video src="{{vURL}}" play-btn-position='center' object-fit='fill' controls enable-play-gesture enable-auto-rotation></video>
</view>
pages/resourceDetails/index.wxss
New file
@@ -0,0 +1,25 @@
/* pages/resourceDetails/index.wxss */
.nacigationBar {
  background-color: #fff;
  display: flex;
  align-items: center;
}
.navbar-title {
  white-space: nowrap;
  /* overflow: hidden; */
  text-overflow: ellipsis;
  color: #0F1214;
  font-size: 40rpx;
  font-weight: bold;
  margin-bottom: 5rpx;
}
.videoBox {
  width: 100%;
}
.videoBox video {
  width: 100vw;
}
pages/retrievalPage/index.js
New file
@@ -0,0 +1,522 @@
// pages/retrievalPage/index.js
import request from '../../assets/request/index'
import { handleQueryResourceListData } from '../../assets/js/middleGround/tool'
const app = getApp()
Page({
  /**
   * 页面的初始数据
   */
  data: {
    tabPanelstyle: 'display:flex;justify-content:center;align-items:center;',
    navBarHeight: '',
    barHeight: '',
    searchVal: '',
    bookData: [],   //图书
    bookTotal: 0,
    courseData: [],  //课程
    courseTotal: 0,
    digitalTextbooksData: [],  //数字教材
    digitalTextbooksTotal: 0,
    seminarData: [], //专题研讨
    seminarTotal: 0,
    biblioClassificationData: [],//书展
    biblioClassificationTotal: 0,
    bookFairData: [],//书目
    bookFairTotal: 0
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {
    const systInfo = wx.getSystemInfoSync();
    const menu = wx.getMenuButtonBoundingClientRect(); // 胶囊信息
    const navBarHeight = (menu.top - systInfo.statusBarHeight) * 2 + menu.height; // 导航栏高度
    this.setData({
      navBarHeight: navBarHeight,
      barHeight: systInfo.statusBarHeight,
    })
    this.retrievalPageGet()
    this.bibliographyGet()
  },
  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady() {
  },
  /**
   * 生命周期函数--监听页面显示
   */
  onShow() {
  },
  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide() {
  },
  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload() {
  },
  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh() {
  },
  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom() {
  },
  /**
   * 用户点击右上角分享
   */
  onShareAppMessage() {
  },
  goBack() {
    wx.navigateBack();
  },
  //取消按钮
  onCancellation() {
    this.setData({
      searchVal: ''
    })
    this.retrievalPageGet()
    this.bibliographyGet()
  },
  onTabsChange(event) {
    console.log(`Change tab, tab-panel searchVal is ${event.detail.searchVal}.`);
  },
  onTabsClick(event) {
    console.log(`Click tab, tab-panel searchVal is ${event.detail.searchVal}.`);
  },
  retrievalPageGet() {
    let fields = {
      liveTime: [],
      lecturer: [],
      startTime: [],
      jsek_link: [],
      courseLeader: [],
      affiliatedUnit: [],
      publishingUnit: [],
      classHours: [],
      author: [],
      subtitle: []
    }
    let searchObj = {}
    if (this.data.searchVal) {
      searchObj = {
        'Name*': this.data.searchVal.trim(),
        '||author*': this.data.searchVal.trim(),
        '||isbn*': this.data.searchVal.trim(),
        '||seriesName*': this.data.searchVal.trim()
      }
    }
    let url = '/store/api/ApiQueryProductByAppUser'
    //图书
    let queryBook = {
      AccessControl: {
        Path: '*',
        StoreRefCode: 'defaultGoodsStore27',
        Type: '*',
        LinkType: ''
      },
      PageQuery: {
        Start: 0,
        Size: 999
      },
      SortQuery: [
        {
          LinkOrder: 'Desc'
        }
      ],
      CreateDate: [],
      Description: [],
      Name: [],
      Icon: [],
      RefCode: [],
      TypeId: [],
      SysType: [],
      State: [],
      Tag: [],
      BeginDate: [],
      EndDate: [],
      ProductLinkInfo: [],
      AllowDonate: [],
      ...searchObj,
      ...fields
    }
    let courseObj = {}
    if (this.data.searchVal) {
      courseObj = {
        'Name*': this.data.searchVal.trim(),
        '||author*': this.data.searchVal.trim(),
        '||isbn*': this.data.searchVal.trim(),
        '||seriesName*': this.data.searchVal.trim()
      }
    }
    //课程
    let queryCourse = {
      AccessControl: {
        Path: '*',
        StoreRefCode: 'jsek_digitalCourses',
        Type: '*',
        LinkType: ''
      },
      PageQuery: {
        Start: 0,
        Size: 999
      },
      SortQuery: [
        {
          LinkOrder: 'Desc'
        }
      ],
      CreateDate: [],
      Description: [],
      Name: [],
      Icon: [],
      RefCode: [],
      TypeId: [],
      SysType: [],
      State: [],
      Tag: [],
      BeginDate: [],
      EndDate: [],
      ProductLinkInfo: [],
      AllowDonate: [],
      ...courseObj,
      ...fields
    }
    let digitalTextbooksObj = {}
    if (this.data.searchVal) {
      digitalTextbooksObj = {
        'Name*': this.data.searchVal.trim(),
        '||author*': this.data.searchVal.trim(),
        '||isbn*': this.data.searchVal.trim(),
        '||seriesName*': this.data.searchVal.trim()
      }
    }
    // 数字教材
    let queryDigitalTextbooks = {
      AccessControl: {
        Path: '*',
        StoreRefCode: 'jsek_digitalTextbooks',
        Type: '*',
        LinkType: ''
      },
      PageQuery: {
        Start: 0,
        Size: 999
      },
      SortQuery: [
        {
          LinkOrder: 'Desc'
        }
      ],
      CreateDate: [],
      Description: [],
      Name: [],
      Icon: [],
      RefCode: [],
      TypeId: [],
      SysType: [],
      State: [],
      Tag: [],
      BeginDate: [],
      EndDate: [],
      ProductLinkInfo: [],
      AllowDonate: [],
      ...digitalTextbooksObj,
      ...fields
    }
    let seminarObj = {}
    if (this.data.searchVal) {
      seminarObj = {
        'Name*': this.data.searchVal.trim(),
        '||author*': this.data.searchVal.trim(),
        '||isbn*': this.data.searchVal.trim(),
        '||seriesName*': this.data.searchVal.trim()
      }
    }
    // 专题研讨
    let querySeminar = {
      AccessControl: {
        Path: '*',
        StoreRefCode: 'jsek_seminar',
        Type: '*',
        LinkType: ''
      },
      PageQuery: {
        Start: 0,
        Size: 999
      },
      SortQuery: [
        {
          LinkOrder: 'Desc'
        }
      ],
      CreateDate: [],
      Description: [],
      Name: [],
      Icon: [],
      RefCode: [],
      TypeId: [],
      SysType: [],
      State: [],
      Tag: [],
      BeginDate: [],
      EndDate: [],
      ProductLinkInfo: [],
      AllowDonate: [],
      ...fields,
      ...seminarObj
    }
    let biblioClassificationObj = {}
    if (this.data.searchVal) {
      biblioClassificationObj = {
        'Name*': this.data.searchVal.trim(),
        '||author*': this.data.searchVal.trim(),
        '||isbn*': this.data.searchVal.trim(),
        '||seriesName*': this.data.searchVal.trim()
      }
    }
    //书展
    let queryBiblioClassification = {
      AccessControl: {
        Path: '*',
        StoreRefCode: 'jsek_bookFair',
        Type: '*',
        LinkType: ''
      },
      PageQuery: {
        Start: 0,
        Size: 999
      },
      SortQuery: [
        {
          LinkOrder: 'Desc'
        }
      ],
      CreateDate: [],
      Description: [],
      Name: [],
      Icon: [],
      RefCode: [],
      TypeId: [],
      SysType: [],
      State: [],
      Tag: [],
      BeginDate: [],
      EndDate: [],
      ProductLinkInfo: [],
      AllowDonate: [],
      content: [],
      backgroundSelection: [],
      ...fields,
      ...biblioClassificationObj
    }
    let body = {
      query: JSON.stringify({
        Query: [{
          queryBook: queryBook
        }, {
          queryCourse: queryCourse
        }, {
          queryDigitalTextbooks: queryDigitalTextbooks
        }, {
          querySeminar: querySeminar
        }, {
          queryBiblioClassification: queryBiblioClassification
        }]
      })
    }
    request({
      url: url,
      method: 'post',
      data: body
    }).then((resp) => {
      // console.log(resp);
      //图书       0
      const data1 = resp[0]
      const datas1 = handleQueryResourceListData({
        datas: data1.datas,
        fields
      })
      this.setData({
        bookData: datas1,
        bookTotal: data1.totalCount
      })
      //数字课程    1
      const data2 = resp[1]
      const datas2 = handleQueryResourceListData({
        datas: data2.datas,
        fields
      })
      this.setData({
        courseData: datas2,
        courseTotal: data2.totalCount
      })
      // 数字教材    2
      const data3 = resp[2]
      const datas3 = handleQueryResourceListData({
        datas: data3.datas,
        fields
      })
      this.setData({
        digitalTextbooksData: datas3,
        digitalTextbooksTotal: data3.totalCount
      })
      // 专题研讨   3
      const data4 = resp[3]
      const datas4 = handleQueryResourceListData({
        datas: data4.datas,
        fields
      })
      this.setData({
        seminarData: datas4,
        seminarTotal: data4.totalCount
      })
      // 书展      4
      const data5 = resp[4]
      const datas5 = handleQueryResourceListData({
        datas: data5.datas,
        fields
      })
      this.setData({
        biblioClassificationData: datas5,
        biblioClassificationTotal: data5.totalCount
      })
    })
  },
  bibliographyGet() {
    let bibliographyObj = {}
    if (this.data.searchVal) {
      bibliographyObj = {
        'Name*': this.data.searchVal.trim(),
        '||author*': this.data.searchVal.trim(),
        '||isbn*': this.data.searchVal.trim(),
        '||seriesName*': this.data.searchVal.trim()
      }
    }
    app.MG.resource.getItem({
      path: 'jsek_biblioClassification',
      queryType: '*',
      paging: {
        start: 0,
        size: 999
      },
      coverSize: {
        width: 260
      },
      fields: {
        jsek_link: [],
        content: [],
        subtitle: [],
        fileType: [],
        jsek_resource: [],
        freeFile: [],
        ...bibliographyObj
      },
      SysType: "CmsItem"
    }).then(res => {
      // console.log(res);
      this.setData({
        bookFairData: res.datas,
        bookFairTotal: res.total
      })
    })
  },
  downloadData(event) {
    console.log(111);
    const item = event.currentTarget.dataset.item;
    // console.log(item.datas.freeFile.searchVal);
    const URL = 'http://182.92.203.7:3001/file/api/ApiDownload?md5=' + item.datas.freeFile.searchVal
    item.determine = false
    setTimeout(() => {
      if (URL) {
        item.determine = true
      }
    }, 600)
    wx.downloadFile({
      url: URL,
      success: function (res) {
        const filePath = res.tempFilePath;
        wx.openDocument({
          filePath: filePath,
          success: function (res) {
            console.log('打开文档成功');
          },
          fail: function (res) {
            console.log('打开文档失败', res);
          }
        });
      },
      fail: function (res) {
        console.log('下载文件失败', res);
      }
    });
  },
  onSearchSubmit() {
    console.log(this.data.searchVal);
    this.retrievalPageGet()
    this.bibliographyGet()
  }
})
pages/retrievalPage/index.json
New file
@@ -0,0 +1,10 @@
{
  "component": true,
  "usingComponents": {
    "t-icon": "tdesign-miniprogram/icon/icon",
    "t-search": "tdesign-miniprogram/search/search",
    "t-tabs": "tdesign-miniprogram/tabs/tabs",
    "t-tab-panel": "tdesign-miniprogram/tab-panel/tab-panel"
  },
  "navigationStyle": "custom"
}
pages/retrievalPage/index.wxml
New file
@@ -0,0 +1,164 @@
<!--pages/retrievalPage/index.wxml-->
<view style="width: 100%; height: {{barHeight}}px; "></view>
<view class="nacigationBar" style="width: 70%; height: {{navBarHeight}}px;">
  <view>
    <t-icon name="chevron-left" size="30" data-name="{{item}}" bind:click="goBack" />
  </view>
  <view class="navbar-title">检索结果</view>
</view>
<view class="example-search">
  <t-search bind:submit="onSearchSubmit" class="searchBox" model:value="{{searchVal}}" placeholder="请输入关键词/书名/ISBN/作者" />
  <view class="cancellation" bind:tap="onCancellation">取消</view>
</view>
<t-tabs defaultValue="{{0}}" bind:change="onTabsChange" bind:click="onTabsClick" t-class="custom-tabs" t-class-content="custom-panel">
  <t-tab-panel label="图书({{bookTotal}})" value="0">
    <view class="bookDataBox">
      <view class="bookDataForBox" wx:for="{{bookData}}" wx:key="index" wx:for-item="item" wx:for-index="index">
        <view class="imageBox">
          <image src="{{item.icon}}" mode="" />
        </view>
        <view class="bookDataNmae">
          {{item.name}}
        </view>
        <view class="bookDataAuthor">{{item.author}}</view>
      </view>
    </view>
  </t-tab-panel>
  <t-tab-panel label="课程({{courseTotal}})" value="1">
    <view class="listBox1">
      <view wx:if="{{courseData.length>0}}">
        <view wx:for="{{courseData}}" wx:for-item="item" wx:for-index="index" wx:key="index" bindtap="toList" data-info="{{item}}" class="listItemBox">
          <view class="listItem flex">
            <view class="specialSubject-img">
              <image src="{{item.icon}}" mode="aspectFill" class="img" />
            </view>
            <view class="body-info">
              <view class="name">{{item.name}}</view>
              <view class="flex jc-sb">
                <text class="author">{{item.courseLeader}}</text>
                <text>{{item.classHours}}课时</text>
              </view>
              <view class="priceBox flex jc-sb">
                <text class="price" wx:if="{{item.price == 0}}">免费</text>
                <text class="price" wx:if="{{item.price !== 0}}">¥{{item.price}}</text>
                <image src="/static/images/home/home-cart.png" mode="aspectFill" class="addCartImg" />
              </view>
            </view>
          </view>
        </view>
      </view>
      <view class="empyt" wx:else>
        <t-empty icon="folder-open" description="暂无数据" font-size="80" />
      </view>
    </view>
  </t-tab-panel>
  <t-tab-panel label="数字教材({{digitalTextbooksTotal}})" value="2">
    <view class="bookDataBox">
      <view class="bookDataForBox" wx:for="{{digitalTextbooksData}}" wx:key="index" wx:for-item="item" wx:for-index="index">
        <view class="imageBox">
          <image src="{{item.icon}}" mode="" />
        </view>
        <view class="bookDataNmae">
          {{item.name}}
        </view>
        <view class="bookDataAuthor">{{item.author}}</view>
      </view>
    </view>
  </t-tab-panel>
  <t-tab-panel label="专题({{seminarTotal}})" value="3">
    <view class="listBox">
      <view wx:for="{{seminarData}}" wx:for-item="item" wx:for-index="index" wx:key="index" bindtap="toList" data-info="{{item}}" class="listItemBox">
        <view class="listItem">
          <view class="specialSubject-img">
            <image src="{{item.icon}}" mode="aspectFill" class="img" />
          </view>
          <view class="body-info">
            <view class="name">{{item.name}}</view>
            <view class="time" wx:if="{{item.liveTime}}">直播时间:<text>{{item.liveTime}}</text></view>
            <view class="time" wx:if="{{item.startTime}}">开播时间:<text>{{ item.startTime }}</text></view>
            <view class="time" wx:if="{{!item.liveTime && !item.startTime}}">开播时间:<text class="grey">待定</text></view>
            <view class="flex jc-sb">
              <text class="author">{{item.lecturer}}</text>
              <text class="price" wx:if="{{item.price == 0}}">免费</text>
              <text class="price" wx:if="{{item.price !== 0}}">¥{{item.price}}</text>
            </view>
          </view>
        </view>
      </view>
    </view>
  </t-tab-panel>
  <t-tab-panel label="书目({{bookFairTotal}})" value="4">
    <view class="outsideHigherBox">
      <view class="higherBox" wx:for="{{bookFairData}}" wx:key="index" wx:for-item="item" wx:for-index="index">
        <view class="outsideHigherImageBox">
          <image class="higherImageBox" src="{{item.icon}}" mode="" />
          <view class="downloadIcon" bind:tap="downloadData" data-item="{{item}}">
            <image wx:if="{{determine}}" class="download" src="/static/images/bibliographyList/downloadshiftin.png" mode="" />
            <image wx:else="" class="downloadshiftin" src="/static/images/bibliographyList/download.png" mode="" />
          </view>
        </view>
        <view class="higherTextBox">{{item.name}}</view>
      </view>
    </view>
  </t-tab-panel>
  <t-tab-panel label="书展({{biblioClassificationTotal}})" value="5">
    <view class="outside">
      <view class="contentBox" wx:for="{{biblioClassificationData}}" wx:key="index" wx:for-item="item" wx:for-index="index" bindtap="onBookExhibitionDetails" data-item="{{item}}">
        <image class="bookFairImage" wx:if="{{item.icon}}" src="{{item.icon}}" mode="" />
        <image class="bookFairImage" wx:else="" src="/static/images/bookExhibitionList/banner.png" mode="" />
        <view class="textBox" title="{{item.name}}"> <text>{{item.name}}</text></view>
      </view>
    </view>
  </t-tab-panel>
</t-tabs>
pages/retrievalPage/index.wxss
New file
@@ -0,0 +1,289 @@
/* pages/retrievalPage/index.wxss */
.nacigationBar {
  background-color: #fff;
  display: flex;
  align-items: center;
}
.navbar-title {
  white-space: nowrap;
  /* overflow: hidden; */
  text-overflow: ellipsis;
  color: #0F1214;
  font-size: 40rpx;
  font-weight: bold;
  margin-bottom: 5rpx;
}
.example-search {
  background-color: #fff;
  padding: 16rpx 32rpx;
  display: flex;
  align-items: center;
  /* font-size: 25rpx; */
  color: #999999;
}
.searchBox {
  width: 614rpx;
  /* margin-right: 20rpx; */
}
.cancellation {
  width: 80rpx;
  margin-left: 15rpx;
}
.custom-tabs {
  margin-bottom: 32rpx;
}
.custom-panel {
  /* height: 120px; */
}
.imageBox {
  width: 190rpx;
  height: 280rpx;
  box-shadow: 10rpx 10rpx 10rpx 10rpx rgba(0, 0, 0, 0.08);
}
image {
  width: 100%;
  height: 100%;
}
.bookDataBox {
  display: flex;
  flex-wrap: wrap;
}
.bookDataForBox {
  width: 190rpx;
  margin: 30rpx;
}
.bookDataNmae {
  margin: 20rpx 0;
  font-family: PingFang SC, PingFang SC;
  font-weight: bold;
  font-size: 25rpx;
  color: #333333;
  word-break: break-all;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
.bookDataAuthor {
  font-family: PingFang SC, PingFang SC;
  font-weight: 400;
  font-size: 22rpx;
  color: #333333;
}
.listBox {
  padding: 20rpx 0;
  display: flex;
  flex-flow: row wrap;
  justify-content: space-between;
  margin: 20rpx;
}
.listBox .listItemBox {
  width: 49%;
  margin-bottom: 50rpx;
}
.listItemBox .listItem {
  background: #fff;
  box-sizing: border-box;
  border-radius: 5px;
  overflow: hidden;
  box-shadow: 0px 0px 20rpx 2px #f1f1f1;
}
.listBox .specialSubject-img {
  width: 100%;
  height: 120rpx;
}
.specialSubject-img image {
  width: 100%;
  height: 100%;
  object-fit: contain;
}
.body-info {
  padding: 20rpx;
  font-size: 28rpx;
}
.body-info .name {
  font-size: 32rpx;
  height: 88rpx;
  color: #333333;
  font-weight: bold;
  line-height: 44rpx;
  display: -webkit-box;
  margin-bottom: 10rpx;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  overflow: hidden;
  text-overflow: ellipsis;
}
.body-info .time {
  font-size: 26rpx;
  margin-bottom: 10rpx;
}
.body-info .author {
  font-size: 26rpx;
  display: flex;
  justify-content: space-between;
}
.body-info .price {
  font-size: 26rpx;
  color: #ff6d00;
}
.flex {
  display: flex;
}
.jc-sb {
  justify-content: space-between
}
.listBox1,
.listBox2 {
  padding: 50rpx 0;
}
.listBox1 .listItemBox {
  height: 220rpx;
  margin-bottom: 30rpx;
}
.listBox1 .specialSubject-img {
  width: 400rpx;
  height: 218rpx;
}
.listBox1 .addCartImg,
.listBox3 .addCartImg {
  width: 30rpx;
  height: 30rpx;
}
.listBox1 .priceBox {
  margin-top: 14rpx;
}
.outside {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  margin: 15px;
}
.contentBox {
  width: 330rpx;
  /* height: 231rpx; */
  /* border: 1px #000 solid; */
  margin: 10px 0;
  background-color: #fff;
}
.textBox {
  width: 280rpx;
  /* height: 75rpx; */
  font-size: 25rpx;
  overflow: hidden;
  text-overflow: ellipsis;
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  /* text-align: center; */
  margin: 20rpx;
}
.bookFairImage {
  width: 327rpx;
  height: 128rpx;
}
.outsideHigherBox {
  display: flex;
  flex-wrap: wrap;
}
.higherBox {
  width: 220rpx;
  /* height: 390rpx; */
  box-shadow: 10rpx 10rpx 10rpx 10rpx rgba(0, 0, 0, 0.08);
  margin: 30rpx 15rpx;
}
.outsideHigherImageBox {
  position: relative;
}
.higherImageBox {
  width: 190rpx;
  height: 255rpx;
  margin: 15rpx;
}
.downloadIcon {
  width: 34rpx;
  height: 34rpx;
  border-radius: 5rpx 5rpx 5rpx 5rpx;
  background: rgba(0, 0, 0, 0.3);
  position: absolute;
  top: 15rpx;
  right: 15rpx;
  padding: 10rpx;
}
.download {
  /* background-color: #8bc34a; */
  width: 100%;
  height: 100%;
}
.downloadshiftin {
  width: 100%;
  height: 100%;
}
.higherTextBox {
  font-weight: bold;
  font-size: 25rpx;
  color: #333333;
  padding: 15rpx;
  margin-bottom: 10rpx;
}
services/cart/cart.js
@@ -1,20 +1,20 @@
import { config } from '../../config/index';
// import { config } from '../../config/index';
/** 获取购物车mock数据 */
function mockFetchCartGroupData(params) {
  const { delay } = require('../_utils/delay');
  const { genCartGroupData } = require('../../model/cart');
// /** 获取购物车mock数据 */
// function mockFetchCartGroupData(params) {
//   const { delay } = require('../_utils/delay');
//   const { genCartGroupData } = require('../../model/cart');
  return delay().then(() => genCartGroupData(params));
}
//   return delay().then(() => genCartGroupData(params));
// }
/** 获取购物车数据 */
export function fetchCartGroupData(params) {
  if (config.useMock) {
    return mockFetchCartGroupData(params);
  }
// /** 获取购物车数据 */
// export function fetchCartGroupData(params) {
//   if (config.useMock) {
//     return mockFetchCartGroupData(params);
//   }
  return new Promise((resolve) => {
    resolve('real api');
  });
}
//   return new Promise((resolve) => {
//     resolve('real api');
//   });
// }
services/home/home.js
@@ -9,7 +9,7 @@
          text: '图书服务',
          key: 0,
          icon: '/static/images/home/zhutichuban@2x.png',
          url: '/pages/bookServices/assort/index.wxml',
          url: '/pages/bookServices/assort/index',
        },
        {
          text: '数字阅读',
@@ -39,7 +39,7 @@
          text: '线上书展',
          key: 5,
          icon: '/static/images/home/xianshangshuzhan@2x.png',
          url: '',
          url: '/pages/bookExhibitionList/index',
        },
        {
          text: '书目下载',
static/images/bibliographyList/download.png
static/images/bibliographyList/downloadshiftin.png
static/images/bookExhibitionList/banner.png

static/images/default-book-img.png
static/images/personal/quxiaoshoucang.png
static/images/personal/suggestion.png
static/video/sea.mp4
Binary files differ