pnkx-admin-mongo/pnkx-uniapp/pages/index.vue
2024-01-13 13:29:20 +08:00

659 lines
19 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="content">
<!-- 轮播图 -->
<uni-card title="通知公告">
<uni-swiper-dot class="uni-swiper-dot-box" :info="noticeList" :current="current" field="content">
<swiper class="swiper-box" :current="swiperDotIndex" @change="changeSwiper">
<swiper-item v-for="(item, index) in noticeList" :key="index">
<view class="swiper-item" @click="handleOpenNotice(item)">
<image v-if="item.firstPicture" :src="item.firstPicture" mode="aspectFill"
:draggable="false" />
<view v-else class="no-picture">
{{item.remark}}
</view>
<view class="notice-info">
<view class="top">
<uni-tag :text="item.remark" style="white-space: nowrap;"
:type="['', 'success', 'primary', 'warning', 'error'][Math.floor(Math.random()*6)]" />
<text class="notice-title">{{item.noticeTitle}}</text>
</view>
<view class="bottom">
<rich-text :nodes="item.noticeContent"></rich-text>
</view>
</view>
</view>
</swiper-item>
</swiper>
</uni-swiper-dot>
</uni-card>
<!-- 姨妈提醒 -->
<uni-transition ref="ani" custom-class="transition" :mode-class="['fade', 'zoom-in']"
:show="Boolean(menstruation)">
<uni-card title="姨妈提醒" class="menstruation">
<view class="top" v-if="menstruationAssistantSetting.state === 'zjjq'" v-html="menstruation"></view>
<view class="top" v-if="menstruationAssistantSetting.state === 'whyl'">
孕 <text class="theme-red margin-right-xs margin-left-xs">{{ pregnancy[0] }}</text> 周 <text
class="theme-blue margin-right-xs margin-left-xs">{{
pregnancy[1]
}}</text> 天
</view>
<view class="bottom" v-if="menstruationAssistantSetting.state === 'zjjq'">{{ menstruationLabel }}</view>
<view class="bottom theme-grey text-sm" v-if="menstruationAssistantSetting.state === 'whyl'">
已经{{ pregnancy[2] }}了
</view>
</uni-card>
</uni-transition>
<!-- 纪念日 -->
<uni-transition ref="ani" custom-class="transition" :mode-class="['fade', 'zoom-in']"
:show="commemorationDayList.length > 0">
<uni-card title="纪念日">
<uni-list class="commemoration-day">
<uni-list-item v-for="item in commemorationDayList" avatar="../static/icons/svg/404.svg"
:key="item.id">
<template v-slot:header>
<view class="d-flex align-center">
<svg-icon :icon-class="item.icon" />
</view>
</template>
<template v-slot:body>
<view class="d-flex flex-column margin-left margin-right">
<view class="theme-blue text-bold">{{item.name}}</view>
<view class="font-13">
{{item.repeat ? `每年${$parseTime(item.date, '{m}月{d}日')}` : $parseTime(item.date, '{y}年{m}月{d}日')}}
</view>
</view>
</template>
<template v-slot:footer>
<view class="d-flex align-center theme-grey font-11">
还有
<text
class="font-13 theme-red">{{$getTimeDifference(nowTime, (new Date().getFullYear()) + '-' + item.date.slice(5, item.date.length)).slice(0, 1)}}</text>
<text class="font-13 theme-red">{{dateFormatHour(item)}}</text>
小时
</view>
</template>
</uni-list-item>
</uni-list>
</uni-card>
</uni-transition>
<!-- 情侣卡券 -->
<uni-transition ref="ani" custom-class="transition" :mode-class="['fade', 'zoom-in']"
:show="toDoCardList.length > 0">
<uni-card title="情侣卡券">
<uni-list class="card">
<uni-list-item>
<template v-slot:body>
<view class="d-flex">
<text>卡券名称</text>
<text></text>
<text>使用说明</text>
<text>使用时间</text>
</view>
</template>
</uni-list-item>
<uni-list-item v-for="item in toDoCardList" :key="item.id">
<template v-slot:body>
<view class="d-flex">
<text :span="6">{{ item.cardName }}</text>
<text :span="3">
<svg-icon :icon-class="item.userName === '秦可爱' ? 'female' : 'male'"
class="business-icon" />
</text>
<text :span="8">{{ item.instructions }}</text>
<text :span="7">{{ item.createTime }}</text>
</view>
</template>
</uni-list-item>
</uni-list>
</uni-card>
</uni-transition>
<!-- 今日账单 -->
<uni-transition ref="ani" custom-class="transition" :mode-class="['fade', 'zoom-in']"
:show="billList.length > 0">
<uni-card title="今日账单">
<view class="d-flex justify-between">
<text class="left">
<text class="font-24 text-bold">{{ new Date().getDate() }}</text>
<text class="font-13"> / {{ $parseTime(new Date(), '{a}') }}</text>
</text>
<text class="right">
<text v-if="income">
<svg-icon icon-class="加号" />
<text>{{ income | moneyFilter }}</text>
</text>
<text class="income" v-if="expenditure">
<svg-icon icon-class="减少" />
<text>{{ expenditure | moneyFilter }}</text>
</text>
</text>
</view>
<no-data :loading="billLoading" text="暂无记录" v-if="billList.length < 1" />
<uni-list class="bill" v-else>
<uni-list-item v-for="bill in billList" :key="bill.id">
<template v-slot:header>
<view class="d-flex align-center">
<view style="width: 1.5rem;">
<svg-icon size="1.2rem"
:icon-class="Boolean(bill.typeObject) ? bill.typeObject.typeIcon : ''" />
</view>
<view class="d-flex flex-column margin-left margin-right">
<view v-if="bill.typeObject && bill.typeObject.typeDifference === '2'"
class="transfer">
<text>{{ bill.accountObject.accountName }}</text>
<svg-icon class="business-icon" icon-class="右箭头" />
<text>{{ bill.otherAccountObject.accountName }}</text>
</view>
<view v-else>{{ bill.typeObject && bill.typeObject.typeName }}</view>
<view class="font-13 theme-grey">
{{ bill.remark }}
</view>
</view>
</view>
</template>
<template v-slot:footer>
<view class="d-flex align-center theme-blue font-13 text-bold">
{{bill.money | moneyFilter}}
</view>
</template>
</uni-list-item>
</uni-list>
</uni-card>
</uni-transition>
<!-- 今日待办 -->
<uni-transition ref="ani" custom-class="transition" :mode-class="['fade', 'zoom-in']"
:show="toDoList.length > 0">
<uni-card title="今日待办">
<uni-list class="todo">
<uni-list-item v-for="todo in toDoList" :key="todo.id" :title="todo.content" :note="todo.remark" />
</uni-list>
</uni-card>
</uni-transition>
<!-- 悬浮按钮 -->
<uni-fab ref="fab" :popMenu="popMenu" :pattern="pattern" :content="content" horizontal="right"
direction="vertical" @trigger="trigger" />
<!-- 更新app -->
<!-- APP下载 -->
<uni-popup ref="updateDialog" type="dialog">
<uni-popup-dialog type="info" confirmText="后台下载" title="正在下载" @confirm="backgroundDownload">
<view>下载进度<text class="theme-blue" style="padding: 0 0.2rem">{{ percentageNum }}</text>%</view>
</uni-popup-dialog>
</uni-popup>
</view>
</template>
<script>
import {
listNotice
} from '@/api/system/notice';
import {
getLastStartDate,
selectMenstruationRecordList
} from '@/api/px/life/menstruationRecord';
import {
getCommemorationDayList
} from '@/api/px/life/commemorationDay';
import {
getToDoCard
} from "@/api/px/life/card";
import {
listDo
} from '@/api/px/life/todo';
import {
listRecord
} from '@/api/px/life/bookkeeping/record';
import {
getAdminNewestAppInfo
} from "@/api/px/app";
export default {
data() {
return {
// 当前所在滑块的 index
current: 0,
// 当前所在滑块的 index
swiperDotIndex: 0,
// 当前时间
nowTime: this.$parseTime(new Date()),
// 通知列表
noticeList: uni.getStorageSync('homepageNoticeList') || [],
// 姨妈提醒时间
menstruation: '',
// 姨妈时间
pregnancy: [0, 0, ''],
// 姨妈提醒内容
menstruationLabel: '',
// 经期设置表单
menstruationAssistantSetting: {
state: '',
cycle: undefined,
duration: undefined
},
// 纪念日提醒
commemorationDayList: [],
// 情侣卡券使用历史
toDoCardList: [],
// 待办列表
toDoList: [],
// 今日总支出
expenditure: 0,
// 今日总收入
income: 0,
// 账单加载标志
billLoading: false,
// 账单列表
billList: uni.getStorageSync('homepageBillList') || [],
// 安装包下载进度
percentageNum: 0,
// 悬浮按钮
popMenu: true,
// 悬浮按钮配置
pattern: {
color: '#a1a1a1',
backgroundColor: '#FFFFFF',
selectedColor: '#5A8DEE',
buttonColor: '#5A8DEE',
iconColor: '#FFFFFF'
},
// 悬浮按钮菜单
content: [{
iconPath: '/static/icons/svg/搜索.svg',
selectedIconPath: '/static/icons/svg/搜索.svg',
text: '搜索',
active: false
},
{
iconPath: '/static/icons/svg/时间-time.svg',
selectedIconPath: '/static/icons/svg/时间-time.svg',
text: '写日记',
active: false
},
{
iconPath: '/static/icons/svg/account.svg',
selectedIconPath: '/static/icons/svg/account.svg',
text: '记账',
active: false
}
]
}
},
onLoad() {
this.getNoticeList();
this.getMenstruationRecordList();
this.getLastStartDate();
this.getCommemorationDayList();
this.getToDoCard();
this.getBillList();
this.getTodayToDoList();
},
mounted() {
if (window.plus) {
this.plusReady();
} else {
document.addEventListener('plusready', this.plusReady, false);
}
},
methods: {
/**
* 格式化时间
*/
dateFormatHour(item) {
let date = this.$getTimeDifference(this.nowTime, (new Date().getFullYear()) + '-' + item.date.slice(5, item
.date.length));
return date.slice(date.indexOf('天') + 1, date.indexOf('小'))
},
/**
* 后台下载
*/
backgroundDownload() {
this.$refs.updateDialog.close();
},
/**
* 查询公告列表
*/
getNoticeList() {
const regex = /(<([^>]+)>)/ig;
listNotice().then(response => {
this.noticeList = response.rows;
this.noticeList.map(item => {
if (item.firstPicture) {
item.firstPicture = item.firstPicture.slice(10, item.firstPicture.indexOf(
' alt') - 1)
}
return item
})
this.noticeList.forEach(item => {
item.noticeContent = item.noticeContent.replace(regex, '')
});
uni.setStorageSync('homepageNoticeList', this.noticeList)
})
},
/**
* 打开通知公告详情
* @param {Object} item
*/
handleOpenNotice(item) {
console.info(item)
},
/**
* 切换通知公告
* @param {Object} e
*/
changeSwiper(e) {
this.current = e.detail.current
},
/**
* 获取姨妈提醒
*/
async getMenstruationRecordList() {
this.$getConfigKey("ymdqzt").then(response => {
this.menstruationAssistantSetting.state = response.msg;
});
await this.$getConfigKey("ymzq").then(response => {
this.menstruationAssistantSetting.cycle = response.msg;
});
await this.$getConfigKey("ymsc").then(response => {
this.menstruationAssistantSetting.duration = response.msg;
});
selectMenstruationRecordList().then(res => {
let prefix = '您的小可爱'
let labelPrefix = '请提醒您的小可爱'
if (res.data[0].type === '0') {
let day = this.$getTimeDifference(res.data[0].date, this.nowTime).slice(0, this
.$getTimeDifference(res.data[0].date, this.nowTime).indexOf('天'));
this.menstruation =
`${prefix}大姨妈已经<span class="theme-blue" style="font-weight: bold;"> ${Number(day) + 1} </span>天`;
this.menstruationLabel = `${labelPrefix}不要吃冰的、辣的,注意保暖、少生气!!!`
} else if (res.data[0].type === '1') {
let day = this.$getTimeDifference(this.nowTime, res.data[1].date).slice(0, this
.$getTimeDifference(this.nowTime, res.data[1].date).indexOf('天'));
if (Number(day) + Number(this.menstruationAssistantSetting.cycle) > 5 && Number(day) +
Number(this.menstruationAssistantSetting.cycle) <= Number(this
.menstruationAssistantSetting.cycle)) {
return
}
if (Number(day) + Number(this.menstruationAssistantSetting.cycle) < 0) {
this.menstruation =
`${prefix}大姨妈已经推迟<span class="theme-red" style="font-weight: bold; font-size: 1.4rem;"> ${(Number(day) + Number(this.menstruationAssistantSetting.cycle)) * (-1)} </span>天`
this.menstruationLabel = `${labelPrefix}不要着急,大不了养个娃!!!`
return
}
this.menstruation =
`${prefix}大姨妈还有<span class="theme-blue" style="font-weight: bold;"> ${Number(day) + Number(this.menstruationAssistantSetting.cycle) + 1} </span>`
this.menstruationLabel = `${labelPrefix}提前准备好姨妈巾`
}
})
},
/**
* 获取最后一次开始信息
*/
getLastStartDate() {
getLastStartDate().then(res => {
let timeDifference = this.$getTimeDifference(res.data.date).slice(0, 8);
let day = timeDifference.slice(0, timeDifference.indexOf('天'));
this.pregnancy = [Math.floor(day / 7), day % 7, timeDifference];
})
},
/**
* 获取纪念日提醒
*/
getCommemorationDayList() {
getCommemorationDayList().then(res => {
this.commemorationDayList = res.data;
})
},
/**
* 获取使用历史记录列表
*/
getToDoCard() {
getToDoCard().then(res => {
this.toDoCardList = res.data;
})
},
/**
* 获取今日待办
*/
getTodayToDoList() {
listDo({
planEndTime: this.$getNow(),
performer: this.$store.getters.userId,
status: false
}).then(res => {
this.toDoList = res.rows;
})
},
/**
* 获取今日账单
*/
getBillList() {
this.billLoading = true;
listRecord({
version: 1
}).then(res => {
this.expenditure = this.$arraySum(res.rows.filter(r => {
return r.typeObject?.typeDifference === '1'
}), 'money');
this.income = this.$arraySum(res.rows.filter(r => {
return r.typeObject?.typeDifference === '0'
}), 'money')
this.billList = res.rows;
this.billLoading = false;
})
},
/**
* 选择菜单
*/
trigger(e) {
this.content[e.index].active = true;
uni.navigateTo({
url: '/pages_system/search/index'
}).finally(() => {
this.$refs.fab.close();
this.content[e.index].active = false;
});
},
/**
* 推送信息
*/
plusReady() {
plus.push.createMessage(`欢迎${this.$store.getters.userInfo.nickName}使用Pei你看雪App`);
plus.runtime.getProperty(plus.runtime.appid, (info) => {
// 获取最新版本
getAdminNewestAppInfo().then(res => {
if (res.data.version !== info.version) {
const task = plus.downloader.createDownload(res.data.downloadUrl, {}, (d,
status) => {
if (status === 200) {
console.log("下载更新成功:" + d.filename);
this.installWgt(d.filename);
} else {
console.log("下载更新失败!");
plus.nativeUI.toast("下载更新失败!");
}
plus.nativeUI.closeWaiting();
});
task.start();
// 下载时实时显示下载进度
let prg = 0;
this.showProgress = true;
task.addEventListener('statechanged', (task, status) => {
// 给下载任务设置一个监听 并根据状态 做操作
switch (task.state) {
case 1:
//'正在下载';
plus.push.createMessage(`正在下载···`);
break;
case 2:
// '已连接到服务器';
plus.push.createMessage(`已连接到服务器···`);
break;
case 3:
prg = parseInt(
(parseFloat(task.downloadedSize) /
parseFloat(task.totalSize)) *
100
);
this.percentageNum = prg; // 赋值给进度条组件
break;
case 4:
this.showProgress = false; // 进度隐藏
break;
}
});
}
})
});
},
/**
* 下载
* @param path
*/
installWgt(path) {
plus.nativeUI.showWaiting("安装更新");
plus.runtime.install(path, {}, () => {
plus.nativeUI.closeWaiting();
console.log("安装更新成功!");
plus.nativeUI.alert("更新完成!", () => {
plus.runtime.restart(); //安装成功后重启应用
});
}, (e) => {
plus.nativeUI.closeWaiting();
console.log("安装更新失败![" + e.code + "]" + e.message);
plus.nativeUI.toast("安装更新失败!");
});
},
}
}
</script>
<style lang="scss" scoped>
.content {
padding-bottom: 1rem;
}
.swiper-box {
// height: 400rpx;
}
.swiper-item {
display: flex;
align-items: center;
uni-image {
width: 6rem;
height: 6rem;
border-radius: 0.5rem;
overflow: hidden;
border: 1px solid hsla(0, 0%, 60%, .2196078431372549);
display: flex;
align-items: center;
justify-content: center;
}
.no-picture {
width: 6rem;
height: 6rem;
display: flex;
align-items: center;
justify-content: center;
font-weight: bold;
color: #5A8DEE;
border-radius: 0.5rem;
border: 1px solid hsla(0, 0%, 60%, .2196078431372549);
}
.notice-info {
padding: 1rem;
flex: 1;
.top {
display: flex;
align-items: center;
.uni-tag {
white-space: nowrap;
}
.notice-title {
color: #605e5e;
margin-left: 1rem;
}
}
.bottom {
font-size: 0.9rem;
color: #999;
height: 5rem;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
padding: 0.5rem 0;
overflow: hidden;
}
}
}
@media screen and (min-width: 500px) {
.uni-swiper-dot-box {
width: 400px;
/* #ifndef APP-NVUE */
margin: 0 auto;
/* #endif */
margin-top: 8px;
}
}
// 姨妈提醒
.menstruation {
padding: 1rem;
.top {
font-size: 1.2rem;
}
.bottom {
color: $theme-blue;
margin-top: 0.5rem;
}
.top,
.bottom {
text-align: center;
}
}
// 纪念日
.commemoration-day {
::v-deep .uni-list-item__container {
justify-content: space-between;
}
}
// 账单
.bill {
::v-deep .uni-list-item__container {
justify-content: space-between;
}
}
// 待办
.todo {
::v-deep .uni-list-item__content-note {
display: -webkit-box;
-webkit-box-orient: vertical;
/*截取第三行*/
-webkit-line-clamp: 2;
overflow: hidden;
}
}
</style>