{"dependencies":[{"ETag":"2550D6FC4A68BCCCC55A92BF957D4923","name":"0.json","size":2450433,"type":"json","url":"https://gw.alipayobjects.com/os/herbox/b2e1095c-63af-434e-8d9e-ea682c4cda6b/0.json"}],"sourceCode":{"app.acss":".container {\n width: 100vw;\n height: 100vh;\n overflow-x: hidden;\n -webkit-font-smoothing: antialiased;\n -webkit-overflow-scrolling: touch;\n}\n","app.js":"import Store from './store';\n\nApp(\n Store({\n onLaunch(options) {\n },\n onShow() {\n },\n onHide() {\n console.log('app onHide');\n },\n onError(msg) {\n console.log('app OnError: ', msg);\n },\n globalData: {\n }\n })\n);\n","app.json":"{\n \"pages\": [\n \"pages/index/index\",\n \"pages/announcement/announcement\",\n \"pages/richText/richText\",\n \"pages/refundCard/refundCard\",\n \"pages/useHelper/index\",\n \"pages/cardManage/cardManage\",\n \"pages/rightsList/rightsList\",\n \"pages/newsList/newsList\"\n ],\n \"window\": {\n \"enableDSL\": \"YES\",\n \"enableJSC\": \"YES\",\n \"enableKeepAlive\": \"NO\",\n \"enableWK\": \"YES\",\n \"nboffline\": \"sync\",\n \"tinyPubRes\": \"YES\",\n \"showDomain\": \"NO\",\n \"backgroundColor\": \"#F5F5F5\",\n \"defaultTitle\": \"乘车权益\",\n \"titleBarColor\": \"#108EE9\"\n },\n \"debug\": true\n}\n","package-lock.json":"{\n \"requires\": true,\n \"lockfileVersion\": 1,\n \"dependencies\": {\n \"babel-runtime\": {\n \"version\": \"6.26.0\",\n \"resolved\": \"http://registry.npm.taobao.org/babel-runtime/download/babel-runtime-6.26.0.tgz\",\n \"integrity\": \"sha1-llxwWGaOgrVde/4E/yM3vItWR/4=\",\n \"requires\": {\n \"core-js\": \"^2.4.0\",\n \"regenerator-runtime\": \"^0.11.0\"\n }\n },\n \"core-js\": {\n \"version\": \"2.6.5\",\n \"resolved\": \"http://registry.npm.taobao.org/core-js/download/core-js-2.6.5.tgz?cache=0&other_urls=http%3A%2F%2Fregistry.npm.taobao.org%2Fcore-js%2Fdownload%2Fcore-js-2.6.5.tgz\",\n \"integrity\": \"sha1-RLyNJJ5/sv9dAOA0Gn/7lPv2eJU=\"\n },\n \"domelementtype\": {\n \"version\": \"1.3.1\",\n \"resolved\": \"http://registry.npm.taobao.org/domelementtype/download/domelementtype-1.3.1.tgz\",\n \"integrity\": \"sha1-0EjESzew0Qp/Kj1f7j9DM9eQSB8=\"\n },\n \"domhandler\": {\n \"version\": \"2.4.2\",\n \"resolved\": \"http://registry.npm.taobao.org/domhandler/download/domhandler-2.4.2.tgz\",\n \"integrity\": \"sha1-iAUJfpM9ZehVRvcm1g9euItE+AM=\",\n \"requires\": {\n \"domelementtype\": \"1\"\n }\n },\n \"entities\": {\n \"version\": \"1.1.2\",\n \"resolved\": \"http://registry.npm.taobao.org/entities/download/entities-1.1.2.tgz\",\n \"integrity\": \"sha1-vfpzUplmTfr9NFKe1PhSKidf6lY=\"\n },\n \"events\": {\n \"version\": \"3.0.0\",\n \"resolved\": \"http://registry.npm.taobao.org/events/download/events-3.0.0.tgz\",\n \"integrity\": \"sha1-mgoN+vYok9krh1uPJpjKQRSXPog=\"\n },\n \"herculex\": {\n \"version\": \"0.2.14-alpha.8\",\n \"resolved\": \"http://registry.npm.taobao.org/herculex/download/herculex-0.2.14-alpha.8.tgz\",\n \"integrity\": \"sha1-i1hhq6WSVd59olajb0a1w2IPLTA=\",\n \"requires\": {\n \"babel-runtime\": \"^6.26.0\",\n \"immer\": \"^1.7.2\",\n \"immutability-helper-enhanced\": \"^2.8.1\"\n }\n },\n \"immer\": {\n \"version\": \"1.12.1\",\n \"resolved\": \"http://registry.npm.taobao.org/immer/download/immer-1.12.1.tgz?cache=0&other_urls=http%3A%2F%2Fregistry.npm.taobao.org%2Fimmer%2Fdownload%2Fimmer-1.12.1.tgz\",\n \"integrity\": \"sha1-QMblspLABWCDbCmTvaOiQ3nUZvU=\"\n },\n \"immutability-helper-enhanced\": {\n \"version\": \"2.8.1\",\n \"resolved\": \"http://registry.npm.taobao.org/immutability-helper-enhanced/download/immutability-helper-enhanced-2.8.1.tgz\",\n \"integrity\": \"sha1-S5g9YizRhRgfOrbdrCBeiPPQZUQ=\"\n },\n \"mini-antui\": {\n \"version\": \"0.3.13\",\n \"resolved\": \"http://registry.npm.taobao.org/mini-antui/download/mini-antui-0.3.13.tgz\",\n \"integrity\": \"sha1-jaymxsIQ0yFXLhbUyPj/W8PsgBU=\"\n },\n \"mini-html-parser2\": {\n \"version\": \"0.1.3\",\n \"resolved\": \"http://registry.npm.taobao.org/mini-html-parser2/download/mini-html-parser2-0.1.3.tgz\",\n \"integrity\": \"sha1-b0GA3BovV57yHW6uKdb2dmAjUWg=\",\n \"requires\": {\n \"domhandler\": \"^2.4.2\",\n \"entities\": \"^1.1.1\",\n \"events\": \"^3.0.0\"\n }\n },\n \"regenerator-runtime\": {\n \"version\": \"0.11.1\",\n \"resolved\": \"http://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.11.1.tgz\",\n \"integrity\": \"sha1-vgWtf5v30i4Fb5cmzuUBf78Z4uk=\"\n }\n }\n}\n","package.json":"{\n \"private\": true,\n \"scripts\": {\n \"ainstall\": \"npm install --registry=https://registry.npm.taobao.org\"\n },\n \"dependencies\": {\n \"herculex\": \"^0.2.14-alpha.5\",\n \"mini-antui\": \"^0.3.13\",\n \"mini-html-parser2\": \"^0.1.3\"\n }\n}\n","store.js":"import { GlobalStore } from 'herculex';\nimport { cardType } from './util/config';\nimport { getCardInfo } from './util/bus-tinyapp';\n\nexport default new GlobalStore({\n state: {\n cardStatus: true,\n },\n actions: {\n /**\n * \b获取公交卡信息\n */\n async getCardInfo({ commit }) {\n getCardInfo(cardType).then((cardInfo) => {\n commit('CARD_INFO', { cardInfo });\n commit('CARD_TYPE', { cardType });\n }).catch(() => {\n commit('CARD_INFO', { cardInfo: {\n cardModels: [{\n cardNo: '1234567890',\n }],\n styleConfig: {\n imageUrl: 'https://gw.alipayobjects.com/mdn/rms_ff2602/afts/img/A*KQJITopJlKkAAAAAAAAAAABkARQnAQ',\n },\n } });\n commit('CARD_TYPE', { cardType: 'AAAA' });\n });\n },\n },\n});\n","components/bottomline/index.acss":".linebox {\n width: 100%;\n height: 50rpx;\n display: flex;\n justify-content: center;\n}\n.lineleft {\n width: 200rpx;\n border-bottom: 1px solid #a9a9a9;\n}\n.linecenter {\n line-height: 100rpx;\n color: #999;\n padding: 0 5rpx 0 5rpx;\n}\n.lineright {\n width: 200rpx;\n border-bottom: 1px solid #a9a9a9;\n}\n","components/bottomline/index.axml":"<view class=\"linebox\">\n <view class=\"lineleft\"></view>\n <view class=\"linecenter\">我是有底线的</view>\n <view class=\"lineright\"></view>\n</view>","components/bottomline/index.js":"Component({\n mixins: [],\n data: {},\n props: {},\n didMount() {},\n didUpdate() {},\n didUnmount() {},\n methods: {},\n});\n","components/bottomline/index.json":"{\n \"component\": true\n}","components/calendar/index.acss":".am-calendar {\n background-color: #fff;\n padding-top: 10px;\n}\n.am-calendar-months {\n display: flex;\n box-sizing: border-box;\n padding: 0 26px;\n align-items: center;\n height: 28px;\n}\n.am-calendar-prev-month,\n.am-calendar-next-month {\n display: flex;\n width: 40px;\n font-size: 20px;\n}\n.am-calendar-prev-month {\n justify-content: flex-start;\n}\n.am-calendar-next-month {\n justify-content: flex-end;\n}\n.am-calendar-arrow {\n height: 28px;\n width: 12px;\n background-image: url('https://gw.alipayobjects.com/zos/rmsportal/vYcMhkfyHRIOeVXWdcPe.png');\n background-size: 8px 14px;\n background-position: left center;\n background-repeat: no-repeat;\n}\n.am-calendar-arrow.next {\n transform: rotate(180deg);\n}\n.am-calendar-selected-month {\n flex: 1;\n text-align: center;\n font-size: 20px;\n font-weight: 600;\n color: #333;\n}\n.am-calendar-days {\n display: flex;\n padding: 14px 10px 9px;\n border-bottom: 1rpx solid #eee;\n height: 20px;\n line-height: 20px;\n}\n.am-calendar-day {\n flex: 1;\n text-align: center;\n color: #333;\n font-size: 14px;\n}\n.am-calendar-dates {\n display: flex;\n flex-direction: column;\n}\n.am-calendar-week {\n margin-bottom: 17px;\n display: flex;\n flex-direction: row;\n padding: 0 10px;\n}\n.am-calendar-week:first-child {\n margin-top: 12px;\n}\n.am-calendar-date-wrap {\n position: relative;\n text-align: center;\n display: flex;\n flex-direction: column;\n align-items: center;\n height: 42px;\n flex: 1;\n}\n.am-calendar-date {\n text-align: center;\n height: 23px;\n line-height: 23px;\n font-size: 19px;\n font-family: 'Helvetica';\n color: #333;\n}\n.am-calendar-tag {\n position: absolute;\n top: 21px;\n width: 42px;\n overflow: hidden;\n text-overflow: hidden;\n white-space: nowrap;\n color: #f5a623;\n font-size: 10px;\n font-weight: 500;\n}\n.am-calendar-today {\n color: #108ee9;\n}\n.am-calendar-gray {\n color: #ccc;\n}\n.am-calendar-section {\n color: #108ee9;\n}\n.am-calendar-selected .am-calendar-block {\n position: absolute;\n left: calc(50% - 21px);\n top: calc(50% - 10px);\n transform: translateY(-50%);\n width: 42px;\n height: 42px;\n background: #309EF2;\n border-radius: 2px;\n}\n.am-calendar-middle.is-range .am-calendar-block {\n position: absolute;\n left: 0;\n top: calc(50% - 10px);\n transform: translateY(-50%);\n height: 42px;\n background: #309EF2;\n width: 100%;\n border-radius: 0;\n}\n.am-calendar-start.is-range .am-calendar-block {\n position: absolute;\n left: calc(50% - 21px);\n top: calc(50% - 10px);\n transform: translateY(-50%);\n width: 100%;\n height: 42px;\n background: #309EF2;\n border-radius: 2px 0 0 2px;\n}\n.am-calendar-end.is-range .am-calendar-block {\n position: absolute;\n left: 0;\n top: calc(50% - 10px);\n transform: translateY(-50%);\n width: calc(50% + 21px);\n height: 42px;\n background: #309EF2;\n border-radius: 0 2px 2px 0;\n}\n.am-calendar-selected .am-calendar-block.has-tag,\n.am-calendar-start .am-calendar-block.has-tag,\n.am-calendar-middle .am-calendar-block.has-tag,\n.am-calendar-end .am-calendar-block.has-tag {\n top: calc(50% - 7px);\n}\n.am-calendar-selected .am-calendar-date,\n.am-calendar-start .am-calendar-date,\n.am-calendar-middle .am-calendar-date,\n.am-calendar-end .am-calendar-date {\n position: relative;\n color: #fff;\n}\n.am-calendar-selected .am-calendar-tag,\n.am-calendar-start .am-calendar-tag,\n.am-calendar-middle .am-calendar-tag,\n.am-calendar-end .am-calendar-tag {\n color: #fff;\n}\n","components/calendar/index.axml":"<view class=\"am-calendar {{className}}\" a:if=\"{{dates.length > 0}}\">\n <view class=\"am-calendar-months\">\n <view class=\"am-calendar-prev-month\" onTap=\"onPrevMonthTap\">\n <view class=\"am-calendar-arrow\"></view>\n </view>\n <view class=\"am-calendar-selected-month\">{{selectedYear}}年{{selectedMonth + 1}}月</view>\n <view class=\"am-calendar-next-month\" onTap=\"onNextMonthTap\">\n <view class=\"am-calendar-arrow next\"></view>\n </view>\n </view>\n <view class=\"am-calendar-days\">\n <block a:for=\"{{['日', '一', '二', '三', '四', '五', '六']}}\">\n <view class=\"am-calendar-day\">{{item}}</view>\n </block>\n </view>\n <view class=\"am-calendar-dates\">\n <block a:for=\"{{dates}}\">\n <view class=\"am-calendar-week\">\n <block a:for=\"{{item}}\">\n <view\n class=\"am-calendar-date-wrap\n {{ item.isSelected ? 'am-calendar-selected': '' }}\n {{ item.isStart ? 'am-calendar-start': '' }}\n {{ item.isMiddle ? 'am-calendar-middle': '' }}\n {{ item.isEnd ? 'am-calendar-end': '' }}\n {{ type === 'range' ? 'is-range' : '' }}\"\n data-year=\"{{item.year}}\"\n data-month=\"{{item.month}}\"\n data-date=\"{{item.date}}\"\n onTap=\"{{ item.isLessThan ? '': 'onDateTap' }}\"\n >\n <view\n class=\"am-calendar-block {{ blockType === 2 ? 'has-tag': '' }}\"\n ></view>\n <view\n\n class=\"am-calendar-date {{ item.isLessThan ? 'am-calendar-gray': 'am-calendar-section' }} {{ item.isToday ? 'am-calendar-today': ''}}\"\n >{{item.isToday ? '今天' : item.date}}</view>\n <view class=\"am-calendar-tag\" style=\"{{\n color: item.isSelected || item.isMiddle || item.isStart || item.isEnd ? '#fff' : item.color\n }}\">{{item.tag}}</view>\n </view>\n </block>\n </view>\n </block>\n </view>\n</view>\n","components/calendar/index.js":"import { connect } from 'herculex';\n\nfunction _toConsumableArray(arr) {\n if (Array.isArray(arr)) {\n const arr2 = Array(arr.length);\n for (let i = 0; i < arr.length; i++) {\n arr2[i] = arr[i];\n }\n return arr2;\n } else {\n return Array.from(arr);\n }\n}\n/* eslint-disable complexity, no-param-reassign */\n/* eslint max-depth: [2, 7] */\nconst leapYear = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\nconst commonYear = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\nconst FIRST_MONTH = 0;\nconst LAST_MONTH = 11;\nconst DAYS_PER_ROW = 7;\nconst COLOR_MAP = {\n 1: '#f5a911',\n 2: '#e8541e',\n 3: '#07a89b',\n 4: '#108ee9',\n 5: 'rgba(51, 51, 51, 0.4)',\n};\n// 获取某月第某天是星期几\nfunction getDay(month, year, index) {\n return new Date(year, month, index).getDay();\n}\n// 获取某月有几天\nfunction getMonthLength(month, year) {\n if (year % 400 === 0 || (year % 100 !== 0 && year % 4 === 0)) {\n return leapYear[month];\n } else {\n return commonYear[month];\n }\n}\n// 数字补位 1 -> 01\nfunction prefixNum(num) {\n if (num < 10) {\n return `0${num}`;\n } else {\n return `${num}`;\n }\n}\n\nComponent(\n connect({\n mapStateToProps: ['calendar'],\n })({\n data: {\n selectedYear: 0,\n selectedMonth: 0,\n currentDate: null,\n dates: [],\n blockType: 1, // 1.没有待办纯数字 2.有待办 用于区分不同类型日期块的样式。\n },\n props: {\n className: '',\n tagData: [],\n type: 'single',\n },\n didMount: function didMount() {\n this.tapTimes = 0;\n const date = new Date();\n date.setHours(0);\n date.setMinutes(0);\n date.setSeconds(0);\n date.setMilliseconds(0);\n const year = date.getFullYear();\n const month = date.getMonth();\n this.setData({\n selectedYear: year,\n selectedMonth: month,\n currentDate: date,\n });\n this.refreshdates(month, year);\n },\n didUpdate: function didUpdate() {\n const { dates } = this.data;\n\n let blockType = 1;\n for (let i = 0; i < dates.length; i++) {\n for (let j = 0; j < dates[i].length; j++) {\n if (this.hasTag(dates[i][j])) {\n blockType = 2;\n }\n }\n }\n this.setData({\n dates,\n blockType,\n });\n },\n methods: {\n onPrevMonthTap: function onPrevMonthTap() {\n const _data = this.data;\n\n const { selectedMonth } = _data;\n\n const { selectedYear } = _data;\n\n let year = selectedYear;\n let month = selectedMonth;\n // 如果当前选中是一月份,前一月是去年的12月\n if (selectedMonth === FIRST_MONTH) {\n year = selectedYear - 1;\n month = LAST_MONTH;\n } else {\n month = selectedMonth - 1;\n }\n if (this.props.onMonthChange) {\n this.props.onMonthChange(month, selectedMonth);\n }\n this.setData({\n selectedYear: year,\n selectedMonth: month,\n });\n this.refreshdates(month, year);\n },\n onNextMonthTap: function onNextMonthTap() {\n const _data2 = this.data;\n\n const { selectedMonth } = _data2;\n\n const { selectedYear } = _data2;\n\n let year = selectedYear;\n let month = selectedMonth;\n // 如果当前选中是十二月份,下一月是去年的12月\n if (selectedMonth === LAST_MONTH) {\n year = selectedYear + 1;\n month = FIRST_MONTH;\n } else {\n month = selectedMonth + 1;\n }\n if (this.props.onMonthChange) {\n this.props.onMonthChange(month, selectedMonth);\n }\n this.setData({\n selectedYear: year,\n selectedMonth: month,\n });\n\n this.refreshdates(month, year);\n },\n refreshdates: function refreshdates(month, year) {\n this.tapTimes = 0;\n const _data3 = this.data;\n const { selectedYear } = _data3;\n const { selectedMonth } = _data3;\n const { currentDate } = _data3;\n const firstDay = getDay(month, year, 1);\n const days = getMonthLength(month, year);\n const datesArray = [];\n const currentDateTimeStamp = +currentDate;\n let num = 0;\n for (let i = 0; i < firstDay; i++) {\n num += 1;\n // 如果当前选中的是一月份,前一个月是去年的12月\n let _year = selectedYear;\n let _month = selectedMonth;\n\n if (selectedMonth === 0) {\n _year = selectedYear - 1;\n _month = LAST_MONTH;\n } else {\n _year = selectedYear;\n _month = selectedMonth - 1;\n }\n const date = getMonthLength(_month, _year) - i;\n const dateTimeStampP = +new Date(_year, _month, date);\n datesArray.unshift({\n year: _year,\n month: _month,\n date,\n isToday: false,\n isGray: true,\n isLessThan:\n dateTimeStampP < currentDateTimeStamp ||\n dateTimeStampP >= 86400000 * 30 + currentDateTimeStamp, // 用于控制小于当前日期,大于30天不能选择\n isSelected: false,\n tag: '',\n });\n }\n\n for (let _i = 0; _i < days; _i++) {\n num += 1;\n const _date = _i + 1;\n const dateTimeStamp = +new Date(selectedYear, selectedMonth, _date);\n datesArray.push({\n year: selectedYear,\n month: selectedMonth,\n date: _date,\n isToday: dateTimeStamp === currentDateTimeStamp,\n isGray: false,\n isLessThan:\n dateTimeStamp < currentDateTimeStamp ||\n dateTimeStamp >= 86400000 * 30 + currentDateTimeStamp, // 用于控制小于当前日期,大于30天不能选择\n isSelected: dateTimeStamp === currentDateTimeStamp,\n tag: '',\n });\n }\n let nextDate = 0;\n let daysPerPage = 35;\n\n if (num > 35) {\n daysPerPage = 42;\n }\n for (let _i2 = 0; _i2 < daysPerPage - days - firstDay; _i2++) {\n // 如果是12月,下月是第二年的1月份\n nextDate += 1;\n let _year2 = selectedYear;\n let _month2 = selectedMonth;\n if (selectedMonth === LAST_MONTH) {\n _year2 = selectedYear + 1;\n _month2 = FIRST_MONTH;\n } else {\n _year2 = selectedYear;\n _month2 = selectedMonth + 1;\n }\n const dateTimeStamN = +new Date(_year2, _month2, nextDate);\n datesArray.push({\n year: _year2,\n month: _month2,\n date: nextDate,\n isToday: false,\n isGray: true,\n isSelected: false,\n isLessThan:\n dateTimeStamN < currentDateTimeStamp ||\n dateTimeStamN >= 86400000 * 30 + currentDateTimeStamp, // 用于控制小于当前日期,大于30天不能选择\n tag: '',\n });\n }\n let blockType = 1;\n for (let _i3 = 0; _i3 < datesArray.length; _i3++) {\n if (this.hasTag(datesArray[_i3])) {\n blockType = 2;\n }\n }\n\n const dates = [];\n let weekDates = [];\n for (let _i4 = 0; _i4 < datesArray.length; _i4++) {\n weekDates.push(datesArray[_i4]);\n if ((_i4 + 1) % DAYS_PER_ROW === 0) {\n dates.push([].concat(_toConsumableArray(weekDates)));\n weekDates = [];\n }\n }\n this.setData({\n dates,\n blockType,\n });\n },\n hasTag: function hasTag(dateObj) {\n const { tagData } = this.props;\n // 去重由调用者处理\n\n if (tagData.length === 0) {\n dateObj.tag = '';\n return false;\n }\n return tagData.some((item) => {\n const date = new Date(item.date);\n if (\n dateObj.year === date.getFullYear() &&\n dateObj.month === date.getMonth() &&\n dateObj.date === date.getDate()\n ) {\n dateObj.tag = item.tag;\n dateObj.color = COLOR_MAP[item.tagColor];\n return true;\n } else {\n dateObj.tag = '';\n return false;\n }\n });\n },\n getDateGap: function getDateGap(day1, day2) {\n const date1 = +new Date(\n day1.year,\n prefixNum(day1.month),\n prefixNum(day1.date)\n );\n const date2 = +new Date(\n day2.year,\n prefixNum(day2.month),\n prefixNum(day2.date)\n );\n return (date1 - date2) / (24 * 3600 * 1000);\n },\n makeDate: function makeDate(dateObj) {\n return new Date(\n `${dateObj.year}-${prefixNum(dateObj.month + 1)}-${prefixNum(dateObj.date)}`\n );\n },\n onDateTap: function onDateTap(event) {\n const { dates } = this.data;\n const _event$currentTarget$ = event.currentTarget.dataset;\n\n const { year } = _event$currentTarget$;\n\n const { month } = _event$currentTarget$;\n\n const { date } = _event$currentTarget$;\n const { type } = this.props;\n if (type === 'range') {\n this.tapTimes += 1;\n\n if (this.tapTimes % 2 === 0) {\n this.endDate = { year, month, date };\n const dateGap = this.getDateGap(this.startDate, this.endDate);\n\n if (dateGap > 0) {\n const _ref = [this.endDate, this.startDate];\n this.startDate = _ref[0];\n this.endDate = _ref[1];\n }\n\n for (let i = 0; i < dates.length; i++) {\n for (let j = 0; j < dates[i].length; j++) {\n const dateObj = dates[i][j];\n dateObj.isStart = false;\n dateObj.isMiddle = false;\n dateObj.isEnd = false;\n\n const startDateGap = this.getDateGap(dateObj, this.startDate);\n const endDateGap = this.getDateGap(dateObj, this.endDate);\n if (startDateGap > 0 && endDateGap < 0) {\n if (dateGap !== 0) {\n if (j === 0) {\n dateObj.isStart = true;\n } else if (j === 6) {\n dateObj.isEnd = true;\n } else {\n dateObj.isMiddle = true;\n }\n } else {\n dateObj.isSelected = true;\n }\n }\n\n if (\n this.startDate.year === dateObj.year &&\n this.startDate.month === dateObj.month &&\n this.startDate.date === dateObj.date &&\n dateGap !== 0\n ) {\n if (j === 6) {\n dateObj.isSelected = true;\n } else {\n dateObj.isStart = true;\n }\n }\n\n if (\n this.endDate.year === dateObj.year &&\n this.endDate.month === dateObj.month &&\n this.endDate.date === dateObj.date &&\n dateGap !== 0\n ) {\n if (j === 0) {\n dateObj.isSelected = true;\n } else {\n dateObj.isEnd = true;\n }\n }\n }\n }\n if (this.props.onSelect) {\n this.props.onSelect([\n this.makeDate(this.startDate),\n this.makeDate(this.endDate),\n ]);\n }\n } else {\n for (let _i5 = 0; _i5 < dates.length; _i5++) {\n for (let _j = 0; _j < dates[_i5].length; _j++) {\n const _dateObj = dates[_i5][_j];\n if (\n _dateObj.year === year &&\n _dateObj.month === month &&\n _dateObj.date === date\n ) {\n _dateObj.isSelected = true;\n _dateObj.isStart = false;\n _dateObj.isMiddle = false;\n _dateObj.isEnd = false;\n } else {\n _dateObj.isSelected = false;\n _dateObj.isStart = false;\n _dateObj.isMiddle = false;\n _dateObj.isEnd = false;\n }\n }\n }\n this.startDate = { year, month, date };\n }\n\n this.setData({\n dates,\n });\n } else {\n for (let _i6 = 0; _i6 < dates.length; _i6++) {\n for (let _j2 = 0; _j2 < dates[_i6].length; _j2++) {\n const _dateObj2 = dates[_i6][_j2];\n if (_dateObj2.year === year && _dateObj2.month === month && _dateObj2.date === date) {\n _dateObj2.isSelected = true;\n } else {\n _dateObj2.isSelected = false;\n }\n }\n }\n\n this.setData({\n dates,\n });\n\n if (this.props.onSelect) {\n this.props.onSelect([\n this.makeDate({ year, month, date }),\n undefined,\n ]);\n }\n }\n },\n },\n })\n);\n","components/calendar/index.json":"{\n \"component\": true\n}\n","components/cardHeader/index.acss":".card-header {\n padding: 20rpx;\n background-color: #fff;\n display: flex;\n justify-content: space-between;\n}\n.card-header .card-header-title {\n font-size: 32rpx;\n font-weight: bold;\n}\n.card-header .card-header-subtitle {\n color: #999;\n}\n","components/cardHeader/index.axml":"<view class=\"card-header\">\n <view onTap=\"onBtnTitle\" class=\"card-header-title\">{{title}}</view>\n <view onTap=\"onBtnSubTitle\" class=\"card-header-subtitle\">{{subTitle}}</view>\n</view>","components/cardHeader/index.js":"Component({\n data: {\n },\n props: {\n onBtnSubTitle: () => {\n },\n },\n didMount() {\n },\n methods: {\n onBtnSubTitle(e) {\n this.props.onBtnSubTitle(e);\n },\n },\n});\n","components/cardHeader/index.json":"{\n \"component\": true,\n \"usingComponents\": {\n }\n}\n","components/msg-card/index.acss":".msg-card {\n padding: 20rpx;\n margin: 0 20rpx;\n border-bottom: 2rpx solid #ccc;\n}\n.msg-card .title {\n font-size: 32rpx;\n line-height: 50rpx;\n overflow: auto;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n.msg-card .date {\n font-size: 26rpx;\n line-height: 40rpx;\n color: #999999;\n}\n","components/msg-card/index.axml":" <view onTap=\"onBtnMsgCard\" class=\"msg-card\" data-index=\"{{index}}\" data-id=\"{{id}}\">\n <view class=\"title\">{{title}} \n </view>\n <view class=\"date\">{{time}} \n </view>\n</view>","components/msg-card/index.js":"Component({\n data: {\n },\n props: {\n onBtnMsgCard: () => {\n },\n },\n didMount() {\n },\n methods: {\n onBtnMsgCard(e) {\n this.props.onBtnMsgCard(e);\n },\n },\n});\n","components/msg-card/index.json":"{\n \"component\": true\n}\n","components/news-card-list/index.acss":".news {\n padding-left: 25rpx;\n padding-right: 25rpx;\n background: #FFFFFF;\n}\n.news .newbox {\n width: 100%;\n height: 181rpx;\n display: flex;\n justify-content: center;\n padding-bottom: 20rpx;\n}\n.news .newbox .newleft {\n width: 450rpx;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n padding: 10rpx 10rpx 10rpx 0;\n}\n.news .newbox .newleft .newtitle {\n font-size: 32rpx;\n line-height: 50rpx;\n}\n.news .newbox .newleft .newdate {\n font-size: 26rpx;\n line-height: 40rpx;\n color: #999999;\n}\n.news .newbox .picturebox {\n width: 250rpx;\n height: 181rpx;\n}\n.news .newbox .newright {\n width: 250rpx;\n height: 181rpx;\n}\n","components/news-card-list/index.axml":"<view class=\"news\">\n <block a:for=\"{{cardNewsData}}\" a:if=\"{{count ? index \n <count : true}}\">\n <view class=\"newbox\" onTap=\"onBtnItem\">\n <view class=\"newleft\">\n <view class=\"newtitle\">{{item.title}} \n </view>\n <view class=\"newdate\">{{item.time}} \n </view>\n </view>\n <view class=\"picturebox\">\n <image class=\"newright\" src=\"{{item.bannerUrl}}\" mode=\"scaleToFill\" />\n </view>\n </view>\n </block>\n</view>","components/news-card-list/index.js":"Component({\n data: {\n },\n props: {\n onBtnMsgCard: () => {\n },\n onBtnItem: () => {\n },\n },\n didMount() {\n },\n methods: {\n onBtnMsgCard(e) {\n this.props.onBtnMsgCard(e);\n },\n onBtnItem(e) {\n this.props.onBtnItem(e);\n },\n },\n});\n","components/news-card-list/index.json":"{\n \"component\": true\n}\n","components/refundCard-header/index.acss":".card-header {\n text-align: center;\n border-bottom: 2rpx solid #ccc;\n margin-bottom: 20rpx;\n}\n.card-header .card-icon {\n margin: 20rpx 0;\n}\n.card-header .card-title {\n margin: 20rpx 0;\n color: #333;\n font-weight: bold;\n}\n.card-header .card-desc {\n margin: 20rpx 0;\n color: #666;\n}\n","components/refundCard-header/index.axml":"<view class=\"card-header\">\n <icon class=\"card-icon\" type=\"{{submitInfo.type}}\" size=\"60\" color=\"#118eea\" />\n <view class=\"card-title\"> {{submitInfo.title}} \n </view>\n <view class=\"card-desc\"> {{submitInfo.desc}} \n </view>\n</view>","components/refundCard-header/index.js":"// import { connect } from 'herculex';\n\n// const typeColor = {\n// success: '#118eea', // 仅边框存在\n// waiting: 'green', // 普通按钮/主要按钮\n// warn: 'yellow', // 成功按钮\n// clear: 'red', // 信息按钮\n// };\nComponent({\n data: {\n },\n props: {\n },\n didMount() { },\n methods: {\n },\n});\n","components/refundCard-header/index.json":"{\n \"component\": true\n}","components/rightsCard/index.acss":".rights-card {\n width: 335rpx;\n height: 180rpx;\n margin: 15rpx;\n color: #fff;\n}\n.rights-card .rights-card-img {\n width: 100%;\n height: 100%;\n}\n.rights-card .title {\n font-size: 24rpx;\n margin-bottom: 10rpx;\n}\n.rights-card .description {\n font-size: 18rpx;\n}\n","components/rightsCard/index.axml":" \n<view class=\"rights-card\" onTap=\"onBtnItem\">\n <image class=\"rights-card-img\" src=\"{{imgUrl}}\" mode=\"aspectFit\" />\n <view class=\"title\">{{title}} \n </view>\n <view class=\"description\">{{description}} \n </view>\n</view>","components/rightsCard/index.js":"// import { connect } from 'herculex';\n\nComponent({\n data: {\n },\n props: {\n onBtnItem: () => {\n },\n },\n didMount() { },\n methods: {\n onBtnItem(e) {\n this.props.onBtnItem(e);\n },\n },\n});\n","components/rightsCard/index.json":"{\n \"component\": true,\n \"usingComponents\": {\n }\n}\n","constant/index.js":"// 旅客类型\n\nexport const passengertype = [\n { name: '成人', code: '1' },\n { name: '儿童', code: '2' },\n { name: '学生', code: '3' },\n { name: '残军', code: '4' },\n];\n\n// 证件类型\nexport const idType = [\n { name: '中国居民身份证', code: '1' },\n { name: '港澳居民来往内地通行证', code: 'C' },\n { name: '台湾居民来往大陆通行证', code: 'G' },\n { name: '护照', code: 'B' },\n { name: '外国人永久居留身份证', code: 'H' },\n];\n\n// 学制\nexport const schoolSystem = [\n { name: '1', code: '1' },\n { name: '2', code: '2' },\n { name: '3', code: '3' },\n { name: '4', code: '4' },\n { name: '5', code: '5' },\n { name: '6', code: '6' },\n { name: '7', code: '7' },\n { name: '8', code: '8' },\n { name: '9', code: '9' },\n];\n\n// 年份\nconst d = new Date();\nconst nowYear = d.getFullYear();\nconst _enterYear = [];\nfor (let i = 0; i <= 9; i++) {\n const j = nowYear - i;\n _enterYear.push({\n name: j,\n code: j,\n });\n}\n\nexport const enterYear = _enterYear;\n","module/advertising/index.acss":".red-envelopes {\n width: 100%;\n box-sizing: border-box;\n margin-bottom: 10rpx;\n}\n","module/advertising/index.axml":" \n<view class=\"red-envelopes\">\n <swiper indicator-dots=\"{{indicatorDots}}\" autoplay=\"{{autoplay}}\" interval=\"{{interval}}\" duration=\"{{duration}}\" circular=\"{{circular}}\">\n <block a:for=\"{{advertising}}\">\n <swiper-item >\n <image onTap=\"onBtnItem\" src=\"{{item.imgUrl}}\" style=\"width:100%;height:181rpx;\" class=\"slide-image\" />\n </swiper-item>\n </block>\n </swiper>\n</view>","module/advertising/index.js":"import { connect } from 'herculex';\n\nComponent(connect({\n mapStateToProps: []\n})({\n props: {\n onBtnItem: () => {\n }\n },\n data: {},\n methods: {\n onBtnItem(e) {\n this.props.onBtnItem(e);\n }\n }\n}));\n","module/advertising/index.json":"{\n \"component\": true\n}\n","module/bus-tinyapp-components/es/card-activate/index.acss":".card-activate {\n width: 100%;\n}\n.card-face {\n position: relative;\n width: 700rpx;\n margin: 0 auto;\n height: 220rpx;\n overflow: hidden;\n}\n.card-face .card-title {\n position: absolute;\n top: 36rpx;\n left: 38rpx;\n}\n.card-face .card-title text {\n color: #fff;\n font-size: 36rpx;\n font-weight: bold;\n vertical-align: middle;\n}\n.card-face .face-img {\n width: 100%;\n border-radius: 20rpx;\n}\n.card-face .logo-img {\n width: 60rpx;\n margin-right: 24rpx;\n vertical-align: middle;\n border-radius: 50%;\n}\n.entry-box {\n position: relative;\n width: 100%;\n background: #fff;\n height: 110rpx;\n box-sizing: border-box;\n padding-top: 24rpx;\n border-radius: 8rpx 8rpx 0 0;\n}\n.entry-box .card-activate-entry {\n background: #108EE9;\n border-radius: 4rpx;\n height: 56rpx;\n line-height: 56rpx;\n text-align: center;\n font-size: 28rpx;\n color: #FFFFFF;\n width: 200rpx;\n margin: 0 auto;\n}\n.entry-box .bus-code-entry {\n position: absolute;\n top: -30rpx;\n left: 50%;\n width: 120rpx;\n height: 120rpx;\n margin-left: -60rpx;\n background: #108EE9;\n border: 7rpx solid #FFFFFF;\n border-radius: 50%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n}\n.entry-box .bus-code-entry .bus-code-icon {\n width: 42rpx;\n}\n.entry-box .bus-code-entry .bus-code-icon image {\n width: 100%;\n display: block;\n}\n.entry-box .bus-code-entry .bus-code-text {\n font-size: 22rpx;\n color: #FFFFFF;\n text-align: center;\n height: 30rpx;\n line-height: 30rpx;\n margin-top: 8rpx;\n}\n","module/bus-tinyapp-components/es/card-activate/index.axml":"<view class=\"card-activate\">\n <view class=\"card-face\" a:if=\"{{cardFace}}\">\n <view class=\"card-title\">\n <image class=\"logo-img\" src=\"{{cardLogo}}\" mode=\"widthFix\" />\n <text class=\"title\">{{cardTitle}}</text>\n <text class=\"balance\" a:if=\"{{status === 'received' && _balance}}\">\n 余额{{_balance}}元\n </text>\n </view>\n <view class=\"card-no\" a:if=\"{{cardNo}}\">NO.{{cardNo}}</view>\n <image class=\"face-img\" src=\"{{cardFace}}\" mode=\"widthFix\" />\n </view>\n <view class=\"entry-box\" a:if=\"{{status}}\">\n <view class=\"card-activate-entry\" a:if=\"{{status === 'noReceive'}}\" onTap=\"handleApply\">立即领卡</view>\n <view class=\"bus-code-entry\" a:elif=\"{{status === 'received'}}\" onTap=\"handleTap\">\n <view class=\"bus-code-icon\">\n <image src=\"https://gw.alipayobjects.com/zos/rmsportal/ldrkQwIALWpMiqqwDKIP.png\" mode=\"widthFix\"></image>\n </view>\n <view class=\"bus-code-text\">去乘车</view>\n </view>\n </view>\n</view>\n","module/bus-tinyapp-components/es/card-activate/index.js":"import { jump, jumpToBusCode, jumpToAlipayPage } from '../utils';\n\nComponent({\n data: {\n cardType: '',\n cardFace: '',\n applyUrl: '',\n status: ''\n },\n props: {\n cardInfo: {},\n unified: false,\n appId: ''\n },\n didUpdate: function didUpdate() {\n var cardInfo = this.props.cardInfo;\n\n\n this.setData({\n cardType: cardInfo.cardType,\n cardTitle: cardInfo.cardTitle,\n cardLogo: cardInfo.styleConfig && cardInfo.styleConfig.logoUrl,\n cardFace: cardInfo.styleConfig && cardInfo.styleConfig.imageUrl,\n applyUrl: cardInfo.extInfo && cardInfo.extInfo.cardApplyUrl,\n status: cardInfo.cardModels && cardInfo.cardModels.length > 0 ? 'received' : 'noReceive'\n });\n },\n\n methods: {\n handleTap: function handleTap() {\n jumpToBusCode(this.data.cardType);\n },\n handleApply: function handleApply() {\n if (this.props.unified) {\n jumpToBusCode(this.data.cardType);\n\n return;\n }\n var url = this.data.applyUrl;\n\n if (url.indexOf('68687011') > -1) {\n // 极速开卡模式\n jumpToAlipayPage(url);\n\n return;\n }\n var query = 'from=tinyapp&appId=' + this.props.appId;\n\n if (url.indexOf('?') > -1) {\n url += '&' + query;\n } else {\n url += '?' + query;\n }\n\n jump(url);\n }\n }\n});","module/bus-tinyapp-components/es/card-activate/index.json":"{\n \"component\": true\n}\n","module/bus-tinyapp-components/es/tab/index.acss":".tab {\n box-sizing: border-box;\n position: fixed;\n bottom: 0;\n display: flex;\n height: 100rpx;\n padding: 17rpx 0;\n width: 100%;\n justify-content: space-around;\n align-items: flex-end;\n text-align: center;\n background: #fff;\n z-index: 1050;\n background-image: linear-gradient(180deg, #e6e6e6, #e6e6e6 50%, #fff 50%);\n background-size: 100% 1px;\n background-repeat: no-repeat;\n background-position: top;\n}\n.tab-item {\n flex: 1;\n}\n.tab-item-icon {\n width: 36rpx;\n margin-bottom: 11rpx;\n}\n.tab-item-icon-HOME {\n width: 42rpx;\n}\n.tab-item-name {\n font-size: 20rpx;\n color: #999;\n}\n.tab-item-active .tab-item-name {\n color: #108EE9;\n}\n","module/bus-tinyapp-components/es/tab/index.axml":"<view class=\"tab\" a:if=\"{{tabs && tabs.length > 1}}\">\n <view\n a:for=\"{{tabs}}\"\n class=\"{{'tab-item' + (item.code === activeTab ? ' tab-item-active' : '')}}\"\n data-code=\"{{item.code}}\"\n data-url=\"{{item.url}}\"\n onTap=\"handleTap\">\n <image\n class=\"{{'tab-item-icon' + ' tab-item-icon-' + item.code}}\"\n src=\"{{item.code === activeTab ? item.activeIcon : item.icon}}\"\n mode=\"widthFix\" />\n <view class=\"tab-item-name\">{{item.name}}</view>\n </view>\n</view>\n","module/bus-tinyapp-components/es/tab/index.js":"import { getTabs, jump } from '../utils';\n\nvar app = getApp();\n\nComponent({\n data: {\n tabs: []\n },\n props: {\n activeTab: 'HOME',\n cardType: '',\n cardInfo: {},\n inc: false\n },\n methods: {\n handleTap: function handleTap(e) {\n var _props = this.props,\n activeTab = _props.activeTab,\n cardInfo = _props.cardInfo,\n inc = _props.inc;\n var _e$target$dataset = e.target.dataset,\n url = _e$target$dataset.url,\n code = _e$target$dataset.code;\n\n\n if (code === activeTab || !url) return;\n\n if (activeTab === 'HOME' && cardInfo.cardModels && cardInfo.cardModels.length < 1) {\n my.alert({ content: '请先领取公交卡' });\n\n return;\n }\n\n var page = url.match(/^\\/pages\\/.*/);\n\n if (page) {\n if (app.__from === code) {\n my.navigateBack();\n } else {\n app.__from = activeTab;\n my.navigateTo({ url: url });\n }\n } else {\n var cardType = this.props.cardType;\n var cardNo = cardInfo.cardModels && cardInfo.cardModels[0] && cardInfo.cardModels[0].cardNo;\n\n jump(url, { cardType: cardType, cardNo: cardNo }, inc);\n }\n }\n },\n didMount: function didMount() {\n var _this = this;\n\n getTabs(this.props.cardType).then(function (tabs) {\n return _this.setData({ tabs: tabs });\n });\n }\n});","module/bus-tinyapp-components/es/tab/index.json":"{\n \"component\": true\n}\n","module/bus-tinyapp-components/es/utils/index.js":"\nconst _slicedToArray = (function () { function sliceIterator(arr, i) { const _arr = []; let _n = true; let _d = false; let _e; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i.return) _i.return(); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; }());\n\n// import { mockCards, mockTabs } from '../../mock';\n\nconst rpc = function rpc(type, params) {\n return new Promise(((resolve, reject) => {\n my.call('buscode_query_data_for_applet', {\n bizType: type,\n bizParam: JSON.stringify(params),\n }, (res) => {\n if (res.success) {\n return resolve(JSON.parse(res.data));\n }\n\n reject();\n });\n }));\n};\n\nconst qsParse = function qsParse(qs) {\n if (!qs) return {};\n const res = {};\n\n qs.split('&').forEach((item) => {\n const _item$split = item.split('=');\n const _item$split2 = _slicedToArray(_item$split, 2);\n const k = _item$split2[0];\n const v = _item$split2[1];\n\n res[k] = v;\n });\n\n return res;\n};\n\nexport function getTabs(cardType) {\n // return mockTabs();\n return rpc('QUERY_APPLET_FUNCTION_LIST', { cardType });\n}\n\nexport function getCardInfo(cardType) {\n // return mockCards();\n return rpc('QUERY_CARD_DETAIL', { cardType });\n}\n\nexport function jumpToBusCode(cardType) {\n my.ap.navigateToAlipayPage({\n path: `alipays://platformapi/startapp?appId=200011235&source=applet&cardType=${cardType}`,\n });\n}\n\nexport function jumpToBusRecord(_ref) {\n const { cardType } = _ref;\n const { cardNo } = _ref;\n my.ap.navigateToAlipayPage({\n path: `alipays://platformapi/startapp?appId=20000076&returnHome=NO&bizSubType=75&showSearch=false&title=%E4%B9%98%E8%BD%A6%E8%AE%B0%E5%BD%95&cardType=${cardType}&cardNo=${cardNo}`,\n });\n}\n\nexport function jumpToAlipayPage(path) {\n my.ap.navigateToAlipayPage({\n path,\n });\n}\n\nexport function jump(url) {\n // eslint-disable-next-line prefer-rest-params\n const _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n const _ref2$cardType = _ref2.cardType;\n const cardType = _ref2$cardType === undefined ? '' : _ref2$cardType;\n const _ref2$cardNo = _ref2.cardNo;\n const cardNo = _ref2$cardNo === undefined ? '' : _ref2$cardNo;\n\n // eslint-disable-next-line prefer-rest-params\n const inc = arguments[2];\n\n const target = url.replace('{cardType}', cardType).replace('{cardNo}', cardNo);\n const res = target.match(/^alipays:\\/\\/platformapi\\/startapp\\?appId=(\\d+)&?(.*)$/);\n\n if (res) {\n // 有appId只能跳转至小程序\n if (res[1].length > 8) {\n // 开放平台\n if (inc) {\n my.call('startApp', {\n appId: res[1],\n param: {\n page: decodeURIComponent(qsParse(res[2]).page),\n query: decodeURIComponent(qsParse(res[2]).query),\n },\n });\n } else {\n my.navigateToMiniProgram({\n appId: res[1],\n path: decodeURIComponent(qsParse(res[2]).page),\n extraData: qsParse(decodeURIComponent(qsParse(res[2]).query)), // query=key%3Dvalue => {key: value}\n });\n }\n } else {\n jumpToAlipayPage(target);\n }\n } else {\n my.call('startApp', {\n appId: '20000067',\n param: { url: target },\n closeCurrentApp: false,\n });\n }\n}\n","module/bus-tinyapp-components/package.json":"{\n \"_args\": [\n [\n \"bus-tinyapp-components@1.0.26\",\n \"/Users/taobaozhong/Desktop/bus-template/src\"\n ]\n ],\n \"_from\": \"bus-tinyapp-components@1.0.26\",\n \"_id\": \"bus-tinyapp-components@1.0.26\",\n \"_inBundle\": false,\n \"_integrity\": \"sha1-h35QooKwdMDTMjxE7RocJrXl1RE=\",\n \"_location\": \"/bus-tinyapp-components\",\n \"_phantomChildren\": {},\n \"_requested\": {\n \"type\": \"version\",\n \"registry\": true,\n \"raw\": \"bus-tinyapp-components@1.0.26\",\n \"name\": \"bus-tinyapp-components\",\n \"escapedName\": \"bus-tinyapp-components\",\n \"rawSpec\": \"1.0.26\",\n \"saveSpec\": null,\n \"fetchSpec\": \"1.0.26\"\n },\n \"_requiredBy\": [\n \"/\"\n ],\n \"_resolved\": \"http://registry.npm.taobao.org/bus-tinyapp-components/download/bus-tinyapp-components-1.0.26.tgz\",\n \"_spec\": \"1.0.26\",\n \"_where\": \"/Users/taobaozhong/Desktop/bus-template/src\",\n \"description\": \"Components for alipay tinyapp\",\n \"devDependencies\": {\n \"rc-tools\": \"6.x\"\n },\n \"files\": [\n \"es\"\n ],\n \"keywords\": [\n \"tinyapp-component\",\n \"mini-program\"\n ],\n \"name\": \"bus-tinyapp-components\",\n \"scripts\": {\n \"build\": \"rc-tools run compile && node scripts/cp.js && node scripts/rm.js\",\n \"pub\": \"git push origin && npm run build && npm publish\"\n },\n \"version\": \"1.0.26\"\n}\n","module/card-activate/index.acss":".card-activate {\n width: 100%;\n}\n.card-face {\n position: relative;\n width: 700rpx;\n margin: 0 auto;\n height: 220rpx;\n overflow: hidden;\n}\n.card-face .card-title {\n position: absolute;\n top: 36rpx;\n left: 38rpx;\n}\n.card-face .card-title text {\n color: #fff;\n font-size: 36rpx;\n font-weight: bold;\n vertical-align: middle;\n}\n.card-face .face-img {\n width: 100%;\n border-radius: 20rpx;\n}\n.card-face .logo-img {\n width: 60rpx;\n margin-right: 24rpx;\n vertical-align: middle;\n border-radius: 50%;\n}\n.entry-box {\n position: relative;\n width: 100%;\n background: #fff;\n height: 110rpx;\n box-sizing: border-box;\n padding-top: 24rpx;\n border-radius: 8rpx 8rpx 0 0;\n}\n.entry-box .card-activate-entry {\n background: #108EE9;\n border-radius: 4rpx;\n height: 56rpx;\n line-height: 56rpx;\n text-align: center;\n font-size: 28rpx;\n color: #FFFFFF;\n width: 200rpx;\n margin: 0 auto;\n}\n.entry-box .bus-code-entry {\n position: absolute;\n top: -30rpx;\n left: 50%;\n width: 120rpx;\n height: 120rpx;\n margin-left: -60rpx;\n background: #108EE9;\n border: 7rpx solid #FFFFFF;\n border-radius: 50%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n}\n.entry-box .bus-code-entry .bus-code-icon {\n width: 42rpx;\n}\n.entry-box .bus-code-entry .bus-code-icon image {\n width: 100%;\n display: block;\n}\n.entry-box .bus-code-entry .bus-code-text {\n font-size: 22rpx;\n color: #FFFFFF;\n text-align: center;\n height: 30rpx;\n line-height: 30rpx;\n margin-top: 8rpx;\n}\n","module/card-activate/index.axml":"<view class=\"card-activate\">\n <view class=\"card-face\" a:if=\"{{cardFace}}\">\n <view class=\"card-title\">\n <image class=\"logo-img\" src=\"{{cardLogo}}\" mode=\"widthFix\" />\n <text class=\"title\">{{cardTitle}}</text>\n <text class=\"balance\" a:if=\"{{status === 'received' && _balance}}\">\n 余额{{_balance}}元\n </text>\n </view>\n <view class=\"card-no\" a:if=\"{{cardNo}}\">NO.{{cardNo}}</view>\n <image class=\"face-img\" src=\"{{cardFace}}\" mode=\"widthFix\" />\n </view>\n <view class=\"entry-box\" a:if=\"{{status}}\">\n <view class=\"card-activate-entry\" a:if=\"{{status === 'noReceive'}}\" onTap=\"handleApply\">立即领卡</view>\n <view class=\"bus-code-entry\" a:elif=\"{{status === 'received'}}\" onTap=\"handleTap\">\n <view class=\"bus-code-icon\">\n <image src=\"https://gw.alipayobjects.com/zos/rmsportal/ldrkQwIALWpMiqqwDKIP.png\" mode=\"widthFix\"></image>\n </view>\n <view class=\"bus-code-text\">去乘车</view>\n </view>\n </view>\n</view>\n","module/card-activate/index.js":"import { jump, jumpToBusCode, jumpToAlipayPage } from '../../util/bus-tinyapp';\n\nComponent({\n data: {\n cardType: '',\n cardFace: '',\n applyUrl: '',\n status: '',\n },\n props: {\n cardInfo: {},\n unified: false,\n appId: '',\n },\n didUpdate: function didUpdate() {\n const { cardInfo } = this.props;\n\n\n this.setData({\n cardType: cardInfo.cardType,\n cardTitle: cardInfo.cardTitle,\n cardLogo: cardInfo.styleConfig && cardInfo.styleConfig.logoUrl,\n cardFace: cardInfo.styleConfig && cardInfo.styleConfig.imageUrl,\n applyUrl: cardInfo.extInfo && cardInfo.extInfo.cardApplyUrl,\n status: cardInfo.cardModels && cardInfo.cardModels.length > 0 ? 'received' : 'noReceive',\n });\n },\n\n methods: {\n handleTap: function handleTap() {\n jumpToBusCode(this.data.cardType);\n },\n handleApply: function handleApply() {\n if (this.props.unified) {\n jumpToBusCode(this.data.cardType);\n\n return;\n }\n let url = this.data.applyUrl;\n\n if (url.indexOf('68687011') > -1) {\n // 极速开卡模式\n jumpToAlipayPage(url);\n\n return;\n }\n const query = `from=tinyapp&appId=${this.props.appId}`;\n\n if (url.indexOf('?') > -1) {\n url += `&${query}`;\n } else {\n url += `?${query}`;\n }\n\n jump(url);\n },\n },\n});\n","module/card-activate/index.json":"{\n \"component\": true\n}\n","module/cardManage/useHelp-item/index.acss":".help-item-modal {\n background-color: #fff;\n}\n.help-item-modal .item-modal {\n border-bottom: 1rpx solid #eee;\n}\n.help-item-modal .item-modal .item-left {\n float: left;\n margin-right: 16rpx;\n}\n.help-item-modal .item-modal .item-modal-content {\n display: flex;\n color: #333;\n line-height: 24rpx;\n margin: 8rpx 24rpx 32rpx 32rpx;\n font-size: 28rpx;\n line-height: 36rpx;\n}\n.help-item-modal .item-modal .item-modal-content .item-left {\n color: green;\n}\n.help-item-modal .item-modal .item-modal-content .content {\n word-break: break-all;\n}\n.help-item-modal .item-modal .item-modal-title.opened {\n color: #333;\n}\n.help-item-modal .item-modal .item-modal-title {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n margin: 0 0 0 32rpx;\n font-size: 32rpx;\n color: #666;\n padding: 16rpx 0;\n}\n.help-item-modal .item-modal .item-modal-title .title {\n font-weight: 500;\n line-height: 0.4rem;\n word-break: break-all;\n width: 85%;\n}\n.help-item-modal .item-modal .item-modal-title .info {\n margin-right: 32rpx;\n display: flex;\n flex-direction: row;\n align-items: center;\n font-size: 32rpx;\n color: #999;\n}\n.help-item-modal .item-modal .item-modal-title .info .to-right {\n transform: rotate(45deg);\n}\n.help-item-modal .item-modal .item-modal-title .info .to-bottom {\n transform: rotate(135deg);\n}\n.help-item-modal .item-modal .item-modal-title .info .icon {\n width: 18rpx;\n height: 18rpx;\n margin-left: 12rpx;\n border-top: 2rpx solid #ddd;\n border-right: 2rpx solid #ddd;\n}\n","module/cardManage/useHelp-item/index.axml":"<view class=\"help-item-modal\">\n <block a:for=\"{{helpData}}\">\n <view class=\"item-modal\">\n <view class=\"item-modal-title {{item.opened ? 'opened' : ''}}\" onTap=\"onTap\" data-index=\"{{index}}\" data-opened=\"{{item.opened}}\">\n <view class=\"item-left\">{{index+1}}. \n </view>\n <view class=\"title\"> {{item.title}} \n </view>\n <view class=\"info\">\n <view class=\"icon {{item.opened ? 'to-bottom' : 'to-right'}}\">\n </view>\n </view>\n </view>\n <view a:if=\"{{item.opened}}\" class=\"item-modal-content\">\n <view class=\"item-left\">答: \n </view>\n <view class=\"content\"> {{item.content}} \n </view>\n </view>\n </view>\n </block>\n</view>","module/cardManage/useHelp-item/index.js":"import { connect } from 'herculex';\n\nComponent(connect({\n mapStateToProps: ['helpData']\n})({\n props: {\n onTap: () => {\n }\n },\n data: {},\n methods: {\n onTap(e) {\n this.props.onTap(e);\n }\n }\n}));\n","module/cardManage/useHelp-item/index.json":"{\n \"component\": true\n}","module/rightsCard/index.acss":".rights-card-wrapper {\n margin-top: 10rpx;\n}\n.rights-cards-box {\n display: flex;\n justify-content: space-between;\n margin-bottom: 10rpx;\n background-color: #fff;\n}\n.rights-cards-box .rights-card {\n width: 50%;\n}\n","module/rightsCard/index.axml":"<view class=\"rights-card-wrapper\">\n <card-header \n title=\"乘车权益\"\n subTitle=\"全部\"\n onBtnSubTitle=\"onBtnSubTitle\"\n />\n <view class=\"rights-cards-box\">\n <block a:for=\"{{rightsCardData}}\" a:if=\"{{index<2}}\">\n <rights-card\n imgUrl=\"{{item.imgUrl}}\"\n onBtnItem=\"onBtnItem\"\n />\n </block>\n </view>\n</view>","module/rightsCard/index.js":"import { connect } from 'herculex';\n\nComponent(connect({\n mapStateToProps: []\n})({\n props: {\n onBtnSubTitle: () => {\n }\n },\n data: {},\n methods: {\n onBtnSubTitle(e) {\n this.props.onBtnSubTitle(e);\n },\n onBtnItem(e) {\n this.props.onBtnItem(e);\n }\n }\n}));\n","module/rightsCard/index.json":"{\n \"component\": true,\n \"usingComponents\": {\n \"rights-card\": \"../../components/rightsCard/index\",\n \"card-header\": \"../../components/cardHeader/index\"\n }\n}\n","module/rightsList/index.acss":".rightsbox {\n width: 100%;\n padding-top: 20rpx;\n padding-bottom: 20rpx;\n display: flex;\n justify-content: center;\n}\n.rightsbox .detailpicture {\n width: 350rpx;\n height: 200rpx;\n}\n.rightsbox .detailtxt {\n width: 350rpx;\n height: 200rpx;\n font-size: 30rpx;\n line-height: 60rpx;\n text-indent: 40rpx;\n}\n","module/rightsList/index.axml":"<block a:for=\"{{rightsCardData}}\">\n <view class=\"rightsbox\"> \n <image class=\"detailpicture\" src=\"{{item.imgUrl}}\" mode=\"scaleToFill\" />\n <view class=\"detailtxt\">{{item.title}}</view>\n </view>\n</block>\n","module/rightsList/index.js":"import { connect } from 'herculex';\n\nComponent(connect({\n mapStateToProps: []\n})({\n props: {\n },\n data: {},\n methods: {\n onBtnSubTitle(e) {\n console.log('----- 你点击了全部 -----', e);\n }\n }\n}));\n","module/rightsList/index.json":"{\n \"component\": true\n}\n","module/tab/index.acss":".tab {\n box-sizing: border-box;\n position: fixed;\n bottom: 0;\n display: flex;\n height: 100rpx;\n padding: 17rpx 0;\n width: 100%;\n justify-content: space-around;\n align-items: flex-end;\n text-align: center;\n background: #fff;\n z-index: 1050;\n background-image: linear-gradient(180deg, #e6e6e6, #e6e6e6 50%, #fff 50%);\n background-size: 100% 1px;\n background-repeat: no-repeat;\n background-position: top;\n}\n.tab-item {\n flex: 1;\n}\n.tab-item-icon {\n width: 36rpx;\n margin-bottom: 11rpx;\n}\n.tab-item-icon-HOME {\n width: 42rpx;\n}\n.tab-item-name {\n font-size: 20rpx;\n color: #999;\n}\n.tab-item-active .tab-item-name {\n color: #108EE9;\n}\n","module/tab/index.axml":"<view class=\"tab\" a:if=\"{{tabs && tabs.length > 1}}\">\n <view\n a:for=\"{{tabs}}\"\n class=\"{{'tab-item' + (item.code === activeTab ? ' tab-item-active' : '')}}\"\n data-code=\"{{item.code}}\"\n data-url=\"{{item.url}}\"\n onTap=\"handleTap\">\n <image\n class=\"{{'tab-item-icon' + ' tab-item-icon-' + item.code}}\"\n src=\"{{item.code === activeTab ? item.activeIcon : item.icon}}\"\n mode=\"widthFix\" />\n <view class=\"tab-item-name\">{{item.name}}</view>\n </view>\n</view>\n","module/tab/index.js":"import { getTabs, jump } from '../../util/bus-tinyapp';\n\n// eslint-disable-next-line no-undef\nconst app = getApp();\n\nComponent({\n data: {\n tabs: [],\n },\n props: {\n activeTab: 'HOME',\n cardType: '',\n cardInfo: {},\n inc: false,\n },\n methods: {\n handleTap: function handleTap(e) {\n const _props = this.props;\n const { activeTab } = _props;\n const { cardInfo } = _props;\n const { inc } = _props;\n const _e$target$dataset = e.target.dataset;\n const { url } = _e$target$dataset;\n const { code } = _e$target$dataset;\n\n\n if (code === activeTab || !url) return;\n\n if (activeTab === 'HOME' && cardInfo.cardModels && cardInfo.cardModels.length < 1) {\n my.alert({ content: '请先领取公交卡' });\n\n return;\n }\n\n const page = url.match(/^\\/pages\\/.*/);\n\n if (page) {\n if (app.__from === code) {\n my.navigateBack();\n } else {\n app.__from = activeTab;\n my.navigateTo({ url });\n }\n } else {\n const { cardType } = this.props;\n const cardNo = cardInfo.cardModels && cardInfo.cardModels[0] && cardInfo.cardModels[0].cardNo;\n\n jump(url, { cardType, cardNo }, inc);\n }\n },\n },\n didMount: function didMount() {\n const _this = this;\n\n getTabs(this.props.cardType).then(tabs => _this.setData({ tabs }));\n },\n});\n","module/tab/index.json":"{\n \"component\": true\n}\n","pages/announcement/announcement.acss":"","pages/announcement/announcement.axml":"<view>\n <block a:for=\"{{msgData}}\">\n <msg-card onBtnMsgCard=\"onBtnMsgCard\" title=\"{{item.title}}\" time=\"{{item.time}}\"/>\n </block>\n</view>\n<bottomline />","pages/announcement/announcement.js":"import store from './store';\n\nconst createPage = function(options) {\n return Page(store.register(options));\n};\ncreatePage({\n data: {\n },\n onLoad() {\n },\n onShow() {\n this.dispatch('getAnnouncement');\n },\n onReady() {\n },\n onBtnMsgCard(e) {\n console.log('----- 你点击了公告 -----', e);\n my.navigateTo({\n url: '/pages/richText/richText'\n });\n }\n});\n","pages/announcement/announcement.json":"{\n \"defaultTitle\": \"通知公告\",\n \"usingComponents\": {\n \"msg-card\": \"../../components/msg-card/index\",\n \"bottomline\": \"../../components/bottomline/index\"\n }\n}\n","pages/announcement/store.js":"import Store from 'herculex';\nimport getAnnouncement from '../../services/announcement';\n\nexport default new Store({\n // connectGlobal: true, // 是否关联\bglobal\n state: {\n },\n mutations: {\n },\n actions: {\n /**\n * 获取公告\n */\n async getAnnouncement({ commit, state }) {\n my.showLoading();\n const result = await getAnnouncement();\n if (result) {\n commit('ANNOUN_DATA', { msgData: result.data.msgData });\n }\n my.hideLoading();\n }\n }\n});\n","pages/cardManage/cardManage.acss":".container {\n background: #fff;\n}\n.card {\n padding: 30rpx 20rpx 10rpx 20rpx;\n}\n.card .card-img {\n width: 100%;\n}\n.list {\n width: 100%;\n}\n.list .am-list-extra {\n overflow: visible;\n}\n","pages/cardManage/cardManage.axml":"<view class=\"container\">\n <view class=\"card\">\n <image src=\"{{$global.cardInfo.styleConfig.imageUrl}}\" class=\"card-img\" mode=\"widthFix\" />\n </view>\n <list class=\"list\">\n <list-item>卡号 \n <view slot=\"extra\">{{$global.cardInfo.cardModels[0].cardNo}}\n </view>\n </list-item>\n <list-item arrow onClick=\"btnRecord\">乘车记录\n </list-item>\n <list-item arrow onClick=\"btnRoute\">公交路线\n </list-item>\n <list-item arrow onClick=\"btnUseHelp\">使用帮助\n </list-item>\n <list-item arrow onClick=\"btnCloseServer\" last>关闭服务 \n </list-item>\n </list>\n <tab a:if=\"{{$global.cardType}}\" cardType=\"{{$global.cardType}}\" activeTab=\"CARD\" cardInfo=\"{{$global.cardInfo}}\" />\n</view>","pages/cardManage/cardManage.js":"import store from './store';\n\nconst createPage = function (options) {\n return Page(store.register(options));\n};\ncreatePage({\n data: {\n },\n onShow() {\n },\n onLoad() {\n this.dispatch('$global:getCardInfo');\n },\n btnRecord() {\n this.dispatch('jumpToBusRecord');\n },\n btnRoute() {\n this.dispatch('jumpRouteQuery');\n },\n btnUseHelp() {\n my.navigateTo({\n url: '/pages/useHelper/index',\n });\n },\n btnCloseServer() {\n this.dispatch('closeServer');\n },\n});\n","pages/cardManage/cardManage.json":"{\n \"defaultTitle\": \"卡片管理\",\n \"usingComponents\": {\n \"card\":\"mini-antui/es/card/index\",\n \"list\": \"mini-antui/es/list/index\",\n \"list-item\": \"mini-antui/es/list/list-item/index\",\n \"tab\": \"../../module/tab/index\"\n }\n}","pages/cardManage/store.js":"import Store from 'herculex';\nimport mixins from '../../util/mixins';\nimport queryCard from '../../services/queryCard';\nimport refundCard from '../../services/refundCard';\nimport { cardType } from '../../util/config';\nimport { jump, jumpToBusRecord } from '../../util/bus-tinyapp';\n\nexport default new Store({\n connectGlobal: true, // 是否关联\bglobal\n state: {\n },\n actions: {\n /**\n * 关闭服务 查询卡状态\n */\n async closeServer({ dispatch, global }) {\n my.showLoading({ content: '信息查询中' });\n const result = await queryCard();\n const { success, data } = result;\n if (success) {\n // cardStatus 为mock\b演示 真实情况以每次查询为准\n const { cardStatus } = global;\n if (cardStatus && data.cardStatus && data.cardStatus === 1) {\n my.hideLoading();\n mixins.showModal('confirm', {\n title: '退卡提示',\n content: '退卡后您将不能再享受刷手机乘公交的便捷服务',\n confirmButtonText: '\b残忍退卡',\n cancelButtonText: '我再想想',\n }).then((res) => {\n const { confirm } = res;\n if (confirm) {\n dispatch('refundCard');\n }\n });\n } else {\n my.hideLoading();\n my.navigateTo({\n url: '/pages/refundCard/refundCard', // 需要跳转的应用内非 tabBar 的目标页面路径 ,路径后可以带参数。参数规则如下:路径与参数之间使用\n });\n }\n }\n },\n /**\n * 退卡\n */\n async refundCard({ dispatch }) {\n my.showLoading({ content: '退卡处理中' });\n const result = await refundCard();\n const { success, data } = result;\n if (success) {\n my.hideLoading();\n if (data) {\n // mock演示 实际不需要 以每次查询结果为准\n dispatch('$global:updateCardStatus', false);\n mixins.showModal('showToast', { content: '退卡已申请' }, () => {\n my.navigateTo({\n url: '/pages/refundCard/refundCard', // 需要跳转的应用内非 tabBar 的目标页面路径 ,路径后可以带参数。参数规则如下:路径与参数之间使用\n });\n });\n }\n }\n },\n /**\n * \b跳转乘车记录\n */\n async jumpToBusRecord({ global }) {\n const { cardInfo } = global;\n jumpToBusRecord({\n cardType,\n cardNo: cardInfo ? cardInfo.cardNo : '',\n });\n },\n /**\n * 跳转线路查询\n */\n async jumpRouteQuery({ global }) {\n const { routeQueryUrl } = global;\n routeQueryUrl && jump('http://www.taobao.com');\n },\n },\n});\n","pages/index/gridData.js":"// eslint-disable-next-line import/prefer-default-export\nexport const gridData = [{\n icon: 'http://ditie-app.oss-cn-hangzhou.aliyuncs.com/inner_upload_image_1541063313967.png',\n text: '通知公告',\n desc: '公告信息',\n url: '/pages/announcement/announcement',\n}, {\n icon: 'http://ditie-app.oss-cn-hangzhou.aliyuncs.com/inner_upload_image_1541062409663.png',\n text: '线路查询',\n desc: '线路查询',\n url: '/pages/announcement/announcement',\n}, {\n icon: 'https://gw.alipayobjects.com/zos/rmsportal/VBqNBOiGYkCjqocXjdUj.png',\n text: '可拓展',\n desc: '描述信息',\n url: '/pages/announcement/announcement',\n}, {\n icon: 'https://gw.alipayobjects.com/zos/rmsportal/VBqNBOiGYkCjqocXjdUj.png',\n text: '可拓展',\n desc: '描述信息',\n url: '/pages/announcement/announcement',\n}, {\n icon: 'https://gw.alipayobjects.com/zos/rmsportal/VBqNBOiGYkCjqocXjdUj.png',\n text: '可拓展',\n desc: '描述信息',\n url: '/pages/announcement/announcement',\n}, {\n icon: 'https://gw.alipayobjects.com/zos/rmsportal/VBqNBOiGYkCjqocXjdUj.png',\n text: '可拓展',\n desc: '描述信息',\n url: '/pages/announcement/announcement',\n}, {\n icon: 'https://gw.alipayobjects.com/zos/rmsportal/VBqNBOiGYkCjqocXjdUj.png',\n text: '可拓展',\n desc: '描述信息',\n url: '/pages/announcement/announcement',\n}, {\n icon: 'https://gw.alipayobjects.com/zos/rmsportal/VBqNBOiGYkCjqocXjdUj.png',\n text: '可拓展',\n desc: '描述信息',\n url: '/pages/announcement/announcement',\n}];\n","pages/index/index.acss":".cardinfo {\n margin: 20rpx 0;\n}\n.index-wrapper {\n display: block;\n padding-bottom: 100rpx;\n}\n","pages/index/index.axml":" \n<view class=\"index-wrapper\">\n <!-- 需要配置config的cardType 且于appid一致 真机可见 -->\n <view class=\"cardinfo\">\n <card-activate cardInfo=\"{{$global.cardInfo}}\" appId=\"{{alipayAppId}}\"/>\n </view>\n <!-- 菜单功能 -->\n <grid onGridItemClick=\"onItemClick\" columnNum=\"{{4}}\" list=\"{{gridData}}\" />\n <!-- 乘车权益 -->\n <rights-card rightsCardData=\"{{$global.rightsDatas}}\" onBtnSubTitle=\"onBtnAll\" onBtnItem=\"onBtnRightsItem\"/>\n <!-- 腰部广告 -->\n <advertising onBtnItem=\"onBtnadvertising\" advertising=\"{{advertising}}\" indicatorDots=\"true\" autoplay=\"{{true}}\" duration=\"500\" interval=\"3000\" circular=\"true\" />\n <!-- 城市资讯 --> \n <view>\n <card-header title=\"城市资讯\" subTitle=\"全部\" onBtnSubTitle=\"onBtnNewsAll\" />\n <news-card-list onBtnItem=\"onBtnNewsItem\" cardNewsData=\"{{$global.newsDatas}}\" count=\"1\"/>\n </view>\n <!-- 需要配置config的cardType 且于appid一致 真机可见 真机才可见 -->\n <tab a:if=\"{{$global.cardType}}\" cardType=\"{{$global.cardType}}\" activeTab=\"HOME\" cardInfo=\"{{$global.cardInfo}}\" />\n</view>\n","pages/index/index.js":"/* eslint-disable no-console */\nimport store from './store';\nimport {\n gridData,\n} from './gridData';\n\nconst createPage = function (options) {\n return Page(store.register(options));\n};\ncreatePage({\n data: {},\n onLoad() {},\n onShow() {\n this.dispatch('$global:getCardInfo');\n this.dispatch('getNewsList');\n this.dispatch('getAdverInfo');\n this.dispatch('getRightsInfo');\n },\n onReady() {},\n onItemClick(e) {\n console.log('----- 你点击 -----', e);\n const { index } = e.detail;\n const { url } = gridData[index];\n if (!url) {\n my.showToast({ content: '暂未开放此功能' });\n return;\n }\n my.navigateTo({ url });\n },\n onBtnAll(e) {\n console.log('----- 你点击了乘车权益的全部 -----', e);\n my.navigateTo({\n url: '/pages/rightsList/rightsList',\n });\n },\n onBtnNewsAll(e) {\n console.log('----- 你点击了城市资讯的全部 -----', e);\n my.navigateTo({\n url: '/pages/newsList/newsList',\n });\n },\n onBtnRightsItem() {\n my.navigateTo({\n url: '/pages/richText/richText',\n });\n },\n onBtnadvertising() {\n my.navigateTo({\n url: '/pages/richText/richText',\n });\n },\n onBtnNewsItem() {\n my.navigateTo({\n url: '/pages/richText/richText',\n });\n },\n});\n","pages/index/index.json":"{\n \"defaultTitle\": \"乘车权益\",\n \"usingComponents\": {\n \"grid\": \"mini-antui/es/grid/index\",\n \"rights-card\": \"../../module/rightsCard/index\",\n \"tab\": \"../../module/tab/index\",\n \"card-activate\": \"../../module/card-activate/index\",\n \"advertising\": \"../../module/advertising/index\",\n \"card-header\": \"../../components/cardHeader/index\",\n \"news-card-list\": \"../../components/news-card-list/index\"\n }\n}\n","pages/index/store.js":"import Store from 'herculex';\nimport getNewsList from '../../services/newsList';\nimport getAdverInfo from '../../services/indexAdver';\nimport getRightsInfo from '../../services/indexRights';\nimport {\n gridData,\n} from './gridData';\nimport {\n alipayAppId,\n} from '../../util/config';\n\nexport default new Store({\n connectGlobal: true, // 是否关联global\n state: {\n gridData,\n alipayAppId,\n },\n mutations: {},\n actions: {\n /**\n * 获取城市资讯\n */\n async getNewsList({\n commit,\n }) {\n const {\n success,\n data,\n } = await getNewsList();\n if (success) {\n // \b由于其他页面也有用到 所以放在了全局\n commit('$global:setNewsDatas', {\n newsDatas: data.cardNewsData,\n });\n }\n },\n /**\n * 获取腰部广告\n */\n async getAdverInfo({\n commit,\n }) {\n const {\n success,\n data,\n } = await getAdverInfo();\n if (success) {\n commit('ADVER_DATA', {\n advertising: data.advertising,\n });\n }\n },\n /**\n * 获取乘车权益\n */\n async getRightsInfo({\n commit,\n }) {\n const {\n success,\n data,\n } = await getRightsInfo();\n if (success) {\n commit('$global:setRightsCardData', {\n rightsDatas: data.rightsCardData,\n });\n }\n },\n },\n});\n","pages/newsList/newsList.acss":".news-list-warpper {\n padding: 20rpx 0;\n background-color: #fff;\n}\n","pages/newsList/newsList.axml":"<view class=\"news-list-warpper\">\n <news-card-list onBtnItem=\"onBtnNewsItem\" cardNewsData=\"{{$global.newsDatas}}\" />\n</view>","pages/newsList/newsList.js":"import store from './store';\n\nconst createPage = function (options) {\n return Page(store.register(options));\n};\ncreatePage({\n // connectGlobal: true,\n data: {\n },\n onLoad() {\n this.dispatch('getNewsList');\n },\n onShow() {\n },\n onReady() {\n },\n onBtnNewsItem() {\n my.navigateTo({\n url: '/pages/richText/richText',\n });\n },\n});\n","pages/newsList/newsList.json":"{\n \"defaultTitle\": \"资讯列表\",\n \"usingComponents\": {\n \"news-card-list\": \"../../components/news-card-list/index\"\n }\n}\n","pages/newsList/store.js":"import Store from 'herculex';\nimport getNewsList from '../../services/newsList';\n\nexport default new Store({\n connectGlobal: true, // 是否关联global\n state: {},\n mutations: {},\n actions: {\n /**\n * 获取城市资讯\n */\n async getNewsList({\n commit,\n }) {\n const {\n success,\n data,\n } = await getNewsList();\n if (success) {\n // \b由于其他页面也有用到 所以放在了全局\n commit('$global:setNewsDatas', {\n newsDatas: data.cardNewsData,\n });\n }\n },\n },\n});\n","pages/refundCard/refundCard.acss":"","pages/refundCard/refundCard.axml":"<view>\n <message \n title=\"{{title}}\" \n subTitle=\"{{subTitle}}\" \n type=\"{{type}}\" \n mainButton=\"{{messageButton.mainButton}}\" \n subButton=\"{{messageButton.subButton}}\" \n onTapMain=\"onTapMain\"\n onTapSub=\"onTapSub\">\n </message>\n</view>","pages/refundCard/refundCard.js":"import store from './store';\n\nconst createPage = function(options) {\n return Page(store.register(options));\n};\ncreatePage({\n data: {\n },\n onLoad() {\n },\n onShow() {\n },\n onReady() {\n },\n onTapMain() {\n console.log('----- 您点击了完成 -----');\n my.navigateBack({\n delta: 1\n });\n },\n onTapSub() {\n console.log('----- 您点击了撤回申请 -----');\n this.dispatch('cancelApply');\n }\n});\n","pages/refundCard/refundCard.json":"{\n \"defaultTitle\": \"退卡详情\",\n \"usingComponents\": {\n \"message\": \"mini-antui/es/message/index\"\n }\n}","pages/refundCard/store.js":"import Store from 'herculex';\nimport mixins from '../../util/mixins';\nimport cancelApply from '../../services/cancelApply';\n\nexport default new Store({\n // connectGlobal: true, // 开启监听全局store开关,是否关注全局信息\n state: {\n type: 'success',\n title: '退卡申请已提交',\n subTitle: '我们将在7个工作日审核您的申请',\n messageButton: {\n mainButton: {\n buttonText: '完成'\n },\n subButton: {\n buttonText: '撤回申请'\n }\n }\n },\n actions: {\n /**\n * 撤回申请\n */\n async cancelApply({ commit, state, dispatch }) {\n const result = await cancelApply();\n const { success, data } = result;\n if (success) {\n data && mixins.showModal('alert', { title: '信息', content: '您已\b成功取消退卡申请', buttonText: '我知道了' }, () => {\n // mock演示 实际不需要 以每次查询结果为准\n dispatch('$global:updateCardStatus', true);\n my.navigateBack({\n delta: 1\n });\n });\n }\n }\n }\n});\n","pages/richText/richText.acss":"","pages/richText/richText.axml":"<view>\n <rich-text nodes=\"{{nodes}}\" onTap=\"tap\"></rich-text>\n</view>","pages/richText/richText.js":"import store from './store';\n\nconst createPage = function (options) {\n return Page(store.register(options));\n};\ncreatePage({\n // connectGlobal: true,\n data: {\n },\n onLoad() {\n },\n onShow() {\n this.dispatch('queryDetail');\n },\n onReady() {\n },\n});\n","pages/richText/richText.json":"{\n \"defaultTitle\": \"文章详情\"\n}\n","pages/richText/store.js":"import Store from 'herculex';\nimport parse from 'mini-html-parser2';\nimport queryDetail from '../../services/queryDetail';\n\nexport default new Store({\n // connectGlobal: true, // 是否关联global\n state: {},\n actions: {\n /**\n * 获取文章html\n */\n async queryDetail({\n commit,\n }) {\n const {\n success,\n data,\n } = await queryDetail();\n if (success) {\n data.articleContent && parse(data.articleContent, (err, nodes) => {\n if (!err) {\n commit('SET_ARTICLE_DETAIL', { nodes });\n }\n });\n }\n },\n },\n});\n","pages/rightsList/rightsList.acss":"","pages/rightsList/rightsList.axml":"<view class=\"box\">\n <rights-list onBtnItem=\"onBtnRightsItem\" rightsCardData=\"{{$global.rightsDatas}}\" />\n <bottomline />\n</view>","pages/rightsList/rightsList.js":"import store from './store';\n\nconst createPage = function (options) {\n return Page(store.register(options));\n};\ncreatePage({\n data: {\n },\n onLoad() {\n this.dispatch('getRightsInfo');\n },\n onShow() {\n },\n onReady() {\n },\n onBtnRightsItem() {\n my.navigateTo({\n url: '/pages/richText/richText',\n });\n },\n});\n","pages/rightsList/rightsList.json":"{\n \"defaultTitle\": \"权益列表\",\n \"usingComponents\":{\n \"rights-list\": \"../../module/rightsList/index\",\n \"bottomline\": \"../../components/bottomline/index\"\n }\n}","pages/rightsList/store.js":"import Store from 'herculex';\nimport getRightsInfo from '../../services/indexRights';\n\nexport default new Store({\n connectGlobal: true, // 是否关联global\n state: {},\n mutations: {},\n actions: {\n /**\n * 获取乘车权益\n */\n async getRightsInfo({\n commit,\n }) {\n const {\n success,\n data,\n } = await getRightsInfo();\n if (success) {\n commit('$global:setRightsCardData', {\n rightsDatas: data.rightsCardData,\n });\n }\n },\n },\n});\n","pages/useHelper/index.acss":"","pages/useHelper/index.axml":"<usehelp-item helpData=\"{{helpData}}\" onTap=\"btnItem\"/>","pages/useHelper/index.js":"import store from './store';\n\nconst createPage = function (options) {\n return Page(store.register(options));\n};\ncreatePage({\n // connectGlobal: true,\n data: {\n },\n onShow() {\n this.dispatch('getUseHelpInfo');\n },\n btnItem(e) {\n const { index, opened } = e.target.dataset;\n this.commit('UPDATE_HELP_DATA', { index, opened: !opened });\n },\n});\n","pages/useHelper/index.json":"{\n \"defaultTitle\": \"使用帮助\",\n \"usingComponents\": {\n \"usehelp-item\":\"../../module/cardManage/useHelp-item/index\"\n }\n}\n","pages/useHelper/store.js":"import Store from 'herculex';\nimport getUseHelpInfo from '../../services/getHelpInfo';\n\nexport default new Store({\n // connectGlobal: true, // 是否关联global\n state: {\n helpData: null\n },\n mutations: {\n /**\n * 变更打开状态\n */\n UPDATE_HELP_DATA(state, {\n index,\n opened\n }) {\n state.helpData.forEach((item, i) => {\n if (index === i) {\n item.opened = opened;\n } else {\n item.opened = false;\n }\n });\n }\n },\n actions: {\n /**\n * 获取帮助信息\n */\n async getUseHelpInfo({\n commit,\n state\n }) {\n my.showLoading();\n const {\n data\n } = await getUseHelpInfo();\n if (data) {\n commit('HELP_DATA', {\n helpData: data.MODE\n });\n }\n my.hideLoading();\n }\n }\n});\n","services/announcement.js":"import { request } from '../util/request';\nimport minxins from '../util/mixins';\n\n// \b接口请求地址\nconst path = '';\n// 数据mock\nconst singleMock = true;\n\n/**\n * 通知公告\n * @param {*} params\n */\nexport default async function getAnnouncement(data = {}) {\n if (!singleMock) {\n const originData = await request(path, {\n method: 'post',\n data\n });\n // 数据处理\n // 如果接口错误,直接把错误返回,如果接口正常,则把数据中的data返回\n console.log('----- service getAnnouncement originData -----', originData);\n if (!originData.API_ERROR && originData.success && originData.data) {\n return {\n success: true,\n data: originData.data\n };\n }\n my.hideLoading();\n minxins.showModal('showToast', { type: 'fail', title: '温馨提示', content: originData.errorMsg ? originData.errorMsg : '接口请求出错!' });\n return { success: false };\n }\n\n // mock数据\n return new Promise((resolve, reject) => {\n const mockData = {\n data: {\n msgData: [\n {\n title: '10月26日起石家庄市公交87路线',\n time: '2018-11-05 05:13:33'\n },\n {\n title: '10月26日起石家庄市公交97路线',\n time: '2018-11-08 05:13:33'\n },\n {\n title: '10月26日起石家庄市公交887路线',\n time: '2018-11-10 08:13:33'\n }\n ]\n },\n success: true,\n errorMsg: 'mock出错'\n };\n setTimeout(() => {\n resolve(mockData);\n }, 500);\n });\n}\n","services/cancelApply.js":"import { request } from '../util/request';\nimport minxins from '../util/mixins';\n\n// \b接口请求地址\nconst path = '';\n// 数据mock\nconst singleMock = true;\n\nexport default async function cancelApply(data = {}) {\n if (!singleMock) {\n const originData = await request(path, {\n method: 'post',\n data\n });\n // 数据处理\n // 如果接口错误,直接把错误返回,如果接口正常,则把数据中的data返回\n console.log('----- service cancelApply originData -----', originData);\n if (!originData.API_ERROR && originData.success && originData.data) {\n return {\n success: true,\n data: originData.data\n };\n }\n my.hideLoading();\n minxins.showModal('showToast', { type: 'fail', title: '温馨提示', content: originData.errorMsg ? originData.errorMsg : '接口请求出错!' });\n return { success: false };\n }\n\n // mock数据\n return new Promise((resolve, reject) => {\n const mockData = {\n data: true,\n success: true,\n errorMsg: 'mock请求出错'\n };\n setTimeout(() => {\n resolve(mockData);\n }, 500);\n });\n}\n","services/getHelpInfo.js":"import { request } from '../util/request';\nimport minxins from '../util/mixins';\n\n// \b接口请求地址\nconst path = '';\n// 数据mock\nconst singleMock = true;\n\nexport default async function getHelpInfo(data = {}) {\n if (!singleMock) {\n const originData = await request(path, {\n method: 'post',\n data,\n });\n // 数据处理\n // 如果接口错误,直接把错误返回,如果接口正常,则把数据中的data返回\n if (!originData.API_ERROR && originData.success && originData.data) {\n return {\n success: true,\n data: originData.data,\n };\n }\n my.hideLoading();\n minxins.showModal('showToast', { type: 'fail', title: '温馨提示', content: originData.errorMsg ? originData.errorMsg : '接口请求出错!' });\n return { success: false };\n }\n\n // mock数据\n return new Promise((resolve) => {\n const mockData = {\n data: {\n MODE: [{\n title: '这里是问题一',\n content: '内容',\n }, {\n title: '这里是问题二',\n content: '内容',\n }, {\n title: '这里是问题三',\n content: '内容',\n }, {\n title: '这里是问题四',\n content: '内容',\n }],\n },\n success: true,\n errorMsg: 'mock出错',\n };\n setTimeout(() => {\n resolve(mockData);\n }, 500);\n });\n}\n","services/indexAdver.js":"import { request } from '../util/request';\nimport minxins from '../util/mixins';\n\n// \b接口请求地址\nconst path = '';\n// 数据mock\nconst singleMock = true;\n\n/**\n * 首页轮播图\n * @param {*} params\n */\nexport default async function getAdverInfo(data = {}) {\n if (!singleMock) {\n const originData = await request(path, {\n method: 'post',\n data,\n });\n // 数据处理\n // 如果接口错误,直接把错误返回,如果接口正常,则把数据中的data返回\n if (!originData.API_ERROR && originData.success && originData.data) {\n return {\n success: true,\n data: originData.data,\n };\n }\n my.hideLoading();\n minxins.showModal('showToast', { type: 'fail', title: '温馨提示', content: originData.errorMsg ? originData.errorMsg : '接口请求出错!' });\n return { success: false };\n }\n\n // mock数据\n return new Promise((resolve) => {\n const mockData = {\n data: {\n advertising: [\n {\n imgUrl: 'http://ditie-app.oss-cn-hangzhou.aliyuncs.com/inner_upload_image_1541070434180.png',\n id: '1',\n },\n {\n imgUrl: 'http://ditie-app.oss-cn-hangzhou.aliyuncs.com/inner_upload_image_1541070434180.png',\n id: '2',\n },\n ],\n },\n success: true,\n errorMsg: 'mock出错',\n };\n setTimeout(() => {\n resolve(mockData);\n }, 500);\n });\n}\n","services/indexCard.js":"import { request } from '../util/request';\nimport minxins from '../util/mixins';\n\n// 接口请求地址\nconst path = '';\n// 数据mock\nconst singleMock = true;\n\nexport default async function getCardInfo(data = {}) {\n if (!singleMock) {\n // 真实请求\n const originData = await request(path, {\n method: 'post',\n data\n });\n // 数据处理\n // 如果接口错误,直接把错误返回,如果接口正常,则把数据中的data返回\n console.log('----- service getCardInfo originData -----', originData);\n if (!originData.API_ERROR && originData.success && originData.data) {\n return {\n success: true,\n data: originData.data\n };\n }\n my.hideLoading();\n minxins.showModal('showToast', { type: 'fail', title: '温馨提示', content: originData.errorMsg ? originData.errorMsg : '接口请求出错!' });\n return { success: false };\n }\n\n // mock数据\n return new Promise((resolve, reject) => {\n const mockData = {\n data: {\n cardNewsData: [\n {\n title: 'skjfalsdfjasd',\n time: '2019-11-99 12:33:11',\n bannerUrl: 'http://ditie-app.oss-cn-hangzhou.aliyuncs.com/inner_upload_image_1541390001907.jpg'\n },\n {\n title: 'skjfalsdfjasd',\n time: '2019-11-05 12:33:33',\n bannerUrl: 'http://ditie-app.oss-cn-hangzhou.aliyuncs.com/inner_upload_image_1541390001907.jpg'\n }\n ]\n },\n success: true,\n errorMsg: 'mock出错'\n };\n setTimeout(() => {\n resolve(mockData);\n }, 500);\n });\n};\n","services/indexRights.js":"import { request } from '../util/request';\nimport minxins from '../util/mixins';\n\n// 接口请求地址\nconst path = '';\n// 数据mock\nconst singleMock = true;\n\n/**\n * 乘车权益\n * @param {*} params\n */\nexport default async function getRightsInfo(data = {}) {\n if (!singleMock) {\n // 真实请求\n const originData = await request(path, {\n method: 'post',\n data,\n });\n // 数据处理\n // 如果接口错误,直接把错误返回,如果接口正常,则把数据中的data返回\n if (!originData.API_ERROR && originData.success && originData.data) {\n return {\n success: true,\n data: originData.data,\n };\n }\n my.hideLoading();\n minxins.showModal('showToast', { type: 'fail', title: '温馨提示', content: originData.errorMsg ? originData.errorMsg : '接口请求出错!' });\n return { success: false };\n }\n\n // mock数据\n return new Promise((resolve) => {\n const mockData = {\n data: {\n rightsCardData: [\n {\n imgUrl: 'http://ditie-app.oss-cn-hangzhou.aliyuncs.com/inner_upload_image_1541071016840.png',\n title: '乘公交',\n description: '得80g绿色能量',\n },\n {\n imgUrl: 'http://ditie-app.oss-cn-hangzhou.aliyuncs.com/inner_upload_image_1541070487119.png',\n title: '乘车权益卡',\n description: '五折优惠',\n },\n {\n imgUrl: 'http://ditie-app.oss-cn-hangzhou.aliyuncs.com/inner_upload_image_1541070487119.png',\n title: '乘车权益卡',\n description: '得80g绿色能量',\n },\n {\n imgUrl: 'http://ditie-app.oss-cn-hangzhou.aliyuncs.com/inner_upload_image_1541070487119.png',\n title: '乘车权益卡',\n description: '得80g绿色能量',\n },\n ],\n },\n success: true,\n errorMsg: 'mock出错',\n };\n setTimeout(() => {\n resolve(mockData);\n }, 500);\n });\n}\n","services/newsList.js":"/* eslint-disable no-console */\nimport { request } from '../util/request';\nimport minxins from '../util/mixins';\n\n// \b接口请求地址\nconst path = '';\n// 数据mock\nconst singleMock = true;\n\n/**\n * 城市资讯\n * @param {*} params\n */\nexport default async function getnewsList(data = {}) {\n if (!singleMock) {\n // 真实请求\n const originData = await request(path, {\n method: 'post',\n data,\n });\n if (!originData.API_ERROR && originData.success && originData.data) {\n return {\n success: true,\n data: originData.data,\n };\n }\n my.hideLoading();\n minxins.showModal('showToast', { type: 'fail', title: '温馨提示', content: originData.errorMsg ? originData.errorMsg : '接口请求出错!' });\n return { success: false };\n }\n\n // mock数据\n return new Promise((resolve) => {\n const mockData = {\n data: {\n cardNewsData: [\n {\n title: 'skjfalsdfjasd',\n time: '2019-11-05 12:33:22',\n bannerUrl: 'http://ditie-app.oss-cn-hangzhou.aliyuncs.com/inner_upload_image_1541390001907.jpg',\n },\n {\n title: 'skjfalsdfjasd',\n time: '2019-11-05 12:33:11',\n bannerUrl: 'http://ditie-app.oss-cn-hangzhou.aliyuncs.com/inner_upload_image_1541390001907.jpg',\n },\n ],\n advertising: [\n {\n imgUrl: 'http://ditie-app.oss-cn-hangzhou.aliyuncs.com/inner_upload_image_1541070434180.png',\n id: '1',\n },\n {\n imgUrl: 'http://ditie-app.oss-cn-hangzhou.aliyuncs.com/inner_upload_image_1541070434180.png',\n id: '2',\n },\n ],\n rightsCardData: [\n {\n imgUrl: 'http://ditie-app.oss-cn-hangzhou.aliyuncs.com/inner_upload_image_1541071016840.png',\n title: '乘公交',\n description: '得80g绿色能量',\n },\n {\n imgUrl: 'http://ditie-app.oss-cn-hangzhou.aliyuncs.com/inner_upload_image_1541070487119.png',\n title: '乘车权益卡',\n description: '五折优惠',\n },\n {\n imgUrl: 'http://ditie-app.oss-cn-hangzhou.aliyuncs.com/inner_upload_image_1541070487119.png',\n title: '乘车权益卡',\n description: '得80g绿色能量',\n },\n {\n imgUrl: 'http://ditie-app.oss-cn-hangzhou.aliyuncs.com/inner_upload_image_1541070487119.png',\n title: '乘车权益卡',\n description: '得80g绿色能量',\n },\n ],\n },\n success: true,\n errorMsg: 'mock出错',\n };\n setTimeout(() => {\n resolve(mockData);\n }, 500);\n });\n}\n","services/queryCard.js":"import { request } from '../util/request';\nimport minxins from '../util/mixins';\n\n// \b接口请求地址\nconst path = '';\n// 数据mock\nconst singleMock = true;\n\nexport default async function queryCard(data = {}) {\n if (!singleMock) {\n const originData = await request(path, {\n method: 'post',\n data\n });\n // 数据处理\n // 如果接口错误,直接把错误返回,如果接口正常,则把数据中的data返回\n console.log('----- service queryCard originData -----', originData);\n if (!originData.API_ERROR && originData.success && originData.data) {\n return {\n success: true,\n data: originData.data\n };\n }\n my.hideLoading();\n minxins.showModal('showToast', { type: 'fail', title: '温馨提示', content: originData.errorMsg ? originData.errorMsg : '接口请求出错!' });\n return { success: false };\n }\n\n // mock数据\n return new Promise((resolve, reject) => {\n const mockData = {\n data: {\n cardStatus: 1\n },\n success: true,\n errorMsg: 'mock请求出错'\n };\n setTimeout(() => {\n resolve(mockData);\n }, 500);\n });\n}\n","services/queryDetail.js":"import { request } from '../util/request';\nimport minxins from '../util/mixins';\n\n// \b接口请求地址\nconst path = '';\n// 数据mock\nconst singleMock = true;\n\nexport default async function queryDetail(data = {}) {\n if (!singleMock) {\n const originData = await request(path, {\n method: 'post',\n data,\n });\n // 数据处理\n // 如果接口错误,直接把错误返回,如果接口正常,则把数据中的data返回\n if (!originData.API_ERROR && originData.success && originData.data) {\n return {\n success: true,\n data: originData.data,\n };\n }\n my.hideLoading();\n minxins.showModal('showToast', { type: 'fail', title: '温馨提示', content: originData.errorMsg ? originData.errorMsg : '接口请求出错!' });\n return { success: false };\n }\n\n // mock数据\n return new Promise((resolve) => {\n const mockData = {\n data: {\n articleContent: '<h3 class=\"ql-align-center\">倡导绿色出行,为大气环境减负</h3><p class=\"ql-align-justify\">11月3日,公交325路车队党员志愿者在石家庄理工职业学院设置服务点宣传绿色出行,为在校大学生发放《乘车指南》和智能公交宣传页。“汽车尾气排放是大气主要污染源之一,我们现在的公交车大部分都是电动的,大家出门少开一次车,少打一次车,尽量选择公交绿色出行,我们就能多一些蓝天白云。”石家庄市公交325路车队志愿者付艳丽热心的向大家宣传。</p><p class=\"ql-align-center\"><img src=\"http://ditie-app.oss-cn-hangzhou.aliyuncs.com/inner_upload_image_1541389769927.jpg\" /><span style=\"color: rgb(0, 0, 0); background-color: transparent;\">公交志愿者宣传绿色出行。公交325路车队供图</span></p><p class=\"ql-align-center\"><br></p><p class=\"ql-align-justify\">恰逢周末,人员出行密集,公交325路车队和理工职业学院的青年志愿者手拉宣传条幅,组成候车通道引导乘客排队上车。在宣传“文明乘车,绿色出行,从我做起”的同时,还向乘客们发放《乘车指南》和《掌上公交》宣传页,大力宣传公交出行的绿色、便捷,呼吁大家共同为城市大气环境改善,贡献自己的一份力量。</p><p class=\"ql-align-justify\"><br></p>',\n title: 'mock文章',\n createTime: '2018-11-05 05:26:29',\n },\n success: true,\n errorMsg: 'mock出错',\n };\n setTimeout(() => {\n resolve(mockData);\n }, 500);\n });\n}\n","services/refundCard.js":"import { request } from '../util/request';\nimport minxins from '../util/mixins';\n\n// \b接口请求地址\nconst path = '';\n// 数据mock\nconst singleMock = true;\n\nexport default async function refundCard(data = {}) {\n if (!singleMock) {\n const originData = await request(path, {\n method: 'post',\n data\n });\n // 数据处理\n // 如果接口错误,直接把错误返回,如果接口正常,则把数据中的data返回\n console.log('----- service refundCard originData -----', originData);\n if (!originData.API_ERROR && originData.success && originData.data) {\n return {\n success: true,\n data: originData.data\n };\n }\n my.hideLoading();\n minxins.showModal('showToast', { type: 'fail', title: '温馨提示', content: originData.errorMsg ? originData.errorMsg : '接口请求出错!' });\n return { success: false };\n }\n\n // mock数据\n return new Promise((resolve, reject) => {\n const mockData = {\n data: true,\n success: true,\n errorMsg: 'mock请求出错'\n };\n setTimeout(() => {\n resolve(mockData);\n }, 500);\n });\n}\n","services/rightsList.js":"import { request } from '../util/request';\nimport minxins from '../util/mixins';\n\n// \b接口请求地址\nconst path = '';\n// 数据mock\nconst singleMock = true;\n\nexport default async function getRightsList(data = {}) {\n if (!singleMock) {\n const originData = await request(path, {\n method: 'post',\n data\n });\n // 数据处理\n // 如果接口错误,直接把错误返回,如果接口正常,则把数据中的data返回\n console.log('----- service getRightsList originData -----', originData);\n if (!originData.API_ERROR && originData.success && originData.data) {\n return {\n success: true,\n data: originData.data\n };\n }\n my.hideLoading();\n minxins.showModal('showToast', { type: 'fail', title: '温馨提示', content: originData.errorMsg ? originData.errorMsg : '接口请求出错!' });\n return { success: false };\n }\n\n // mock数据\n return new Promise((resolve, reject) => {\n const mockData = {\n data: {\n rightsCardData: [\n {\n imgUrl: 'http://ditie-app.oss-cn-hangzhou.aliyuncs.com/inner_upload_image_1541071016840.png',\n title: '乘公交',\n description: '得80g绿色能量'\n },\n {\n imgUrl: 'http://ditie-app.oss-cn-hangzhou.aliyuncs.com/inner_upload_image_1541070487119.png',\n title: '乘车权益卡',\n description: '五折优惠'\n },\n {\n imgUrl: 'http://ditie-app.oss-cn-hangzhou.aliyuncs.com/inner_upload_image_1541070487119.png',\n title: '乘车权益卡',\n description: '得80g绿色能量'\n },\n {\n imgUrl: 'http://ditie-app.oss-cn-hangzhou.aliyuncs.com/inner_upload_image_1541070487119.png',\n title: '乘车权益卡',\n description: '得80g绿色能量'\n }\n ]\n },\n success: true,\n errorMsg: 'mock出错'\n };\n setTimeout(() => {\n resolve(mockData);\n }, 500);\n });\n};\n","util/auth.js":"/**\n * 静默授权[auth_base] -> 用来判断是否是第一次登录\n * 主动授权['auth_user', 'auth_industry'] -> 用来授权,以及获取用户信息\n*/\n\n/**\n * jsapi无响应检测\n * */\nfunction loopCheckTimeout() {\n let count = 0;\n let timer = null;\n return function (reject) {\n timer = setInterval(() => {\n if (count === 5) {\n clearInterval(timer);\n count = 0;\n reject('timeout');\n }\n count++;\n }, 1000);\n };\n}\n\n/**\n * 主动授权\b获取用户头像和昵称\n * */\nexport function getAuthUserInfo() {\n return new Promise((resolve, reject) => {\n try {\n my.getAuthCode({\n scopes: ['auth_user'],\n success: (res) => {\n my.getAuthUserInfo({\n success: (userInfo) => {\n resolve(userInfo);\n },\n fail: (err) => {\n return reject(err);\n }\n });\n },\n fail: (res) => {\n return reject(res);\n // my.alert({\n // title: '授权失败,请稍后再试',\n // complete: () => reject(res)\n // })\n }\n });\n } catch (e) {\n reject(e);\n }\n });\n}\n\n/**\n * 静默授权\n * */\nexport function silenceAuthCode() {\n return new Promise((resolve, reject) => {\n loopCheckTimeout()(reject);\n try {\n my.getAuthCode({\n scopes: 'auth_base',\n success: (res) => {\n resolve(res);\n },\n fail: (res) => {\n my.alert({\n title: '授权失败,请稍后再试',\n complete: () => reject(res)\n });\n }\n });\n } catch (e) {\n reject(e);\n }\n });\n}\n","util/bus-tinyapp.js":"\nconst _slicedToArray = (function () { function sliceIterator(arr, i) { const _arr = []; let _n = true; let _d = false; let _e; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i.return) _i.return(); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; }());\n\n// import { mockCards, mockTabs } from '../../mock';\n\nconst rpc = function rpc(type, params) {\n return new Promise(((resolve, reject) => {\n my.call('buscode_query_data_for_applet', {\n bizType: type,\n bizParam: JSON.stringify(params),\n }, (res) => {\n if (res.success) {\n return resolve(JSON.parse(res.data));\n }\n\n reject();\n });\n }));\n};\n\nconst qsParse = function qsParse(qs) {\n if (!qs) return {};\n const res = {};\n\n qs.split('&').forEach((item) => {\n const _item$split = item.split('=');\n const _item$split2 = _slicedToArray(_item$split, 2);\n const k = _item$split2[0];\n const v = _item$split2[1];\n\n res[k] = v;\n });\n\n return res;\n};\n\nexport function getTabs(cardType) {\n // return mockTabs();\n return rpc('QUERY_APPLET_FUNCTION_LIST', { cardType });\n}\n\nexport function getCardInfo(cardType) {\n // return mockCards();\n return rpc('QUERY_CARD_DETAIL', { cardType });\n}\n\nexport function jumpToBusCode(cardType) {\n my.ap.navigateToAlipayPage({\n path: `alipays://platformapi/startapp?appId=200011235&source=applet&cardType=${cardType}`,\n });\n}\n\nexport function jumpToBusRecord(_ref) {\n const { cardType } = _ref;\n const { cardNo } = _ref;\n my.ap.navigateToAlipayPage({\n path: `alipays://platformapi/startapp?appId=20000076&returnHome=NO&bizSubType=75&showSearch=false&title=%E4%B9%98%E8%BD%A6%E8%AE%B0%E5%BD%95&cardType=${cardType}&cardNo=${cardNo}`,\n });\n}\n\nexport function jumpToAlipayPage(path) {\n my.ap.navigateToAlipayPage({\n path,\n });\n}\n\nexport function jump(url) {\n // eslint-disable-next-line prefer-rest-params\n const _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n const _ref2$cardType = _ref2.cardType;\n const cardType = _ref2$cardType === undefined ? '' : _ref2$cardType;\n const _ref2$cardNo = _ref2.cardNo;\n const cardNo = _ref2$cardNo === undefined ? '' : _ref2$cardNo;\n\n // eslint-disable-next-line prefer-rest-params\n const inc = arguments[2];\n\n const target = url.replace('{cardType}', cardType).replace('{cardNo}', cardNo);\n const res = target.match(/^alipays:\\/\\/platformapi\\/startapp\\?appId=(\\d+)&?(.*)$/);\n\n if (res) {\n // 有appId只能跳转至小程序\n if (res[1].length > 8) {\n // 开放平台\n if (inc) {\n my.call('startApp', {\n appId: res[1],\n param: {\n page: decodeURIComponent(qsParse(res[2]).page),\n query: decodeURIComponent(qsParse(res[2]).query),\n },\n });\n } else {\n my.navigateToMiniProgram({\n appId: res[1],\n path: decodeURIComponent(qsParse(res[2]).page),\n extraData: qsParse(decodeURIComponent(qsParse(res[2]).query)), // query=key%3Dvalue => {key: value}\n });\n }\n } else {\n jumpToAlipayPage(target);\n }\n } else {\n my.call('startApp', {\n appId: '20000067',\n param: { url: target },\n closeCurrentApp: false,\n });\n }\n}\n","util/config.js":"// 小程序appid\nexport const alipayAppId = '';\n\n// 公交卡\nexport const cardType = 'TEST0001';\n\n// 扩展\nexport const sessionIdName = 'sessionid';\n","util/dateshow.js":"let methods = {\n // \"test\":(value)=>{\n // my.alert({\n // title: value\n // });\n // },\n date: value => {\n return (\n value.slice(0, 4) +\n '年' +\n value.slice(4, 6) +\n '月' +\n value.slice(6) +\n '\b日'\n );\n },\n time: value => {\n return value.slice(0, 2) + ':' + value.slice(2, 4);\n },\n nohourdiff: (start, end) => {\n return ((end - start) % 100) + '分钟';\n }\n};\nexport default methods;\n","util/env.js":"import { appKey } from './config';\nconst devDomain = '';\nconst cardManageDomain = '';\nconst DefaultDomain = 'https://cbp.alipay-eco.com';\n\nexport default function getDomain(urlType) {\n let domain = devDomain;\n // domain = 'http://10.85.1.150:3000'\n // const env = (process.env.NODE_ENV ? 'dev' : '') || window.env || 'prod';\n let env = 'dev';\n switch (env) {\n case 'dev':\n if (urlType === 'default') {\n domain = devDomain;\n } else if (urlType === 'cardManageDomain') {\n domain = cardManageDomain;\n if (appKey) {\n domain = domain + '/h5-card/' + appKey;\n }\n }\n break;\n case 'prod':\n default:\n domain = DefaultDomain;\n break;\n }\n return domain;\n}\n","util/mixins.js":"const fn = function() {};\n\nexport default {\n /**\n * 获取周几\n * @param data\n * @returns Obeject\n */\n getWeek(data) {\n let weeks = '';\n const week = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];\n if (new Date().getTime() - new Date(data).getTime() > 0) {\n weeks = '今天';\n } else if (new Date().getTime() + 86400000 - new Date(data).getTime() > 0) {\n weeks = '明天';\n } else if (\n new Date().getTime() + 86400000 * 2 - new Date(data).getTime() >\n 0\n ) {\n weeks = '后天';\n } else {\n weeks = week[new Date(data).getDay()];\n }\n console.log(weeks, data);\n return weeks;\n },\n /**\n * 时间处理\n * @param data\n * @returns Obeject\n */\n computingTime(atime, ls) {\n let al = Number(atime.substring(0, 2));\n\n let ar = Number(atime.substring(2, atime.length));\n let ll = Number(ls.substring(0, 2));\n let lr = Number(ls.substring(3, ls.length));\n let bl = 0;\n let br = 0;\n let timeAdd = Math.floor(ll / 24);\n if (ll % 24 < al) {\n if (ar >= lr) {\n bl = al + timeAdd * 24 - ll;\n br = ar - lr;\n }\n if (ar < lr) {\n bl = al + timeAdd * 24 - 1 - ll;\n br = ar + 60 - lr;\n }\n }\n if (ll % 24 > al) {\n if (ar >= lr) {\n bl = al + (timeAdd + 1) * 24 - ll;\n br = ar - lr;\n }\n if (ar < lr) {\n bl = al + (timeAdd + 1) * 24 - 1 - ll;\n br = ar + 60 - lr;\n }\n timeAdd = timeAdd + 1;\n }\n if (ll % 24 === al) {\n if (ar >= lr) {\n bl = al + timeAdd * 24 - ll;\n br = ar - lr;\n }\n if (ar < lr) {\n bl = al + (timeAdd + 1) * 24 - 1 - ll;\n br = ar + 60 - lr;\n timeAdd = timeAdd + 1;\n }\n }\n bl = bl < 10 ? '0' + bl : bl;\n br = br < 10 ? '0' + br : br;\n ll = ll < 10 ? '0' + ll : ll;\n lr = lr < 10 ? '0' + lr : lr;\n al = al < 10 ? '0' + al : al;\n ar = ar < 10 ? '0' + ar : ar;\n const newBtime = bl + ':' + br;\n const newAtime = al + ':' + ar;\n const newls = ll + '时' + lr + '分';\n return { newAtime, newBtime, timeAdd, newls };\n },\n timeDividingLine(time, num) {\n let al = Number(time.substring(0, num));\n let ar = Number(time.substring(num, time.length));\n al = al < 10 ? '0' + al : al;\n ar = ar < 10 ? '0' + ar : ar;\n const newTime = al + ':' + ar;\n return newTime;\n },\n /**\n * 验证身份证合法\n * @param certId String\n * @returns Boolean\n */\n verifiyIdCard(certId) {\n return /(^\\d{15}$)|(^\\d{18}$)|(^\\d{17}(\\d|X|x)$)/gim.test(certId.trim());\n },\n /**\n * 验证手机号码是否合法\n * @param number\n * @returns {boolean}\n */\n verifyTel(number) {\n return /^1[\\d]{10}/gim.test(number.trim());\n },\n /**\n * 验证邮箱是否合法\n * @param email\n * @returns {boolean}\n */\n verifyEmail(email) {\n return /^([A-Za-z0-9_\\-.])+@[A-Za-z0-9_\\-.]+\\.[A-Za-z]{2,4}$/gim.test(\n email.trim()\n );\n },\n /**\n * 验证新密码格式是否正确\n * 必须且只能包含大写字母,小写字母,数字,下划线中的两种或两种以上\n * @param pwd\n * @returns {boolean}\n */\n verifyPwd(pwd) {\n return /(?!^\\d+$)(?!^[A-Z]+$)(?!^[a-z]+$)(?!^_+$)^\\w{6,20}$/gm.test(pwd);\n // return /^[A-Za-z].*[0-9]|[0-9].*[A-Za-z]/gim.test(pwd.trim());\n },\n /**\n * 弹框提示\n * @param moldalType\n * @param params\n * @param callback\n */\n showModal(moldalType = 'alert', params = {}, callback = fn) {\n const {\n title = '提示',\n content = '操作成功',\n buttonText = '确定',\n confirmButtonText = '确定',\n cancelButtonText = '取消',\n duration = 2000,\n type = 'success',\n delay = 0\n } = params;\n switch (moldalType) {\n case 'alert':\n my.alert({ title, content, buttonText, complete: callback });\n break;\n case 'showToast':\n my.showToast({ content, duration, type, complete: callback });\n break;\n case 'hideToast':\n my.hideToast();\n break;\n case 'showLoading':\n my.showLoading({ content, delay });\n break;\n case 'hideLoading':\n my.hideLoading();\n break;\n case 'confirm':\n return new Promise((resolve, reject) => {\n my.confirm({\n title,\n content,\n confirmButtonText,\n cancelButtonText,\n success: result => {\n resolve(result);\n },\n fail: err => {\n reject(err);\n }\n });\n });\n default:\n break;\n }\n },\n methods: {\n /**\n * 创建动画\n * @param animateConfig Object\n */\n createAnimationHandle(animateConfig = {}) {\n return my.createAnimation(\n Object.assign(\n {\n duration: 400,\n timeFunction: 'ease-in-out'\n },\n animateConfig\n )\n );\n }\n },\n /**\n * 设置缓存\n */\n async setStorage({ key = '', data = {}, success = fn, fail = fn }) {\n try {\n let status = 'success';\n await my.setStorage({\n key,\n data,\n success: function(res) {\n status = 'success';\n success(res);\n },\n fail: function(err) {\n status = 'fail';\n fail(err);\n }\n });\n return status;\n } catch (error) {\n fail(error);\n return 'fail';\n }\n },\n /**\n * 读取缓存\n */\n async getStorage({ key = '', success = fn, fail = fn }) {\n try {\n let data = null;\n await my.getStorage({\n key,\n success: function(res) {\n success(res);\n data = res.data;\n },\n fail: function(res) {\n fail(res);\n // return res;\n }\n });\n return data;\n } catch (error) {\n fail(error);\n return null;\n }\n }\n};\n","util/request.js":"import TinyAppHttp from './TinyAppHttp';\nimport getDomain from './env';\n\nlet tinyAppHttp = new TinyAppHttp({\n // bizCode\n});\n// 增加format response data的拦截器\ntinyAppHttp.interceptors.response.use(\n response => {\n // my.request 走success\n if (response) {\n // console.info('%c response data的拦截器', 'color: #FFa940; font-weight: bold', response);\n const { data, headers, status } = response;\n my.hideLoading();\n if (status === 200) {\n return response.data;\n } else {\n Promise.reject(status);\n }\n }\n Promise.reject(response);\n },\n error => {\n // my.request 走fail了\n my.hideLoading();\n console.log(error);\n return Promise.reject(error);\n }\n);\n// 增加format request config的拦截器\ntinyAppHttp.interceptors.request.use(\n config => {\n // console.info('%c request config的拦截器', 'color: #FFa940; font-weight: bold', config);\n const { loading } = config;\n loading && my.showLoading();\n return config;\n },\n error => {\n console.log(error);\n return Promise.reject(error);\n }\n);\n\n/**\n *\n * @param {接口地址} url\n * @param {配置参数} config\n */\nexport async function request(\n url = '',\n config = { }\n) {\n config.method = config.method ? config.method.toLowerCase() : 'get';\n let res = null;\n url = getDomain() + url;\n\n res = await tinyAppHttp.request({ ...config, url });\n // console.info('%c request.js请求结果', 'color: #FFa940; font-weight: bold', res);\n return res;\n};\n","util/TinyAppHttp.js":"import to from 'herculex/dist/utils/promiseWrapper';\nimport { isFunc } from 'herculex/dist/utils/is';\n\nlet timeout = 60000;\nlet dataType = 'json';\n/**\n * 请求 get\n * @param {*} config\n * _request_\n */\nfunction get(config) {\n let {\n url,\n headers,\n data\n } = config;\n if (data) {\n let queryParams = '';\n let i = 0;\n for (let name in data) {\n if (i === 0) {\n queryParams += name + '=' + data[name];\n } else {\n queryParams += '&' + name + '=' + data[name];\n }\n i++;\n }\n if (url.indexOf('?') > -1) {\n let urlArr = url.split('?');\n if (urlArr[1].length > 0) {\n url += '&' + queryParams;\n } else {\n url += queryParams;\n }\n } else {\n url += '?' + queryParams;\n }\n }\n return to(new Promise((resolve, reject) => {\n const staticParams = {\n url,\n method: 'get',\n dataType,\n headers,\n timeout,\n success: (result = {}) => {\n resolve(result);\n },\n fail: (result) => {\n reject(result);\n },\n complete: (result) => {\n // console.info('%c my.httpRequest complete', 'color: #FFa940; font-weight: bold', result);\n }\n };\n const finalParams = {\n ...staticParams\n };\n // console.log('%c my.httpRequest', 'color: #108ee9; font-weight: bold', url, finalParams);\n my.httpRequest(finalParams);\n }));\n}\n/**\n * 请求 post\n * @param {*} config\n * _request_\n */\nfunction post(config) {\n let {\n url,\n data,\n headers\n } = config;\n return to(new Promise((resolve, reject) => {\n const staticParams = {\n url,\n data,\n method: 'post',\n dataType,\n headers,\n timeout,\n success: (result = {}) => {\n resolve(result);\n },\n fail: (result) => {\n reject(result);\n },\n complete: (result) => {\n // console.info('%c my.httpRequest complete', 'color: #FFa940; font-weight: bold', data, result);\n }\n };\n const finalParams = {\n ...data,\n ...staticParams\n };\n // console.log('%c my.httpRequest', 'color: #108ee9; font-weight: bold', url, finalParams);\n my.httpRequest(finalParams);\n }));\n}\n\nclass InterceptorManager {\n constructor() {\n this.handlers = [];\n }\n use(fulfilled, rejected) {\n this.handlers.unshift({\n fulfilled: fulfilled,\n rejected: rejected\n });\n return this.handlers.length - 1;\n }\n forEach(fn) {\n const newHandles = [];\n this.handlers.forEach(h => {\n if (h !== null) {\n fn(h);\n }\n });\n this.handlers = newHandles;\n }\n}\n// 处理请求回来后的数据.\nfunction dispatchRequest(config) {\n // 这里是请求的真正发起地方返回promise\n console.log('真正发起请求:', config);\n if (config.method === 'get') {\n return get(config).then(\n ([error, data]) => {\n // TODO format response data\n if (error) {\n // my.request fail.\n return Promise.reject(error);\n }\n return data;\n }\n );\n } else if (config.method === 'post') {\n return post(config).then(\n ([error, data]) => {\n // TODO format response data\n if (error) {\n // my.request fail.\n return Promise.reject(error);\n }\n return data;\n }\n );\n }\n}\n\nexport default class TinyAppHttp {\n constructor(instanceConfig) {\n /*\n * instanceConfig 参数\n * bizCode NOTNULL\n * exitAppWhenRefuseAuth Boolean 拒绝授权时退出app\n */\n this.defaults = Object.assign(\n {\n exitAppWhenRefuseAuth: true\n },\n instanceConfig\n );\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n }\n request(config) {\n if (typeof config === 'string') {\n config = {};\n config.url = arguments[0];\n } else {\n config = config || {};\n }\n // 合并参数\n config = { ...this.defaults, ...config };\n config.data = config.data || {};\n // 处理超时时间\n if (config.timeout) {\n timeout = config.timeout;\n }\n // 处理请求头\n if (!config.headers) {\n let contentType = { 'content-type': 'application/json;charset=UTF-8' };\n if (config.requestType === 'form') {\n contentType = { 'content-type': 'application/x-www-form-urlencoded;charset=UTF-8' };\n }\n config.headers = { ...config.headers, contentType };\n }\n // 处理响应\n if (config.responseType) {\n dataType = config.responseType;\n }\n\n // 载入拦截器\n let chain = [dispatchRequest, undefined];\n let promise = Promise.resolve(config);\n this.interceptors.request.forEach(interceptor => {\n chain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n this.interceptors.response.forEach(interceptor => {\n chain.push(interceptor.fulfilled, interceptor.rejected);\n });\n while (chain.length) {\n promise = promise.then(chain.shift(), chain.shift());\n }\n return promise;\n }\n}"},"dist":[{"ETag":"F51D7E400194DC23D70D8628FC66C087","name":"0.json","size":920309,"type":"json","url":"https://gw.alipayobjects.com/os/herbox/7728e6f2-bc64-44cd-8888-1c11a02eaecc/0.json"}]}