22个文件已删除
15个文件已修改
64个文件已添加
| | |
| | | { |
| | | "pages": [ |
| | | "pages/cart/index", |
| | | "pages/home/home", |
| | | "pages/aboutUs/index", |
| | | "pages/bookServices/index", |
| | | "pages/bookExhibitionList/index", |
| | | "pages/bookExhibitionDetails/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", |
| | |
| | | "pages/order/fill-tracking-no/index", |
| | | "pages/order/delivery-detail/index", |
| | | "pages/order/invoice/index", |
| | | "pages/usercenter/name-edit/index" |
| | | "pages/usercenter/name-edit/index", |
| | | "pages/teacherCertification/index", |
| | | "pages/personalCenter/index", |
| | | "pages/personalCenter/myOrder/index", |
| | | "pages/personalCenter/myCollection/index", |
| | | "pages/personalCenter/myMassage/index", |
| | | "pages/personalCenter/myMassage/massageDetail/index", |
| | | "pages/personalCenter/feedBack/index", |
| | | "pages/personalCenter/feedBackSubmit/index", |
| | | "pages/personalCenter/certificate/index", |
| | | "pages/personalCenter/publishBooks/index", |
| | | "pages/personalCenter/sampleBooks/index", |
| | | "pages/personalCenter/downloads/index", |
| | | "pages/personalCenter/activateProduct/index", |
| | | "pages/testLogin/index" |
| | | ], |
| | | "tabBar": { |
| | | "custom": true, |
| | |
| | | "backgroundTextStyle": "light", |
| | | "navigationBarBackgroundColor": "#fff", |
| | | "navigationBarTitleText": "京师E课", |
| | | "navigationBarTextStyle": "black" |
| | | "navigationBarTextStyle": "black", |
| | | " navigationStyle": "custom" |
| | | }, |
| | | "sitemapLocation": "sitemap.json", |
| | | "permission": { |
| | |
| | | { |
| | | icon: 'person', |
| | | text: '个人中心', |
| | | url: 'pages/usercenter/index', |
| | | url: 'pages/personalCenter/index', |
| | | }, |
| | | ]; |
New file |
| | |
| | | // pages/aboutUs/index.js |
| | | const app = getApp() |
| | | import drawQrcode from './js/weapp.qrcode' |
| | | Page({ |
| | | |
| | | /** |
| | | * 页面的初始数据 |
| | | */ |
| | | data: { |
| | | aboutText: null, |
| | | swiperList: null, |
| | | qrcodeWidth: 0, |
| | | 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 }, |
| | | coverSize: { |
| | | width: 250 |
| | | }, |
| | | fields: { |
| | | jsek_link: [] |
| | | } |
| | | }).then(res => { |
| | | // console.log(res.datas[0].icon, 'res'); |
| | | this.setData({ |
| | | bannerList: res.datas[0].icon, |
| | | swiperList: res.datas[0].icon |
| | | }) |
| | | // console.log(this.data.swiperList); |
| | | }) |
| | | }, |
| | | getAboutText() { |
| | | app.MG.resource.getItem({ |
| | | path: 'jsek_aboutUs', |
| | | fields: { |
| | | content: [] |
| | | }, |
| | | }).then(res => { |
| | | console.log(res); |
| | | |
| | | this.setData({ |
| | | aboutText: res.datas[0].content |
| | | }) |
| | | |
| | | console.log(this.data.aboutText); |
| | | }) |
| | | } |
| | | }) |
New file |
| | |
| | | { |
| | | "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="swiper-wrap"> |
| | | <t-swiper wx:if="{{bannerList.length > 0}}" list="{{bannerList}}" current="{{current}}" autoplay="{{autoplay}}" duration="{{duration}}" interval="{{interval}}" navigation="{{navigation}}" bind:click="navToActivityDetail" /> |
| | | </view> |
| | | |
| | | |
| | | <!-- 二维码展示 --> |
| | | <!-- <view class=""> |
| | | <canvas style="width: 200px; height: 200px;margin:0 auto" canvas-id="myQrcode"></canvas> |
| | | </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 |
| | |
| | | /** |
| | | * weapp.qrcode.js v1.0.0 (https://github.com/yingye/weapp-qrcode#readme) |
| | | */ |
| | | |
| | | (function (global, factory) { |
| | | typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : |
| | | typeof define === 'function' && define.amd ? define(factory) : |
| | | (global.drawQrcode = factory()); |
| | | }(this, (function () { 'use strict'; |
| | | |
| | | var hasOwn = Object.prototype.hasOwnProperty; |
| | | var toStr = Object.prototype.toString; |
| | | var defineProperty = Object.defineProperty; |
| | | var gOPD = Object.getOwnPropertyDescriptor; |
| | | |
| | | var isArray = function isArray(arr) { |
| | | if (typeof Array.isArray === 'function') { |
| | | return Array.isArray(arr); |
| | | } |
| | | |
| | | return toStr.call(arr) === '[object Array]'; |
| | | }; |
| | | |
| | | var isPlainObject = function isPlainObject(obj) { |
| | | if (!obj || toStr.call(obj) !== '[object Object]') { |
| | | return false; |
| | | } |
| | | |
| | | var hasOwnConstructor = hasOwn.call(obj, 'constructor'); |
| | | var hasIsPrototypeOf = obj.constructor && obj.constructor.prototype && hasOwn.call(obj.constructor.prototype, 'isPrototypeOf'); |
| | | // Not own constructor property must be Object |
| | | if (obj.constructor && !hasOwnConstructor && !hasIsPrototypeOf) { |
| | | return false; |
| | | } |
| | | |
| | | // Own properties are enumerated firstly, so to speed up, |
| | | // if last one is own, then all properties are own. |
| | | var key; |
| | | for (key in obj) { /**/ } |
| | | |
| | | return typeof key === 'undefined' || hasOwn.call(obj, key); |
| | | }; |
| | | |
| | | // If name is '__proto__', and Object.defineProperty is available, define __proto__ as an own property on target |
| | | var setProperty = function setProperty(target, options) { |
| | | if (defineProperty && options.name === '__proto__') { |
| | | defineProperty(target, options.name, { |
| | | enumerable: true, |
| | | configurable: true, |
| | | value: options.newValue, |
| | | writable: true |
| | | }); |
| | | } else { |
| | | target[options.name] = options.newValue; |
| | | } |
| | | }; |
| | | |
| | | // Return undefined instead of __proto__ if '__proto__' is not an own property |
| | | var getProperty = function getProperty(obj, name) { |
| | | if (name === '__proto__') { |
| | | if (!hasOwn.call(obj, name)) { |
| | | return void 0; |
| | | } else if (gOPD) { |
| | | // In early versions of node, obj['__proto__'] is buggy when obj has |
| | | // __proto__ as an own property. Object.getOwnPropertyDescriptor() works. |
| | | return gOPD(obj, name).value; |
| | | } |
| | | } |
| | | |
| | | return obj[name]; |
| | | }; |
| | | |
| | | var extend = function extend() { |
| | | var options, name, src, copy, copyIsArray, clone; |
| | | var target = arguments[0]; |
| | | var i = 1; |
| | | var length = arguments.length; |
| | | var deep = false; |
| | | |
| | | // Handle a deep copy situation |
| | | if (typeof target === 'boolean') { |
| | | deep = target; |
| | | target = arguments[1] || {}; |
| | | // skip the boolean and the target |
| | | i = 2; |
| | | } |
| | | if (target == null || (typeof target !== 'object' && typeof target !== 'function')) { |
| | | target = {}; |
| | | } |
| | | |
| | | for (; i < length; ++i) { |
| | | options = arguments[i]; |
| | | // Only deal with non-null/undefined values |
| | | if (options != null) { |
| | | // Extend the base object |
| | | for (name in options) { |
| | | src = getProperty(target, name); |
| | | copy = getProperty(options, name); |
| | | |
| | | // Prevent never-ending loop |
| | | if (target !== copy) { |
| | | // Recurse if we're merging plain objects or arrays |
| | | if (deep && copy && (isPlainObject(copy) || (copyIsArray = isArray(copy)))) { |
| | | if (copyIsArray) { |
| | | copyIsArray = false; |
| | | clone = src && isArray(src) ? src : []; |
| | | } else { |
| | | clone = src && isPlainObject(src) ? src : {}; |
| | | } |
| | | |
| | | // Never move original objects, clone them |
| | | setProperty(target, { name: name, newValue: extend(deep, clone, copy) }); |
| | | |
| | | // Don't bring in undefined values |
| | | } else if (typeof copy !== 'undefined') { |
| | | setProperty(target, { name: name, newValue: copy }); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | // Return the modified object |
| | | return target; |
| | | }; |
| | | |
| | | //--------------------------------------------------------------------- |
| | | // QRCode for JavaScript |
| | | // |
| | | // Copyright (c) 2009 Kazuhiko Arase |
| | | // |
| | | // URL: http://www.d-project.com/ |
| | | // |
| | | // Licensed under the MIT license: |
| | | // http://www.opensource.org/licenses/mit-license.php |
| | | // |
| | | // The word "QR Code" is registered trademark of |
| | | // DENSO WAVE INCORPORATED |
| | | // http://www.denso-wave.com/qrcode/faqpatent-e.html |
| | | // |
| | | //--------------------------------------------------------------------- |
| | | |
| | | //--------------------------------------------------------------------- |
| | | // QR8bitByte |
| | | //--------------------------------------------------------------------- |
| | | |
| | | function QR8bitByte(data) { |
| | | this.mode = QRMode.MODE_8BIT_BYTE; |
| | | this.data = data; |
| | | } |
| | | |
| | | QR8bitByte.prototype = { |
| | | |
| | | getLength: function (buffer) { |
| | | return this.data.length; |
| | | }, |
| | | |
| | | write: function (buffer) { |
| | | for (var i = 0; i < this.data.length; i++) { |
| | | // not JIS ... |
| | | buffer.put(this.data.charCodeAt(i), 8); |
| | | } |
| | | } |
| | | }; |
| | | |
| | | //--------------------------------------------------------------------- |
| | | // QRCode |
| | | //--------------------------------------------------------------------- |
| | | |
| | | function QRCode(typeNumber, errorCorrectLevel) { |
| | | this.typeNumber = typeNumber; |
| | | this.errorCorrectLevel = errorCorrectLevel; |
| | | this.modules = null; |
| | | this.moduleCount = 0; |
| | | this.dataCache = null; |
| | | this.dataList = new Array(); |
| | | } |
| | | |
| | | QRCode.prototype = { |
| | | |
| | | addData: function (data) { |
| | | var newData = new QR8bitByte(data); |
| | | this.dataList.push(newData); |
| | | this.dataCache = null; |
| | | }, |
| | | |
| | | isDark: function (row, col) { |
| | | if (row < 0 || this.moduleCount <= row || col < 0 || this.moduleCount <= col) { |
| | | throw new Error(row + "," + col); |
| | | } |
| | | return this.modules[row][col]; |
| | | }, |
| | | |
| | | getModuleCount: function () { |
| | | return this.moduleCount; |
| | | }, |
| | | |
| | | make: function () { |
| | | // Calculate automatically typeNumber if provided is < 1 |
| | | if (this.typeNumber < 1) { |
| | | var typeNumber = 1; |
| | | for (typeNumber = 1; typeNumber < 40; typeNumber++) { |
| | | var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, this.errorCorrectLevel); |
| | | |
| | | var buffer = new QRBitBuffer(); |
| | | var totalDataCount = 0; |
| | | for (var i = 0; i < rsBlocks.length; i++) { |
| | | totalDataCount += rsBlocks[i].dataCount; |
| | | } |
| | | |
| | | for (var i = 0; i < this.dataList.length; i++) { |
| | | var data = this.dataList[i]; |
| | | buffer.put(data.mode, 4); |
| | | buffer.put(data.getLength(), QRUtil.getLengthInBits(data.mode, typeNumber)); |
| | | data.write(buffer); |
| | | } |
| | | if (buffer.getLengthInBits() <= totalDataCount * 8) break; |
| | | } |
| | | this.typeNumber = typeNumber; |
| | | } |
| | | this.makeImpl(false, this.getBestMaskPattern()); |
| | | }, |
| | | |
| | | makeImpl: function (test, maskPattern) { |
| | | |
| | | this.moduleCount = this.typeNumber * 4 + 17; |
| | | this.modules = new Array(this.moduleCount); |
| | | |
| | | for (var row = 0; row < this.moduleCount; row++) { |
| | | |
| | | this.modules[row] = new Array(this.moduleCount); |
| | | |
| | | for (var col = 0; col < this.moduleCount; col++) { |
| | | this.modules[row][col] = null; //(col + row) % 3; |
| | | } |
| | | } |
| | | |
| | | this.setupPositionProbePattern(0, 0); |
| | | this.setupPositionProbePattern(this.moduleCount - 7, 0); |
| | | this.setupPositionProbePattern(0, this.moduleCount - 7); |
| | | this.setupPositionAdjustPattern(); |
| | | this.setupTimingPattern(); |
| | | this.setupTypeInfo(test, maskPattern); |
| | | |
| | | if (this.typeNumber >= 7) { |
| | | this.setupTypeNumber(test); |
| | | } |
| | | |
| | | if (this.dataCache == null) { |
| | | this.dataCache = QRCode.createData(this.typeNumber, this.errorCorrectLevel, this.dataList); |
| | | } |
| | | |
| | | this.mapData(this.dataCache, maskPattern); |
| | | }, |
| | | |
| | | setupPositionProbePattern: function (row, col) { |
| | | |
| | | for (var r = -1; r <= 7; r++) { |
| | | |
| | | if (row + r <= -1 || this.moduleCount <= row + r) continue; |
| | | |
| | | for (var c = -1; c <= 7; c++) { |
| | | |
| | | if (col + c <= -1 || this.moduleCount <= col + c) continue; |
| | | |
| | | if (0 <= r && r <= 6 && (c == 0 || c == 6) || 0 <= c && c <= 6 && (r == 0 || r == 6) || 2 <= r && r <= 4 && 2 <= c && c <= 4) { |
| | | this.modules[row + r][col + c] = true; |
| | | } else { |
| | | this.modules[row + r][col + c] = false; |
| | | } |
| | | } |
| | | } |
| | | }, |
| | | |
| | | getBestMaskPattern: function () { |
| | | |
| | | var minLostPoint = 0; |
| | | var pattern = 0; |
| | | |
| | | for (var i = 0; i < 8; i++) { |
| | | |
| | | this.makeImpl(true, i); |
| | | |
| | | var lostPoint = QRUtil.getLostPoint(this); |
| | | |
| | | if (i == 0 || minLostPoint > lostPoint) { |
| | | minLostPoint = lostPoint; |
| | | pattern = i; |
| | | } |
| | | } |
| | | |
| | | return pattern; |
| | | }, |
| | | |
| | | createMovieClip: function (target_mc, instance_name, depth) { |
| | | |
| | | var qr_mc = target_mc.createEmptyMovieClip(instance_name, depth); |
| | | var cs = 1; |
| | | |
| | | this.make(); |
| | | |
| | | for (var row = 0; row < this.modules.length; row++) { |
| | | |
| | | var y = row * cs; |
| | | |
| | | for (var col = 0; col < this.modules[row].length; col++) { |
| | | |
| | | var x = col * cs; |
| | | var dark = this.modules[row][col]; |
| | | |
| | | if (dark) { |
| | | qr_mc.beginFill(0, 100); |
| | | qr_mc.moveTo(x, y); |
| | | qr_mc.lineTo(x + cs, y); |
| | | qr_mc.lineTo(x + cs, y + cs); |
| | | qr_mc.lineTo(x, y + cs); |
| | | qr_mc.endFill(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | return qr_mc; |
| | | }, |
| | | |
| | | setupTimingPattern: function () { |
| | | |
| | | for (var r = 8; r < this.moduleCount - 8; r++) { |
| | | if (this.modules[r][6] != null) { |
| | | continue; |
| | | } |
| | | this.modules[r][6] = r % 2 == 0; |
| | | } |
| | | |
| | | for (var c = 8; c < this.moduleCount - 8; c++) { |
| | | if (this.modules[6][c] != null) { |
| | | continue; |
| | | } |
| | | this.modules[6][c] = c % 2 == 0; |
| | | } |
| | | }, |
| | | |
| | | setupPositionAdjustPattern: function () { |
| | | |
| | | var pos = QRUtil.getPatternPosition(this.typeNumber); |
| | | |
| | | for (var i = 0; i < pos.length; i++) { |
| | | |
| | | for (var j = 0; j < pos.length; j++) { |
| | | |
| | | var row = pos[i]; |
| | | var col = pos[j]; |
| | | |
| | | if (this.modules[row][col] != null) { |
| | | continue; |
| | | } |
| | | |
| | | for (var r = -2; r <= 2; r++) { |
| | | |
| | | for (var c = -2; c <= 2; c++) { |
| | | |
| | | if (r == -2 || r == 2 || c == -2 || c == 2 || r == 0 && c == 0) { |
| | | this.modules[row + r][col + c] = true; |
| | | } else { |
| | | this.modules[row + r][col + c] = false; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | }, |
| | | |
| | | setupTypeNumber: function (test) { |
| | | |
| | | var bits = QRUtil.getBCHTypeNumber(this.typeNumber); |
| | | |
| | | for (var i = 0; i < 18; i++) { |
| | | var mod = !test && (bits >> i & 1) == 1; |
| | | this.modules[Math.floor(i / 3)][i % 3 + this.moduleCount - 8 - 3] = mod; |
| | | } |
| | | |
| | | for (var i = 0; i < 18; i++) { |
| | | var mod = !test && (bits >> i & 1) == 1; |
| | | this.modules[i % 3 + this.moduleCount - 8 - 3][Math.floor(i / 3)] = mod; |
| | | } |
| | | }, |
| | | |
| | | setupTypeInfo: function (test, maskPattern) { |
| | | |
| | | var data = this.errorCorrectLevel << 3 | maskPattern; |
| | | var bits = QRUtil.getBCHTypeInfo(data); |
| | | |
| | | // vertical |
| | | for (var i = 0; i < 15; i++) { |
| | | |
| | | var mod = !test && (bits >> i & 1) == 1; |
| | | |
| | | if (i < 6) { |
| | | this.modules[i][8] = mod; |
| | | } else if (i < 8) { |
| | | this.modules[i + 1][8] = mod; |
| | | } else { |
| | | this.modules[this.moduleCount - 15 + i][8] = mod; |
| | | } |
| | | } |
| | | |
| | | // horizontal |
| | | for (var i = 0; i < 15; i++) { |
| | | |
| | | var mod = !test && (bits >> i & 1) == 1; |
| | | |
| | | if (i < 8) { |
| | | this.modules[8][this.moduleCount - i - 1] = mod; |
| | | } else if (i < 9) { |
| | | this.modules[8][15 - i - 1 + 1] = mod; |
| | | } else { |
| | | this.modules[8][15 - i - 1] = mod; |
| | | } |
| | | } |
| | | |
| | | // fixed module |
| | | this.modules[this.moduleCount - 8][8] = !test; |
| | | }, |
| | | |
| | | mapData: function (data, maskPattern) { |
| | | |
| | | var inc = -1; |
| | | var row = this.moduleCount - 1; |
| | | var bitIndex = 7; |
| | | var byteIndex = 0; |
| | | |
| | | for (var col = this.moduleCount - 1; col > 0; col -= 2) { |
| | | |
| | | if (col == 6) col--; |
| | | |
| | | while (true) { |
| | | |
| | | for (var c = 0; c < 2; c++) { |
| | | |
| | | if (this.modules[row][col - c] == null) { |
| | | |
| | | var dark = false; |
| | | |
| | | if (byteIndex < data.length) { |
| | | dark = (data[byteIndex] >>> bitIndex & 1) == 1; |
| | | } |
| | | |
| | | var mask = QRUtil.getMask(maskPattern, row, col - c); |
| | | |
| | | if (mask) { |
| | | dark = !dark; |
| | | } |
| | | |
| | | this.modules[row][col - c] = dark; |
| | | bitIndex--; |
| | | |
| | | if (bitIndex == -1) { |
| | | byteIndex++; |
| | | bitIndex = 7; |
| | | } |
| | | } |
| | | } |
| | | |
| | | row += inc; |
| | | |
| | | if (row < 0 || this.moduleCount <= row) { |
| | | row -= inc; |
| | | inc = -inc; |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | }; |
| | | |
| | | QRCode.PAD0 = 0xEC; |
| | | QRCode.PAD1 = 0x11; |
| | | |
| | | QRCode.createData = function (typeNumber, errorCorrectLevel, dataList) { |
| | | |
| | | var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, errorCorrectLevel); |
| | | |
| | | var buffer = new QRBitBuffer(); |
| | | |
| | | for (var i = 0; i < dataList.length; i++) { |
| | | var data = dataList[i]; |
| | | buffer.put(data.mode, 4); |
| | | buffer.put(data.getLength(), QRUtil.getLengthInBits(data.mode, typeNumber)); |
| | | data.write(buffer); |
| | | } |
| | | |
| | | // calc num max data. |
| | | var totalDataCount = 0; |
| | | for (var i = 0; i < rsBlocks.length; i++) { |
| | | totalDataCount += rsBlocks[i].dataCount; |
| | | } |
| | | |
| | | if (buffer.getLengthInBits() > totalDataCount * 8) { |
| | | throw new Error("code length overflow. (" + buffer.getLengthInBits() + ">" + totalDataCount * 8 + ")"); |
| | | } |
| | | |
| | | // end code |
| | | if (buffer.getLengthInBits() + 4 <= totalDataCount * 8) { |
| | | buffer.put(0, 4); |
| | | } |
| | | |
| | | // padding |
| | | while (buffer.getLengthInBits() % 8 != 0) { |
| | | buffer.putBit(false); |
| | | } |
| | | |
| | | // padding |
| | | while (true) { |
| | | |
| | | if (buffer.getLengthInBits() >= totalDataCount * 8) { |
| | | break; |
| | | } |
| | | buffer.put(QRCode.PAD0, 8); |
| | | |
| | | if (buffer.getLengthInBits() >= totalDataCount * 8) { |
| | | break; |
| | | } |
| | | buffer.put(QRCode.PAD1, 8); |
| | | } |
| | | |
| | | return QRCode.createBytes(buffer, rsBlocks); |
| | | }; |
| | | |
| | | QRCode.createBytes = function (buffer, rsBlocks) { |
| | | |
| | | var offset = 0; |
| | | |
| | | var maxDcCount = 0; |
| | | var maxEcCount = 0; |
| | | |
| | | var dcdata = new Array(rsBlocks.length); |
| | | var ecdata = new Array(rsBlocks.length); |
| | | |
| | | for (var r = 0; r < rsBlocks.length; r++) { |
| | | |
| | | var dcCount = rsBlocks[r].dataCount; |
| | | var ecCount = rsBlocks[r].totalCount - dcCount; |
| | | |
| | | maxDcCount = Math.max(maxDcCount, dcCount); |
| | | maxEcCount = Math.max(maxEcCount, ecCount); |
| | | |
| | | dcdata[r] = new Array(dcCount); |
| | | |
| | | for (var i = 0; i < dcdata[r].length; i++) { |
| | | dcdata[r][i] = 0xff & buffer.buffer[i + offset]; |
| | | } |
| | | offset += dcCount; |
| | | |
| | | var rsPoly = QRUtil.getErrorCorrectPolynomial(ecCount); |
| | | var rawPoly = new QRPolynomial(dcdata[r], rsPoly.getLength() - 1); |
| | | |
| | | var modPoly = rawPoly.mod(rsPoly); |
| | | ecdata[r] = new Array(rsPoly.getLength() - 1); |
| | | for (var i = 0; i < ecdata[r].length; i++) { |
| | | var modIndex = i + modPoly.getLength() - ecdata[r].length; |
| | | ecdata[r][i] = modIndex >= 0 ? modPoly.get(modIndex) : 0; |
| | | } |
| | | } |
| | | |
| | | var totalCodeCount = 0; |
| | | for (var i = 0; i < rsBlocks.length; i++) { |
| | | totalCodeCount += rsBlocks[i].totalCount; |
| | | } |
| | | |
| | | var data = new Array(totalCodeCount); |
| | | var index = 0; |
| | | |
| | | for (var i = 0; i < maxDcCount; i++) { |
| | | for (var r = 0; r < rsBlocks.length; r++) { |
| | | if (i < dcdata[r].length) { |
| | | data[index++] = dcdata[r][i]; |
| | | } |
| | | } |
| | | } |
| | | |
| | | for (var i = 0; i < maxEcCount; i++) { |
| | | for (var r = 0; r < rsBlocks.length; r++) { |
| | | if (i < ecdata[r].length) { |
| | | data[index++] = ecdata[r][i]; |
| | | } |
| | | } |
| | | } |
| | | |
| | | return data; |
| | | }; |
| | | |
| | | //--------------------------------------------------------------------- |
| | | // QRMode |
| | | //--------------------------------------------------------------------- |
| | | |
| | | var QRMode = { |
| | | MODE_NUMBER: 1 << 0, |
| | | MODE_ALPHA_NUM: 1 << 1, |
| | | MODE_8BIT_BYTE: 1 << 2, |
| | | MODE_KANJI: 1 << 3 |
| | | }; |
| | | |
| | | //--------------------------------------------------------------------- |
| | | // QRErrorCorrectLevel |
| | | //--------------------------------------------------------------------- |
| | | |
| | | var QRErrorCorrectLevel = { |
| | | L: 1, |
| | | M: 0, |
| | | Q: 3, |
| | | H: 2 |
| | | }; |
| | | |
| | | //--------------------------------------------------------------------- |
| | | // QRMaskPattern |
| | | //--------------------------------------------------------------------- |
| | | |
| | | var QRMaskPattern = { |
| | | PATTERN000: 0, |
| | | PATTERN001: 1, |
| | | PATTERN010: 2, |
| | | PATTERN011: 3, |
| | | PATTERN100: 4, |
| | | PATTERN101: 5, |
| | | PATTERN110: 6, |
| | | PATTERN111: 7 |
| | | }; |
| | | |
| | | //--------------------------------------------------------------------- |
| | | // QRUtil |
| | | //--------------------------------------------------------------------- |
| | | |
| | | var QRUtil = { |
| | | |
| | | PATTERN_POSITION_TABLE: [[], [6, 18], [6, 22], [6, 26], [6, 30], [6, 34], [6, 22, 38], [6, 24, 42], [6, 26, 46], [6, 28, 50], [6, 30, 54], [6, 32, 58], [6, 34, 62], [6, 26, 46, 66], [6, 26, 48, 70], [6, 26, 50, 74], [6, 30, 54, 78], [6, 30, 56, 82], [6, 30, 58, 86], [6, 34, 62, 90], [6, 28, 50, 72, 94], [6, 26, 50, 74, 98], [6, 30, 54, 78, 102], [6, 28, 54, 80, 106], [6, 32, 58, 84, 110], [6, 30, 58, 86, 114], [6, 34, 62, 90, 118], [6, 26, 50, 74, 98, 122], [6, 30, 54, 78, 102, 126], [6, 26, 52, 78, 104, 130], [6, 30, 56, 82, 108, 134], [6, 34, 60, 86, 112, 138], [6, 30, 58, 86, 114, 142], [6, 34, 62, 90, 118, 146], [6, 30, 54, 78, 102, 126, 150], [6, 24, 50, 76, 102, 128, 154], [6, 28, 54, 80, 106, 132, 158], [6, 32, 58, 84, 110, 136, 162], [6, 26, 54, 82, 110, 138, 166], [6, 30, 58, 86, 114, 142, 170]], |
| | | |
| | | G15: 1 << 10 | 1 << 8 | 1 << 5 | 1 << 4 | 1 << 2 | 1 << 1 | 1 << 0, |
| | | G18: 1 << 12 | 1 << 11 | 1 << 10 | 1 << 9 | 1 << 8 | 1 << 5 | 1 << 2 | 1 << 0, |
| | | G15_MASK: 1 << 14 | 1 << 12 | 1 << 10 | 1 << 4 | 1 << 1, |
| | | |
| | | getBCHTypeInfo: function (data) { |
| | | var d = data << 10; |
| | | while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15) >= 0) { |
| | | d ^= QRUtil.G15 << QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15); |
| | | } |
| | | return (data << 10 | d) ^ QRUtil.G15_MASK; |
| | | }, |
| | | |
| | | getBCHTypeNumber: function (data) { |
| | | var d = data << 12; |
| | | while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18) >= 0) { |
| | | d ^= QRUtil.G18 << QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18); |
| | | } |
| | | return data << 12 | d; |
| | | }, |
| | | |
| | | getBCHDigit: function (data) { |
| | | |
| | | var digit = 0; |
| | | |
| | | while (data != 0) { |
| | | digit++; |
| | | data >>>= 1; |
| | | } |
| | | |
| | | return digit; |
| | | }, |
| | | |
| | | getPatternPosition: function (typeNumber) { |
| | | return QRUtil.PATTERN_POSITION_TABLE[typeNumber - 1]; |
| | | }, |
| | | |
| | | getMask: function (maskPattern, i, j) { |
| | | |
| | | switch (maskPattern) { |
| | | |
| | | case QRMaskPattern.PATTERN000: |
| | | return (i + j) % 2 == 0; |
| | | case QRMaskPattern.PATTERN001: |
| | | return i % 2 == 0; |
| | | case QRMaskPattern.PATTERN010: |
| | | return j % 3 == 0; |
| | | case QRMaskPattern.PATTERN011: |
| | | return (i + j) % 3 == 0; |
| | | case QRMaskPattern.PATTERN100: |
| | | return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 == 0; |
| | | case QRMaskPattern.PATTERN101: |
| | | return i * j % 2 + i * j % 3 == 0; |
| | | case QRMaskPattern.PATTERN110: |
| | | return (i * j % 2 + i * j % 3) % 2 == 0; |
| | | case QRMaskPattern.PATTERN111: |
| | | return (i * j % 3 + (i + j) % 2) % 2 == 0; |
| | | |
| | | default: |
| | | throw new Error("bad maskPattern:" + maskPattern); |
| | | } |
| | | }, |
| | | |
| | | getErrorCorrectPolynomial: function (errorCorrectLength) { |
| | | |
| | | var a = new QRPolynomial([1], 0); |
| | | |
| | | for (var i = 0; i < errorCorrectLength; i++) { |
| | | a = a.multiply(new QRPolynomial([1, QRMath.gexp(i)], 0)); |
| | | } |
| | | |
| | | return a; |
| | | }, |
| | | |
| | | getLengthInBits: function (mode, type) { |
| | | |
| | | if (1 <= type && type < 10) { |
| | | |
| | | // 1 - 9 |
| | | |
| | | switch (mode) { |
| | | case QRMode.MODE_NUMBER: |
| | | return 10; |
| | | case QRMode.MODE_ALPHA_NUM: |
| | | return 9; |
| | | case QRMode.MODE_8BIT_BYTE: |
| | | return 8; |
| | | case QRMode.MODE_KANJI: |
| | | return 8; |
| | | default: |
| | | throw new Error("mode:" + mode); |
| | | } |
| | | } else if (type < 27) { |
| | | |
| | | // 10 - 26 |
| | | |
| | | switch (mode) { |
| | | case QRMode.MODE_NUMBER: |
| | | return 12; |
| | | case QRMode.MODE_ALPHA_NUM: |
| | | return 11; |
| | | case QRMode.MODE_8BIT_BYTE: |
| | | return 16; |
| | | case QRMode.MODE_KANJI: |
| | | return 10; |
| | | default: |
| | | throw new Error("mode:" + mode); |
| | | } |
| | | } else if (type < 41) { |
| | | |
| | | // 27 - 40 |
| | | |
| | | switch (mode) { |
| | | case QRMode.MODE_NUMBER: |
| | | return 14; |
| | | case QRMode.MODE_ALPHA_NUM: |
| | | return 13; |
| | | case QRMode.MODE_8BIT_BYTE: |
| | | return 16; |
| | | case QRMode.MODE_KANJI: |
| | | return 12; |
| | | default: |
| | | throw new Error("mode:" + mode); |
| | | } |
| | | } else { |
| | | throw new Error("type:" + type); |
| | | } |
| | | }, |
| | | |
| | | getLostPoint: function (qrCode) { |
| | | |
| | | var moduleCount = qrCode.getModuleCount(); |
| | | |
| | | var lostPoint = 0; |
| | | |
| | | // LEVEL1 |
| | | |
| | | for (var row = 0; row < moduleCount; row++) { |
| | | |
| | | for (var col = 0; col < moduleCount; col++) { |
| | | |
| | | var sameCount = 0; |
| | | var dark = qrCode.isDark(row, col); |
| | | |
| | | for (var r = -1; r <= 1; r++) { |
| | | |
| | | if (row + r < 0 || moduleCount <= row + r) { |
| | | continue; |
| | | } |
| | | |
| | | for (var c = -1; c <= 1; c++) { |
| | | |
| | | if (col + c < 0 || moduleCount <= col + c) { |
| | | continue; |
| | | } |
| | | |
| | | if (r == 0 && c == 0) { |
| | | continue; |
| | | } |
| | | |
| | | if (dark == qrCode.isDark(row + r, col + c)) { |
| | | sameCount++; |
| | | } |
| | | } |
| | | } |
| | | |
| | | if (sameCount > 5) { |
| | | lostPoint += 3 + sameCount - 5; |
| | | } |
| | | } |
| | | } |
| | | |
| | | // LEVEL2 |
| | | |
| | | for (var row = 0; row < moduleCount - 1; row++) { |
| | | for (var col = 0; col < moduleCount - 1; col++) { |
| | | var count = 0; |
| | | if (qrCode.isDark(row, col)) count++; |
| | | if (qrCode.isDark(row + 1, col)) count++; |
| | | if (qrCode.isDark(row, col + 1)) count++; |
| | | if (qrCode.isDark(row + 1, col + 1)) count++; |
| | | if (count == 0 || count == 4) { |
| | | lostPoint += 3; |
| | | } |
| | | } |
| | | } |
| | | |
| | | // LEVEL3 |
| | | |
| | | for (var row = 0; row < moduleCount; row++) { |
| | | for (var col = 0; col < moduleCount - 6; col++) { |
| | | if (qrCode.isDark(row, col) && !qrCode.isDark(row, col + 1) && qrCode.isDark(row, col + 2) && qrCode.isDark(row, col + 3) && qrCode.isDark(row, col + 4) && !qrCode.isDark(row, col + 5) && qrCode.isDark(row, col + 6)) { |
| | | lostPoint += 40; |
| | | } |
| | | } |
| | | } |
| | | |
| | | for (var col = 0; col < moduleCount; col++) { |
| | | for (var row = 0; row < moduleCount - 6; row++) { |
| | | if (qrCode.isDark(row, col) && !qrCode.isDark(row + 1, col) && qrCode.isDark(row + 2, col) && qrCode.isDark(row + 3, col) && qrCode.isDark(row + 4, col) && !qrCode.isDark(row + 5, col) && qrCode.isDark(row + 6, col)) { |
| | | lostPoint += 40; |
| | | } |
| | | } |
| | | } |
| | | |
| | | // LEVEL4 |
| | | |
| | | var darkCount = 0; |
| | | |
| | | for (var col = 0; col < moduleCount; col++) { |
| | | for (var row = 0; row < moduleCount; row++) { |
| | | if (qrCode.isDark(row, col)) { |
| | | darkCount++; |
| | | } |
| | | } |
| | | } |
| | | |
| | | var ratio = Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5; |
| | | lostPoint += ratio * 10; |
| | | |
| | | return lostPoint; |
| | | } |
| | | |
| | | }; |
| | | |
| | | //--------------------------------------------------------------------- |
| | | // QRMath |
| | | //--------------------------------------------------------------------- |
| | | |
| | | var QRMath = { |
| | | |
| | | glog: function (n) { |
| | | |
| | | if (n < 1) { |
| | | throw new Error("glog(" + n + ")"); |
| | | } |
| | | |
| | | return QRMath.LOG_TABLE[n]; |
| | | }, |
| | | |
| | | gexp: function (n) { |
| | | |
| | | while (n < 0) { |
| | | n += 255; |
| | | } |
| | | |
| | | while (n >= 256) { |
| | | n -= 255; |
| | | } |
| | | |
| | | return QRMath.EXP_TABLE[n]; |
| | | }, |
| | | |
| | | EXP_TABLE: new Array(256), |
| | | |
| | | LOG_TABLE: new Array(256) |
| | | |
| | | }; |
| | | |
| | | for (var i = 0; i < 8; i++) { |
| | | QRMath.EXP_TABLE[i] = 1 << i; |
| | | } |
| | | for (var i = 8; i < 256; i++) { |
| | | QRMath.EXP_TABLE[i] = QRMath.EXP_TABLE[i - 4] ^ QRMath.EXP_TABLE[i - 5] ^ QRMath.EXP_TABLE[i - 6] ^ QRMath.EXP_TABLE[i - 8]; |
| | | } |
| | | for (var i = 0; i < 255; i++) { |
| | | QRMath.LOG_TABLE[QRMath.EXP_TABLE[i]] = i; |
| | | } |
| | | |
| | | //--------------------------------------------------------------------- |
| | | // QRPolynomial |
| | | //--------------------------------------------------------------------- |
| | | |
| | | function QRPolynomial(num, shift) { |
| | | |
| | | if (num.length == undefined) { |
| | | throw new Error(num.length + "/" + shift); |
| | | } |
| | | |
| | | var offset = 0; |
| | | |
| | | while (offset < num.length && num[offset] == 0) { |
| | | offset++; |
| | | } |
| | | |
| | | this.num = new Array(num.length - offset + shift); |
| | | for (var i = 0; i < num.length - offset; i++) { |
| | | this.num[i] = num[i + offset]; |
| | | } |
| | | } |
| | | |
| | | QRPolynomial.prototype = { |
| | | |
| | | get: function (index) { |
| | | return this.num[index]; |
| | | }, |
| | | |
| | | getLength: function () { |
| | | return this.num.length; |
| | | }, |
| | | |
| | | multiply: function (e) { |
| | | |
| | | var num = new Array(this.getLength() + e.getLength() - 1); |
| | | |
| | | for (var i = 0; i < this.getLength(); i++) { |
| | | for (var j = 0; j < e.getLength(); j++) { |
| | | num[i + j] ^= QRMath.gexp(QRMath.glog(this.get(i)) + QRMath.glog(e.get(j))); |
| | | } |
| | | } |
| | | |
| | | return new QRPolynomial(num, 0); |
| | | }, |
| | | |
| | | mod: function (e) { |
| | | |
| | | if (this.getLength() - e.getLength() < 0) { |
| | | return this; |
| | | } |
| | | |
| | | var ratio = QRMath.glog(this.get(0)) - QRMath.glog(e.get(0)); |
| | | |
| | | var num = new Array(this.getLength()); |
| | | |
| | | for (var i = 0; i < this.getLength(); i++) { |
| | | num[i] = this.get(i); |
| | | } |
| | | |
| | | for (var i = 0; i < e.getLength(); i++) { |
| | | num[i] ^= QRMath.gexp(QRMath.glog(e.get(i)) + ratio); |
| | | } |
| | | |
| | | // recursive call |
| | | return new QRPolynomial(num, 0).mod(e); |
| | | } |
| | | }; |
| | | |
| | | //--------------------------------------------------------------------- |
| | | // QRRSBlock |
| | | //--------------------------------------------------------------------- |
| | | |
| | | function QRRSBlock(totalCount, dataCount) { |
| | | this.totalCount = totalCount; |
| | | this.dataCount = dataCount; |
| | | } |
| | | |
| | | QRRSBlock.RS_BLOCK_TABLE = [ |
| | | |
| | | // L |
| | | // M |
| | | // Q |
| | | // H |
| | | |
| | | // 1 |
| | | [1, 26, 19], [1, 26, 16], [1, 26, 13], [1, 26, 9], |
| | | |
| | | // 2 |
| | | [1, 44, 34], [1, 44, 28], [1, 44, 22], [1, 44, 16], |
| | | |
| | | // 3 |
| | | [1, 70, 55], [1, 70, 44], [2, 35, 17], [2, 35, 13], |
| | | |
| | | // 4 |
| | | [1, 100, 80], [2, 50, 32], [2, 50, 24], [4, 25, 9], |
| | | |
| | | // 5 |
| | | [1, 134, 108], [2, 67, 43], [2, 33, 15, 2, 34, 16], [2, 33, 11, 2, 34, 12], |
| | | |
| | | // 6 |
| | | [2, 86, 68], [4, 43, 27], [4, 43, 19], [4, 43, 15], |
| | | |
| | | // 7 |
| | | [2, 98, 78], [4, 49, 31], [2, 32, 14, 4, 33, 15], [4, 39, 13, 1, 40, 14], |
| | | |
| | | // 8 |
| | | [2, 121, 97], [2, 60, 38, 2, 61, 39], [4, 40, 18, 2, 41, 19], [4, 40, 14, 2, 41, 15], |
| | | |
| | | // 9 |
| | | [2, 146, 116], [3, 58, 36, 2, 59, 37], [4, 36, 16, 4, 37, 17], [4, 36, 12, 4, 37, 13], |
| | | |
| | | // 10 |
| | | [2, 86, 68, 2, 87, 69], [4, 69, 43, 1, 70, 44], [6, 43, 19, 2, 44, 20], [6, 43, 15, 2, 44, 16], |
| | | |
| | | // 11 |
| | | [4, 101, 81], [1, 80, 50, 4, 81, 51], [4, 50, 22, 4, 51, 23], [3, 36, 12, 8, 37, 13], |
| | | |
| | | // 12 |
| | | [2, 116, 92, 2, 117, 93], [6, 58, 36, 2, 59, 37], [4, 46, 20, 6, 47, 21], [7, 42, 14, 4, 43, 15], |
| | | |
| | | // 13 |
| | | [4, 133, 107], [8, 59, 37, 1, 60, 38], [8, 44, 20, 4, 45, 21], [12, 33, 11, 4, 34, 12], |
| | | |
| | | // 14 |
| | | [3, 145, 115, 1, 146, 116], [4, 64, 40, 5, 65, 41], [11, 36, 16, 5, 37, 17], [11, 36, 12, 5, 37, 13], |
| | | |
| | | // 15 |
| | | [5, 109, 87, 1, 110, 88], [5, 65, 41, 5, 66, 42], [5, 54, 24, 7, 55, 25], [11, 36, 12], |
| | | |
| | | // 16 |
| | | [5, 122, 98, 1, 123, 99], [7, 73, 45, 3, 74, 46], [15, 43, 19, 2, 44, 20], [3, 45, 15, 13, 46, 16], |
| | | |
| | | // 17 |
| | | [1, 135, 107, 5, 136, 108], [10, 74, 46, 1, 75, 47], [1, 50, 22, 15, 51, 23], [2, 42, 14, 17, 43, 15], |
| | | |
| | | // 18 |
| | | [5, 150, 120, 1, 151, 121], [9, 69, 43, 4, 70, 44], [17, 50, 22, 1, 51, 23], [2, 42, 14, 19, 43, 15], |
| | | |
| | | // 19 |
| | | [3, 141, 113, 4, 142, 114], [3, 70, 44, 11, 71, 45], [17, 47, 21, 4, 48, 22], [9, 39, 13, 16, 40, 14], |
| | | |
| | | // 20 |
| | | [3, 135, 107, 5, 136, 108], [3, 67, 41, 13, 68, 42], [15, 54, 24, 5, 55, 25], [15, 43, 15, 10, 44, 16], |
| | | |
| | | // 21 |
| | | [4, 144, 116, 4, 145, 117], [17, 68, 42], [17, 50, 22, 6, 51, 23], [19, 46, 16, 6, 47, 17], |
| | | |
| | | // 22 |
| | | [2, 139, 111, 7, 140, 112], [17, 74, 46], [7, 54, 24, 16, 55, 25], [34, 37, 13], |
| | | |
| | | // 23 |
| | | [4, 151, 121, 5, 152, 122], [4, 75, 47, 14, 76, 48], [11, 54, 24, 14, 55, 25], [16, 45, 15, 14, 46, 16], |
| | | |
| | | // 24 |
| | | [6, 147, 117, 4, 148, 118], [6, 73, 45, 14, 74, 46], [11, 54, 24, 16, 55, 25], [30, 46, 16, 2, 47, 17], |
| | | |
| | | // 25 |
| | | [8, 132, 106, 4, 133, 107], [8, 75, 47, 13, 76, 48], [7, 54, 24, 22, 55, 25], [22, 45, 15, 13, 46, 16], |
| | | |
| | | // 26 |
| | | [10, 142, 114, 2, 143, 115], [19, 74, 46, 4, 75, 47], [28, 50, 22, 6, 51, 23], [33, 46, 16, 4, 47, 17], |
| | | |
| | | // 27 |
| | | [8, 152, 122, 4, 153, 123], [22, 73, 45, 3, 74, 46], [8, 53, 23, 26, 54, 24], [12, 45, 15, 28, 46, 16], |
| | | |
| | | // 28 |
| | | [3, 147, 117, 10, 148, 118], [3, 73, 45, 23, 74, 46], [4, 54, 24, 31, 55, 25], [11, 45, 15, 31, 46, 16], |
| | | |
| | | // 29 |
| | | [7, 146, 116, 7, 147, 117], [21, 73, 45, 7, 74, 46], [1, 53, 23, 37, 54, 24], [19, 45, 15, 26, 46, 16], |
| | | |
| | | // 30 |
| | | [5, 145, 115, 10, 146, 116], [19, 75, 47, 10, 76, 48], [15, 54, 24, 25, 55, 25], [23, 45, 15, 25, 46, 16], |
| | | |
| | | // 31 |
| | | [13, 145, 115, 3, 146, 116], [2, 74, 46, 29, 75, 47], [42, 54, 24, 1, 55, 25], [23, 45, 15, 28, 46, 16], |
| | | |
| | | // 32 |
| | | [17, 145, 115], [10, 74, 46, 23, 75, 47], [10, 54, 24, 35, 55, 25], [19, 45, 15, 35, 46, 16], |
| | | |
| | | // 33 |
| | | [17, 145, 115, 1, 146, 116], [14, 74, 46, 21, 75, 47], [29, 54, 24, 19, 55, 25], [11, 45, 15, 46, 46, 16], |
| | | |
| | | // 34 |
| | | [13, 145, 115, 6, 146, 116], [14, 74, 46, 23, 75, 47], [44, 54, 24, 7, 55, 25], [59, 46, 16, 1, 47, 17], |
| | | |
| | | // 35 |
| | | [12, 151, 121, 7, 152, 122], [12, 75, 47, 26, 76, 48], [39, 54, 24, 14, 55, 25], [22, 45, 15, 41, 46, 16], |
| | | |
| | | // 36 |
| | | [6, 151, 121, 14, 152, 122], [6, 75, 47, 34, 76, 48], [46, 54, 24, 10, 55, 25], [2, 45, 15, 64, 46, 16], |
| | | |
| | | // 37 |
| | | [17, 152, 122, 4, 153, 123], [29, 74, 46, 14, 75, 47], [49, 54, 24, 10, 55, 25], [24, 45, 15, 46, 46, 16], |
| | | |
| | | // 38 |
| | | [4, 152, 122, 18, 153, 123], [13, 74, 46, 32, 75, 47], [48, 54, 24, 14, 55, 25], [42, 45, 15, 32, 46, 16], |
| | | |
| | | // 39 |
| | | [20, 147, 117, 4, 148, 118], [40, 75, 47, 7, 76, 48], [43, 54, 24, 22, 55, 25], [10, 45, 15, 67, 46, 16], |
| | | |
| | | // 40 |
| | | [19, 148, 118, 6, 149, 119], [18, 75, 47, 31, 76, 48], [34, 54, 24, 34, 55, 25], [20, 45, 15, 61, 46, 16]]; |
| | | |
| | | QRRSBlock.getRSBlocks = function (typeNumber, errorCorrectLevel) { |
| | | |
| | | var rsBlock = QRRSBlock.getRsBlockTable(typeNumber, errorCorrectLevel); |
| | | |
| | | if (rsBlock == undefined) { |
| | | throw new Error("bad rs block @ typeNumber:" + typeNumber + "/errorCorrectLevel:" + errorCorrectLevel); |
| | | } |
| | | |
| | | var length = rsBlock.length / 3; |
| | | |
| | | var list = new Array(); |
| | | |
| | | for (var i = 0; i < length; i++) { |
| | | |
| | | var count = rsBlock[i * 3 + 0]; |
| | | var totalCount = rsBlock[i * 3 + 1]; |
| | | var dataCount = rsBlock[i * 3 + 2]; |
| | | |
| | | for (var j = 0; j < count; j++) { |
| | | list.push(new QRRSBlock(totalCount, dataCount)); |
| | | } |
| | | } |
| | | |
| | | return list; |
| | | }; |
| | | |
| | | QRRSBlock.getRsBlockTable = function (typeNumber, errorCorrectLevel) { |
| | | |
| | | switch (errorCorrectLevel) { |
| | | case QRErrorCorrectLevel.L: |
| | | return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 0]; |
| | | case QRErrorCorrectLevel.M: |
| | | return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 1]; |
| | | case QRErrorCorrectLevel.Q: |
| | | return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 2]; |
| | | case QRErrorCorrectLevel.H: |
| | | return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 3]; |
| | | default: |
| | | return undefined; |
| | | } |
| | | }; |
| | | |
| | | //--------------------------------------------------------------------- |
| | | // QRBitBuffer |
| | | //--------------------------------------------------------------------- |
| | | |
| | | function QRBitBuffer() { |
| | | this.buffer = new Array(); |
| | | this.length = 0; |
| | | } |
| | | |
| | | QRBitBuffer.prototype = { |
| | | |
| | | get: function (index) { |
| | | var bufIndex = Math.floor(index / 8); |
| | | return (this.buffer[bufIndex] >>> 7 - index % 8 & 1) == 1; |
| | | }, |
| | | |
| | | put: function (num, length) { |
| | | for (var i = 0; i < length; i++) { |
| | | this.putBit((num >>> length - i - 1 & 1) == 1); |
| | | } |
| | | }, |
| | | |
| | | getLengthInBits: function () { |
| | | return this.length; |
| | | }, |
| | | |
| | | putBit: function (bit) { |
| | | |
| | | var bufIndex = Math.floor(this.length / 8); |
| | | if (this.buffer.length <= bufIndex) { |
| | | this.buffer.push(0); |
| | | } |
| | | |
| | | if (bit) { |
| | | this.buffer[bufIndex] |= 0x80 >>> this.length % 8; |
| | | } |
| | | |
| | | this.length++; |
| | | } |
| | | }; |
| | | |
| | | // support Chinese |
| | | function utf16to8(str) { |
| | | var out, i, len, c; |
| | | out = ''; |
| | | len = str.length; |
| | | for (i = 0; i < len; i++) { |
| | | c = str.charCodeAt(i); |
| | | if (c >= 0x0001 && c <= 0x007F) { |
| | | out += str.charAt(i); |
| | | } else if (c > 0x07FF) { |
| | | out += String.fromCharCode(0xE0 | c >> 12 & 0x0F); |
| | | out += String.fromCharCode(0x80 | c >> 6 & 0x3F); |
| | | out += String.fromCharCode(0x80 | c >> 0 & 0x3F); |
| | | } else { |
| | | out += String.fromCharCode(0xC0 | c >> 6 & 0x1F); |
| | | out += String.fromCharCode(0x80 | c >> 0 & 0x3F); |
| | | } |
| | | } |
| | | return out; |
| | | } |
| | | |
| | | function drawQrcode(options) { |
| | | options = options || {}; |
| | | options = extend(true, { |
| | | width: 256, |
| | | height: 256, |
| | | x: 0, |
| | | y: 0, |
| | | typeNumber: -1, |
| | | correctLevel: QRErrorCorrectLevel.H, |
| | | background: '#ffffff', |
| | | foreground: '#000000', |
| | | image: { |
| | | imageResource: '', |
| | | dx: 0, |
| | | dy: 0, |
| | | dWidth: 100, |
| | | dHeight: 100 |
| | | } |
| | | }, options); |
| | | |
| | | if (!options.canvasId && !options.ctx) { |
| | | console.warn('please set canvasId or ctx!'); |
| | | return; |
| | | } |
| | | |
| | | createCanvas(); |
| | | |
| | | function createCanvas() { |
| | | // create the qrcode itself |
| | | var qrcode = new QRCode(options.typeNumber, options.correctLevel); |
| | | qrcode.addData(utf16to8(options.text)); |
| | | qrcode.make(); |
| | | |
| | | // get canvas context |
| | | var ctx; |
| | | if (options.ctx) { |
| | | ctx = options.ctx; |
| | | } else { |
| | | ctx = options._this ? wx.createCanvasContext && wx.createCanvasContext(options.canvasId, options._this) : wx.createCanvasContext && wx.createCanvasContext(options.canvasId); |
| | | } |
| | | |
| | | // compute tileW/tileH based on options.width/options.height |
| | | var tileW = options.width / qrcode.getModuleCount(); |
| | | var tileH = options.height / qrcode.getModuleCount(); |
| | | |
| | | // draw in the canvas |
| | | for (var row = 0; row < qrcode.getModuleCount(); row++) { |
| | | for (var col = 0; col < qrcode.getModuleCount(); col++) { |
| | | var style = qrcode.isDark(row, col) ? options.foreground : options.background; |
| | | ctx.setFillStyle(style); |
| | | var w = Math.ceil((col + 1) * tileW) - Math.floor(col * tileW); |
| | | var h = Math.ceil((row + 1) * tileW) - Math.floor(row * tileW); |
| | | ctx.fillRect(Math.round(col * tileW) + options.x, Math.round(row * tileH) + options.y, w, h); |
| | | } |
| | | } |
| | | |
| | | if (options.image.imageResource) { |
| | | ctx.drawImage(options.image.imageResource, options.image.dx, options.image.dy, options.image.dWidth, options.image.dHeight); |
| | | } |
| | | |
| | | ctx.draw(false, function (e) { |
| | | options.callback && options.callback(e); |
| | | }); |
| | | } |
| | | } |
| | | |
| | | return drawQrcode; |
| | | |
| | | }))); |
| | |
| | | // pages/bibliographyList/index.js |
| | | const app = getApp() |
| | | const config = |
| | | Page({ |
| | | |
| | | /** |
| | |
| | | teacherList: [], |
| | | higherTotal: null, |
| | | vocationalTotal: null, |
| | | teacherTotal: null |
| | | teacherTotal: null, |
| | | value: '', |
| | | BarHeight: '', |
| | | navBarHeight: '' |
| | | }, |
| | | |
| | | /** |
| | |
| | | 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 |
| | | }) |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | }, |
| | | |
| | | /** |
| | |
| | | * 生命周期函数--监听页面显示 |
| | | */ |
| | | onShow() { |
| | | |
| | | console.log(this.data.value); |
| | | }, |
| | | |
| | | /** |
| | |
| | | console.log(`Click tab, tab-panel value is ${event.detail.value}.`); |
| | | }, |
| | | //高等教育 |
| | | higherGet() { |
| | | higherGet(keyword) { |
| | | let searchObj = { |
| | | 'Name*': keyword, |
| | | '||author*': keyword, |
| | | '||isbn*': keyword |
| | | |
| | | } |
| | | |
| | | app.MG.resource.getItem({ |
| | | path: 'jsek_biblioClassification\\jsek_bCHigherEducation', |
| | | queryType: '*', |
| | |
| | | subtitle: [], |
| | | fileType: [], |
| | | jsek_resource: [], |
| | | freeFile: [] |
| | | freeFile: [], |
| | | ...searchObj, |
| | | }, |
| | | SysType: 'CmsItem' |
| | | }).then(res => { |
| | | console.log(res.total); |
| | | |
| | | res.datas.forEach(item => { |
| | | item.determine = true |
| | | }) |
| | | console.log(res, 789111); |
| | | this.setData({ |
| | | higherList: res.datas, |
| | | higherTotal: res.total |
| | |
| | | }, |
| | | |
| | | //教师教育 |
| | | vocationalGet() { |
| | | vocationalGet(keyword) { |
| | | let searchObj = { |
| | | 'Name*': keyword, |
| | | '||author*': keyword, |
| | | '||isbn*': keyword |
| | | |
| | | } |
| | | app.MG.resource.getItem({ |
| | | path: 'jsek_biblioClassification\\jsek_bCVocationalEducation', |
| | | queryType: '*', |
| | |
| | | subtitle: [], |
| | | fileType: [], |
| | | jsek_resource: [], |
| | | freeFile: [] |
| | | freeFile: [], |
| | | ...searchObj |
| | | }, |
| | | SysType: 'CmsItem' |
| | | }).then(res => { |
| | | res.datas.forEach(item => { |
| | | item.determine = true |
| | | }) |
| | | this.setData({ |
| | | vocationalList: res.datas, |
| | | vocationalTotal: res.total |
| | |
| | | }) |
| | | }, |
| | | // 职业教育 |
| | | teacherGet() { |
| | | teacherGet(keyword) { |
| | | let searchObj = { |
| | | 'Name*': keyword, |
| | | '||author*': keyword, |
| | | '||isbn*': keyword |
| | | |
| | | } |
| | | app.MG.resource.getItem({ |
| | | path: 'jsek_biblioClassification\\jsek_bCTeacherEducation', |
| | | queryType: '*', |
| | |
| | | subtitle: [], |
| | | fileType: [], |
| | | jsek_resource: [], |
| | | freeFile: [] |
| | | freeFile: [], |
| | | ...searchObj |
| | | }, |
| | | SysType: 'CmsItem' |
| | | }).then(res => { |
| | | res.datas.forEach(item => { |
| | | item.determine = true |
| | | }) |
| | | this.setData({ |
| | | teacherList: res.datas, |
| | | teacherTotal: res.total |
| | |
| | | }) |
| | | |
| | | |
| | | }, |
| | | downloadData(event) { |
| | | 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) |
| | | }, |
| | | |
| | | |
| | | |
| | | |
| | | }) |
| | |
| | | "component": true, |
| | | "usingComponents": { |
| | | "t-tabs": "tdesign-miniprogram/tabs/tabs", |
| | | "t-tab-panel": "tdesign-miniprogram/tab-panel/tab-panel" |
| | | } |
| | | "t-tab-panel": "tdesign-miniprogram/tab-panel/tab-panel", |
| | | "t-search": "tdesign-miniprogram/search/search" |
| | | }, |
| | | "navigationBarTitleText": "书目", |
| | | "navigationBarTextStyle": "white", |
| | | "navigationStyle": "custom" |
| | | } |
| | |
| | | <!--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 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"> |
| | | <view class="downloadIcon" bind:tap="downloadData" data-item="{{item}}"> |
| | | |
| | | <image class="download" src="/static/images/bibliographyList/download.png" mode="" /> |
| | | <image class="downloadshiftin" src="/static/images/bibliographyList/downloadshiftin.png" mode="" /> |
| | | <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="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> |
| | |
| | | margin-bottom: 10rpx; |
| | | } |
| | | |
| | | /* .downloadIcon { |
| | | width: 430rpx; |
| | | height: 430rpx; |
| | | background-color: #000; |
| | | position: relative; |
| | | top: 0; |
| | | left: 0; |
| | | } */ |
| | | .outsideHigherImageBox { |
| | | |
| | | /* .download { |
| | | background-color: #8bc34a; |
| | | } */ |
| | | 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: { |
| | | 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, |
| | |
| | | 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> |
| | | |
| | | |
| | |
| | | |
| | | |
| | | .example-search { |
| | | width: 300px; |
| | | /* width: 300px; */ |
| | | background-color: #fff; |
| | | /* padding: 16rpx 32rpx; */ |
| | | } |
| | |
| | | import Dialog from 'tdesign-miniprogram/dialog/index'; |
| | | import Toast from 'tdesign-miniprogram/toast/index'; |
| | | import { fetchCartGroupData } from '../../services/cart/cart'; |
| | | |
| | | // pages/cart/index.js |
| | | const app = getApp() |
| | | Page({ |
| | | |
| | | /** |
| | | * 页面的初始数据 |
| | | */ |
| | | data: { |
| | | cartGroupData: null, |
| | | right: [ |
| | | { |
| | | text: '编辑', |
| | | className: 'btn edit-btn', |
| | | }, |
| | | { |
| | | text: '删除', |
| | | className: 'btn delete-btn', |
| | | }, |
| | | ], |
| | | }, |
| | | onDelete() { |
| | | wx.showToast({ title: '你点击了删除', icon: 'none' }); |
| | | }, |
| | | /** |
| | | * 生命周期函数--监听页面加载 |
| | | */ |
| | | onLoad(options) { |
| | | this.shoppingCartGet() |
| | | }, |
| | | |
| | | // 调用自定义tabbar的init函数,使页面与tabbar激活状态保持一致 |
| | | /** |
| | | * 生命周期函数--监听页面初次渲染完成 |
| | | */ |
| | | onReady() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面显示 |
| | | */ |
| | | onShow() { |
| | | this.getTabBar().init(); |
| | | |
| | | }, |
| | | |
| | | onLoad() { |
| | | this.refreshData(); |
| | | /** |
| | | * 生命周期函数--监听页面隐藏 |
| | | */ |
| | | onHide() { |
| | | |
| | | }, |
| | | |
| | | 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; |
| | | /** |
| | | * 生命周期函数--监听页面卸载 |
| | | */ |
| | | onUnload() { |
| | | |
| | | // 统计是否有加购数大于库存数的商品 |
| | | if (goods.quantity > goods.stockQuantity) { |
| | | store.storeStockShortage = true; |
| | | } |
| | | // 统计是否全选 |
| | | if (!goods.isSelected) { |
| | | store.isSelected = false; |
| | | } |
| | | // 库存为0(无货)的商品单独分组 |
| | | if (goods.stockQuantity > 0) { |
| | | return true; |
| | | } |
| | | store.shortageGoodsList.push(goods); |
| | | return false; |
| | | }); |
| | | |
| | | if (activity.goodsPromotionList.length > 0) { |
| | | isEmpty = false; |
| | | } |
| | | } |
| | | if (store.shortageGoodsList.length > 0) { |
| | | isEmpty = false; |
| | | } |
| | | } |
| | | cartGroupData.invalidGoodItems = cartGroupData.invalidGoodItems.map((goods) => { |
| | | goods.originPrice = undefined; |
| | | return goods; |
| | | }); |
| | | cartGroupData.isNotEmpty = !isEmpty; |
| | | this.setData({ cartGroupData }); |
| | | }); |
| | | }, |
| | | |
| | | findGoods(spuId, skuId) { |
| | | let currentStore; |
| | | let currentActivity; |
| | | let currentGoods; |
| | | const { storeGoods } = this.data.cartGroupData; |
| | | for (const store of storeGoods) { |
| | | for (const activity of store.promotionGoodsList) { |
| | | for (const goods of activity.goodsPromotionList) { |
| | | if (goods.spuId === spuId && goods.skuId === skuId) { |
| | | currentStore = store; |
| | | currentActivity = currentActivity; |
| | | currentGoods = goods; |
| | | return { |
| | | currentStore, |
| | | currentActivity, |
| | | currentGoods, |
| | | }; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | return { |
| | | currentStore, |
| | | currentActivity, |
| | | currentGoods, |
| | | }; |
| | | /** |
| | | * 页面相关事件处理函数--监听用户下拉动作 |
| | | */ |
| | | onPullDownRefresh() { |
| | | |
| | | }, |
| | | |
| | | // 注:实际场景时应该调用接口获取购物车数据 |
| | | getCartGroupData() { |
| | | const { cartGroupData } = this.data; |
| | | if (!cartGroupData) { |
| | | return fetchCartGroupData(); |
| | | } |
| | | return Promise.resolve({ data: cartGroupData }); |
| | | /** |
| | | * 页面上拉触底事件的处理函数 |
| | | */ |
| | | onReachBottom() { |
| | | |
| | | }, |
| | | |
| | | // 选择单个商品 |
| | | // 注:实际场景时应该调用接口更改选中状态 |
| | | selectGoodsService({ spuId, skuId, isSelected }) { |
| | | this.findGoods(spuId, skuId).currentGoods.isSelected = isSelected; |
| | | return Promise.resolve(); |
| | | }, |
| | | /** |
| | | * 用户点击右上角分享 |
| | | */ |
| | | onShareAppMessage() { |
| | | |
| | | // 全选门店 |
| | | // 注:实际场景时应该调用接口更改选中状态 |
| | | 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; |
| | | }); |
| | | }); |
| | | return Promise.resolve(); |
| | | }, |
| | | shoppingCartGet() { |
| | | |
| | | // 加购数量变更 |
| | | // 注:实际场景时应该调用接口 |
| | | changeQuantityService({ spuId, skuId, quantity }) { |
| | | this.findGoods(spuId, skuId).currentGoods.quantity = quantity; |
| | | return Promise.resolve(); |
| | | }, |
| | | |
| | | // 删除加购商品 |
| | | // 注:实际场景时应该调用接口 |
| | | deleteGoodsService({ spuId, skuId }) { |
| | | function deleteGoods(group) { |
| | | for (const gindex in group) { |
| | | const goods = group[gindex]; |
| | | if (goods.spuId === spuId && goods.skuId === skuId) { |
| | | group.splice(gindex, 1); |
| | | return gindex; |
| | | } |
| | | } |
| | | return -1; |
| | | } |
| | | const { storeGoods, invalidGoodItems } = this.data.cartGroupData; |
| | | for (const store of storeGoods) { |
| | | for (const activity of store.promotionGoodsList) { |
| | | if (deleteGoods(activity.goodsPromotionList) > -1) { |
| | | return Promise.resolve(); |
| | | } |
| | | } |
| | | if (deleteGoods(store.shortageGoodsList) > -1) { |
| | | return Promise.resolve(); |
| | | } |
| | | } |
| | | if (deleteGoods(invalidGoodItems) > -1) { |
| | | return Promise.resolve(); |
| | | } |
| | | return Promise.reject(); |
| | | }, |
| | | |
| | | // 清空失效商品 |
| | | // 注:实际场景时应该调用接口 |
| | | clearInvalidGoodsService() { |
| | | this.data.cartGroupData.invalidGoodItems = []; |
| | | return Promise.resolve(); |
| | | }, |
| | | |
| | | onGoodsSelect(e) { |
| | | const { |
| | | goods: { spuId, skuId }, |
| | | isSelected, |
| | | } = e.detail; |
| | | const { currentGoods } = this.findGoods(spuId, skuId); |
| | | Toast({ |
| | | context: this, |
| | | selector: '#t-toast', |
| | | message: `${isSelected ? '选择' : '取消'}"${ |
| | | currentGoods.title.length > 5 ? `${currentGoods.title.slice(0, 5)}...` : currentGoods.title |
| | | }"`, |
| | | icon: '', |
| | | }); |
| | | this.selectGoodsService({ spuId, skuId, isSelected }).then(() => this.refreshData()); |
| | | }, |
| | | |
| | | onStoreSelect(e) { |
| | | const { |
| | | store: { storeId }, |
| | | isSelected, |
| | | } = e.detail; |
| | | this.selectStoreService({ storeId, isSelected }).then(() => this.refreshData()); |
| | | }, |
| | | |
| | | onQuantityChange(e) { |
| | | const { |
| | | goods: { spuId, skuId }, |
| | | quantity, |
| | | } = e.detail; |
| | | const { currentGoods } = this.findGoods(spuId, skuId); |
| | | const stockQuantity = currentGoods.stockQuantity > 0 ? currentGoods.stockQuantity : 0; // 避免后端返回的是-1 |
| | | // 加购数量超过库存数量 |
| | | if (quantity > stockQuantity) { |
| | | // 加购数量等于库存数量的情况下继续加购 |
| | | if (currentGoods.quantity === stockQuantity && quantity - stockQuantity === 1) { |
| | | Toast({ |
| | | context: this, |
| | | selector: '#t-toast', |
| | | message: '当前商品库存不足', |
| | | }); |
| | | return; |
| | | } |
| | | Dialog.confirm({ |
| | | title: '商品库存不足', |
| | | content: `当前商品库存不足,最大可购买数量为${stockQuantity}件`, |
| | | confirmBtn: '修改为最大可购买数量', |
| | | cancelBtn: '取消', |
| | | app.MG.store.getShoppingCartProductList({ |
| | | start: 0, |
| | | size: 999, |
| | | filterList: [], |
| | | searchList: [] |
| | | }).then(res => { |
| | | console.log(res); |
| | | }) |
| | | .then(() => { |
| | | this.changeQuantityService({ |
| | | spuId, |
| | | skuId, |
| | | quantity: stockQuantity, |
| | | }).then(() => this.refreshData()); |
| | | } |
| | | }) |
| | | .catch(() => {}); |
| | | return; |
| | | } |
| | | this.changeQuantityService({ spuId, skuId, quantity }).then(() => this.refreshData()); |
| | | }, |
| | | |
| | | goCollect() { |
| | | /** 活动肯定有一个活动ID,用来获取活动banner,活动商品列表等 */ |
| | | const promotionID = '123'; |
| | | wx.navigateTo({ |
| | | url: `/pages/promotion-detail/index?promotion_id=${promotionID}`, |
| | | }); |
| | | }, |
| | | |
| | | goGoodsDetail(e) { |
| | | const { spuId, storeId } = e.detail.goods; |
| | | wx.navigateTo({ |
| | | url: `/pages/goods/details/index?spuId=${spuId}&storeId=${storeId}`, |
| | | }); |
| | | }, |
| | | |
| | | clearInvalidGoods() { |
| | | // 实际场景时应该调用接口清空失效商品 |
| | | this.clearInvalidGoodsService().then(() => this.refreshData()); |
| | | }, |
| | | |
| | | onGoodsDelete(e) { |
| | | const { |
| | | goods: { spuId, skuId }, |
| | | } = e.detail; |
| | | Dialog.confirm({ |
| | | content: '确认删除该商品吗?', |
| | | confirmBtn: '确定', |
| | | cancelBtn: '取消', |
| | | }).then(() => { |
| | | this.deleteGoodsService({ spuId, skuId }).then(() => { |
| | | Toast({ context: this, selector: '#t-toast', message: '商品删除成功' }); |
| | | this.refreshData(); |
| | | }); |
| | | }); |
| | | }, |
| | | |
| | | 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-swipe-cell": "tdesign-miniprogram/swipe-cell/swipe-cell", |
| | | "t-cell": "tdesign-miniprogram/cell/cell" |
| | | } |
| | | } |
| | |
| | | <!-- 分层购物车 --> |
| | | <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="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" /> |
| | | <!--pages/cart/index.wxml--> |
| | | <text>购物车</text> |
| | | <t-swipe-cell> |
| | | <t-cell bordered="{{false}}" title="左滑大列表" description="一段很长很长的内容文字" note="辅助信息" image="https://tdesign.gtimg.com/mobile/demos/avatar1.png" /> |
| | | <view slot="right" class="btn delete-btn" bind:tap="onDelete">删除</view> |
| | | </t-swipe-cell> |
| | |
| | | :host { |
| | | padding-bottom: 100rpx; |
| | | /* pages/cart/item.wxss */ |
| | | .btn-wrapper { |
| | | height: 100%; |
| | | } |
| | | |
| | | .gap { |
| | | height: 100rpx; |
| | | width: 100%; |
| | | .btn { |
| | | display: inline-flex; |
| | | justify-content: center; |
| | | align-items: center; |
| | | width: 120rpx; |
| | | height: 100%; |
| | | color: white; |
| | | } |
| | | |
| | | .t-button { |
| | | --td-button-default-color: #000; |
| | | --td-button-primary-text-color: #fa4126; |
| | | .delete-btn { |
| | | background-color: #e34d59; |
| | | } |
| | | |
| | | .edit-btn { |
| | | background-color: #ed7b2f; |
| | | } |
| | | |
| | | .favor-btn { |
| | | background-color: #0052d9; |
| | | } |
New file |
| | |
| | | // pages/personalCenter/activateProduct/index.js |
| | | Page({ |
| | | |
| | | /** |
| | | * 页面的初始数据 |
| | | */ |
| | | data: { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面加载 |
| | | */ |
| | | onLoad(options) { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面初次渲染完成 |
| | | */ |
| | | onReady() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面显示 |
| | | */ |
| | | onShow() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面隐藏 |
| | | */ |
| | | onHide() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面卸载 |
| | | */ |
| | | onUnload() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 页面相关事件处理函数--监听用户下拉动作 |
| | | */ |
| | | onPullDownRefresh() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 页面上拉触底事件的处理函数 |
| | | */ |
| | | onReachBottom() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 用户点击右上角分享 |
| | | */ |
| | | onShareAppMessage() { |
| | | |
| | | } |
| | | }) |
New file |
| | |
| | | { |
| | | "usingComponents": {} |
| | | } |
New file |
| | |
| | | <!--pages/personalCenter/activateProduct/index.wxml--> |
| | | <text>pages/personalCenter/activateProduct/index.wxml</text> |
New file |
| | |
| | | /* pages/personalCenter/activateProduct/index.wxss */ |
New file |
| | |
| | | // pages/personalCenter/certificate/index.js |
| | | Page({ |
| | | |
| | | /** |
| | | * 页面的初始数据 |
| | | */ |
| | | data: { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面加载 |
| | | */ |
| | | onLoad(options) { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面初次渲染完成 |
| | | */ |
| | | onReady() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面显示 |
| | | */ |
| | | onShow() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面隐藏 |
| | | */ |
| | | onHide() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面卸载 |
| | | */ |
| | | onUnload() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 页面相关事件处理函数--监听用户下拉动作 |
| | | */ |
| | | onPullDownRefresh() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 页面上拉触底事件的处理函数 |
| | | */ |
| | | onReachBottom() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 用户点击右上角分享 |
| | | */ |
| | | onShareAppMessage() { |
| | | |
| | | } |
| | | }) |
New file |
| | |
| | | { |
| | | "usingComponents": {} |
| | | } |
New file |
| | |
| | | <!--pages/personalCenter/certificate/index.wxml--> |
| | | <text>pages/personalCenter/certificate/index.wxml</text> |
New file |
| | |
| | | /* pages/personalCenter/certificate/index.wxss */ |
New file |
| | |
| | | <view class="user-center-card"> |
| | | <!-- 未登录的情况 --> |
| | | <block wx:if="{{currAuthStep === AuthStepType.ONE}}"> |
| | | <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"> |
| | | <image src="/static/images/personal/setting.png" mode="heightFix" class="img" /> |
| | | <text>设置</text> |
| | | </view> |
| | | </view> |
| | | </block> |
| | | <!-- 已登录但未授权用户信息情况 --> |
| | | <block wx:if="{{currAuthStep === AuthStepType.TWO}}"> |
| | | <view class="user-center-card__header"> |
| | | <t-avatar image="{{userInfo.avatarUrl || defaultAvatarUrl}}" class="user-center-card__header__avatar" /> |
| | | <view class="user-center-card__header__name">{{userInfo.nickName || '微信用户'}}</view> |
| | | <!-- 需要授权用户信息,通过slot添加弹窗 --> |
| | | <view class="user-center-card__header__transparent" wx:if="{{isNeedGetUserInfo}}"> |
| | | <slot name="getUserInfo" /> |
| | | </view> |
| | | <!-- 不需要授权用户信息,仍然触发gotoUserEditPage事件 --> |
| | | <view class="user-center-card__header__transparent" bind:tap="gotoUserEditPage" wx:else></view> |
| | | </view> |
| | | </block> |
| | | <!-- 已登录且已经授权用户信息的情况 --> |
| | | <block wx:if="{{currAuthStep === AuthStepType.THREE}}"> |
| | | <view class="user-center-card__header" bind:tap="gotoUserEditPage"> |
| | | <t-avatar t-class="avatar" mode="aspectFill" class="user-center-card__header__avatar" image="{{userInfo.avatarUrl || defaultAvatarUrl}}" /> |
| | | <view class="user-center-card__header__name">{{userInfo.nickName || '微信用户'}}</view> |
| | | </view> |
| | | </block> |
| | | </view> |
New file |
| | |
| | | .user-center-card { |
| | | background-image: url('https://cdn-we-retail.ym.tencent.com/miniapp/template/user-center-bg-v1.png'); |
| | | background-size: cover; |
| | | background-repeat: no-repeat; |
| | | padding: 0 24rpx; |
| | | } |
| | | |
| | | .user-center-card__header { |
| | | margin-top: 160rpx; |
| | | margin-bottom: 30rpx; |
| | | margin-left: 20rpx; |
| | | height: 96rpx; |
| | | line-height: 48rpx; |
| | | display: flex; |
| | | justify-content: flex-start; |
| | | align-items: center; |
| | | color: #333; |
| | | position: relative; |
| | | } |
| | | |
| | | .user-center-card__header__avatar { |
| | | width: 96rpx; |
| | | height: 96rpx; |
| | | border-radius: 48rpx; |
| | | overflow: hidden; |
| | | } |
| | | |
| | | .user-center-card__header__name { |
| | | font-size: 36rpx; |
| | | line-height: 48rpx; |
| | | color: #333; |
| | | font-weight: bold; |
| | | margin-left: 24rpx; |
| | | margin-right: 16rpx; |
| | | } |
| | | |
| | | .user-center-card__header__transparent { |
| | | position: absolute; |
| | | left: 0; |
| | | top: 0; |
| | | background-color: transparent; |
| | | height: 100%; |
| | | width: 100%; |
| | | } |
| | | |
| | | .user-center-card__icon { |
| | | line-height: 96rpx; |
| | | } |
| | | |
| | | .setting { |
| | | margin-left: auto; |
| | | display: flex; |
| | | align-items: center; |
| | | } |
| | | |
| | | .setting .img { |
| | | height: 34rpx; |
| | | width: 34rpx; |
| | | margin-right: 10rpx; |
| | | } |
New file |
| | |
| | | // pages/personalCenter/downloads/index.js |
| | | Page({ |
| | | |
| | | /** |
| | | * 页面的初始数据 |
| | | */ |
| | | data: { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面加载 |
| | | */ |
| | | onLoad(options) { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面初次渲染完成 |
| | | */ |
| | | onReady() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面显示 |
| | | */ |
| | | onShow() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面隐藏 |
| | | */ |
| | | onHide() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面卸载 |
| | | */ |
| | | onUnload() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 页面相关事件处理函数--监听用户下拉动作 |
| | | */ |
| | | onPullDownRefresh() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 页面上拉触底事件的处理函数 |
| | | */ |
| | | onReachBottom() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 用户点击右上角分享 |
| | | */ |
| | | onShareAppMessage() { |
| | | |
| | | } |
| | | }) |
New file |
| | |
| | | { |
| | | "usingComponents": {} |
| | | } |
New file |
| | |
| | | <!--pages/personalCenter/downloads/index.wxml--> |
| | | <text>pages/personalCenter/downloads/index.wxml</text> |
New file |
| | |
| | | /* pages/personalCenter/downloads/index.wxss */ |
New file |
| | |
| | | // pages/personalCenter/feedBack/index.js |
| | | Page({ |
| | | |
| | | /** |
| | | * 页面的初始数据 |
| | | */ |
| | | data: { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面加载 |
| | | */ |
| | | onLoad(options) { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面初次渲染完成 |
| | | */ |
| | | onReady() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面显示 |
| | | */ |
| | | onShow() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面隐藏 |
| | | */ |
| | | onHide() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面卸载 |
| | | */ |
| | | onUnload() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 页面相关事件处理函数--监听用户下拉动作 |
| | | */ |
| | | onPullDownRefresh() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 页面上拉触底事件的处理函数 |
| | | */ |
| | | onReachBottom() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 用户点击右上角分享 |
| | | */ |
| | | onShareAppMessage() { |
| | | |
| | | } |
| | | }) |
New file |
| | |
| | | { |
| | | "usingComponents": {} |
| | | } |
New file |
| | |
| | | <!--pages/personalCenter/feedBack/index.wxml--> |
| | | <text>pages/personalCenter/feedBack/index.wxml</text> |
New file |
| | |
| | | /* pages/personalCenter/feedBack/index.wxss */ |
New file |
| | |
| | | // pages/personalCenter/feedBackSubmit/index.js |
| | | Page({ |
| | | |
| | | /** |
| | | * 页面的初始数据 |
| | | */ |
| | | data: { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面加载 |
| | | */ |
| | | onLoad(options) { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面初次渲染完成 |
| | | */ |
| | | onReady() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面显示 |
| | | */ |
| | | onShow() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面隐藏 |
| | | */ |
| | | onHide() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面卸载 |
| | | */ |
| | | onUnload() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 页面相关事件处理函数--监听用户下拉动作 |
| | | */ |
| | | onPullDownRefresh() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 页面上拉触底事件的处理函数 |
| | | */ |
| | | onReachBottom() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 用户点击右上角分享 |
| | | */ |
| | | onShareAppMessage() { |
| | | |
| | | } |
| | | }) |
New file |
| | |
| | | { |
| | | "usingComponents": {} |
| | | } |
New file |
| | |
| | | <!--pages/personalCenter/feedBackSubmit/index.wxml--> |
| | | <text>pages/personalCenter/feedBackSubmit/index.wxml</text> |
New file |
| | |
| | | /* pages/personalCenter/feedBackSubmit/index.wxss */ |
New file |
| | |
| | | const app = getApp() |
| | | const menuData = [ |
| | | { |
| | | title: '我的订单', |
| | | icon: '/static/images/personal/order.png', |
| | | url: '/pages/personalCenter/myOrder/index', |
| | | type: 'order', |
| | | }, |
| | | { |
| | | title: '激活商品', |
| | | icon: '/static/images/personal/jihuo.png', |
| | | url: '/pages/personalCenter/activateProduct/index', |
| | | type: 'activateProduct', |
| | | }, |
| | | { |
| | | title: '我的证书', |
| | | icon: '/static/images/personal/certificate.png', |
| | | url: '/pages/personalCenter/certificate/index', |
| | | type: 'certificate', |
| | | }, |
| | | { |
| | | title: '我的收藏', |
| | | icon: '/static/images/personal/wodeshoucang.png', |
| | | url: '/pages/personalCenter/myCollection/index', |
| | | type: 'collection', |
| | | }, |
| | | { |
| | | title: '我的下载', |
| | | icon: '/static/images/personal/download.png', |
| | | url: '/pages/personalCenter/downloads/index', |
| | | type: 'download', |
| | | }, |
| | | { |
| | | title: '样书申请', |
| | | icon: '/static/images/personal/yangshushenqing.png', |
| | | url: '/pages/personalCenter/sampleBooks/index', |
| | | type: 'sampleBook', |
| | | }, |
| | | { |
| | | title: '出书申请', |
| | | icon: '/static/images/personal/chushu.png', |
| | | url: '/pages/personalCenter/publishBooks/index', |
| | | type: 'publishBooks', |
| | | }, |
| | | { |
| | | title: '我的上传', |
| | | icon: '/static/images/personal/upload.png', |
| | | url: '', |
| | | type: 'upload', |
| | | } |
| | | ]; |
| | | const moreMenu = [ |
| | | { |
| | | title: '我的消息', |
| | | icon: '/static/images/personal/notification.png', |
| | | url: '/pages/personalCenter/myMassage/index', |
| | | type: 'message', |
| | | }, |
| | | { |
| | | title: '建议与反馈', |
| | | icon: '/static/images/personal/feedback.png', |
| | | url: '/pages/personalCenter/feedback/index', |
| | | type: 'feedback', |
| | | } |
| | | ]; |
| | | const moreMenu1 = [ |
| | | { |
| | | title: '关于我们', |
| | | icon: '/static/images/personal/about.png', |
| | | url: '', |
| | | type: 'aboutUs', |
| | | }, |
| | | { |
| | | title: '联系我们', |
| | | icon: '/static/images/personal/contact.png', |
| | | url: '', |
| | | type: 'contact', |
| | | } |
| | | ]; |
| | | Page({ |
| | | |
| | | /** |
| | | * 页面的初始数据 |
| | | */ |
| | | data: { |
| | | show: false, |
| | | userInfo: { |
| | | avatarUrl: |
| | | 'https://we-retail-static-1300977798.cos.ap-guangzhou.myqcloud.com/retail-ui/components-exp/avatar/avatar-1.jpg', |
| | | nickName: 'TDesign', |
| | | phoneNumber: '13438358888', |
| | | }, |
| | | currAuthStep: 1, |
| | | teacherState: { |
| | | state: '', |
| | | reasonTxt: '', |
| | | }, |
| | | integral: 0, |
| | | menuData, |
| | | moreMenu, |
| | | moreMenu1 |
| | | }, |
| | | /** |
| | | * 生命周期函数--监听页面加载 |
| | | */ |
| | | onLoad(options) { |
| | | }, |
| | | |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面显示 |
| | | */ |
| | | onShow() { |
| | | if (wx.getStorageSync(app.config.userInfoKey)) { |
| | | this.setData({ |
| | | show: true, |
| | | userInfo: JSON.parse(wx.getStorageSync(app.config.userInfoKey)) |
| | | }) |
| | | |
| | | if (typeof this.getTabBar === 'function' && this.getTabBar()) { |
| | | this.getTabBar().setData({ |
| | | selected: 4 //这个数字是当前页面在tabBar中list数组的索引 |
| | | }) |
| | | } |
| | | this.getTeacherInfo() |
| | | } else { |
| | | wx.navigateTo({ |
| | | url: "/pages/testLogin/index", |
| | | }); |
| | | } |
| | | }, |
| | | /** |
| | | * 生命周期函数--监听页面隐藏 |
| | | */ |
| | | onHide() { |
| | | this.setData({ |
| | | show: false |
| | | }) |
| | | }, |
| | | /** |
| | | * 页面相关事件处理函数--监听用户下拉动作 |
| | | */ |
| | | onPullDownRefresh() { |
| | | this.init(); |
| | | }, |
| | | /** |
| | | * 页面上拉触底事件的处理函数 |
| | | */ |
| | | onReachBottom() { |
| | | }, |
| | | //教师信息 |
| | | getTeacherInfo() { |
| | | const data = { |
| | | start: 0, |
| | | size: 10, |
| | | topicIdOrRefCode: 'teacherRoleApproval', |
| | | appRefCode: app.config.appRefCode, |
| | | sort: { |
| | | type: 'Desc', |
| | | field: 'CreateDate' |
| | | } |
| | | } |
| | | app.MG.ugc.getTopicMessageList(data).then((res) => { |
| | | console.log(this.data.userInfo, "userInfo") |
| | | const resData = res.datas.find((i) => i.appUserCreator.userId == this.data.userInfo.userId) |
| | | if (resData) { |
| | | this.setData({ |
| | | teacherState: { |
| | | state: resData.state, |
| | | reasonTxt: resData.feedBack != null ? JSON.parse(resData.feedBack).reason : '' |
| | | } |
| | | }) |
| | | } |
| | | }) |
| | | }, |
| | | |
| | | //点击目录 |
| | | toPages(item) { |
| | | console.log(item) |
| | | let info = item.target.dataset.info |
| | | if (info.url) { |
| | | wx.navigateTo({ |
| | | url: info.url |
| | | }) |
| | | } else { |
| | | wx.showToast({ |
| | | title: "建设中", |
| | | icon: 'none', |
| | | duration: 2000 |
| | | }) |
| | | } |
| | | }, |
| | | |
| | | /** |
| | | * 用户点击右上角分享 |
| | | */ |
| | | onShareAppMessage() { |
| | | |
| | | } |
| | | }) |
New file |
| | |
| | | { |
| | | "usingComponents": {} |
| | | } |
New file |
| | |
| | | <!--pages/personalCenter/index.wxml--> |
| | | <text>pages/personalCenter/index.wxml</text> |
New file |
| | |
| | | /* pages/personalCenter/index.wxss */ |
New file |
| | |
| | | // pages/personalCenter/myCollection/index.js |
| | | Page({ |
| | | |
| | | /** |
| | | * 页面的初始数据 |
| | | */ |
| | | data: { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面加载 |
| | | */ |
| | | onLoad(options) { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面初次渲染完成 |
| | | */ |
| | | onReady() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面显示 |
| | | */ |
| | | onShow() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面隐藏 |
| | | */ |
| | | onHide() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面卸载 |
| | | */ |
| | | onUnload() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 页面相关事件处理函数--监听用户下拉动作 |
| | | */ |
| | | onPullDownRefresh() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 页面上拉触底事件的处理函数 |
| | | */ |
| | | onReachBottom() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 用户点击右上角分享 |
| | | */ |
| | | onShareAppMessage() { |
| | | |
| | | } |
| | | }) |
New file |
| | |
| | | { |
| | | "usingComponents": {} |
| | | } |
New file |
| | |
| | | <!--pages/personalCenter/myCollection/index.wxml--> |
| | | <text>pages/personalCenter/myCollection/index.wxml</text> |
New file |
| | |
| | | /* pages/personalCenter/myCollection/index.wxss */ |
New file |
| | |
| | | import moment from 'moment' |
| | | const app = getApp(); |
| | | Page({ |
| | | /** |
| | | * 页面的初始数据 |
| | | */ |
| | | data: { |
| | | list: [], |
| | | //分页 |
| | | page: 1, |
| | | limit: 10, |
| | | pageTotalCount: 0, |
| | | bottomLoading: false, |
| | | isMoreData: false, |
| | | // 返回顶部 |
| | | isBackTop: false, |
| | | setScrollValue: 0, |
| | | skeletonLoding: true, |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面加载 |
| | | */ |
| | | onLoad(options) { |
| | | this.getDataList(false); |
| | | }, |
| | | |
| | | getDataList(isReachBottom) { |
| | | app.MG.app.getAppMessageList({ |
| | | appRefCode: app.config.appRefCode, |
| | | 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.createDate = moment(item.createDate).format("YYYY-MM-DD HH:mm"); |
| | | }); |
| | | 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, |
| | | }) |
| | | } else { |
| | | this.setData({ |
| | | skeletonLoding: false, |
| | | }) |
| | | } |
| | | } catch (error) { |
| | | console.log(error) |
| | | } |
| | | }) |
| | | }, |
| | | |
| | | toList(itemData) { |
| | | let info = itemData.currentTarget.dataset.info; |
| | | wx.navigateTo({ |
| | | url: "/pages/personalCenter/myMassage/massageDetail/index?id=" + info.id, |
| | | }); |
| | | }, |
| | | /** |
| | | * 生命周期函数--监听页面初次渲染完成 |
| | | */ |
| | | onReady() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面显示 |
| | | */ |
| | | onShow() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 页面相关事件处理函数--监听用户下拉动作 |
| | | */ |
| | | onPullDownRefresh() { |
| | | if (this._freshing) return |
| | | this.setData({ |
| | | page: 1, |
| | | limit: 10, |
| | | 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); |
| | | |
| | | }, |
| | | |
| | | // 监听滚动距离 |
| | | onPageScroll(e) { |
| | | if (e && e.scrollTop >= 1000) { |
| | | this.setData({ |
| | | isBackTop: true |
| | | }) |
| | | } else { |
| | | this.setData({ |
| | | isBackTop: false |
| | | }) |
| | | } |
| | | }, |
| | | |
| | | /** |
| | | * 用户点击右上角分享 |
| | | */ |
| | | onShareAppMessage() { |
| | | |
| | | } |
| | | }) |
New file |
| | |
| | | { |
| | | "usingComponents": {} |
| | | } |
New file |
| | |
| | | <view class="container" wx:if="{{!skeletonLoding}}"> |
| | | <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="pageInfo" wx:if="{{list.length > 0}}"> |
| | | <view class="content-item" wx:for="{{list}}" wx:for-item="item" wx:for-index="index" wx:key="index"> |
| | | <view class="icon"> |
| | | <t-image src="/static/images/personal/notification1.png" mode="heightFix" class="img" /> |
| | | </view> |
| | | <view class="item-con" data-info="{{item}}" bindtap="toList"> |
| | | <view class="titleBox"> |
| | | <view class="item-title">{{item.name}}</view> |
| | | <view class="createDate">{{item.createDate}}</view> |
| | | </view> |
| | | <view class="description"> |
| | | {{item.description}} |
| | | </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> |
| | | <t-back-top theme="round" wx:if="{{isBackTop}}" text="顶部" bind:to-top="onToTop"></t-back-top> |
| | | </view> |
New file |
| | |
| | | .pageInfo { |
| | | padding: 40rpx 20rpx; |
| | | } |
| | | |
| | | .content-item { |
| | | padding: 20rpx 0; |
| | | border-bottom: 1px solid #EDEDED; |
| | | display: flex; |
| | | } |
| | | |
| | | .content-item .icon { |
| | | width: 58rpx; |
| | | height: 58rpx; |
| | | } |
| | | |
| | | .content-item .icon .img { |
| | | width: 100%; |
| | | height: 100%; |
| | | } |
| | | |
| | | .item-con { |
| | | flex: 1; |
| | | margin-left: 30rpx; |
| | | } |
| | | |
| | | .titleBox { |
| | | display: flex; |
| | | justify-content: space-between |
| | | } |
| | | |
| | | .titleBox .item-title { |
| | | font-weight: bold; |
| | | } |
| | | |
| | | .createDate { |
| | | font-size: 24rpx; |
| | | color: #949494; |
| | | } |
| | | |
| | | .description { |
| | | font-size: 24rpx; |
| | | height: 88rpx; |
| | | line-height: 40rpx; |
| | | display: -webkit-box; |
| | | margin-top: 20rpx; |
| | | -webkit-box-orient: vertical; |
| | | -webkit-line-clamp: 2; |
| | | overflow: hidden; |
| | | text-overflow: ellipsis; |
| | | } |
| | | |
| | | .refresh-container { |
| | | margin: 0 auto; |
| | | } |
| | | |
| | | .bottom-loading, |
| | | .loading { |
| | | padding: 20rpx; |
| | | text-align: center; |
| | | } |
New file |
| | |
| | | const app = getApp(); |
| | | import moment from 'moment' |
| | | Page({ |
| | | |
| | | /** |
| | | * 页面的初始数据 |
| | | */ |
| | | data: { |
| | | dataInfo: {} |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面加载 |
| | | */ |
| | | onLoad(options) { |
| | | this.getDataInfo(options.id) |
| | | }, |
| | | getDataInfo(id) { |
| | | app.MG.app.getMessage({ |
| | | messageId: id |
| | | }) |
| | | .then(res => { |
| | | res.createDate = moment(res.createDate).format("YYYY-MM-DD HH:mm"); |
| | | this.setData({ |
| | | dataInfo: res, |
| | | }) |
| | | |
| | | }) |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面初次渲染完成 |
| | | */ |
| | | onReady() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面显示 |
| | | */ |
| | | onShow() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面隐藏 |
| | | */ |
| | | onHide() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面卸载 |
| | | */ |
| | | onUnload() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 页面相关事件处理函数--监听用户下拉动作 |
| | | */ |
| | | onPullDownRefresh() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 页面上拉触底事件的处理函数 |
| | | */ |
| | | onReachBottom() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 用户点击右上角分享 |
| | | */ |
| | | onShareAppMessage() { |
| | | |
| | | } |
| | | }) |
New file |
| | |
| | | { |
| | | "navigationBarTitleText": "我的消息", |
| | | "usingComponents": {} |
| | | } |
New file |
| | |
| | | <view class="container"> |
| | | <view> |
| | | <view class="name">{{dataInfo.name}}</view> |
| | | <view class="createDate">{{dataInfo.createDate}}</view> |
| | | <view class="description">{{dataInfo.description}}</view> |
| | | <rich-text space="emsp" nodes="{{dataInfo.content}}" class="content" /> |
| | | </view> |
| | | </view> |
New file |
| | |
| | | .container { |
| | | padding: 20rpx; |
| | | } |
| | | |
| | | .name { |
| | | text-align: center; |
| | | font-size: 32rpx; |
| | | font-weight: bold; |
| | | } |
| | | |
| | | .createDate { |
| | | margin-top: 20rpx; |
| | | color: #999; |
| | | text-align: center; |
| | | font-size: 28rpx; |
| | | } |
| | | |
| | | .description { |
| | | padding: 30rpx 0; |
| | | color: #999; |
| | | font-size: 28rpx; |
| | | line-height: 40rpx; |
| | | } |
| | | |
| | | .content { |
| | | font-size: 28rpx; |
| | | line-height: 40rpx; |
| | | } |
New file |
| | |
| | | // pages/personalCenter/myOrder/index.js |
| | | Page({ |
| | | |
| | | /** |
| | | * 页面的初始数据 |
| | | */ |
| | | data: { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面加载 |
| | | */ |
| | | onLoad(options) { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面初次渲染完成 |
| | | */ |
| | | onReady() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面显示 |
| | | */ |
| | | onShow() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面隐藏 |
| | | */ |
| | | onHide() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面卸载 |
| | | */ |
| | | onUnload() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 页面相关事件处理函数--监听用户下拉动作 |
| | | */ |
| | | onPullDownRefresh() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 页面上拉触底事件的处理函数 |
| | | */ |
| | | onReachBottom() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 用户点击右上角分享 |
| | | */ |
| | | onShareAppMessage() { |
| | | |
| | | } |
| | | }) |
New file |
| | |
| | | { |
| | | "usingComponents": {} |
| | | } |
New file |
| | |
| | | <!--pages/personalCenter/myOrder/index.wxml--> |
| | | <text>pages/personalCenter/myOrder/index.wxml</text> |
New file |
| | |
| | | /* pages/personalCenter/myOrder/index.wxss */ |
New file |
| | |
| | | // pages/personalCenter/publishBooks/index.js |
| | | Page({ |
| | | |
| | | /** |
| | | * 页面的初始数据 |
| | | */ |
| | | data: { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面加载 |
| | | */ |
| | | onLoad(options) { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面初次渲染完成 |
| | | */ |
| | | onReady() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面显示 |
| | | */ |
| | | onShow() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面隐藏 |
| | | */ |
| | | onHide() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面卸载 |
| | | */ |
| | | onUnload() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 页面相关事件处理函数--监听用户下拉动作 |
| | | */ |
| | | onPullDownRefresh() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 页面上拉触底事件的处理函数 |
| | | */ |
| | | onReachBottom() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 用户点击右上角分享 |
| | | */ |
| | | onShareAppMessage() { |
| | | |
| | | } |
| | | }) |
New file |
| | |
| | | { |
| | | "usingComponents": {} |
| | | } |
New file |
| | |
| | | <!--pages/personalCenter/publishBooks/index.wxml--> |
| | | <text>pages/personalCenter/publishBooks/index.wxml</text> |
New file |
| | |
| | | /* pages/personalCenter/publishBooks/index.wxss */ |
New file |
| | |
| | | // pages/personalCenter/sampleBooks/index.js |
| | | Page({ |
| | | |
| | | /** |
| | | * 页面的初始数据 |
| | | */ |
| | | data: { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面加载 |
| | | */ |
| | | onLoad(options) { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面初次渲染完成 |
| | | */ |
| | | onReady() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面显示 |
| | | */ |
| | | onShow() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面隐藏 |
| | | */ |
| | | onHide() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面卸载 |
| | | */ |
| | | onUnload() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 页面相关事件处理函数--监听用户下拉动作 |
| | | */ |
| | | onPullDownRefresh() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 页面上拉触底事件的处理函数 |
| | | */ |
| | | onReachBottom() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 用户点击右上角分享 |
| | | */ |
| | | onShareAppMessage() { |
| | | |
| | | } |
| | | }) |
New file |
| | |
| | | { |
| | | "usingComponents": {} |
| | | } |
New file |
| | |
| | | <!--pages/personalCenter/sampleBooks/index.wxml--> |
| | | <text>pages/personalCenter/sampleBooks/index.wxml</text> |
New file |
| | |
| | | /* pages/personalCenter/sampleBooks/index.wxss */ |
New file |
| | |
| | | // pages/teacherCertification/index.js |
| | | Page({ |
| | | |
| | | /** |
| | | * 页面的初始数据 |
| | | */ |
| | | data: { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面加载 |
| | | */ |
| | | onLoad(options) { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面初次渲染完成 |
| | | */ |
| | | onReady() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面显示 |
| | | */ |
| | | onShow() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面隐藏 |
| | | */ |
| | | onHide() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面卸载 |
| | | */ |
| | | onUnload() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 页面相关事件处理函数--监听用户下拉动作 |
| | | */ |
| | | onPullDownRefresh() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 页面上拉触底事件的处理函数 |
| | | */ |
| | | onReachBottom() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 用户点击右上角分享 |
| | | */ |
| | | onShareAppMessage() { |
| | | |
| | | } |
| | | }) |
New file |
| | |
| | | { |
| | | "usingComponents": {} |
| | | } |
New file |
| | |
| | | <!--pages/teacherCertification/index.wxml--> |
| | | <text>pages/teacherCertification/index.wxml</text> |
New file |
| | |
| | | /* pages/teacherCertification/index.wxss */ |
New file |
| | |
| | | // pages/testLogin/index.js |
| | | const app = getApp(); |
| | | |
| | | Page({ |
| | | |
| | | /** |
| | | * 页面的初始数据 |
| | | */ |
| | | data: { |
| | | textName: "18892081234", |
| | | textPassword: "xA123456", |
| | | loading: false, |
| | | userInfo: { |
| | | name: "", |
| | | icon: "" |
| | | } |
| | | }, |
| | | |
| | | // 登录 |
| | | onLogin() { |
| | | this.setData({ |
| | | loading: true |
| | | }) |
| | | const data = { |
| | | loginName: this.data.textName, |
| | | password: this.data.textPassword, |
| | | appRefCode: app.config.appRefCode, |
| | | platform: "Mobile", |
| | | }; |
| | | app.MG.identity.loginByPassword(data).then(res => { |
| | | if (res && res.status == "Ok") { |
| | | this.setData({ |
| | | loginInfo: JSON.stringify(res) |
| | | }) |
| | | wx.setStorageSync(app.config.tokenKey, res.token); |
| | | this.getUserInfo() |
| | | } else { |
| | | wx.showToast({ |
| | | title: res.message || "手机号或密码错误", |
| | | icon: "error", |
| | | duration: 2000 |
| | | }) |
| | | } |
| | | }); |
| | | }, |
| | | |
| | | // 获取用户信息 |
| | | // 获取登录用户身份 |
| | | getUserInfo() { |
| | | app.MG.identity.getCurrentAppUser().then(res => { |
| | | // 用户信息优先级:教师认证 > 微信 > 学生(注册时默认) |
| | | if (res) { |
| | | console.log(res, "user"); |
| | | let defaultUser = {}; |
| | | let secretData = res.secretList.find(i => i.type == 'LoginNameAndPassword') |
| | | let WeChatInfo = res.infoList.find((item) => item.type === "WeChat"); |
| | | if (WeChatInfo) { |
| | | defaultUser = { |
| | | nickName: WeChatInfo.name, |
| | | avatarUrl: WeChatInfo.icon, |
| | | userId: res.userId |
| | | } |
| | | } |
| | | if (secretData) { |
| | | defaultUser = { |
| | | nickName: secretData.credential, |
| | | avatarUrl: "../../static/images/index/tab.png", |
| | | userId: res.userId |
| | | } |
| | | } |
| | | |
| | | this.setData({ |
| | | userInfo: defaultUser, |
| | | loading: false |
| | | }) |
| | | wx.setStorageSync(app.config.userInfoKey, JSON.stringify(this.data.userInfo)); |
| | | } |
| | | wx.switchTab({ |
| | | url: '/pages/home/home' |
| | | }) |
| | | }); |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面加载 |
| | | */ |
| | | onLoad(options) { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面初次渲染完成 |
| | | */ |
| | | onReady() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面显示 |
| | | */ |
| | | onShow() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面隐藏 |
| | | */ |
| | | onHide() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 生命周期函数--监听页面卸载 |
| | | */ |
| | | onUnload() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 页面相关事件处理函数--监听用户下拉动作 |
| | | */ |
| | | onPullDownRefresh() { |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 页面上拉触底事件的处理函数 |
| | | */ |
| | | onReachBottom() { |
| | | |
| | | } |
| | | }) |
New file |
| | |
| | | { |
| | | "usingComponents": { |
| | | "t-input": "tdesign-miniprogram/input/input", |
| | | "t-button": "tdesign-miniprogram/button/button" |
| | | } |
| | | } |
New file |
| | |
| | | <!--pages/testLogin/index.wxml--> |
| | | <view> |
| | | <t-input label="用户账号" placeholder="请输入用户名" model:value="{{textName}}" suffixIcon="{{ { name: 'user-avatar', ariaLabel: '通讯录' } }}"></t-input> |
| | | <t-input label="用户密码" placeholder="请输入密码" type="password" model:value="{{textPassword}}" clearable /> |
| | | </view> |
| | | <view class="button-example"> |
| | | <t-button theme="primary" loading="{{loading}}" bindtap="onLogin" size="large" block>立即登录</t-button> |
| | | </view> |
New file |
| | |
| | | /* pages/testLogin/index.wxss */ |
| | | .button-example { |
| | | margin: 60rpx 32rpx; |
| | | } |
| | |
| | | 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'); |
| | | // }); |
| | | // } |