From b559fd8ba0b3a04ef5481104310a443f7d83bbb1 Mon Sep 17 00:00:00 2001 From: zzy <411037547@qq.com> Date: Tue, 28 Mar 2023 19:02:11 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=B3=A8=E9=87=8A=E8=A1=A5?= =?UTF-8?q?=E5=85=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/utils.js | 48 ++ package-lock.json | 2 +- pages.json | 19 +- pages/cashAudit/list.vue | 3 +- pages/commercialBI/carPortrait.vue | 387 ++++++++++ pages/everdayRenven/AnhuiIndex.vue | 6 + .../components/anhuiYestodayRevenueData.js | 17 +- pages/index/index.vue | 679 ++++++++++-------- pages/userCenter/components/userList.vue | 50 +- pages/userCenter/userCenter.vue | 40 +- static/images/commercial/car.svg | 101 +++ static/images/commercial/fixed.svg | 53 ++ static/images/commercial/rightArrow.svg | 14 + static/images/index/news.svg | 16 + 14 files changed, 1090 insertions(+), 345 deletions(-) create mode 100644 pages/commercialBI/carPortrait.vue create mode 100644 static/images/commercial/car.svg create mode 100644 static/images/commercial/fixed.svg create mode 100644 static/images/commercial/rightArrow.svg create mode 100644 static/images/index/news.svg diff --git a/common/utils.js b/common/utils.js index 1b1d89f..90f1139 100644 --- a/common/utils.js +++ b/common/utils.js @@ -117,6 +117,24 @@ const fmoney = (s, n) => { } } + +// 没有小数点的金额格式化 +function noDecimal(s){ + let fuhao = ''; //如果数字小于零则值为- + if (s < 0) { + s = Math.abs(s); + fuhao = '-' + } + s = parseFloat((s + "").replace(/[^\d\.-]/g, "")) + "" + let l = s.split(".")[0].split("").reverse(), r = s.split(".")[1]; + let t = '' + for (let i = 0; i < l.length; i++) { + t += l[i] + ((i + 1) % 3 == 0 && (i + 1) != l.length ? "," : ""); + } + return fuhao + [...t].reverse().join("") + +} + /** * 将数据转成日期格式 * @param {string} s: 要格式化的日期数据 @@ -193,6 +211,34 @@ async function getFieldEnumByField(params) { } +// 得到这个月有多少天 +function getThisMonthDay(value){ + let date = new Date(value) + let y = date.getFullYear() + let m = date.getMonth() + 1 + let howDay; + let flag = false + if( y%4 ===0 && y%100!==0 || y%400===0 ){ + flag=true + } + switch (m){ + case 1: case 3: case 5: case 7: case 8: case 10: case 12: + howDay=31 + break + case 4: case 6: case 9: case 11: + howDay=30 + break + case 2 : + if(flag){ + howDay=29 + }else{ + howDay = 28 + } + break + } + return howDay +} + // 视频播放 const EZUIPlayer = require('./ezuikit.js'); @@ -203,7 +249,9 @@ function playVideo(opt) { export default { netChange, cutDate, + getThisMonthDay, fmoney, + noDecimal, changeStringToDate, toNextRoute, addUserBehavior, diff --git a/package-lock.json b/package-lock.json index fdc75ca..55880c8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5 +1,5 @@ { - "name": "wechat_ahyd", + "name": "wechat_ahyd (2)", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/pages.json b/pages.json index 506031e..0029f20 100644 --- a/pages.json +++ b/pages.json @@ -4,7 +4,7 @@ "path": "pages/index/index", "style": { - "navigationBarTitleText": "驿行畅旅", + "navigationBarTitleText": "驿达数智化看板", "navigationStyle": "custom" } }, @@ -27,7 +27,7 @@ "path": "pages/webview/webview", "style": { - "navigationBarTitleText": "驿行畅旅" + "navigationBarTitleText": "驿达数智化看板" } }, { @@ -81,6 +81,21 @@ } ] }, + { //商业BI + "root": "pages/commercialBI", + "pages": [ + { + "path": "carPortrait", + "style": { + "navigationBarTitleText": "", + "navigationStyle": "custom" + }, + "usingComponents": { + "qiun-wx-ucharts": "@qiun/wx-ucharts" + } + } + ] + }, { "root": "pages/operatingStatements", "pages": [ diff --git a/pages/cashAudit/list.vue b/pages/cashAudit/list.vue index 89132a1..64cfa39 100644 --- a/pages/cashAudit/list.vue +++ b/pages/cashAudit/list.vue @@ -180,7 +180,6 @@ .screen-box .screen-unit { display: flex; align-items: center; - width: 200rpx; padding: 0 14rpx; line-height: 3; } @@ -203,6 +202,6 @@ border-radius: 6rpx; } .mr20 { - margin: 0 30rpx 0 16rpx; + /*margin: 0 16rpx 0 16rpx;*/ } diff --git a/pages/commercialBI/carPortrait.vue b/pages/commercialBI/carPortrait.vue new file mode 100644 index 0000000..dc61a36 --- /dev/null +++ b/pages/commercialBI/carPortrait.vue @@ -0,0 +1,387 @@ + + + + + \ No newline at end of file diff --git a/pages/everdayRenven/AnhuiIndex.vue b/pages/everdayRenven/AnhuiIndex.vue index 53abf7d..fcc3e98 100644 --- a/pages/everdayRenven/AnhuiIndex.vue +++ b/pages/everdayRenven/AnhuiIndex.vue @@ -348,6 +348,7 @@ } const ctx = uni.createCanvasContext(obj.id, this); data.series = data.series.concat(obj.data) + console.log('data.series',data.series) rincanvas[obj.id] = new uCharts({ // 小程序图表工具 // $this: this, @@ -1380,6 +1381,11 @@ border-radius: 4rpx; margin-top: 12rpx; } + .operation-c-list .operation-cl-unit{ + display: flex; + justify-content: space-between; + align-items: center; + } .operation-c-list .progress .bgO { height: 12rpx; diff --git a/pages/everdayRenven/components/anhuiYestodayRevenueData.js b/pages/everdayRenven/components/anhuiYestodayRevenueData.js index ac33d5e..2cca9e8 100644 --- a/pages/everdayRenven/components/anhuiYestodayRevenueData.js +++ b/pages/everdayRenven/components/anhuiYestodayRevenueData.js @@ -1,6 +1,9 @@ import request from '@/util/index.js' const methods = { async getData(obj,isServerPartDetail,value) { // 获取远程数据 value判断是不是正常进来 是的话俩接口不调 + console.log('obj',obj) + console.log('isServerPartDetail',isServerPartDetail) + console.log('getData',value) let _this = this /* ts 数据类型声明 type serverpartRegion = { @@ -20,18 +23,13 @@ const methods = { Statistics_Month: obj.month , Province_Code: obj.ProvinceCode , pushProvinceCode: obj.ProvinceCode , + provinceCode:obj.ProvinceCode, Serverpart_ID: obj.GroupType != 1020 ? obj.ServerpartIds : '', SPRegionType_ID: obj.GroupType == 1020 ? obj.ServerpartIds : '', // Revenue_Include: 1 } - const requestParamasBudget = { - Statistics_Date: obj.time , - Statistics_Month: obj.month , - Province_Code: obj.ProvinceCode , - pushProvinceCode: obj.ProvinceCode , - Serverpart_ID: obj.ServerpartIds ? obj.ServerpartIds : '' - } - this.provinceCode = obj.ProvinceCode + this.provinceCode = obj.ProvinceCode + console.log('requestParamas',requestParamas) // 营收数据 const data = await request.$webGet('CommercialApi/Revenue/GetRevenuePushList', requestParamas) if (data.Result_Code != 100) return @@ -41,6 +39,7 @@ const methods = { if (busniessCounts.Result_Code != 100) return // 业态关系 + console.log('开始请求接口',new Date().getTime()) const tradeData = await request.$webGet('CommercialApi/BaseInfo/GetBusinessTradeList', requestParamas) if (tradeData.Result_Code != 100) return @@ -52,7 +51,7 @@ const methods = { } } if (!value){ - budgetAmount = await request.$webGet('CommercialApi/Revenue/GetBudgetExpenseList', requestParamasBudget) + budgetAmount = await request.$webGet('CommercialApi/Revenue/GetBudgetExpenseList', requestParamas) if (budgetAmount.Result_Code != 100) return } diff --git a/pages/index/index.vue b/pages/index/index.vue index 4bc4080..0387d91 100644 --- a/pages/index/index.vue +++ b/pages/index/index.vue @@ -5,7 +5,7 @@
- + {{ thisDay }} {{ single }} @@ -16,29 +16,31 @@
- +

对客营收

- 门店上传: {{showHeadMsg.uploadState?showHeadMsg.uploadState:''}} -
- -

{{showHeadMsg.totalMoneyShow|| '0.00'}}

- + 门店上传: {{showTableData.Revenue_Upload?showTableData.Revenue_Upload:'-'}}/{{allShopCount?allShopCount:'-'}}
+ + +

{{showTableData.CashPay || '0.00'}}

+
+ +
- - {{showHeadMsg.compared?showHeadMsg.compared + '%':'' + '%'}} + + {{showTableData.compared?showTableData.compared + '%':'-' + '%'}} (相比昨日)
去授权 - +

客单交易/笔

-

{{showHeadMsg.ticketCount || 0}}

+

{{showTableData.TicketCount?showTableData.TicketCount:'-'}}

@@ -48,7 +50,7 @@

客单均价/元

-

{{showHeadMsg.averagePrice || '0.00'}}

+

{{showTableData.averagePrice?showTableData.averagePrice:'-'}}

@@ -58,55 +60,55 @@

长款金额/元

-

{{ showHeadMsg.diffMorePrice }}

+

{{ showTableData.Different_Price_More?showTableData.Different_Price_More:'-' }}

短款金额/元

-

{{ showHeadMsg.diffLessPrice }}

+

{{ showTableData.Different_Price_Less?showTableData.Different_Price_Less:'-' }}

优惠金额/元

-

{{showHeadMsg.totalOffAmount }}

+

{{showTableData.TotalOffAmount?showTableData.TotalOffAmount:'-' }}

移动支付/元

-

{{showHeadMsg.mobilePayment }}

+

{{showTableData.MobilePayment?showTableData.MobilePayment:'-' }}

商品出售/件

-

{{ showHeadMsg.totalCount }}

+

{{ showTableData.TotalCount?showTableData.TotalCount:'-' }}

商品均价/元

-

{{ showHeadMsg.countave}}

+

{{ showTableData.countave?showTableData.countave:'-' }}

入区车流/辆

-

{{carInfo.Vehicle_Count?carInfo.Vehicle_Count:''}}

+

{{carInfo.Vehicle_Count?carInfo.Vehicle_Count:'-'}}

入区率/%

-

{{carInfo.Entry_Rate?carInfo.Entry_Rate :'' }}

+

{{carInfo.Entry_Rate?carInfo.Entry_Rate :'-' }}

停留时长/分钟

-

{{carInfo.Stay_Times?carInfo.Stay_Times:'' }}

+

{{carInfo.Stay_Times?carInfo.Stay_Times:'-' }}

@@ -118,7 +120,7 @@
- + @@ -132,13 +134,17 @@

{{ item.name }}{{ item.unit }}

-

{{ item.value }}

+

{{ item.value }}

+

{{ item.yesterValue }}

{{ item.add }} (相比昨日) - 本月累计 + + 本月累计 + {{ item.value }} +
@@ -169,13 +175,13 @@

{{item.name}}

-

{{item.data}}

+

{{item.value}}

-
+
-

{{item.bili+'%'}}

+

{{item.percentage+'%'}}

@@ -191,13 +197,13 @@

{{item.name}}

-

{{item.data}}

+

{{item.value}}

-
+
-

{{item.bili+'%'}}

+

{{item.percentage+'%'}}

@@ -213,13 +219,13 @@

{{item.name}}

-

{{item.data}}

+

{{item.value}}

-
+
-

{{item.bili+'%'}}

+

{{item.percentage+'%'}}

@@ -236,23 +242,32 @@
-

{{plan.percentageMonth?plan.percentageMonth + '%':''}}

-

很棒哟,超额完成

+ +

{{plan.percentageMonth?plan.percentageMonth + '%':'-'}}

+

+
+ + +

{{monthAdd?monthAdd + '%':'-'}}

+
-
- -
+
+
+ + + +

本月已完成/元

-

{{plan.RevenueMonth_Amount}}

+

{{plan.RevenueMonth_Amount?plan.RevenueMonth_Amount:'-'}}

本月计划/元

-

{{plan.BudgetMonth_Amount}}

+

{{plan.BudgetMonth_Amount?plan.BudgetMonth_Amount:'-'}}

@@ -266,23 +281,30 @@ -

{{plan.percentageYear?plan.percentageYear + '%':''}}

-

很棒哟,超额完成

+ +

{{plan.percentageYear?plan.percentageYear + '%':'-'}}

+

+
+ + +

{{yearAdd?yearAdd + '%':''}}

+
-
- -
+
+
+ +

年度已完成/元

-

{{plan.RevenueYear_Amount}}

+

{{plan.RevenueYear_Amount?plan.RevenueYear_Amount:'-'}}

年度计划/元

-

{{plan.BudgetYear_Amount}}

+

{{plan.BudgetYear_Amount?plan.BudgetYear_Amount:'-'}}

@@ -322,10 +344,9 @@ export default { const nowDay = this.$util.cutDate(new Date(), 'MM月DD日') return { - statusBarHeight:'', - shopUpload:'', + statusBarHeight:'',// 每个手机的状态栏高度 page:'/pages/index/index', - menu:'', + menu:'', // 胶囊按钮高度 detailList:[ { name: '长款金额', unit: '/元', price:0 }, { name: '短款金额', unit: '/元', price: 0 }, { name: '优惠金额', unit: '/元', price: 0 }, @@ -335,56 +356,49 @@ export default { { name: '入区车流', unit: '/辆', price: 0 }, { name: '入区率', unit: '', price: 0 }, { name: '停留时长', unit: '', price: 0 },], - tabTypeList:[ { imgUrl: '/static/images/index/car.svg', path: '', name: '车流画像' }, + tabTypeList:[ { imgUrl: '/static/images/index/car.svg', path: '/pages/commercialBI/carPortrait', name: '车流画像' }, { imgUrl: '/static/images/index/guest.svg', path: '', name: '客群画像' }, { imgUrl: '/static/images/index/business_icon.svg', path: '', name: '经营画像' }, { imgUrl: '/static/images/index/trade.svg', path: '', name: '交易画像' }, { imgUrl: '/static/images/index/brand.svg', path: '', name: '业态品牌' },], - detailTypeList:[{ name: '分润门店', unit: '/个', value: '', add: '', imgIcon: '/static/images/index/store.svg' }, - { name: '驿达分润', unit: '/元', value: '', imgIcon: '/static/images/index/yidaFenrun.svg' }, - { name: '订单配送', unit: '/单', value: '', add: '', imgIcon: '/static/images/index/orderDelivery.svg' }, - { name: '采购金额', unit: '/元', value: '', imgIcon: '/static/images/index/purchaseAmount.svg' },], + detailTypeList:[{ name: '分润门店', unit: '/个', value: '-',yesterValue:'-', add: '-', imgIcon: '/static/images/index/store.svg' }, + { name: '驿达分润', unit: '/元', value: '-',yesterValue:'-', imgIcon: '/static/images/index/yidaFenrun.svg' }, + { name: '订单配送', unit: '/单', value: '-',yesterValue:'-', add: '-', imgIcon: '/static/images/index/orderDelivery.svg' }, + { name: '采购金额', unit: '/元', value: '-',yesterValue:'-', imgIcon: '/static/images/index/purchaseAmount.svg' },], propOfRevenList:[ { name: '经营模式', value: 1 }, { name: '经营业态', value: 2 }, { name: '区域经营', value: 3 }], - selectTab:1, - single:timestampToTime((new Date(lastDay).getTime())), - thisDay:'', + selectTab:1, // 选项卡的指针 + mobileData :{}, // 移动支付分账接口返回的数据 + single:'', // 时间选择器选择的时间 + monthAdd:'',//月每天的相对增加 + yearAdd:'', // 年度计划增加的百分比 + thisDay:'', // 显示的星期几 isBig:false,//判断门店上传的前一个数字是否比后一个数字大 - showPage: false, - opacity: 0, // 背景颜色透明度 - customBarH: this.CustomBar, - statusBarH: this.StatusBar, - isLoading: true, + allShopCount:0,//门店总数 theRequest: null, - sevenDate: null, lastDay: lastDay, // 该页面的最近有效日期 - nowDay: nowDay, - headMsg: {}, - showHeadMsg:{},//不变成字符串的headMsg - today: null, // 今日数据 + nowDay: nowDay, // 当天时间 + buyPriceYes:'',//昨日采购金额 regionList: null, nowTab: 1, + priceMove:false,//价格出现的动画效果 carInfo:{},//车流信息 - regionShow1: true, regionProgress: null, - tradeType: null, areaProgress: null, - bayonetProgress: null, modelProgress: null, - isup: true, + showTableData:{}, monthPrice:0,//月度累计分润 yesterdayBillCount:0,//昨日累计配送 lastDayBillCount:0,//当前日的配送 buyPriceMonth:0,//月度的采购金额 totalData:null, - isInOnLoad:false, + option:{},//onLoad里面的option isShow:false, //投诉建议是否显示 isShowTitle:0,//投诉建议条数 plan:{},//月度和年度接口的返回参数 一起的 ShareShopCountYes:0,//昨日的店铺数 yesterdayAllPay:0,//前一天的营收总额 - nowDayAllPay:0,//今日营收总额 wechatPushSalesList: null // 甘肃单品排行数据 } }, @@ -392,7 +406,7 @@ export default { user:{ handler:function (value){ console.log('监听user',value) - this.getData({}) + this.getData(this.option) }, deep:true } @@ -414,52 +428,46 @@ export default { }, ...mapGetters({'user':'getUser'}) }, - onLoad(option){ // 拿到手机参数 - // if (!this.user.Membership_Id){ - // uni.login({ // 登录 - // async success (res) { - // console.log('re111s',res) - // await this.memberLogin(res.code) - // } - // }) - // } - + onLoad(option){ + // 处理页面显示的时间 + this.single = timestampToTime((new Date(this.lastDay).getTime())) + // 获取手机参数对页面进行适配 let systemInfo = uni.getSystemInfoSync() this.statusBarHeight = Number(systemInfo.statusBarHeight) this.menu = uni.getMenuButtonBoundingClientRect() + // 获取最近有效日期的时间,以昨天为主 const date = new Date(this.lastDay) this.thisDay = getThisDay(date.getDay()) - + // 判断是否有投诉建议的悬浮框弹出 for(let key in this.toDoMsg){ if (key === 'd405ae13-3388-41c0-a5f6-d11194d0a943' && this.toDoMsg['d405ae13-3388-41c0-a5f6-d11194d0a943']){ this.isShow = true this.isShowTitle = this.toDoMsg['d405ae13-3388-41c0-a5f6-d11194d0a943'] } } - console.log(1111) - this.getData(option) - // if (!this.user.Membership_Id){ - // this.getLoginCode().then(()=>{ - // debugger - // this.getData(option) - // }) - // }else { - // this.getData(option) - // } + //拿到option的值 + this.option = option + // 获取数据的方法 + if (this.user.Membership_Id){ + this.getData(option) + } }, onShow(){ - // if (this.user.Membership_Id && !this.isInOnLoad){ - // this.onRefresh() - // } + // 隐藏掉小程序本身自带的 tabbar 让自定义的tabbar出现 uni.hideTabBar() }, onHide(){ + // 离开页面投诉建议的悬浮框隐藏掉 this.isShow = false + this.selectTab = 1 }, methods:{ ...mapActions(['memberLogin','getLoginCode']), handlePage(){ - this.$util.toNextRoute('navigateTo', '/pages/operatingStatements/index') + this.$util.toNextRoute('navigateTo', `/pages/operatingStatements/index?time=${this.lastDay}`) + }, + handleGoTab(item){ + this.$util.toNextRoute('navigateTo', item.path) }, getData(option){ //老代码 @@ -467,44 +475,46 @@ export default { uni.showLoading({ title: '正在加载...' }) - this.isInOnLoad=true } - console.log('this.user.Membership_Id',this.user.Membership_Id) - console.log(2222) + //判断是否从推送进来 if (option.ProvinceCode) { // 从推送进入 this.theRequest = option option.time = this.$util.cutDate(option.time, 'YYYY-MM-DD') option.month = this.$util.cutDate(option.time, 'YYYYMM') - + this.lastDay = this.$util.cutDate(option.time, 'YYYY-MM-DD') + //修改时间选择器里面的时间 + this.single = timestampToTime((new Date(this.lastDay).getTime())) + //显示当前选择的时间是星期几 + const date = new Date(this.lastDay) + this.thisDay = getThisDay(date.getDay()) + // 老项目的请求数据的那部分 this.initData() + //根据新页面请求数据的方法 this.initYesterdayData() //车流分析 this.getCarInfo() //月度计划、年度计划 this.monthYearPlan() } else if (this.user.Membership_Id){ // 默认 + // 不是从推送进来 走正常的请求方法 // if (!this.PushAuthority){return} // if (this.PushAuthority.length > 0) { + + // 定义initData中的入参 this.theRequest = this.defaultMsg() || {} this.theRequest.time = this.lastDay this.theRequest.month = this.$util.cutDate(this.lastDay, 'YYYYMM') - this.initData(true) + // 请求数据的方法 initData是老项目中的接口,形参true传入 可以让两个没用到的接口不调用 + this.initData() + // 请求用的到的 昨日的数据 this.initYesterdayData() //车流分析 this.getCarInfo() //月度计划、年度计划 this.monthYearPlan() - - // this.bindDateChange(this.lastDay) - // } else { - // uni.hideLoading() - // this.theRequest = null - // this.isLoading = false - // this.showPage = false - // this.opacity = 1 - // - // } } + + // 老项目代码 this.nowTab = this.theRequest.ProvinceCode == 340000 ? 1 : 2 if (this.theRequest.GroupType == 1010) { this.getDetail(this.theRequest) @@ -521,39 +531,9 @@ export default { handleSearch(){ this.$util.toNextRoute('navigateTo', '/pages/suggestion/suggestion') }, + // 改变时间触发的方法 ,改变页面的内容数据 onRefresh(){ - uni.showLoading({ - title: '正在加载...' - }) - console.log('this.PushAuthority',this.PushAuthority) - // if (!this.PushAuthority){return} - - // if (this.PushAuthority.length > 0) { - this.theRequest = this.defaultMsg() || {} - this.theRequest.time = this.lastDay - this.theRequest.month = this.$util.cutDate(this.lastDay, 'YYYYMM') - this.initData() - this.initYesterdayData() - // } else { - // uni.hideLoading() - // this.theRequest = null - // this.isLoading = false - // this.showPage = false - // this.opacity = 1 - // } - //车流分析 - this.getCarInfo() - //月度计划、年度计划 - this.monthYearPlan() - this.nowTab = this.theRequest.ProvinceCode == 340000 ? 1 : 2 - if (this.theRequest.GroupType == 1010) { - this.getDetail(this.theRequest) - } - // 若省份为甘肃,则加载甘肃单品排行 - if (this.theRequest.ProvinceCode == 620000) { - - this.getRankContent() - } + this.getData(this.option) }, monthYearPlan(){ const monthDate= { @@ -561,15 +541,25 @@ export default { Statistics_Date:this.lastDay } request.$webGet('CommercialApi/Revenue/GetRevenueBudget',monthDate).then(res=>{ + // 赋值给data中的这个对象 在请求完之后会进行统一的数据处理 this.plan = res.Result_Data this.plan.percentageMonth = (res.Result_Data.RevenueMonth_Amount / res.Result_Data.BudgetMonth_Amount*100).toFixed(2) + // this.plan.percentageMonth = 80 this.plan.percentageYear = (res.Result_Data.RevenueYear_Amount / res.Result_Data.BudgetYear_Amount*100).toFixed(2) - + let date = new Date(this.lastDay) + let nowDay = date.getDate() + let day = this.$util.getThisMonthDay(this.lastDay) + //一天应该的增长率 + let oneDay = 100/day + // 到了当天的应该有的百分比 + let thisDayShould= oneDay*nowDay + this.monthAdd = (((this.plan.percentageMonth - thisDayShould)/thisDayShould)*100).toFixed(2) + this.yearAdd = (((res.Result_Data.RevenueYear_Amount - res.Result_Data.RevenueYear_PlanAmount)/res.Result_Data.RevenueYear_PlanAmount)*100).toFixed(2) + //处理数据 this.plan.RevenueMonth_Amount = this.$util.fmoney(res.Result_Data.RevenueMonth_Amount) this.plan.BudgetMonth_Amount = this.$util.fmoney(res.Result_Data.BudgetMonth_Amount) this.plan.RevenueYear_Amount = this.$util.fmoney(res.Result_Data.RevenueYear_Amount) this.plan.BudgetYear_Amount = this.$util.fmoney(res.Result_Data.BudgetYear_Amount) - }) }, getCarInfo(){ @@ -578,13 +568,16 @@ export default { Province_Code:'340000' } request.$webGet('CommercialApi/Revenue/GetAvgBayonetAnalysis',data).then(res=>{ + // 赋值给data中的这个对象 在请求完之后会进行统一的数据处理 this.carInfo = res.Result_Data this.carInfo.Vehicle_Count = res.Result_Data.Vehicle_Count }) }, initYesterdayData(){ let _this = this + // 传入最近的有效日期就可以拿到当前有效日期的前一天的日期 let yesterday = handleYesterday(this.lastDay) + // 定义入参 除了改变时间 别的和老乡一致 const data = { Statistics_Date:yesterday, Statistics_Month:this.theRequest.month, @@ -594,14 +587,17 @@ export default { SPRegionType_ID:this.theRequest.GroupType==1020?this.theRequest.ServerpartIds:'' } request.$webGet('CommercialApi/Revenue/GetRevenuePushList',data).then(res=>{ + // 计算月总额 拿到昨日的全部对客营收 并拿到相对于昨日的增长比 let cashPay = 0 res.Result_Data.List.forEach(item=>{ cashPay= Number(item.CashPay) + cashPay }) + // 赋值给data中的这个对象 在请求完之后会进行统一的数据处理 _this.yesterdayAllPay = cashPay }) //昨日的分润门店 request.$webGet('CommercialApi/Revenue/GetMobileShare',data).then(res=>{ + // 赋值给data中的这个对象 在请求完之后会进行统一的数据处理 this.ShareShopCountYes = res.Result_Data.ShareShop_Count }) @@ -612,12 +608,14 @@ export default { m = '0' + m } //一个月分润门店 + // 如果前一天是上个月 那么拿到的月份还是上一个月的月份 然后结束时间就是前一天 开始时间是月份开始的第一天 const monthDate={ Province_Code:'340000', StatisticsStartDate:`${y}-${m}-01`, StatisticsEndDate:this.lastDay, } request.$webGet('CommercialApi/Revenue/GetMobileShare',monthDate).then(res=>{ + // 赋值给data中的这个对象 在请求完之后会进行统一的数据处理 this.monthPrice = res.Result_Data.Royalty_Price }) @@ -627,6 +625,7 @@ export default { Statistics_Date: this.lastDay } request.$webGet('CommercialApi/Revenue/GetMallDeliver',todayData).then(res=>{ + // 赋值给data中的这个对象 在请求完之后会进行统一的数据处理 this.lastDayBillCount = res.Result_Data.DeliverBill_Count }) @@ -636,8 +635,18 @@ export default { Statistics_Date: yesterday } request.$webGet('CommercialApi/Revenue/GetMallDeliver',deliveData).then(res=>{ + // 赋值给data中的这个对象 在请求完之后会进行统一的数据处理 this.yesterdayBillCount = res.Result_Data.DeliverBill_Count }) + //昨日采购金额 + const buyPriceYes = { + Province_Code:'340000', + Statistics_Date: yesterday + } + request.$webGet('CommercialApi/Revenue/GetMallDeliver',buyPriceYes).then(res=>{ + // 赋值给data中的这个对象 在请求完之后会进行统一的数据处理 + this.buyPriceYes = res.Result_Data.Deliver_Price + }) //一个月的采购金额 const buyPrice = { @@ -646,8 +655,41 @@ export default { StatisticsEndDate:this.lastDay } request.$webGet('CommercialApi/Revenue/GetMallDeliver',buyPrice).then(res=>{ + // 赋值给data中的这个对象 在请求完之后会进行统一的数据处理 this.buyPriceMonth = res.Result_Data.Deliver_Price }) + // 获取营收推送汇总数据 + const allPriceData = { + pushProvinceCode:'340000', + Statistics_Date:this.lastDay + } + request.$webGet('CommercialApi/Revenue/GetSummaryRevenue',allPriceData).then(res=>{ + // 赋值给data中的这个对象 在请求完之后会进行统一的数据处理 + let result = res.Result_Data + + for(let key in result){ + if (key!=='RevenuePushModel'){ + let all = 0 + // 先算出全部的总额数量 用来计算百分比 + result[key].forEach(item=>{ + all += Number(item.value) + }) + // 把百分比计算出来加到每一项中 + result[key].map(item=>{ + item.percentage = ((Number(item.value)/all)*100).toFixed(2) + }) + // 格式化掉处理的数据 + result[key].forEach(item=>{ + item.value = _this.$util.fmoney(item.value) + }) + } + } + this.modelProgress = result.BusinessTypeList + this.regionProgress = result.BusinessTradeList + this.areaProgress = result.SPRegionList + this.showTableData = result.RevenuePushModel + this.todayAmount() + }) }, defaultMsg() { let option = null @@ -670,6 +712,7 @@ export default { handleSelectTab(value){ this.selectTab = value }, + // 顶部的时间组件切换时间触发的方法 bindDateChange(e){ const date = new Date(e.detail.value).getTime() this.single = timestampToTime(date) @@ -677,6 +720,11 @@ export default { this.thisDay = getThisDay(new Date(e.detail.value).getDay()) this.onRefresh() }, + //选择时间的点击事件 + handleDateClick(){ + // 用来修改对客营收的class属性 + this.priceMove = false + }, showPie(obj) { let data = { series: [] @@ -803,144 +851,72 @@ export default { }) return [_data2, _data1]; }, - async initData(value) { // 初始化营收数据 - let _this = this - const [reginList, totalData, busniessTypePie, busniessTradePie, busniessAreaPie, bayonetPie] = - await anhuiYestodayRevenueData.getData(this.theRequest,null,value) // 获取实时数据 - this.nowDayAllPay=totalData.cashPay - console.log('totalData',totalData) - - - // yesterdayRequest.time = yesterday - // //获取昨日的实时数据 - // const [yesterdayReginList, yesterdayTotalData, yesterdayBusniessTypePie, yesterdayBusniessTradePie, yesterdayBusniessAreaPie, yesterdayBayonetPie] = - // await anhuiYestodayRevenueData.getData(yesterdayRequest) // 获取实时数据 - // console.log('totalData',totalData) - // console.log('yesterdayTotalData',yesterdayTotalData) - - if (this.theRequest.GroupType !== 1010) { - this.regionList = reginList // 营收上传列表 reginListModel[] - } - // 组合及格式化 头部卡片总营收数据。 - totalData.tickave = totalData.ticketCount > 0 ? this.$util.fmoney( - totalData.cashPay / totalData.ticketCount, 2) : 0 - totalData.countave = totalData.totalCount > 0 ? this.$util.fmoney( - totalData.cashPay / totalData.totalCount, 2) : 0 - totalData.totalMoneyShow = this.$util.fmoney(totalData.cashPay) // 营收总数据格式化 - totalData.dayOfShow = this.$util.cutDate(this.theRequest.time, 'MM月DD日') // 当前日期 - totalData.budgetamoutShow = totalData.budgetAmount ? - _this.$util.fmoney(totalData.budgetAmount) : 0.00 // 预算总营收 - - busniessTypePie.forEach((n, i) => { - if (n.name === '自营') { - // 预算和实际差额 - totalData.diffBudgetTotal = Math.abs(totalData.budgetAmount - n.data) - // 预算和实际增长额比例 - totalData.diffBili = totalData.budgetAmount > 0 ? - this.$util.fmoney((totalData.diffBudgetTotal / - totalData.budgetAmount) * 100, 2) : '100' - } - }); - this.headMsg = totalData - console.log('this.headMsginitData',this.headMsg) - // 饼图分析及数据条形分析 - const [progressList, pieList] = this.getProgressData(busniessTypePie, totalData.cashPay) - this.modelProgress = progressList - // 经营类型分析 - var colors1 = ['#FFAC37', '#6B75B8']; - // console.log(pieList) - this.showPie({ - id: 'modelCont', - data: pieList, - colors: colors1, - }); - // 经营业态 - - // 饼图分析及数据条形分析 - const [tprogressList, tpieList] = this.getProgressData(busniessTradePie, totalData.cashPay) - - this.regionProgress = tprogressList - // 经营类型分析 - var colors2 = ['#5E67B4', '#4E5699', '#75B7AD', '#AFB7E6']; - this.showPie({ - id: 'businessCont', - data: tpieList, - colors: colors2, - }); - - // 饼图分析及数据条形分析 - const [aprogressList, apieList] = this.getProgressData(busniessAreaPie, totalData.cashPay) - this.areaProgress = aprogressList - // 区域营收分析 - var colors3 = ['#FFAC37', '#d8ece9', '#f7f5f6', '#b2b7e3', '#F4B27A', '#F3B1C9', '#e0e3f7', '#FFE886', '#f7f5f6']; - this.showPie({ - id: 'areaCont', - data: apieList, - colors: colors3, - }); - - // 安徽省本级显示的内容 - if (this.theRequest.GroupType == 1000 && this.theRequest.ProvinceCode == 340000) { - // 显示片区车流量数据分析 - const [bayonetList] = this.getBayonetData(bayonetPie) - this.bayonetProgress = bayonetList + async initData() { // 初始化营收数据 + const data = { + pushProvinceCode:'340000', + Statistics_Date:this.lastDay } - if (reginList.length) { - this.showPage = true + //获取服务区门店商家数量列表(根据省份、服务区、区域、统计日期查询) + const totalData = await request.$webGet('CommercialApi/BaseInfo/GetShopCountList',data) + let all = 0 + totalData.Result_Data.List.forEach(item=>{ + all+=item.SHOP_REVENUECOUNT + }) + this.allShopCount = all + + //获取移动支付分账数据 + const shareData = { + Province_Code:'340000', + Statistics_Date:this.lastDay } - this.isLoading = false - this.todayAmount() - this.isInOnLoad = true - uni.hideLoading() + const mobileShareData = await request.$webGet('CommercialApi/Revenue/GetMobileShare',shareData) + this.mobileData = mobileShareData.Result_Data + // 让金额的动画效果出来 + this.priceMove = true + //处理数据的方法 }, todayAmount() { - let _this = this - // let theRequest = this.theRequest - //最近日 - // this.$request.$get('getCurRevenue', { - // pushProvinceCode: theRequest.ProvinceCode, - // serverPartId: theRequest.GroupType == 1000 ? '' : theRequest.ServerpartIds - // }).then(res => { - // if (res.ResultCode != 100) return - // - // let avrticket = (res.Data.TOTALTICKET != 0 && res.Data.TOTALPRICE != 0) ? res.Data.TOTALPRICE / - // res.Data - // .TOTALTICKET : 0 - // _this.today = { - // timeMoney: this.$util.fmoney(res.Data.TOTALPRICE, 2), - // totalTicketCount: res.Data.TOTALTICKET, - // avrticketCount: this.$util.fmoney(avrticket, 2), - // } - // _this.$forceUpdate() - // }) - //分润门店 - this.detailTypeList[0].value =this.headMsg.shareShopCount - //驿达分润 由于数据现成 这样写最方便 + let _this = this + // 由于处理数据的时间 必须在全部接口请求完毕 所以加个延时器 + setTimeout(()=>{ + console.log('处理数据的方法') + // 由于页面大部分的内容采用渲染的格式 这样的方法是最快的对原数据进行赋值 对照data里面的几个主要的数组看就能看明白 + // 门店上传的前后数字计算来决定样式 + if(this.showTableData.Revenue_Upload > this.allShopCount){ + this.isBig = false + }else{ + this.isBig = true + } + // 计算相对于昨日的增长率 + this.showTableData.compared = (((Number(this.showTableData.CashPay) - this.yesterdayAllPay) / this.yesterdayAllPay) * 100).toFixed(2) + // 客单均价 + this.showTableData.averagePrice = (Number(this.showTableData.CashPay) / Number(this.showTableData.TicketCount)).toFixed(2) + // 商品均价 + this.showTableData.countave = (Number(this.showTableData.CashPay) / Number(this.showTableData.TotalCount)).toFixed(2) + //分润那四个选项卡的数据 进行统一处理 + //mobileData 是移动支付分账接口返回来的全部数据 + this.detailTypeList[0].value =this.mobileData.ShareShop_Count + this.detailTypeList[0].add = this.mobileData.ShareShop_Count - this.ShareShopCountYes this.detailTypeList[1].value = this.$util.fmoney(this.monthPrice) - this.detailTypeList[0].add = this.headMsg.shareShopCount - this.ShareShopCountYes - this.detailTypeList[3].value = this.$util.fmoney(this.buyPriceMonth) + this.detailTypeList[1].yesterValue = this.$util.fmoney(this.mobileData.Royalty_Price) //返回数据可能有问题 this.detailTypeList[2].value = this.lastDayBillCount this.detailTypeList[2].add = this.lastDayBillCount - this.yesterdayBillCount - this.showHeadMsg = this.headMsg - this.showHeadMsg.averagePrice = Number(this.nowDayAllPay) / Number(this.headMsg.ticketCount) - this.showHeadMsg.compared = ((Number(this.nowDayAllPay) - this.yesterdayAllPay) / this.yesterdayAllPay) * 100 - for (let i in this.showHeadMsg) { - if (i === 'ticketCount' || i === 'uploadState'){ - this.showHeadMsg[i] = this.showHeadMsg[i] + this.detailTypeList[3].value = this.$util.fmoney(this.buyPriceMonth) + this.detailTypeList[3].yesterValue = this.$util.fmoney(this.buyPriceYes) + // 处理所有数据 变成有千分号和小数点的数据 + for (let key in this.showTableData){ + if (key==='uploadState' || key==='Revenue_Upload'){ + this.showTableData[key] = this.showTableData[key] + }else if(key ==='TicketCount'){ + this.showTableData[key] = this.$util.noDecimal(this.showTableData[key],0) }else{ - this.showHeadMsg[i] = this.$util.fmoney(this.showHeadMsg[i], 2) + this.showTableData[key] = this.$util.fmoney(this.showTableData[key], 2) } } - - let index = this.showHeadMsg.uploadState.indexOf('/') - let first = this.showHeadMsg.uploadState.slice(0,index) - let second = this.showHeadMsg.uploadState.slice(index+1,1000) - if (Number(first)-Number(second)<0){ - this.isBig = true - } + uni.hideLoading() _this.$forceUpdate() - + }) }, getDetail(obj) { let _this = this @@ -1072,17 +1048,32 @@ $iphoneHeight: env(safe-area-inset-bottom); margin-left: 8px; } } - + + @keyframes allPriceAnimation { + 0%{ + transform: translateY(30px); + } + 100%{ + transform: translateY(0px); + } + } + .box { display: flex; align-items: center; - .allPrice { - font-size: 56rpx; - font-family: DINAlternate-Bold, DINAlternate; - font-weight: bold; - color: #782717; - line-height: 64rpx; - margin-top: 4px; + .priceBox{ + overflow: hidden; + .allPrice { + font-size: 56rpx; + font-family: DINAlternate-Bold, DINAlternate; + font-weight: bold; + color: #782717; + line-height: 64rpx; + margin-top: 4px; + } + .allPriceMove{ + animation: allPriceAnimation 2s; + } } .start { width: 14px; @@ -1289,14 +1280,26 @@ $iphoneHeight: env(safe-area-inset-bottom); top: 0; right: 0; } - .other { - font-size: 24rpx; - font-family: PingFangSC-Regular, PingFang SC; - font-weight: 400; - color: #a69e9f; - line-height: 36rpx; - margin-left: 2px; + .otherBox{ + display: flex; + justify-content: space-between; + .other { + font-size: 24rpx; + font-family: PingFangSC-Regular, PingFang SC; + font-weight: 400; + color: #a69e9f; + line-height: 36rpx; + margin-left: 2px; + } + .month{ + font-size: 24rpx; + font-family: DINAlternate-Bold, DINAlternate; + font-weight: bold; + color: #160002; + line-height: 40rpx; + } } + .title { font-size: 28rpx; font-family: PingFangSC-Regular, PingFang SC; @@ -1498,6 +1501,7 @@ $iphoneHeight: env(safe-area-inset-bottom); background: #f5f2f2; margin-top: 12px; .top { + width: 100%; display: flex; .big { width: 40px; @@ -1515,33 +1519,53 @@ $iphoneHeight: env(safe-area-inset-bottom); } } .text { - flex: 1; + width: calc(100% - 60px); padding: 2px 0; .textTop{ display: flex; align-items: center; - .number { - font-size: 36rpx; - font-family: DINAlternate-Bold, DINAlternate; - font-weight: bold; - color: #150002; - line-height: 40rpx; - } - .desc{ + justify-content: space-between; + .left{ display: flex; align-items: center; - margin-left: 8px; - font-size: 14px; - color: #FF7043; - .success{ - width: 20px; - height: 20px; - margin-right: 4px; + .number { + font-size: 36rpx; + font-family: DINAlternate-Bold, DINAlternate; + font-weight: bold; + color: #150002; + line-height: 40rpx; + } + .desc{ + display: flex; + align-items: center; + margin-left: 8px; + font-size: 14px; + color: #FF7043; + .success{ + width: 20px; + height: 20px; + margin-right: 4px; + } + } + } + .right{ + display: flex; + align-items: center; + .addIcon { + width: 16px; + height: 16px; + margin-right: 2px; + } + .text{ + font-size: 16px; + font-family: DINAlternate-Bold, DINAlternate; + color: #150002; + line-height: 40rpx; } } } - .progess{ + .progressPlan{ width: 100%; height: 8px; border-radius: 5px; @@ -1549,19 +1573,38 @@ $iphoneHeight: env(safe-area-inset-bottom); margin-top: 8px; position: relative; overflow: hidden; - .pro{ - position: absolute; - right: 0; + .trans{ height: 8px; - background: #fff; - } - .img{ - height: 100%; - border-radius: 5px; - overflow: hidden; position: absolute; - left: 0; + left: 0;top: 0; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + background: url("https://eshangtech.com/ShopICO/ahyd-BID/index/progress_orange.png")no-repeat 100% 100%; } + .transYear{ + height: 8px; + position: absolute; + left: 0;top: 0; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + background: url("https://eshangtech.com/ShopICO/ahyd-BID/index/progress_blue.png")no-repeat 100% 100%; + } + //.img{ + // width: 100%; + // height: 100%; + // position: absolute; + // top: 0; + // left: 0; + // z-index:1; + //} + //.pro{ + // height: 100%; + // position: absolute; + // top: 0;right: 0; + // background: #fff; + // z-index:2; + //} + } } } @@ -1588,7 +1631,7 @@ $iphoneHeight: env(safe-area-inset-bottom); } .money { font-size: 28rpx; - font-family: PingFangSC-Semibold, PingFang SC; + font-family: DINAlternate-Bold, DINAlternate; font-weight: 600; color: #160002; line-height: 40rpx; diff --git a/pages/userCenter/components/userList.vue b/pages/userCenter/components/userList.vue index 113bcfd..f74fa0d 100644 --- a/pages/userCenter/components/userList.vue +++ b/pages/userCenter/components/userList.vue @@ -9,6 +9,9 @@ class="useListItem" > + + +

{{ item.name }}

@@ -94,7 +97,7 @@ export default { justify-content: space-between; margin-bottom: 28px; .useListItem { - width: 30%; + width: calc((100% - 16px)/3); height: 72px; position: relative; box-sizing: border-box; @@ -108,6 +111,29 @@ export default { top: 0;left:0; z-index:0; } + .iconStart{ + width: 20px; + height: 20px; + overflow: hidden; + position: absolute; + left: 11px;top: 27px; + z-index:2; + .icon{ + width: 14px; + height: 14px; + transform: translateX(30px); + border-right: 30px solid transparent; + } + .icon_first{ + filter: drop-shadow(-30px 0px #9564F6); + } + .icon_second{ + filter: drop-shadow(-30px 0px #F5921D); + } + .icon_third{ + filter: drop-shadow(-30px 0px #28BAD3); + } + } .name { font-size: 28rpx; font-family: PingFangSC-Semibold, PingFang SC; @@ -119,8 +145,8 @@ export default { z-index:2; } .img { - width: 30px; - height: 30px; + width: 32px; + height: 32px; position: absolute; bottom: 9px; right: 14px; @@ -156,8 +182,8 @@ export default { align-items: center; margin-bottom: 8px; image { - width: 30px; - height: 30px; + width: 32px; + height: 32px; } } .name { @@ -244,13 +270,13 @@ export default { align-items: center; position: relative; .imgParent{ - width: 30px; - height: 30px; + width: 24px; + height: 24px; margin-bottom: 6px; overflow: hidden; .img { - width: 30px; - height: 30px; + width: 24px; + height: 24px; margin-bottom: 6px; transform: translateX(30px); border-right: 30px solid transparent; @@ -258,8 +284,8 @@ export default { } } .img_normal{ - width: 30px; - height: 30px; + width: 24px; + height: 24px; margin-bottom: 6px; } .name { @@ -275,7 +301,7 @@ export default { border-radius: 50%; background: red; position: absolute; - right: 8px; + right: 20%; top: -4px; color: #fff; font-size: 24rpx; diff --git a/pages/userCenter/userCenter.vue b/pages/userCenter/userCenter.vue index 2108181..e3ccb33 100644 --- a/pages/userCenter/userCenter.vue +++ b/pages/userCenter/userCenter.vue @@ -2,6 +2,12 @@
+ + + + + + 我的
@@ -266,8 +272,11 @@ import Tabbar from "../../components/tabbar/tabbar.vue"; }) }, onLoad(){ + // 获取手机参数 对页面进行自适应 let systemInfo = uni.getSystemInfoSync() this.statusBarHeight = Number(systemInfo.statusBarHeight) + + //拿到登录用户有权限的内容 this.menu = uni.getMenuButtonBoundingClientRect() this.dataList[2].list.forEach(item=>{ for(let key in this.user.AuthorityInfo){ @@ -278,6 +287,7 @@ import Tabbar from "../../components/tabbar/tabbar.vue"; } } }) + //拿到登录用户有权限的内容 判断是否有角标 this.dataList[3].list.forEach(item=>{ for(let key in this.user.AuthorityInfo){ if (key === item.id){ @@ -288,7 +298,7 @@ import Tabbar from "../../components/tabbar/tabbar.vue"; } } }) - + //拿到登录用户有权限的内容 判断是否有角标 this.dataList[2].list.forEach(item=>{ for(let key in this.toDoMsg){ if (key === item.id){ @@ -339,6 +349,33 @@ import Tabbar from "../../components/tabbar/tabbar.vue"; padding: 0 15px; z-index:9999999; } + .news{ + width: 24px; + height: 24px; + position: absolute; + left: 16px; + transform: translateY(-50%); + display: flex; + justify-content: center; + align-items: center; + .box{ + width: 100%; + height: 100%; + position: relative; + .img{ + width: 100%; + height: 100%; + } + .red{ + position: absolute; + width: 8px; + height: 8px; + background: #D7000F; + border-radius: 50%; + right:0;top: 4px; + } + } + } .userTitle { position: absolute; left: 50%; @@ -381,6 +418,7 @@ import Tabbar from "../../components/tabbar/tabbar.vue"; } } .message { + flex:1; .people { display: flex; align-items: center; diff --git a/static/images/commercial/car.svg b/static/images/commercial/car.svg new file mode 100644 index 0000000..12cf458 --- /dev/null +++ b/static/images/commercial/car.svg @@ -0,0 +1,101 @@ + + + 图标/汽车@2x + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/images/commercial/fixed.svg b/static/images/commercial/fixed.svg new file mode 100644 index 0000000..0596763 --- /dev/null +++ b/static/images/commercial/fixed.svg @@ -0,0 +1,53 @@ + + + 图标/更多@2x + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/images/commercial/rightArrow.svg b/static/images/commercial/rightArrow.svg new file mode 100644 index 0000000..475da72 --- /dev/null +++ b/static/images/commercial/rightArrow.svg @@ -0,0 +1,14 @@ + + + 图标/更多@2x + + + + + + + + + + + \ No newline at end of file diff --git a/static/images/index/news.svg b/static/images/index/news.svg new file mode 100644 index 0000000..e20b11a --- /dev/null +++ b/static/images/index/news.svg @@ -0,0 +1,16 @@ + + + 图标/消息@2x + + + + + + + + + + + + + \ No newline at end of file