first commit
|
|
@ -0,0 +1,28 @@
|
|||
# Logs
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
lerna-debug.log*
|
||||
package-lock.json
|
||||
pnpm-lock.yaml
|
||||
|
||||
node_modules
|
||||
.DS_Store
|
||||
dist
|
||||
dist-ssr
|
||||
coverage
|
||||
*.local
|
||||
|
||||
|
||||
# Editor directories and files
|
||||
.vscode/*
|
||||
!.vscode/extensions.json
|
||||
.idea
|
||||
*.suo
|
||||
*.ntvs*
|
||||
*.njsproj
|
||||
*.sln
|
||||
*.sw?
|
||||
|
|
@ -0,0 +1 @@
|
|||
12
|
||||
|
|
@ -0,0 +1 @@
|
|||
12
|
||||
|
After Width: | Height: | Size: 16 KiB |
|
|
@ -0,0 +1,83 @@
|
|||
<!-- 品质 -->
|
||||
<script setup lang="ts">
|
||||
import HomeHead from '@/views/home/components/HomeHead.vue'
|
||||
// import HomeHeadSearch from '@/views/home/components/HomeHeadSearch.vue'
|
||||
import { useDate } from '@/views/home/hooks/useDate'
|
||||
import { NTimeline, NTimelineItem } from 'naive-ui'
|
||||
|
||||
const { day, week } = useDate()
|
||||
const { push } = useRouter()
|
||||
const array = ref<any[]>([
|
||||
{ content1: '抓紧时代变化,利用数字化武器,不断提升工作价值', content2: '時代の変化を掴み、デジタル化を武器にして仕事の価値を高める', year: '2023年' },
|
||||
{ content1: '以数字化为基石,领先时代的变化,发掘并创造新价值,实现再飞跃', content2: 'デジタルを基盤にし、時代の変化を先取りし、新たな価値を創り出し、次なる躍進へ', year: '2022年' },
|
||||
{ content1: '', content2: '', year: '2021年' },
|
||||
{ content1: '', content2: '', year: '2020年' },
|
||||
{ content1: '', content2: '', year: '2016年' },
|
||||
{ content1: '', content2: '', year: '2018年' },
|
||||
{ content1: '', content2: '', year: '2017年' },
|
||||
{ content1: '', content2: '', year: '2016年' },
|
||||
{ content1: '', content2: '', year: '2015年' },
|
||||
]);
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<HomeHead class="top">
|
||||
<template #content>
|
||||
<!-- <HomeHeadSearch /> -->
|
||||
</template>
|
||||
</HomeHead>
|
||||
<div class="h-full relative flex flex-col">
|
||||
<div class="font-600 flex items-end mt27px">
|
||||
<div class="text-36px">集团方针</div>
|
||||
<div class="text-18px ml40px mr25px">{{ day }}</div>
|
||||
<div class="text-18px">{{ week }}</div>
|
||||
</div>
|
||||
<div class="g-wrapper flex-1 mt30px">
|
||||
<div class="timeline mt35px ml178px">
|
||||
<NTimeline size="large">
|
||||
<NTimelineItem class="h92px one" v-for="item in array" :key="item.year">
|
||||
<div class="flex gap-60px justify-between">
|
||||
<div class="year absolute">{{ item.year }}</div>
|
||||
<div class="content1">{{ item.content1 }}</div>
|
||||
<div class="content2 pr50px">{{ item.content2 }}</div>
|
||||
</div>
|
||||
</NTimelineItem>
|
||||
</NTimeline>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped lang="less">
|
||||
.top {
|
||||
position: absolute;
|
||||
right: 30px;
|
||||
top: -92px;
|
||||
}
|
||||
|
||||
.g-wrapper {
|
||||
border-radius: 18px;
|
||||
border: 1px solid #E7EBF5;
|
||||
box-shadow: inset 1px 2px 12px rgba(14, 86, 221, 0.32);
|
||||
overflow: hidden;
|
||||
|
||||
.timeline {
|
||||
font-size: 20px;
|
||||
font-weight: bold;
|
||||
color: #142142;
|
||||
|
||||
.one {
|
||||
position: relative;
|
||||
.year{
|
||||
left: -132px;
|
||||
top: -14px;
|
||||
color: #003CB7;
|
||||
font-size: 26px;
|
||||
font-weight: normal;
|
||||
text-align: center;
|
||||
line-height: 50px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
@ -0,0 +1 @@
|
|||
.button[data-v-e928f0e8]{display:block;float:right;margin-right:20px}[data-v-e928f0e8]::-webkit-scrollbar{width:1px}.top[data-v-e928f0e8]{position:absolute;right:30px;top:-92px}.date-wrapper[data-v-c5c4f420][data-v-e928f0e8]{line-height:1.5;position:relative;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;color:#142142;border:none}.tab div[data-v-e928f0e8]:hover{color:#0036bc}.box[data-v-e928f0e8]{padding:23px 20px 0}.box .box-title[data-v-e928f0e8]{font-size:28px;font-weight:600;position:relative;padding-left:24px;color:#000}.box .box-title[data-v-e928f0e8]:before{content:" ";display:block;width:8px;height:30px;background-color:#003ab5;position:absolute;left:0}.bgStyle[data-v-e928f0e8]{display:flex;width:100%;height:270px;position:relative;padding:0 5px}.bgStyle div[data-v-e928f0e8]{flex:1;border:1px solid #ececec;border-radius:18px}.bgStyle div .title[data-v-e928f0e8]{border-radius:18px 0 50px;color:#f0f8ff;line-height:40px;font-size:24px;font-weight:500;z-index:50;position:absolute}
|
||||
|
|
@ -0,0 +1,206 @@
|
|||
<script setup lang="ts">
|
||||
import { RouterView } from 'vue-router'
|
||||
import { useUserStore } from '@/stores/modules/user'
|
||||
import { treeDbList,download } from '@/api/daikin/base'
|
||||
import {databaseld} from "@/stores/modules/database"
|
||||
const { push } = useRouter()
|
||||
const store = useUserStore()
|
||||
const database = databaseld()
|
||||
const { toggle } = inject<any>('fullscreen')
|
||||
const activeMenuKey = ref()
|
||||
let idx = ref(0)
|
||||
|
||||
const titles = ref()
|
||||
function menuHandler(menu: any, index: number) {
|
||||
console.log(menu)
|
||||
activeMenuKey.value = menu.id
|
||||
titles.value = menu.name
|
||||
idx.value = index;
|
||||
activeItem.value = menu.id
|
||||
if (menu.childList&&menu.childList.length>0){
|
||||
activeItem.value = menu.childList[0].id
|
||||
}
|
||||
database.database.id =activeItem.value
|
||||
}
|
||||
function goChild(menu: any) {
|
||||
activeItem.value = menu.id
|
||||
console.log(menu.id)
|
||||
database.database.id =menu.id
|
||||
}
|
||||
var activeItem = ref()
|
||||
const tableData = ref()
|
||||
async function getTree() {
|
||||
const { data } = await treeDbList({})
|
||||
tableData.value = data
|
||||
|
||||
if(data&&data[0]){
|
||||
// console.log(data[0])
|
||||
titles.value = data[0].name
|
||||
activeMenuKey.value = data[0].id
|
||||
database.database.id = data[0].id
|
||||
// if(data[0].childList&&data[0].childList.length>0){
|
||||
// activeItem.value = data[0].childList[0].id
|
||||
// activeMenuKey.value = data[0].childList[0].id
|
||||
// }
|
||||
}
|
||||
|
||||
}
|
||||
onMounted(() => {
|
||||
getTree()
|
||||
})
|
||||
|
||||
const onClic = ref(false)
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="page w-1920px h-1080px flex">
|
||||
<div class="w350px -mr-1px flex flex-col shrink-0 overflow-auto">
|
||||
<div class="p30px bg-#000 ">
|
||||
<!-- @dblclick="toggle" -->
|
||||
<img src="@/assets/images/logo@2x.png" class="w197px h44px mt14px" />
|
||||
</div>
|
||||
|
||||
|
||||
<div class="pt30px pb24px flex-1 pl20px bg-#fff">
|
||||
|
||||
<div class="nav px36px py24px m10px mr0 rd-32px rd-r-0 flex flex-col text-#000 cursor-pointer"
|
||||
v-for="(m, index) in tableData" :key="m.id" :class="activeMenuKey === m.id ? (m.childList ? 'actives' : 'active') : ''"
|
||||
@click="() => menuHandler(m, index)">
|
||||
<div :class="activeMenuKey === m.id && 'onActive'" class="flex" @click="onClic=!onClic">
|
||||
<!-- <img v-if="activeMenuKey === m.id" :src="m.icon1" class="w22px h22px mr16px mt--5px" />
|
||||
<img v-else :src="m.icon" class="w22px h22px mr16px mt--5px" /> -->
|
||||
<!-- lujinli -->
|
||||
<!-- <span class="text-17px font-900 relative min-w195px block"> -->
|
||||
<span class="text-18px font-900 relative min-w195px block">
|
||||
<span class="truncate"> {{ m.name }} </span>
|
||||
<span class="text-#000000 absolute right--30px top--5px"><el-icon size="26">
|
||||
<CaretTop v-if="activeMenuKey === m.id&&onClic" class="text-#4977FC" />
|
||||
<CaretBottom v-else />
|
||||
</el-icon></span>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div v-if="m.childList && idx == index" class="pl40px" v-show="idx === index&&onClic?true:false">
|
||||
<div class="my30px pl10px text-#000 activeChildren" v-for="(item, ind) in m.childList" :key="item.id"
|
||||
@click.stop="goChild(item)" @click="activeItem = item.id" >
|
||||
<span class="text-18px flex child font-900 truncate" :class="activeItem === item.id ? 'text-#002fa7' : ''">{{ item.name }}</span>
|
||||
|
||||
|
||||
<div v-if="item.childList && idx == index" class="pl10px">
|
||||
<div class="my30px pl10px text-#000 " v-for="(ite, ind) in item.childList" :key="item.id"
|
||||
@click.stop="goChild(ite)" @click="activeItem = ite.id">
|
||||
<span class="text-18px flex childs font-900 truncate" :class="activeItem === ite.id ? 'text-#002fa7' : ''">{{ ite.name }}</span>
|
||||
|
||||
<div v-if="ite.childList && idx == index" class="pl10px">
|
||||
<div class="my30px pl10px text-#000 " v-for="(it, ind) in ite.childList" :key="item.id"
|
||||
@click.stop="goChild(it)" @click="activeItem = it.id">
|
||||
<span class="text-18px flex childs font-900 truncate" :class="activeItem === it.id ? 'text-#002fa7' : ''">{{ it.name }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="main flex-1 pb15px pt0px relative ">
|
||||
<!-- <Home /> -->
|
||||
<RouterView :cateId="activeItem" :title="titles"/>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped lang="less">
|
||||
.truncate {
|
||||
display: block;
|
||||
max-width: 226px;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.page {
|
||||
font-family: 'PingFang SC';
|
||||
user-select: none;
|
||||
background-image:none;
|
||||
background-color: #cacaca;
|
||||
background-position: 0 0;
|
||||
background-repeat: no-repeat;
|
||||
background-size: cover;
|
||||
// color: #3b3b3b;
|
||||
color: #000;
|
||||
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.nav {
|
||||
|
||||
|
||||
&::before {
|
||||
top: -48px;
|
||||
}
|
||||
.child:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
.childs:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
&::after {
|
||||
bottom: -49px;
|
||||
transform: rotate(-90deg);
|
||||
}
|
||||
|
||||
&.active {
|
||||
color: #002fa7;
|
||||
background-color: #E6ECFF;
|
||||
|
||||
a {
|
||||
color: #002fa7;
|
||||
}
|
||||
|
||||
&::before,
|
||||
&::after {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
&.actives {
|
||||
padding: 0px !important;
|
||||
color: #4977FC;
|
||||
background-color: #F5F8FF;
|
||||
|
||||
a {
|
||||
color: #002fa7;
|
||||
}
|
||||
|
||||
&::before,
|
||||
&::after {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.onActive {
|
||||
background-color: #E6ECFF;
|
||||
border-radius: 32px 0 0 32px;
|
||||
|
||||
padding: 24px 36px 24px 36px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.main {
|
||||
|
||||
width: 100%;
|
||||
height: 95%;
|
||||
background-color: #4877FB;
|
||||
margin-left: 30px;
|
||||
}
|
||||
|
||||
&::-webkit-scrollbar {
|
||||
display: none;
|
||||
scrollbar-width: none
|
||||
}</style>
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
<script setup lang="ts">
|
||||
const { push } = useRouter()
|
||||
|
||||
const route = useRoute()
|
||||
|
||||
const menus = computed(() => {
|
||||
return route.matched
|
||||
.map((i: any) => {
|
||||
i.title = i.meta.title
|
||||
return i
|
||||
})
|
||||
.filter((i) => i.title)
|
||||
})
|
||||
|
||||
function handleClick(menu: any) {
|
||||
push(menu.path)
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="absolute text-15px top-18px left-0 font-600 z-99">
|
||||
<span class="cursor-pointer item" v-for="(item, idx) in menus" :key="item.path">
|
||||
<span @click="handleClick(item)">{{ item.title }}</span>
|
||||
<span class="mx8px" v-if="idx < menus.length - 1">></span>
|
||||
</span>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped lang="less">
|
||||
.item {
|
||||
// &::after {
|
||||
// con
|
||||
// }
|
||||
}
|
||||
</style>
|
||||
|
After Width: | Height: | Size: 58 KiB |
|
|
@ -0,0 +1,251 @@
|
|||
<script setup lang="ts">
|
||||
import { getFootprintList } from "@/api/daikin/base";
|
||||
import HomeHead from "@/views/home/components/HomeHead.vue";
|
||||
import { useMessage } from 'naive-ui'
|
||||
const message = useMessage()
|
||||
const { push } = useRouter();
|
||||
|
||||
const route = useRoute()
|
||||
|
||||
|
||||
const download = async (row)=>{
|
||||
// console.log(row)
|
||||
if(!row) return
|
||||
if(row.isSelect===2){
|
||||
message.error("没有访问权限")
|
||||
return
|
||||
}
|
||||
let {filePath} = row
|
||||
if(!filePath) {
|
||||
message.info("没有可预览文件!")
|
||||
return
|
||||
}
|
||||
srcType.value = getLastSubstring(filePath)
|
||||
if(['doc', 'docx', 'ppt', 'pptx', 'xls', 'xlsx','pdf'].includes(srcType.value)){
|
||||
// src.value = filePath
|
||||
// pdfShow.value = true
|
||||
filePath='https://view.xdocin.com/view?src='+filePath
|
||||
const screenWidth = window.screen.width;
|
||||
const screenHeight = window.screen.height;
|
||||
window.open(filePath, '', 'width=' + screenWidth + ',height=' + screenHeight + ',top=' + 0 + ',left=' + 0)
|
||||
}
|
||||
else{
|
||||
message.error("文件格式不是 'doc', 'docx', 'ppt', 'pptx', 'xls', 'xlsx','pdf'!")
|
||||
}
|
||||
}
|
||||
|
||||
const pageInfo = reactive({
|
||||
pageNum:1,
|
||||
pageSize:15,
|
||||
total:10
|
||||
})
|
||||
|
||||
|
||||
const tableData = ref()
|
||||
const getZu=async ()=>{
|
||||
const {pageNum, pageSize } = pageInfo;
|
||||
const { rows,total } = await getFootprintList({ pageNum, pageSize, moduleId: "2"});
|
||||
tableData.value = rows
|
||||
pageInfo.total = total
|
||||
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
getZu()
|
||||
});
|
||||
const lazyState = computed(() => [pageInfo.pageNum])
|
||||
watch(
|
||||
() => unref(lazyState),
|
||||
async (v) => {
|
||||
getZu()
|
||||
},
|
||||
{ immediate: true, deep: true },
|
||||
)
|
||||
|
||||
const handleSizeChange=(e)=>{
|
||||
console.log(e)
|
||||
}
|
||||
|
||||
const handleCurrentChange=(e)=>{
|
||||
console.log(e)
|
||||
}
|
||||
|
||||
const toDetail = (obj) => {
|
||||
console.log(obj);
|
||||
if (obj.isSelect === 2) {
|
||||
message.info("没有访问权限");
|
||||
return;
|
||||
} else {
|
||||
openUrl(obj.filePath[0].url);
|
||||
}
|
||||
};
|
||||
const srcType = ref();
|
||||
const openUrl = async (url) => {
|
||||
if (!url) {
|
||||
message.info("没有可预览文件!");
|
||||
return;
|
||||
}
|
||||
srcType.value = getLastSubstring(url);
|
||||
if (
|
||||
["doc", "docx", "ppt", "pptx", "xls", "xlsx", "pdf"].includes(srcType.value)
|
||||
) {
|
||||
// src.value = filePath
|
||||
// pdfShow.value = true
|
||||
url = "https://view.xdocin.com/view?src=" + url;
|
||||
const screenWidth = window.screen.width;
|
||||
const screenHeight = window.screen.height;
|
||||
window.open(
|
||||
url,
|
||||
"",
|
||||
"width=" +
|
||||
screenWidth +
|
||||
",height=" +
|
||||
screenHeight +
|
||||
",top=" +
|
||||
0 +
|
||||
",left=" +
|
||||
0
|
||||
);
|
||||
} else {
|
||||
message.error(
|
||||
"文件格式不是 'doc', 'docx', 'ppt', 'pptx', 'xls', 'xlsx','pdf'!"
|
||||
);
|
||||
}
|
||||
};
|
||||
function getLastSubstring(str: string): string {
|
||||
const lastIndex = str.lastIndexOf(".");
|
||||
if (lastIndex !== -1) {
|
||||
return str.substring(lastIndex + 1);
|
||||
} else {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<HomeHead class="top"></HomeHead>
|
||||
<div class="page w-full h-full flex bg-#fff rd-20px p30px">
|
||||
|
||||
<div class=" relative w-full h-910px">
|
||||
<table
|
||||
class="history w-full text-center text-16px border-spacing-0"
|
||||
>
|
||||
<thead
|
||||
style="
|
||||
background-color: #e7edff;
|
||||
color: #0a0a0a;
|
||||
height: 50px;
|
||||
width: 220px;
|
||||
border: 1px solid #417bef;
|
||||
"
|
||||
>
|
||||
<tr class="text-20px leading-50px">
|
||||
<th width="70%">
|
||||
标题
|
||||
</th>
|
||||
<th width="30%">
|
||||
时间
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody >
|
||||
<tr v-if="tableData" v-for="(it, index) in tableData" :key="index">
|
||||
<td class="h50px"><span class="download text-#000 text-16px" @click="toDetail(it)">{{ it.title}}</span></td>
|
||||
<td class="h50px"><span class="text-#000 text-16px" >{{ it.createTime}}</span></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<div class="float-right absolute bottom-20px right-30px">
|
||||
<el-pagination v-model:current-page="pageInfo.pageNum" v-model:page-size="pageInfo.pageSize"
|
||||
layout="prev, pager, next, jumper" :total="pageInfo.total"
|
||||
@size-change="handleSizeChange" @current-change="handleCurrentChange" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</template>
|
||||
|
||||
<style scoped lang="less">
|
||||
.download {
|
||||
cursor: pointer;
|
||||
}
|
||||
.download:hover {
|
||||
color: #00E4FF;
|
||||
}
|
||||
.top {
|
||||
position: absolute;
|
||||
right: 30px;
|
||||
top: -92px;
|
||||
}
|
||||
.download {
|
||||
cursor: pointer;
|
||||
}
|
||||
.download:hover {
|
||||
color: #00E4FF;
|
||||
}
|
||||
.nav {
|
||||
&::before {
|
||||
top: -48px;
|
||||
}
|
||||
.child:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
.childs:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
&::after {
|
||||
bottom: -49px;
|
||||
transform: rotate(-90deg);
|
||||
}
|
||||
|
||||
&.active {
|
||||
color: #002fa7;
|
||||
background-color: #e6ecff;
|
||||
|
||||
a {
|
||||
color: #002fa7;
|
||||
}
|
||||
|
||||
&::before,
|
||||
&::after {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
&.actives {
|
||||
padding: 0px !important;
|
||||
color: #002fa7;
|
||||
background-color: #f5f8ff;
|
||||
|
||||
a {
|
||||
color: #002fa7;
|
||||
}
|
||||
|
||||
&::before,
|
||||
&::after {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.onActive {
|
||||
background-color: #e6ecff;
|
||||
border-radius: 32px 0 0 32px;
|
||||
|
||||
padding: 24px 36px 24px 36px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.main {
|
||||
width: 100%;
|
||||
height: 95%;
|
||||
background-color: #4877fb;
|
||||
}
|
||||
|
||||
&::-webkit-scrollbar {
|
||||
display: none;
|
||||
scrollbar-width: none;
|
||||
}
|
||||
</style>
|
||||
|
|
@ -0,0 +1 @@
|
|||
.news-wrapper .title[data-v-18fb93e8]{font-size:22px;text-align:center}.news-wrapper .sub-title[data-v-18fb93e8]{text-align:center;font-size:16px;color:#808696;margin-top:18px}.container[data-v-18fb93e8]{column-gap:34px;line-height:2;margin-top:32px;font-size:18px;color:#000}.container[data-v-18fb93e8] img{width:100%;border-radius:6px;margin-bottom:24px}.container[data-v-18fb93e8] p{text-indent:2em}.back[data-v-d9d2f02e]{position:absolute;top:25px;left:25px;color:#fff;font-size:25px;font-weight:700;text-align:center;justify-content:center}.top[data-v-d9d2f02e]{right:30px;top:0}.page[data-v-d9d2f02e]{width:100%;font-family:PingFang SC;-webkit-user-select:none;user-select:none;background-image:url(/assets/bg-cd5f27e0.jpg);background-color:#000;background-position:0 0;background-repeat:no-repeat;background-size:cover;color:#fff;line-height:1}.page .page-wrap[data-v-d9d2f02e]{display:grid;grid-template-columns:1fr 314px;grid-template-rows:repeat(2,1fr);grid-column-gap:30px;grid-row-gap:30px}.page .page-wrap .page-main[data-v-d9d2f02e]{height:830px;grid-area:1 / 1 / 3 / 2}.page .page-wrap .page-side[data-v-d9d2f02e]{height:100%;grid-area:1 / 2 / 2 / 3}.page .page-wrap .page-side[data-v-d9d2f02e]:last-of-type{height:300px;grid-area:2 / 2 / 3 / 3}.main[data-v-d9d2f02e]{background-image:url(/assets/bg-rs-main-5a93bda9.svg);background-position:0 0;background-repeat:repeat-x;background-size:auto}.box[data-v-d9d2f02e]{--title-h: 58px;border:0}.box .box-title[data-v-d9d2f02e]{height:var(--title-h);color:#fff;background-color:#537deb;font-size:18px;font-weight:600;padding:0 24px;cursor:pointer}.box .box-content[data-v-d9d2f02e]{height:100%;max-height:calc(100% - var(--title-h))}.line[data-v-d9d2f02e]{border-bottom:1px solid #eef3fb}
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Generated by Pixelmator Pro 3.3.1 -->
|
||||
<svg width="150" height="160" viewBox="0 0 150 160" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<image id="-4" x="0" y="0" width="150" height="160" xlink:href="data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAAJYAAACgCAYAAADuIpVSAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAlqADAAQAAAABAAAAoAAAAAA5KgUGAAAIMklEQVR4Ae2dwW4bRRiAZ8axg9uCiARVei4HQOLIqS+R8gJwygGqqpegHqoqQhwq5YIQcOiJJ6B9iT4BUsWhOScCpCDUxIkT7zD/Ko7cNr9d779r7y7filDX//4z42++zoxnY693Czi2t7fDlvt73Q3jeljprGUuvpOqDQuomiqcy4Lzx9nZ6MD1/P6O+2A/9UdWNRhfdQUvt79ejy58GjJ/teq6KH82gSzEQ++y59e2f9mffXbxMyoTKzrnhw/ufXwWRh8Vbx6ZVRFYyTovet//8EcSIHVV+Udl0xFSld9ZZZYo/+Clj8osc7KsSsSS6Y+RahJzPR9LH0lfVdE601R46aI8ix0XwmepsatVNJgySydw4rLsdxf8qMxFfmGxtEV5CGEtyyLrqtL7v7oCQ/Avsiw7mKzBusifeyqURfnJg3uf+Kzz+WXv9GIW1yYbyOP6E7isz6RvpY+lr6XP530Vc4s1a1EeY3x33kZw/nIJTOuzoov8ucR6q0V5CN3lYqL2uQnM6LMii/xLh7i4udkdrPc3XIwb0btbqaE30k9v7gaTMJuA985fa9Ig74fO+z3X7T5z773/tP/Vnafe+9PXX+gbYh09vHs7zak76cSbr5/M3ysg0Flx/sqVCgpeUJE+7HY+vL61+uWdJ5M1XogV0/W8w+zgkXdxa/IEHldMoNdzflUunTb86F/d6X9z/34avfLrkCvjl4NUYxKL/dOHuZa5i23cPLUNDrcGPz+SjG/lf/mIdT79/SZPcCyWgO+naXDl4t/3YiuvoLbO9fUvZFoMslA/X1NVUA1FziTgWzJinb/Q0V9/7qTti27I3/2xUJ/Z/5WdkN4VtuqI2c3Brz9tBNlSaNULa9qLaZtYwv/ffzbC+T5V07qjPe1t2YCVd8zp6S2Z4GXzkwMC5RGI8YaIxY56eUgpKScQe+16S9LEbk1vydt4INayezW20yzEQqxKCCBWJVjnKDRW/hG/ORpT3qmIVR7LYiUhVjFuZE0nEDNGrOmEiBYjMEKsYuDImk4gG02PNzTKGmvZHSfbDS2cDhFr2WJJ/aP2jVqIVQOx4tlZDVpRbhMQq1yexUobIVYxcGRNJyDrrJaNWoxY07t8YdF4+sZH8xZWdxUVIVYVVIuUKSNWi65HI1YRCSrJkemwPaMWYlUiSbFC43BYLLGGWYhVp06RXfiWLOIRq05ipbbE4UnNWlSsOYhVjFt1WbIL34JRC7GqU6RwyfHkuHBuXRIRqy49MdmOdFG66Qt5xJrs0Do9lrVW1tyNLcSqk0yTbUmXeeLJYPKZRj1GrDp3V1rEN3VKRKw6iyVtk4V8A39fC7HqLlZqXzxOU2LDlluI1QCx5FeX4+CwUXIhVhPEkjam6TAeHzWltdzltDE9JQ2VxfxxMzZPGbEaZVZq7OmwEXIhVtPEkvaKXIM0LdZ4QY9YTRRL2izTYo0X9IjVVLGk3bKgP3pZy30uxGqyWNJ22Yo4OqzdDj1iNV2scfvTDn2+7qrJhWvEGndMG/6UdVeaGutwfRGx2iDU5GuQD7/K6HWY1l5JtGUd7bk70LII1rXe/DJQ2pLodJzvrS78RlCIVVcxymqXvHOUPa8ggqWv9F9Jd1ZewN0wEKusDqx7OemjZflvSbh0SSjdxs53k2AV3s4OseouROntS2uw9InrKJ+6lhtEya2DRbA0ZboSb8qJWKV3XIMKzL/l5lwyabaIlqZM1wkuv/Or3Esx/0nPSyz9d3HI5STJz3/S96imb3/Ov6hXvlM1jY6IdUGKB7kk8l1d6aON4o3lYLvBQo9clQBiqWgIWAggloUeuSoBxFLRELAQQCwLPXJVAoiloiFgIYBYFnrkqgQQS0VDwEIAsSz0yFUJIJaKhoCFAGJZ6JGrEkAsFQ0BCwHEstAjVyWAWCoaAhYCiGWhR65KALFUNAQsBBDLQo9clQBiqWgIWAggloUeuSoBxFLRELAQQCwLPXJVAoiloiFgIYBYFnrkqgQQS0VDwEIAsSz0yFUJIJaKhoCFAGJZ6JGrEkAsFQ0BCwHEstAjVyWAWCoaAhYCiGWhR65KALFUNAQsBBDLQo9clQBiqWgIWAggloUeuSoBxFLRELAQQCwLPXJVAoiloiFgIYBYFnrkqgQQS0VDwEIAsSz0yFUJIJaKhoCFAGJZ6JGrEkAsFQ0BCwHEstAjVyWAWCoaAhYCiGWhR65KALFUNAQsBBDLQo9clQBiqWgIWAggloUeuSoBxFLRELAQQCwLPXJVAoiloiFgIYBYFnrkqgQQS0VDwEIAsSz0yFUJIJaKhoCFAGJZ6JGrEkAsFQ0BCwHEstAjVyWAWCoaAhYCiGWhR65KALFUNAQsBBDLQo9clQBiqWgIWAggloUeuSoBxFLRELAQQCwLPXJVAoiloiFgIYBYFnrkqgQQS0VDwEIAsSz0yFUJIJaKhoCFAGJZ6JGrEkAsFQ0BCwHEstAjVyWAWCoaAhYCiGWhR65KALFUNAQsBBDLQo9clQBiqWgIWAggloUeuSoBxFLRELAQQCwLPXJVAiLWUI0SgEAxAkMRa69YLlkQUAnsBR/dMzVMAAIFCIhTwXn/tEAuKRDQCSSnQn9/IGLt6mcRgcBcBHbFqeAfPz71zm3NlcrJEFAIiEviVL7dcOW7H59E53eUc3kaAm9FQBwSl+Tki32sq2HtPnK9FT9OuoSAuCMOjUNp5Hr1OHp493Z0Tkavm69G+BsELiWwK9PfeKQan/GGWBKIm5vdwXp/w8W4Eb27lZ66kX56EuP43xOQDfW9fJsqvfuThbqsqV6n8h8hJddUN0CQZAAAAABJRU5ErkJggg=="/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.2 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
|
@ -0,0 +1 @@
|
|||
export const WEEK_ENUM_CN = ['日', '一', '二', '三', '四', '五', '六']
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
import { defineStore } from 'pinia';
|
||||
|
||||
export const useMyStore = defineStore('myStore', {
|
||||
state: () => ({
|
||||
data: JSON.parse(localStorage.getItem('myData')) || null,
|
||||
type: JSON.parse(localStorage.getItem('mType')) || null,
|
||||
}),
|
||||
actions: {
|
||||
setData(data: any) {
|
||||
this.data = data;
|
||||
// 将数据保存到本地存储
|
||||
localStorage.setItem('myData', JSON.stringify(data));
|
||||
},
|
||||
setType(data: any) {
|
||||
this.type = data;
|
||||
// 将数据保存到本地存储
|
||||
localStorage.setItem('myType', JSON.stringify(data));
|
||||
},
|
||||
},
|
||||
|
||||
});
|
||||
|
|
@ -0,0 +1,279 @@
|
|||
/* eslint-disable */
|
||||
/* prettier-ignore */
|
||||
// @ts-nocheck
|
||||
// Generated by unplugin-auto-import
|
||||
export {}
|
||||
declare global {
|
||||
const EffectScope: typeof import('vue')['EffectScope']
|
||||
const ElMessageBox: typeof import('element-plus/es')['ElMessageBox']
|
||||
const asyncComputed: typeof import('@vueuse/core')['asyncComputed']
|
||||
const autoResetRef: typeof import('@vueuse/core')['autoResetRef']
|
||||
const computed: typeof import('vue')['computed']
|
||||
const computedAsync: typeof import('@vueuse/core')['computedAsync']
|
||||
const computedEager: typeof import('@vueuse/core')['computedEager']
|
||||
const computedInject: typeof import('@vueuse/core')['computedInject']
|
||||
const computedWithControl: typeof import('@vueuse/core')['computedWithControl']
|
||||
const controlledComputed: typeof import('@vueuse/core')['controlledComputed']
|
||||
const controlledRef: typeof import('@vueuse/core')['controlledRef']
|
||||
const createApp: typeof import('vue')['createApp']
|
||||
const createEventHook: typeof import('@vueuse/core')['createEventHook']
|
||||
const createGlobalState: typeof import('@vueuse/core')['createGlobalState']
|
||||
const createInjectionState: typeof import('@vueuse/core')['createInjectionState']
|
||||
const createReactiveFn: typeof import('@vueuse/core')['createReactiveFn']
|
||||
const createSharedComposable: typeof import('@vueuse/core')['createSharedComposable']
|
||||
const createUnrefFn: typeof import('@vueuse/core')['createUnrefFn']
|
||||
const customRef: typeof import('vue')['customRef']
|
||||
const debouncedRef: typeof import('@vueuse/core')['debouncedRef']
|
||||
const debouncedWatch: typeof import('@vueuse/core')['debouncedWatch']
|
||||
const defineAsyncComponent: typeof import('vue')['defineAsyncComponent']
|
||||
const defineComponent: typeof import('vue')['defineComponent']
|
||||
const eagerComputed: typeof import('@vueuse/core')['eagerComputed']
|
||||
const effectScope: typeof import('vue')['effectScope']
|
||||
const extendRef: typeof import('@vueuse/core')['extendRef']
|
||||
const getCurrentInstance: typeof import('vue')['getCurrentInstance']
|
||||
const getCurrentScope: typeof import('vue')['getCurrentScope']
|
||||
const h: typeof import('vue')['h']
|
||||
const ignorableWatch: typeof import('@vueuse/core')['ignorableWatch']
|
||||
const inject: typeof import('vue')['inject']
|
||||
const isDefined: typeof import('@vueuse/core')['isDefined']
|
||||
const isProxy: typeof import('vue')['isProxy']
|
||||
const isReactive: typeof import('vue')['isReactive']
|
||||
const isReadonly: typeof import('vue')['isReadonly']
|
||||
const isRef: typeof import('vue')['isRef']
|
||||
const makeDestructurable: typeof import('@vueuse/core')['makeDestructurable']
|
||||
const markRaw: typeof import('vue')['markRaw']
|
||||
const nextTick: typeof import('vue')['nextTick']
|
||||
const onActivated: typeof import('vue')['onActivated']
|
||||
const onBeforeMount: typeof import('vue')['onBeforeMount']
|
||||
const onBeforeRouteLeave: typeof import('vue-router')['onBeforeRouteLeave']
|
||||
const onBeforeRouteUpdate: typeof import('vue-router')['onBeforeRouteUpdate']
|
||||
const onBeforeUnmount: typeof import('vue')['onBeforeUnmount']
|
||||
const onBeforeUpdate: typeof import('vue')['onBeforeUpdate']
|
||||
const onClickOutside: typeof import('@vueuse/core')['onClickOutside']
|
||||
const onDeactivated: typeof import('vue')['onDeactivated']
|
||||
const onErrorCaptured: typeof import('vue')['onErrorCaptured']
|
||||
const onKeyStroke: typeof import('@vueuse/core')['onKeyStroke']
|
||||
const onLongPress: typeof import('@vueuse/core')['onLongPress']
|
||||
const onMounted: typeof import('vue')['onMounted']
|
||||
const onRenderTracked: typeof import('vue')['onRenderTracked']
|
||||
const onRenderTriggered: typeof import('vue')['onRenderTriggered']
|
||||
const onScopeDispose: typeof import('vue')['onScopeDispose']
|
||||
const onServerPrefetch: typeof import('vue')['onServerPrefetch']
|
||||
const onStartTyping: typeof import('@vueuse/core')['onStartTyping']
|
||||
const onUnmounted: typeof import('vue')['onUnmounted']
|
||||
const onUpdated: typeof import('vue')['onUpdated']
|
||||
const pausableWatch: typeof import('@vueuse/core')['pausableWatch']
|
||||
const provide: typeof import('vue')['provide']
|
||||
const reactify: typeof import('@vueuse/core')['reactify']
|
||||
const reactifyObject: typeof import('@vueuse/core')['reactifyObject']
|
||||
const reactive: typeof import('vue')['reactive']
|
||||
const reactiveComputed: typeof import('@vueuse/core')['reactiveComputed']
|
||||
const reactiveOmit: typeof import('@vueuse/core')['reactiveOmit']
|
||||
const reactivePick: typeof import('@vueuse/core')['reactivePick']
|
||||
const readonly: typeof import('vue')['readonly']
|
||||
const ref: typeof import('vue')['ref']
|
||||
const refAutoReset: typeof import('@vueuse/core')['refAutoReset']
|
||||
const refDebounced: typeof import('@vueuse/core')['refDebounced']
|
||||
const refDefault: typeof import('@vueuse/core')['refDefault']
|
||||
const refThrottled: typeof import('@vueuse/core')['refThrottled']
|
||||
const refWithControl: typeof import('@vueuse/core')['refWithControl']
|
||||
const resolveComponent: typeof import('vue')['resolveComponent']
|
||||
const resolveRef: typeof import('@vueuse/core')['resolveRef']
|
||||
const resolveUnref: typeof import('@vueuse/core')['resolveUnref']
|
||||
const shallowReactive: typeof import('vue')['shallowReactive']
|
||||
const shallowReadonly: typeof import('vue')['shallowReadonly']
|
||||
const shallowRef: typeof import('vue')['shallowRef']
|
||||
const syncRef: typeof import('@vueuse/core')['syncRef']
|
||||
const syncRefs: typeof import('@vueuse/core')['syncRefs']
|
||||
const templateRef: typeof import('@vueuse/core')['templateRef']
|
||||
const throttledRef: typeof import('@vueuse/core')['throttledRef']
|
||||
const throttledWatch: typeof import('@vueuse/core')['throttledWatch']
|
||||
const toRaw: typeof import('vue')['toRaw']
|
||||
const toReactive: typeof import('@vueuse/core')['toReactive']
|
||||
const toRef: typeof import('vue')['toRef']
|
||||
const toRefs: typeof import('vue')['toRefs']
|
||||
const toValue: typeof import('vue')['toValue']
|
||||
const triggerRef: typeof import('vue')['triggerRef']
|
||||
const tryOnBeforeMount: typeof import('@vueuse/core')['tryOnBeforeMount']
|
||||
const tryOnBeforeUnmount: typeof import('@vueuse/core')['tryOnBeforeUnmount']
|
||||
const tryOnMounted: typeof import('@vueuse/core')['tryOnMounted']
|
||||
const tryOnScopeDispose: typeof import('@vueuse/core')['tryOnScopeDispose']
|
||||
const tryOnUnmounted: typeof import('@vueuse/core')['tryOnUnmounted']
|
||||
const unref: typeof import('vue')['unref']
|
||||
const unrefElement: typeof import('@vueuse/core')['unrefElement']
|
||||
const until: typeof import('@vueuse/core')['until']
|
||||
const useActiveElement: typeof import('@vueuse/core')['useActiveElement']
|
||||
const useArrayEvery: typeof import('@vueuse/core')['useArrayEvery']
|
||||
const useArrayFilter: typeof import('@vueuse/core')['useArrayFilter']
|
||||
const useArrayFind: typeof import('@vueuse/core')['useArrayFind']
|
||||
const useArrayFindIndex: typeof import('@vueuse/core')['useArrayFindIndex']
|
||||
const useArrayFindLast: typeof import('@vueuse/core')['useArrayFindLast']
|
||||
const useArrayJoin: typeof import('@vueuse/core')['useArrayJoin']
|
||||
const useArrayMap: typeof import('@vueuse/core')['useArrayMap']
|
||||
const useArrayReduce: typeof import('@vueuse/core')['useArrayReduce']
|
||||
const useArraySome: typeof import('@vueuse/core')['useArraySome']
|
||||
const useArrayUnique: typeof import('@vueuse/core')['useArrayUnique']
|
||||
const useAsyncQueue: typeof import('@vueuse/core')['useAsyncQueue']
|
||||
const useAsyncState: typeof import('@vueuse/core')['useAsyncState']
|
||||
const useAttrs: typeof import('vue')['useAttrs']
|
||||
const useBase64: typeof import('@vueuse/core')['useBase64']
|
||||
const useBattery: typeof import('@vueuse/core')['useBattery']
|
||||
const useBluetooth: typeof import('@vueuse/core')['useBluetooth']
|
||||
const useBreakpoints: typeof import('@vueuse/core')['useBreakpoints']
|
||||
const useBroadcastChannel: typeof import('@vueuse/core')['useBroadcastChannel']
|
||||
const useBrowserLocation: typeof import('@vueuse/core')['useBrowserLocation']
|
||||
const useCached: typeof import('@vueuse/core')['useCached']
|
||||
const useClipboard: typeof import('@vueuse/core')['useClipboard']
|
||||
const useCloned: typeof import('@vueuse/core')['useCloned']
|
||||
const useColorMode: typeof import('@vueuse/core')['useColorMode']
|
||||
const useConfirmDialog: typeof import('@vueuse/core')['useConfirmDialog']
|
||||
const useCounter: typeof import('@vueuse/core')['useCounter']
|
||||
const useCssModule: typeof import('vue')['useCssModule']
|
||||
const useCssVar: typeof import('@vueuse/core')['useCssVar']
|
||||
const useCssVars: typeof import('vue')['useCssVars']
|
||||
const useCurrentElement: typeof import('@vueuse/core')['useCurrentElement']
|
||||
const useCycleList: typeof import('@vueuse/core')['useCycleList']
|
||||
const useDark: typeof import('@vueuse/core')['useDark']
|
||||
const useDateFormat: typeof import('@vueuse/core')['useDateFormat']
|
||||
const useDebounce: typeof import('@vueuse/core')['useDebounce']
|
||||
const useDebounceFn: typeof import('@vueuse/core')['useDebounceFn']
|
||||
const useDebouncedRefHistory: typeof import('@vueuse/core')['useDebouncedRefHistory']
|
||||
const useDeviceMotion: typeof import('@vueuse/core')['useDeviceMotion']
|
||||
const useDeviceOrientation: typeof import('@vueuse/core')['useDeviceOrientation']
|
||||
const useDevicePixelRatio: typeof import('@vueuse/core')['useDevicePixelRatio']
|
||||
const useDevicesList: typeof import('@vueuse/core')['useDevicesList']
|
||||
const useDisplayMedia: typeof import('@vueuse/core')['useDisplayMedia']
|
||||
const useDocumentVisibility: typeof import('@vueuse/core')['useDocumentVisibility']
|
||||
const useDraggable: typeof import('@vueuse/core')['useDraggable']
|
||||
const useDropZone: typeof import('@vueuse/core')['useDropZone']
|
||||
const useElementBounding: typeof import('@vueuse/core')['useElementBounding']
|
||||
const useElementByPoint: typeof import('@vueuse/core')['useElementByPoint']
|
||||
const useElementHover: typeof import('@vueuse/core')['useElementHover']
|
||||
const useElementSize: typeof import('@vueuse/core')['useElementSize']
|
||||
const useElementVisibility: typeof import('@vueuse/core')['useElementVisibility']
|
||||
const useEventBus: typeof import('@vueuse/core')['useEventBus']
|
||||
const useEventListener: typeof import('@vueuse/core')['useEventListener']
|
||||
const useEventSource: typeof import('@vueuse/core')['useEventSource']
|
||||
const useEyeDropper: typeof import('@vueuse/core')['useEyeDropper']
|
||||
const useFavicon: typeof import('@vueuse/core')['useFavicon']
|
||||
const useFetch: typeof import('@vueuse/core')['useFetch']
|
||||
const useFileDialog: typeof import('@vueuse/core')['useFileDialog']
|
||||
const useFileSystemAccess: typeof import('@vueuse/core')['useFileSystemAccess']
|
||||
const useFocus: typeof import('@vueuse/core')['useFocus']
|
||||
const useFocusWithin: typeof import('@vueuse/core')['useFocusWithin']
|
||||
const useFps: typeof import('@vueuse/core')['useFps']
|
||||
const useFullscreen: typeof import('@vueuse/core')['useFullscreen']
|
||||
const useGamepad: typeof import('@vueuse/core')['useGamepad']
|
||||
const useGeolocation: typeof import('@vueuse/core')['useGeolocation']
|
||||
const useIdle: typeof import('@vueuse/core')['useIdle']
|
||||
const useImage: typeof import('@vueuse/core')['useImage']
|
||||
const useInfiniteScroll: typeof import('@vueuse/core')['useInfiniteScroll']
|
||||
const useIntersectionObserver: typeof import('@vueuse/core')['useIntersectionObserver']
|
||||
const useInterval: typeof import('@vueuse/core')['useInterval']
|
||||
const useIntervalFn: typeof import('@vueuse/core')['useIntervalFn']
|
||||
const useKeyModifier: typeof import('@vueuse/core')['useKeyModifier']
|
||||
const useLastChanged: typeof import('@vueuse/core')['useLastChanged']
|
||||
const useLink: typeof import('vue-router')['useLink']
|
||||
const useLocalStorage: typeof import('@vueuse/core')['useLocalStorage']
|
||||
const useMagicKeys: typeof import('@vueuse/core')['useMagicKeys']
|
||||
const useManualRefHistory: typeof import('@vueuse/core')['useManualRefHistory']
|
||||
const useMediaControls: typeof import('@vueuse/core')['useMediaControls']
|
||||
const useMediaQuery: typeof import('@vueuse/core')['useMediaQuery']
|
||||
const useMemoize: typeof import('@vueuse/core')['useMemoize']
|
||||
const useMemory: typeof import('@vueuse/core')['useMemory']
|
||||
const useMounted: typeof import('@vueuse/core')['useMounted']
|
||||
const useMouse: typeof import('@vueuse/core')['useMouse']
|
||||
const useMouseInElement: typeof import('@vueuse/core')['useMouseInElement']
|
||||
const useMousePressed: typeof import('@vueuse/core')['useMousePressed']
|
||||
const useMutationObserver: typeof import('@vueuse/core')['useMutationObserver']
|
||||
const useNavigatorLanguage: typeof import('@vueuse/core')['useNavigatorLanguage']
|
||||
const useNetwork: typeof import('@vueuse/core')['useNetwork']
|
||||
const useNow: typeof import('@vueuse/core')['useNow']
|
||||
const useObjectUrl: typeof import('@vueuse/core')['useObjectUrl']
|
||||
const useOffsetPagination: typeof import('@vueuse/core')['useOffsetPagination']
|
||||
const useOnline: typeof import('@vueuse/core')['useOnline']
|
||||
const usePageLeave: typeof import('@vueuse/core')['usePageLeave']
|
||||
const useParallax: typeof import('@vueuse/core')['useParallax']
|
||||
const usePermission: typeof import('@vueuse/core')['usePermission']
|
||||
const usePointer: typeof import('@vueuse/core')['usePointer']
|
||||
const usePointerLock: typeof import('@vueuse/core')['usePointerLock']
|
||||
const usePointerSwipe: typeof import('@vueuse/core')['usePointerSwipe']
|
||||
const usePreferredColorScheme: typeof import('@vueuse/core')['usePreferredColorScheme']
|
||||
const usePreferredContrast: typeof import('@vueuse/core')['usePreferredContrast']
|
||||
const usePreferredDark: typeof import('@vueuse/core')['usePreferredDark']
|
||||
const usePreferredLanguages: typeof import('@vueuse/core')['usePreferredLanguages']
|
||||
const usePreferredReducedMotion: typeof import('@vueuse/core')['usePreferredReducedMotion']
|
||||
const usePrevious: typeof import('@vueuse/core')['usePrevious']
|
||||
const useRafFn: typeof import('@vueuse/core')['useRafFn']
|
||||
const useRefHistory: typeof import('@vueuse/core')['useRefHistory']
|
||||
const useResizeObserver: typeof import('@vueuse/core')['useResizeObserver']
|
||||
const useRoute: typeof import('vue-router')['useRoute']
|
||||
const useRouter: typeof import('vue-router')['useRouter']
|
||||
const useScreenOrientation: typeof import('@vueuse/core')['useScreenOrientation']
|
||||
const useScreenSafeArea: typeof import('@vueuse/core')['useScreenSafeArea']
|
||||
const useScriptTag: typeof import('@vueuse/core')['useScriptTag']
|
||||
const useScroll: typeof import('@vueuse/core')['useScroll']
|
||||
const useScrollLock: typeof import('@vueuse/core')['useScrollLock']
|
||||
const useSessionStorage: typeof import('@vueuse/core')['useSessionStorage']
|
||||
const useShare: typeof import('@vueuse/core')['useShare']
|
||||
const useSlots: typeof import('vue')['useSlots']
|
||||
const useSorted: typeof import('@vueuse/core')['useSorted']
|
||||
const useSpeechRecognition: typeof import('@vueuse/core')['useSpeechRecognition']
|
||||
const useSpeechSynthesis: typeof import('@vueuse/core')['useSpeechSynthesis']
|
||||
const useStepper: typeof import('@vueuse/core')['useStepper']
|
||||
const useStorage: typeof import('@vueuse/core')['useStorage']
|
||||
const useStorageAsync: typeof import('@vueuse/core')['useStorageAsync']
|
||||
const useStyleTag: typeof import('@vueuse/core')['useStyleTag']
|
||||
const useSupported: typeof import('@vueuse/core')['useSupported']
|
||||
const useSwipe: typeof import('@vueuse/core')['useSwipe']
|
||||
const useTemplateRefsList: typeof import('@vueuse/core')['useTemplateRefsList']
|
||||
const useTextDirection: typeof import('@vueuse/core')['useTextDirection']
|
||||
const useTextSelection: typeof import('@vueuse/core')['useTextSelection']
|
||||
const useTextareaAutosize: typeof import('@vueuse/core')['useTextareaAutosize']
|
||||
const useThrottle: typeof import('@vueuse/core')['useThrottle']
|
||||
const useThrottleFn: typeof import('@vueuse/core')['useThrottleFn']
|
||||
const useThrottledRefHistory: typeof import('@vueuse/core')['useThrottledRefHistory']
|
||||
const useTimeAgo: typeof import('@vueuse/core')['useTimeAgo']
|
||||
const useTimeout: typeof import('@vueuse/core')['useTimeout']
|
||||
const useTimeoutFn: typeof import('@vueuse/core')['useTimeoutFn']
|
||||
const useTimeoutPoll: typeof import('@vueuse/core')['useTimeoutPoll']
|
||||
const useTimestamp: typeof import('@vueuse/core')['useTimestamp']
|
||||
const useTitle: typeof import('@vueuse/core')['useTitle']
|
||||
const useToNumber: typeof import('@vueuse/core')['useToNumber']
|
||||
const useToString: typeof import('@vueuse/core')['useToString']
|
||||
const useToggle: typeof import('@vueuse/core')['useToggle']
|
||||
const useTransition: typeof import('@vueuse/core')['useTransition']
|
||||
const useUrlSearchParams: typeof import('@vueuse/core')['useUrlSearchParams']
|
||||
const useUserMedia: typeof import('@vueuse/core')['useUserMedia']
|
||||
const useVModel: typeof import('@vueuse/core')['useVModel']
|
||||
const useVModels: typeof import('@vueuse/core')['useVModels']
|
||||
const useVibrate: typeof import('@vueuse/core')['useVibrate']
|
||||
const useVirtualList: typeof import('@vueuse/core')['useVirtualList']
|
||||
const useWakeLock: typeof import('@vueuse/core')['useWakeLock']
|
||||
const useWebNotification: typeof import('@vueuse/core')['useWebNotification']
|
||||
const useWebSocket: typeof import('@vueuse/core')['useWebSocket']
|
||||
const useWebWorker: typeof import('@vueuse/core')['useWebWorker']
|
||||
const useWebWorkerFn: typeof import('@vueuse/core')['useWebWorkerFn']
|
||||
const useWindowFocus: typeof import('@vueuse/core')['useWindowFocus']
|
||||
const useWindowScroll: typeof import('@vueuse/core')['useWindowScroll']
|
||||
const useWindowSize: typeof import('@vueuse/core')['useWindowSize']
|
||||
const watch: typeof import('vue')['watch']
|
||||
const watchArray: typeof import('@vueuse/core')['watchArray']
|
||||
const watchAtMost: typeof import('@vueuse/core')['watchAtMost']
|
||||
const watchDebounced: typeof import('@vueuse/core')['watchDebounced']
|
||||
const watchEffect: typeof import('vue')['watchEffect']
|
||||
const watchIgnorable: typeof import('@vueuse/core')['watchIgnorable']
|
||||
const watchOnce: typeof import('@vueuse/core')['watchOnce']
|
||||
const watchPausable: typeof import('@vueuse/core')['watchPausable']
|
||||
const watchPostEffect: typeof import('vue')['watchPostEffect']
|
||||
const watchSyncEffect: typeof import('vue')['watchSyncEffect']
|
||||
const watchThrottled: typeof import('@vueuse/core')['watchThrottled']
|
||||
const watchTriggerable: typeof import('@vueuse/core')['watchTriggerable']
|
||||
const watchWithFilter: typeof import('@vueuse/core')['watchWithFilter']
|
||||
const whenever: typeof import('@vueuse/core')['whenever']
|
||||
}
|
||||
// for type re-export
|
||||
declare global {
|
||||
// @ts-ignore
|
||||
export type { Component, ComponentPublicInstance, ComputedRef, InjectionKey, PropType, Ref, VNode } from 'vue'
|
||||
}
|
||||
|
|
@ -0,0 +1,464 @@
|
|||
<!-- C/D数据 -->
|
||||
<script setup lang="ts">
|
||||
import {hisYearData,curYearData , useChart3,defineCompont} from "./CdData";
|
||||
import { treeList } from '@/api/daikin/base'
|
||||
import HomeHead from '@/views/home/components/HomeHead.vue'
|
||||
// import HomeHeadSearch from '@/views/home/components/HomeHeadSearch.vue'
|
||||
import CDSide from './CDSide.vue'
|
||||
import { NForm, NFormItem, useMessage, NSelect, NButton } from 'naive-ui'
|
||||
import develop from '../develop.vue'
|
||||
import type { FormInst } from 'naive-ui'
|
||||
|
||||
const { push } = useRouter()
|
||||
const message = useMessage()
|
||||
const radioss = ref(2020)
|
||||
|
||||
const { chartRef: chartRef1, option: chartOption1 } = curYearData()
|
||||
const { chartRef: chartRef2, option: chartOption2 ,state} = hisYearData()
|
||||
const { chartRef: chart1, option: chartOp1 } = useChart3()
|
||||
const {clickData, toYearData,hisData} = defineCompont()
|
||||
|
||||
|
||||
const treeData = ref<any>()
|
||||
async function getData() {
|
||||
const { data} = await treeList()
|
||||
const dataList = transformData(data);
|
||||
console.log(dataList)
|
||||
treeData.value = dataList
|
||||
|
||||
}
|
||||
|
||||
|
||||
function transformData(data, parentKey = "") {
|
||||
let keyIndex = 1;
|
||||
|
||||
return data.map(item => {
|
||||
const key = parentKey ? `${parentKey}-${keyIndex}` : `${item.id}`;
|
||||
keyIndex++;
|
||||
|
||||
const transformedItem = {
|
||||
label: item.name,
|
||||
key: key,
|
||||
level: parentKey ? parentKey.split('-').length + 1 : 1,
|
||||
id: item.id,
|
||||
};
|
||||
|
||||
const treeList = transformTreeList(item.treeList, key);
|
||||
if (treeList.length > 0) {
|
||||
transformedItem.treeList = treeList;
|
||||
}
|
||||
|
||||
return transformedItem;
|
||||
});
|
||||
}
|
||||
|
||||
function transformTreeList(treeList, parentKey) {
|
||||
if (!treeList || treeList.length === 0) {
|
||||
return [];
|
||||
}
|
||||
|
||||
let keyIndex = 1;
|
||||
|
||||
return treeList.map(item => {
|
||||
const key = `${parentKey.split('-').length + 1}-${keyIndex}`;
|
||||
keyIndex++;
|
||||
|
||||
const transformedItem = {
|
||||
label: item.name,
|
||||
key: key,
|
||||
level: parentKey.split('-').length + 1,
|
||||
id: item.id,
|
||||
};
|
||||
|
||||
const childTreeList = transformTreeList(item.treeList, key);
|
||||
if (childTreeList.length > 0) {
|
||||
transformedItem.treeList = childTreeList;
|
||||
}
|
||||
|
||||
return transformedItem;
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
let formValue = ref({
|
||||
name: '',
|
||||
age: '',
|
||||
phone: '',
|
||||
phone1: ''
|
||||
})
|
||||
const formRef = ref<FormInst | null>(null);
|
||||
const handleValidateClick = (e: MouseEvent) => {
|
||||
e.preventDefault()
|
||||
formRef.value?.validate((errors) => {
|
||||
if (!errors) {
|
||||
// message.success('Valid')
|
||||
} else {
|
||||
console.log(errors)
|
||||
// message.error('Invalid')
|
||||
}
|
||||
})
|
||||
}
|
||||
let options = [
|
||||
{
|
||||
label: "据点总体",
|
||||
value: 'song0'
|
||||
},
|
||||
{
|
||||
label: 'DIS',
|
||||
value: 'song1'
|
||||
},
|
||||
]
|
||||
|
||||
const checkedValueRef = ref<string | null>(null)
|
||||
const handleChange = (e: Event) => {
|
||||
state.cateId= 1
|
||||
state.yearTime=e
|
||||
console.log(e)
|
||||
}
|
||||
|
||||
|
||||
// 获取子组件传过来的值
|
||||
const handleChild = (id: any) => {
|
||||
// console.log(data)
|
||||
clickData.id = id
|
||||
|
||||
}
|
||||
getData()
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<!-- <develop/> -->
|
||||
<HomeHead class="top">
|
||||
|
||||
</HomeHead>
|
||||
<div class="h-full relative flex flex-col">
|
||||
|
||||
<div class="font-600 text-36px mt29px ">C/D数据</div>
|
||||
<div class="q-wrapper flex-1 h957.9px mt30px text-#142142 flex flex-col gap-22px bg-#fff">
|
||||
<div class="data1 flex gap-26px">
|
||||
<div class="cd_plan flex-1 pl32px pr33px pt25px pb10px">
|
||||
<div class="title ml19px font-bold text-24px">FY23 中国域各据点 C/D进度</div>
|
||||
<div class="text-20px mt21px mb17px font-600">发注金额:</div>
|
||||
<div class="">
|
||||
<table style="border: 1px solid #EDEDED;"
|
||||
class="w-full text-center h295px border-spacing-0 text-16px fazhu">
|
||||
<thead style="background-color: #417BEF;color: #fff;">
|
||||
<tr class="h41px">
|
||||
<th rowspan="2" colspan="2">据点</th>
|
||||
<th colspan="2">据点</th>
|
||||
<th colspan="2">苏州</th>
|
||||
<th colspan="2">惠州</th>
|
||||
</tr>
|
||||
<tr class="h41px">
|
||||
<th>FY23</th>
|
||||
<th>FY22</th>
|
||||
<th>FY23</th>
|
||||
<th>FY22</th>
|
||||
<th>FY23</th>
|
||||
<th>FY22</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td colspan="2" class="text-#142142">合计</td>
|
||||
<td>55.40%</td>
|
||||
<td>55.40%</td>
|
||||
<td>55.40%</td>
|
||||
<td>55.40%</td>
|
||||
<td>55.40%</td>
|
||||
<td>55.40%</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td rowspan="2" class="text-#142142">C/D</td>
|
||||
<td class="text-#142142">交涉</td>
|
||||
<td>55.40%</td>
|
||||
<td>55.40%</td>
|
||||
<td>55.40%</td>
|
||||
<td>55.40%</td>
|
||||
<td>55.40%</td>
|
||||
<td>55.40%</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-#142142">THEME</td>
|
||||
<td>55.40%</td>
|
||||
<td>55.40%</td>
|
||||
<td>55.40%</td>
|
||||
<td>55.40%</td>
|
||||
<td>55.40%</td>
|
||||
<td>55.40%</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2" class="text-#142142">市况</td>
|
||||
<td>55.40%</td>
|
||||
<td>55.40%</td>
|
||||
<td>55.40%</td>
|
||||
<td>55.40%</td>
|
||||
<td>55.40%</td>
|
||||
<td>55.40%</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2" class="text-#142142">汇率</td>
|
||||
<td>55.40%</td>
|
||||
<td>55.40%</td>
|
||||
<td>55.40%</td>
|
||||
<td>55.40%</td>
|
||||
<td>55.40%</td>
|
||||
<td>55.40%</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="flex h55px ">
|
||||
<n-form ref="formRef" inline :label-width="55" :model="formValue" class="!items-center">
|
||||
<n-form-item path="name">
|
||||
<n-select style="width: 148px;" v-model:value="formValue.name" placeholder="请选择"
|
||||
:options="options" />
|
||||
</n-form-item>
|
||||
<n-form-item path="age">
|
||||
<n-select style="width: 148px;" v-model:value="formValue.age" placeholder="请选择"
|
||||
:options="options" />
|
||||
</n-form-item>
|
||||
<n-form-item path="phone">
|
||||
<n-select style="width: 148px;" v-model:value="formValue.phone" placeholder="请选择"
|
||||
:options="options" />
|
||||
</n-form-item>
|
||||
<n-form-item path="phone">
|
||||
<n-select style="width: 148px;" v-model:value="formValue.phone1" placeholder="请选择"
|
||||
:options="options" />
|
||||
</n-form-item>
|
||||
<n-form-item>
|
||||
<n-button style="background-color: #417BEF;color: #fff;" attr-type="button"
|
||||
@click="handleValidateClick">
|
||||
检索
|
||||
</n-button>
|
||||
</n-form-item>
|
||||
</n-form>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="amount flex-1 pl32px pr33px pt27px pb0px">
|
||||
<div class="flex gap-49px">
|
||||
<div class="flex-1">
|
||||
<div class="title ml19px font-bold text-24px">发注金额推移</div>
|
||||
<div class="w330px h199px mt22px">
|
||||
<img src="./images/fazhuje.png" alt="">
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex-1">
|
||||
<div class="title ml19px font-bold text-24px">CD堆积</div>
|
||||
<div class="w330px h199px mt22px">
|
||||
<img src="./images/cddj.png" alt="">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="flex-1">
|
||||
<div class="title ml19px font-bold text-24px">发注金额推移</div>
|
||||
<div class="w100% h199px mt22px">
|
||||
<VChart ref="chart1" :option="chartOp1" autoresize />
|
||||
</div>
|
||||
<div class="title ml19px font-bold text-24px !absolute top-0 left-50%">CD堆积</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="h152px mt20px" style="border: 1px solid #D3D3D3;">
|
||||
<div class="mt13px ml17px text-16px font-bold">年度重点</div>
|
||||
<div class="h112px ml17px mt10px mr15px text-14px lh-22px overflow-y-auto">
|
||||
年度重点Theme年度重点Theme年度重点Theme年度重点Theme年度重点Theme年度重点The
|
||||
年度重点Theme年度重点Theme年度重点Theme年度重点Theme年度重点Theme年度重点The
|
||||
年度重点Theme年度重点Theme年度重点Theme年度重点Theme年度重点Theme年度重点The
|
||||
年度重点Theme年度重点Theme年度重点Theme年度重点Theme年度重点Theme年度重点The
|
||||
年度重点Theme年度重点Theme年度重点Theme年度重点Theme年度重点Theme年度重</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="data2 flex flex-col">
|
||||
<div class="flex min-h280px">
|
||||
<div class="w148px">
|
||||
<div class="title ml19px font-bold text-24px">按业绩</div>
|
||||
<div class="max-h-236px overflow-y-auto mt100px">
|
||||
<CDSide :treeData="treeData" @clickChliden="handleChild"></CDSide>
|
||||
</div>
|
||||
</div>
|
||||
<div class="ml24px w485px">
|
||||
<div class="ml19px font-bold text-24px">当年度</div>
|
||||
<table class="dangnian w485px text-center mt23px text-18px border-spacing-0 overflow-auto min-h-100px">
|
||||
<thead style="background-color: #417BEF;color: #fff;height: 42px;">
|
||||
<tr class="h41px">
|
||||
<th colspan="4">FY2023</th>
|
||||
</tr>
|
||||
<tr class="h35px">
|
||||
<th>供方</th>
|
||||
<th>发注金额</th>
|
||||
<th>交涉</th>
|
||||
<th>Theme</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr v-for="i in toYearData" key="i" class="!h35px text-16px">
|
||||
<td>{{ i.supplierName }}</td>
|
||||
<td>{{ i.publishAmount }}</td>
|
||||
<td>{{ i.negAmount }}</td>
|
||||
<td>{{ i.themeRate }}%</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="ml89px flex-1">
|
||||
<div class="title ml19px font-bold text-24px">历史数据</div>
|
||||
|
||||
|
||||
<div class="flex">
|
||||
|
||||
|
||||
<table class="history w-full text-center mt23px text-18px border-spacing-0 overflow-auto">
|
||||
<thead style="background-color: #417BEF;color: #fff;height: 42px;">
|
||||
<tr class="h41px">
|
||||
<th colspan="3">FY2023</th>
|
||||
</tr>
|
||||
<tr class="h41px">
|
||||
<th>发注</th>
|
||||
<th>交涉</th>
|
||||
<th>Theme</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr v-for="i in hisData['2023']" key="i" class="!h35px text-16px">
|
||||
<td>{{ i.publishAmount }}</td>
|
||||
<td>{{ i.negAmount }}</td>
|
||||
<td>{{ i.themeRate }}%</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<table class="history w-full text-center mt23px text-18px border-spacing-0 overflow-auto">
|
||||
<thead style="background-color: #417BEF;color: #fff;height: 42px;">
|
||||
<tr class="h41px">
|
||||
<th colspan="3">FY2022</th>
|
||||
</tr>
|
||||
<tr class="h41px">
|
||||
<th>发注</th>
|
||||
<th>交涉</th>
|
||||
<th>Theme</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr v-for="i in hisData['2022']" key="i" class="!h35px text-16px">
|
||||
<td>{{ i.publishAmount }}</td>
|
||||
<td>{{ i.negAmount }}</td>
|
||||
<td>{{ i.themeRate }}%</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex gap-101px mt29px">
|
||||
<div class="w634px h243px">
|
||||
<VChart ref="chartRef1" :option="chartOption1" autoresize />
|
||||
</div>
|
||||
<div class="w634px h243px ">
|
||||
|
||||
<VChart ref="chartRef2" :option="chartOption2" autoresize/>
|
||||
<div class=" w634px pl30px h30px">
|
||||
<el-radio-group v-model="radioss" @change="handleChange">
|
||||
<el-radio :label="2020">FY2020</el-radio>
|
||||
<el-radio :label="2021"> FY2021</el-radio>
|
||||
<el-radio :label="2022">FY2022</el-radio>
|
||||
</el-radio-group>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="absolute flex flex-col w-full h-full z-200 top-0 left-0 text-center bg-red justify-center items-center" style="background-color: rgba(255,255,255,0.8);">
|
||||
<img src="@/assets/images/chah.png"/>
|
||||
<br>
|
||||
<div class="text-#5683DB text-36px">【做成中,敬请期待】</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped lang="less">
|
||||
.top {
|
||||
position: absolute;
|
||||
right: 30px;
|
||||
top: -92px;
|
||||
}
|
||||
|
||||
.fazhu {
|
||||
td {
|
||||
border: 1px solid #E0E0E0;
|
||||
color: #808696;
|
||||
}
|
||||
}
|
||||
|
||||
.dangnian {
|
||||
td {
|
||||
border: 1px solid #E0E0E0;
|
||||
color: #808696;
|
||||
}
|
||||
}
|
||||
|
||||
.history {
|
||||
td {
|
||||
border: 1px solid #E0E0E0;
|
||||
color: #808696;
|
||||
}
|
||||
}
|
||||
|
||||
.menu {
|
||||
position: absolute;
|
||||
background: #fff;
|
||||
border: 1px solid #333;
|
||||
}
|
||||
|
||||
.menu li {
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
.fade-enter-active,
|
||||
.fade-leave-active {
|
||||
transition: opacity 0.5s;
|
||||
}
|
||||
|
||||
.fade-enter,
|
||||
.fade-leave-to {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar {
|
||||
width: 1px;
|
||||
}
|
||||
|
||||
.q-wrapper {
|
||||
overflow-y: scroll;
|
||||
border-radius: 20px;
|
||||
|
||||
.cd_plan,
|
||||
.amount,
|
||||
.data2 {
|
||||
border: 1px solid #E7EBF5;
|
||||
border-radius: 18px;
|
||||
box-shadow: inset 1px 2px 12px rgba(14, 86, 221, 0.32);
|
||||
}
|
||||
|
||||
.data2 {
|
||||
// height: 600.9px;
|
||||
padding: 28px;
|
||||
}
|
||||
|
||||
.title {
|
||||
position: relative;
|
||||
|
||||
&::before {
|
||||
content: '';
|
||||
width: 8px;
|
||||
height: 30px;
|
||||
background-color: #003AB5;
|
||||
position: absolute;
|
||||
left: -15px;
|
||||
top: -3px;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
@ -0,0 +1 @@
|
|||
.page[data-v-ddb16f2e]{font-family:PingFang SC;-webkit-user-select:none;user-select:none;background-image:none;background-color:#cacaca;background-position:0 0;background-repeat:no-repeat;background-size:cover;color:#3b3b3b;line-height:1}.download[data-v-ddb16f2e]{cursor:pointer}.download[data-v-ddb16f2e]:hover{color:#00e4ff}.nav[data-v-ddb16f2e]:before{top:-48px}.nav .child[data-v-ddb16f2e]:hover,.nav .childs[data-v-ddb16f2e]:hover{text-decoration:underline}.nav[data-v-ddb16f2e]:after{bottom:-49px;transform:rotate(-90deg)}.nav.active[data-v-ddb16f2e]{color:#002fa7;background-color:#e6ecff}.nav.active a[data-v-ddb16f2e]{color:#002fa7}.nav.active[data-v-ddb16f2e]:before,.nav.active[data-v-ddb16f2e]:after{opacity:1}.nav.actives[data-v-ddb16f2e]{padding:0!important;color:#002fa7;background-color:#f5f8ff}.nav.actives a[data-v-ddb16f2e]{color:#002fa7}.nav.actives[data-v-ddb16f2e]:before,.nav.actives[data-v-ddb16f2e]:after{opacity:1}.nav.actives .onActive[data-v-ddb16f2e]{background-color:#e6ecff;border-radius:32px 0 0 32px;padding:24px 36px}.main[data-v-ddb16f2e]{width:100%;height:95%;background-color:#4877fb}[data-v-ddb16f2e]::-webkit-scrollbar{display:none;scrollbar-width:none}
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
|
|
@ -0,0 +1,7 @@
|
|||
import { WEEK_ENUM_CN } from '@/utils/enums'
|
||||
|
||||
export function useDate() {
|
||||
const day = useDateFormat(useNow(), 'YYYY年MM月DD日')
|
||||
const week: any = useDateFormat(useNow(), 'd')
|
||||
return { day, week: `星期${WEEK_ENUM_CN[unref(week)]}` }
|
||||
}
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Generated by Pixelmator Pro 3.3.1 -->
|
||||
<svg width="246" height="26" viewBox="0 0 246 26" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<image id="WHATS-NEWS-" x="0" y="0" width="246" height="26" xlink:href="data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAAPYAAAAaCAYAAACElKExAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAA9qADAAQAAAABAAAAGgAAAAAQuEK9AAANI0lEQVR4Ae1cUXIbuRHFjJVd5yvMX+JNVcafTirZ8V7A1AlWPoHkE1i+gEX7ArZPYPoEqz2Bqf8kO94k5c/QVbvO/oWfiWNz8t4MQAGNxnAoDymnSqiiBmh0N4BGN9DowSgzV+mTlMBvyslYdmzPmGpeTRYSflW+koCUAHTlKn1qEqBRL032Uvbrvan3AZtJ+FX5SgJSAnu/KicFrLuQFSz/UE1mGnwTWBd/twMV5WT03phS4+twtLovykmZGTOSdbUxix+rSSXhstzVrsNFv+Y/VZO5K2tPbXfV8FKwvv1dNx+UB3gVxmSBLGuTLa6ZZdUly1TfCP+uLEfX994HPFX893vzW1U19+v+Xv6+zPeyaI6MwH1dloXZe1/4tH3zt/70txlxP1Yf1rWX4k+61Nw4HftgcuhqLeRQV9DfeZeukv6dMWM3p+Dxi2XDyyyMqV+1fa6rz7Dg+97cXm6yo6UxJy1C+BcKu5/qcIiZLl0z5j52n2Mdo/4l4TRqbYdq69K7FAb4BAMdE89PUOQZyvs+TMv/x+RHoH+i1TkY5HOK/F1X1p6pvmu4Gkz21yqBRK0kgOV24hv5HrZGHWNhjAZ9NFAQc6OcTN9Wk3sxVhrSGPUy9iAkRZZ/iGSVZ/kTND6WuCZfPgJssoLnyyOzzFQ9XOGkM7APg2Z0fbBkDU6axfoazNNzyLhUMDk3t31463Xl99+Z+oBwzkGcWuiN8tECuX3NwNsNL/vG0aIPPq+GN7ljbhfg8+xtdTIhLgy7nmHSVYHWJi+I5KcvysdHtakLH+by5CUXgnZ10QZ1+edFCPPQ9T39rA9oPP5qmMYdpgb9GklOgM0kzBr1S8BLWZcqa3Oawt0Ujlk+4O5+u6oWm9IOgQ8ZnYHPWONFz1F6XjCEiYZL2NLUU4kPsCpnOTe0EdA/x46aYi/hI6w60ZxLpDVl0p9gTIbGvUf3jCu5ljQDBuwEuIWGDyP+EvCZX4dB9xKGT7OLvHVb1b7J9v9r8gPAphK+rTJW5TuQm2T/QgLgcXyTkq/E3VX5ev5hp7IKx1VX3L20BD0vAJ+7Oho68tRlNWUmX6Diqau0+uKKwRMzdeYA7U5No760xDFNcrsTzbVuUMF8OHcIlAsfFuZDI7bCI42Scns+UKp2Azrs2wwWs/t9cYfAU4w1OodRgYA3HqK9IXlkxnw9JL9NeOFIWaXw4ZWO/bo8sfs6nMwsuUl5KS+9QpD128UxioZ1qYm6gYWMKYNAYvcailM01fZPKsDl4QT4XCUxaDV9MMuZWrEjIBatgw2aKjVXbgP63qh2ZxgJgheibKSiinrOJ37ZG/y+rOHm2bksBN7gRbR1ae44XWeeVzEoKT+A6t+Gg83KsByW5JFF814tRRBc7VhsF9A5BMvqM/yaABjpO/Ab9pAnxsM4jwuU2VbbBVQdA2xu1Bg2iNGYOViRnGeK8yzPHeGq59e5PFcLd87uwF8o5xfHYutPBJA41kJpqIIQ5xBiJAsGGYE/wS9KiC3sSyDG/gSwUsLBe4rd4oUPh9IsXBnHGe7Ersjn4jNTP/UBzCfcddZ0Bse4cEheQ5cHd8fzWL7pPjNwGs9fbKjqcWfFVhpcWt7cFNvUuuGuFD5x5r79U3UyD6FtiZsGotorHfBxbEAtCt5iHk/Rp+98XJfHMaI1bL4KgSI6ePD0DRVKD/ckULoAl4VQgCn8Jmod0e4Q8LXWFgT1Ai7YHOM8UOoPAZsocPVVx6/Lx4x0KujZmx+qk5lS0YAwC3f8OvCYbhK4A72qII6nFnl1dUM90QfKdzoUP/c6qx+/ZmeL5k8aKsrlOn6+l5bCxwyfrePD+usd8zL0JkcdbnZs7rCMpmkpNNT1wghdltCVP+cfuRXnVSIHt+IQfRsLsC2m+OvYhNpI8pGGgZdCp59jAhLBxIK73bYNIzfLZ+gbf03CBFUu3+eJxekY/eQy/a3znPrQXRQny7KqrkO9gLJfmjve9ZbHGSqfGO9o3Zghe+LNW53R8bkpruPD+ne4cIRo+TMeQYcwZMj4fqpd3r1oDNsisIOlRHaGagdXyHpZpsviwSJ+rKPwPZw12cYFXoPTv7qNcEMscaqcwG+Uj091d64R5r2YdDhIX2PEDnKGVsdayzRujPC4PW9mswxG/mP1cKrhfixsWRt4ObHeDOmOv/7qD+qEtX3PHt36y/cTNw4uhImF2ThDxVFI1UvHwz3tUXLWFVvy56trgwRPXB6qn+NIh7sEj3jWnn3AAu50zrXZ54mj5HN4lUcaLuYeC8fJHGN0icGWODlDTQxuISmcy9J1lvOFIem3XaYHoLWBcb5wcBqCy4dP1UUPUXZU6rk4jrhAUaGgTP/C8eB46O5lebNjzSVfyFA97ki8octdb3nOYz5q4CzS5fboaQwvDGn9pBFJuAaTOCjDyLNjGPk/MCcvrQehoMUgzOMkZdTAXnxuls15fGXYcLlfxWzAwkbGz4USYK1cRg86al+L6cIAXuXh7jRLAWI8Y61RuuEO/jMv72D2ObKBNwHefbFdHJtbcX0bZ2T8Sbva9yXphwcljfQAW2zjjvfjMDTWeUAr5NxGxtHfOyG8KUVjwKJYsCZ+9dXgw/OM3XDAHrS1/f5SH2Hg33VthI5Ta1fJd++4VlrfdPGYlWF3nBWKljEDYWHi7RxAopWOu7tz4UOKZqGYSdiuyjayrTW3csNZ2QonZTS5uuNrTLcNe1s9vAvFeLpZO9kRA6Kb0XRjZ8t8tSj6mNYd90E7yusxHBcvgsxK0ZE5YNoYGjxHJ2gYGj2TMMZgwOs24HNZ11Ee8TpsR31TZS9KKWj1FEa974yaCCvD7nKPW0WIdjr7yip2R+i6JFZFNvlK6dmuQCmjHNEl8n9YreXk2z62V0x31eF17UCRHmCBvQl5P8Bvtg6f9anjSB9aDYcffjCIJusuyx1PHVNgcGO7M47CvmaVDYouQrj7sCTS/QYNcozGzArywrXOm9Chu/hNAZrj15nYt3UuubZZcs559983ajbkB89YZkdLZvxk3fCRD8PeO2vL8euF1nXJirY+/LvpxRRMUvJDFBoiBRK2oJc4oVhhC73W0EVP1UUku75iGnVAAGwA5inAT22Qc4xd5n5KNqkdSLDdqIjI+DMQPPeJIO+DLG+i5j74AvnsUZIojy86dQXQYAgHkhf6eUYY6rjbjv16Dd/WBxdTfBqXh8GdIs9f8+WZ5cVo9ogwmVxwT8K7yuhv03eJIwy7ua1USiSU2RmRWneHqyMM/ySsbISndf7SLqZg8pQxhL3uW8LKSV7Tvvi7xLMrN5XptCt6OnSf/r28dgrX+7nkK1+Fyfo+ZT/q3QefMkCQaQ7cQsGP9MAdQ62RjAVNhN/Wxx6KoAuK1iOosCtPGTQLKnsW7Jdbkz7oK1ecyFjJU25yZKTO3eHqqDQU4bc4bpdXKLYOilfqj2iyuWL6EfQ7IuWV0t0kftGV2d1pNy2uayVpeJFunh9D1TdDET5bxkah7pTrenWR11uSJ132dcG2YMdGRG8Gd0HyUcvOoNesjoJWD2oIpMGLNpKtTtBFG7vWegAPLkr/sXQ4hhzbI88bt8g6BXXuONo4/Nh2NqGHsn8L/INNaPrgvv7qj5NOvGU+lf/ggYYHTe7Tl8rx5pk52OlchfJ0u7xfRbnbL+7QdjbnDTBeFnHGbI2R381fKPkeGHnAK8ECk83+WT3clwwDw6a7QOQeSfzvLV44yY7W0TkFXIc3fD0j2ao4MZF1p3Hyax157mL/7Hmpk3b4cZxzRJ+wULUyd0chN3epCxqOmgrn8kM+6Y7/PP/wBJJG34ZMzafCaYZ772eonPsINDzIxQepechx5ipogB0uvENrnm4R9YF2kxsDNsZxjTpiuFC4eVE10GPARcArBtl2sY5tjLrJBcO6+iuawLAJ5QqgKfKKosmELgtdeNCEKEpJE4aCNiioFUj8UQAbwVhfdN3bJg6uARYY2Zh5kYrwHr2o/YSLULezbXSP7jhuiZ2C99E2+G/Ck7rmDKqbTh4/6cJ3B1JpI908L1S72tk16sQFsQYVy1e0kHJBCZL20j1AQEGexTW3RNKgDIHtPvHfH6Va9S+lpHC6ovhw3Q5TdJ8wHK92tnO9lGOus9StvUuRSA+dk5dM1h8X+9jI5qPt9hw35RcZdp/3zDyL+w312Yl9l8en3XYe7aaML7iUkuqHPR8lFGTQgFyqC0PCeTtpf0iGktfv/vzXU+wgCwm/nHLoWSp9WEgXts9xER7cmcLrwiCcx+/ZV2NJHi6mpSGgP5G8FcOWK1jMSgrDYiSU39FLl8fBt/e0L/xLrQW64Rpcg3Xgjvj/rTSa7cMapV0jc9eLDMZG5Tm5bV+HuYptPafbYrwJX+lZSlrMayS/LgNy9AyyuXz8bG4sLmJ4BJlj03nKy0V9PKh23prLLgEjHgs0e8TiepX+3yXABQwKWchxcCXXJl3iXZW3I4HU1V0uHhddYBkzcuftLj7/A54WDMYEGWElAAAAAElFTkSuQmCC"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.9 KiB |
|
After Width: | Height: | Size: 13 MiB |
|
|
@ -0,0 +1,11 @@
|
|||
const svgModules: any = import.meta.glob('./*', { eager: true })
|
||||
|
||||
export function getImg(name: string) {
|
||||
const svgs = Object.keys(svgModules).reduce((p, c) => {
|
||||
const key: string = String(c).split('/').pop() || 'default'
|
||||
p[key] = svgModules[c].default
|
||||
return p
|
||||
}, {} as any)
|
||||
|
||||
return svgs[name]
|
||||
}
|
||||
|
After Width: | Height: | Size: 2.4 MiB |
|
|
@ -0,0 +1,191 @@
|
|||
import { decodedMappings, traceSegment, TraceMap } from '@jridgewell/trace-mapping';
|
||||
import { GenMapping, maybeAddSegment, setSourceContent, toDecodedMap, toEncodedMap } from '@jridgewell/gen-mapping';
|
||||
|
||||
const SOURCELESS_MAPPING = /* #__PURE__ */ SegmentObject('', -1, -1, '', null);
|
||||
const EMPTY_SOURCES = [];
|
||||
function SegmentObject(source, line, column, name, content) {
|
||||
return { source, line, column, name, content };
|
||||
}
|
||||
function Source(map, sources, source, content) {
|
||||
return {
|
||||
map,
|
||||
sources,
|
||||
source,
|
||||
content,
|
||||
};
|
||||
}
|
||||
/**
|
||||
* MapSource represents a single sourcemap, with the ability to trace mappings into its child nodes
|
||||
* (which may themselves be SourceMapTrees).
|
||||
*/
|
||||
function MapSource(map, sources) {
|
||||
return Source(map, sources, '', null);
|
||||
}
|
||||
/**
|
||||
* A "leaf" node in the sourcemap tree, representing an original, unmodified source file. Recursive
|
||||
* segment tracing ends at the `OriginalSource`.
|
||||
*/
|
||||
function OriginalSource(source, content) {
|
||||
return Source(null, EMPTY_SOURCES, source, content);
|
||||
}
|
||||
/**
|
||||
* traceMappings is only called on the root level SourceMapTree, and begins the process of
|
||||
* resolving each mapping in terms of the original source files.
|
||||
*/
|
||||
function traceMappings(tree) {
|
||||
// TODO: Eventually support sourceRoot, which has to be removed because the sources are already
|
||||
// fully resolved. We'll need to make sources relative to the sourceRoot before adding them.
|
||||
const gen = new GenMapping({ file: tree.map.file });
|
||||
const { sources: rootSources, map } = tree;
|
||||
const rootNames = map.names;
|
||||
const rootMappings = decodedMappings(map);
|
||||
for (let i = 0; i < rootMappings.length; i++) {
|
||||
const segments = rootMappings[i];
|
||||
for (let j = 0; j < segments.length; j++) {
|
||||
const segment = segments[j];
|
||||
const genCol = segment[0];
|
||||
let traced = SOURCELESS_MAPPING;
|
||||
// 1-length segments only move the current generated column, there's no source information
|
||||
// to gather from it.
|
||||
if (segment.length !== 1) {
|
||||
const source = rootSources[segment[1]];
|
||||
traced = originalPositionFor(source, segment[2], segment[3], segment.length === 5 ? rootNames[segment[4]] : '');
|
||||
// If the trace is invalid, then the trace ran into a sourcemap that doesn't contain a
|
||||
// respective segment into an original source.
|
||||
if (traced == null)
|
||||
continue;
|
||||
}
|
||||
const { column, line, name, content, source } = traced;
|
||||
maybeAddSegment(gen, i, genCol, source, line, column, name);
|
||||
if (source && content != null)
|
||||
setSourceContent(gen, source, content);
|
||||
}
|
||||
}
|
||||
return gen;
|
||||
}
|
||||
/**
|
||||
* originalPositionFor is only called on children SourceMapTrees. It recurses down into its own
|
||||
* child SourceMapTrees, until we find the original source map.
|
||||
*/
|
||||
function originalPositionFor(source, line, column, name) {
|
||||
if (!source.map) {
|
||||
return SegmentObject(source.source, line, column, name, source.content);
|
||||
}
|
||||
const segment = traceSegment(source.map, line, column);
|
||||
// If we couldn't find a segment, then this doesn't exist in the sourcemap.
|
||||
if (segment == null)
|
||||
return null;
|
||||
// 1-length segments only move the current generated column, there's no source information
|
||||
// to gather from it.
|
||||
if (segment.length === 1)
|
||||
return SOURCELESS_MAPPING;
|
||||
return originalPositionFor(source.sources[segment[1]], segment[2], segment[3], segment.length === 5 ? source.map.names[segment[4]] : name);
|
||||
}
|
||||
|
||||
function asArray(value) {
|
||||
if (Array.isArray(value))
|
||||
return value;
|
||||
return [value];
|
||||
}
|
||||
/**
|
||||
* Recursively builds a tree structure out of sourcemap files, with each node
|
||||
* being either an `OriginalSource` "leaf" or a `SourceMapTree` composed of
|
||||
* `OriginalSource`s and `SourceMapTree`s.
|
||||
*
|
||||
* Every sourcemap is composed of a collection of source files and mappings
|
||||
* into locations of those source files. When we generate a `SourceMapTree` for
|
||||
* the sourcemap, we attempt to load each source file's own sourcemap. If it
|
||||
* does not have an associated sourcemap, it is considered an original,
|
||||
* unmodified source file.
|
||||
*/
|
||||
function buildSourceMapTree(input, loader) {
|
||||
const maps = asArray(input).map((m) => new TraceMap(m, ''));
|
||||
const map = maps.pop();
|
||||
for (let i = 0; i < maps.length; i++) {
|
||||
if (maps[i].sources.length > 1) {
|
||||
throw new Error(`Transformation map ${i} must have exactly one source file.\n` +
|
||||
'Did you specify these with the most recent transformation maps first?');
|
||||
}
|
||||
}
|
||||
let tree = build(map, loader, '', 0);
|
||||
for (let i = maps.length - 1; i >= 0; i--) {
|
||||
tree = MapSource(maps[i], [tree]);
|
||||
}
|
||||
return tree;
|
||||
}
|
||||
function build(map, loader, importer, importerDepth) {
|
||||
const { resolvedSources, sourcesContent } = map;
|
||||
const depth = importerDepth + 1;
|
||||
const children = resolvedSources.map((sourceFile, i) => {
|
||||
// The loading context gives the loader more information about why this file is being loaded
|
||||
// (eg, from which importer). It also allows the loader to override the location of the loaded
|
||||
// sourcemap/original source, or to override the content in the sourcesContent field if it's
|
||||
// an unmodified source file.
|
||||
const ctx = {
|
||||
importer,
|
||||
depth,
|
||||
source: sourceFile || '',
|
||||
content: undefined,
|
||||
};
|
||||
// Use the provided loader callback to retrieve the file's sourcemap.
|
||||
// TODO: We should eventually support async loading of sourcemap files.
|
||||
const sourceMap = loader(ctx.source, ctx);
|
||||
const { source, content } = ctx;
|
||||
// If there is a sourcemap, then we need to recurse into it to load its source files.
|
||||
if (sourceMap)
|
||||
return build(new TraceMap(sourceMap, source), loader, source, depth);
|
||||
// Else, it's an an unmodified source file.
|
||||
// The contents of this unmodified source file can be overridden via the loader context,
|
||||
// allowing it to be explicitly null or a string. If it remains undefined, we fall back to
|
||||
// the importing sourcemap's `sourcesContent` field.
|
||||
const sourceContent = content !== undefined ? content : sourcesContent ? sourcesContent[i] : null;
|
||||
return OriginalSource(source, sourceContent);
|
||||
});
|
||||
return MapSource(map, children);
|
||||
}
|
||||
|
||||
/**
|
||||
* A SourceMap v3 compatible sourcemap, which only includes fields that were
|
||||
* provided to it.
|
||||
*/
|
||||
class SourceMap {
|
||||
constructor(map, options) {
|
||||
const out = options.decodedMappings ? toDecodedMap(map) : toEncodedMap(map);
|
||||
this.version = out.version; // SourceMap spec says this should be first.
|
||||
this.file = out.file;
|
||||
this.mappings = out.mappings;
|
||||
this.names = out.names;
|
||||
this.sourceRoot = out.sourceRoot;
|
||||
this.sources = out.sources;
|
||||
if (!options.excludeContent) {
|
||||
this.sourcesContent = out.sourcesContent;
|
||||
}
|
||||
}
|
||||
toString() {
|
||||
return JSON.stringify(this);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Traces through all the mappings in the root sourcemap, through the sources
|
||||
* (and their sourcemaps), all the way back to the original source location.
|
||||
*
|
||||
* `loader` will be called every time we encounter a source file. If it returns
|
||||
* a sourcemap, we will recurse into that sourcemap to continue the trace. If
|
||||
* it returns a falsey value, that source file is treated as an original,
|
||||
* unmodified source file.
|
||||
*
|
||||
* Pass `excludeContent` to exclude any self-containing source file content
|
||||
* from the output sourcemap.
|
||||
*
|
||||
* Pass `decodedMappings` to receive a SourceMap with decoded (instead of
|
||||
* VLQ encoded) mappings.
|
||||
*/
|
||||
function remapping(input, loader, options) {
|
||||
const opts = typeof options === 'object' ? options : { excludeContent: !!options, decodedMappings: false };
|
||||
const tree = buildSourceMapTree(input, loader);
|
||||
return new SourceMap(traceMappings(tree), opts);
|
||||
}
|
||||
|
||||
export { remapping as default };
|
||||
//# sourceMappingURL=remapping.mjs.map
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
|
@ -0,0 +1,601 @@
|
|||
<script setup lang="ts">
|
||||
import AppBlock from '@/components/AppBlock.vue'
|
||||
import HomeHead from '@/views/home/components/HomeHead.vue'
|
||||
import HomeHeadSearch from '@/views/home/components/HomeHeadSearch.vue'
|
||||
import { useMessage, NModal, NSelect } from 'naive-ui'
|
||||
import { useUserStore } from '@/stores/modules/user'
|
||||
import UserList from '@/views/home/intelligence/process/UserPages.vue'
|
||||
import zhCn from 'element-plus/dist/locale/zh-cn'
|
||||
import { computed, ref } from 'vue'
|
||||
|
||||
import { getHomeList, statDel, getTreeList,statEdit,updateAmount,amountList } from '@/api/daikin/base'
|
||||
|
||||
|
||||
const locale = computed(() => zhCn)
|
||||
const message = useMessage()
|
||||
const store = useUserStore()
|
||||
const header = { 'token': store.user.token }
|
||||
|
||||
const dataA = ref([])
|
||||
const dataB = ref([])
|
||||
const dataC = ref([])
|
||||
|
||||
const editA = ref()
|
||||
const editB = ref()
|
||||
const editC = ref()
|
||||
|
||||
|
||||
const shomkA = ref(false)
|
||||
const shomkB = ref(false)
|
||||
const shomkC = ref(false)
|
||||
|
||||
async function getDataA() {
|
||||
const {data: dataArr} = await getTreeList({number: 'DIS'})
|
||||
dataA.value = dataArr.map(item => {
|
||||
if (item.childList) {
|
||||
item.childList = item.childList.map(it => {
|
||||
it.second = true;
|
||||
return it;
|
||||
})
|
||||
}
|
||||
return item;
|
||||
})
|
||||
}
|
||||
async function getDataB() {
|
||||
const {data: dataBrr} = await getTreeList({number: 'DSZ'})
|
||||
dataB.value = dataBrr.map(item => {
|
||||
if (item.childList) {
|
||||
item.childList = item.childList.map(it => {
|
||||
it.second = true;
|
||||
return it;
|
||||
})
|
||||
}
|
||||
return item;
|
||||
})
|
||||
}
|
||||
async function getDataC() {
|
||||
const {data: dataCrr} = await getTreeList({number: 'DISH'})
|
||||
dataC.value = dataCrr.map(item => {
|
||||
if (item.childList) {
|
||||
item.childList = item.childList.map(it => {
|
||||
it.second = true;
|
||||
return it;
|
||||
})
|
||||
}
|
||||
return item;
|
||||
})
|
||||
}
|
||||
const dataDIS = ref()
|
||||
const dataDSZ = ref()
|
||||
const dataDISH = ref()
|
||||
onMounted(async () => {
|
||||
getDataA();
|
||||
getDataB();
|
||||
getDataC();
|
||||
getFazhu()
|
||||
})
|
||||
|
||||
const getFazhu=async ()=>{
|
||||
const { data:fazhu} = await amountList()
|
||||
fazhu.forEach((i: { number: string; amount: any }) => {
|
||||
if(i.number=='DIS'){
|
||||
dataDIS.value = i.amount
|
||||
}
|
||||
if(i.number=='DSZ'){
|
||||
dataDSZ.value = i.amount
|
||||
}
|
||||
if(i.number=='DISH'){
|
||||
dataDISH.value = i.amount
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
function computedName(title) {
|
||||
let index = title.indexOf(".");
|
||||
if (index > -1) {
|
||||
return title.slice(0, index - 1);
|
||||
}
|
||||
return title;
|
||||
}
|
||||
|
||||
async function onSubmitA(row) {
|
||||
var { code, msg } = await statEdit({
|
||||
number: "DIS",
|
||||
...row
|
||||
})
|
||||
|
||||
if (code === 200) { message.success("修改成功!") }
|
||||
else { message.error(msg) }
|
||||
shomkA.value = false
|
||||
getDataA();
|
||||
}
|
||||
|
||||
async function onSubmitB(row) {
|
||||
var { code, msg } = await statEdit({
|
||||
number: "Cu",
|
||||
...row
|
||||
})
|
||||
|
||||
if (code === 200) { message.success("修改成功!") }
|
||||
else { message.error(msg) }
|
||||
shomkB.value = false
|
||||
|
||||
getDataB();
|
||||
}
|
||||
|
||||
async function onSubmitC(row) {
|
||||
var { code, msg } = await statEdit({
|
||||
number: "Al",
|
||||
...row
|
||||
})
|
||||
|
||||
if (code === 200) { message.success("修改成功!") }
|
||||
else { message.error(msg) }
|
||||
shomkC.value = false
|
||||
getDataC()
|
||||
}
|
||||
|
||||
|
||||
const handleEditA = (type: string, row: any) => {
|
||||
editA.value = {
|
||||
type: type,
|
||||
number: "DIS",
|
||||
id: "",
|
||||
pid: undefined,
|
||||
stDate: undefined,
|
||||
themeValue: undefined,
|
||||
marketValue: undefined,
|
||||
weitiValue: undefined,
|
||||
}
|
||||
shomkA.value = true
|
||||
if (!row) return
|
||||
if (type === "edit") {
|
||||
for (let key in row) {
|
||||
editA.value[key] = row[key];
|
||||
}
|
||||
}
|
||||
else {
|
||||
editA.value.pid = row.id;
|
||||
}
|
||||
if (type === "edit") {
|
||||
if (row.stDate.length === 4) editA.value.type = "addYear";
|
||||
else editA.value.type = "add";
|
||||
}
|
||||
|
||||
}
|
||||
const handleEditB = (type: string, row: any) => {
|
||||
editB.value = {
|
||||
type: type,
|
||||
number: "DSZ",
|
||||
id: "",
|
||||
pid: undefined,
|
||||
stDate: undefined,
|
||||
themeValue: undefined,
|
||||
marketValue: undefined,
|
||||
weitiValue: undefined,
|
||||
}
|
||||
shomkB.value = true
|
||||
if (!row) return
|
||||
if (type === "edit") {
|
||||
for (let key in row) {
|
||||
editB.value[key] = row[key];
|
||||
}
|
||||
}
|
||||
else {
|
||||
editB.value.pid = row.id;
|
||||
}
|
||||
if (type === "edit") {
|
||||
if (row.stDate.length === 4) editB.value.type = "addYear";
|
||||
else editB.value.type = "add";
|
||||
}
|
||||
}
|
||||
const handleEditC = (type: string, row: any) => {
|
||||
editC.value = {
|
||||
type: type,
|
||||
number: "DISH",
|
||||
id: "",
|
||||
pid: undefined,
|
||||
stDate: undefined,
|
||||
themeValue: undefined,
|
||||
marketValue: undefined,
|
||||
weitiValue: undefined,
|
||||
}
|
||||
shomkC.value = true
|
||||
if (!row) return
|
||||
if (type === "edit") {
|
||||
for (let key in row) {
|
||||
editC.value[key] = row[key];
|
||||
}
|
||||
}
|
||||
else {
|
||||
editC.value.pid = row.id;
|
||||
}
|
||||
|
||||
if (type === "edit") {
|
||||
if (row.stDate.length === 4) editC.value.type = "addYear";
|
||||
else editC.value.type = "add";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
async function handleDeleteA(index: number, row: any) {
|
||||
const { id } = row
|
||||
if (!id) return
|
||||
const { code, msg } = await statDel({ id })
|
||||
if (code === 200) { message.success("删除成功!") }
|
||||
else { message.error(msg) }
|
||||
getDataA();
|
||||
}
|
||||
async function handleDeleteB(index: number, row: any) {
|
||||
const { id } = row
|
||||
if (!id) return
|
||||
const { code, msg } = await statDel({ id })
|
||||
if (code === 200) { message.success("删除成功!") }
|
||||
else { message.error(msg) }
|
||||
|
||||
getDataB();
|
||||
}
|
||||
async function handleDeleteC(index: number, row: any) {
|
||||
|
||||
const { id } = row
|
||||
if (!id) return
|
||||
const { code, msg } = await statDel({ id })
|
||||
if (code === 200) { message.success("删除成功!") }
|
||||
else { message.error(msg) }
|
||||
getDataC()
|
||||
}
|
||||
|
||||
const activeName = ref("DIS")
|
||||
const userList = ref()
|
||||
const showModal = ref(false)
|
||||
const flg = ref()
|
||||
const setUserList =ref()
|
||||
async function getUser(moduleId: any) {
|
||||
showModal.value = !showModal.value
|
||||
flg.value = moduleId
|
||||
const {data: userArr} = await getBPCUser({moduleId})
|
||||
setUserList.value = userArr
|
||||
|
||||
}
|
||||
// 获取子组件传过来的值
|
||||
const handleChild = (data: any) => {
|
||||
console.log(data, 444);
|
||||
const { showModal: show, multipleSelection } = data
|
||||
showModal.value = unref(show)
|
||||
// userList.value = multipleSelection
|
||||
let userIdList: any[] =[]
|
||||
multipleSelection.value.forEach((i: { userId: any })=>{
|
||||
// console.log(dataList.value)
|
||||
userIdList.push(i.userId)
|
||||
})
|
||||
|
||||
BPCSaveUser({
|
||||
moduleId: flg.value,
|
||||
userIdList: userIdList
|
||||
})
|
||||
}
|
||||
const CloseThiss = (data: boolean)=>{
|
||||
showModal.value = data
|
||||
}
|
||||
const shomkD =ref(false)
|
||||
const fazhus = ref()
|
||||
const numbers = ref()
|
||||
const fazhu= (str: any,number: any ) =>{
|
||||
numbers.value = str
|
||||
fazhus.value = number
|
||||
shomkD.value = true
|
||||
|
||||
}
|
||||
const submitFazhu=async()=>{
|
||||
const number = numbers.value
|
||||
const amount = fazhus.value
|
||||
console.log(typeof(number),typeof(amount))
|
||||
const {code,msg} = await updateAmount({number,amount})
|
||||
if (code === 200) {
|
||||
shomkD.value = false
|
||||
message.success("修改成功")
|
||||
getFazhu()
|
||||
}
|
||||
else message.warning(msg)
|
||||
}
|
||||
</script>
|
||||
<template>
|
||||
<HomeHead class="top">
|
||||
<template #content>
|
||||
<!-- <HomeHeadSearch /> -->
|
||||
</template>
|
||||
</HomeHead>
|
||||
<AppBlock class="w-full h950px p30px text-#000">
|
||||
<div class="font-600 flex items-center">
|
||||
<!-- <img src="./images/logo.svg" class="h56px mr21px" /> -->
|
||||
<div class="text-36px text-#000">数据平台管理</div>
|
||||
</div>
|
||||
<el-tabs type="card" v-model="activeName" class="demo-tabs mt30px text-20px" @tab-click="handleClick">
|
||||
<el-tab-pane name="DIS">
|
||||
<template #label>
|
||||
<span class="custom-tabs-label">
|
||||
|
||||
<span class="text-20px">DIS</span>
|
||||
</span>
|
||||
</template>
|
||||
<div class=" cont relative w100% h800px overflow-y-auto">
|
||||
<el-button type="primary" @click="handleEditA('addYear')" class="my20px">新增</el-button>
|
||||
<span class="text-18px ml-20px"> 发注金额:{{dataDIS||0}} 百万元</span>
|
||||
<el-button type="primary" @click="fazhu('DIS',dataDIS)" class="my20px ml-10px">{{activeName}}发注金额修改</el-button>
|
||||
<!-- <el-button type="primary" @click="getUser(1)" > 查看范围</el-button> -->
|
||||
<el-table :data="dataA" style="width: 95%"
|
||||
row-key="id"
|
||||
border
|
||||
:tree-props="{ children: 'childList' }"
|
||||
:header-cell-style="{ background:'#2A7BF7',color:'#fff',height:'60px',textAlign: 'center','font-size':'24px'}"
|
||||
:cell-style="{ 'text-align': 'center'}">
|
||||
|
||||
<el-table-column label="时间" prop="stDate" />
|
||||
<el-table-column label="C/D-交涉(%)" prop="negValue" />
|
||||
<el-table-column label="C/D-THEME(%)" prop="themeValue" />
|
||||
<el-table-column label="市况(%)" prop="marketValue" />
|
||||
<el-table-column label="为替(%)" prop="weitiValue" />
|
||||
<el-table-column label="操作" width="260px">
|
||||
<template #default="scope">
|
||||
<el-button size="small" type="primary" @click="handleEditA('add', scope.row)" v-if="!scope.row.second">新增数据</el-button>
|
||||
<el-button size="small" @click="handleEditA('edit', scope.row)">编辑</el-button>
|
||||
<el-button size="small" type="danger" @click="handleDeleteA(scope.$index, scope.row)">删除</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
</el-tab-pane>
|
||||
|
||||
<el-tab-pane name="DSZ">
|
||||
<template #label>
|
||||
<span class="custom-tabs-label">
|
||||
<span class="text-20px">DSZ</span>
|
||||
</span>
|
||||
</template>
|
||||
<div>
|
||||
<el-button type="primary" @click="handleEditB('addYear')" class="my20px">新增</el-button>
|
||||
<span class="text-18px ml-20px"> 发注金额:{{dataDSZ||0}} 百万元</span>
|
||||
<el-button type="primary" @click="fazhu('DSZ',dataDSZ)" class="my20px ml-10px">{{activeName}}发注金额修改</el-button>
|
||||
<!-- <el-button type="primary" @click="getUser(2)" > 查看范围</el-button> -->
|
||||
<el-table :data="dataB" style="width: 95%"
|
||||
row-key="id"
|
||||
border
|
||||
:tree-props="{ children: 'childList' }"
|
||||
:header-cell-style="{ background:'#2A7BF7',color:'#fff',height:'60px',textAlign: 'center','font-size':'24px'}"
|
||||
:cell-style="{ 'text-align': 'center'}">
|
||||
|
||||
<el-table-column label="时间" prop="stDate" />
|
||||
<el-table-column label="C/D-交涉(%)" prop="negValue" />
|
||||
<el-table-column label="C/D-THEME(%)" prop="themeValue" />
|
||||
<el-table-column label="市况(%)" prop="marketValue" />
|
||||
<el-table-column label="为替(%)" prop="weitiValue" />
|
||||
<el-table-column label="操作" width="260px">
|
||||
<template #default="scope">
|
||||
<el-button size="small" type="primary" @click="handleEditB('add', scope.row)" v-if="!scope.row.second">新增数据</el-button>
|
||||
<el-button size="small" @click="handleEditB('edit', scope.row)">编辑</el-button>
|
||||
<el-button size="small" type="danger" @click="handleDeleteB(scope.$index, scope.row)">删除</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
</el-tab-pane>
|
||||
|
||||
<el-tab-pane name="DISH">
|
||||
<template #label>
|
||||
<span class="custom-tabs-label">
|
||||
|
||||
<span class="text-20px">DISH</span>
|
||||
</span>
|
||||
</template>
|
||||
|
||||
<div>
|
||||
<el-button type="primary" @click="handleEditC('addYear')" class="my20px">新增</el-button>
|
||||
<span class="text-18px ml-20px"> 发注金额:{{dataDISH||0}} 百万元</span>
|
||||
<el-button type="primary" @click="fazhu('DISH',dataDISH)" class="my20px ml-10px">{{activeName}}发注金额修改</el-button>
|
||||
<!-- <el-button type="primary" @click="getUser(3)" > 查看范围</el-button> -->
|
||||
<el-table :data="dataC" style="width: 95%"
|
||||
row-key="id"
|
||||
border
|
||||
:tree-props="{ children: 'childList' }"
|
||||
:header-cell-style="{ background:'#2A7BF7',color:'#fff',height:'60px',textAlign: 'center','font-size':'24px'}"
|
||||
:cell-style="{ 'text-align': 'center'}">
|
||||
|
||||
<el-table-column label="时间" prop="stDate" />
|
||||
<el-table-column label="C/D-交涉(%)" prop="negValue" />
|
||||
<el-table-column label="C/D-THEME(%)" prop="themeValue" />
|
||||
<el-table-column label="市况(%)" prop="marketValue" />
|
||||
<el-table-column label="为替(%)" prop="weitiValue" />
|
||||
<el-table-column label="操作" width="260px">
|
||||
<template #default="scope">
|
||||
<el-button size="small" type="primary" @click="handleEditC('add', scope.row)" v-if="!scope.row.second">新增数据</el-button>
|
||||
<el-button size="small" @click="handleEditC('edit', scope.row)">编辑</el-button>
|
||||
<el-button size="small" type="danger" @click="handleDeleteC(scope.$index, scope.row)">删除</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
<el-form-item>
|
||||
</el-form-item>
|
||||
</AppBlock>
|
||||
|
||||
<n-modal v-model:show="shomkA">
|
||||
<div class="bg-#FFF p30px">
|
||||
<el-form :model="editA" label-width="120px" :inline="true">
|
||||
<!-- <el-input type="number" style="position: absolute; left: 0; top: 0; clip: rect(0, 0, 0, 0)" >
|
||||
<template #append>%</template>
|
||||
</el-input> -->
|
||||
<el-form-item :label="editA.type === 'add' ? '月份' : '年份'" >
|
||||
<el-config-provider :locale="locale">
|
||||
<el-date-picker
|
||||
v-model="editA.stDate"
|
||||
:value-format="editA.type === 'add' ? 'YYYY-MM' : 'YYYY'"
|
||||
:type="editA.type === 'add' ? 'month' : 'year'"
|
||||
:placeholder="editA.type === 'add' ? '选择月份' : '选择年份'"
|
||||
/>
|
||||
</el-config-provider>
|
||||
</el-form-item>
|
||||
<br>
|
||||
<el-form-item label="C/D-交涉">
|
||||
<el-input type="number" v-model="editA.negValue" >
|
||||
<template #append>%</template>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
<br>
|
||||
<el-form-item label="C/D-THEME">
|
||||
<el-input type="number" v-model="editA.themeValue">
|
||||
<template #append>%</template>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
<br>
|
||||
<el-form-item label="市况">
|
||||
<el-input v-model="editA.marketValue" type="number">
|
||||
<template #append>%</template>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
<br>
|
||||
<el-form-item label="为替">
|
||||
<el-input v-model="editA.weitiValue" type="number">
|
||||
<template #append>%</template>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
<br>
|
||||
</el-form>
|
||||
<hr class="mb15px border-#f1f1f1">
|
||||
|
||||
<el-button class="flex-center" type="primary" @click="onSubmitA(editA)">确认</el-button>
|
||||
</div>
|
||||
</n-modal>
|
||||
<n-modal v-model:show="shomkB">
|
||||
<div class="bg-#FFF p30px">
|
||||
<el-form :model="editB" label-width="120px" :inline="true">
|
||||
<!-- <el-input type="number" style="position: absolute; left: 0; top: 0; clip: rect(0, 0, 0, 0)" >
|
||||
<template #append>%</template>
|
||||
</el-input> -->
|
||||
<el-form-item :label="editB.type === 'add' ? '月份' : '年份'" >
|
||||
<el-config-provider :locale="locale">
|
||||
<el-date-picker
|
||||
v-model="editB.stDate"
|
||||
:value-format="editB.type === 'add' ? 'YYYY-MM' : 'YYYY'"
|
||||
:type="editB.type === 'add' ? 'month' : 'year'"
|
||||
:placeholder="editB.type === 'add' ? '选择月份' : '选择年份'"
|
||||
/>
|
||||
</el-config-provider>
|
||||
</el-form-item>
|
||||
<br>
|
||||
<el-form-item label="C/D-交涉">
|
||||
<el-input type="number" v-model="editB.negValue" >
|
||||
<template #append>%</template>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
<br>
|
||||
<el-form-item label="C/D-THEME">
|
||||
<el-input type="number" v-model="editB.themeValue">
|
||||
<template #append>%</template>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
<br>
|
||||
<el-form-item label="市况">
|
||||
<el-input v-model="editB.marketValue" type="number">
|
||||
<template #append>%</template>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
<br>
|
||||
<el-form-item label="为替">
|
||||
<el-input v-model="editB.weitiValue" type="number">
|
||||
<template #append>%</template>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
<br>
|
||||
</el-form>
|
||||
<hr class="mb15px border-#f1f1f1">
|
||||
|
||||
<el-button class="flex-center" type="primary" @click="onSubmitB(editB)">确认</el-button>
|
||||
</div>
|
||||
</n-modal>
|
||||
<n-modal v-model:show="shomkC">
|
||||
<div class="bg-#FFF p30px">
|
||||
<el-form :model="editC" label-width="120px" :inline="true">
|
||||
<!-- <el-input type="number" style="position: absolute; left: 0; top: 0; clip: rect(0, 0, 0, 0)" >
|
||||
<template #append>%</template>
|
||||
</el-input> -->
|
||||
<el-form-item :label="editC.type === 'add' ? '月份' : '年份'" >
|
||||
<el-config-provider :locale="locale">
|
||||
<el-date-picker
|
||||
v-model="editC.stDate"
|
||||
:value-format="editC.type === 'add' ? 'YYYY-MM' : 'YYYY'"
|
||||
:type="editC.type === 'add' ? 'month' : 'year'"
|
||||
:placeholder="editC.type === 'add' ? '选择月份' : '选择年份'"
|
||||
/>
|
||||
</el-config-provider>
|
||||
</el-form-item>
|
||||
<br>
|
||||
<el-form-item label="C/D-交涉">
|
||||
<el-input type="number" v-model="editC.negValue" >
|
||||
<template #append>%</template>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
<br>
|
||||
<el-form-item label="C/D-THEME">
|
||||
<el-input type="number" v-model="editC.themeValue">
|
||||
<template #append>%</template>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
<br>
|
||||
<el-form-item label="市况">
|
||||
<el-input v-model="editC.marketValue" type="number">
|
||||
<template #append>%</template>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
<br>
|
||||
<el-form-item label="为替">
|
||||
<el-input v-model="editC.weitiValue" type="number">
|
||||
<template #append>%</template>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
<br>
|
||||
</el-form>
|
||||
<hr class="mb15px border-#f1f1f1">
|
||||
|
||||
<el-button class="flex-center" type="primary" @click="onSubmitC(editC)">确认</el-button>
|
||||
</div>
|
||||
</n-modal>
|
||||
|
||||
<n-modal v-model:show="showModal">
|
||||
<UserList :userDataList="setUserList" @clickChild="handleChild" @CloseThis="CloseThiss"/>
|
||||
</n-modal>
|
||||
<n-modal v-model:show="shomkD">
|
||||
<div class="bg-#FFF p30px">
|
||||
<el-form label-width="120px" :inline="true">
|
||||
<el-form-item label="发注金额">
|
||||
<el-input v-model="fazhus" type="number"> </el-input>
|
||||
</el-form-item>
|
||||
<br>
|
||||
</el-form>
|
||||
<hr class="mb15px border-#f1f1f1">
|
||||
|
||||
<el-button class="flex-center" type="primary" @click="submitFazhu">确认</el-button>
|
||||
</div>
|
||||
</n-modal>
|
||||
</template>
|
||||
|
||||
<style lang="less">
|
||||
.demo-tabs > .el-tabs__content {
|
||||
color: #6b778c;
|
||||
font-size: 32px;
|
||||
font-weight: 600;
|
||||
}
|
||||
.top {
|
||||
position: absolute;
|
||||
right: 30px;
|
||||
top: -92px;
|
||||
}
|
||||
.flex-center {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
margin: 0 auto;
|
||||
}
|
||||
</style>
|
||||
|
|
@ -0,0 +1 @@
|
|||
const e="/assets/bejqt3-af2905ee.png",t=Object.freeze(Object.defineProperty({__proto__:null,default:e},Symbol.toStringTag,{value:"Module"}));export{t as _,e as a};
|
||||
|
|
@ -0,0 +1,49 @@
|
|||
/** https://www.npmjs.com/package/axios
|
||||
*/
|
||||
import axios from "axios";
|
||||
|
||||
export function createAxios(options?: any) {
|
||||
const { beforeRequest, afterResponse, afterError, ...axiosOptions } =
|
||||
options || {};
|
||||
console.log('options',options)
|
||||
const service = axios.create(
|
||||
Object.assign(
|
||||
{
|
||||
// baseURL: 'http://admin.echo.mteam01.com/openApi/',
|
||||
timeout: 20000,
|
||||
},
|
||||
axiosOptions
|
||||
)
|
||||
);
|
||||
// 请求拦截
|
||||
service.interceptors.request.use(
|
||||
(config: any) => {
|
||||
console.log(config)
|
||||
beforeRequest && beforeRequest(config);
|
||||
return config;
|
||||
},
|
||||
(error: any) => Promise.reject(error)
|
||||
);
|
||||
|
||||
// 响应拦截
|
||||
service.interceptors.response.use(
|
||||
async (res: { config: any; data: any; headers: any; status: any }) => {
|
||||
const reductResult = afterResponse && (await afterResponse(res));
|
||||
return reductResult ? reductResult : res;
|
||||
},
|
||||
async (err: {
|
||||
config: any;
|
||||
message: any;
|
||||
response: { status: any };
|
||||
code: string;
|
||||
}) => {
|
||||
// =====》 通用错误处理
|
||||
console.error("> Request error: \n", err);
|
||||
afterError && (await afterError({ err, status }));
|
||||
return Promise.reject(err);
|
||||
}
|
||||
);
|
||||
return service;
|
||||
}
|
||||
|
||||
export default createAxios();
|
||||
|
After Width: | Height: | Size: 526 B |
|
|
@ -0,0 +1,278 @@
|
|||
<script setup lang="ts">
|
||||
import { RouterView } from "vue-router";
|
||||
import { useUserStore } from "@/stores/modules/user";
|
||||
import { getCateTreePage, download, getActCateFileList, getBPCActList } from "@/api/daikin/base";
|
||||
import { databaseld } from "@/stores/modules/database";
|
||||
import DataBaseHead from "./components/DataBaseHead.vue";
|
||||
import { useMessage } from 'naive-ui'
|
||||
const message = useMessage()
|
||||
const { push } = useRouter();
|
||||
const store = useUserStore();
|
||||
const database = databaseld();
|
||||
const activeMenuKey = ref();
|
||||
const route = useRoute()
|
||||
let idx = ref(0);
|
||||
|
||||
const rowData = ref();
|
||||
const tableData = ref([]);
|
||||
const srcType = ref()
|
||||
let subTitle = ref();
|
||||
let type = ref();
|
||||
function getLastSubstring(str: string): string {
|
||||
const lastIndex = str.lastIndexOf('.');
|
||||
if (lastIndex !== -1) {
|
||||
return str.substring(lastIndex + 1);
|
||||
} else {
|
||||
return '';
|
||||
}
|
||||
}
|
||||
|
||||
const getId = async (id) => {
|
||||
const { rows } = await getActCateFileList({ cateId: id })
|
||||
console.log(rows);
|
||||
rowData.value = rows
|
||||
}
|
||||
|
||||
const showDetail = (row) => {
|
||||
sessionStorage.setItem("title", row.title);
|
||||
console.log(row.content);
|
||||
sessionStorage.setItem("content", row.content)
|
||||
push({name: "bcpDetail"})
|
||||
}
|
||||
|
||||
const download = async (row, key)=>{
|
||||
// console.log(row)
|
||||
if(!row) return
|
||||
if(row.isSelect===2){
|
||||
message.error("没有访问权限")
|
||||
return
|
||||
}
|
||||
let filePath = row[key]
|
||||
if(!filePath) {
|
||||
message.info("没有可预览文件!")
|
||||
return
|
||||
}
|
||||
srcType.value = getLastSubstring(filePath)
|
||||
if(['doc', 'docx', 'ppt', 'pptx', 'xls', 'xlsx','pdf'].includes(srcType.value)){
|
||||
// src.value = filePath
|
||||
// pdfShow.value = true
|
||||
filePath='https://view.xdocin.com/view?src='+filePath
|
||||
const screenWidth = window.screen.width;
|
||||
const screenHeight = window.screen.height;
|
||||
window.open(filePath, '', 'width=' + screenWidth + ',height=' + screenHeight + ',top=' + 0 + ',left=' + 0)
|
||||
}
|
||||
else{
|
||||
message.error("文件格式不是 'doc', 'docx', 'ppt', 'pptx', 'xls', 'xlsx','pdf'!")
|
||||
}
|
||||
}
|
||||
|
||||
function getFileName(url) {
|
||||
if (!url) return "";
|
||||
let lastSplashIndex = url.lastIndexOf("/");
|
||||
let lastDotIndex = url.lastIndexOf(".");
|
||||
return url.slice(lastSplashIndex + 1, lastDotIndex);
|
||||
}
|
||||
// const {currentPage,pageSize} = pageInfo
|
||||
// if(!prop.cateId) return
|
||||
// const {rows,total} = await cateFileList({cateId:prop.cateId,pageNum:currentPage,pageSize})
|
||||
// pageInfo.total =total
|
||||
// tableData.value = rows
|
||||
const getList = async (obj) => {
|
||||
const {currentPage,pageSize} = pageInfo
|
||||
const {rows, total} = await getBPCActList({...obj, pageNum:currentPage,pageSize});
|
||||
tableData.value = rows;
|
||||
pageInfo.total = total
|
||||
}
|
||||
const pageInfo = reactive({
|
||||
currentPage:1,
|
||||
pageSize:13,
|
||||
total:10
|
||||
})
|
||||
onMounted(() => {
|
||||
subTitle.value = route.query.title;
|
||||
console.log(subTitle.value,9999999999999)
|
||||
type.value = route.query.type;
|
||||
getList({moduleId: 1})
|
||||
});
|
||||
const lazyState = computed(() => [pageInfo.currentPage])
|
||||
watch(
|
||||
() => unref(lazyState),
|
||||
async (v) => {
|
||||
getList({moduleId: 1})
|
||||
},
|
||||
{ immediate: true, deep: true },
|
||||
)
|
||||
|
||||
const handleSizeChange=(e)=>{
|
||||
console.log(e)
|
||||
}
|
||||
|
||||
const handleCurrentChange=(e)=>{
|
||||
console.log(e)
|
||||
}
|
||||
function unescapeHTML(html: string) {
|
||||
if (!html) return "";
|
||||
const doc = new DOMParser().parseFromString(html, "text/html");
|
||||
return doc.documentElement.textContent;
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="page w-1920px h-1080px flex">
|
||||
<div class="main flex-1 pb15px pt0px relative">
|
||||
<DataBaseHead :subTitle="subTitle" />
|
||||
<div class="w-full h-1px bg-#507FFD mt50px rd-b-20px"></div>
|
||||
<div class="w-full h-95%">
|
||||
<div class="bg-#fff rd-15px px30px pt30px w-full h930px">
|
||||
<div
|
||||
class="rd-15px w-full h870px"
|
||||
style="box-shadow: 1px 2px 26px -3px #cdcccc"
|
||||
>
|
||||
<div class="p30px relative h790px">
|
||||
<table
|
||||
class="history w-full text-center text-16px border-spacing-0"
|
||||
>
|
||||
<thead
|
||||
style="
|
||||
background-color: #e7edff;
|
||||
color: #0a0a0a;
|
||||
height: 50px;
|
||||
width: 220px;
|
||||
border: 1px solid #417bef;
|
||||
"
|
||||
>
|
||||
<tr class="text-20px leading-50px">
|
||||
<th>
|
||||
日期
|
||||
</th>
|
||||
<th class="wrap">
|
||||
情报内容
|
||||
</th>
|
||||
<th>
|
||||
风险评估
|
||||
</th>
|
||||
<!-- <th>
|
||||
上传时间
|
||||
</th> -->
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody >
|
||||
<tr v-for="(it, index) in tableData" :key="index">
|
||||
<td
|
||||
>
|
||||
<span :title="it.createTime" @click="showDetail(it)"> {{ it.createTime }}</span>
|
||||
</td>
|
||||
<td class="wrap h50px">
|
||||
<div :title="unescapeHTML(it.content )" class="download wrap" @click="download(it, 'filePath')">{{unescapeHTML(it.content )}}</div>
|
||||
</td>
|
||||
<td class="h50px"><span class="download" @click="download(it, 'briefingPath')">{{it.riskEstimation}}</span></td>
|
||||
<td
|
||||
>
|
||||
<!-- <span > {{ it.createTime }}</span> -->
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="float-right absolute bottom-20px right-30px">
|
||||
<el-pagination v-model:current-page="pageInfo.currentPage" v-model:page-size="pageInfo.pageSize"
|
||||
layout="prev, pager, next, jumper" :total="pageInfo.total"
|
||||
@size-change="handleSizeChange" @current-change="handleCurrentChange" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped lang="less">
|
||||
.page {
|
||||
font-family: "PingFang SC";
|
||||
user-select: none;
|
||||
background-image: none;
|
||||
background-color: #cacaca;
|
||||
background-position: 0 0;
|
||||
background-repeat: no-repeat;
|
||||
background-size: cover;
|
||||
color: #3b3b3b;
|
||||
|
||||
line-height: 1;
|
||||
}
|
||||
.download {
|
||||
cursor: pointer;
|
||||
}
|
||||
.download:hover {
|
||||
color: #00E4FF;
|
||||
}
|
||||
.nav {
|
||||
&::before {
|
||||
top: -48px;
|
||||
}
|
||||
.child:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
.childs:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
&::after {
|
||||
bottom: -49px;
|
||||
transform: rotate(-90deg);
|
||||
}
|
||||
|
||||
&.active {
|
||||
color: #002fa7;
|
||||
background-color: #e6ecff;
|
||||
|
||||
a {
|
||||
color: #002fa7;
|
||||
}
|
||||
|
||||
&::before,
|
||||
&::after {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
&.actives {
|
||||
padding: 0px !important;
|
||||
color: #002fa7;
|
||||
background-color: #f5f8ff;
|
||||
|
||||
a {
|
||||
color: #002fa7;
|
||||
}
|
||||
|
||||
&::before,
|
||||
&::after {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.onActive {
|
||||
background-color: #e6ecff;
|
||||
border-radius: 32px 0 0 32px;
|
||||
|
||||
padding: 24px 36px 24px 36px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.main {
|
||||
width: 100%;
|
||||
height: 95%;
|
||||
background-color: #4877fb;
|
||||
}
|
||||
|
||||
&::-webkit-scrollbar {
|
||||
display: none;
|
||||
scrollbar-width: none;
|
||||
}
|
||||
.wrap{
|
||||
width: 420px; //设置需要固定的宽度
|
||||
white-space: nowrap; //不换行
|
||||
text-overflow: ellipsis; //超出部分用....代替
|
||||
overflow: hidden; //超出隐藏
|
||||
}
|
||||
</style>
|
||||
|
|
@ -0,0 +1 @@
|
|||
const e="/assets/bejqt1-942c3a37.png",t=Object.freeze(Object.defineProperty({__proto__:null,default:e},Symbol.toStringTag,{value:"Module"}));export{t as _,e as a};
|
||||
|
|
@ -0,0 +1,41 @@
|
|||
#!/usr/bin/env pwsh
|
||||
$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
|
||||
|
||||
$exe=""
|
||||
$pathsep=":"
|
||||
$env_node_path=$env:NODE_PATH
|
||||
$new_node_path="C:\Users\ljl\Desktop\dajin\node_modules\.pnpm\npm-run-all@4.1.5\node_modules\npm-run-all\bin\npm-run-all\node_modules;C:\Users\ljl\Desktop\dajin\node_modules\.pnpm\npm-run-all@4.1.5\node_modules\npm-run-all\bin\node_modules;C:\Users\ljl\Desktop\dajin\node_modules\.pnpm\npm-run-all@4.1.5\node_modules\npm-run-all\node_modules;C:\Users\ljl\Desktop\dajin\node_modules\.pnpm\npm-run-all@4.1.5\node_modules;C:\Users\ljl\Desktop\dajin\node_modules\.pnpm\node_modules"
|
||||
if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
|
||||
# Fix case when both the Windows and Linux builds of Node
|
||||
# are installed in the same directory
|
||||
$exe=".exe"
|
||||
$pathsep=";"
|
||||
} else {
|
||||
$new_node_path="/mnt/c/Users/ljl/Desktop/dajin/node_modules/.pnpm/npm-run-all@4.1.5/node_modules/npm-run-all/bin/npm-run-all/node_modules:/mnt/c/Users/ljl/Desktop/dajin/node_modules/.pnpm/npm-run-all@4.1.5/node_modules/npm-run-all/bin/node_modules:/mnt/c/Users/ljl/Desktop/dajin/node_modules/.pnpm/npm-run-all@4.1.5/node_modules/npm-run-all/node_modules:/mnt/c/Users/ljl/Desktop/dajin/node_modules/.pnpm/npm-run-all@4.1.5/node_modules:/mnt/c/Users/ljl/Desktop/dajin/node_modules/.pnpm/node_modules"
|
||||
}
|
||||
if ([string]::IsNullOrEmpty($env_node_path)) {
|
||||
$env:NODE_PATH=$new_node_path
|
||||
} else {
|
||||
$env:NODE_PATH="$new_node_path$pathsep$env_node_path"
|
||||
}
|
||||
|
||||
$ret=0
|
||||
if (Test-Path "$basedir/node$exe") {
|
||||
# Support pipeline input
|
||||
if ($MyInvocation.ExpectingInput) {
|
||||
$input | & "$basedir/node$exe" "$basedir/../npm-run-all/bin/npm-run-all/index.js" $args
|
||||
} else {
|
||||
& "$basedir/node$exe" "$basedir/../npm-run-all/bin/npm-run-all/index.js" $args
|
||||
}
|
||||
$ret=$LASTEXITCODE
|
||||
} else {
|
||||
# Support pipeline input
|
||||
if ($MyInvocation.ExpectingInput) {
|
||||
$input | & "node$exe" "$basedir/../npm-run-all/bin/npm-run-all/index.js" $args
|
||||
} else {
|
||||
& "node$exe" "$basedir/../npm-run-all/bin/npm-run-all/index.js" $args
|
||||
}
|
||||
$ret=$LASTEXITCODE
|
||||
}
|
||||
$env:NODE_PATH=$env_node_path
|
||||
exit $ret
|
||||
|
After Width: | Height: | Size: 19 KiB |
|
|
@ -0,0 +1 @@
|
|||
.top[data-v-b3926438]{position:absolute;right:30px;top:-92px}.g-wrapper[data-v-b3926438]{border-radius:18px;border:1px solid #E7EBF5;box-shadow:inset 1px 2px 12px #0e56dd52;overflow:hidden}.g-wrapper .timeline[data-v-b3926438]{font-size:20px;font-weight:700;color:#142142}.g-wrapper .timeline .one[data-v-b3926438]{position:relative}.g-wrapper .timeline .one .year[data-v-b3926438]{left:-132px;top:-14px;color:#003cb7;font-size:26px;font-weight:400;text-align:center;line-height:50px}
|
||||
|
|
@ -0,0 +1,221 @@
|
|||
<script setup lang="ts">
|
||||
import HomeHead from '@/views/home/components/HomeHead.vue'
|
||||
import { useDate } from '@/views/home/hooks/useDate'
|
||||
import { updateFootprint,getFootprintList,saveFootprintUser,delFootprint} from '@/api/daikin/base'
|
||||
import {useMessage} from 'naive-ui'
|
||||
const { day, week } = useDate()
|
||||
const { push } = useRouter()
|
||||
const message = useMessage()
|
||||
const pageInfo = reactive({
|
||||
currentPage: 1,
|
||||
pageSize: 4,
|
||||
total:10
|
||||
})
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
const listData = ref()
|
||||
async function getPageList(){
|
||||
const {rows,total} = await getFootprintList({pageNum:pageInfo.currentPage,pageSize:pageInfo.pageSize,moduleId:'1'});
|
||||
pageInfo.total =total
|
||||
|
||||
listData.value = rows
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
const handleSizeChange=(e)=>{
|
||||
console.log(e)
|
||||
}
|
||||
|
||||
const handleCurrentChange=(e)=>{
|
||||
console.log(e)
|
||||
}
|
||||
const lazyState = computed(() => [pageInfo.currentPage])
|
||||
watch(
|
||||
() => unref(lazyState),
|
||||
async (v) => {
|
||||
getPageList()
|
||||
},
|
||||
{ immediate: true, deep: true },
|
||||
)
|
||||
const back=()=>{
|
||||
history.back()
|
||||
}
|
||||
const srcType = ref()
|
||||
const openUrl = async (url)=>{
|
||||
|
||||
if(!url) {
|
||||
message.info("没有可预览文件!")
|
||||
return
|
||||
}
|
||||
srcType.value = getLastSubstring(url)
|
||||
if(['doc', 'docx', 'ppt', 'pptx', 'xls', 'xlsx','pdf'].includes(srcType.value)){
|
||||
// src.value = filePath
|
||||
// pdfShow.value = true
|
||||
url='https://view.xdocin.com/view?src='+url
|
||||
const screenWidth = window.screen.width;
|
||||
const screenHeight = window.screen.height;
|
||||
window.open(url, '', 'width=' + screenWidth + ',height=' + screenHeight + ',top=' + 0 + ',left=' + 0)
|
||||
}
|
||||
else{
|
||||
message.error("文件格式不是 'doc', 'docx', 'ppt', 'pptx', 'xls', 'xlsx','pdf'!")
|
||||
}
|
||||
|
||||
}
|
||||
function getLastSubstring(str: string): string {
|
||||
const lastIndex = str.lastIndexOf('.');
|
||||
if (lastIndex !== -1) {
|
||||
return str.substring(lastIndex + 1);
|
||||
} else {
|
||||
return '';
|
||||
}
|
||||
}
|
||||
|
||||
const toDetail = (obj)=>{
|
||||
console.log(obj)
|
||||
if (obj.isSelect === 2) {
|
||||
message.info("没有访问权限")
|
||||
return
|
||||
}
|
||||
else{
|
||||
openUrl(obj.filePath.url)
|
||||
}
|
||||
}
|
||||
const redFrd=(ite)=>{
|
||||
// console.log(ite)
|
||||
const {url} = ite
|
||||
openUrl(url)
|
||||
}
|
||||
const down=(ite)=>{
|
||||
const {url} = ite
|
||||
window.open(url)
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<HomeHead class="tops">
|
||||
|
||||
</HomeHead>
|
||||
<div class="backs" @click="back">返回</div>
|
||||
|
||||
<div class="h-90% relative flex flex-col">
|
||||
<div class="font-600 flex items-end mt30px text-#fff">
|
||||
<div class="text-36px">列表</div>
|
||||
<div class="text-18px ml40px mr25px">{{ day }}</div>
|
||||
<div class="text-18px">{{ week }}</div>
|
||||
</div>
|
||||
<div class="q-wrapper flex-1 mt30px text-#142142 flex flex-col bg-#fff p30px">
|
||||
|
||||
|
||||
<!-- <div v-if="listData&&listData.length>0" v-for="i in listData" :key="i"
|
||||
class="mt8px cursor-pointer flex items-center p15px pl20px text-18px max-w-1205px">
|
||||
|
||||
<span class="truncate flex-1 w0 text-#142142 hover:underline w600px max-w600px min-w600px" @click="toDetail(i)">
|
||||
<img :src="i.imgUrl" class="max-w200px mr20px"/>
|
||||
<a class="no-underline text-#142142">
|
||||
{{ i.title }}
|
||||
</a>
|
||||
</span>
|
||||
|
||||
<span class="shrink-0 ml90px text-#808696 w-200px">{{ i.createTime }}</span>
|
||||
</div>
|
||||
<div v-else class="w-full h-hull">
|
||||
<el-empty :image-size="200" />
|
||||
</div> -->
|
||||
<el-table :data="listData" style="width: 100%; margin-bottom: 20px" row-key="id" border
|
||||
default-expand-all :header-cell-style="{textAlign: 'center',
|
||||
background: '#2A7BF7', color: '#fff',
|
||||
height: '60px', 'font-size': '24px'
|
||||
}" :cell-style="{ 'overflow-y': 'auto' }"
|
||||
:tree-props="{ children: 'childList', hasChildren: 'hasChildren'}">
|
||||
<el-table-column prop="title" label="标题" align="center"/>
|
||||
<el-table-column prop="imgUrl" label="图片" align="center">
|
||||
<template #default="scope">
|
||||
<div style="display: grid;grid-template-columns: repeat(3,1fr);grid-template-rows: masonry;grid-gap: 2px;">
|
||||
<img v-if="scope.row.imgUrl" v-for="i in scope.row.imgUrl" :src="i.url" alt="" class="w-full">
|
||||
</div>
|
||||
|
||||
</template>
|
||||
|
||||
</el-table-column>
|
||||
<el-table-column prop="filePath" label="文件列表" align="center">
|
||||
<template #default="scope">
|
||||
|
||||
<span v-if="scope.row.filePath" v-for="i in scope.row.filePath" class="flex py5px">
|
||||
<img src="../../../assets/images/lvbiao@2x.png" class="mr-5px w-20px"/>
|
||||
<span class="truncate">{{i.originalFileName}}</span>
|
||||
<span class="py3px px-10px rd-5px bg-#2A7BF7 text-#fff" @click="redFrd(i)">预览</span>
|
||||
<!-- <span class="py3px px-10px rd-5px bg-#2A7BF7 text-#fff ml-5px" @click="down(i)">下载</span> -->
|
||||
<br>
|
||||
</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="float-right absolute bottom-20px right-30px">
|
||||
<el-pagination v-model:current-page="pageInfo.currentPage" v-model:page-size="pageInfo.pageSize"
|
||||
layout="prev, pager, next, jumper" :total="pageInfo.total"
|
||||
@size-change="handleSizeChange" @current-change="handleCurrentChange" />
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped lang="less">
|
||||
.backs{
|
||||
position: absolute;
|
||||
top: 25px;
|
||||
left: 25px;
|
||||
color: #fff;
|
||||
// z-index: 500;
|
||||
font-size: 25px;
|
||||
font-weight: bold;
|
||||
text-align: center;
|
||||
justify-content: center;
|
||||
}
|
||||
.truncate {
|
||||
display: block;
|
||||
max-width: 226px;
|
||||
min-width:250px;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
text-align: left;
|
||||
}
|
||||
.tops {
|
||||
right: 30px;
|
||||
top: -92px;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar {
|
||||
width: 1px;
|
||||
}
|
||||
|
||||
.q-wrapper {
|
||||
border-radius: 18px;
|
||||
border: 1px solid #E7EBF5;
|
||||
box-shadow: inset 1px 2px 12px rgba(14, 86, 221, 0.32);
|
||||
overflow: auto;
|
||||
&::after {
|
||||
content: ' ';
|
||||
background-image: url('@/assets/images/bg-card.svg');
|
||||
pointer-events: none;
|
||||
display: block;
|
||||
width: 100%;
|
||||
height: 127px;
|
||||
background-repeat: no-repeat; /* 阻止图片平铺 */
|
||||
background-position: right top;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 0;
|
||||
}
|
||||
}</style>
|
||||
|
After Width: | Height: | Size: 148 KiB |
|
After Width: | Height: | Size: 2.5 KiB |
|
|
@ -0,0 +1,71 @@
|
|||
<template>
|
||||
<vue3-tinymce v-model="content" :setting="state.setting" @change="handleChange" @paste_preprocess="handlePastePreprocess"/>
|
||||
</template>
|
||||
<style scoped></style>
|
||||
<script lang="ts" setup>
|
||||
import Vue3Tinymce from '@jsdawn/vue3-tinymce';
|
||||
import { useUserStore } from '@/stores/modules/user'
|
||||
import { useMessage } from 'naive-ui'
|
||||
|
||||
const message = useMessage()
|
||||
const props = defineProps(["content"]);
|
||||
const emit = defineEmits(['getChildData']);
|
||||
const store = useUserStore()
|
||||
const content = ref()
|
||||
onMounted(() => {
|
||||
console.log(props.content)
|
||||
|
||||
content.value = props.content ? unescapeHTML(props.content) : '';
|
||||
});
|
||||
function unescapeHTML(html: string) {
|
||||
const doc = new DOMParser().parseFromString(html, 'text/html');
|
||||
return doc.documentElement.textContent;
|
||||
}
|
||||
watch(() => props.content, () => {
|
||||
const center = unescapeHTML(props.content)
|
||||
// console.log(center)
|
||||
content.value = center
|
||||
});
|
||||
// // // 给父组件传值
|
||||
const handleChange = (val: any) => {
|
||||
console.log(val)
|
||||
emit('getChildData', val)
|
||||
}
|
||||
const header = { 'token': store.user.token }
|
||||
|
||||
const state = {
|
||||
|
||||
setting: {
|
||||
height: 800,
|
||||
width: '100%',
|
||||
resize: false,
|
||||
toolbar:
|
||||
" fullscreen | blocks alignleft aligncenter alignright alignjustify | link unlink | numlist bullist | image table | fontsize forecolor backcolor | bold italic underline strikethrough | indent outdent | superscript subscript | removeformat |",
|
||||
toolbar_mode: "sliding",
|
||||
quickbars_selection_toolbar:
|
||||
"removeformat | bold italic underline strikethrough | fontsize forecolor backcolor",
|
||||
plugins: "link image table lists fullscreen quickbars preview",
|
||||
|
||||
font_size_formats: "12px 14px 16px 18px 20px 22px 24px 26px 28px 30px 34px 38px 42px 46px",
|
||||
link_default_target: "_blank",
|
||||
link_title: false,
|
||||
relative_urls: false,
|
||||
convert_urls: false,
|
||||
nonbreaking_force_tab: true,
|
||||
block_unsupported_drop:true,
|
||||
branding: false,
|
||||
// 以中文简体为例
|
||||
language: "zh-Hans",
|
||||
custom_images_upload: true,
|
||||
images_file_types: 'jpeg,jpg,jpe,png,gif,xlsx,xls,pdf,ppt,doc,docx',
|
||||
// 复用 图片上传 api 地址
|
||||
images_upload_url: '/test-api/common/upload',
|
||||
// 上传成功回调函数,return 图片地址。默认 response.location
|
||||
custom_images_upload_callback: (response: { url: any; }) => response.url,
|
||||
// 上传 api 请求头
|
||||
custom_images_upload_header: header,
|
||||
language_url:
|
||||
"https://procurement.daikin.net.cn/hpserver/zh-Hans.js",//https://unpkg.com/@jsdawn/vue3-tinymce@2.0.2/dist/tinymce/langs/zh-Hans.js
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
@SETLOCAL
|
||||
@IF NOT DEFINED NODE_PATH (
|
||||
@SET "NODE_PATH=C:\Users\ljl\Desktop\dajin\node_modules\.pnpm\vite@4.4.8_@types+node@18.17.1_less@4.1.3\node_modules\vite\bin\node_modules;C:\Users\ljl\Desktop\dajin\node_modules\.pnpm\vite@4.4.8_@types+node@18.17.1_less@4.1.3\node_modules\vite\node_modules;C:\Users\ljl\Desktop\dajin\node_modules\.pnpm\vite@4.4.8_@types+node@18.17.1_less@4.1.3\node_modules;C:\Users\ljl\Desktop\dajin\node_modules\.pnpm\node_modules"
|
||||
) ELSE (
|
||||
@SET "NODE_PATH=C:\Users\ljl\Desktop\dajin\node_modules\.pnpm\vite@4.4.8_@types+node@18.17.1_less@4.1.3\node_modules\vite\bin\node_modules;C:\Users\ljl\Desktop\dajin\node_modules\.pnpm\vite@4.4.8_@types+node@18.17.1_less@4.1.3\node_modules\vite\node_modules;C:\Users\ljl\Desktop\dajin\node_modules\.pnpm\vite@4.4.8_@types+node@18.17.1_less@4.1.3\node_modules;C:\Users\ljl\Desktop\dajin\node_modules\.pnpm\node_modules;%NODE_PATH%"
|
||||
)
|
||||
@IF EXIST "%~dp0\node.exe" (
|
||||
"%~dp0\node.exe" "%~dp0\..\vite\bin\vite.js" %*
|
||||
) ELSE (
|
||||
@SET PATHEXT=%PATHEXT:;.JS;=;%
|
||||
node "%~dp0\..\vite\bin\vite.js" %*
|
||||
)
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
#!/bin/sh
|
||||
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
|
||||
|
||||
case `uname` in
|
||||
*CYGWIN*) basedir=`cygpath -w "$basedir"`;;
|
||||
esac
|
||||
|
||||
if [ -z "$NODE_PATH" ]; then
|
||||
export NODE_PATH="/mnt/c/Users/ljl/Desktop/dajin/node_modules/.pnpm/vue-demi@0.14.5_vue@3.3.4/node_modules/vue-demi/bin/node_modules:/mnt/c/Users/ljl/Desktop/dajin/node_modules/.pnpm/vue-demi@0.14.5_vue@3.3.4/node_modules/vue-demi/node_modules:/mnt/c/Users/ljl/Desktop/dajin/node_modules/.pnpm/vue-demi@0.14.5_vue@3.3.4/node_modules:/mnt/c/Users/ljl/Desktop/dajin/node_modules/.pnpm/node_modules"
|
||||
else
|
||||
export NODE_PATH="/mnt/c/Users/ljl/Desktop/dajin/node_modules/.pnpm/vue-demi@0.14.5_vue@3.3.4/node_modules/vue-demi/bin/node_modules:/mnt/c/Users/ljl/Desktop/dajin/node_modules/.pnpm/vue-demi@0.14.5_vue@3.3.4/node_modules/vue-demi/node_modules:/mnt/c/Users/ljl/Desktop/dajin/node_modules/.pnpm/vue-demi@0.14.5_vue@3.3.4/node_modules:/mnt/c/Users/ljl/Desktop/dajin/node_modules/.pnpm/node_modules:$NODE_PATH"
|
||||
fi
|
||||
if [ -x "$basedir/node" ]; then
|
||||
exec "$basedir/node" "$basedir/../vue-demi/bin/vue-demi-switch.js" "$@"
|
||||
else
|
||||
exec node "$basedir/../vue-demi/bin/vue-demi-switch.js" "$@"
|
||||
fi
|
||||
|
After Width: | Height: | Size: 508 B |
|
After Width: | Height: | Size: 19 KiB |
|
|
@ -0,0 +1,397 @@
|
|||
<!-- CSR 碳中和 -->
|
||||
<script setup lang="ts">
|
||||
import * as echarts from 'echarts';
|
||||
import AppBlock from '@/components/AppBlock.vue'
|
||||
import { NModal } from 'naive-ui';
|
||||
import { charData, pieData1, pieData2, liQuid, liQuids } from './CSRData'
|
||||
import { getCSRDetail, getCsrActList } from '@/api/daikin/base'
|
||||
import Modify from './modify.vue'
|
||||
import ModifyB from './modifyB.vue'
|
||||
import { message } from '@/utils/message';
|
||||
import { useUserStore } from '@/stores/modules/user'
|
||||
const store = useUserStore()
|
||||
const userCode = ['admin','csr_dandang','tech_service'].includes(store.user.roleCode)
|
||||
|
||||
const { chartRef, option } = charData()
|
||||
const { chartRef: chartRefP1, option: optionP1 } = pieData1()
|
||||
const { chartRef: chartRefP2, option: optionP2 } = pieData2()
|
||||
const { chartRef: chartRefli, option: optionli } = liQuid()
|
||||
const { chartRef: chartReflis, option: optionlis } = liQuids()
|
||||
const container = ref(null);
|
||||
const startType = ref(40)
|
||||
// 导入 ECharts
|
||||
const shomk = ref(false)
|
||||
const shomkB = ref(false)
|
||||
const shomks = () => {
|
||||
shomk.value = shomk.value === false ? true : false
|
||||
console.log(shomk.value)
|
||||
}
|
||||
const shomksB = () => {
|
||||
shomkB.value = shomkB.value === false ? true : false
|
||||
console.log(shomkB.value)
|
||||
}
|
||||
const form = ref({
|
||||
lable1:{
|
||||
name: '大金集团碳减排目标',
|
||||
year: 'F25',
|
||||
date: '14%',
|
||||
title1:'',
|
||||
title2:'',
|
||||
},
|
||||
lable2:{
|
||||
name: 'CN调达本部碳减排目标',
|
||||
year: 'F25',
|
||||
date: '14%',
|
||||
title1:'',
|
||||
title2:'',
|
||||
},
|
||||
lable3:{
|
||||
name: 'CN调达本部碳减排目标',
|
||||
year: 'F23',
|
||||
date: '14%',
|
||||
title1:'',
|
||||
title2:'',
|
||||
},
|
||||
lable4:{
|
||||
name: '2020实绩, 2021实绩, 2022实绩, 2023, 2024, 2025',
|
||||
year: '120, 200, 150, 80, 70, 110',
|
||||
date: '0, 0, 0, 80, 70, 110',
|
||||
title1:'',
|
||||
title2:'',
|
||||
},
|
||||
lable5:{
|
||||
name: '30%碳减排课题收集整体情况:',
|
||||
year: '60',
|
||||
date: '14%',
|
||||
title1:'原材料: 15.5%',
|
||||
title2:'能源消耗: 1.7%',
|
||||
},
|
||||
lable6:{
|
||||
name: 'FY23碳减排实施完成情况:',
|
||||
year: '0.6',
|
||||
data:'',
|
||||
title1:'原材料',
|
||||
title2:'整体目标10%',
|
||||
},
|
||||
lable7:{
|
||||
name:'',
|
||||
data:'',
|
||||
year: '0.6',
|
||||
title1:'能源消耗',
|
||||
title2:'整体目标5%',
|
||||
},
|
||||
lable8:{
|
||||
name:'【FY20原材料构成数据】',
|
||||
data:{
|
||||
data1:{
|
||||
name:'Search Engine',
|
||||
value:'1048'
|
||||
},
|
||||
data2:{
|
||||
name:'Direct',
|
||||
value:'735'
|
||||
}
|
||||
,
|
||||
data3:{
|
||||
name:'Email',
|
||||
value:'580'
|
||||
}
|
||||
,
|
||||
data4:{
|
||||
name:'',
|
||||
value:''
|
||||
},
|
||||
data5:{
|
||||
name:'',
|
||||
value:''
|
||||
}
|
||||
|
||||
}
|
||||
},
|
||||
lable9:{
|
||||
name:'【FY20能源消耗构成数据】',
|
||||
data:{
|
||||
data1:{
|
||||
name:'Search Engine',
|
||||
value:'1048'
|
||||
},
|
||||
data2:{
|
||||
name:'Direct',
|
||||
value:'735'
|
||||
}
|
||||
,
|
||||
data3:{
|
||||
name:'Email',
|
||||
value:'580'
|
||||
}
|
||||
,
|
||||
data4:{
|
||||
name:'Union Ads',
|
||||
value:'484'
|
||||
},
|
||||
data5:{
|
||||
name:'Video Ads',
|
||||
value:'300'
|
||||
}
|
||||
|
||||
}
|
||||
},
|
||||
})
|
||||
onBeforeMount(async () => {
|
||||
const { data: { content: { dataList } } } = await getCSRDetail()
|
||||
//
|
||||
if(dataList){
|
||||
form.value = dataList
|
||||
}
|
||||
|
||||
const { data } = await getCsrActList()
|
||||
|
||||
dog.value = data
|
||||
|
||||
})
|
||||
const dog = ref()
|
||||
const handleCommand = (command: string | number | object) => {
|
||||
console.log(command)
|
||||
downloadFile(command)
|
||||
}
|
||||
|
||||
async function downloadFile(data) {
|
||||
const url = data.int.url
|
||||
try {
|
||||
const response = await fetch(url);
|
||||
const blob = await response.blob();
|
||||
|
||||
const downloadUrl = URL.createObjectURL(blob);
|
||||
const link = document.createElement('a');
|
||||
link.href = downloadUrl;
|
||||
link.download = data.int.originalFileName; // 替换为你要保存的文件名
|
||||
link.click();
|
||||
URL.revokeObjectURL(downloadUrl);
|
||||
} catch (error) {
|
||||
message.error('下载文件出错:', error);
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<AppBlock class="h-full flex-1 box">
|
||||
|
||||
<div class="h-full relative">
|
||||
<el-button v-if="userCode" type="primary" class="button" @click="shomks">管理</el-button>
|
||||
<!-- 123 -->
|
||||
<div class="text-32px font-700 h85px flex items-center justify-center line">
|
||||
{{ `<CSR 碳中和>` }}
|
||||
</div>
|
||||
<div class="flex p10px" v-if="form">
|
||||
<div class="flex-1 cart">
|
||||
<p>{{ form.lable1.name }}</p>
|
||||
<div>
|
||||
{{ form.lable1.year }}<el-icon>
|
||||
<CaretTop />
|
||||
</el-icon>{{ form.lable1.date }}%
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex-1 cart">
|
||||
<p>{{ form.lable2.name }}</p>
|
||||
<div>
|
||||
{{ form.lable2.year }}<el-icon>
|
||||
<CaretTop />
|
||||
</el-icon>{{ form.lable2.date }}%
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex-1 cart">
|
||||
<p>{{ form.lable3.name }}</p>
|
||||
<div>
|
||||
{{ form.lable3.year }}<el-icon>
|
||||
<CaretTop />
|
||||
</el-icon>{{ form.lable3.date }}%
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="flex " v-if="form">
|
||||
<div>
|
||||
<div class="w88% h400px py30px pl30px border-solid border-color-#f1f1f1 border-width-1px">
|
||||
<VChart ref="chartRef" :option="option" autoresize />
|
||||
</div>
|
||||
<div class="flex">
|
||||
<div class="w60%">
|
||||
<div class="pl30px ">
|
||||
<div class="py20px text-24px font-extrabold">{{ form.lable5.name }}</div>
|
||||
<el-progress :percentage="form.lable5.year" :text-inside="false" color="#00B3D8" status="exception"
|
||||
:stroke-width="50" class="w100% !rounded-0">
|
||||
<el-button text></el-button>
|
||||
</el-progress>
|
||||
<div class="text-center text-#00BDD3 text-18px my20px"><el-icon>
|
||||
<CaretTop />
|
||||
</el-icon>{{ form.lable5.date }}</div>
|
||||
</div>
|
||||
<div class="text-#6288FB flex px30px text-18px">
|
||||
<div class="ditt">
|
||||
<img src="./images/ycail@2x.png">
|
||||
{{ form.lable5.title1 }}
|
||||
</div>
|
||||
<div class="ditt ml20px">
|
||||
<img src="./images/nenh@2x.png">
|
||||
{{ form.lable5.title2 }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="w39% flex flex-wrap">
|
||||
<div class="w300px h30px text-22px font-extrabold">{{ form.lable6.name }}</div>
|
||||
<div class="w150px h200px">
|
||||
<VChart ref="chartRefli" :option="optionli"></VChart>
|
||||
</div>
|
||||
<div class="w150px h200px ml10px">
|
||||
<VChart ref="chartReflis" :option="optionlis"></VChart>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="w480px border-solid border-color-#f1f1f1 border-width-1px">
|
||||
<div class="w100% h230px">
|
||||
<VChart ref="chartRefP1" :option="optionP1"></VChart>
|
||||
</div>
|
||||
<div class="w100% h250px">
|
||||
<VChart ref="chartRefP2" :option="optionP2"></VChart>
|
||||
</div>
|
||||
<div class="flex-1 w100% h195px px20px py5px border-solid border-color-#f1f1f1 border-width-1px">
|
||||
<div v-if="dog" class="text-22px mb-20px font-extrabold">碳减排非PLUS活动信息: <el-button type="primary"
|
||||
class="ml25px" v-if="userCode" @click="shomksB">管理</el-button></div>
|
||||
<div class="my20px flex w330px h20px" v-for="i in dog">
|
||||
<div class="max-w300px min-100px">{{ i.title }}</div>
|
||||
<div>
|
||||
<el-dropdown max-height="100px" @command="handleCommand">
|
||||
<span class="el-dropdown-link">
|
||||
<el-icon color="#097BC2" class="el-icon--right"><CaretBottom /></el-icon>
|
||||
</span>
|
||||
<template #dropdown>
|
||||
<el-dropdown-menu>
|
||||
<el-dropdown-item v-if="i.filePathList" v-for="int in i.filePathList" :command="{int}">{{int.originalFileName}}</el-dropdown-item>
|
||||
</el-dropdown-menu>
|
||||
</template>
|
||||
</el-dropdown>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</AppBlock>
|
||||
<n-modal v-model:show="shomk">
|
||||
<Modify class="w90% mt30px"></Modify>
|
||||
</n-modal>
|
||||
<n-modal v-model:show="shomkB">
|
||||
<ModifyB class="w90% mt30px"></ModifyB>
|
||||
</n-modal>
|
||||
</template>
|
||||
|
||||
<style scoped lang="less">
|
||||
.button {
|
||||
position: absolute;
|
||||
top: 20px;
|
||||
right: 20px;
|
||||
z-index: 500;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
.ditt {
|
||||
background-color: #F6F8FF;
|
||||
border-radius: 30px;
|
||||
padding: 8px;
|
||||
font-size: 20px;
|
||||
height: 45px;
|
||||
overflow: hidden;
|
||||
|
||||
img {
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
}
|
||||
}
|
||||
|
||||
/deep/.el-progress-bar__outer,
|
||||
/deep/.el-progress-bar__inner {
|
||||
border-radius: 0 !important;
|
||||
}
|
||||
|
||||
/deep/.el-progress-bar__inner {
|
||||
background-color: #00B3D8;
|
||||
}
|
||||
|
||||
@border-line: 1px solid #e7ebf5;
|
||||
|
||||
.cart {
|
||||
background-color: #F4F8FF;
|
||||
// background-color: #6c90ce;
|
||||
height: 100px;
|
||||
margin-left: 5px;
|
||||
text-align: center;
|
||||
justify-content: center;
|
||||
|
||||
p {
|
||||
font-size: 20px;
|
||||
font-weight: bold;
|
||||
line-height: 40px;
|
||||
margin-top: 20px;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
.el-icon {
|
||||
color: #0049E0;
|
||||
}
|
||||
}
|
||||
|
||||
.line {
|
||||
border: @border-line;
|
||||
}
|
||||
|
||||
// img {
|
||||
// width: 100%;
|
||||
// height: 100%;
|
||||
// user-select: none;
|
||||
// user-drag: none;
|
||||
// -webkit-user-drag: none;
|
||||
// }
|
||||
|
||||
.box {
|
||||
// height: calc(100% - 85px);
|
||||
|
||||
&::after {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.box-1 {
|
||||
height: 435px;
|
||||
border-right: @border-line;
|
||||
border-bottom: @border-line;
|
||||
}
|
||||
|
||||
.box-2 {
|
||||
flex: 1;
|
||||
border-right: @border-line;
|
||||
}
|
||||
|
||||
.box-3 {
|
||||
height: 506px;
|
||||
border-bottom: @border-line;
|
||||
}
|
||||
|
||||
.box-4 {
|
||||
flex: 1;
|
||||
}
|
||||
}</style>
|
||||
|
After Width: | Height: | Size: 596 B |
|
|
@ -0,0 +1 @@
|
|||
var u=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function f(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function l(e){if(e.__esModule)return e;var r=e.default;if(typeof r=="function"){var t=function o(){return this instanceof o?Reflect.construct(r,arguments,this.constructor):r.apply(this,arguments)};t.prototype=r.prototype}else t={};return Object.defineProperty(t,"__esModule",{value:!0}),Object.keys(e).forEach(function(o){var n=Object.getOwnPropertyDescriptor(e,o);Object.defineProperty(t,o,n.get?n:{enumerable:!0,get:function(){return e[o]}})}),t}export{l as a,u as c,f as g};
|
||||
|
After Width: | Height: | Size: 159 KiB |
|
After Width: | Height: | Size: 975 B |
|
|
@ -0,0 +1 @@
|
|||
.top[data-v-c4cb7a09]{position:absolute;right:30px;top:-92px}.g-wrapper[data-v-c4cb7a09]{border-radius:18px;border:1px solid #E7EBF5;box-shadow:inset 1px 2px 12px #0e56dd52;overflow:hidden}.g-wrapper .timeline[data-v-c4cb7a09]{font-size:20px;font-weight:700;color:#142142}.g-wrapper .timeline .one[data-v-c4cb7a09]{position:relative}.g-wrapper .timeline .one .year[data-v-c4cb7a09]{left:-132px;top:-14px;color:#003cb7;font-size:26px;font-weight:400;text-align:center;line-height:50px}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.backs[data-v-e3f7e37a]{position:absolute;top:25px;left:25px;color:#fff;font-size:25px;font-weight:700;text-align:center;justify-content:center}.truncate[data-v-e3f7e37a]{display:block;max-width:226px;min-width:250px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left}.tops[data-v-e3f7e37a]{right:30px;top:-92px}[data-v-e3f7e37a]::-webkit-scrollbar{width:1px}.q-wrapper[data-v-e3f7e37a]{border-radius:18px;border:1px solid #E7EBF5;box-shadow:inset 1px 2px 12px #0e56dd52;overflow:auto}.q-wrapper[data-v-e3f7e37a]:after{content:" ";background-image:url(/assets/bg-card-cf2a9f09.svg);pointer-events:none;display:block;width:100%;height:127px;background-repeat:no-repeat;background-position:right top;position:absolute;left:0;top:0}
|
||||
|
|
@ -0,0 +1,135 @@
|
|||
<!-- 战略企画 -->
|
||||
<script setup lang="ts">
|
||||
import AppBlock from '@/components/AppBlock.vue'
|
||||
import AppNewsBox from '@/components/AppNewsBox.vue'
|
||||
import HomeHead from '@/views/home/components/HomeHead.vue'
|
||||
// import HomeHeadSearch from '@/views/home/components/HomeHeadSearch.vue'
|
||||
import { useDate } from '@/views/home/hooks/useDate'
|
||||
|
||||
const { day, week } = useDate()
|
||||
const { push } = useRouter()
|
||||
|
||||
const Items = [
|
||||
{
|
||||
key: '0',
|
||||
title: '调达研究院',
|
||||
children: [
|
||||
{ label: '调达本部HP', items: [{ content: 'FY22年度集团新年方针:领先时代的变化开创崭新的未来变化开 创崭新的未来' }] },
|
||||
{ label: 'CSR-碳中和', items: [{ content: 'FY22年度集团新年方针:领先时代的变化开创崭新的未来变化开 创崭新的未来' }] },
|
||||
{ label: '中国地区连携强化 ', items: [{ content: 'FY22年度集团新年方针:领先时代的变化开创崭新的未来变化开 创崭新的未来' }] },
|
||||
{ label: '工作模式变更 ', items: [{ content: 'FY22年度集团新年方针:领先时代的变化开创崭新的未来变化开 创崭新的未来' }] },
|
||||
{ label: '差别化', items: [{ content: 'FY22年度集团新年方针:领先时代的变化开创崭新的未来变化开 创崭新的未来' }] },
|
||||
],
|
||||
},
|
||||
{
|
||||
key: '1',
|
||||
title: '调达中心',
|
||||
children: [
|
||||
{ label: 'Database推进', items: [{ content: 'FY22年度集团新年方针:领先时代的变化开创崭新的未来变化开 创崭新的未来' }] },
|
||||
{ label: '市况', items: [{ content: 'FY22年度集团新年方针:领先时代的变化开创崭新的未来变化开 创崭新的未来' }] },
|
||||
{ label: '汇率', items: [{ content: 'FY22年度集团新年方针:领先时代的变化开创崭新的未来变化开 创崭新的未来' }] },
|
||||
{ label: 'BCP', items: [{ content: 'FY22年度集团新年方针:领先时代的变化开创崭新的未来变化开 创崭新的未来' }] },
|
||||
{ label: '全球连携强化', items: [{ content: 'FY22年度集团新年方针:领先时代的变化开创崭新的未来变化开 创崭新的未来' }] },
|
||||
{ label: '高品质高品位', items: [{ content: 'FY22年度集团新年方针:领先时代的变化开创崭新的未来变化开 创崭新的未来' }] },
|
||||
],
|
||||
},
|
||||
]
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<HomeHead class="top">
|
||||
<template #title>
|
||||
|
||||
</template>
|
||||
<template #content>
|
||||
<!-- <HomeHeadSearch /> -->
|
||||
</template>
|
||||
</HomeHead>
|
||||
<div class="h-full relative flex flex-col">
|
||||
<div class="font-600 flex items-center mt27px">
|
||||
<div class="text-36px">调达本部重点课题 11 项目</div>
|
||||
<div class="ml40px bg-#fff/20 b-1px b-solid b-#fff rd-8px inline-flex items-center px12px py9px cursor-pointer">
|
||||
<span class="inline-block rotate-45 mr8px">✕</span> <span>上传</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex-1 mt30px text-#142142">
|
||||
<!-- <div class="flex w-full h-full gap-30px">
|
||||
<AppBlock class="flex-1 box max-h-848px !overflow-y-auto" v-for="item in Items" :key="item.title">
|
||||
<div class="box-title">{{ item.title }}</div>
|
||||
<div class="mt30px" v-for="news in item.children" :key="news.label">
|
||||
<div class="inline-flex items-center pl18px pr28px py8px rd-22px bg-#003cb7 text-#fff text-18px">
|
||||
<img src="@/assets/images/icon-tag.svg" class="w30px h30px mr16px" />
|
||||
<span>{{ news.label }}</span>
|
||||
</div>
|
||||
<div class="flex items-center py22px news-item" v-for="n in 2" :key="n">
|
||||
<AppNewsBox class="flex-1" text="中国在2023年首次统一碳排放规则规则规就则房地产需业稳定,市场需业稳定,市场需业稳定,市场需求增高" date="2023-05-22" />
|
||||
<div class="flex-shrink flex">
|
||||
<div class="btn primary ml36px">预览</div>
|
||||
<div class="btn default ml10px">下载</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</AppBlock>
|
||||
</div> -->
|
||||
<img src="@/assets/images/bejqt3.png" class="w100%"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="absolute flex flex-col w-full h-full z-200 top-0 left-0 text-center bg-red justify-center items-center" style="background-color: rgba(255,255,255,0.8);">
|
||||
<img src="@/assets/images/chah.png"/>
|
||||
<br>
|
||||
<div class="text-#5683DB text-36px">【做成中,敬请期待】</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped lang="less">
|
||||
.top{
|
||||
position: absolute;
|
||||
right: 30px;
|
||||
top: -92px;
|
||||
}
|
||||
.box {
|
||||
padding: 23px 45px;
|
||||
|
||||
.box-title {
|
||||
font-size: 28px;
|
||||
font-weight: 600;
|
||||
position: relative;
|
||||
padding-left: 24px;
|
||||
|
||||
&::before {
|
||||
content: ' ';
|
||||
display: block;
|
||||
width: 8px;
|
||||
height: 30px;
|
||||
background-color: #003ab5;
|
||||
|
||||
position: absolute;
|
||||
left: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.news-item {
|
||||
cursor: pointer;
|
||||
border-bottom: 1px solid #eef3fb;
|
||||
}
|
||||
|
||||
.btn {
|
||||
--color-primary: #3870e5;
|
||||
|
||||
padding: 10px 22px;
|
||||
border-radius: 5px;
|
||||
cursor: pointer;
|
||||
user-select: none;
|
||||
|
||||
&.default {
|
||||
border: 1px solid var(--color-primary);
|
||||
color: var(--color-primary);
|
||||
}
|
||||
|
||||
&.primary {
|
||||
background-color: var(--color-primary);
|
||||
color: #fff;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
After Width: | Height: | Size: 902 B |
|
|
@ -0,0 +1 @@
|
|||
.notice[data-v-cd94285f]{position:absolute;top:52px;left:-3px;width:200px;background:#ffffff;max-height:520px;z-index:500;font-size:18px;border-radius:15px;padding:10px;color:#1a1919;box-shadow:1px 1px 5px 1px #d9d5d5}.notice .box[data-v-cd94285f]:hover{background:#e5e5e5;border-radius:5px;color:#1836c3}.notice .box:hover span[data-v-cd94285f]{color:#fff;background:red}.notice span[data-v-cd94285f]{color:#1836c3;padding:2px 7px;border-radius:50px}.popover-grid[data-v-cd94285f]{display:grid;grid-template-columns:auto auto auto auto auto;grid-gap:12px;justify-content:center;align-items:center}
|
||||
|
|
@ -0,0 +1,517 @@
|
|||
<template>
|
||||
<DataBaseHead />
|
||||
<div class="w-full h-1px bg-#507FFD mt50px rd-b-20px"></div>
|
||||
<div class="bg-#fff rd-15px px30px pt30px w-full h920px ">
|
||||
|
||||
<el-tabs v-model="activeName" class="demo-tabs">
|
||||
<div class="float-right px20px py10px z-200 bg-#f5f5f5" @click="goBacks"> <el-icon class="text-red"><ArrowLeftBold size="18"/></el-icon> 返回</div>
|
||||
<el-tab-pane label="分类管理" name="first">
|
||||
<el-button type="primary" @click="editClickA('add')" class="mb-20px">
|
||||
新增
|
||||
</el-button>
|
||||
<div class="w100% h750px overflow-auto">
|
||||
<el-table :data="tableData" style="width: 100%; margin-bottom: 20px" row-key="id" border
|
||||
default-expand-all :header-cell-style="{textAlign: 'center',
|
||||
background: '#2A7BF7', color: '#fff',
|
||||
height: '60px', 'font-size': '24px'
|
||||
}" :cell-style="{ 'overflow-y': 'auto' }"
|
||||
:tree-props="{ children: 'childList', hasChildren: 'hasChildren'}">
|
||||
<el-table-column prop="name" label="标题名称" align="left"/>
|
||||
<el-table-column prop="sort" label="排序" align="center"/>
|
||||
<el-table-column prop="address" label="操作" align="center">
|
||||
<template #default="scope">
|
||||
<el-button type="primary" @click="editClickA('edit', scope.row)" class="mb-20px">
|
||||
编辑</el-button>
|
||||
<el-button type="success" v-if="scope.row.level === 1||scope.row.level === 2||scope.row.level === 3" @click="editClickA('add', scope.row)"
|
||||
class="mb-20px"> 新增{{scope.row.level===1?'二':scope.row.level===2?'三':'四'}}级</el-button>
|
||||
<el-button type="danger" @click="deleteClickA(scope.row)" class="mb-20px"> 删除</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="内容管理" name="second">
|
||||
<el-button type="primary" @click="editClickB('add')" class="mb-20px"> 新增</el-button>
|
||||
<el-button type="primary" @click="getAll" class="mb-20px"> 查看所有</el-button>
|
||||
<div class="w100% h750px overflow-auto" >
|
||||
<el-table class="tableClass" :data="infoData" style="width: 100%; margin-bottom: 20px" row-key="id" border
|
||||
default-expand-all :header-cell-style="{
|
||||
background: '#2A7BF7', color: '#fff',
|
||||
height: '60px', textAlign: 'center', 'font-size': '24px'
|
||||
}" :cell-style="{ 'text-align': 'center', 'overflow-y': 'auto' }"
|
||||
:tree-props="{ children: 'childList', hasChildren: 'hasChildren'}">
|
||||
<el-table-column prop="cateName" label="所属分类" show-overflow-tooltip>
|
||||
<!-- <template #default="scope">
|
||||
<span v-if="scope.row.cateId==="></span>
|
||||
</template> -->
|
||||
</el-table-column>
|
||||
<el-table-column prop="title" label="标题名称" show-overflow-tooltip/>
|
||||
<!-- <el-table-column prop="deptName" label="排序" /> -->
|
||||
<el-table-column label="文件列表" prop="filePath" show-overflow-tooltip/>
|
||||
<el-table-column label="排序" prop="sort" show-overflow-tooltip/>
|
||||
<el-table-column label="查看范围" prop="userIdList" :show-overflow-tooltip="true">
|
||||
<template #default="scope">
|
||||
<!-- <el-button type="primary" class="button" @click="getUser(scope.row)">查看范围</el-button> -->
|
||||
|
||||
<!-- <span class="descStyle" v-if="scope.row.userList" v-for="it in scope.row.userList"> {{it.nickName}}</span> -->
|
||||
<span v-if="scope.row.userList" v-for="it in scope.row.userList">
|
||||
<el-tooltip :content="it.nickName" placement="top">
|
||||
<p class="descStyle">{{ it.nickName }}</p>
|
||||
</el-tooltip>
|
||||
</span>
|
||||
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="address" label="操作" show-overflow-tooltip>
|
||||
|
||||
<template #default="scope">
|
||||
|
||||
<div>
|
||||
<el-button type="primary" @click="editClickB('edit', scope.row)" class="mb-20px w45px">
|
||||
编辑</el-button>
|
||||
<el-button type="danger" @click="deleteClickB(scope.row)" class="mb-20px w45px"> 删除</el-button>
|
||||
<div style="float: right;" v-if="scope.$index !== 0 && scope.$index !==infoData.length-1">
|
||||
<el-button style="color: #000;width: 45px;height: 33px;" @click="onUpload(scope.row)">
|
||||
<el-icon><Upload /></el-icon>
|
||||
</el-button>
|
||||
<el-button style="color: #000;width: 45px;height: 33px;" @click="ondownloads(scope.row)">
|
||||
<el-icon><Download /></el-icon>
|
||||
</el-button>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
|
||||
<div class="float-right absolute bottom-0px right-30px z-2000 bg-#fff">
|
||||
<el-pagination v-model:current-page="pageInfo.currentPage" v-model:page-size="pageInfo.pageSize"
|
||||
layout="prev, pager, next, jumper" :total="pageInfo.total"
|
||||
@size-change="handleSizeChange" @current-change="handleCurrentChange" />
|
||||
</div>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
<NModal v-model:show="shomkA">
|
||||
<div class="bg-#FFF p30px">
|
||||
<el-form :model="editA" label-width="120px" :inline="true">
|
||||
<el-form-item label="标题">
|
||||
<el-input v-model="editA.name" />
|
||||
</el-form-item>
|
||||
<br />
|
||||
<el-form-item label="排序">
|
||||
<el-input type="number" v-model="editA.sort" />
|
||||
</el-form-item>
|
||||
<br />
|
||||
<div class="text-center">
|
||||
<el-button type="primary" @click="addClickA(editA)" class="mb-20px"> 确认</el-button>
|
||||
</div>
|
||||
|
||||
</el-form>
|
||||
</div>
|
||||
</NModal>
|
||||
<NModal v-model:show="shomkB">
|
||||
<div class="bg-#FFF p30px">
|
||||
<el-form :model="editB" label-width="120px" :inline="true">
|
||||
<!-- <el-form-item label="标题" v-if="editB.type!='add'"> -->
|
||||
<el-form-item label="标题">
|
||||
<el-input v-model="editB.title" />
|
||||
</el-form-item>
|
||||
<br />
|
||||
<el-form-item label="排序">
|
||||
<el-input v-model="editB.sort" type="number" />
|
||||
</el-form-item>
|
||||
<br />
|
||||
<el-form-item label="所属类别">
|
||||
<el-cascader v-model="editB.cateId" :options="tableData" @change="handleChange"
|
||||
:props="{ children: 'childList', label: 'name', value: 'id' }" />
|
||||
</el-form-item>
|
||||
<br />
|
||||
<el-form-item label="查看范围">
|
||||
<el-button class="button" @click="getUser" :type="userData?'success':''" :icon="userData?'Check':''">{{userData?'已设置':'设置'}}</el-button>
|
||||
</el-form-item>
|
||||
|
||||
<br/>
|
||||
<el-form-item label="文件">
|
||||
<el-upload v-model:file-list="editB.fileList" class="upload-demo" :headers="header"
|
||||
action="/test-api/common/upload" :on-exceed="handOnExceed" multiple="true">
|
||||
<el-button type="primary">选择文件</el-button>
|
||||
|
||||
</el-upload>
|
||||
</el-form-item>
|
||||
<br />
|
||||
<div class="text-center">
|
||||
<el-button type="primary" @click="addClickB(editB)" class="mb-20px"> 确认</el-button>
|
||||
</div>
|
||||
|
||||
</el-form>
|
||||
</div>
|
||||
</NModal>
|
||||
<n-modal v-model:show="showModal">
|
||||
<UserList :userDataList="setUserList" @clickChild="handleChild" @CloseThis="CloseThiss"/>
|
||||
</n-modal>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import DataBaseHead from "@/views/home/components/DataBaseHead.vue";
|
||||
import { useUserStore } from '@/stores/modules/user'
|
||||
import { cateAdd, cateUpdate, treeDbList, cateInfo, cateDel, cateFileUpdate, cateFileDel, cateFileList, download, dragFile } from '@/api/daikin/base'
|
||||
import { NModal, useMessage, NSelect } from "naive-ui";
|
||||
import UserList from '@/views/home/intelligence/process/UserPages.vue'
|
||||
import {databaseld} from "@/stores/modules/database"
|
||||
|
||||
const database = databaseld()
|
||||
const message = useMessage()
|
||||
|
||||
const tableData = ref()
|
||||
const infoData = ref()
|
||||
|
||||
const shomkA = ref()
|
||||
const editA = ref()
|
||||
const shomkB = ref()
|
||||
const editB = ref()
|
||||
const activeName = ref('first')
|
||||
const pageInfo = reactive({
|
||||
currentPage:1,
|
||||
pageSize:10,
|
||||
total:10
|
||||
})
|
||||
async function getTree() {
|
||||
const { data } = await treeDbList({})
|
||||
tableData.value = data
|
||||
}
|
||||
let cateIds = ref()
|
||||
watchEffect(()=>{
|
||||
cateIds.value = database.database.id
|
||||
console.log(database.database.id)
|
||||
if(database.database.id){
|
||||
getInfo(database.database.id)
|
||||
}
|
||||
|
||||
})
|
||||
async function getInfo(cateId: string | undefined) {
|
||||
const { rows,total } = await cateFileList({ cateId:cateIds.value, pageNum: pageInfo.currentPage, pageSize: pageInfo.pageSize })
|
||||
infoData.value = rows
|
||||
pageInfo.total = total
|
||||
if(rows&&rows.length>0){
|
||||
rows.map((item: { filePath: any; })=>Object.assign(item,{
|
||||
fileList: item.filePath
|
||||
}))
|
||||
}
|
||||
}
|
||||
const store = useUserStore()
|
||||
const deptId = ref()
|
||||
onMounted(() => {
|
||||
// getTree()
|
||||
// getInfo('')
|
||||
deptId.value = store.user.deptId
|
||||
})
|
||||
const editClickA = (edit: any, obj: any) => {
|
||||
console.table(obj)
|
||||
if (edit === 'add' && obj && obj.id) {
|
||||
editA.value = {
|
||||
name: '',
|
||||
sort: '',
|
||||
pid: obj.id,
|
||||
type: edit
|
||||
}
|
||||
}
|
||||
else if (obj && obj.id) {
|
||||
editA.value = obj
|
||||
}
|
||||
else {
|
||||
editA.value = {
|
||||
name: '',
|
||||
sort: '',
|
||||
pid: '0',
|
||||
type: edit
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
console.log(editA.value)
|
||||
shomkA.value = true
|
||||
}
|
||||
const deleteClickA = async (row: any) => {
|
||||
if (row && row.id) {
|
||||
const { code, msg } = await cateDel({ id: row.id })
|
||||
if (code === 200) { message.success("删除成功") }
|
||||
else message.warning(msg)
|
||||
}
|
||||
getTree()
|
||||
}
|
||||
async function addClickA(row: any) {
|
||||
if (!row) return
|
||||
if (row.type === 'add') {
|
||||
const { code, msg } = await cateAdd(row)
|
||||
if (code === 200) { message.success("新增成功") }
|
||||
else message.warning(msg)
|
||||
}
|
||||
else {
|
||||
const { code, msg } = await cateUpdate(row)
|
||||
if (code === 200) { message.success("修改成功") }
|
||||
else message.warning(msg)
|
||||
}
|
||||
shomkA.value = false
|
||||
getTree()
|
||||
}
|
||||
const editClickB = (edit: any, obj: any) => {
|
||||
console.log(obj)
|
||||
if (edit === 'add' && obj && obj.id) {
|
||||
editB.value = {
|
||||
title: '',
|
||||
cateId: '',
|
||||
deptId: deptId.value,
|
||||
filePath:[],
|
||||
fileList: [],
|
||||
type:edit,
|
||||
userList:[],
|
||||
sort:0
|
||||
}
|
||||
if(obj.filePath){
|
||||
editB.value.fileList = [{
|
||||
name: obj.title,
|
||||
originalFilename: obj.title,
|
||||
url: obj.filePath,
|
||||
}]
|
||||
}
|
||||
|
||||
setUserList.value =obj.userList
|
||||
}
|
||||
else if (obj && obj.id) {
|
||||
editB.value = obj
|
||||
if(obj.filePath){
|
||||
editB.value.fileList = [{
|
||||
name: obj.title,
|
||||
originalFilename: obj.title,
|
||||
url: obj.filePath,
|
||||
}]
|
||||
}
|
||||
|
||||
setUserList.value =obj.userList
|
||||
}
|
||||
else {
|
||||
editB.value = {
|
||||
cateId: '',
|
||||
deptId: deptId.value,
|
||||
title: '',
|
||||
filePath: [],
|
||||
fileList: [],
|
||||
type:edit,
|
||||
userList:[],
|
||||
sort:0
|
||||
}
|
||||
setUserList.value = []
|
||||
|
||||
}
|
||||
userData.value = false
|
||||
console.log(editB.value)
|
||||
shomkB.value = true
|
||||
}
|
||||
const deleteClickB = async (row: any) => {
|
||||
if (row && row.id) {
|
||||
const { code, msg } = await cateFileDel({ id: row.id })
|
||||
if (code === 200) { message.success("删除成功") }
|
||||
else message.warning(msg)
|
||||
}
|
||||
getInfo('')
|
||||
}
|
||||
async function addClickB(row: any) {
|
||||
console.log(row,deptId.value)
|
||||
if (!row) return
|
||||
let url: any[] =[]
|
||||
if(row.fileList&&row.fileList.length>0){
|
||||
row.fileList.forEach((index)=>{
|
||||
if(index.response){
|
||||
url.push(index.response.url)
|
||||
}
|
||||
else{
|
||||
url.push(index.url)
|
||||
}
|
||||
|
||||
})
|
||||
|
||||
row.filePath = url
|
||||
// console.log(url, row.filePath )
|
||||
}
|
||||
let list: any[] =[]
|
||||
if(row.userList&&row.userList.length>0){
|
||||
console.log(row.userList&&row.userList.length>0)
|
||||
row.userList.forEach((index) => {
|
||||
list.push(index.userId)
|
||||
})
|
||||
row.userIdList =list
|
||||
}
|
||||
if(!row.cateId){
|
||||
message.error("所属类别不能为空!")
|
||||
return
|
||||
}
|
||||
if (row.type === 'add') {
|
||||
const { code, msg } = await cateFileUpdate(row)
|
||||
if (code === 200) { message.success("新增成功") }
|
||||
else message.warning(msg)
|
||||
}
|
||||
else {
|
||||
|
||||
const { code, msg } = await cateFileUpdate(row)
|
||||
if (code === 200) { message.success("修改成功") }
|
||||
else message.warning(msg)
|
||||
}
|
||||
shomkB.value = false
|
||||
getInfo('')
|
||||
}
|
||||
const handleChange = (e: string | any[]) => {
|
||||
// console.log(e.length)
|
||||
if (e && e.length == 1) {
|
||||
// console.log(e, editB.value)
|
||||
editB.value.cateId = e[0]
|
||||
}
|
||||
else if(e && e.length == 2){
|
||||
editB.value.cateId = e[1]
|
||||
}
|
||||
else if(e && e.length == 3){
|
||||
editB.value.cateId = e[2]
|
||||
}
|
||||
else if(e && e.length == 4){
|
||||
editB.value.cateId = e[3]
|
||||
}
|
||||
else {
|
||||
editB.value.cateId = e[0]
|
||||
}
|
||||
// console.log(e,editB.value.cateId,99999)
|
||||
}
|
||||
const handOnExceed: UploadProps['onExceed'] = (uploadFile: any, uploadFiles: any) => {
|
||||
message.warning("最多只能上传一个文件!")
|
||||
}
|
||||
|
||||
const header = { 'token': store.user.token }
|
||||
const goBacks=(e)=>{
|
||||
// console.log(444)
|
||||
history.back()
|
||||
}
|
||||
const showModal = ref(false)
|
||||
const flg = ref()
|
||||
const setUserList =ref()
|
||||
async function getUser(row: { id: any; userList: any; }) {
|
||||
console.log(row)
|
||||
showModal.value = !showModal.value
|
||||
flg.value = row
|
||||
if(row.id&&row.userList){
|
||||
setUserList.value = row.userList
|
||||
}
|
||||
// const {data: userArr} = await getBPCUser({moduleId})
|
||||
// setUserList.value = userArr
|
||||
|
||||
}
|
||||
// 获取子组件传过来的值
|
||||
const userData = ref(false)
|
||||
const handleChild = (data: any) => {
|
||||
console.log(data, 444);
|
||||
const { showModal: show, multipleSelection } = data
|
||||
showModal.value = unref(show)
|
||||
let userIdList: any[] =[]
|
||||
multipleSelection.value.forEach((i: { userId: any })=>{
|
||||
userIdList.push(i.userId)
|
||||
})
|
||||
if(flg.value.id){
|
||||
flg.value.userIdList = userIdList
|
||||
// marketPreADD(flg.value)
|
||||
// getDataA();
|
||||
console.log(flg.value)
|
||||
}
|
||||
editB.value.userIdList = userIdList
|
||||
if(userIdList.length>0){
|
||||
userData.value = true
|
||||
console.log(userIdList,8888)
|
||||
}
|
||||
else userData.value = false
|
||||
|
||||
}
|
||||
const CloseThiss = (data: boolean)=>{
|
||||
showModal.value = data
|
||||
}
|
||||
const getAll=()=>{
|
||||
// cateIds.value = ''
|
||||
getInfo()
|
||||
}
|
||||
|
||||
const lazyState = computed(() => [pageInfo.currentPage])
|
||||
watch(
|
||||
() => unref(lazyState),
|
||||
async (v) => {
|
||||
getTree()
|
||||
},
|
||||
{ immediate: true, deep: true },
|
||||
)
|
||||
|
||||
const handleSizeChange=(e)=>{
|
||||
console.log(e)
|
||||
}
|
||||
|
||||
const handleCurrentChange=(e)=>{
|
||||
console.log(e)
|
||||
}
|
||||
// 上移
|
||||
async function onUpload(it){
|
||||
console.log(infoData);
|
||||
// 当前数据的索引
|
||||
let index = infoData._rawValue.findIndex((value :any) => value.id === it.id);
|
||||
index -= 1;
|
||||
const onUploaddate = await dragFile({
|
||||
cateId:it.cateId,
|
||||
curId:it.id,
|
||||
lastId:infoData._rawValue[index].id,
|
||||
});
|
||||
getInfo();
|
||||
|
||||
|
||||
console.log(infoData);
|
||||
console.log(it.cateId,"分类id");
|
||||
console.log(it.id, "当前位置的id");
|
||||
console.log(infoData._rawValue[index].id,"上移位置的id");
|
||||
// console.log(tableData._rawValue);
|
||||
}
|
||||
// 下移
|
||||
async function ondownloads(it){
|
||||
// 当前数据的索引
|
||||
let index = infoData._rawValue.findIndex((value) => value.id === it.id);
|
||||
index += 1;
|
||||
// const {rows,total} = await cateFileList({cateId:prop.cateId,pageNum:currentPage,pageSize})
|
||||
const ondownloads = await dragFile({
|
||||
cateId:it.cateId,
|
||||
curId:it.id,
|
||||
lastId:infoData._rawValue[index].id,
|
||||
});
|
||||
getInfo();
|
||||
console.log(ondownloads);
|
||||
}
|
||||
</script>
|
||||
<style lang="less">
|
||||
::-webkit-scrollbar {
|
||||
width: 1px;
|
||||
}
|
||||
|
||||
.tableClass .cell{
|
||||
padding: 0!important;
|
||||
height: 50px;
|
||||
line-height: 25px !important;
|
||||
text-align: center;
|
||||
}
|
||||
.descStyle {
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
word-break: break-all;
|
||||
display: -webkit-box;
|
||||
-webkit-line-clamp: 3; //行数
|
||||
-webkit-box-orient: vertical;
|
||||
}
|
||||
</style>
|
||||
|
|
@ -0,0 +1 @@
|
|||
.top[data-v-6d963082]{position:absolute;right:30px;top:-92px}[data-v-6d963082]::-webkit-scrollbar{width:1px}.q-wrapper[data-v-6d963082]{border-radius:18px;border:1px solid #e7ebf5;box-shadow:inset 1px 2px 12px #0e56dd52;overflow:auto}
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Generated by Pixelmator Pro 3.2.3 -->
|
||||
<svg width="21" height="20" viewBox="0 0 21 20" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<image id="-7" x="0" y="0" width="21" height="20" xlink:href="data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAABUAAAAUCAYAAABiS3YzAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAFaADAAQAAAABAAAAFAAAAAA1ezu+AAAC4ElEQVQ4EZ1UT0hUYRCf+d7btbCkpCCFQEow2tzn2kHCoCAIT9axg6379lIEXaJDEN6CggLBm5Xupl6KDkWXvBT0jwzRfStFUUSnqIggpaz2fd/XzPu7q/Z3YHdmfjPz45s/uwh/kvbCNgPhHCDuAsBXqOWAW87ficpShU3w1H4X+WRgtbPMTo+0GWjMEZ6ojiGIHtfJThrWlREA3Uc0Wen0Xw1zRGgs00QoUDwmPCDUXPSd8zSo22ZHsZusNnKTpHsYD2Vl0sxIM73wCQKu8xIRjkjHPiSE2B0Wag0PyN7CPrU7H+Ksl5NmRjcK6b2wgRPoVSdkKXeR7cpsdhq07mU7kCZPI/wIAda1pF0TDUKJGUTczEENMKCc/GAiPdppWMXXwiocl2X7FgUOcDwSjW5kkxEvaudwQrh1swSkOIEIzygnNwCZ0e2GEiWC/NkiHpSl/puGVThM5WOcS/JWKr0P5uzn7Pgv3XvXFG6SZugTkh70CDsKLUQ4TXnx9rW+YaSLvTTjccLzTELSbAicAspnx3sptcZDp22y6GEqOAq8LOWdU6OP136jgj3uXO4ej4QWOhRE30shOxGtwqQA3B+ARenkbEhdbjRM8wVhG2qpaj1E1e2W8o9EungSEc4H0TciIkS47hG2DtURIc/wt4RMoLV4mEyP7VDl3AWt8XRA2oKJ9FiXEsryziZ1LWkkvj6jLW0NEv5GLUrUFpTslzRGGzQueDMNK4VVnCEgE/r/oBekFq1Qzn7gmvhOd443/Sch86w1QbWzwWL6ir4rWtItVMiKz8cPLtCRfIryQPMvbX3sB5ZQiyEWk/oI3fwSQZigYz8WonRCp+iEzob+Sjpuf6UoYQi65ndNwLdfpEZwTJpAg9ClrdMhIP21VYmGVVVebEoRdR2TmviFMmquwavQuCau5M3i6mo/tBHjjmLSqb55urFLlESLiT/U/sewkLUC/FwdD+z7lfp6h+MsPwEu3OQvRFOVMQAAAABJRU5ErkJggg=="/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.5 KiB |
|
|
@ -0,0 +1 @@
|
|||
.page[data-v-9089cc21]{font-family:PingFang SC;-webkit-user-select:none;user-select:none;background-position:0 0;background-repeat:no-repeat;background-size:cover;color:#fff;line-height:1}.nav[data-v-9089cc21]{position:relative}.nav[data-v-9089cc21]:before{top:-48px}.nav .activeChildren:hover a[data-v-9089cc21],.nav .activeChildren:hover span[data-v-9089cc21]{text-decoration:underline}.nav[data-v-9089cc21]:after{bottom:-49px;transform:rotate(-90deg)}.nav.active[data-v-9089cc21]{color:#002fa7;background-color:#fff}.nav.active a[data-v-9089cc21]{color:#002fa7}.nav.active[data-v-9089cc21]:before,.nav.active[data-v-9089cc21]:after{opacity:1}.nav.actives[data-v-9089cc21]{padding:0!important;color:#002fa7;background-color:#ffffff4d}.nav.actives a[data-v-9089cc21]{color:#002fa7}.nav.actives[data-v-9089cc21]:before,.nav.actives[data-v-9089cc21]:after{opacity:1}.nav.actives .onActive[data-v-9089cc21]{background-color:#fff;border-radius:32px 0 0 32px;padding:24px 36px}.main[data-v-9089cc21]{background-image:url(/assets/bg-rs-main-5a93bda9.svg);background-position:0 0;background-repeat:repeat-x;background-size:auto}[data-v-9089cc21]::-webkit-scrollbar{display:none;scrollbar-width:none}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.top[data-v-605d84d7]{position:absolute;right:30px;top:-92px}[data-v-605d84d7]::-webkit-scrollbar{width:1px}.q-wrapper[data-v-605d84d7]{border-radius:18px;border:1px solid #e7ebf5;box-shadow:inset 1px 2px 12px #0e56dd52;overflow:auto}.q-wrapper[data-v-605d84d7]:after{content:" ";background-image:url(/assets/bg-card-cf2a9f09.svg);pointer-events:none;display:block;width:100%;height:127px;background-repeat:no-repeat;background-position:right top;position:absolute;left:0;top:0}
|
||||
|
After Width: | Height: | Size: 192 KiB |
|
|
@ -0,0 +1,828 @@
|
|||
<template>
|
||||
<HomeHead class="top"></HomeHead>
|
||||
<div class="flex w-full h-full">
|
||||
|
||||
<AppBlock class="w-full p30px text-#000">
|
||||
<div class="font-600 flex items-center">
|
||||
<!-- <img src="./images/logo.svg" class="h56px mr21px" /> -->
|
||||
<div class="text-36px text-#000">差别化云空间</div>
|
||||
</div>
|
||||
|
||||
<el-tabs type="card" v-model="activeName" class="menu_styl h50px mt30px text-20px" @tab-click="handleClick">
|
||||
<el-tab-pane name="first" class="menu_styl">
|
||||
|
||||
|
||||
|
||||
<template #label>
|
||||
<span class="custom-tabs-label">
|
||||
|
||||
<span class="text-20px my40px ">顶部列表</span>
|
||||
</span>
|
||||
</template>
|
||||
<div class="p30px cont relative w100% h800px overflow-y-auto mb-80px">
|
||||
<div v-for="item in dataC" class="my20px bg-#f5f5f5 rounded-15px items-center flex w-full min-h200px">
|
||||
<img :src="item.url" class="max-w250px max-h350px min-w250px" />
|
||||
<span class="ml40px text-20px min-w845px max-w845px">
|
||||
<span>标 题: {{ item.title }}</span><br><br><br>
|
||||
<span>相关文件: <span v-if="item.fileList[0]">{{ item.fileList[0].name}}</span></span>
|
||||
</span>
|
||||
|
||||
<div class="w200px ml30px">
|
||||
<el-button size="small" type="primary" @click="handleEditC(item)">编辑</el-button>
|
||||
<el-button size="small" type="danger" @click="handleDeleteC(item)">删除</el-button>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="my20px fixed bottom-25px left-20% z-2000 h50px w-full">
|
||||
<el-button type="primary" @click="handleEditC(editC)" >新增列表内容</el-button>
|
||||
<el-button type="primary" @click="getUser(1)" > 查看范围</el-button>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane name="niandu" class="menu_styl">
|
||||
|
||||
<template #label>
|
||||
<span class="custom-tabs-label ">
|
||||
|
||||
<span class="text-20px ">大标题1</span>
|
||||
</span>
|
||||
</template>
|
||||
<div class="p30px cont relative w100% h800px overflow-y-auto">
|
||||
<div v-for="item in dataA" class="my20px bg-#f5f5f5 rounded-15px flex w-full ">
|
||||
<div>
|
||||
<img :src="item.url" class="max-w180px max-h350px min-w180px" />
|
||||
</div>
|
||||
<div class="min-w600px mt50px text-18px">
|
||||
<span class="ml40px text-20px ">底部大标题: {{ item.titles }}</span>
|
||||
<br><br> <br><br>
|
||||
|
||||
<span class="ml40px text-20px mt40px">标 题: {{ item.title }}</span>
|
||||
<br><br> <br><br>
|
||||
|
||||
<span class="ml40px text-20px mt40px">位 置: {{ item.indexId ==='1'?'左边内容':'右边内容' }}</span>
|
||||
</div>
|
||||
<div class="max-w100px min-w100px mt120px">
|
||||
<span class=" text-18px ">文件列表:</span>
|
||||
|
||||
</div>
|
||||
<div class="max-w250px min-w250px mt25px flex items-center">
|
||||
<sapn v-if="item.fileList" v-for="i in item.fileList" ><span class="mt5px">{{i.name}}</span><br><br></sapn>
|
||||
</div>
|
||||
|
||||
<div class="w160px ml30px mt120px">
|
||||
<el-button size="small" type="primary" @click="handleEditA(item)">编辑</el-button>
|
||||
<el-button size="small" type="danger" @click="handleDeleteA(item)">删除</el-button>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<!-- <el-button type="primary" @click="handleEditA(editA)" class="my20px fixed bottom-30px left-20% z-2000">新增年度内容</el-button> -->
|
||||
<div class="my20px fixed bottom-25px left-20% z-2000 h50px w-full">
|
||||
<el-button type="primary" @click="handleEditA(editA)" >新增列表内容</el-button>
|
||||
<el-button type="primary" @click="getUser(2)" @CloseThis="CloseThiss" > 查看范围</el-button>
|
||||
</div>
|
||||
</div>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane name="second" class="menu_styl">
|
||||
|
||||
<template #label>
|
||||
<span class="custom-tabs-label ">
|
||||
|
||||
<span class="text-20px ">大标题2</span>
|
||||
</span>
|
||||
</template>
|
||||
<div class="p30px cont relative w100% h800px overflow-y-auto">
|
||||
<div v-for="item in dataB" class="my20px bg-#f5f5f5 rounded-15px flex w-full ">
|
||||
<div>
|
||||
<img :src="item.url" class="max-w180px max-h350px min-w180px" />
|
||||
</div>
|
||||
<div class="min-w600px mt50px">
|
||||
<span class="ml40px text-20px ">底部大标题: {{ item.titles }}</span>
|
||||
<br><br> <br><br>
|
||||
|
||||
<span class="ml40px text-20px mt40px">标 题: {{ item.title }}</span>
|
||||
<br><br> <br><br>
|
||||
|
||||
<span class="ml40px text-20px mt40px">位 置: {{ item.indexId ==='1'?'左边内容':'右边内容' }}</span>
|
||||
</div>
|
||||
<div class="max-w100px min-w100px mt120px">
|
||||
<span class=" text-20px ">文件列表:</span>
|
||||
|
||||
</div>
|
||||
<div class="max-w250px min-w250px mt20px flex items-center">
|
||||
<sapn v-if="item.fileList" v-for="i in item.fileList" ><span class="mt5px">{{i.name}}</span><br><br></sapn>
|
||||
</div>
|
||||
|
||||
<div class="w120px ml30px mt120px">
|
||||
<el-button size="small" type="primary" @click="handleEditB(item)">编辑</el-button>
|
||||
<el-button size="small" type="danger" @click="handleDeleteB(item)">删除</el-button>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="my20px fixed bottom-25px left-20% z-2000 h50px w-full">
|
||||
<el-button type="primary" @click="handleEditB(editB)" >新增列表内容</el-button>
|
||||
<el-button type="primary" @click="getUser(3)" > 查看范围</el-button>
|
||||
</div>
|
||||
</div>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane name="fourth" class="menu_styl">
|
||||
<template #label>
|
||||
<span class="custom-tabs-label">
|
||||
|
||||
<span class="text-20px">研究方向</span>
|
||||
</span>
|
||||
</template>
|
||||
<div class="p30px cont relative w100% h800px overflow-y-auto">
|
||||
|
||||
<Modify></Modify>
|
||||
|
||||
<!-- <el-button type="primary" @click="handleEditC(editC)" class="my20px absolute bottom-0px left-0px">新增列表内容</el-button> -->
|
||||
</div>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane name="pro" class="menu_styl">
|
||||
<template #label>
|
||||
<span class="custom-tabs-label">
|
||||
|
||||
<span class="text-20px">PRO成员</span>
|
||||
</span>
|
||||
</template>
|
||||
|
||||
<ModifyPor/>
|
||||
|
||||
</el-tab-pane>
|
||||
<el-tab-pane name="list" class="menu_styl">
|
||||
<template #label>
|
||||
<span class="custom-tabs-label">
|
||||
|
||||
<span class="text-20px">解决方案列表</span>
|
||||
</span>
|
||||
</template>
|
||||
<ModifyList/>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
|
||||
</AppBlock>
|
||||
|
||||
|
||||
</div>
|
||||
<n-modal v-model:show="shomkC">
|
||||
|
||||
<div class="bg-#FFF p30px">
|
||||
<el-form :model="editC" label-width="120px" :inline="true">
|
||||
<el-form-item label="标题">
|
||||
<el-input v-model="editC.title" />
|
||||
</el-form-item>
|
||||
<br>
|
||||
<!-- <el-form-item label="所属类型">
|
||||
<n-select class="min-w220px" size="large" v-if="options" v-model:value="editC.catId" :options="options" label-field="cateName" value-field="id" />
|
||||
|
||||
</el-form-item> -->
|
||||
<br>
|
||||
<el-form-item label="图片">
|
||||
<el-upload v-model:file-list="editC.files" :headers="header" action="/test-api/common/upload"
|
||||
list-type="picture-card" :on-success="handlePreview" :on-remove="handleRemove"
|
||||
:before-upload="onUpload" :limit="1">
|
||||
<el-icon>
|
||||
<Plus />
|
||||
</el-icon>
|
||||
</el-upload>
|
||||
|
||||
<el-dialog v-model="dialogVisible">
|
||||
<img w-full :src="dialogImageUrl" alt="Preview Image" />
|
||||
</el-dialog>
|
||||
</el-form-item>
|
||||
<br>
|
||||
<el-form-item label="文件" v-if="editC.fileList">
|
||||
<el-upload v-model:file-list="editC.fileList" class="upload-demo" :headers="header"
|
||||
action="/test-api/common/upload" :limit="1">
|
||||
<el-button type="primary">选择文件</el-button>
|
||||
|
||||
</el-upload>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<hr class="mb15px border-#f1f1f1">
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="onSubmitC(editC)">确认</el-button>
|
||||
</el-form-item>
|
||||
</div>
|
||||
</n-modal>
|
||||
|
||||
<n-modal v-model:show="shomkB">
|
||||
<div class="bg-#FFF p30px">
|
||||
<el-form :model="editC" label-width="120px" :inline="true">
|
||||
<el-form-item label="名字">
|
||||
<el-input v-model="fuckList.title" />
|
||||
</el-form-item>
|
||||
<br>
|
||||
<el-form-item label="照片">
|
||||
<el-upload v-model:file-list="fuckList.files" :headers="header" action="/test-api/common/upload"
|
||||
list-type="picture-card" :on-success="handlePreviews" :on-remove="handleRemove" :on-error="handErro"
|
||||
:on-exceed="handOnExceed" :limit="1">
|
||||
<el-icon>
|
||||
<Plus />
|
||||
</el-icon>
|
||||
</el-upload>
|
||||
<br>
|
||||
<el-dialog v-model="dialogVisible">
|
||||
<img w-full :src="dialogImageUrl" alt="Preview Image" />
|
||||
</el-dialog>
|
||||
</el-form-item>
|
||||
<br>
|
||||
<el-form-item label="职位">
|
||||
<el-input v-model="fuckList.time" />
|
||||
</el-form-item>
|
||||
<br>
|
||||
<el-form-item label="研究方向">
|
||||
<el-input v-model="fuckList.dowhat" />
|
||||
</el-form-item>
|
||||
|
||||
<br>
|
||||
<el-form-item label="文件">
|
||||
<el-upload v-model:file-list="fuckList.fileList" class="upload-demo" :before-upload="beforeUpload"
|
||||
:headers="header" action="/test-api/common/upload">
|
||||
<el-button type="primary">选择文件</el-button>
|
||||
|
||||
</el-upload>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<hr class="mb15px border-#f1f1f1">
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="onSubmits(fuckList)">确认</el-button>
|
||||
</el-form-item>
|
||||
</div>
|
||||
</n-modal>
|
||||
|
||||
|
||||
<n-modal v-model:show="shomkA">
|
||||
<div class="bg-#FFF p30px">
|
||||
<el-form :model="editA" label-width="120px" :inline="true">
|
||||
<el-form-item label="底部大标题">
|
||||
<el-input v-model="editA.titles" />
|
||||
</el-form-item>
|
||||
<br />
|
||||
<el-form-item label="标题">
|
||||
<el-input v-model="editA.title" />
|
||||
</el-form-item>
|
||||
<br>
|
||||
<!-- <el-form-item label="编辑模块">
|
||||
<el-radio-group v-model="editA.indexId" class="ml-4">
|
||||
<el-radio label="1" size="large">左侧内容</el-radio>
|
||||
<el-radio label="2" size="large">解决方案创造</el-radio>
|
||||
<el-radio label="2" size="large">右侧内容</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<br> -->
|
||||
<el-form-item label="封面图">
|
||||
<el-upload v-model:file-list="editA.files" :headers="header" action="/test-api/common/upload"
|
||||
list-type="picture-card" :on-success="handlePreview1" :on-remove="handleRemove" :on-error="handErro"
|
||||
:on-exceed="handOnExceed" :limit="1">
|
||||
<el-icon>
|
||||
<Plus />
|
||||
</el-icon>
|
||||
</el-upload>
|
||||
<br>
|
||||
<el-dialog v-model="dialogVisible">
|
||||
<img w-full :src="dialogImageUrl" alt="Preview Image" />
|
||||
</el-dialog>
|
||||
</el-form-item>
|
||||
<br>
|
||||
<el-form-item label="文件">
|
||||
<el-upload v-model:file-list="editA.fileList" class="upload-demo" :headers="header"
|
||||
action="/test-api/common/upload" :on-change="handleChange">
|
||||
<el-button type="primary">选择文件</el-button>
|
||||
|
||||
</el-upload>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<hr class="mb15px border-#f1f1f1">
|
||||
<el-form-item class="">
|
||||
<el-button type="primary" class="w88px justify-center" @click="onSubmitA(editA)">确认</el-button>
|
||||
</el-form-item>
|
||||
</div>
|
||||
</n-modal>
|
||||
<n-modal v-model:show="shomkD">
|
||||
<div class="bg-#FFF p30px">
|
||||
<el-form :model="editB" label-width="120px" :inline="true">
|
||||
<el-form-item label="底部大标题标题">
|
||||
<el-input v-model="editB.titles" />
|
||||
</el-form-item>
|
||||
<br />
|
||||
<el-form-item label="标题">
|
||||
<el-input v-model="editB.title" />
|
||||
</el-form-item>
|
||||
<br>
|
||||
<el-form-item label="封面图">
|
||||
<el-upload v-model:file-list="editB.files" :headers="header" action="/test-api/common/upload"
|
||||
list-type="picture-card" :on-success="handlePreview2" :on-remove="handleRemove" :on-exceed="handOnExceed"
|
||||
:limit="1">
|
||||
<el-icon>
|
||||
<Plus />
|
||||
</el-icon>
|
||||
</el-upload>
|
||||
<br>
|
||||
<el-dialog v-model="dialogVisible">
|
||||
<img w-full :src="dialogImageUrl" alt="Preview Image" />
|
||||
</el-dialog>
|
||||
</el-form-item>
|
||||
<br>
|
||||
<el-form-item label="文件">
|
||||
<el-upload v-model:file-list="editB.fileList" class="upload-demo" :headers="header"
|
||||
action="/test-api/common/upload" :on-change="handleChange">
|
||||
<el-button type="primary">选择文件</el-button>
|
||||
|
||||
</el-upload>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<hr class="mb15px border-#f1f1f1">
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="onSubmitB(editB)">确认</el-button>
|
||||
</el-form-item>
|
||||
</div>
|
||||
</n-modal>
|
||||
<n-modal v-model:show="showModal">
|
||||
<UserList :userDataList="setUserList" @clickChild="handleChild" @CloseThis="CloseThiss"/>
|
||||
</n-modal>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import AppBlock from '@/components/AppBlock.vue'
|
||||
import { useMessage, NModal, NSelect, NSpace } from 'naive-ui'
|
||||
import HomeHead from '@/views/home/components/HomeHead.vue'
|
||||
import { Plus } from '@element-plus/icons-vue'
|
||||
import type { UploadProps, UploadUserFile } from 'element-plus'
|
||||
import { useUserStore } from '@/stores/modules/user'
|
||||
import { getLabActList, getLabCsrActList, addLab, getCateList } from '@/api/daikin/base'
|
||||
import Modify from './modifys.vue'
|
||||
import ModifyPor from './modify.vue'
|
||||
import ModifyList from './component/modify.vue'
|
||||
import UserList from '@/views/home/intelligence/process/UserPages.vue'
|
||||
const ids = ref('')
|
||||
const { push } = useRouter()
|
||||
|
||||
const store = useUserStore()
|
||||
const message = useMessage()
|
||||
const header = { 'token': store.user.token }
|
||||
const dialogImageUrl = ref('')
|
||||
const dialogVisible = ref(false)
|
||||
|
||||
const dataA = ref([])
|
||||
const dataB = ref([])
|
||||
const dataC = ref([])
|
||||
const dataD = ref([])
|
||||
const dataE = ref([])
|
||||
const options = ref([])
|
||||
|
||||
|
||||
const editC = ref()
|
||||
const editD = ref()
|
||||
const editA = ref()
|
||||
const editB = ref()
|
||||
|
||||
const shomkA = ref(false)
|
||||
const shomkB = ref(false)
|
||||
const shomkC = ref(false)
|
||||
const shomkD = ref(false)
|
||||
|
||||
const handleClick = (tab: TabsPaneContext, event: Event) => {
|
||||
// console.log(tab, event)
|
||||
}
|
||||
|
||||
const activeName = ref('first')
|
||||
|
||||
/**"memberContentIsSelect": 1, //成员是否有权限 1是 2否
|
||||
* "bannerContentIsSelect": 2, //banner是否有权限 1是 2否
|
||||
* "leftContentIsSelect": 1, //左大是否有权限 1是 2否
|
||||
* "rightContentIsSelect": 1, //右大是否有权限 1是 2否
|
||||
* "actTopIsSelect": 2, //基础研究方向 第一条分类 是否有权限 1是 2否
|
||||
"actMidIsSelect": 2, //基础研究方向 第二条分类 是否有权限 1是 2否
|
||||
"actDownIsSelect": 2 //基础研究方向 第三条分类 是否有权限 1是 2否
|
||||
*/
|
||||
const memberUserLists =ref()
|
||||
const leftUserLists =ref()
|
||||
const rightUserLists =ref()
|
||||
const bannerUserLists =ref()
|
||||
const bannerContentUserLists = ref()
|
||||
const leftContentUserLists = ref()
|
||||
const rightContentUserLists = ref()
|
||||
onMounted(async () => {
|
||||
getData();
|
||||
})
|
||||
|
||||
async function getData() {
|
||||
// const { data: datas } = await getLabCsrActList()
|
||||
const { data } = await getLabActList()
|
||||
const {id,memberContent,bannerContent,leftContent,rightContent,leftUserList,rightUserList,memberUserList,bannerUserList,bannerContentUserList,leftContentUserList,rightContentUserList} = data
|
||||
|
||||
// const { data: dataBot } = await getCateList({ indexId: 1 })
|
||||
memberUserLists.value = memberUserList
|
||||
leftUserLists.value = leftUserList
|
||||
rightUserLists.value = rightUserList
|
||||
bannerUserLists.value = bannerUserList
|
||||
bannerContentUserLists.value = bannerContentUserList
|
||||
leftContentUserLists.value = leftContentUserList
|
||||
rightContentUserLists.value = rightContentUserList
|
||||
// options.value = dataBot
|
||||
ids.value = id
|
||||
// console.log(dataBot,options.value)
|
||||
if (leftContent && leftContent.length > 0) {
|
||||
dataA.value = leftContent.map((obj: any, indx: number) => ({
|
||||
...obj,
|
||||
id: indx + 1
|
||||
}))
|
||||
}
|
||||
|
||||
// dataB.value = B
|
||||
if (rightContent && rightContent.length > 0) {
|
||||
dataB.value = rightContent.map((obj: any, indx: number) => ({
|
||||
...obj,
|
||||
id: indx + 1
|
||||
}))
|
||||
}
|
||||
|
||||
|
||||
// dataC.value = bannerContent
|
||||
// dataD.value = D
|
||||
if (bannerContent && bannerContent.length > 0) {
|
||||
dataC.value = bannerContent.map((obj: any, indx: number) => ({
|
||||
...obj,
|
||||
id: indx + 1
|
||||
}))
|
||||
}
|
||||
if (memberContent) {
|
||||
dataD.value = memberContent
|
||||
|
||||
}
|
||||
userList.value =data.userIdList
|
||||
// console.log( fuckList.value)
|
||||
}
|
||||
|
||||
async function modify(objA: any,objB: any,objC: any,objD: any,objE: any,objF: any,objG: any,objH: any) {
|
||||
const leftContent = unref(objA)
|
||||
const rightContent = unref(objB)
|
||||
const bannerContent = unref(objC)
|
||||
const memberContent = unref(objD)
|
||||
const bannerUserList =unref(objE)
|
||||
const leftUserList =unref(objF)
|
||||
const rightUserList =unref(objG)
|
||||
const memberUserList =unref(objH)
|
||||
const id = ids.value
|
||||
|
||||
// if(!userList.value){
|
||||
// message.info("请选择通知范围")
|
||||
// return
|
||||
// }
|
||||
const userIdList = userList.value
|
||||
console.log(bannerContent)
|
||||
const { code, msg } = await addLab({ id,bannerUserList,leftUserList,rightUserList,memberUserList, memberContent,bannerContent,rightContent,leftContent })
|
||||
if (code === 200) { message.success("修改成功") }
|
||||
else message.warning(msg)
|
||||
// window.location.reload();
|
||||
getData();
|
||||
}
|
||||
|
||||
|
||||
|
||||
// async function onSubmitD(row: { id: number; url: any; title: string; time: string; files: never[]; fileList: never[] }) {
|
||||
// console.log(swiperList.value, row.id)
|
||||
// swiperList.value.map(obj => {
|
||||
// obj.id === row.id ? { ...obj, ...row } : obj
|
||||
|
||||
// // console.log(i.id)
|
||||
// })
|
||||
// const existingIds = swiperList.value.map(obj => obj.id);
|
||||
// if (!existingIds.includes(row.id)) {
|
||||
// if (row.id === '') {
|
||||
// row.id = Math.floor(Math.random() * 100)
|
||||
// }
|
||||
// if (!row.catId) {
|
||||
// message.error("所属类型必选!")
|
||||
// return
|
||||
// }
|
||||
// swiperList.value.push(row);
|
||||
// }
|
||||
// shomkB.value = false
|
||||
// console.log(swiperList.value)
|
||||
|
||||
|
||||
// }
|
||||
|
||||
async function onSubmitA(row: { id: string | number; indexId: any }) {
|
||||
|
||||
dataA.value.map(obj=>{
|
||||
obj.id === row.id ? { ...obj, ...row } : obj
|
||||
|
||||
// console.log(i.id)
|
||||
})
|
||||
const existingIds = dataA.value.map(obj => obj.id);
|
||||
if (!existingIds.includes(row.id)) {
|
||||
if(row.id===''){
|
||||
row.id = Math.floor(Math.random() * 100)
|
||||
}
|
||||
if(!row.indexId){
|
||||
message.error("所属类型必选!")
|
||||
return
|
||||
}
|
||||
dataA.value.push(row);
|
||||
}
|
||||
shomkA.value = false
|
||||
modify(dataA.value,dataB.value,dataC.value,dataD.value,bannerUserLists.value,leftUserLists.value,rightUserLists.value,memberUserLists.value)
|
||||
|
||||
}
|
||||
|
||||
async function onSubmitB(row: { id: number; url: any; title: string; time: string; files: never[]; fileList: never[] }) {
|
||||
// console.log(dataB.value, row.id)
|
||||
dataB.value.map(obj => {
|
||||
obj.id === row.id ? { ...obj, ...row } : obj
|
||||
|
||||
// console.log(i.id)
|
||||
})
|
||||
const existingIds = dataB.value.map(obj => obj.id);
|
||||
if (!existingIds.includes(row.id)) {
|
||||
if (row.id === '') {
|
||||
row.id = Math.floor(Math.random() * 100)
|
||||
}
|
||||
dataB.value.push(row);
|
||||
}
|
||||
shomkD.value = false
|
||||
modify(dataA.value,dataB.value,dataC.value,dataD.value,bannerUserLists.value,leftUserLists.value,rightUserLists.value,memberUserLists.value)
|
||||
|
||||
|
||||
}
|
||||
|
||||
async function onSubmitC(row: any) {
|
||||
|
||||
// console.log(row)
|
||||
dataC.value.map(obj=>{
|
||||
obj.id === row.id ? { ...obj, ...row } : obj
|
||||
|
||||
// console.log(i.id)
|
||||
})
|
||||
const existingIds = dataC.value.map(obj => obj.id);
|
||||
if (!existingIds.includes(row.id)) {
|
||||
if(row.id===''){
|
||||
row.id = Math.floor(Math.random() * 100)
|
||||
}
|
||||
// if(!row.catId){
|
||||
// message.error("所属类型必选!")
|
||||
// return
|
||||
// }
|
||||
dataC.value.push(row);
|
||||
}
|
||||
shomkC.value = false
|
||||
modify(dataA.value,dataB.value,dataC.value,dataD.value,bannerUserLists.value,leftUserLists.value,rightUserLists.value,memberUserLists.value)
|
||||
// console.log(dataC.value)
|
||||
}
|
||||
|
||||
|
||||
|
||||
const handleEditC = (row: any) => {
|
||||
// console.log(row)
|
||||
if (row && row.url) {
|
||||
// console.log(row.files.length)
|
||||
if (row.files.length <= 0) {
|
||||
row.files.push({ url: row.url });
|
||||
}
|
||||
else {
|
||||
row.files.map(i => {
|
||||
i.url = i.response.url
|
||||
})
|
||||
}
|
||||
}
|
||||
else {
|
||||
editC.value = {
|
||||
id: '',
|
||||
url: '',
|
||||
title: '',
|
||||
time: '',
|
||||
createTime:date,
|
||||
files: [],
|
||||
fileList: [],
|
||||
}
|
||||
}
|
||||
shomkC.value = true
|
||||
if (!row) return
|
||||
editC.value = row
|
||||
|
||||
console.log(editC.value)
|
||||
}
|
||||
const date = new Date()
|
||||
const handleEditA = (row: any) => {
|
||||
// console.log(row)
|
||||
if (row && row.url) {
|
||||
// console.log(row.files.length)
|
||||
if (row.files.length <= 0) {
|
||||
row.files.push({ url: row.url });
|
||||
}
|
||||
else {
|
||||
row.files.map(i => {
|
||||
i.url = i.response.url
|
||||
})
|
||||
}
|
||||
}
|
||||
else {
|
||||
editA.value = {
|
||||
id: '',
|
||||
url: '',
|
||||
title: '',
|
||||
titles: '',
|
||||
|
||||
indexId:'1',
|
||||
files: [],
|
||||
fileList: []
|
||||
}
|
||||
}
|
||||
shomkA.value = true
|
||||
if (!row) return
|
||||
editA.value = row
|
||||
|
||||
// console.log(editA.value)
|
||||
}
|
||||
|
||||
const handleEditB = (row: any) => {
|
||||
// console.log(row)
|
||||
if (row && row.url) {
|
||||
// console.log(row.files.length)
|
||||
if (row.files.length <= 0) {
|
||||
row.files.push({ url: row.url });
|
||||
}
|
||||
else {
|
||||
row.files.map(i => {
|
||||
i.url = i.response.url
|
||||
})
|
||||
}
|
||||
}
|
||||
else {
|
||||
editB.value = {
|
||||
id: '',
|
||||
url: '',
|
||||
titles: '',
|
||||
title: '',
|
||||
time: '',
|
||||
files: [],
|
||||
fileList: [],
|
||||
show: false,
|
||||
}
|
||||
}
|
||||
shomkD.value = true
|
||||
if (!row) return
|
||||
editB.value = row
|
||||
|
||||
// console.log(editB.value)
|
||||
}
|
||||
|
||||
const handleDeleteA = (row: any) => {
|
||||
// console.log(dataA.value, row)
|
||||
dataA.value = dataA.value.filter(item => item.id !== row.id);
|
||||
modify(dataA.value,dataB.value,dataC.value,dataD.value,bannerUserLists.value,leftUserLists.value,rightUserLists.value,memberUserLists.value)
|
||||
}
|
||||
const handleDeleteB = (row: any) => {
|
||||
// console.log(dataB.value, row)
|
||||
dataB.value = dataB.value.filter(item => item.id !== row.id);
|
||||
|
||||
}
|
||||
const handleDeleteC = (row: any) => {
|
||||
dataC.value = dataC.value.filter(item => item.id !== row.id);
|
||||
modify(dataA.value,dataB.value,dataC.value,dataD.value,bannerUserLists.value,leftUserLists.value,rightUserLists.value,memberUserLists.value)
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
const handleRemove: UploadProps['onRemove'] = (uploadFile: any, uploadFiles: any) => {
|
||||
// console.log(uploadFile, uploadFiles)
|
||||
}
|
||||
const handOnExceed: UploadProps['onExceed'] = (uploadFile: any, uploadFiles: any) => {
|
||||
message.warning("最多只能上传一张图片!")
|
||||
}
|
||||
const handlePreview: UploadProps['onSuccess'] = (uploadFile: any) => {
|
||||
// console.log(uploadFile.url)
|
||||
|
||||
if(uploadFile.code ===200){
|
||||
editC.value.url = uploadFile.url
|
||||
}
|
||||
else{
|
||||
message.warning(uploadFile.msg)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
const handlePreview1: UploadProps['onSuccess'] = (uploadFile: any) => {
|
||||
// console.log("++++++++++++++++++++++++++++")
|
||||
// console.log(uploadFile,editA.value)
|
||||
if(uploadFile.code ===200){
|
||||
editA.value.url = uploadFile.url
|
||||
}
|
||||
else{
|
||||
message.warning(uploadFile.msg)
|
||||
return
|
||||
}
|
||||
|
||||
}
|
||||
const handlePreview2: UploadProps['onSuccess'] = (uploadFile: any) => {
|
||||
// console.log("++++++++++++++++++++++++++++")
|
||||
if(uploadFile.code ===200){
|
||||
editB.value.url = uploadFile.url
|
||||
}
|
||||
else{
|
||||
message.warning(uploadFile.msg)
|
||||
return
|
||||
}
|
||||
|
||||
}
|
||||
const beforeUpload=(file: { type: string })=> {
|
||||
// Validate the file type before uploading
|
||||
const isPDF = file.type === 'application/pdf';
|
||||
if (!isPDF) {
|
||||
message.error('仅支持PDF文件上传');
|
||||
}
|
||||
return isPDF;
|
||||
}
|
||||
const onUpload: UploadProps['onUpload'] = (uploadFile: any) => {
|
||||
// console.log("++++++++++++++++++++++++++++")
|
||||
// message.warning(uploadFile)
|
||||
// dataB.value.url = uploadFile.url
|
||||
}
|
||||
const userList = ref()
|
||||
const showModal = ref(false)
|
||||
const flg = ref()
|
||||
const setUserList =ref()
|
||||
const getUser=(id: any)=>{
|
||||
showModal.value = !showModal.value
|
||||
flg.value = id
|
||||
if(id===1){
|
||||
setUserList.value = bannerContentUserLists.value
|
||||
}
|
||||
else if(id===2){
|
||||
setUserList.value = leftContentUserLists.value
|
||||
}
|
||||
else if(id===3){
|
||||
setUserList.value = rightContentUserLists.value
|
||||
}
|
||||
|
||||
}
|
||||
// 获取子组件传过来的值
|
||||
const handleChild = (data: any) => {
|
||||
const { showModal: show, multipleSelection } = data
|
||||
showModal.value = unref(show)
|
||||
// userList.value = multipleSelection
|
||||
let userIdList: any[] =[]
|
||||
multipleSelection.value.forEach((i: { userId: any })=>{
|
||||
// console.log(dataList.value)
|
||||
userIdList.push(i.userId)
|
||||
})
|
||||
|
||||
if(flg.value===1){
|
||||
bannerUserLists.value= userIdList
|
||||
}
|
||||
else if(flg.value===2){
|
||||
leftUserLists.value = userIdList
|
||||
}
|
||||
else if(flg.value===3){
|
||||
rightUserLists.value = userIdList
|
||||
}
|
||||
modify(dataA.value,dataB.value,dataC.value,dataD.value,bannerUserLists.value,leftUserLists.value,rightUserLists.value,memberUserLists.value)
|
||||
}
|
||||
const CloseThiss = (data: boolean)=>{
|
||||
showModal.value = data
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="less">
|
||||
.el-form-item__content{
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar{
|
||||
width: 1px;
|
||||
}
|
||||
.demo-tabs > .el-tabs__content {
|
||||
padding: 32px;
|
||||
color: #6b778c;
|
||||
font-size: 32px;
|
||||
font-weight: 600;
|
||||
}
|
||||
.cont {
|
||||
img {
|
||||
background-color: antiquewhite;
|
||||
}
|
||||
}
|
||||
|
||||
.custom-tabs-label {
|
||||
|
||||
padding: 30px;
|
||||
|
||||
}
|
||||
|
||||
.top {
|
||||
position: absolute;
|
||||
right: 30px;
|
||||
top: -92px;
|
||||
}
|
||||
</style>
|
||||
|
|
@ -0,0 +1 @@
|
|||
const i='a[href],button:not([disabled]),button:not([hidden]),:not([tabindex="-1"]),input:not([disabled]),input:not([type="hidden"]),select:not([disabled]),textarea:not([disabled])',a=t=>getComputedStyle(t).position==="fixed"?!1:t.offsetParent!==null,c=t=>Array.from(t.querySelectorAll(i)).filter(e=>u(e)&&a(e)),u=t=>{if(t.tabIndex>0||t.tabIndex===0&&t.getAttribute("tabIndex")!==null)return!0;if(t.disabled)return!1;switch(t.nodeName){case"A":return!!t.href&&t.rel!=="ignore";case"INPUT":return!(t.type==="hidden"||t.type==="file");case"BUTTON":case"SELECT":case"TEXTAREA":return!0;default:return!1}},d=t=>!t.getAttribute("aria-owns"),l=(t,e,s)=>{const{parentNode:n}=t;if(!n)return null;const r=n.querySelectorAll(s),o=Array.prototype.indexOf.call(r,t);return r[o+e]||null},f=t=>{t&&(t.focus(),!d(t)&&t.click())};export{f,l as g,d as i,c as o};
|
||||
|
|
@ -0,0 +1,799 @@
|
|||
<script setup lang="ts">
|
||||
import VChart from 'vue-echarts'
|
||||
import { useChart1, useChart22, useChart21, useChart3, useChart23 } from './HomeData'
|
||||
import AppHeadUserInfo from '@/components/AppHeadUserInfo.vue'
|
||||
import { NSelect } from 'naive-ui'
|
||||
import News from './components/New.vue'
|
||||
import { homePageMarket, homePageRate, report, getHomeList ,amountList} from '@/api/daikin/base'
|
||||
import { useUserStore } from "@/stores/modules/user";
|
||||
const store = useUserStore();
|
||||
|
||||
const isUpPwds =ref(false)
|
||||
const userCode =ref(false)
|
||||
watchEffect(()=>{
|
||||
userCode.value = ['admin', 'cd_dandang', 'tech_service'].includes(store.user.roleCode)
|
||||
isUpPwds.value = store.user.isUpPwd ===2?true:false
|
||||
})
|
||||
const activeCard5NavKey = ref('DIS')
|
||||
const Card5Navs = [
|
||||
{ key: 'DIS', name: 'DIS' },
|
||||
{ key: 'DSZ', name: 'DSZ' },
|
||||
{ key: 'DISH', name: 'DISH' },
|
||||
]
|
||||
const ailists = ref()
|
||||
const culists = ref()
|
||||
const itemLists = ref()
|
||||
const timeA = ref()
|
||||
const timeB = ref()
|
||||
|
||||
const disList = ref([{}, {}, {}, {}]);
|
||||
const dszList = ref([{}, {}, {}, {}]);
|
||||
const dishList = ref([{}, {}, {}, {}]);
|
||||
const month_1 = ref();
|
||||
const month_2 = ref();
|
||||
let now = (new Date()).getMonth() + 13;
|
||||
month_2.value = (now - 2) % 12;
|
||||
month_1.value = (now - 1) % 12;
|
||||
const dataDIS = ref()
|
||||
const dataDSZ = ref()
|
||||
const dataDISH = ref()
|
||||
const addDSZ1 = ref()
|
||||
const addDIS1 = ref()
|
||||
const addDISH1 = ref()
|
||||
const addDSZ2 = ref()
|
||||
const addDIS2 = ref()
|
||||
const addDISH2 = ref()
|
||||
const addDSZ3 = ref()
|
||||
const addDIS3 = ref()
|
||||
const addDISH3 = ref()
|
||||
onMounted(async () => {
|
||||
const { data: { ailist, culist, lastUTime } } = await homePageMarket() //市况
|
||||
const { data: { itemList, lastUTime: _lastUTime } } = await homePageRate() //汇率
|
||||
const { data: _disList } = await getHomeList({number: "DIS"}) //汇率
|
||||
const { data: _dszList } = await getHomeList({number: "DSZ"}) //汇率
|
||||
const { data: _dishList } = await getHomeList({number: "DISH"}) //汇率
|
||||
const { data:fazhu} = await amountList()
|
||||
fazhu.forEach((i: { number: string; amount: any }) => {
|
||||
if(i.number=='DIS'){
|
||||
dataDIS.value = i.amount
|
||||
}
|
||||
if(i.number=='DSZ'){
|
||||
dataDSZ.value = i.amount
|
||||
}
|
||||
if(i.number=='DISH'){
|
||||
dataDISH.value = i.amount
|
||||
}
|
||||
});
|
||||
ailists.value = ailist
|
||||
culists.value = culist
|
||||
itemLists.value = itemList
|
||||
timeA.value = lastUTime
|
||||
timeB.value = _lastUTime
|
||||
|
||||
disList.value = _disList
|
||||
dszList.value = _dszList
|
||||
dishList.value = _dishList
|
||||
|
||||
addDIS1.value = _disList.reduce((previousValue: any, currentValue: { budget: any }) => {
|
||||
const sum =parseFloat (currentValue.budget) +parseFloat(previousValue)
|
||||
return sum>0 ? sum.toFixed(2):0
|
||||
}, 0)
|
||||
addDSZ1.value = _dszList.reduce((previousValue: any, currentValue: { budget: any }) => {
|
||||
const sum = parseFloat(currentValue.budget) +parseFloat(previousValue)
|
||||
return sum>0 ? sum.toFixed(2):0
|
||||
}, 0)
|
||||
addDISH1.value = _dishList.reduce((previousValue: any, currentValue: { budget: any }) => {
|
||||
const sum = parseFloat(currentValue.budget) +parseFloat(previousValue)
|
||||
return sum>0 ? sum.toFixed(2):0
|
||||
}, 0)
|
||||
addDIS2.value = _disList.reduce((previousValue: any, currentValue: { monthOne: any }) => {
|
||||
const sum = parseFloat(currentValue.monthOne) +parseFloat(previousValue)
|
||||
return sum>0 ? sum.toFixed(2):0
|
||||
}, 0)
|
||||
addDSZ2.value = _dszList.reduce((previousValue: any, currentValue: { monthOne: any }) => {
|
||||
const sum = parseFloat(currentValue.monthOne) +parseFloat(previousValue)
|
||||
return sum>0 ? sum.toFixed(2):0
|
||||
}, 0)
|
||||
addDISH2.value = _dishList.reduce((previousValue: any, currentValue: { monthOne: any }) => {
|
||||
const sum = parseFloat(currentValue.monthOne) +parseFloat(previousValue)
|
||||
return sum>0 ? sum.toFixed(2):0
|
||||
}, 0)
|
||||
addDIS3.value = _disList.reduce((previousValue: any, currentValue: { monthTwo: any }) => {
|
||||
const sum = parseFloat(currentValue.monthTwo) +parseFloat(previousValue)
|
||||
return sum>0 ? sum.toFixed(2):0
|
||||
}, 0)
|
||||
addDSZ3.value = _dszList.reduce((previousValue: any, currentValue: { monthTwo: any }) => {
|
||||
const sum = parseFloat(currentValue.monthTwo) +parseFloat(previousValue)
|
||||
return sum>0 ? sum.toFixed(2):0
|
||||
}, 0)
|
||||
addDISH3.value = _dishList.reduce((previousValue: any, currentValue: { monthTwo: any }) => {
|
||||
const sum = parseFloat(currentValue.monthTwo) +parseFloat(previousValue)
|
||||
return sum>0 ? sum.toFixed(2):0
|
||||
}, 0)
|
||||
if(isUpPwds.value){
|
||||
ElMessageBox.alert('为了您的帐号安全,首次登录必须更改初始密码', '重要提醒',
|
||||
{
|
||||
confirmButtonText: 'OK',
|
||||
showClose:false,
|
||||
showCancelButton:false,
|
||||
}).then(()=>{
|
||||
push({ name: 'modifys' })
|
||||
})
|
||||
}
|
||||
})
|
||||
const { push } = useRouter()
|
||||
const route = useRoute()
|
||||
const timeNow = useDateFormat(useNow(), 'YYYY-MM-DD')
|
||||
|
||||
const { chartRef: chartRef1, option: chartOption1 } = useChart1()
|
||||
const { chartRef: chartRef2, option: chartOption2,state } = useChart21()
|
||||
const { chartRef: chartRef22, option: chartOption22 } = useChart22()
|
||||
const { chartRef: chartRef23, option: chartOption23 } = useChart23()
|
||||
const { chartRef: chartRef3, option: chartOption3 } = useChart3()
|
||||
const displayDiffValue = (diffValue: number) => {
|
||||
if (diffValue > 0) {
|
||||
return `+${diffValue} %`;
|
||||
} else if (diffValue < 0) {
|
||||
return `-${Math.abs(diffValue)} %`;
|
||||
} else {
|
||||
return `${diffValue} %`;
|
||||
}
|
||||
}
|
||||
|
||||
async function setModule(codes: any, names: any) {
|
||||
const moduleCode = codes
|
||||
console.log(codes, names)
|
||||
push({ name: names })
|
||||
const { code } = await report({ moduleCode })
|
||||
|
||||
}
|
||||
const selectData = ref("原材料")
|
||||
const option = [{
|
||||
label: '全部数据',
|
||||
value: 'quanbu'
|
||||
},{
|
||||
label: '原材料',
|
||||
value: 'yuancailiao'
|
||||
},
|
||||
{
|
||||
label: '加工品',
|
||||
value: 'jiagongping'
|
||||
},
|
||||
{
|
||||
label: '机能部品',
|
||||
value: 'jineng'
|
||||
},]
|
||||
|
||||
|
||||
const thisSelect = (e) => {
|
||||
console.log(e)
|
||||
state.title = e
|
||||
}
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="top flex items-center text-20px">
|
||||
<div class="flex-1 font-800 text-30px"></div>
|
||||
<AppHeadUserInfo />
|
||||
</div>
|
||||
<div class="page-wrapper h-full flex-1 flex flex-col flex-wrap">
|
||||
<div class="font-800 text-30px mt39px">FY23年度调达本部方针:创新实干,勇毅前行,以综合实力挑战变革,提升存在感</div>
|
||||
<div class="mt30px flex-1 flex flex-wrap justify-between">
|
||||
<News></News>
|
||||
|
||||
|
||||
<div class="card cursor-pointer">
|
||||
<div class="card_title" @click="setModule('App_Market', 'Market')">市况汇率 每日更新</div>
|
||||
<div class="card_nav card_nav2 !top--3px !right--1px">
|
||||
<div class=" !text-14px w260px top--4px text-right leading-18px">
|
||||
出处:市况-SMM/LME<br />
|
||||
汇率-外汇管理局
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<!-- <div class="card_sub-title">责任者:调达中心 Device变革T/原材料变革T</div> -->
|
||||
|
||||
<div class="card_content">
|
||||
<!-- <VChart :option="chartOption1" autoresize /> -->
|
||||
<div class="flex pl15px pr10px pt15px text-#898F9F">
|
||||
<div class="">
|
||||
<span class="icoT ">市况</span>
|
||||
<span class="ml15px text-12px">更新时间:{{ timeA }}</span>
|
||||
|
||||
<div class="h150px overflow-auto">
|
||||
|
||||
<table class="history w-full text-center mt18px text-16px border-spacing-0 w219px">
|
||||
<thead
|
||||
style="background-color: #417BEF;color: #fff;height: 42px;width: 220px; border: 1px solid #417BEF;">
|
||||
<tr class="h41px">
|
||||
<th>铜</th>
|
||||
<th>最新</th>
|
||||
<th>前日差</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody v-if="culists">
|
||||
<tr class="h45px" v-for="(it, index) in culists" :key="index"
|
||||
:class="index % 2 !== 0 ? 'bg-#f9f9f9' : ''">
|
||||
<td class=" text-12px">{{ it.channel }}</td>
|
||||
<td class="text-12px">{{ it.negAmount }}</td>
|
||||
<td class=" text-12px" :class="it.diffValue < 0 ? 'text-#63BF8D' : 'text-red'">
|
||||
{{ displayDiffValue(it.diffValue) }}</td>
|
||||
</tr>
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="h150px overflow-auto">
|
||||
<table class="history w-full text-center mt15px text-16px border-spacing-0 overflow-auto w219px">
|
||||
<thead
|
||||
style="background-color: #417BEF;color: #fff;height: 42px;width: 220px; border: 1px solid #417BEF;">
|
||||
<tr class="h41px">
|
||||
<th>铝</th>
|
||||
<th>最新</th>
|
||||
<th>前日差</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody v-if="ailists">
|
||||
<tr class="h45px" v-for="(it, index) in ailists" :key="index"
|
||||
:class="index % 2 !== 0 ? 'bg-#f9f9f9' : ''">
|
||||
<td class=" text-12px">{{ it.channel }}</td>
|
||||
<td class="text-12px">{{ it.negAmount }}</td>
|
||||
<td class=" text-12px" :class="it.diffValue < 0 ? 'text-#63BF8D' : 'text-red'">
|
||||
{{ displayDiffValue(it.diffValue) }}</td>
|
||||
</tr>
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="ml10px">
|
||||
<span class="icoT">汇率</span>
|
||||
<span class="ml15px text-12px">更新时间:{{ timeB }}</span>
|
||||
<div class="h282px pt18px">
|
||||
<table class="history w-full text-center text-16px border-spacing-0 w219px ">
|
||||
<thead
|
||||
style="background-color: #417BEF;color: #fff;height: 42px;width: 220px; border: 1px solid #417BEF;">
|
||||
<tr class="h41px">
|
||||
<th class="w75px ">币种</th>
|
||||
<th>最新</th>
|
||||
<th class="w65px">前日差</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody v-if="itemLists" class="h238px overflow-auto absolute">
|
||||
<tr class="h60px !text-12px" v-for="(it, index) in itemLists" :key="index"
|
||||
:class="index % 2 !== 0 ? 'bg-#f9f9f9' : ''">
|
||||
<td class=" w75px text-center">{{ it.currencyNameFrom }}-{{ it.currencyNameTo }}</td>
|
||||
<td class=" w85px text-center">{{ it.negAmount }}</td>
|
||||
<td class=" w65px text-center" :class="it.diffValue < 0 ? 'text-#63BF8D' : 'text-red'">
|
||||
{{ displayDiffValue(it.diffValue) }}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card_title cursor-pointer" @click="setModule('App_data_platform', 'CD')">数据平台</div>
|
||||
<!-- <div class="card_sub-title">责任者:调达中心 企画变革T</div> -->
|
||||
<div class="card_nav card_nav1">
|
||||
<div class="card_nav_item" :class="activeCard5NavKey === i.key && 'active'" v-for="i in Card5Navs" :key="i.name"
|
||||
@click="() => (activeCard5NavKey = i.key)">
|
||||
{{ i.name }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="table-container">
|
||||
<el-button v-if="userCode" type="primary" class="button abs-top" @click="push({ name: 'dataPlatform' })">数据管理</el-button>
|
||||
<table class="data-table" border v-if="activeCard5NavKey === 'DIS'">
|
||||
<colgroup>
|
||||
<col width="20%"/>
|
||||
<col width="20%"/>
|
||||
<col width="20%"/>
|
||||
<col width="20%"/>
|
||||
<col width="20%"/>
|
||||
</colgroup>
|
||||
<tr class="header">
|
||||
<th rowspan="2" colspan="2">拠点</th>
|
||||
<td colspan="3">
|
||||
<div class="tab-header">
|
||||
<div class="tb-title">DIS</div>
|
||||
<div class="tb-subtitle">发注金额:{{dataDIS}}百万元</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="header">
|
||||
<td>年初予算</td>
|
||||
<!-- <td>{{month_2}}月</td> -->
|
||||
<td>改订</td>
|
||||
<td>{{month_1}}月</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th colspan="2">合计</th>
|
||||
<td>{{addDIS1}}%</td>
|
||||
<td>{{addDIS2}}%</td>
|
||||
<td>{{addDIS3}}%</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th rowspan="2">C/D</th>
|
||||
<th>交涉</th>
|
||||
<td :rowspan="disList[0].budget ==disList[1].budget?'2':''">{{disList[0].budget}}%</td>
|
||||
<td :rowspan="disList[0].monthOne ==disList[1].monthOne?'2':''">{{disList[0].monthOne}}%</td>
|
||||
<td :rowspan="disList[0].budget ==disList[1].budget?'2':''">{{disList[0].monthTwo}}%</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>THEME</th>
|
||||
<td v-if="disList[1].budget !=disList[0].budget">{{disList[1].budget}}%</td>
|
||||
<td v-if="disList[1].monthOne !=disList[0].monthOne">{{disList[1].monthOne}}%</td>
|
||||
<td v-if="disList[1].monthTwo !=disList[0].monthTwo">{{disList[1].monthTwo}}%</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th colspan="2">市况</th>
|
||||
<td>{{disList[2].budget}}%</td>
|
||||
<td>{{disList[2].monthOne}}%</td>
|
||||
<td>{{disList[2].monthTwo}}%</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th colspan="2">為替レート</th>
|
||||
<td>{{disList[3].budget}}%</td>
|
||||
<td>{{disList[3].monthOne}}%</td>
|
||||
<td>{{disList[3].monthTwo}}%</td>
|
||||
</tr>
|
||||
</table>
|
||||
<table class="data-table" border v-if="activeCard5NavKey === 'DSZ'">
|
||||
<colgroup>
|
||||
<col width="20%"/>
|
||||
<col width="20%"/>
|
||||
<col width="20%"/>
|
||||
<col width="20%"/>
|
||||
<col width="20%"/>
|
||||
</colgroup>
|
||||
<tr class="header">
|
||||
<th rowspan="2" colspan="2">抛点</th>
|
||||
<td colspan="3">
|
||||
<div class="tab-header">
|
||||
<div class="tb-title">DSZ</div>
|
||||
<div class="tb-subtitle">发注金额:{{dataDSZ}}百万元</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="header">
|
||||
<td>年初予算</td>
|
||||
<!-- <td>{{month_2}}月</td> -->
|
||||
<td>改订</td>
|
||||
<td>{{month_1}}月</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th colspan="2">合计</th>
|
||||
<td>{{addDSZ1}}%</td>
|
||||
<td>{{addDSZ2}}%</td>
|
||||
<td>{{addDSZ3}}%</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th rowspan="2">C/D</th>
|
||||
<th>交涉</th>
|
||||
<td :rowspan="dszList[0].budget ==dszList[1].budget?'2':''">{{dszList[0].budget}}%</td>
|
||||
<td :rowspan="dszList[0].monthOne ==dszList[1].monthOne?'2':''">{{dszList[0].monthOne}}%</td>
|
||||
<td :rowspan="dszList[0].monthTwo ==dszList[1].monthTwo?'2':''">{{dszList[0].monthTwo}}%</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>THEME</th>
|
||||
<td v-if="dszList[1].budget !=dszList[0].budget">{{dszList[1].budget}}%</td>
|
||||
<td v-if="dszList[1].monthOne !=dszList[0].monthOne">{{dszList[1].monthOne}}%</td>
|
||||
<td v-if="dszList[1].monthTwo !=dszList[0].monthTwo">{{dszList[1].monthTwo}}%</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th colspan="2">市况</th>
|
||||
<td>{{dszList[2].budget}}%</td>
|
||||
<td>{{dszList[2].monthOne}}%</td>
|
||||
<td>{{dszList[2].monthTwo}}%</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th colspan="2">為替レート</th>
|
||||
<td>{{dszList[3].budget}}%</td>
|
||||
<td>{{dszList[3].monthOne}}%</td>
|
||||
<td>{{dszList[3].monthTwo}}%</td>
|
||||
</tr>
|
||||
</table>
|
||||
<table class="data-table" border v-if="activeCard5NavKey === 'DISH'">
|
||||
<colgroup>
|
||||
<col width="20%"/>
|
||||
<col width="20%"/>
|
||||
<col width="20%"/>
|
||||
<col width="20%"/>
|
||||
<col width="20%"/>
|
||||
</colgroup>
|
||||
<tr class="header">
|
||||
<th rowspan="2" colspan="2">抛点</th>
|
||||
<td colspan="3">
|
||||
<div class="tab-header">
|
||||
<div class="tb-title">DISH</div>
|
||||
<div class="tb-subtitle">发注金额:{{dataDISH}}百万元</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="header">
|
||||
<td>年初予算</td>
|
||||
<!-- <td>{{month_2}}月</td> -->
|
||||
<td>改订</td>
|
||||
<td>{{month_1}}月</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th colspan="2">合计</th>
|
||||
<td>{{addDISH1}}%</td>
|
||||
<td>{{addDISH2}}%</td>
|
||||
<td>{{addDISH3}}%</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th rowspan="2">C/D</th>
|
||||
<th>交涉</th>
|
||||
<td :rowspan="dishList[0].budget ==dishList[1].budget?'2':''">{{dishList[0].budget}}%</td>
|
||||
<td :rowspan="dishList[0].monthOne ==dishList[1].monthOne?'2':''">{{dishList[0].monthOne}}%</td>
|
||||
<td :rowspan="dishList[0].monthTwo ==dishList[1].monthTwo?'2':''">{{dishList[0].monthTwo}}%</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>THEME</th>
|
||||
<td v-if="dishList[1].budget !=dishList[0].budget">{{dishList[1].budget}}%</td>
|
||||
<td v-if="dishList[1].monthOne !=dishList[0].monthOne">{{dishList[1].monthOne}}%</td>
|
||||
<td v-if="dishList[1].monthTwo !=dishList[0].monthTwo">{{dishList[1].monthTwo}}%</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th colspan="2">市况</th>
|
||||
<td>{{dishList[2].budget}}%</td>
|
||||
<td>{{dishList[2].monthOne}}%</td>
|
||||
<td>{{dishList[2].monthTwo}}%</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th colspan="2">為替レート</th>
|
||||
<td>{{dishList[3].budget}}%</td>
|
||||
<td>{{dishList[3].monthOne}}%</td>
|
||||
<td>{{dishList[3].monthTwo}}%</td>
|
||||
</tr>
|
||||
</table>
|
||||
<!-- <img src="@/assets/images/xiaogouzi1.jpg" class="w-full h-full cover" v-if="activeCard5NavKey === 'DSZ'"/>
|
||||
<img src="@/assets/images/xiaogouzi2.jpg" class="w-full h-full cover" v-if="activeCard5NavKey === 'DISH'"/> -->
|
||||
<!-- <img src="@/assets/images/xiaogouzi3.jpg" class="w-full h-full cover" v-if="activeCard5NavKey === 'DIS'"/> -->
|
||||
</div>
|
||||
<!-- <div class="card_content">
|
||||
<VChart ref="chartRef3" :option="chartOption3" autoresize />
|
||||
</div> -->
|
||||
</div>
|
||||
<div class="card cursor-pointer" @click="setModule('App_BCP', 'BCP')">
|
||||
<div class="card_title">调达BCP管理</div>
|
||||
<div class="card_sub-title">责任者:调达中心 加工品变革T</div>
|
||||
<div class="card_content">
|
||||
<img src="@/assets/images/img-11.png" class="w-full h-full object-cover" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="card cursor-pointer relative">
|
||||
<!-- <img src="@/assets/images/img-42.png" class="absolute top-10px right-0" /> -->
|
||||
<div class="card_title" @click="setModule('App_CSR', 'CSR')">SCM碳中和活动</div>
|
||||
<div class="card_sub-title" @click="setModule('App_CSR', 'CSR')">责任者:调达研究院 调达机能研究T</div>
|
||||
<div class="card_content px20px" @click="setModule('App_CSR', 'CSR')">
|
||||
<img src="../../assets/images/scmtzh@2x.png" class="w-full h-96% cover"/>
|
||||
<!-- <div class="flex text-center">
|
||||
<div class="bg-#F4F8FF text-#000 h30px w-full pt5px font-bold">F25碳减排目标 <el-icon class="!text-#004DE1">
|
||||
<CaretTop />
|
||||
</el-icon>30%</div>
|
||||
<div class="bg-#F4F8FF text-#000 h30px w-full pt5px font-bold">F23碳减排目标 <el-icon class="!text-#004DE1">
|
||||
<CaretTop />
|
||||
</el-icon>15%</div>
|
||||
</div>
|
||||
<div class="flex text-center">
|
||||
<div class=" text-#677BB2 h30px w-full pt5px font-500">供方碳排放推移表</div>
|
||||
<div class=" text-#677BB2 h30px w-full pt5px font-500 flex"><span>重点供方碳排放情况</span>
|
||||
<n-select v-model:value="selectData" :options="option" class="w80px !text-12px h20px mt--4px" :show-checkmark="false" size="tiny"
|
||||
@update:value="thisSelect" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex w-full h-full">
|
||||
<div class="w150px h-full">
|
||||
<VChart :option="chartOption1" />
|
||||
</div>
|
||||
<div class="w280px h275px overflow-y-auto">
|
||||
<VChart :option="chartOption2" />
|
||||
|
||||
</div>
|
||||
</div> -->
|
||||
|
||||
<!-- <div class="mt25px text-#142142"> -->
|
||||
<!-- <img src="@/assets/images/tiad@2x.png" class="w100% h96%" /> -->
|
||||
<!-- <div class="text-#002fa7 text-18px">大金中国调达本部紧扣大金集团2050愿景中CO2“零”排放目标展开调达碳中和活动</div>
|
||||
<AppNewsBox class="mt10px" text="脱碳素供应链管理(原材料排放,部品加工·部品运输过程中的排放)
|
||||
空调解决方案(部品碳足迹管理,贩促活动,案例情报共享)" date="2023-05-22" /> -->
|
||||
<!-- </div> -->
|
||||
<!-- <div class="mt25px text-#142142">
|
||||
<div class="text-#002fa7 text-18px">人材育成</div>
|
||||
<AppNewsBox class="mt10px" text="FY22年度集团新年方针:领先时代的变化开创崭新的未来变化开 创崭新的未来" date="2023-05-22" />
|
||||
</div>
|
||||
<div class="mt25px text-#142142">
|
||||
<div class="text-#002fa7 text-18px">工作模式变革</div>
|
||||
<AppNewsBox class="mt10px" text="FY22年度集团新年方针:领先时代的变化开创崭新的未来变化开 创崭新的未来" date="2023-05-22" />
|
||||
</div> -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="card topics">
|
||||
<div class="card_title">重点Theme取组</div>
|
||||
<div class="card_content p20px pt10px">
|
||||
<div class="w-full h-full flex flex-wrap content-between justify-between text-18px font-bold">
|
||||
<div class="item !h-188px cursor-pointer" @click="setModule('App_Quality', 'Quality')">
|
||||
<div class="item_title">品质</div>
|
||||
<div class="item_sub-title">责任者:调达中心 加工品变革T</div>
|
||||
<!-- <img src="@/assets/images/img-45.svg" class="item_img pb13px pr20px" /> -->
|
||||
<img src="@/assets/images/img-41.png" class="item_img b !bottom--20px" />
|
||||
</div>
|
||||
<div class="item !h-188px cursor-pointer" @click="setModule('App_Lab', 'Diffspace')">
|
||||
<div class="item_title">AI差别化LAB</div>
|
||||
<div class="item_sub-title">责任者:调达研究院</div>
|
||||
<div class="item_sub-title">差别化研究T</div>
|
||||
<img src="@/assets/images/img-43.png" class="item_img" />
|
||||
</div>
|
||||
<div class="item !w-full flex flex-col cursor-pointer" @click="push({ name: 'StrategicPlanning' })">
|
||||
<div class="item_title">战略企划</div>
|
||||
<div class="item_sub-title">责任者:调达本部 管理G</div>
|
||||
<!-- <img src="./images/home-1.svg" /> -->
|
||||
<div class="flex mt20px items-center justify-center">
|
||||
<div class="bg-#0038BE w210px px15px py7px rounded-30px">
|
||||
<img src="@/assets/images/biaoq2@2x.png" class="w25px h21px">
|
||||
重点Theme管理
|
||||
</div>
|
||||
<span class="text-#000 font-thin underline-text mx23px">调达研究院</span>
|
||||
<span class="text-#000 font-thin underline-text">调达中心</span>
|
||||
<!-- <VChart :option="chartOption2" autoresize /> -->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped lang="less">
|
||||
.tab-header {
|
||||
display: flex;
|
||||
.tb-title {
|
||||
margin: 0 auto;
|
||||
}
|
||||
.tb-subtitle {
|
||||
margin-right: 8px;
|
||||
font-size: 0.75em;
|
||||
}
|
||||
}
|
||||
.table-container {
|
||||
padding: 0 36px;
|
||||
padding-top: 40px;
|
||||
position: relative;
|
||||
}
|
||||
.data-table {
|
||||
width: 100%;
|
||||
color: #808696;
|
||||
border-collapse: collapse;
|
||||
line-height: 2.3rem;
|
||||
text-align: center;
|
||||
border-color: #e0e0e0;
|
||||
background: white;
|
||||
}
|
||||
.table-container .abs-top {
|
||||
position: absolute;
|
||||
left: 36px;
|
||||
top: 4px;
|
||||
}
|
||||
.data-table tr:nth-child(2n + 1) {
|
||||
background: #f9f9f9;
|
||||
}
|
||||
.data-table th {
|
||||
background: #f4f5ff;
|
||||
color: #142142;
|
||||
}
|
||||
.data-table tr.header, .data-table tr.header th{
|
||||
background: #417BEF;
|
||||
color: white;
|
||||
}
|
||||
::-webkit-scrollbar {
|
||||
width: 1px;
|
||||
}
|
||||
::v-deep .n-base-select .n-base-select-option {
|
||||
font-size: 12px; /* 设置字体大小 */
|
||||
}
|
||||
.naive-select .n-select-dropdown {
|
||||
font-size: 12px; /* 设置字体大小 */
|
||||
}
|
||||
.underline-text {
|
||||
border-bottom: 1px solid black;
|
||||
padding-bottom: 2px;
|
||||
}
|
||||
|
||||
.icoT {
|
||||
padding: 5px;
|
||||
color: #fff;
|
||||
background-color: #002AAE;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
.top {
|
||||
position: absolute;
|
||||
right: 30px;
|
||||
top: -70px;
|
||||
}
|
||||
|
||||
.page-wrapper {
|
||||
.card {
|
||||
// width: 480px;
|
||||
// height: 428px;
|
||||
width: 480px;
|
||||
height: 395px;
|
||||
border-radius: 18px;
|
||||
overflow: hidden;
|
||||
|
||||
background-color: #fff;
|
||||
// border: 1px solid #e7ebf5;
|
||||
box-shadow: 1px 2px 12px rgba(14, 86, 221, 0.32);
|
||||
position: relative;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
position: relative;
|
||||
|
||||
&::after {
|
||||
content: ' ';
|
||||
background-image: url('@/assets/images/bg-card.svg');
|
||||
pointer-events: none;
|
||||
display: block;
|
||||
width: 100%;
|
||||
height: 127px;
|
||||
background-size: cover;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: -1px;
|
||||
}
|
||||
|
||||
.card_title {
|
||||
flex-shrink: 0;
|
||||
font-size: 28px;
|
||||
color: #142142;
|
||||
padding: 20px;
|
||||
padding-bottom: 0;
|
||||
}
|
||||
|
||||
.card_sub-title {
|
||||
color: rgba(128, 134, 150, 0.8);
|
||||
font-size: 16px;
|
||||
padding: 0 20px;
|
||||
padding-bottom: 0;
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
.card_nav1 {
|
||||
background-image: url('@/assets/images/bg-card-nav.svg');
|
||||
}
|
||||
|
||||
.card_nav2 {
|
||||
background-image: url('@/assets/images/youj@2x.png');
|
||||
}
|
||||
|
||||
.card_nav {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
width: 276px;
|
||||
height: 66px;
|
||||
|
||||
background-position: top right;
|
||||
background-repeat: no-repeat;
|
||||
background-size: contain;
|
||||
|
||||
font-size: 20px;
|
||||
color: #fff;
|
||||
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: flex-end;
|
||||
padding-left: 38px;
|
||||
padding-right: 22px;
|
||||
padding-bottom: 20px;
|
||||
|
||||
.card_nav_item {
|
||||
width: 80px;
|
||||
height: 36px;
|
||||
text-align: center;
|
||||
padding-top: 8px;
|
||||
cursor: pointer;
|
||||
|
||||
&.active {
|
||||
color: #032fa0;
|
||||
background-image: url('@/assets/images/bg-card-nav-item.svg');
|
||||
background-position: bottom;
|
||||
background-repeat: no-repeat;
|
||||
background-size: contain;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.card_content {
|
||||
flex: 1;
|
||||
margin-top: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
.topics {
|
||||
.item {
|
||||
border-radius: 8px;
|
||||
width: 210px;
|
||||
height: 155px;
|
||||
box-shadow: inset 1.4px 1.4px 0px 0px rgba(255, 255, 255, 0.004);
|
||||
overflow: hidden;
|
||||
|
||||
background-image: url('@/assets/images/bg-card4.svg');
|
||||
background-position: -2px -2px;
|
||||
background-repeat: no-repeat;
|
||||
background-size: 215px 165px;
|
||||
position: relative;
|
||||
|
||||
.item_title {
|
||||
padding-left: 16px;
|
||||
padding-top: 22px;
|
||||
color: #002fa7;
|
||||
position: relative;
|
||||
// z-index: 9;
|
||||
}
|
||||
|
||||
.item_sub-title {
|
||||
color: rgba(128, 134, 150, 0.8);
|
||||
font-size: 12px;
|
||||
font-weight: normal;
|
||||
padding: 0 16px;
|
||||
padding-bottom: 0;
|
||||
margin-top: 10px;
|
||||
z-index: 9;
|
||||
}
|
||||
|
||||
.item_img {
|
||||
position: absolute;
|
||||
bottom: -10px;
|
||||
right: 0;
|
||||
// z-index: 5;
|
||||
transition: transform 0.3s;
|
||||
|
||||
&:hover {
|
||||
transform: scale(1.2);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.news {
|
||||
.card_content {
|
||||
padding: 20px;
|
||||
padding-top: 0;
|
||||
}
|
||||
|
||||
.news_card {
|
||||
// width: 442px;
|
||||
height: 180px;
|
||||
padding: 16px;
|
||||
font-size: 14px;
|
||||
|
||||
|
||||
background-repeat: no-repeat;
|
||||
|
||||
background-size: 100% 100%;
|
||||
|
||||
|
||||
|
||||
position: relative;
|
||||
}
|
||||
}
|
||||
}</style>
|
||||
|
After Width: | Height: | Size: 7.1 KiB |
|
|
@ -0,0 +1,279 @@
|
|||
import type { EChartsOption } from 'echarts'
|
||||
import * as echarts from 'echarts'
|
||||
import { toYearDataList, hisYearDataStat, curYearDataStat, hisDataList, treeList } from '@/api/daikin/base'
|
||||
|
||||
|
||||
export function defineCompont() {
|
||||
const clickData = reactive<any>({
|
||||
id: 3
|
||||
})
|
||||
|
||||
const toYearData = ref<any>()
|
||||
const hisData = ref<any>()
|
||||
const treeData = ref<any>()
|
||||
|
||||
async function getData() {
|
||||
const { id: cateId } = clickData
|
||||
|
||||
const { data } = await toYearDataList({ cateId })
|
||||
toYearData.value = data
|
||||
const {data:da2} =await hisDataList({cateId})
|
||||
hisData.value = da2
|
||||
|
||||
}
|
||||
|
||||
const ss = computed(() => [clickData.id])
|
||||
watch(() => unref(ss),
|
||||
async (v) => {
|
||||
getData()
|
||||
},
|
||||
{ immediate: true, deep: true },
|
||||
)
|
||||
return { clickData, toYearData,hisData, getData }
|
||||
}
|
||||
|
||||
|
||||
export function curYearData() {
|
||||
const chartRef = ref();
|
||||
let allData = ref<any[]>([]);
|
||||
let seriesList = ref<any[]>([]);
|
||||
const optionRef = ref<any>({});
|
||||
|
||||
async function getDataList() {
|
||||
const { data } = await curYearDataStat({ cateId: 1 })
|
||||
// 提取所有不重复的name
|
||||
const uniqueNames = [...new Set(data.flatMap(item => item.data.map(dataItem => dataItem.name)))];
|
||||
// 运算得到结果
|
||||
allData = uniqueNames.map(name => {
|
||||
const values = data.map(item => {
|
||||
const foundData = item.data.find(dataItem => dataItem.name === name);
|
||||
return foundData ? parseFloat(foundData.value) : 0;
|
||||
});
|
||||
return [name, ...values];
|
||||
});
|
||||
|
||||
seriesList = data.map((item: { name: string }) => {
|
||||
if (item.name === "柱状图") {
|
||||
return { type: 'bar' , barWidth: 30,};
|
||||
} else if (item.name === "折线图") {
|
||||
return { type: 'line' };
|
||||
}
|
||||
});
|
||||
// console.log(seriesList,allData)
|
||||
|
||||
const option = {
|
||||
width: '528px', // 设置图表宽度为 800 像素
|
||||
height: '160px', // 设置图表高度为 400 像素
|
||||
legend: { right: 30 },
|
||||
title: [
|
||||
{ text: '数据', left: 12, top: 0, textAlign: 'left', textStyle: { color: '#142142', fontSize: 16, fontWeight: 800 } },
|
||||
],
|
||||
tooltip: {},
|
||||
dataset: {
|
||||
source: allData
|
||||
},
|
||||
xAxis: { type: 'category' },
|
||||
yAxis: [
|
||||
{
|
||||
type: 'value',
|
||||
min: 0,
|
||||
max: 1000,
|
||||
},
|
||||
{
|
||||
type: 'value',
|
||||
min: 0,
|
||||
max: 100,
|
||||
axisLabel: {
|
||||
formatter: '{value} %'
|
||||
}
|
||||
}
|
||||
],
|
||||
series: seriesList
|
||||
};
|
||||
optionRef.value = option;
|
||||
}
|
||||
getDataList();
|
||||
watchEffect(() => {
|
||||
// 在回调函数中使用 optionRef
|
||||
const option = optionRef.value;
|
||||
|
||||
// 更新图表选项
|
||||
optionRef.value = option;
|
||||
});
|
||||
|
||||
return { chartRef, option: optionRef };
|
||||
}
|
||||
|
||||
|
||||
export function hisYearData() {
|
||||
|
||||
const chartRef = ref();
|
||||
let allData = ref<any[]>([]);
|
||||
let seriesList = ref<any[]>([]);
|
||||
const optionRef = ref<any>({});
|
||||
const state = reactive<any>({
|
||||
cateId: 1,
|
||||
yearTime:'2020'
|
||||
})
|
||||
async function getDataList() {
|
||||
const {cateId,yearTime} = state
|
||||
const { data } = await hisYearDataStat({ cateId,yearTime})
|
||||
// 提取所有不重复的name
|
||||
const uniqueNames = [...new Set(data.flatMap(item => item.data.map(dataItem => dataItem.name)))];
|
||||
// 运算得到结果
|
||||
allData = uniqueNames.map(name => {
|
||||
const values = data.map(item => {
|
||||
const foundData = item.data.find(dataItem => dataItem.name === name);
|
||||
return foundData ? parseFloat(foundData.value) : 0;
|
||||
});
|
||||
return [name, ...values];
|
||||
});
|
||||
|
||||
seriesList = data.map((item: { name: string }) => {
|
||||
if (item.name === "柱状图") {
|
||||
return { type: 'bar' , barWidth: 30,};
|
||||
} else if (item.name === "折线图") {
|
||||
return { type: 'line' };
|
||||
}
|
||||
});
|
||||
// console.log(seriesList,allData)
|
||||
|
||||
const option = {
|
||||
width: '528px', // 设置图表宽度为 800 像素
|
||||
height: '150px', // 设置图表高度为 400 像素
|
||||
legend: { right: 30, data: ['交涉', 'Theme'],},
|
||||
title: [
|
||||
{ text: '数据', left: 12, top: 0, textAlign: 'left', textStyle: { color: '#142142', fontSize: 16, fontWeight: 800 } },
|
||||
],
|
||||
tooltip: {},
|
||||
dataset: {
|
||||
source: allData
|
||||
},
|
||||
xAxis: { type: 'category' },
|
||||
yAxis: [
|
||||
{
|
||||
type: 'value',
|
||||
min: 0,
|
||||
max: 1000,
|
||||
},
|
||||
{
|
||||
type: 'value',
|
||||
min: 0,
|
||||
max: 100,
|
||||
axisLabel: {
|
||||
formatter: '{value} %'
|
||||
}
|
||||
}
|
||||
],
|
||||
series: seriesList
|
||||
};
|
||||
optionRef.value = option;
|
||||
}
|
||||
/**
|
||||
* cateId: 1,
|
||||
yearTime:'2020'
|
||||
*/
|
||||
const ss = computed(() => [state.cateId, state.yearTime])
|
||||
watch(() => unref(ss),
|
||||
async (v) => {
|
||||
getDataList()
|
||||
},
|
||||
{ immediate: true, deep: true },
|
||||
)
|
||||
watchEffect(() => {
|
||||
const option = optionRef.value;
|
||||
optionRef.value = option;
|
||||
});
|
||||
|
||||
return {state, chartRef, option: optionRef,getDataList };
|
||||
}
|
||||
|
||||
|
||||
const axisLine = { show: true, lineStyle: { color: '#e4e6eb' } }
|
||||
const hidden = { show: false }
|
||||
|
||||
export function useChart3() {
|
||||
const chartRef = ref()
|
||||
const option = ref<EChartsOption>({
|
||||
tooltip: { trigger: 'axis', axisPointer: { type: 'shadow' } },
|
||||
grid: [
|
||||
{ top: '35', width: '300px', bottom: 14, left: 14, containLabel: true },
|
||||
{ top: '35', width: '300px', bottom: 14, right: 14, containLabel: true },
|
||||
],
|
||||
xAxis: [
|
||||
{
|
||||
gridIndex: 1,
|
||||
type: 'category',
|
||||
splitLine: hidden,
|
||||
axisTick: hidden,
|
||||
axisLabel: { show: true, color: '#808696', fontSize: 12 },
|
||||
axisLine,
|
||||
data: ['0313', '0314', '0315', '0316'],
|
||||
boundaryGap: false,
|
||||
},
|
||||
{
|
||||
gridIndex: 0,
|
||||
type: 'category',
|
||||
splitLine: hidden,
|
||||
axisTick: hidden,
|
||||
axisLabel: { show: true, color: '#808696', fontSize: 12 },
|
||||
axisLine,
|
||||
data: ['0313', '0314', '0315', '0316'],
|
||||
},
|
||||
],
|
||||
yAxis: [
|
||||
{
|
||||
gridIndex: 1,
|
||||
type: 'value',
|
||||
max: 100,
|
||||
axisLine,
|
||||
axisTick: hidden,
|
||||
axisLabel: { show: true, color: '#808696', fontSize: 12 },
|
||||
splitLine: hidden,
|
||||
},
|
||||
{
|
||||
gridIndex: 0,
|
||||
type: 'value',
|
||||
max: 100,
|
||||
axisLine,
|
||||
axisTick: hidden,
|
||||
axisLabel: { show: true, color: '#808696', fontSize: 12 },
|
||||
splitLine: hidden,
|
||||
},
|
||||
],
|
||||
// title: [
|
||||
// { text: 'CD堆积', left: 8, top: '', textAlign: 'left', textStyle: { color: '#142142', fontSize: 16, fontWeight: 500 } },
|
||||
// { text: '发注金额推移', left: '50%', top: '', textAlign: 'left', textStyle: { color: '#142142', fontSize: 16, fontWeight: 500 } },
|
||||
// ],
|
||||
// graphic: {
|
||||
// elements: [
|
||||
// { type: 'image', left: 25, top: -5, style: pieBg },
|
||||
// { type: 'image', right: 26, top: -5, style: pieBg },
|
||||
// ],
|
||||
// },
|
||||
series: [
|
||||
|
||||
{
|
||||
xAxisIndex: 1,
|
||||
yAxisIndex: 1,
|
||||
type: 'bar',
|
||||
data: [12, 31, 35, 47],
|
||||
showBackground: true,
|
||||
backgroundStyle: { color: '#f4f6fa' },
|
||||
itemStyle: {
|
||||
borderRadius: 2,
|
||||
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
||||
{ offset: 0, color: '#70b8f0' },
|
||||
{ offset: 1, color: '#2b7ff9' },
|
||||
]),
|
||||
},
|
||||
},
|
||||
{ type: 'line', smooth: true, data: [32, 21, 75, 57] },
|
||||
{ type: 'line', smooth: true, data: [12, 31, 35, 47] },
|
||||
|
||||
],
|
||||
})
|
||||
|
||||
return { chartRef, option }
|
||||
}
|
||||
|
||||
|
After Width: | Height: | Size: 523 B |
|
After Width: | Height: | Size: 864 B |
|
|
@ -0,0 +1,10 @@
|
|||
<script setup lang="ts"></script>
|
||||
|
||||
<template>
|
||||
<div class="b-1px b-solid b-#fff rd-12px inline-flex items-center w-269px h-52px px12px cursor-pointer overflow-hidden relative">
|
||||
<img src="@/assets/images/icon-search.svg" class="w22px h22px absolute left-10px top-50% -translate-y-50%" />
|
||||
<input type="text" placeholder="检索..." class="h-full w-full text-#fff text-18px pl30px pr54px placeholder-#fff" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped lang="less"></style>
|
||||
|
After Width: | Height: | Size: 554 B |
|
After Width: | Height: | Size: 3.6 KiB |
|
|
@ -0,0 +1,12 @@
|
|||
{
|
||||
"files": [],
|
||||
"references": [
|
||||
{
|
||||
"path": "./tsconfig.node.json"
|
||||
},
|
||||
{
|
||||
"path": "./tsconfig.app.json"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,155 @@
|
|||
<!-- 情报列表 -->
|
||||
<script setup lang="ts">
|
||||
import AppBlock from '@/components/AppBlock.vue'
|
||||
import Layout from './components/Layout.vue'
|
||||
import { getImg } from './images'
|
||||
import AppAlert from '@/components/AppAlert.vue'
|
||||
import AppNewsBox from '@/components/AppNewsBox.vue'
|
||||
import AppPagination from '@/components/AppPagination.vue'
|
||||
import { Navs, useData } from './ListPageData'
|
||||
import { NEmpty } from 'naive-ui'
|
||||
import { message } from '@/utils/message'
|
||||
|
||||
const { push } = useRouter()
|
||||
const route = useRoute()
|
||||
const { state, list } = useData()
|
||||
|
||||
// cate 分类 1-外部环境 2-竞争对手 3-供方动向 4-大金集团 5-中国据点 6-调达本部
|
||||
const Type1 = [
|
||||
{ key: '1', name: '外部环境', route: 'IntelligenceOutside', icon: getImg('icon-1.svg') },
|
||||
{ key: '2', name: '竞争对手', route: 'IntelligenceOutside', icon: getImg('icon-2.svg') },
|
||||
{ key: '3', name: '供方动向', route: 'IntelligenceOutside', icon: getImg('icon-3.svg') },
|
||||
]
|
||||
const Type2 = [
|
||||
{ key: '4', name: '大金集团', route: 'IntelligenceWithin', icon: getImg('icon-4.svg') },
|
||||
{ key: '5', name: '中国据点', route: 'IntelligenceWithin', icon: getImg('icon-5.svg') },
|
||||
{ key: '6', name: '调达本部', route: 'IntelligenceWithin', icon: getImg('icon-6.svg') },
|
||||
]
|
||||
|
||||
const firstNew = ref<any>({})
|
||||
const restNews = ref<any[]>([])
|
||||
|
||||
watchEffect(() => {
|
||||
// const [first, ...rest] = unref(list)
|
||||
// firstNew.value = first
|
||||
restNews.value = unref(list)
|
||||
})
|
||||
// const toDetail =()=>{
|
||||
// console.log(route.name,firstNew.id)
|
||||
// push(`${route.path.replace('/Home','')}/${firstNew.id}`)
|
||||
// // push({name:route.name,params:{id:firstNew.id}})
|
||||
// }
|
||||
const toDetail2 =(item: { id: any })=>{
|
||||
console.log(route,route.path,item.id)
|
||||
// push(`${route.path}/${item.id}`)
|
||||
if(item.isSelect===1){
|
||||
push(`${route.path.replace('/Home','')}/${item.id}`)
|
||||
}
|
||||
else{
|
||||
message.error("没有访问权限")
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<Layout>
|
||||
<AppBlock class="flex w-full h-full">
|
||||
<section class="px44px flex navs">
|
||||
<div class="flex-1" v-for="item in Navs" :key="item.key">
|
||||
<div :class="`navs-item max-w-4em active`">
|
||||
{{ item.name }}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<section class="px44px flex mt24px">
|
||||
<div class="flex-1 flex">
|
||||
<div
|
||||
class="cursor-pointer mr36px w100px h100px rd-20px flex-shrink flex flex-col justify-center items-center text-#fff"
|
||||
v-for="item in Type1"
|
||||
:key="item.name"
|
||||
:style="{ backgroundColor: item.key == state.cate ? '#63bfb2' : '#c2c2c2' }"
|
||||
@click="state.cate = item.key"
|
||||
>
|
||||
<img :src="item.icon" />
|
||||
<span class="mt14px">{{ item.name }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex-1 flex">
|
||||
<div
|
||||
class="cursor-pointer mr36px w100px h100px rd-20px flex-shrink flex flex-col justify-center items-center text-#fff"
|
||||
v-for="item in Type2"
|
||||
:key="item.name"
|
||||
:style="{ backgroundColor: item.key == state.cate ? '#63bfb2' : '#c2c2c2' }"
|
||||
@click="state.cate = item.key"
|
||||
>
|
||||
<img :src="item.icon" />
|
||||
<span class="mt14px">{{ item.name }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<section class="px44px mt44px">
|
||||
<!-- <AppAlert v-if="firstNew?.title" @click="push(`${route.path.replace('/Home','')}/${firstNew.id}`)">{{ firstNew.title }}</AppAlert> -->
|
||||
<div class="mt12px news-wrap max-h-467px mb32px overflow-y-auto">
|
||||
<div class="news-item" v-for="item in restNews" :key="item.id" @click="toDetail2(item)">
|
||||
<AppNewsBox class="!lh-2em" :isRead="item.isRead" :top="item.isTop" :labelText="item.tag" labelColor="#2cba06" :size="item.tag==='New'?'h20px':'h30px'" :text="item.title" :date="item.publishTime" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="text-center mt32px" v-if="state.total">
|
||||
<AppPagination v-model:current="state.pageNum" v-model:total="state.total" />
|
||||
</div>
|
||||
<NEmpty v-else description="暂无数据">
|
||||
<template #icon></template>
|
||||
</NEmpty>
|
||||
</section>
|
||||
</AppBlock>
|
||||
</Layout>
|
||||
</template>
|
||||
|
||||
<style scoped lang="less">
|
||||
.navs {
|
||||
font-size: 28px;
|
||||
color: #999;
|
||||
font-weight: 600;
|
||||
margin-top: 10px;
|
||||
border-bottom: 1px solid #eef3fb;
|
||||
.navs-item {
|
||||
cursor: pointer;
|
||||
padding: 14px 18px;
|
||||
margin-right: 22px;
|
||||
transition: all 0.1s;
|
||||
|
||||
border-bottom: 4px solid transparent;
|
||||
|
||||
&.active {
|
||||
color: #003ab5;
|
||||
border-color: #003ab5;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.items-content {
|
||||
margin-top: 12px;
|
||||
|
||||
display: -webkit-box;
|
||||
-webkit-box-orient: vertical;
|
||||
-webkit-line-clamp: 2;
|
||||
line-height: 1.7;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
.news-wrap {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
grid-column-gap: 68px;
|
||||
|
||||
.news-item {
|
||||
cursor: pointer;
|
||||
padding: 16px 0;
|
||||
border-bottom: 1px solid #eef3fb;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
@ -0,0 +1,198 @@
|
|||
<template>
|
||||
<!-- <div style="border: 1px solid #ccc">
|
||||
<Toolbar style="border-bottom: 1px solid #ccc" :editor="editorRef" :defaultConfig="toolbarConfig" mode="default"
|
||||
ref="toolbar" />
|
||||
<Editor style="height: 300px; overflow-y: hidden;" v-model="valueHtml" :defaultConfig="editorConfig" mode="default"
|
||||
@onCreated="handleCreated" @onChange="handleChange" />
|
||||
</div> -->
|
||||
<div style="border: 1px solid #ccc">
|
||||
<quill-editor
|
||||
ref="myQuillEditor"
|
||||
content-type='html'
|
||||
class="min-h180px"
|
||||
v-model:content='content'
|
||||
:options='editorOption'
|
||||
@update:content ="handleChange($event)"
|
||||
/>
|
||||
<input type="file" hidden accept=".gif,.jpg,.jpeg,.png" ref="fileBtn" @change="handleUpload" />
|
||||
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { upload } from '@/api/daikin/base';
|
||||
import{useMessage} from 'naive-ui'
|
||||
// import { onBeforeUnmount, shallowRef, onMounted, watch, defineProps, defineEmits } from 'vue';
|
||||
// import { Editor, Toolbar } from '@wangeditor/editor-for-vue';
|
||||
// import '@wangeditor/editor/dist/css/style.css';
|
||||
|
||||
|
||||
const message = useMessage()
|
||||
const props = defineProps(["content"]);
|
||||
const emit = defineEmits(['getChildData']);
|
||||
|
||||
// const editorRef = shallowRef();
|
||||
// const valueHtml = ref('');
|
||||
|
||||
onMounted(() => {
|
||||
content.value = props.content;
|
||||
});
|
||||
const HandleCustomMatcher = (node: any, Delta: { ops: any[]; })=>{
|
||||
let ops: any[] = []
|
||||
Delta.ops.forEach((op) => {
|
||||
// 如果粘贴了图片,这里会是一个对象,所以可以这样处理
|
||||
if (op.insert && typeof op.insert === "string") {
|
||||
ops.push({
|
||||
insert: op.insert, // 文字内容
|
||||
attributes: op.attributes, //文字样式(包括背景色和文字颜色等)
|
||||
});
|
||||
} else {
|
||||
//判断图片是否是base64
|
||||
if (op.insert && op.insert.image && op.insert.image.indexOf("base64") > -1) {
|
||||
message.error("图片格式不能为base64!");
|
||||
}
|
||||
else {
|
||||
// console.log(op)
|
||||
ops.push({
|
||||
insert:op.insert,
|
||||
attributes:op.attributes,
|
||||
})
|
||||
// handleUpload(File)
|
||||
}
|
||||
// message.error("禁止粘贴图片,请使用上传方式!");
|
||||
}
|
||||
});
|
||||
Delta.ops = ops;
|
||||
return Delta;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// const toolbarConfig = {};
|
||||
|
||||
// const editorConfig = {
|
||||
// placeholder: '请输入内容...',
|
||||
// MENU_CONF: {
|
||||
// uploadImage: {
|
||||
// server: 'http://admin.echo.mteam01.com/openApi/common/upload',
|
||||
// fieldName: 'file',
|
||||
// customInsert(res: { url: any; fileName: any; }, insertFn: (arg0: any, arg1: any) => void) {
|
||||
// let url = res.url;
|
||||
// insertFn(url,res.fileName);
|
||||
// },
|
||||
// accept: 'image/*',
|
||||
// },
|
||||
// }
|
||||
// };
|
||||
|
||||
// onBeforeUnmount(() => {
|
||||
// const editor = editorRef.value;
|
||||
// if (editor == null) return;
|
||||
// editor.destroy();
|
||||
// });
|
||||
|
||||
function unescapeHTML(html: string) {
|
||||
const doc = new DOMParser().parseFromString(html, 'text/html');
|
||||
return doc.documentElement.textContent;
|
||||
}
|
||||
watch(() => props.content, () => {
|
||||
const center =unescapeHTML(props.content)
|
||||
// console.log(center)
|
||||
myQuillEditor.value.setHTML(center)
|
||||
});
|
||||
|
||||
// const handleCreated = (editor: { setHtml: (arg0: any) => void; }) => {
|
||||
// editorRef.value = editor;
|
||||
// editor.setHtml(props.content);
|
||||
// };
|
||||
// // 给父组件传值
|
||||
const handleChange = (val: any) => {
|
||||
// console.log(val)
|
||||
emit('getChildData',val)
|
||||
}
|
||||
|
||||
/************************************************** */
|
||||
|
||||
const content = ref('')
|
||||
|
||||
const editorOption = {
|
||||
modules: {
|
||||
clipboard: {
|
||||
// 粘贴版,处理粘贴时候的自带样式
|
||||
matchers: [[Node.ELEMENT_NODE, HandleCustomMatcher]],
|
||||
},
|
||||
toolbar: [
|
||||
['bold', 'italic', 'underline', 'strike'], // 加粗 斜体 下划线 删除线
|
||||
[{ color: [] }, { background: [] }], // 字体颜色、字体背景颜色
|
||||
[{ align: [] }], // 对齐方式
|
||||
[{ size: ['small', false, 'large', 'huge'] }], // 字体大小
|
||||
[{ font: [] }], // 字体种类
|
||||
[{ header: [1, 2, 3, 4, 5, 6, false] }], // 标题
|
||||
[{ direction: 'ltl' }], // 文本方向
|
||||
[{ direction: 'rtl' }], // 文本方向
|
||||
[{ indent: '-1' }, { indent: '+1' }], // 缩进
|
||||
[{ list: 'ordered' }, { list: 'bullet' }], // 有序、无序列表
|
||||
[{ script: 'sub' }, { script: 'super' }], // 上标/下标
|
||||
['blockquote', 'code-block'], // 引用 代码块
|
||||
['clean'], // 清除文本格式
|
||||
['link', 'image', 'video'], // 链接、图片、视频
|
||||
],
|
||||
},
|
||||
ImageDrop: true,
|
||||
imageResize: {
|
||||
displayStyles: {
|
||||
backgroundColor: 'black',
|
||||
border: 'none',
|
||||
color: 'white',
|
||||
},
|
||||
modules: ['Resize', 'DisplaySize', 'Toolbar'],
|
||||
},
|
||||
placeholder: '请输入内容...',
|
||||
|
||||
|
||||
};
|
||||
const myQuillEditor = ref()
|
||||
const fileBtn = ref()
|
||||
onMounted(() => {
|
||||
let quill = toRaw(myQuillEditor.value).getQuill()
|
||||
if (myQuillEditor.value) {
|
||||
quill.getModule("toolbar").addHandler("image", imgHandler);
|
||||
}
|
||||
})
|
||||
|
||||
const imgHandler = (state: any) => {
|
||||
if (state) {
|
||||
fileBtn.value.click()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
const handleUpload = (e: { target: { files: any; }; }) => {
|
||||
const files = Array.prototype.slice.call(e.target.files);
|
||||
// console.log(files, "files")
|
||||
if (!files) {
|
||||
return
|
||||
}
|
||||
let formdata = new FormData();
|
||||
formdata.append("file", files[0]);
|
||||
|
||||
upload(formdata,{headers: { 'Content-Type': 'application/form-data' }})
|
||||
.then(res => {
|
||||
if (res.url) {
|
||||
let quill = toRaw(myQuillEditor.value).getQuill()
|
||||
let length = quill.getSelection().index;
|
||||
// 插入图片,res为服务器返回的图片链接地址
|
||||
quill.insertEmbed(length, "image", res.url);
|
||||
// 调整光标到最后
|
||||
quill.setSelection(length + 1);
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped></style>
|
||||
|
||||
|
After Width: | Height: | Size: 546 KiB |
|
|
@ -0,0 +1 @@
|
|||
.truncate[data-v-0ff58a60]{max-width:395px;min-width:100px;overflow:hidden;padding:10px 0 10px 10px;line-height:30px;text-overflow:ellipsis;white-space:nowrap}.back[data-v-0ff58a60]{position:absolute;top:25px;left:25px;color:#fff;font-size:25px;font-weight:700;text-align:center;justify-content:center}.top[data-v-0ff58a60]{right:30px;top:0}[data-v-0ff58a60]::-webkit-scrollbar{width:1px}.q-wrapper[data-v-0ff58a60]{border-radius:18px;border:1px solid #e7ebf5;box-shadow:inset 1px 2px 12px #0e56dd52;overflow:auto}.q-wrapper[data-v-0ff58a60]:after{content:" ";background-image:url(/assets/bg-card-cf2a9f09.svg);pointer-events:none;display:block;width:100%;height:127px;background-repeat:no-repeat;background-position:right top;position:absolute;left:0;top:0}
|
||||
|
After Width: | Height: | Size: 910 B |
|
After Width: | Height: | Size: 360 KiB |
|
|
@ -0,0 +1,135 @@
|
|||
// 格式化浮点数
|
||||
export function formatFloat(number: string | number, precision = 2) {
|
||||
number = parseFloat(number);
|
||||
if (isNaN(number) && !number) return number;
|
||||
return number.toFixed(precision);
|
||||
}
|
||||
export function fixFloat(number: number, digit = 2) {
|
||||
const m = 10 ** digit;
|
||||
return (Math.round(number * m, 10) / m).toFixed(digit);
|
||||
}
|
||||
export function toMoney(num: string | number) {
|
||||
num = fixFloat(num);
|
||||
if (isNaN(num)) return num;
|
||||
const [i, f] = String(num).split('.');
|
||||
return `${parseFloat(i).toLocaleString()}.${f}`;
|
||||
}
|
||||
|
||||
// 格式化日期
|
||||
export function formatDate(date: string | number | Date, fmt = 'yyyy-MM-dd hh:mm:ss') {
|
||||
const that = new Date(date);
|
||||
const o = {
|
||||
'M+': that.getMonth() + 1, // 月份
|
||||
'd+': that.getDate(), // 日
|
||||
'h+': that.getHours(), // 小时
|
||||
'm+': that.getMinutes(), // 分
|
||||
's+': that.getSeconds(), // 秒
|
||||
'q+': Math.floor((that.getMonth() + 3) / 3), // 季度
|
||||
S: that.getMilliseconds(), // 毫秒
|
||||
};
|
||||
if (/(y+)/.test(fmt)) {
|
||||
fmt = fmt.replace(RegExp.$1, (`${that.getFullYear()}`).substr(4 - RegExp.$1.length));
|
||||
}
|
||||
for (const k in o) {
|
||||
if (new RegExp(`(${k})`).test(fmt)) {
|
||||
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : ((`00${o[k]}`).substr((`${o[k]}`).length)));
|
||||
}
|
||||
}
|
||||
return fmt;
|
||||
}
|
||||
|
||||
|
||||
export function calculateDateIntervals(StartTime1: string | number | Date, EndTime2: string | number | Date) {
|
||||
const currentDate = new Date();
|
||||
let startDate, endDate;
|
||||
|
||||
const dateNow = currentDate.getDate();
|
||||
|
||||
if (!StartTime1 && !EndTime2) {
|
||||
startDate = new Date(currentDate.getFullYear(), currentDate.getMonth() - 11, dateNow);
|
||||
endDate = currentDate;
|
||||
|
||||
const monthList = [];
|
||||
const type = 2;
|
||||
|
||||
for (let month = 0; month <=11; month++) {
|
||||
const date = new Date(currentDate.getFullYear(), currentDate.getMonth() - month, dateNow);
|
||||
monthList.push(date.toISOString().slice(0, 7));
|
||||
}
|
||||
const reversedArray = [];
|
||||
|
||||
for (let i = monthList.length - 1; i >= 0; i--) {
|
||||
reversedArray.push(monthList[i]);
|
||||
}
|
||||
|
||||
// console.log(reversedArray)
|
||||
return { type, list: reversedArray };
|
||||
|
||||
} else {
|
||||
startDate = new Date(StartTime1);
|
||||
endDate = new Date(EndTime2);
|
||||
}
|
||||
|
||||
const timeDiff = endDate.getTime() - startDate.getTime();
|
||||
const oneDay = 24 * 60 * 60 * 1000; // 一天的毫秒数
|
||||
const daysDiff = Math.floor(timeDiff / oneDay);
|
||||
|
||||
if (daysDiff < 15) {
|
||||
const dateList = [];
|
||||
const type = 3;
|
||||
|
||||
for (let i = 0; i <= daysDiff; i++) {
|
||||
const day = new Date(startDate.getTime() + i * oneDay);
|
||||
dateList.push(day.toISOString().split('T')[0]);
|
||||
}
|
||||
|
||||
return { type, list: dateList };
|
||||
} else if (daysDiff <= 365) {
|
||||
const monthList = [];
|
||||
const type = 2;
|
||||
|
||||
const startYear = startDate.getFullYear();
|
||||
const endYear = endDate.getFullYear();
|
||||
const startMonth = startDate.getMonth();
|
||||
const endMonth = endDate.getMonth();
|
||||
|
||||
for (let year = startYear; year <= endYear; year++) {
|
||||
const monthStart = (year === startYear) ? startMonth : 0;
|
||||
const monthEnd = (year === endYear) ? endMonth : 11;
|
||||
|
||||
for (let month = monthStart; month <= monthEnd; month++) {
|
||||
monthList.push(`${year}-${String(month + 1).padStart(2, '0')}`);
|
||||
}
|
||||
}
|
||||
// const reversedArray = [];
|
||||
|
||||
// for (let i = monthList.length - 1; i >= 0; i--) {
|
||||
// reversedArray.push(monthList[i]);
|
||||
// }
|
||||
console.log(monthList)
|
||||
return { type, list: monthList };
|
||||
} else {
|
||||
const yearList = [];
|
||||
const type = 1;
|
||||
|
||||
for (let year = startDate.getFullYear(); year <= endDate.getFullYear(); year++) {
|
||||
yearList.push(year.toString());
|
||||
}
|
||||
|
||||
return { type, list: yearList };
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export function getPreviousMonths() {
|
||||
const currentDate = new Date();
|
||||
const previousMonths = [];
|
||||
for (let i = 0; i < 5; i++) {
|
||||
const previousMonth = new Date(currentDate.getFullYear(), currentDate.getMonth() - (i+2), 1);
|
||||
previousMonths.push(previousMonth.toLocaleString('default', { month: 'long', year: 'numeric' }));
|
||||
}
|
||||
|
||||
return previousMonths.reverse();
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,202 @@
|
|||
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
After Width: | Height: | Size: 108 KiB |
|
|
@ -0,0 +1 @@
|
|||
.text-ellipsis[data-v-d2131841]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.title[data-v-d2131841]{background:linear-gradient(0deg,#466CCD,#5C87F5);border-radius:10px;opacity:.52}.more[data-v-d2131841]{position:relative}.more[data-v-d2131841]:after{content:"";width:20px;height:20px;position:absolute;right:15px;top:10px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAehJREFUOE+VlT1IUGEUhp/XwSjCfuhvcZeMIGkyQiQSQg2L9oaksfAHCVsMQgu0WpzchCTFRSGkqAh1SCNQBxtEMHLRwSEqI6oTJ78b1+v9wbNc+L5znnM433vOFSlmZoeA68Bl4AxwEDBgDZgBRoERST+T4YofmFkJcBvoAsrSksXOPgG3JI3H/f4DzWwvMAw0FoC21QA8kNQZHf4Dmpl/x3YJi4O7JN3zgwjYCvSlVDYHtAPPgCM5lf8BaiVNKjzASkrPFoHzkjbM7DTwCjiaA/0g6awD/RGepDhuAk2SXoa2nAJeA8dyoNUO9ICLGU4OvSLpRYBWBujxDP9uB7q28rL+AK5KmgjQkwF6IgX63IG/Addfnjm0TtJUgFYA74H9iaAZB7rzngLgJFAv6WsA3gfupsRMOfAj4Bmz7C3QIOlbgPUAdzKcBx04ADRnOLxxsUv6HmAPgY6c5DcdWAt4YNLmgeoYrBdoy4G5IsqjSZkGziWcf/nGkTRkZo+AloI+P5bUGgFdX7PAvkSQK8B1eqkAtgxUSfoS3zZNYduUFgQnr9fDHPuobi2HyMzsAvAUyJqEJGwBuCZpKbrYBgwveTho7AZwIKPaVcD72p/c2juAsWp94daEX4BX7P38HHr9TpKvrB32F34jsBJrv6jPAAAAAElFTkSuQmCC);background-size:contain}.dots .dot[data-v-d2131841]{display:inline-block;width:13px;height:9px;background-color:#ffffff4d;border-radius:0;margin-left:8px}.dots .dot.active[data-v-d2131841]{background-color:#fff}.items .bg-red[data-v-d2131841]{background-color:#e60e0e}.items .bg-green[data-v-d2131841]{background-color:#2cba06}.items .items-content[data-v-d2131841]{margin-top:12px;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-height:1.7;overflow:hidden;text-overflow:ellipsis}.box[data-v-822baba1]{padding:23px 45px 0}.box .box-title[data-v-822baba1]{font-size:28px;font-weight:600;position:relative;padding-left:24px}.box .box-title[data-v-822baba1]:before{content:" ";display:block;width:8px;height:30px;background-color:#003ab5;position:absolute;left:0}
|
||||
|
|
@ -0,0 +1 @@
|
|||
const A="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAUCAYAAABiS3YzAAACLElEQVQ4jZ2UPWgUURSFvxsTf0AXFfzJQiCooCghmEZMBAsLrdRGtLHQxjRpHGyEdApBmAloZUQQtREsFBstFJQIMUhMVESICDaiIoIZlmjUORbz3ubt7mSJHhjmnTv3fdz73t21SqVCkbIsQxLANjMbAnYD74BB4JH7hpltjOP4U7i3pZA4r61m9hI4BKwHeoGHwH4HvAp8iKLoaFOomVWBwBjQ5vwt4Kdb3zezPpezFDhQA5Xk20SSb7sMjAOrXd4p4BiwJ9g7Cmxy65nCSj08y7J1WZaNASUzQ9JpSSMu7TlwMNjf7t5zzdovARNm1uH8oJkNm1kP8B4YAO6Rn3Go36GxNE39ug14AexwlZ9z0O3AJPNnexi4CxwHrrvYR0n7kiR5G1baKmncA4Fh8tHpdC17IMAddwQ3JJ10sbKZPYuiqDOsdBTocwmXgX6gDLwC1lKsvcATSQNmdtHFPgM9LZIeeKCka5L6HWiqCRDgMdCbJMkl4IyLbQCeWpqmcoHbwBFJy8xsGugoABWpK47j11EUnQXO+/Z3Ad3ACPkgvwE2LxKIpFkz647jeDqKohNAGt4+wASwc7HAQKmkLUmSfIHaOW3/TyDAKjPr8qY1+PAH+EXt+ACkwLfAl4A1BeBZv6j/RYlG3SSfV/9caFpzAbRIc3X+x79Al9DYOuQTEWr5AqzqUYbQCmCNuays8ysWgFY7Ci9qBrhC/r8Z6mud/05+eaEmJU158xcIHsDvmVLL5AAAAABJRU5ErkJggg==",e=Object.freeze(Object.defineProperty({__proto__:null,default:A},Symbol.toStringTag,{value:"Module"}));export{e as _,A as a};
|
||||