Merge branch 'master' of http://182.92.203.7:2001/r/jsek-applet
22个文件已删除
38个文件已修改
27个文件已添加
1 文件已重命名
| | |
| | | { |
| | | "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", |
| | |
| | | "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", |
| | |
| | | "backgroundTextStyle": "light", |
| | | "navigationBarBackgroundColor": "#fff", |
| | | "navigationBarTitleText": "京师E课", |
| | | "navigationBarTextStyle": "black" |
| | | "navigationBarTextStyle": "black", |
| | | " navigationStyle": "custom" |
| | | }, |
| | | "sitemapLocation": "sitemap.json", |
| | | "permission": { |
New file |
| | |
| | | // 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 |
| | | }) |
| | | |
| | | |
| | | }) |
| | | } |
| | | }) |
New file |
| | |
| | | { |
| | | "component": true, |
| | | "usingComponents": { |
| | | "t-swiper": "tdesign-miniprogram/swiper/swiper", |
| | | "t-swiper-nav": "tdesign-miniprogram/swiper-nav/swiper-nav" |
| | | } |
| | | } |
New file |
| | |
| | | <!--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> |
New file |
| | |
| | | /* pages/aboutUs/index.wxss */ |
| | | image { |
| | | width: 100%; |
| | | height: 100%; |
| | | } |
| | | |
| | | .imageBox { |
| | | width: 690rpx; |
| | | height: 300rpx; |
| | | margin-bottom: 35rpx; |
| | | } |
| | | |
| | | .aboutUs { |
| | | margin: 30rpx; |
| | | |
| | | } |
| | | |
| | | .aboutText { |
| | | padding-bottom: 100rpx; |
| | | } |
New file |
| | |
| | | // 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) |
| | | }, |
| | | |
| | | |
| | | |
| | | |
| | | }) |
New file |
| | |
| | | { |
| | | "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" |
| | | } |
New file |
| | |
| | | <!--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> |
New file |
| | |
| | | /* 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; |
| | | } |
| | |
| | | * 页面的初始数据 |
| | | */ |
| | | data: { |
| | | bookName: null, |
| | | bookBeginDate: null, |
| | | bookCreator: null, |
| | | bookContent: null, |
| | | bookImage: null, |
| | | bookName: '', |
| | | bookBeginDate: '', |
| | | bookCreator: '', |
| | | bookContent: '', |
| | | bookImage: '', |
| | | bookExhibitionList: [] |
| | | }, |
| | | |
| | |
| | | /* 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 { |
| | |
| | | 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 { |
| | |
| | | * 页面的初始数据 |
| | | */ |
| | | data: { |
| | | value: '', |
| | | keyword: '', |
| | | nameSort: null, |
| | | total: null, |
| | | page: { |
| | |
| | | keynoteValue: null, |
| | | filteredItems: [], |
| | | newValue: null, |
| | | value: '', |
| | | bookExhibitionList: [], |
| | | sorter: { |
| | | value: 'default', |
| | |
| | | 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' |
| | |
| | | queryType: '*', |
| | | fields: { |
| | | jsek_link: [], |
| | | 'bookClassification*': this.data.keynoteValue || [] |
| | | 'bookClassification*': this.data.keynoteValue || [], |
| | | ...searchObj |
| | | }, |
| | | paging: this.data.page, |
| | | sort: sort, |
| | |
| | | }, |
| | | 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; |
| | |
| | | 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() |
| | | } |
| | | }) |
| | |
| | | |
| | | |
| | | <view class="example-search"> |
| | | <t-search model:value="{{value}}" placeholder="请输入关键词/书目/ISBN/作者" /> |
| | | <t-search model:value="{{value}}" placeholder="请输入关键词/书目/ISBN/作者" bind:submit="onSearchSubmit" /> |
| | | </view> |
| | | |
| | | |
| | |
| | | |
| | | |
| | | </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="assembleContent"> |
| | | <view class="titleBox"> |
| | | <view class="frameBox"></view> <text class="titleTextBox"> 线上书展</text> |
| | | </view> |
| | |
| | | |
| | | <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> |
| | | <image wx:else="" src="/static/images/bookExhibitionList/banner.png" mode="" /> |
| | | <view class="textBox" title="{{item.name}}"> <text>{{item.name}}</text></view> |
| | | </view> |
| | | |
| | | </view> |
| | | </view> |
| | |
| | | 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 { |
| | |
| | | } |
| | | |
| | | .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; |
| | | } |
| | | |
| | | |
| | |
| | | display: flex; |
| | | margin: 10px; |
| | | margin-left: 0; |
| | | padding-top: 30rpx; |
| | | } |
| | | |
| | | .frameBox { |
| | |
| | | |
| | | .classification { |
| | | width: 550rpx; |
| | | /* margin-bottom: 50rpx; */ |
| | | |
| | | } |
| | | |
| | | .menuBox { |
| | | display: flex; |
| | | height: 75rpx; |
| | | |
| | | } |
| | | |
| | | .assembleContent { |
| | | background-color: #F2F3F8; |
| | | } |
| | |
| | | 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, |
| | | }); |
| | |
| | | sort: { type: 'Asc', field: 'LinkOrder' }, |
| | | }; |
| | | app.MG.store.getStoreChannelList(query).then(async (res) => { |
| | | |
| | | console.log(res, 'res'); |
| | | // 一级分类选中 |
| | | this.setData({ |
| | | startCheck: res.datas[0].refCode, |
| | |
| | | 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() { |
| | | 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; |
| | | onLoad(options) { |
| | | wx.setNavigationBarTitle({ |
| | | title: '购物车' |
| | | }); |
| | | this.shoppingCartGet(); |
| | | }, |
| | | |
| | | 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, |
| | | shoppingCartGet() { |
| | | let query = { |
| | | start: 0, |
| | | size: 999, |
| | | filterList: [], |
| | | searchList: [] |
| | | }; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | return { |
| | | currentStore, |
| | | currentActivity, |
| | | currentGoods, |
| | | }; |
| | | }, |
| | | app.MG.store.getShoppingCartProductList(query).then(res => { |
| | | res.datas.forEach(item => { |
| | | item.imgUrl = getPublicImage(item.productMonWithLinkDto.product.icon, '', '160'); |
| | | }); |
| | | |
| | | // 注:实际场景时应该调用接口获取购物车数据 |
| | | 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; |
| | | this.setData({ |
| | | shoppingCartData: res.datas |
| | | }); |
| | | }); |
| | | 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: '', |
| | | bottomChange(e) { |
| | | const checked = e.detail.value.length > 0; |
| | | const items = this.data.shoppingCartData.map(item => { |
| | | item.checked = checked; |
| | | return item; |
| | | }); |
| | | 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: '当前商品库存不足', |
| | | this.setData({ |
| | | shoppingCartData: items, |
| | | checkAll: checked |
| | | }); |
| | | return; |
| | | this.calculateSelectedCount(); |
| | | this.calculateTotalPrice(); |
| | | }, |
| | | |
| | | 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 |
| | | } |
| | | Dialog.confirm({ |
| | | title: '商品库存不足', |
| | | content: `当前商品库存不足,最大可购买数量为${stockQuantity}件`, |
| | | confirmBtn: '修改为最大可购买数量', |
| | | cancelBtn: '取消', |
| | | |
| | | |
| | | }) |
| | | .then(() => { |
| | | this.changeQuantityService({ |
| | | spuId, |
| | | skuId, |
| | | quantity: stockQuantity, |
| | | }).then(() => this.refreshData()); |
| | | const data = items.filter(item => item.checked) |
| | | const checkAll = data.length == this.data.shoppingCartData.length |
| | | |
| | | this.setData({ |
| | | shoppingCartData: items, |
| | | checkAll |
| | | }); |
| | | this.calculateSelectedCount(); |
| | | this.calculateTotalPrice(); |
| | | }, |
| | | |
| | | 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 |
| | | }); |
| | | |
| | | |
| | | }) |
| | | .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(); |
| | | }); |
| | | }); |
| | | }, |
| | | |
| | | onSelectAll(event) { |
| | | const { isAllSelected } = event?.detail ?? {}; |
| | | Toast({ |
| | | context: this, |
| | | selector: '#t-toast', |
| | | message: `${isAllSelected ? '取消' : '点击'}了全选按钮`, |
| | | }); |
| | | // 调用接口改变全选 |
| | | }, |
| | | |
| | | onToSettle() { |
| | | const goodsRequestList = []; |
| | | this.data.cartGroupData.storeGoods.forEach((store) => { |
| | | store.promotionGoodsList.forEach((promotion) => { |
| | | promotion.goodsPromotionList.forEach((m) => { |
| | | if (m.isSelected == 1) { |
| | | goodsRequestList.push(m); |
| | | } |
| | | }); |
| | | }); |
| | | }); |
| | | wx.setStorageSync('order.goodsRequestList', JSON.stringify(goodsRequestList)); |
| | | wx.navigateTo({ url: '/pages/order/order-confirm/index?type=cart' }); |
| | | }, |
| | | onGotoHome() { |
| | | wx.switchTab({ url: '/pages/home/home' }); |
| | | }, |
| | | }); |
| | |
| | | { |
| | | "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" |
| | | } |
| | | } |
| | |
| | | <!-- 分层购物车 --> |
| | | <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> |
| | |
| | | :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%; |
| | | } |
New file |
| | |
| | | // 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 }); |
| | | }, |
| | | |
| | | }) |
New file |
| | |
| | | { |
| | | "component": true, |
| | | |
| | | "usingComponents": { |
| | | "t-icon": "tdesign-miniprogram/icon/icon", |
| | | "t-button": "tdesign-miniprogram/button/button", |
| | | "t-dialog": "tdesign-miniprogram/dialog/dialog" |
| | | }, |
| | | "navigationStyle": "custom" |
| | | } |
New file |
| | |
| | | <!--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> |
New file |
| | |
| | | /* 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; |
| | | } |
New file |
| | |
| | | /** |
| | | * 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; |
| | | |
| | | }))); |
| | |
| | | |
| | | data: { |
| | | fillPrice: false, |
| | | shoppingCartGetId: null |
| | | }, |
| | | |
| | | methods: { |
| | |
| | | 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) { |
| | |
| | | </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 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}} |
| | |
| | | <slot name="buyButton" /> |
| | | </block> |
| | | </view> |
| | | |
| | |
| | | booksList: [], |
| | | readBookList: [], //数字阅读 |
| | | textbookList: [], //数字教材 |
| | | rankingList: []//排行榜 |
| | | rankingList: [],//排行榜 |
| | | shoppingCartGetId: [] |
| | | }, |
| | | onShow() { |
| | | this.getTabBar().init(); |
| | |
| | | this.getBookTypeList(); |
| | | this.getReadBookList(); |
| | | this.getTextbookListList(); |
| | | this.getRankingList() |
| | | this.getRankingList(); |
| | | this.getShoppingCartList() |
| | | }, |
| | | // 获取测试登录时的token |
| | | getTestLoginInfo() { |
| | |
| | | toPages(item) { |
| | | let info = item.target.dataset.info |
| | | if (info.url) { |
| | | if (info.text == "图书服务") { |
| | | wx.switchTab({ |
| | | url: info.url |
| | | }) |
| | | } else { |
| | | wx.navigateTo({ |
| | | url: info.url |
| | | }) |
| | | } |
| | | } else { |
| | | wx.showToast({ |
| | | title: "建设中", |
| | |
| | | }) |
| | | }) |
| | | }, |
| | | |
| | | |
| | | //精选课程分类 |
| | | getCourseTypeListList() { |
| | |
| | | //图书服务 |
| | | tabBookClick(item) { |
| | | let info = this.data.bookTypeList[item.detail.value] |
| | | console.log(info, 123) |
| | | this.getBooksList(info) |
| | | }, |
| | | //数字阅读 |
| | |
| | | //获取排行榜 |
| | | 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) => { |
| | |
| | | }) |
| | | }) |
| | | }, |
| | | // 跳转图书详情 |
| | | 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({ |
| | |
| | | <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" /> |
| | |
| | | <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> |
| | |
| | | </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" /> |
| | |
| | | <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> |
| | |
| | | <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> |
| | |
| | | </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> |
| | |
| | | <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" /> |
| | |
| | | <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" /> |
| | |
| | | <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> |
| | |
| | | <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="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" /> |
| | | <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> |
| | | </view> |
| | | </view> |
| | | </scroll-view> |
| | | </view> |
| | | </view> |
| | | <load-more list-is-empty="{{!goodsList.length}}" status="{{goodsListLoadStatus}}" bind:retry="onReTry" /> |
| | |
| | | } |
| | | |
| | | .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, |
| | |
| | | } |
| | | |
| | | .listBox1 .priceBox { |
| | | margin-top: 14rpx; |
| | | margin-top: 10rpx; |
| | | } |
| | | |
| | | .listBox2 { |
| | |
| | | } |
| | | |
| | | .listBox2 .specialSubject-img { |
| | | height: 300rpx; |
| | | height: 280rpx; |
| | | width: 100%; |
| | | box-shadow: 0px 0px 20rpx 2px #f1f1f1; |
| | | } |
| | |
| | | |
| | | .listBox3 .textbooksItemBox .specialSubject-img { |
| | | width: 190rpx; |
| | | height: 260rpx; |
| | | height: 250rpx; |
| | | box-shadow: 0px 0px 20rpx 2px #f1f1f1; |
| | | } |
| | | |
| | |
| | | .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 */ |
| | |
| | | <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 |
| | | 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, |
| | | |
| | | }, |
| | | |
| | |
| | | */ |
| | | onLoad(options) { |
| | | console.log(options); |
| | | // if (this.data.activeName == "proposition") { |
| | | // this.getDataList("bookOpinion", false); |
| | | // } else { |
| | | // this.getDataList("feedback", false); |
| | | // } |
| | | }, |
| | | |
| | | /** |
| | |
| | | onShow() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面隐藏 |
| | | */ |
| | | onHide() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面卸载 |
| | | */ |
| | |
| | | |
| | | }, |
| | | |
| | | 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", |
| | | }); |
| | | }, |
| | | |
| | | /** |
| | |
| | | { |
| | | "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--> |
| | | <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 */ |
| | | 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 |
| | | const app = getApp(); |
| | | Page({ |
| | | |
| | | /** |
| | | * 页面的初始数据 |
| | | */ |
| | | data: { |
| | | |
| | | userName: "", |
| | | mannder: "", |
| | | content: "", |
| | | lock: true, |
| | | }, |
| | | |
| | | /** |
| | |
| | | * 生命周期函数--监听页面显示 |
| | | */ |
| | | onShow() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | |
| | | 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--> |
| | | <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 */ |
| | | 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; |
| | | } |
| | |
| | | { |
| | | title: '建议与反馈', |
| | | icon: '/static/images/personal/feedback.png', |
| | | url: '/pages/personalCenter/feedback/index', |
| | | url: '/pages/personalCenter/feedBack/index', |
| | | type: 'feedback', |
| | | } |
| | | ]; |
| | |
| | | //点击目录 |
| | | 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 |
| | |
| | | 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, |
| | | }, |
| | | |
| | | /** |
| | |
| | | */ |
| | | onLoad(options) { |
| | | console.log(options); |
| | | this.getDataList(); |
| | | }, |
| | | |
| | | /** |
| | |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面显示 |
| | | */ |
| | | 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 |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面卸载 |
| | | */ |
| | | onUnload() { |
| | | |
| | | 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) |
| | | } |
| | | }) |
| | | }, |
| | | |
| | | /** |
| | | * 页面相关事件处理函数--监听用户下拉动作 |
| | | */ |
| | | 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, |
| | | // }); |
| | | }, |
| | | |
| | | |
| | | /** |
| | | * 用户点击右上角分享 |
| | | */ |
| | |
| | | { |
| | | "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" |
| | | } |
| | | } |
| | |
| | | <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> |
| | |
| | | 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; |
| | | } |
| | |
| | | res.datas.forEach((item) => { |
| | | item.createDate = moment(item.createDate).format("YYYY-MM-DD HH:mm"); |
| | | }); |
| | | |
| | | let dataList = res.datas; |
| | | |
| | | //触底加载新数据并保留老数据 |
| | |
| | | } |
| | | this.setData({ |
| | | list: dataList, |
| | | pageTotalCount: res.total, |
| | | pageTotalCount: res.totalSize, |
| | | bottomLoading: false, |
| | | isMoreData: dataList.length > 0 ? false : true, |
| | | skeletonLoding: false, |
| | |
| | | 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: [] |
| | | }, |
| | | |
| | | /** |
| | |
| | | */ |
| | | onLoad(options) { |
| | | console.log(options); |
| | | this.getDataList(false) |
| | | }, |
| | | |
| | | /** |
| | |
| | | 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); |
| | | }, |
| | | |
| | | /** |
| | |
| | | { |
| | | "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--> |
| | | <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> |
| | |
| | | .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; |
| | | } |
New file |
| | |
| | | // 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() { |
| | | |
| | | } |
| | | }) |
New file |
| | |
| | | { |
| | | "usingComponents": { |
| | | "t-icon": "tdesign-miniprogram/icon/icon" |
| | | }, |
| | | "navigationStyle": "custom" |
| | | } |
New file |
| | |
| | | <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> |
New file |
| | |
| | | /* 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; |
| | | } |
New file |
| | |
| | | // 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() |
| | | } |
| | | |
| | | }) |
New file |
| | |
| | | { |
| | | "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" |
| | | } |
New file |
| | |
| | | <!--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> |
New file |
| | |
| | | /* 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; |
| | | } |
| | |
| | | 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'); |
| | | // }); |
| | | // } |
| | |
| | | text: '图书服务', |
| | | key: 0, |
| | | icon: '/static/images/home/zhutichuban@2x.png', |
| | | url: '/pages/bookServices/assort/index.wxml', |
| | | url: '/pages/bookServices/assort/index', |
| | | }, |
| | | { |
| | | text: '数字阅读', |
| | |
| | | text: '线上书展', |
| | | key: 5, |
| | | icon: '/static/images/home/xianshangshuzhan@2x.png', |
| | | url: '', |
| | | url: '/pages/bookExhibitionList/index', |
| | | }, |
| | | { |
| | | text: '书目下载', |