123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647 |
- // parents//pages/growth_track/growth_track.js
- import F2 from '../../../utils/f2-canvas/lib/f2';
- const wxCharts = require("../../../utils/wxcharts-min.js");
- let chart;
- import { routers, viewImage, sharePage, isFn, getGlobalVal } from '../../../utils/util.js'
- import { UserReadInfo, ThemeBorrowedList, ScanningBooksTwo, InitBorrowCar } from '../../../utils/api.js'
- const { navigateTo, redirectTo, navigateBack } = routers()
- const { globalData, hasLibraryService, hasVipService } = getApp()
- const { baseImgUrl, qrcodeInvalidToastText, isIphoneX } = globalData
- /**
- * 进度条颜色RGB
- */
- const colorRGB = '255,215,108'
- const colorRGB1 = '255,128,168'
- const colorRGB2 = '0,183,255'
- const colorRGB3 = '255,97,97'
- const colorRGB4 = '121,189,232'
- const colorRGB5 = '250,202,106'
- const colorRGB6 = '143,232,121'
- const colorRGB7 = '117,227,243'
- const colorRGB8 = '255,145,128'
- const colorRGB9 = '119,143,242'
- const blueRGB = '65,65, 76'
- const blackRGB = '108,108,128'
- Page({
- /**
- * 页面的初始数据
- */
- data: {
- baseImgUrl,
- isIphoneX,
- isLoaded: 1,
- opts: {
- lazyLoad: true // 延迟加载组件
- // onInit: initChart
- },
- pageNo: 1,
- pageSize: 5,
- isAll: 0,
- themeSelect:false,
- rankList:[
- // {
- // ranking:'一',
- // rankTimes:3,
- // rankMonth:6,
- // rankName: '../../../assets/no_one.png',
- // rankBg: '../../../assets/no_one_bg.png'
- // },
- // {
- // ranking: '二',
- // rankTimes: 5,
- // rankMonth: 6,
- // rankName: '../../../assets/no_two.png',
- // rankBg: '../../../assets/no_two_bg.png'
- // },
- // {
- // ranking: '三',
- // rankTimes: 3,
- // rankMonth: 6,
- // rankName: '../../../assets/no_three.png',
- // rankBg: '../../../assets/no_three_bg.png'
- // },
- ],
- themeInfoList:[
- // { percentage: "0.22", themeCode: "child1", themeName: "名著经典1" },
- // { percentage: "0.42", themeCode: "child2", themeName: "名著经典2" },
- // { percentage: "0.36", themeCode: "child3", themeName: "名著3" },
- // { percentage: "0.06", themeCode: "child4", themeName: "名著经典3" },
- // { percentage: "0.26", themeCode: "child5", themeName: "经典3" },
- // { percentage: "0.16", themeCode: "child6", themeName: "名著经典4" },
- // { percentage: "0.44", themeCode: "child7", themeName: "名著经典5" },
- // { percentage: "0.46", themeCode: "child8", themeName: "名著经典8" },
- // { percentage: "0.1", themeCode: "child9", themeName: "名著经典33" },
- // { percentage: "0.28", themeCode: "child10", themeName: "名著经典22" },
- ],
- monthList:[],
- yearList:[],
- footerData: {
- isIphoneX,
- actIndex:1,
- list: [
- {
- text: '找好书',
- icon: '../../../assets/book_gray.png',
- actIcon: '../../../assets/book_blue.png',
- url: 'parents/pages/main/main',
- zindex: 3,
- },
- {
- text: '成长轨迹',
- icon: '../../../assets/wish_gray.png',
- actIcon: '../../../assets/wish_blue.png',
- url: 'parents/pages/growth_track/growth_track',
- zindex: 3,
- },
- {
- text: '我的',
- icon: '../../../assets/me_gray.png',
- actIcon: '../../../assets/me_blue.png',
- url: 'parents/pages/me/me',
- zindex: 3,
- }
- ]
- },
- nodataArray: {
- text: "暂无阅读计划",
- margin: '140rpx auto'
- }
- },
- /**
- * 生命周期函数--监听页面加载
- */
- onLoad: function (options) {
- options.vipId = getGlobalVal('vipId', `vipId_${getGlobalVal('userId')}`)
- // options.vipId = '306330bd-5c8c-41aa-8a00-0f0c296ebb29',
- options.library = getGlobalVal('library')
- options.libId = getGlobalVal('library').id || ''
- this.setData({ options })
- // this.getData()
- },
- /**
- * 生命周期函数--监听页面初次渲染完成
- */
- onReady: function () {
- const obj = { navigateTo, redirectTo, navigateBack, viewImage }
- for (const i in obj) {
- this[i] = obj[i]
- }
- },
- /**
- * 生命周期函数--监听页面显示
- */
- onShow: function () {
- this.getData()
- const { options, isFirst } = this.data
- options.library = getGlobalVal('library')
- const userId = getGlobalVal('userId')
- options.vipId = getGlobalVal('vipId', `vipId_${userId}`) || ''
- options.libId = getGlobalVal('library').id || ''
- const bookList = getGlobalVal(`borrowBook_${userId}_${options.libId}_${options.vipId}`) || []
- this.setData({ options, bookList })
-
- },
- /**
- * 生命周期函数--监听页面隐藏
- */
- onHide: function () {
- },
- /**
- * 生命周期函数--监听页面卸载
- */
- onUnload: function () {
- },
- /**
- * 页面相关事件处理函数--监听用户下拉动作
- */
- onPullDownRefresh: function () {
- // this.setData(() => {
- // wx.stopPullDownRefresh()
- // })
- },
- /**
- * 页面上拉触底事件的处理函数
- */
- onReachBottom: function () {
- },
- /**
- * 用户点击右上角分享
- */
- onShareAppMessage: function () {
- if (isFn(sharePage)) return sharePage()
- },
- /**
- * 查看排名
- */
- setRanking:function(){
- if (!hasVipService()) return
- navigateTo({ url: 'parents/pages/ranking/ranking', zindex: 3 })
- },
- /**
- * 获取好书推荐
- */
- getData: function (cb) {
- const continuousFn = { fn: this.getData, param: { ...arguments } }
- const { libId = '', vipId = '' } = this.data.options
- if (!hasVipService()) return
- UserReadInfo({ data: { libId, vipId }, continuousFn }).then(res => {
- const { rankList, monthList, themeInfoList, themeTopList, yearList} = res.data
- // console.log(rankList, monthList, themeInfoList, themeTopList, yearList)
- this.setData({ rankList, themeInfoList, monthList, themeTopList, yearList, isLoaded: true })
- this.goodBooksPicture()
- this.nearTwentyEight()
- this.everyReading()
- if (isFn(cb)) cb()
- }).catch(res => {
- this.setData({ isLoaded: true})
- if (isFn(cb)) cb()
- })
- },
- /**
- * 好书推荐图表
- */
- goodBooksPicture: function () {
- const { themeInfoList = [] } = this.data
- // console.log(themeInfoList)
- var that=this
- if (themeInfoList.length === 0) return
- this.selectComponent('#pieSelect').init(function (canvas, width, height) {
- // 数据
- const data = (list => {
- const arr = []
- for (const v of list) {
- const { themeName = '', percentage = 0, themeCode=''} = v
- arr.push({
- const: 'const',
- type: themeName,
- code: themeCode,
- percent: ~~(+percentage)
- })
- }
- return arr
- })(themeInfoList)
-
- // 生成画布
- const chart = new F2.Chart({
- el: canvas,
- width,
- height
- })
- chart.source(data)
- chart.coord('polar', {
- transposed: true,
- radius: 0.9,
- innerRadius: 0.5
- })
- chart.axis(false)
- chart.legend(false)
- chart.tooltip(false)
- chart.interval().position('const*percent').adjust('stack').color('type', [
- `rgba(${colorRGB}, 1)`,
- `rgba(${colorRGB1}, 1)`,
- `rgba(${colorRGB2}, 1)`,
- `rgba(${colorRGB3}, 1)`,
- `rgba(${colorRGB4}, 1)`,
- `rgba(${colorRGB5}, 1)`,
- `rgba(${colorRGB6}, 1)`,
- `rgba(${colorRGB7}, 1)`,
- `rgba(${colorRGB8}, 1)`,
- `rgba(${colorRGB9}, 1)`,
- ])
- chart.interaction('pie-select', {
- cancelable: false,
- animate: {
- duration: 300,
- easing: 'backOut'
- },
- onEnd: res => {
- // console.log(res)
- const { data } = res
- if(data){
- const { type, code } = data
- that.setData({
- pageNo: 1,
- message: type,
- code
- })
- that.getThemeData()
- }
- }
- });
- chart.pieLabel({
- sidePadding: 30,
- activeShape: true,
- label1: function label1(data) {
- return {
- text: data.percent + '%',
- fill: `rgba(${blueRGB}, 1)`,
- fontWeight: 'bold'
- };
- },
- label2: function label2(data) {
- return {
- text: data.type.length > 5 ? data.type.substring(0, 5) + '...' : data.type,
- fill: `rgba(${blackRGB}, 1)`,
- fontWeight: 'bold'
- };
- },
- onClick: res=> {
- console.log(res)
- const { data } = res
- if (data) {
- const { type, code } = data
- that.setData({
- pageNo: 1,
- message: type,
- code
- })
- that.getThemeData()
- }
-
- }
- });
-
- chart.render()
- return chart
- })
- },
- /**
- * 获取数据
- */
- getThemeData: function (cb) {
- const continuousFn = { fn: this.getData, param: { ...arguments } }
- const { pageNo, pageSize, options, list, code} = this.data
- const { vipId } = options
- wx.showLoading({
- title: '加载中',
- })
- ThemeBorrowedList({ data: { pageNo, pageSize, vipId, code}, continuousFn }).then(res => {
- wx.hideLoading()
- const { pages } = res.data
- const newList = res.data.list
- const listTemp = (res => {
- for (let i in res) {
- if (res[i].summary.length > 30) {
- res[i].summary = res[i].summary.slice(0, 30) + '...'
- } else {
- res[i].summary = res[i].summary
- }
- }
- return res
- })(newList)
- let arr = []
- if (pageNo == 1) {
- arr = [...listTemp]
- } else {
- arr = [...list, ...listTemp]
- }
- this.setData({ themeSelect: true, list: arr, pages,isAll: newList.length < pageSize, pageNo: newList.length == pageSize ? pageNo + 1 : pageNo, isLoaded: true })
- cb && cb()
- }).catch(res => {
- this.setData({ isLoaded: true })
- cb && cb()
- })
- },
- /**
- * 近28天阅读量对比
- */
- nearTwentyEight(canvas, width, height) {
- const { monthList } = this.data
- var max = monthList[0].borrowNum;
- for (var i = 1; i < monthList.length; i++) {
- var cur = monthList[i].borrowNum;
- cur > max ? max = cur : null
- }
- this.selectComponent('#twentyEightCanvas').init(function (canvas, width, height) {
- // 数据
- const data = (list => {
- const arr = []
- for (const v of list) {
- const { endTime = '', borrowNum = 0, startTime = '' } = v
- arr.push({
- year: startTime.slice(5, 10) + '-' + endTime.slice(5, 10),
- sales: borrowNum
- })
- }
- return arr
- })(monthList)
- chart = new F2.Chart({
- el: canvas,
- width:wx.getSystemInfoSync().windowWidth - 30,
- height
- });
- chart.source(data, {
- sales: {
- tickCount: 10,
- max: max+10,
- min:0
- }
- });
- chart.axis('sales', {
- line: {
- lineWidth: 1,
- stroke: '#E6E6EC',
- top: false, // 展示在最上层
- },
- tickLine: {
- lineWidth: 1,
- stroke: '#A1A1B3',
- length: 2, // 刻度线长度
- top:false
- },
- grid:null,
- label: (text, index, total) => {
- const cfg = {
- textAlign: 'center',
- color: '#A1A1B3',
- fontSize:10
- }
- cfg.text = Math.floor(text)
- return cfg;
- },
- })
- chart.axis('year', {
- line: {
- lineWidth: 1,
- stroke: '#E6E6EC',
- top: true, // 展示在最上层
- },
- grid: null,
- label: (text, index, total) => {
- const cfg = {
- textAlign: 'center',
- color: '#41414C',
- fontSize: 12
- }
- return cfg;
- },
- })
- chart.animate(true)
- chart.tooltip(false);
- chart.interval()
- .position('year*sales')
- .color('#FFD76C');
- chart.render();
- // 绘制柱状图文本
- const offset = -5;
- const chartCanvas = chart.get('canvas');
- const group = chartCanvas.addGroup();
- const shapes = {};
- data.map(obj => {
- const point = chart.getPosition(obj);
- const text = group.addShape('text', {
- attrs: {
- x: point.x,
- y: point.y + offset,
- fontSize: 11,
- text: obj.sales == 0 ?'暂\n无\n数\n据':obj.sales+'本',
- textAlign: 'center',
- textBaseline: 'bottom',
- fill: '#A1A1B3'
- }
- });
- shapes[obj.year] = text; // 缓存该 shape, 便于后续查找
- });
-
- return chart;
- });
- },
- /**
- * 每月阅读量对比
- */
- everyReading(canvas, width, height) {
- const { yearList } = this.data
- var max = yearList[0].borrowNum;
- for (var i = 1; i < yearList.length; i++) {
- var cur = yearList[i].borrowNum;
- cur > max ? max = cur : null
- }
- this.selectComponent('#readCanvas').init(function (canvas, width, height) {
- // 数据
- const data = (list => {
- const arr = []
- for (const v of list) {
- const { months = '', borrowNum = 0 } = v
- arr.push({
- year: months.slice(5, 7) + '月',
- sales: borrowNum
- })
- }
- return arr
- })(yearList)
- chart = new F2.Chart({
- el: canvas,
- width: wx.getSystemInfoSync().windowWidth - 30,
- height
- });
- chart.source(data, {
- sales: {
- tickCount: 10,
- max: max + 10,
- min: 0
- }
- });
- chart.axis('sales', {
- line: {
- lineWidth: 1,
- stroke: '#E6E6EC',
- top: false, // 展示在最上层
- },
- tickLine: {
- lineWidth: 1,
- stroke: '#A1A1B3',
- length: 2, // 刻度线长度
- top: false
- },
- grid: null,
- label: (text, index, total) => {
- const cfg = {
- textAlign: 'center',
- color: '#A1A1B3',
- fontSize: 10
- }
- cfg.text = Math.floor(text)
- return cfg;
- },
- })
- chart.axis('year', {
- line: {
- lineWidth: 1,
- stroke: '#E6E6EC',
- top: true, // 展示在最上层
- },
- grid: null,
- label: (text, index, total) => {
- const cfg = {
- textAlign: 'center',
- color: '#41414C',
- fontSize: 12
- }
- return cfg;
- },
- })
- chart.animate(true)
- chart.tooltip(false);
- chart.interval()
- .position('year*sales')
- .color('#FF6464');
- chart.render();
- // 绘制柱状图文本
- const offset = -5;
- const chartCanvas = chart.get('canvas');
- const group = chartCanvas.addGroup();
- const shapes = {};
- data.map(obj => {
- const point = chart.getPosition(obj);
- const text = group.addShape('text', {
- attrs: {
- x: point.x,
- y: point.y + offset,
- fontSize: 11,
- text: obj.sales == 0 ? '暂\n无\n数\n据' : obj.sales + '本',
- textAlign: 'center',
- textBaseline: 'bottom',
- fill: '#A1A1B3'
- }
- });
- shapes[obj.year] = text; // 缓存该 shape, 便于后续查找
- });
- return chart;
- });
- },
- /**
- * 调用微信扫一扫之前判断可借书多少本
- */
- scanCtl: function () {
- const continuousFn = { fn: this.scanCtl, param: { ...arguments } }
- const { library, vipId, userId } = this.data.options
- console.log(library)
- const libId = library.id || ''
- if (!hasVipService()) return
- InitBorrowCar({ data: { vipId, libId }, continuousFn }).then(res => {
- const { canBorrowNum, borrowNumTotal } = res.data
- wx.showToast({
- title: `您还可以借${canBorrowNum}本书`,
- icon: 'none'
- })
- if (this.data.bookList.length > 0) {
- navigateTo({ url: 'parents/pages/borrow_car/borrow_car', paras: { canBorrowNum } })
- return
- }
- if (canBorrowNum - this.data.bookList.length > 0) {
- this.scanFn()
- }
- this.setData({ ...res.data })
- })
- },
- /**
- * 调用微信扫一扫
- */
- scanFn: function () {
- wx.scanCode({
- success: res => {
- const url = res.result
- const detailsId = url.split('_')[1].split('.')[0]
- if (!detailsId) {
- wx.showToast({
- title: qrcodeInvalidToastText,
- icon: 'none'
- })
- return
- }
- this.scanningBooksFn(detailsId)
- }
- })
- },
- /**
- * 扫一扫借书
- */
- scanningBooksFn: function (detailsId) {
- const continuousFn = { fn: this.scanningBooksFn, param: { ...arguments } }
- const { vipId } = this.data.options
- const { canBorrowNum, bookList } = this.data
- ScanningBooksTwo({ data: { detailsId, vipId }, continuousFn }).then(res => {
- const { detailsId } = res.data;
- for (var i in bookList) {
- if (detailsId == bookList[i].detailsId) {
- wx.showToast({
- title: '此二维码已经扫过',
- icon: 'none'
- })
- }
- }
- if (detailsId) {
- navigateTo({ url: 'parents/pages/borrow_car/borrow_car', paras: { ...res.data, canBorrowNum } })
- }
- }).catch(res => {
- wx.showToast({
- title: res.msg,
- icon: 'none'
- })
- })
- }
- })
|