Browse Source

feat: 广告页、引导页

test2
xuesinan 4 years ago
parent
commit
fe87d006d2
  1. 15
      App.vue
  2. 43
      CHANGELOG.md
  3. 10
      apis/project.js
  4. 7
      apis/role.js
  5. 17
      apis/task.js
  6. BIN
      common/img/adv.jpg
  7. 2
      components/Reviewer/Reviewer.vue
  8. 1
      hooks/project/useInit.js
  9. 81
      pages/guide/adv.vue
  10. 70
      pages/guide/guide.vue
  11. 326
      pages/index/index.vue
  12. 14
      store/index.js
  13. 64
      utils/cache.js
  14. 20
      utils/cacheAndRequest.js

15
App.vue

@ -43,7 +43,7 @@ export default {
// const token = await this.getToken();
// this.noPhone(this.$store.state.user.phone);
this.$store.dispatch('socket/initSocket');
// this.$store.dispatch('socket/initSocket');
},
methods: {
@ -55,12 +55,13 @@ export default {
* 查询广告页和引导页并缓存
*/
async getGuide(type) {
try {
const res = await uni.$u.api.getGuide(type);
type === 0 ? uni.$storage.setStorageSync('guide', res) : uni.$storage.setStorageSync('advs', res);
} catch (error) {
throw error;
}
uni.$catchReq.getGuide(type, (err, data) => {
if (err) {
console.error('err: ', err);
} else {
type === 0 ? this.$store.commit('setGuide', data) : this.$store.commit('setAdvs', data);
}
})
},
/**

43
CHANGELOG.md

@ -1,21 +1,26 @@
# 1.0.0 (2022-01-25)
# 1.0.0 (2022-01-26)
### 🌟 新功能
范围|描述|commitId
--|--|--
- | 表单验证 | [8f3bc1e](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/8f3bc1e)
- | 财务条插件的进度条和上方悬浮按钮界面 | [8322e92](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/8322e92)
财务 | 细节调整;根据任务获取财务条信息 | [414106a](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/414106a)
- | 插件的填写提交,编辑与删除 | [84390d5](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/84390d5)
- | 插件的填写与提交,修改与删除 | [d461252](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/d461252)
- | 插件面板分开显示 | [fb5e86b](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/fb5e86b)
- | 登录、日历页小绿点、二级项目列表 | [e676cf0](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/e676cf0)
- | 更新代码 | [392c8cc](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/392c8cc)
- | 广告页、引导页 | [1c89806](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/1c89806)
- | 获取交付物信息 | [5ae68e2](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/5ae68e2)
- | 获取手机唯一码 | [3f60cf8](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/3f60cf8)
- | 将时间轴改成swiper滑动 | [12384f9](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/12384f9)
- | 日历页首页 | [561c8e6](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/561c8e6)
- | 日历页添加 | [1b46a91](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/1b46a91)
- | 设置项目域名 | [1a835f1](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/1a835f1)
- | 设置状态栏 | [9871356](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/9871356)
- | 审核插件的基本信息展示 | [aa4f17f](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/aa4f17f)
- | 审核插件的通过与驳回功能 | [03a7c35](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/03a7c35)
- | 时间轴接口 | [a95d005](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/a95d005)
- | 时间轴页面 | [e926b75](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/e926b75)
- | 时间轴展示 | [8b1b380](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/8b1b380)
@ -34,6 +39,7 @@
- | 主体颜色 | [bb5c0e3](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/bb5c0e3)
- | 注册、用户协议 | [68e9189](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/68e9189)
- | app.vue | [970cf9a](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/970cf9a)
deliver 交付物 | 点击交付物链接webview打开链接 | [daa59f1](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/daa59f1)
- | first commit | [8dc26de](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/8dc26de)
- | get请求 | [3a61439](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/3a61439)
project | 日常任务面板添加 | [b3f16ff](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/b3f16ff)
@ -45,7 +51,11 @@
### 🎨 代码样式
范围|描述|commitId
--|--|--
- | 插件样式调整 | [7411d3a](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/7411d3a)
- | 更新代码 | [aa6093a](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/aa6093a)
- | 交付物相关细节调整 | [87ae00d](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/87ae00d)
- | 细节调整 | [ebf678f](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/ebf678f)
- | 细节调整 | [759ef52](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/759ef52)
- | 细节调整 | [bdd5f87](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/bdd5f87)
- | calender格式及细节调整 | [db9602b](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/db9602b)
@ -54,6 +64,8 @@
范围|描述|commitId
--|--|--
- | 插件接口修改 | [53c6b90](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/53c6b90)
交付物 | 修复检查人选择组件之间相互影响的bug | [435c0bd](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/435c0bd)
交付物 | 重构交付物审核部分,修复审核bug | [5fd8889](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/5fd8889)
- | 解决warning | [dcb0079](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/dcb0079)
- | 日历列表H5在手机端不显示 | [0b4ae72](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/0b4ae72)
- | 删除多余的引入 | [050b12a](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/050b12a)
@ -61,12 +73,20 @@
- | 时间轴任务 | [98abdf6](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/98abdf6)
- | 项目列表排序 | [ad0ce75](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/ad0ce75)
- | 修复一些内容 | [3cdb1ce](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/3cdb1ce)
- | 修复p-deliver报错taskRef的问题 | [880cf7c](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/880cf7c)
- | 子组件传参 | [489e218](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/489e218)
app.vue | 修复获取token报错的问题 | [9120d54](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/9120d54)
createTask | 修复createTask v-model的问题 | [b20d3f0](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/b20d3f0)
- | defineExpose, defineEmits不需要引入 | [902cacc](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/902cacc)
### 📝 文档
范围|描述|commitId
--|--|--
- | 添加交付物http测试文件 | [0b7e6ab](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/0b7e6ab)
- | deliver http 文件更新 | [568115c](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/568115c)
### 📦 持续集成
范围|描述|commitId
--|--|--
@ -89,8 +109,29 @@
### 🔨 代码重构
范围|描述|commitId
--|--|--
- | 查看提交历史记录页面数据同步更新 | [749cb10](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/749cb10)
- | 调整进度条样式 | [b142651](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/b142651)
- | 交付物插件代码审查 | [5f4d47b](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/5f4d47b)
- | 交付物代码整理重构 未完 | [d7c6e51](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/d7c6e51)
交付物 | 调整交付物细节;完善逻辑 | [25ccd36](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/25ccd36)
- | 审查接口核对完成 | [43ae604](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/43ae604)
- | 审核插件的基本信息展示 | [4f2815f](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/4f2815f)
- | 审核记录查看 | [915aa06](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/915aa06)
- | 审核记录查看 | [121d43f](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/121d43f)
- | 提交交付物,查看提交记录,修改交付物标题的接口核对完成 | [7c08530](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/7c08530)
- | 提交交付物,修改交付物名称,查看交付物历史记录接口完成 | [f222bdf](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/f222bdf)
- | 提取deliver store;细节调整 | [4d901ac](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/4d901ac)
- | 完善历史记录页面和修改插件的TODO | [3d58c15](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/3d58c15)
- | 细节调整 | [7f9cf1f](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/7f9cf1f)
- | 细节调整 | [3d1c463](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/3d1c463)
- | 项目列表 | [0486e98](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/0486e98)
- | 修改插件名的输入框和查看历史记录 | [99fb88e](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/99fb88e)
- | 修改错误单词‘confirmDeleDte’ | [ddbb04c](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/ddbb04c)
- | 原有功能提交别的分支 | [eb02b72](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/eb02b72)
- | 重构财务条组件;添加财务mock | [03a1cdb](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/03a1cdb)
- | 重构project init 部分 | [c7bf2df](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/c7bf2df)
api | 调整mock api放入mock.js下;main中加入环境变量的判断 | [053ac31](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/053ac31)
- | deliver检查人重构;更新真实数据的检查人 | [ce808c4](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/ce808c4)
- | project init 重构 | [2457a87](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/2457a87)

10
apis/project.js

@ -1,16 +1,16 @@
import store from '@/store/index.js';
import { computed } from 'vue';
const domain = store.state.domain;
const domain = computed(() => store.state.domain);
export function setupProject(app) {
uni.$u.api = { ...uni.$u.api } || {};
//根据id获取项目信息
uni.$u.api.findProjectById = param => uni.$u.post(`${domain}/project/findProjectById`, param);
uni.$u.api.findProjectById = param => uni.$u.post(`${domain.value}/tall/project/findProjectById`, param);
//创建分享连接
uni.$u.api.createShare = param => uni.$u.post(`${domain}/share/create`, param);
uni.$u.api.createShare = param => uni.$u.post(`${domain.value}/share/create`, param);
//点击分享连接
uni.$u.api.clickShare = param => uni.$u.post(`${domain}/share/click`, param);
uni.$u.api.clickShare = param => uni.$u.post(`${domain.value}/share/click`, param);
};

7
apis/role.js

@ -1,11 +1,12 @@
import store from '@/store/index.js';
import { computed } from 'vue';
const domain = store.state.domain;
const domain = computed(() => store.state.domain);
export function setupRole(app) {
uni.$u.api = { ...uni.$u.api } || {};
//根据项目id查找角色
uni.$u.api.findShowRole = param => uni.$u.post(`${domain}/role/show`, param);
uni.$u.api.findShowRole = param => uni.$u.post(`${domain.value}/tall/role/show`, param);
//根据项目id查找所有成员
uni.$u.api.queryChecker = param => uni.$u.post(`${domain}/deliver/queryChecker`, param);
uni.$u.api.queryChecker = param => uni.$u.post(`${domain.value}/deliver/queryChecker`, param);
};

17
apis/task.js

@ -1,19 +1,20 @@
import store from '@/store/index.js';
import { computed } from 'vue';
const domain = store.state.domain;
const domain = computed(() => store.state.domain);
export function setupTask(app) {
uni.$u.api = { ...uni.$u.api } || {};
uni.$u.api.getGlobal = param => uni.$u.post(`${domain}/task/global`, param);
uni.$u.api.getPermanent = param => uni.$u.post(`${domain}/task/permanent`, param);
uni.$u.api.getGlobal = param => uni.$u.post(`${domain.value}/tall/task/global`, param);
uni.$u.api.getPermanent = param => uni.$u.post(`${domain.value}/tall/task/permanent`, param);
//根据时间基准点和角色查找定期任务
uni.$u.api.getRegularTask = param => uni.$u.post(`${domain}/task/regular`, param);
uni.$u.api.getRegularTask = param => uni.$u.post(`${domain.value}/tall/task/regular`, param);
//修改任务状态
uni.$u.api.updateTaskType = param => uni.$u.post(`${domain}/task/type`, param);
uni.$u.api.updateTaskType = param => uni.$u.post(`${domain.value}/task/type`, param);
//新建任务
uni.$u.api.saveTask = param => uni.$u.post(`${domain}/task/save`, param);
uni.$u.api.saveTask = param => uni.$u.post(`${domain.value}/task/save`, param);
//克隆任务
uni.$u.api.cloneTask = param => uni.$u.post(`${domain}/task/clone`, param);
uni.$u.api.cloneTask = param => uni.$u.post(`${domain.value}/task/clone`, param);
//模糊查询 查找项目下的任务
uni.$u.api.queryTaskOfProject = param => uni.$u.post(`${domain}/task/queryTaskOfProject`, param);
uni.$u.api.queryTaskOfProject = param => uni.$u.post(`${domain.value}/task/queryTaskOfProject`, param);
};

BIN
common/img/adv.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 515 KiB

2
components/Reviewer/Reviewer.vue

@ -31,7 +31,7 @@
</template>
<script setup>
import { ref, computed, defineExpose } from 'vue';
import { ref, computed } from 'vue';
import { useStore } from 'vuex';
const store = useStore();

1
hooks/project/useInit.js

@ -8,6 +8,7 @@ export default function useInit() {
const allTasks = computed(() => store.state.task.allTasks);
onLoad(options => {
store.commit('setDomain', options.url);
if (options.share && options.share === '1') {
shareInit(options);
} else {

81
pages/guide/adv.vue

@ -1,8 +1,44 @@
<template>
广告页
<template>
<view class="adv-box relative">
<swiper v-if="imgs.length > 0" class="swiper" :indicator-dots="indicatorDots" :autoplay="autoplay" circular="true">
<swiper-item v-for="(item, index) in imgs" :key="index">
<view class="swiper-item">
<image :src="item"></image>
</view>
</swiper-item>
</swiper>
<image v-else src="/common/img/adv.jpg"></image>
<view class="time-box absolute">{{ time === 0 ? '跳过广告' : time + 's' }}</view>
</view>
</template>
<script setup>
<script setup>
import { ref, computed, watch } from 'vue';
import { useStore } from 'vuex';
const store = useStore();
const indicatorDots = true;
const autoplay = true;
const advs = computed(() => store.state.advs);
const imgs = ref([]);
if (advs.value) {
imgs.value = JSON.parse(advs.value);
}
watch(advs, () => {
imgs.value = JSON.parse(advs.value);
})
const time = ref(10);
let timer = setInterval(() => {
time.value--;
if (time.value === 0) clearInterval(timer);
}, 1000);
setTimeout(() => {
// App
let openNum = uni.$storage.getStorageSync('fistOpenApp');
@ -16,8 +52,43 @@
url: '/pages/guide/guide'
})
}
}, 3000);
}, 10000);
</script>
<style>
<style lang="scss" scoped>
.adv-box {
width: 100%;
height: 100%;
}
.swiper {
height: 100%;
}
.swiper-item {
width: 100%;
height: 100%;
image {
width: 100%;
height: 100%;
object-fit: cover;
}
}
.time-box {
top: 10px;
right: 10px;
display: inline-block;
width: 60px;
height: 24px;
line-height: 22px;
font-size: 12px;
text-align: center;
background-color: rgba(255, 255, 255, .7);
border-radius: 12px;
color: #FFFFFF;
border: 1px solid rgba(255, 255, 255, .8);
}
</style>

70
pages/guide/guide.vue

@ -4,30 +4,72 @@
<!-- indicator-active-color 当前选中的指示点颜色 -->
<swiper class="swiper" :indicator-dots="indicatorDots" :autoplay="autoplay">
<swiper-item>
<view class="swiper-item uni-bg-red">
A
</view>
</swiper-item>
<swiper-item>
<view class="swiper-item uni-bg-green">B</view>
</swiper-item>
<swiper-item>
<view class="swiper-item uni-bg-blue">C</view>
<swiper-item v-for="(item, index) in imgs" :key="index">
<view class="swiper-item relative">
<image :src="item"></image>
<u-button class="btn absolute" v-if="index === imgs.length - 1" @click="toIndex">点击进入APP</u-button>
</view>
</swiper-item>
</swiper>
</template>
<script setup>
import { ref } from 'vue';
const background = ref(['color1', 'color2', 'color3']);
import { ref, computed, watch } from 'vue';
import { useStore } from 'vuex';
const store = useStore();
const indicatorDots = true;
const autoplay = false;
const autoplay = false;
const guide = computed(() => store.state.guide);
const imgs = ref([]);
if (guide.value) {
imgs.value = JSON.parse(guide.value);
}
watch(guide, () => {
imgs.value = JSON.parse(guide.value);
})
function toIndex() {
uni.navigateTo({
url: '/pages/index/index'
})
}
</script>
<style lang="scss" scoped>
.swiper {
height: 100%;
}
.swiper-item {
width: 100%;
height: 100%;
image {
width: 100%;
height: 100%;
object-fit: cover;
}
.btn {
bottom: 200px;
display: inline-block;
height: 40px;
line-height: 38px;
background-color: #ECF5FF;
left: 50%;
transform: translateX(-50%);
border-radius: 20px;
color: #2B85E4;
border: 1px solid #2B85E4;
&:after {
border: none;
}
}
}
</style>

326
pages/index/index.vue

@ -1,163 +1,165 @@
<template>
<!-- 这里是适配的状态栏的代码 -->
<view class="statbar">
<view class="status_bar"></view>
</view>
<!-- <view class="flex flex-col h-full bg-gray-50" @click="openAuth"> -->
<theme class="flex flex-col h-full bg-gray-50">
<view class="relative">
<!-- <view class="relative" @touchmove="onMove"> -->
<!-- 日历 -->
<Calendar @selected-change="onDateChange" :show-back="true" ref="calendar" @handleFindPoint="handleFindPoint" />
<!-- 上传 导入wbs -->
<Upload @success="onUploadSuccess" @error="onUploadError" />
</view>
<u-button class="mt-4" @click="toLogin">登录</u-button>
<!-- 项目列表 -->
<Projects @getProjects="getProjects" class="flex-1 overflow-y-auto" />
<!-- 全局提示框 -->
<u-top-tips ref="uTips"></u-top-tips>
</theme>
</template>
<script setup>
import { reactive, computed, watchEffect, ref } from 'vue';
import { useStore } from 'vuex';
import dayjs from 'dayjs';
const store = useStore();
const token = computed(() => store.state.user.token);
const uTips = ref(null);
const data = reactive({
calendar: null,
// days: [],
});
getProjects();
handleFindPoint();
// token
// watchEffect(() => {
// if (!token.value) return;
// if (token.value) {
// getProjects();
// handleFindPoint();
// }
// });
//
function getProjects(start = dayjs().startOf('day').valueOf(), end = dayjs().endOf('day').valueOf()) {
uni.$catchReq.getProjects(start, end, (err, data) => {
if (err) {
console.error('err: ', err);
} else {
data.forEach(item => {
item.show = false;
});
store.commit('project/setProjects', data);
}
});
}
async function handleFindPoint(start, end) {
try {
const startTime = start || dayjs().startOf('month').valueOf();
const endTime = end || dayjs().endOf('month').valueOf();
const res = await uni.$u.api.findRedPoint(startTime, endTime);
store.commit('project/setDotList', res);
} catch (error) {
console.log('error: ', error);
}
}
//
const onDateChange = event => {
const day = dayjs(event.fullDate);
const start = day.startOf('date').valueOf();
const end = day.endOf('date').valueOf();
getProjects(start, end);
};
//
const onUploadSuccess = () => {
uni.$ui.showToast('导入成功,即将打开新项目', 3000);
// uTips.show({
// title: '',
// type: 'success',
// duration: '3000',
// });
};
//
const onUploadError = error => {
uni.$ui.showToast('导入失败', 6000);
// uTips.show({
// title: error || '',
// type: 'error',
// duration: '6000',
// });
};
// /
// function onMove(event) {
// const y = event.changedTouches[0].pageY;
// const prevY = 0;
// if (y - prevY > 0) {
// // weekMode=true weekMode=false
// data.calendar.weekMode && (data.calendar.weekMode = false);
// } else if (y - prevY < 0) {
// // weekMode=false weekMode=true
// !data.calendar.weekMode && (data.calendar.weekMode = true);
// }
// prevY = y;
// data.calendar.initDate();
// }
function toLogin() {
uni.navigateTo({ url: '/pages/user/login' });
}
</script>
<style lang="scss" scoped>
.statbar {
width: 750rpx;
height: var(--status-bar-height);
.status_bar {
height: var(--status-bar-height);
width: 100%;
position: absolute;
}
}
.content {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.logo {
height: 200rpx;
width: 200rpx;
margin-top: 200rpx;
margin-left: auto;
margin-right: auto;
margin-bottom: 50rpx;
}
.text-area {
display: flex;
justify-content: center;
}
.title {
font-size: 36rpx;
color: #8f8f94;
}
<template>
<!-- 这里是适配的状态栏的代码 -->
<view class="statbar">
<view class="status_bar"></view>
</view>
<!-- <view class="flex flex-col h-full bg-gray-50" @click="openAuth"> -->
<theme class="flex flex-col h-full bg-gray-50">
<view class="relative">
<!-- <view class="relative" @touchmove="onMove"> -->
<!-- 日历 -->
<Calendar @selected-change="onDateChange" :show-back="true" ref="calendar" @handleFindPoint="handleFindPoint" />
<!-- 上传 导入wbs -->
<Upload @success="onUploadSuccess" @error="onUploadError" />
</view>
<u-button class="mt-4" @click="toLogin">登录</u-button>
<!-- 项目列表 -->
<Projects @getProjects="getProjects" class="flex-1 overflow-y-auto" />
<!-- 全局提示框 -->
<u-top-tips ref="uTips"></u-top-tips>
</theme>
</template>
<script setup>
import { reactive, computed, watchEffect, ref } from 'vue';
import { useStore } from 'vuex';
import dayjs from 'dayjs';
const store = useStore();
const token = computed(() => store.state.user.token);
const uTips = ref(null);
const data = reactive({
calendar: null,
// days: [],
});
getProjects();
handleFindPoint();
// token
// watchEffect(() => {
// if (!token.value) return;
// if (token.value) {
// getProjects();
// handleFindPoint();
// }
// });
//
function getProjects(start = dayjs().startOf('day').valueOf(), end = dayjs().endOf('day').valueOf()) {
uni.$catchReq.getProjects(start, end, (err, data) => {
if (err) {
console.error('err: ', err);
} else {
data.forEach(item => {
item.show = false;
});
store.commit('project/setProjects', data);
}
});
}
async function handleFindPoint(start, end) {
try {
const startTime = start || dayjs().startOf('month').valueOf();
const endTime = end || dayjs().endOf('month').valueOf();
const res = await uni.$u.api.findRedPoint(startTime, endTime);
store.commit('project/setDotList', res);
} catch (error) {
console.log('error: ', error);
}
}
//
const onDateChange = event => {
const day = dayjs(event.fullDate);
const start = day.startOf('date').valueOf();
const end = day.endOf('date').valueOf();
getProjects(start, end);
};
//
const onUploadSuccess = () => {
uni.$ui.showToast('导入成功,即将打开新项目', 3000);
// uTips.show({
// title: '',
// type: 'success',
// duration: '3000',
// });
};
//
const onUploadError = error => {
uni.$ui.showToast('导入失败', 6000);
// uTips.show({
// title: error || '',
// type: 'error',
// duration: '6000',
// });
};
// /
// function onMove(event) {
// const y = event.changedTouches[0].pageY;
// const prevY = 0;
// if (y - prevY > 0) {
// // weekMode=true weekMode=false
// data.calendar.weekMode && (data.calendar.weekMode = false);
// } else if (y - prevY < 0) {
// // weekMode=false weekMode=true
// !data.calendar.weekMode && (data.calendar.weekMode = true);
// }
// prevY = y;
// data.calendar.initDate();
// }
function toLogin() {
uni.navigateTo({
url: '/pages/user/login'
});
}
</script>
<style lang="scss" scoped>
.statbar {
width: 750rpx;
height: var(--status-bar-height);
.status_bar {
height: var(--status-bar-height);
width: 100%;
position: absolute;
}
}
.content {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.logo {
height: 200rpx;
width: 200rpx;
margin-top: 200rpx;
margin-left: auto;
margin-right: auto;
margin-bottom: 50rpx;
}
.text-area {
display: flex;
justify-content: center;
}
.title {
font-size: 36rpx;
color: #8f8f94;
}
</style>

14
store/index.js

@ -16,6 +16,8 @@ const state = {
systemInfo: null, // 系统设备信息
count: 3, // 后台出错,多次返回错误的token信息导致的死循环,用count来阻止死循环
domain: `${Config.apiUrl}/defaultwbs`, // 项目跳转域名
guide: '', // 引导页图片json
advs: '', // 广告图片json
};
const getters = {
@ -63,7 +65,7 @@ const mutations = {
setCount(state, data) {
state.count = data;
},
/**
* 设置域名
* @param {Object} state
@ -71,7 +73,15 @@ const mutations = {
*/
setDomain(state, data) {
state.domain = data;
}
},
setGuide(state, data) {
state.guide = data;
},
setAdvs(state, data) {
state.advs = data;
},
};
export default createStore({

64
utils/cache.js

@ -10,7 +10,7 @@ export const filter = {
if (!data || !data.length) return [];
return data.filter(item => start <= +item.endTime && end >= +item.startTime);
},
/**
* 角色 过滤获取到的数据 根据开始截止时间
* @param {object} data 缓存拿到的数据
@ -20,7 +20,7 @@ export const filter = {
// if (!data) return [];
// return data;
// },
/**
* 日常任务 过滤获取到的数据 根据开始截止时间
* @param {object} data 缓存拿到的数据
@ -32,7 +32,7 @@ export const filter = {
// TODO: 缺少通过时间颗粒度筛选数据 任务没有返回时间颗粒度标签
return data.filter(item => timeNode <= +item.endTime && timeNode >= +item.startTime);
},
/**
* 永久日常任务 过滤获取到的数据 根据开始截止时间
* @param {object} data 缓存拿到的数据
@ -42,7 +42,7 @@ export const filter = {
if (!data || !data.length) return [];
return data;
},
/**
* 定期任务 过滤获取到的数据 根据开始截止时间
* @param {object} data 缓存拿到的数据
@ -61,7 +61,7 @@ export const filter = {
let start = uni.$t.time.add(+timeNode, -queryNum, target.granularity).valueOf();
let arr = [];
arr = data.filter(item => start <= +item.planStart && +timeNode > +item.planEnd);
if (!arr || !arr.length) {
// 开始时间往前推
let resultS = [];
@ -86,7 +86,7 @@ export const filter = {
let end = uni.$t.time.add(timeNode, +queryNum - 1, target.granularity).valueOf();
let arr = [];
arr = data.filter(item => end >= +item.planEnd && +timeNode <= +item.planStart);
if (!arr || !arr.length) {
// 结束时间往后推
let resultE = [];
@ -106,7 +106,7 @@ export const filter = {
}
}
},
/**
* 插件 过滤获取到的数据 根据插件id
* @param {object} data 缓存拿到的数据
@ -118,7 +118,35 @@ export const filter = {
},
};
export default {
export default {
/**
* 广告引导页
*/
async getGuideByType(type) {
try {
const data = '';
if (type === 0) {
data = await uni.$storage.getStorage('guide');
} else {
data = await uni.$storage.getStorage('advs');
}
return data;
} catch(error) {
return '';
}
},
putGuide(data, type) {
try {
if (!data) return; // 服务端没数据不做操作
let locals = data;
uni.$storage.setStorage('projects', locals);
type ? uni.$storage.setStorage('advs', locals) : uni.$storage.setStorage('guide', locals);
} catch (error) {
type ? uni.$storage.setStorage('advs', '') : uni.$storage.setStorage('guide', '');
}
},
/**
* 项目列表某天的 获取
* @param {number} startTime
@ -165,7 +193,7 @@ export default {
uni.$storage.setStorage('projects', []);
}
},
/**
* 当前显示的角色信息 获取
* @param {object} params
@ -179,7 +207,7 @@ export default {
return null;
}
},
/**
* 当前显示的角色信息
* @param {array} data
@ -221,7 +249,7 @@ export default {
uni.$storage.setStorage(`roles_${projectId}`, []);
}
},
/**
* 定期任务 获取
* @param {number} startTime
@ -236,7 +264,7 @@ export default {
return [];
}
},
/**
* 定期任务
* @param {array} data
@ -268,7 +296,7 @@ export default {
uni.$storage.setStorage(`plan_task_${params.projectId}_${params.roleId}`, []);
}
},
/**
* 永久的日常任务 获取
* @param {number} startTime
@ -283,7 +311,7 @@ export default {
return [];
}
},
/**
* 永久的日常任务
* @param {array} data
@ -316,7 +344,7 @@ export default {
uni.$storage.setStorage(`fixed_tasks_${params.projectId}_${params.roleId}`, []);
}
},
/**
* 日常任务 获取
* @param {number} timeNode
@ -330,7 +358,7 @@ export default {
return [];
}
},
/**
* 日常任务
* @param {array} data
@ -362,7 +390,7 @@ export default {
uni.$storage.setStorage(`variable_tasks_${params.projectId}_${params.roleId}`, []);
}
},
/**
* 插件信息 获取
* @param {string} pluginId
@ -376,7 +404,7 @@ export default {
return null;
}
},
/**
* 插件信息
* @param {string} pluginId

20
utils/cacheAndRequest.js

@ -15,6 +15,24 @@ export const waitTokenRequest = requestFn => {
};
export default {
/**
* 获取广告和引导页
*/
getGuide(type, fn) {
let remote = false;
uni.$cache.getGuideByType(type).then(data => {
!remote && fn(null, data);
}).catch(err => !remote && fn(err))
uni.$u.api.getGuide(type).then(data => {
remote = true;
fn(null, data);
// 存api到cache里
uni.$cache.putGuide(data, type);
}).catch(err => fn(err))
},
/**
* 获取项目列表
* @param {number} startTime 起始时间
@ -22,7 +40,7 @@ export default {
*/
getProjects(startTime, endTime, fn) {
let remote = false;
if (store.getters.useStorage) {
// 有缓存 且 服务端数据未返回 就先返回缓存
uni.$cache

Loading…
Cancel
Save