Browse Source

添加计划页

master
liup 3 weeks ago
parent
commit
4ded24ec55
11 changed files with 5444 additions and 2827 deletions
  1. +5
    -0
      pages.json
  2. +45
    -14
      pages/index.vue
  3. +81
    -2
      pages/login/login.vue
  4. +7
    -1
      pages/main/home/home.vue
  5. +99
    -38
      pages/main/message/message.vue
  6. +1
    -1
      pages/main/my/my.vue
  7. +601
    -0
      pages/main/plan/plan.vue
  8. +1
    -1
      store/index.js
  9. +2
    -2
      unpackage/dist/dev/app-plus/app-config-service.js
  10. +2103
    -1187
      unpackage/dist/dev/app-plus/app-service.js
  11. +2499
    -1581
      unpackage/dist/dev/app-plus/app-view.js

+ 5
- 0
pages.json View File

@@ -28,6 +28,11 @@
"style": { "style": {
"navigationBarTitleText": "消息" "navigationBarTitleText": "消息"
} }
},{
"path": "pages/main/plan/plan",
"style": {
"navigationBarTitleText": "计划"
}
}, },
{ {
"path": "pages/main/task/page2/scan_review", "path": "pages/main/task/page2/scan_review",


+ 45
- 14
pages/index.vue View File

@@ -5,7 +5,7 @@
<view v-if="tabberPageLoadFlag[0]" :style="{ <view v-if="tabberPageLoadFlag[0]" :style="{
display: currentTabbarIndex === 0 ? '' : 'none' display: currentTabbarIndex === 0 ? '' : 'none'
}"> }">
<scroll-view class="custom-tabbar-page" scroll-y :scroll-top="scrollTop" @scroll="scroll"
<scroll-view ref="scrollView1" class="custom-tabbar-page" scroll-y="true" :scroll-top="scrollTop" @scroll="scroll"
:refresher-threshold="10" enable-back-to-top @scrolltolower="tabbarPageScrollLower"> :refresher-threshold="10" enable-back-to-top @scrolltolower="tabbarPageScrollLower">
<home ref="home"></home> <home ref="home"></home>
</scroll-view> </scroll-view>
@@ -14,8 +14,9 @@
<view v-if="tabberPageLoadFlag[1]" :style="{ <view v-if="tabberPageLoadFlag[1]" :style="{
display: currentTabbarIndex === 1 ? '' : 'none' display: currentTabbarIndex === 1 ? '' : 'none'
}"> }">
<scroll-view class="custom-tabbar-page" :refresher-threshold="10" scroll-y enable-back-to-top
@scrolltolower="tabbarPageScrollLower">
<scroll-view class="custom-tabbar-page" scroll-y="true" :scroll-top="scrollTop" @scroll="scroll"
:refresher-threshold="10" enable-back-to-top
@scrolltolower="tabbarPageScrollLower" >
<message ref="message"></message> <message ref="message"></message>
</scroll-view> </scroll-view>
</view> </view>
@@ -23,7 +24,7 @@
<view v-if="tabberPageLoadFlag[2]" :style="{ <view v-if="tabberPageLoadFlag[2]" :style="{
display: currentTabbarIndex === 2 ? '' : 'none' display: currentTabbarIndex === 2 ? '' : 'none'
}"> }">
<scroll-view class="custom-tabbar-page" :refresher-threshold="10" scroll-y enable-back-to-top
<scroll-view class="custom-tabbar-page" :scroll-top="scrollTop" @scroll="scroll" :refresher-threshold="10" scroll-y enable-back-to-top
@scrolltolower="tabbarPageScrollLower"> @scrolltolower="tabbarPageScrollLower">
<task ref="task"></task> <task ref="task"></task>
</scroll-view> </scroll-view>
@@ -32,26 +33,26 @@
<view v-if="tabberPageLoadFlag[3]" :style="{ <view v-if="tabberPageLoadFlag[3]" :style="{
display: currentTabbarIndex === 3 ? '' : 'none' display: currentTabbarIndex === 3 ? '' : 'none'
}"> }">
<scroll-view class="custom-tabbar-page" :refresher-threshold="10" scroll-y enable-back-to-top
<scroll-view class="custom-tabbar-page" :scroll-top="scrollTop" @scroll="scroll" :refresher-threshold="10" scroll-y enable-back-to-top
@scrolltolower="tabbarPageScrollLower"> @scrolltolower="tabbarPageScrollLower">
<!-- <profile ref="profile"></profile> -->
<plan ref="plan"></plan>
</scroll-view> </scroll-view>
</view> </view>
<view v-if="tabberPageLoadFlag[4]" :style="{ <view v-if="tabberPageLoadFlag[4]" :style="{
display: currentTabbarIndex === 4 ? '' : 'none' display: currentTabbarIndex === 4 ? '' : 'none'
}"> }">
<scroll-view class="custom-tabbar-page" :refresher-threshold="10" scroll-y enable-back-to-top
<scroll-view class="custom-tabbar-page" :scroll-top="scrollTop" @scroll="scroll" :refresher-threshold="10" scroll-y enable-back-to-top
@scrolltolower="tabbarPageScrollLower"> @scrolltolower="tabbarPageScrollLower">
<my ref="my"></my> <my ref="my"></my>
</scroll-view> </scroll-view>
</view> </view>


<!-- 右上角形式的tabbar按钮--> <!-- 右上角形式的tabbar按钮-->
<view class="" v-if="currentTabbarIndex === 2">
<view class="" v-if="currentTabbarIndex != 4">
<view class="icon15__item--icon tn-flex tn-flex-row-center tn-flex-col-center tn-shadow-blur button-2" <view class="icon15__item--icon tn-flex tn-flex-row-center tn-flex-col-center tn-shadow-blur button-2"
@tap.stop="handleBtnClick"> @tap.stop="handleBtnClick">
<text class="tn-icon-scan tn-color-blue"></text>
<text class=" tn-color-blue" :class="['tn-icon-'+[currentTabbarIndex===2?'scan':'refresh']]"></text>
</view> </view>
</view> </view>


@@ -154,7 +155,7 @@
import Task from './main/task/task.vue'; import Task from './main/task/task.vue';
import Message from './main/message/message.vue'; import Message from './main/message/message.vue';
import Home from './main/home/home.vue'; import Home from './main/home/home.vue';
import Task4 from './main/task/task.vue';
import Plan from './main/plan/plan.vue';
import my from './main/my/my.vue'; import my from './main/my/my.vue';
export default { export default {
@@ -170,7 +171,7 @@
Task, Task,
Message, Message,
Home, Home,
Task4,
Plan,
my my
}, },
data() { data() {
@@ -209,6 +210,15 @@
tabbarPageScrollLower(e) { tabbarPageScrollLower(e) {
if (this.currentTabbarIndex === 1) { if (this.currentTabbarIndex === 1) {
this.$refs.message.reachBottom() this.$refs.message.reachBottom()
}else if (this.currentTabbarIndex === 3) {
this.$refs.plan.reachBottom()
}
},
tabbarPageScrollTop(){
if (this.currentTabbarIndex === 1) {
this.$refs.message.reachBottom()
}else if (this.currentTabbarIndex === 3) {
this.$refs.plan.reachBottom()
} }
}, },


@@ -247,9 +257,30 @@
this.oldScrollTop = e.detail.scrollTop this.oldScrollTop = e.detail.scrollTop
}, },
handleBtnClick(e) { handleBtnClick(e) {
console.log('扫码复核')
wx.vibrateShort();
this.$refs.task.openSan()
if(this.currentTabbarIndex == 2){
console.log('扫码复核')
wx.vibrateShort();
this.$refs.task.openSan()
}else if(this.currentTabbarIndex == 0){
this.scrollTop = this.oldScrollTop
this.$nextTick(function() {
this.scrollTop = 0
});
this.$refs.home.refresh()
}else if(this.currentTabbarIndex == 1){
this.scrollTop = this.oldScrollTop
this.$nextTick(function() {
this.scrollTop = 0
});
this.$refs.message.refresh()
}else if(this.currentTabbarIndex == 3){
this.scrollTop = this.oldScrollTop
this.$nextTick(function() {
this.scrollTop = 0
});
this.$refs.plan.refresh()
}
}, },


} }


+ 81
- 2
pages/login/login.vue View File

@@ -16,6 +16,9 @@
<div class="meteor1"></div> <div class="meteor1"></div>
<div class="meteor2"></div> <div class="meteor2"></div>
<div class="meteor3"></div> <div class="meteor3"></div>
<div class="meteor4"></div>
<div class="meteor5"></div>
<div class="meteor6"></div>
</view> </view>
<view class="login login-fixed"> <view class="login login-fixed">
@@ -596,8 +599,84 @@
} }
} }
.meteor4 {
width: 4px;
height: 48px;
background: linear-gradient(0deg, $color 0, transparent 100%);
position: absolute;
top: 70px;
transform: rotate(45deg);
right: 100px;
opacity: 0;
animation: streak 4s linear infinite;
//伪类实现发光头部
&::after {
content: "";
position: absolute;
width: 6px;
height: 6px;
border-radius: 50%;
background: $color;
filter: blur(1.8px);
box-shadow: 0px -1px -1px 5px transparent;
bottom: -4px;
left: 50%;
transform: translate(-50%);
}
}
.meteor5 {
width: 3px;
height: 36px;
background: linear-gradient(0deg, $color 0, transparent 100%);
position: absolute;
top: 270px;
transform: rotate(45deg);
right: 100px;
opacity: 0;
animation-delay: 2s;
animation: streak 2.5s linear infinite;
//伪类实现发光头部
&::after {
content: "";
position: absolute;
width: 6px;
height: 6px;
border-radius: 50%;
background: $color;
filter: blur(1.8px);
box-shadow: 0px -1px -1px 5px transparent;
bottom: -4px;
left: 50%;
transform: translate(-50%);
}
}
.meteor6 {
width: 2px;
height: 36px;
background: linear-gradient(0deg, $color 0, transparent 100%);
position: absolute;
top: 170px;
transform: rotate(45deg);
right: 100px;
animation-delay: 0.5s;
opacity: 0;
animation: streak 2.2s linear infinite;
//伪类实现发光头部
&::after {
content: "";
position: absolute;
width: 6px;
height: 6px;
border-radius: 50%;
background: $color;
filter: blur(1.8px);
box-shadow: 0px -1px -1px 5px transparent;
bottom: -4px;
left: 50%;
transform: translate(-50%);
}
}
@keyframes streak { @keyframes streak {
0% { 0% {
transform: rotate(50deg) translateY(-100px) scale(0.5); transform: rotate(50deg) translateY(-100px) scale(0.5);


+ 7
- 1
pages/main/home/home.vue View File

@@ -96,7 +96,6 @@
ProgressBar ProgressBar
}, },
data(){ data(){
return { return {
CircleData, CircleData,
ProductRateData, ProductRateData,
@@ -108,6 +107,13 @@
} }
}, },
methods:{ methods:{
refresh(){
uni.showLoading();
setTimeout(() => {
this.delayload = true;
uni.hideLoading();
}, 1000)
},
finishProcess(totalNum,finishNum){ finishProcess(totalNum,finishNum){
if(totalNum==0){ if(totalNum==0){
return 0; return 0;


+ 99
- 38
pages/main/message/message.vue View File

@@ -1,25 +1,26 @@
<template> <template>
<view class="pages-a"> <view class="pages-a">
<view class=" bg-frosted-glass" :style="{height: 150+vuex_custom_bar_height+'rpx'}"></view>
<!-- tabs --> <!-- tabs -->
<view class="tabs-fixed tn-bg-white">
<view class="tn-flex tn-padding-top-sm"
:style="{marginTop: vuex_custom_bar_height + 'rpx'}">
<view class="tabs-fixed ">
<view class="tn-flex tn-padding-top-sm "
:style="{marginTop: vuex_custom_bar_height-30 + 'rpx'}">
<view style="width: 100vw;overflow: hidden;"> <view style="width: 100vw;overflow: hidden;">
<tn-tabs class="" :list="scrollList" :current="current" :isScroll="false" activeColor="#3668FC" :bold="true"
:fontSize="32" :top="30" :badgeOffset="[20, 100]" :barWidth="80" @change="tabChange" backgroundColor="#FFFFFF"
<tn-tabs class="tab-bg" :list="scrollList" :current="current" :isScroll="false" activeColor="#3668FC" :bold="true"
:fontSize="32" :top="30" :badgeOffset="[20, 100]" :barWidth="80" @change="tabChange"
:height="100"></tn-tabs> :height="100"></tn-tabs>
</view> </view>
</view> </view>
</view> </view>
<view class="top_title" :style="{marginTop: vuex_custom_bar_height + 'rpx'}">
<view class="top_title" :style="{marginTop: vuex_custom_bar_height-10 + 'rpx'}">
设备报警 设备报警
</view> </view>
<view class="mask-to-read" :style="{marginTop: vuex_custom_bar_height+20 + 'rpx'}" @tap.stop="maskToRead">
<view class="mask-to-read" :style="{marginTop: vuex_custom_bar_height+0 + 'rpx'}" @tap.stop="maskToRead">
全部标为已读 全部标为已读
</view> </view>
<!-- 页面内容 --> <!-- 页面内容 -->
<view class="tn-padding" :style="{marginTop: vuex_custom_bar_height+optionHeight+50 + 'rpx'}">
<view class="tn-padding content" :style="{marginTop: vuex_custom_bar_height+optionHeight+50 + 'rpx'}">
<view v-show="current === 0 && isLogin" style="position: relative;" @click="handleMessageClick(item, index)" <view v-show="current === 0 && isLogin" style="position: relative;" @click="handleMessageClick(item, index)"
class="article-shadow tn-bg-white tn-padding tn-margin-bottom" v-for="(item, index) in messageList" class="article-shadow tn-bg-white tn-padding tn-margin-bottom" v-for="(item, index) in messageList"
:key="item.id"> :key="item.id">
@@ -40,7 +41,7 @@
</view> </view>


<view v-show="current === 1 && isLogin" style="position: relative;" @click="handleMessageClick(item, index)" <view v-show="current === 1 && isLogin" style="position: relative;" @click="handleMessageClick(item, index)"
class="article-shadow tn-bg-white tn-padding tn-margin-bottom" v-for="(item, index) in resultMessageList"
class="article-shadow tn-bg-white tn-padding tn-margin-bottom" v-for="(item, index) in historyMessageList"
:key="item.id"> :key="item.id">
<view class="tn-text-ellipsis tn-text-bold" style="color: #080808;font-size: 26rpx;"> <view class="tn-text-ellipsis tn-text-bold" style="color: #080808;font-size: 26rpx;">
{{item.content}} {{item.content}}
@@ -132,14 +133,14 @@
page: 1, page: 1,
size: 10 size: 10
}, },
resMessageQuery: {
hisMessageQuery: {
page: 1, page: 1,
size: 10 size: 10
}, },
messageList: [], messageList: [],
resultMessageList: [],
historyMessageList: [],
loadmore: true, loadmore: true,
resultLoadmore: true,
hostoryLoadmore: true,
showTipModal: false, showTipModal: false,
message: '', message: '',
deviceName: '', deviceName: '',
@@ -172,7 +173,7 @@
mounted() { mounted() {
this.isLogin = this.vuex_user.hasLogin this.isLogin = this.vuex_user.hasLogin
this.getToDoMessageList() this.getToDoMessageList()
this.getResultMessageList()
this.gethistoryMessageList()
this.$nextTick(() => { this.$nextTick(() => {
const query = uni.createSelectorQuery().in(this) const query = uni.createSelectorQuery().in(this)
query.select('.tabs-fixed').boundingClientRect(data => { query.select('.tabs-fixed').boundingClientRect(data => {
@@ -214,7 +215,7 @@
this.messageList.forEach((item, index)=>{ this.messageList.forEach((item, index)=>{
item.status = 1 item.status = 1
}) })
this.resultMessageList.forEach((item, index)=>{
this.historyMessageList.forEach((item, index)=>{
item.status = 1 item.status = 1
}) })
this.scrollList[0].count = 0 this.scrollList[0].count = 0
@@ -222,8 +223,11 @@
}, },
getToDoMessageList() { getToDoMessageList() {
console.log("getToDoMessageList") console.log("getToDoMessageList")
if(!this.vuex_user.hasLogin){
return
}
this.$refs.loading.open() this.$refs.loading.open()
if(this.isTest && this.vuex_user.hasLogin){
if(this.isTest){
setTimeout(()=>{ setTimeout(()=>{
this.messageList = [{ this.messageList = [{
id:1, id:1,
@@ -239,7 +243,7 @@
content:'异常加热故障信息' content:'异常加热故障信息'
} }
] ]
this.resultMessageList = [{
this.historyMessageList = [{
id:11, id:11,
status:0,//0未读 status:0,//0未读
deviceName:'机器人r221', deviceName:'机器人r221',
@@ -275,10 +279,34 @@
deviceName:'炒锅c2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', deviceName:'炒锅c2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
createTime:'2024/12/9 09:25:11', createTime:'2024/12/9 09:25:11',
content:'异常加热故障信息xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' content:'异常加热故障信息xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
},{
id:22,
status:0,//0未读
deviceName:'炒锅c112',
createTime:'2024/12/10 13:19:59',
content:'异常加热故障信息'
},{
id:23,
status:0,//0未读
deviceName:'炒锅c2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
createTime:'2024/12/9 09:25:11',
content:'异常加热故障信息xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
},{
id:22,
status:0,//0未读
deviceName:'炒锅c112',
createTime:'2024/12/10 13:19:59',
content:'异常加热故障信息'
},{
id:23,
status:0,//0未读
deviceName:'炒锅c2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
createTime:'2024/12/9 09:25:11',
content:'异常加热故障信息xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
} }
] ]
this.scrollList[0].count = this.messageList.length this.scrollList[0].count = this.messageList.length
this.scrollList[1].count = this.resultMessageList.length
this.scrollList[1].count = this.historyMessageList.length
this.$refs.loading.close() this.$refs.loading.close()
this.$store.state.hasMessage = true this.$store.state.hasMessage = true
},500); },500);
@@ -309,7 +337,7 @@
} }
}, },
getResultMessageList() {
gethistoryMessageList() {
this.$refs.loading.open() this.$refs.loading.open()
if(this.isTest && this.vuex_user.hasLogin){ if(this.isTest && this.vuex_user.hasLogin){
setTimeout(()=>{ setTimeout(()=>{
@@ -321,7 +349,7 @@
let list = res.pageInfo.pageData let list = res.pageInfo.pageData
this.scrollList[0].count = res.todoCount this.scrollList[0].count = res.todoCount
this.scrollList[1].count = res.resultCount this.scrollList[1].count = res.resultCount
this.resultMessageList = list
this.historyMessageList = list
this.$refs.loading.close() this.$refs.loading.close()
this.isLogin = true this.isLogin = true
}).catch(e => { }).catch(e => {
@@ -350,10 +378,16 @@
} else if (this.current === 1) { } else if (this.current === 1) {
this.resultListReachBottom() this.resultListReachBottom()
} }
},
fresh(){
}, },
todoListReachBottom() { todoListReachBottom() {
console.log("todoListReachBottom") console.log("todoListReachBottom")
if(this.isTest && this.vuex_user.hasLogin){
if(!this.vuex_user.hasLogin){
return
}
if(this.isTest){
if(this.messageList.length>8){ if(this.messageList.length>8){
return return
} }
@@ -416,8 +450,11 @@
}, },
resultListReachBottom() { resultListReachBottom() {
console.log("resultListReachBottom") console.log("resultListReachBottom")
if(this.isTest && this.vuex_user.hasLogin){
if(this.resultMessageList.length>15){
if(!this.vuex_user.hasLogin){
return
}
if(this.isTest){
if(this.historyMessageList.length>15){
return return
} }
this.status = 'loading' this.status = 'loading'
@@ -453,27 +490,27 @@
content:'异常加热故障信息' content:'异常加热故障信息'
} }
] ]
this.resultMessageList.push(...data1)
this.historyMessageList.push(...data1)
this.scrollList[1].count += data1.length this.scrollList[1].count += data1.length
this.$store.state.hasMessage = true this.$store.state.hasMessage = true
},500) },500)
return return
} }
if (this.resultLoadmore) {
this.resMessageQuery.page += 1
if (this.hostoryLoadmore) {
this.hisMessageQuery.page += 1
this.status = 'loading' this.status = 'loading'
queryMyMessageListApi(this.resMessageQuery.page, this.resMessageQuery.size, 'RESULT').then(res => {
queryMyMessageListApi(this.hisMessageQuery.page, this.hisMessageQuery.size, 'RESULT').then(res => {
let list = res.pageInfo.pageData let list = res.pageInfo.pageData
if (list.length !== 0) { if (list.length !== 0) {
this.resultMessageList.push(...list)
this.historyMessageList.push(...list)
} else { } else {
this.resultLoadmore = false
this.hostoryLoadmore = false
} }
this.status = 'nomore' this.status = 'nomore'
}).catch(e => { }).catch(e => {
// console.log(e); // console.log(e);
this.status = 'nomore' this.status = 'nomore'
this.resultLoadmore = false
this.hostoryLoadmore = false
}) })
} }
}, },
@@ -485,7 +522,10 @@
this.showTipModal = true this.showTipModal = true
}, },
handleModalCancel() { handleModalCancel() {
if(this.isTest && this.vuex_user.hasLogin){
if(!this.vuex_user.hasLogin){
return
}
if(this.isTest){
if (this.current === 0) { if (this.current === 0) {
// todo设为已读 // todo设为已读
if(this.messageList[this.currentMessageIndex].status === 0){ if(this.messageList[this.currentMessageIndex].status === 0){
@@ -496,8 +536,8 @@
} }
} else if (this.current === 1) { } else if (this.current === 1) {
// result设为已读 // result设为已读
if(this.resultMessageList[this.currentMessageIndex].status === 0){
this.resultMessageList[this.currentMessageIndex].status = 1
if(this.historyMessageList[this.currentMessageIndex].status === 0){
this.historyMessageList[this.currentMessageIndex].status = 1
if(this.scrollList[1].count>0){ if(this.scrollList[1].count>0){
this.scrollList[1].count -= 1 this.scrollList[1].count -= 1
} }
@@ -517,7 +557,7 @@
} }
} else if (this.current === 1) { } else if (this.current === 1) {
// result设为已读 // result设为已读
this.resultMessageList[this.currentMessageIndex].readState = 1
this.historyMessageList[this.currentMessageIndex].readState = 1
if(this.scrollList[1].count>0){ if(this.scrollList[1].count>0){
this.scrollList[1].count -= 1 this.scrollList[1].count -= 1
} }
@@ -542,12 +582,12 @@
return return
} }
this.messageQuery.page = 1 this.messageQuery.page = 1
this.resMessageQuery.page = 1
this.hisMessageQuery.page = 1
this.getToDoMessageList() this.getToDoMessageList()
this.getResultMessageList()
this.gethistoryMessageList()
this.current = 0 this.current = 0
this.loadmore = true this.loadmore = true
this.resultLoadmore = true
this.hostoryLoadmore = true
}, },
// buildSocketConnect() { // buildSocketConnect() {
// let that = this // let that = this
@@ -664,7 +704,6 @@
.pages-a { .pages-a {
width: 100%; width: 100%;
height: 100%; height: 100%;
position: relative;
} }


/* 底部安全边距 start*/ /* 底部安全边距 start*/
@@ -729,6 +768,28 @@
border-radius: 15rpx; border-radius: 15rpx;
box-shadow: 0rpx 0rpx 50rpx 0rpx rgba(85, 170, 255, 0.2); box-shadow: 0rpx 0rpx 50rpx 0rpx rgba(85, 170, 255, 0.2);
// position: relative; // position: relative;
box-sizing: border-box;
}
/* 背景毛玻璃 start */
.bg-frosted-glass {
position: fixed;
left: 0;
top: 0;
width: 100%;
height: 200rpx;
// background-color: rgba(212, 235, 255, 0.5);
background: linear-gradient(0deg, #c5d5ff, #d4ebff, #d4ebff, #d4ebff);
backdrop-filter: blur(20rpx);
z-index: 11;
-webkit-backdrop-filter: blur(20rpx);
}
.tab-bg{
background-color: rgba(0, 0, 0, 0);
background:rgba(0, 0, 0, 0);
z-index: 11;
}
.content{
position: relative;
overflow: hidden;
} }

</style> </style>

+ 1
- 1
pages/main/my/my.vue View File

@@ -116,7 +116,7 @@
<view class="left-icon tn-main-gradient-teal"> <view class="left-icon tn-main-gradient-teal">
<text class="tn-icon-set-fill tn-color-white"/> <text class="tn-icon-set-fill tn-color-white"/>
</view> </view>
<view class="left-text">物料统计设置</view>
<view class="left-text">全局设置</view>
</view> </view>
<view class="right"> <view class="right">
<text class="tn-icon-right tn-color-gray"/> <text class="tn-icon-right tn-color-gray"/>


+ 601
- 0
pages/main/plan/plan.vue View File

@@ -0,0 +1,601 @@
<template>
<view class="pages-a">
<view class=" bg-frosted-glass" :style="{height: 150+vuex_custom_bar_height+'rpx'}"></view>
<!-- tabs -->
<view class="tabs-fixed ">
<view class="tn-flex tn-padding-top-sm "
:style="{marginTop: vuex_custom_bar_height-30 + 'rpx'}">
<view style="width: 100vw;overflow: hidden;">
<tn-tabs class="tab-bg" :list="scrollList" :current="current" :isScroll="false" activeColor="#3668FC" :bold="true"
:fontSize="32" :top="30" :badgeOffset="[20, 100]" :barWidth="80" @change="tabChange"
:height="100"></tn-tabs>
</view>
</view>
</view>
<view class="top_title" :style="{marginTop: vuex_custom_bar_height-10 + 'rpx'}">
计划列表
</view>

<!-- 页面内容 -->
<view class="tn-padding" :style="{marginTop: vuex_custom_bar_height+optionHeight+50 + 'rpx'}">
<view v-show="isLogin" style="position: relative;" @click="handleMessageClick(item, index)"
class="article-shadow tn-bg-white tn-padding tn-margin-bottom" v-for="(item, index) in dataStatusList"
:key="item.id">
<view style="margin-top: 0rpx;" class="text-container-row tn-color-gray tn-text-sm tn-text-ellipsis">
<view class="text-half-left tn-text-ellipsis tn-text-bold" style="color: #080808;font-size: 26rpx;">
{{item.title}}
</view>
<view class="text-half-right-status tn-text-bold"
:class="['status-' + item.status + '-color']" style="font-size: 26rpx;">
{{getStatusText(item.status)}}
</view>
</view>
<view class="tn-text-ellipsis tn-text-bold tn-color-gray" style="font-size: 26rpx;margin-top: 20rpx;">
编号:{{item.id}}
</view>
<view style="margin-top: 10rpx;" class="text-container-row tn-color-gray tn-text-sm tn-text-ellipsis">
<view class="tn-text-ellipsis tn-text-bold tn-color-gray" style="font-size: 26rpx;">
总数:{{item.totalNum}}
</view>
<view class="tn-text-ellipsis tn-text-bold status-0-color" style="font-size: 26rpx;margin-left: 50rpx;">
已完成:{{item.finishNum}}
</view>
</view>
<view style="margin-top: 10rpx;" class="text-container-colum tn-color-gray tn-text-sm tn-text-ellipsis">
<view class="text-half-left">
<text class="tn-icon-time" style="padding-right: 6rpx;"></text>计划开始时间:{{item.startTime | dateFormat}}
</view>
<view class="text-half-left" style=" margin-top: 10rpx;">
<text class="tn-icon-time" style="padding-right: 6rpx;"></text> 计划截至时间:{{item.stopTime | dateFormat}}
</view>
</view>
<view class="tn-text-ellipsis tn-color-gray" style="font-size: 26rpx;margin-top: 10rpx;">
</text>计划负责人:{{item.manager}}</text>
</view>
</view>
<tn-load-more v-if="isLogin" :status='status'></tn-load-more>
<tn-empty v-else text="请先登录" mode="data" :imgWidth="200" :imgHeight="200"></tn-empty>
</view>

<w-loading text="拼命处理中..." mask="true" click="true" ref="loading"></w-loading>
<tn-toast ref="toast"></tn-toast>
<view class='tn-tabbar-height'></view>
<view class="bg-tabbar-shadow"></view>

</view>
</template>

<script>
import {
queryMydataListApi
} from '@/api/message.js'
import {
dateShow
} from '@/utils/index.js'
import indexConfig from '@/config/index.config.js'
export default {
data() {
return {
isTest:true,
show: true,
current: 0,
scrollList: [
{
name: '进行中',
count: 0
},
{
name: '未开始',
count: 0
},
{
name: '已结束',
count: 0
}
],
messageQuery: {
page: 1,
size: 10
},
dataList: [],
dataStatusList: [],
loadmore: true,
status: 'nomore',
isLogin: true,
optionHeight: 0,
}
},
filters: {
dateFormat(date) {
return dateShow(date, 'yyyy年MM月dd日 hh:mm')
}
},
mounted() {
this.isLogin = this.vuex_user.hasLogin
this.getdataList()
this.$nextTick(() => {
const query = uni.createSelectorQuery().in(this)
query.select('.tabs-fixed').boundingClientRect(data => {
this.optionHeight = Math.ceil(data.height)
})
query.exec()
})
// 初始化websocket相关
// this.buildSocketConnect().then(() => {
// this.sendSocketMsg()
// this.socketOnClose()
// }).catch((e) => {})
},
methods: {
getStatusText(status,finishNum,totalNum){
if(status==0){
return '进行中'
}else if(status==1){
return '待启动'
}else if(status==2){
return '已结束'
}
},
homeOnShow() {
this.isLogin = this.vuex_user.hasLogin
if (!this.vuex_user.hasLogin) {
this.list = ['请先登录']
}
},
tn(page) {
this.$Router.push(page)
},
getdataList() {
console.log("getdataList")
if(!this.vuex_user.hasLogin){
return
}
this.$refs.loading.open()
if(this.isTest){
setTimeout(()=>{
this.dataList = [{
id:'165468795',
title:'XXXXXXxxxxxxxxxxxxxxxxxxxxxxxxxxxXXXXXx',
startTime:'2024/12/10',
stopTime:'2024/12/30',
status:0,//0未开始 1进行中 2结束
content:'xxxxxx',
finishNum:13,
totalNum:30,
manager:'张三'
},{
id:'165468795',
title:'XXXXXXXXxxx',
startTime:'2024/12/10',
stopTime:'2024/12/30',
status:0,//0未开始 1进行中 2结束
content:'xxxxxx',
finishNum:3,
totalNum:30,
manager:''
},{
id:'165468795',
title:'XXXxxx',
startTime:'2024/12/10',
stopTime:'2024/12/30',
status:0,//0未开始 1进行中 2结束
content:'xxxxxx',
finishNum:13,
totalNum:30,
manager:'张三'
},{
id:'165468795',
title:'xxx',
startTime:'2024/12/10',
stopTime:'2024/12/30',
status:0,//0未开始 1进行中 2结束
content:'xxxxxx',
finishNum:3,
totalNum:30,
manager:'李四'
},{
id:'165468795',
title:'xxx',
startTime:'2024/12/10',
stopTime:'2024/12/30',
status:1,//0未开始 1进行中 2结束
content:'xxxxxx',
finishNum:0,
totalNum:30
},{
id:'165468795',
title:'xxx',
startTime:'2024/12/10',
stopTime:'2024/12/30',
status:1,//0未开始 1进行中 2结束
content:'xxxxxx',
finishNum:0,
totalNum:30
},{
id:'165468795',
title:'xxxxxxxxxxxxxxx',
startTime:'2024/12/10',
stopTime:'2024/12/30',
status:2,//0未开始 1进行中 2结束
content:'xxxxxx',
finishNum:30,
totalNum:30
}
]
this.dataStatusList = []
this.dataList.forEach(item => {
if(this.current==0){
if(item.status==0){
this.dataStatusList.push(item)
}
}else if(this.current==1){
if(item.status==1){
this.dataStatusList.push(item)
}
}else if(this.current==2){
if(item.status==2){
this.dataStatusList.push(item)
}
}
})
this.$refs.loading.close()
this.$store.state.hasMessage = true
},500);
}else{
queryMydataListApi(this.messageQuery.page, this.messageQuery.size).then(res => {
let list = res.pageInfo.pageData
this.dataList = list
this.dataStatusList=[]
list.forEach(item => {
if(this.current==0){
if(item.status==0){
this.dataStatusList.push(item)
}
}else if(this.current==1){
if(item.status==1){
this.dataStatusList.push(item)
}
}else if(this.current==2){
if(item.status==2){
this.dataStatusList.push(item)
}
}
})
this.$refs.loading.close()
this.isLogin = true
}).catch(e => {
// console.log(e);
this.$refs.loading.close()
if (uni.getStorageSync("token")) {
this.isLogin = true
} else {
this.isLogin = false
}
})
}
},
tabChange(index) {
this.current = index
this.dataStatusList=[]
this.dataList.forEach(item => {
if(this.current==0){
if(item.status==0){
this.dataStatusList.push(item)
}
}else if(this.current==1){
if(item.status==1){
this.dataStatusList.push(item)
}
}else if(this.current==2){
if(item.status==2){
this.dataStatusList.push(item)
}
}
})
},
reachBottom() {
this.todoListReachBottom()
},
todoListReachBottom() {
console.log("todoListReachBottom")
if(!this.vuex_user.hasLogin){
return
}
if(this.isTest){
this.status = 'loading'
this.$refs.toast.show({
title: '加载更多',
duration: 1000
})
setTimeout(()=>{
this.status = 'nomore'
let data1 = [{
id:'165468795',
title:'xxx',
startTime:'2024/12/10',
stopTime:'2024/12/30',
status:0,//0未开始 1进行中 2结束
content:'xxxxxx',
finishNum:13,
totalNum:30
},{
id:'165468795',
title:'xxx',
startTime:'2024/12/10',
stopTime:'2024/12/30',
status:0,//0未开始 1进行中 2结束
content:'xxxxxx',
finishNum:3,
totalNum:30
},{
id:'165468795',
title:'xxx',
startTime:'2024/12/10',
stopTime:'2024/12/30',
status:1,//0未开始 1进行中 2结束
content:'xxxxxx',
finishNum:0,
totalNum:30
},{
id:'165468795',
title:'xxx',
startTime:'2024/12/10',
stopTime:'2024/12/30',
status:1,//0未开始 1进行中 2结束
content:'xxxxxx',
finishNum:0,
totalNum:30
},{
id:'165468795',
title:'xxxxxxxxxxxxxxx',
startTime:'2024/12/10',
stopTime:'2024/12/30',
status:2,//0未开始 1进行中 2结束
content:'xxxxxx',
finishNum:30,
totalNum:30
}
]
this.dataList.push(...data1)
data1.forEach(item => {
if(this.current==0){
if(item.status==0){
this.dataStatusList.push(item)
}
}else if(this.current==1){
if(item.status==1){
this.dataStatusList.push(item)
}
}else if(this.current==2){
if(item.status==2){
this.dataStatusList.push(item)
}
}
})
},500)
return
}
if (this.loadmore) {
this.messageQuery.page += 1
this.status = 'loading'
queryMydataListApi(this.messageQuery.page, this.messageQuery.size).then(res => {
let list = res.pageInfo.pageData
if (list.length !== 0) {
this.dataList.push(...list)
list.forEach(item => {
if(this.current==0){
if(item.status==0){
this.dataStatusList.push(item)
}
}else if(this.current==1){
if(item.status==1){
this.dataStatusList.push(item)
}
}else if(this.current==2){
if(item.status==2){
this.dataStatusList.push(item)
}
}
})
} else {
this.loadmore = false
}
this.status = 'nomore'
}).catch(e => {
// console.log(e);
this.status = 'nomore'
this.loadmore = false
})
}
},
refresh() {
if (!this.isLogin) {
this.$refs.toast.show({
title: '请登录',
duration: 1000
})
if(this.isLogin)
return
}
this.messageQuery.page = 1
this.getdataList()
this.current = 0
this.loadmore = true
},
}
}
</script>

<style lang="scss" scoped>
.tab-padding{
padding-top: 20rpx;
}
.badge{
z-index: 10;
}
.text-container-row {
display: flex; /* 启用 Flexbox 布局 */
flex-direction: row; /* 子元素水平排列 */
width: 100%; /* 容器宽度设为 100% */
}
.text-container-colum {
display: flex; /* 启用 Flexbox 布局 */
flex-direction: column; /* 子元素水平排列 */
width: 100%; /* 容器宽度设为 100% */
}
.text-half-left {
flex: 1; /* 子元素平分容器宽度 */
padding-right: 20rpx;
text-align: start; /* 可选:文本居中显示 */
box-sizing: border-box; /* 可选:包含内边距和边框在宽度内 */
}
.text-half-right {
flex: 1; /* 子元素平分容器宽度 */
text-align: end; /* 可选:文本居中显示 */
box-sizing: border-box; /* 可选:包含内边距和边框在宽度内 */
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
}
.text-half-right-status {
flex: 0.3; /* 子元素平分容器宽度 */
text-align: end; /* 可选:文本居中显示 */
box-sizing: border-box; /* 可选:包含内边距和边框在宽度内 */
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
}
.top_title{
color: black;
-webkit-background-clip: text;
position: fixed;
top: 0;
display: flex;
justify-content: center;
height: 100rpx;
margin: 0rpx ;
font-size: 38rpx;
z-index: 9999999;
text-align: center;
width: 100%;
}
.mask-to-read{
color: black;
-webkit-background-clip: text;
position: fixed;
top: 0;
display: flex;
height: 100rpx;
margin: 50rpx 20rpx 10rpx;
height: 50rpx;
font-size: 28rpx;
z-index: 9999999;
}
.pages-a {
width: 100%;
height: 100%;
position: relative;
}

/* 底部安全边距 start*/
.tn-tabbar-height {
min-height: 120rpx;
height: calc(140rpx + env(safe-area-inset-bottom) / 2);
height: calc(140rpx + constant(safe-area-inset-bottom));
}

/* 底部tabbar假阴影 start*/
.bg-tabbar-shadow {
// background-image: repeating-linear-gradient(to top, rgba(0,0,0,0.1) 10rpx, rgba(255,255,255,0) , rgba(255,255,255,0));
box-shadow: 0rpx 0rpx 400rpx 0rpx rgba(0, 0, 0, 0.25);
position: fixed;
bottom: calc(0rpx + env(safe-area-inset-bottom) / 2);
bottom: calc(0rpx + constant(safe-area-inset-bottom));
height: 60rpx;
width: 100vw;
z-index: 0;
}

.tabs-fixed {
position: fixed;
top: 0;
width: 100%;
transition: all 0.25s ease-out;
z-index: 11;
}

.logo-image {
z-index: 9999 !important;
width: 65rpx;
height: 65rpx;
position: relative;
}

.logo-pic {
z-index: 9999 !important;
background-size: cover;
background-repeat: no-repeat;
// background-attachment:fixed;
background-position: top;
border-radius: 50%;
}

/* 旋转 */
.png-sussuspension1 {
animation: suspension1 12s ease-in-out infinite;
}

@keyframes suspension1 {
0% {
transform: rotate(0deg);
}

100% {
transform: rotate(360deg);
}
}

.article-shadow {
border-radius: 15rpx;
box-shadow: 0rpx 0rpx 50rpx 0rpx rgba(85, 170, 255, 0.2);
// position: relative;
}
/* 背景毛玻璃 start */
.bg-frosted-glass {
position: fixed;
left: 0;
top: 0;
width: 100%;
height: 200rpx;
// background-color: rgba(212, 235, 255, 0.5);
background: linear-gradient(0deg, #c5d5ff, #d4ebff, #d4ebff, #d4ebff);
backdrop-filter: blur(20rpx);
z-index: 11;
-webkit-backdrop-filter: blur(20rpx);
}
.tab-bg{
background-color: rgba(0, 0, 0, 0);
background:rgba(0, 0, 0, 0);
}
.status-0-color{
color: coral;
}
.status-1-color{
color: green;
}
.status-2-color{
color: gray;
}
</style>

+ 1
- 1
store/index.js View File

@@ -34,7 +34,7 @@ const store = new Vuex.Store({
// 如果上面从本地获取的lifeData对象下有对应的属性,就赋值给state中对应的变量 // 如果上面从本地获取的lifeData对象下有对应的属性,就赋值给state中对应的变量
// 加上vuex_前缀,是防止变量名冲突,也让人一目了然 // 加上vuex_前缀,是防止变量名冲突,也让人一目了然
vuex_user: lifeData.vuex_user ? lifeData.vuex_user : vuex_user: lifeData.vuex_user ? lifeData.vuex_user :
{forcedLogin: false, hasLogin: false, userId: '', userName: '游客', warehouse: '',
{forcedLogin: false, hasLogin: true, userId: '', userName: '游客', warehouse: '',
companyName:'请登录',factoryId:''}, companyName:'请登录',factoryId:''},
vuex_token: lifeData.vuex_token ? lifeData.vuex_token : {accessToken: '', refreshToken: ''}, vuex_token: lifeData.vuex_token ? lifeData.vuex_token : {accessToken: '', refreshToken: ''},
// 如果vuex_version无需保存到本地永久存储,无需lifeData.vuex_version方式 // 如果vuex_version无需保存到本地永久存储,无需lifeData.vuex_version方式


+ 2
- 2
unpackage/dist/dev/app-plus/app-config-service.js View File

@@ -1,8 +1,8 @@


var isReady=false;var onReadyCallbacks=[]; var isReady=false;var onReadyCallbacks=[];
var isServiceReady=false;var onServiceReadyCallbacks=[]; var isServiceReady=false;var onServiceReadyCallbacks=[];
var __uniConfig = {"pages":["pages/index","pages/main/home/home","pages/main/task/task","pages/main/message/message","pages/main/task/page2/scan_review","pages/login/login","pages/main/my/my","pages/main/my/page2/about"],"window":{"navigationStyle":"custom","navigationBarTextStyle":"black","navigationBarTitleText":"uni-app","navigationBarBackgroundColor":"#F8F8F8","backgroundColor":"#F8F8F8"},"darkmode":false,"nvueCompiler":"uni-app","nvueStyleCompiler":"uni-app","renderer":"auto","splashscreen":{"alwaysShowBeforeRender":true,"autoclose":false},"appname":"TestApp","compilerVersion":"4.41","entryPagePath":"pages/index","networkTimeout":{"request":60000,"connectSocket":60000,"uploadFile":60000,"downloadFile":60000}};
var __uniRoutes = [{"path":"/pages/index","meta":{"isQuit":true},"window":{"navigationBarTitleText":"主页","onReachBottomDistance":50}},{"path":"/pages/main/home/home","meta":{},"window":{"navigationBarTitleText":"统计页","onReachBottomDistance":50}},{"path":"/pages/main/task/task","meta":{},"window":{"navigationBarTitleText":"任务"}},{"path":"/pages/main/message/message","meta":{},"window":{"navigationBarTitleText":"消息"}},{"path":"/pages/main/task/page2/scan_review","meta":{},"window":{"navigationBarTitleText":"扫码复核"}},{"path":"/pages/login/login","meta":{},"window":{"navigationBarTitleText":"登录"}},{"path":"/pages/main/my/my","meta":{},"window":{"navigationBarTitleText":"我的"}},{"path":"/pages/main/my/page2/about","meta":{},"window":{"navigationBarTitleText":"关于"}}];
var __uniConfig = {"pages":["pages/index","pages/main/home/home","pages/main/task/task","pages/main/message/message","pages/main/plan/plan","pages/main/task/page2/scan_review","pages/login/login","pages/main/my/my","pages/main/my/page2/about"],"window":{"navigationStyle":"custom","navigationBarTextStyle":"black","navigationBarTitleText":"uni-app","navigationBarBackgroundColor":"#F8F8F8","backgroundColor":"#F8F8F8"},"darkmode":false,"nvueCompiler":"uni-app","nvueStyleCompiler":"uni-app","renderer":"auto","splashscreen":{"alwaysShowBeforeRender":true,"autoclose":false},"appname":"TestApp","compilerVersion":"4.41","entryPagePath":"pages/index","networkTimeout":{"request":60000,"connectSocket":60000,"uploadFile":60000,"downloadFile":60000}};
var __uniRoutes = [{"path":"/pages/index","meta":{"isQuit":true},"window":{"navigationBarTitleText":"主页","onReachBottomDistance":50}},{"path":"/pages/main/home/home","meta":{},"window":{"navigationBarTitleText":"统计页","onReachBottomDistance":50}},{"path":"/pages/main/task/task","meta":{},"window":{"navigationBarTitleText":"任务"}},{"path":"/pages/main/message/message","meta":{},"window":{"navigationBarTitleText":"消息"}},{"path":"/pages/main/plan/plan","meta":{},"window":{"navigationBarTitleText":"计划"}},{"path":"/pages/main/task/page2/scan_review","meta":{},"window":{"navigationBarTitleText":"扫码复核"}},{"path":"/pages/login/login","meta":{},"window":{"navigationBarTitleText":"登录"}},{"path":"/pages/main/my/my","meta":{},"window":{"navigationBarTitleText":"我的"}},{"path":"/pages/main/my/page2/about","meta":{},"window":{"navigationBarTitleText":"关于"}}];
__uniConfig.onReady=function(callback){if(__uniConfig.ready){callback()}else{onReadyCallbacks.push(callback)}};Object.defineProperty(__uniConfig,"ready",{get:function(){return isReady},set:function(val){isReady=val;if(!isReady){return}const callbacks=onReadyCallbacks.slice(0);onReadyCallbacks.length=0;callbacks.forEach(function(callback){callback()})}}); __uniConfig.onReady=function(callback){if(__uniConfig.ready){callback()}else{onReadyCallbacks.push(callback)}};Object.defineProperty(__uniConfig,"ready",{get:function(){return isReady},set:function(val){isReady=val;if(!isReady){return}const callbacks=onReadyCallbacks.slice(0);onReadyCallbacks.length=0;callbacks.forEach(function(callback){callback()})}});
__uniConfig.onServiceReady=function(callback){if(__uniConfig.serviceReady){callback()}else{onServiceReadyCallbacks.push(callback)}};Object.defineProperty(__uniConfig,"serviceReady",{get:function(){return isServiceReady},set:function(val){isServiceReady=val;if(!isServiceReady){return}const callbacks=onServiceReadyCallbacks.slice(0);onServiceReadyCallbacks.length=0;callbacks.forEach(function(callback){callback()})}}); __uniConfig.onServiceReady=function(callback){if(__uniConfig.serviceReady){callback()}else{onServiceReadyCallbacks.push(callback)}};Object.defineProperty(__uniConfig,"serviceReady",{get:function(){return isServiceReady},set:function(val){isServiceReady=val;if(!isServiceReady){return}const callbacks=onServiceReadyCallbacks.slice(0);onServiceReadyCallbacks.length=0;callbacks.forEach(function(callback){callback()})}});
service.register("uni-app-config",{create(a,b,c){if(!__uniConfig.viewport){var d=b.weex.config.env.scale,e=b.weex.config.env.deviceWidth,f=Math.ceil(e/d);Object.assign(__uniConfig,{viewport:f,defaultFontSize:Math.round(f/20)})}return{instance:{__uniConfig:__uniConfig,__uniRoutes:__uniRoutes,global:void 0,window:void 0,document:void 0,frames:void 0,self:void 0,location:void 0,navigator:void 0,localStorage:void 0,history:void 0,Caches:void 0,screen:void 0,alert:void 0,confirm:void 0,prompt:void 0,fetch:void 0,XMLHttpRequest:void 0,WebSocket:void 0,webkit:void 0,print:void 0}}}}); service.register("uni-app-config",{create(a,b,c){if(!__uniConfig.viewport){var d=b.weex.config.env.scale,e=b.weex.config.env.deviceWidth,f=Math.ceil(e/d);Object.assign(__uniConfig,{viewport:f,defaultFontSize:Math.round(f/20)})}return{instance:{__uniConfig:__uniConfig,__uniRoutes:__uniRoutes,global:void 0,window:void 0,document:void 0,frames:void 0,self:void 0,location:void 0,navigator:void 0,localStorage:void 0,history:void 0,Caches:void 0,screen:void 0,alert:void 0,confirm:void 0,prompt:void 0,fetch:void 0,XMLHttpRequest:void 0,WebSocket:void 0,webkit:void 0,print:void 0}}}});

+ 2103
- 1187
unpackage/dist/dev/app-plus/app-service.js
File diff suppressed because it is too large
View File


+ 2499
- 1581
unpackage/dist/dev/app-plus/app-view.js
File diff suppressed because it is too large
View File


Loading…
Cancel
Save