This commit is contained in:
2025-10-17 10:31:13 +08:00
commit e6e86f2ce0
1043 changed files with 1031839 additions and 0 deletions

View File

@@ -0,0 +1,274 @@
<template>
<div class="w-100%">
<div class="xc_box">
<FormView
:ref="(el) => (formViewRef[formTopData.refKey] = el)"
formType="add"
handleType="returnData"
showType="view"
:defaultData="formTopData.defaultData"
:showButton="false"
:enhanceData="{isShowFun}"
:formId="formTopData.formId"
></FormView>
<div class="Tips">
<div style="display: flex;align-items: center;" v-if="is_show">
<span class="span"></span>
<span>图片列表</span>
</div>
<div v-else>
<el-checkbox v-model="checked" label="全选" size="large" style="margin-right:10px;font-size: 16px;" @click="toggleAllSelection()"/>
<el-button @click="uploadFun(true)">移动图片</el-button>
<el-button @click="delFun()">删除图片</el-button>
<el-button @click="isShowFun()">退出操作</el-button>
</div>
<div>
<el-select v-model="value" placeholder="Select" style="width: 120px">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</div>
</div>
<LowTable :ref="(el)=>(ref1 = el)" :tableId="tableDate.tableId" :enhanceData="tableDate.enhanceData" > </LowTable>
</div>
<el-dialog v-model="upload" title="选择相册" width="728px" :close-on-click-modal="false">
<el-checkbox-group v-model="checkList">
<div class="checkbox-box">
<div class="list" v-for="(item,index) in listData" :key="index">
<img class="img" :src="item.url" alt=""/>
<div class="radio">
<el-checkbox label="" :value="index" />
<p>{{item.title}}</p>
</div>
</div>
</div>
</el-checkbox-group>
<div class="btn">
<el-button class="qx" @click="uploadFun(false)">取消</el-button>
<el-button class="bc" type="primary" @click="uploadFun(false)">保存</el-button>
</div>
</el-dialog>
</div>
</template>
<script setup lang="ts">
import { messageConfig ,ElMessage, ElMessageBox} from 'element-plus';
const ref1 = ref()
const formViewRef = ref({})
const value = ref('1')
const upload = ref(false)
const radio = ref('selected and disabled')
const formTopData = ref({
type:'table',
refKey: 'xcgl',
formId: '1852223511034294274',
defaultData: {},
enhanceData: { hideHeader: 'disabled'}
})
const tableDate = ref({
label:'图片列表',
name:'fourth',
defaultData:{},
tableId:'1852241979997646849',
type:'table',
enhanceData: { hideHeader: 'disabled',}
})
const options = [
{
value: '1',
label: '文件名称',
},
{
value: '2',
label: '文件大小',
},
{
value: '3',
label: '更新时间',
},
]
const checked = ref()
const is_show = ref(true)
const isShowFun = () =>{
ref1.value.crudRef.tableOption.selection=is_show.value
is_show.value = !is_show.value
checked.value = !is_show.value ? '' : true
ref1.value.crudRef.refreshTable()
}
//全选
const toggleAllSelection = ()=> {
ref1.value.crudRef.toggleAllSelection()
}
//删除图片
const delFun = () =>{
ElMessageBox.confirm(
'是否确定删除数据?',
'操作确认',
{
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
}
)
.then(() => {
ElMessage({
type: 'success',
message: '数据删除成功',
})
}).catch(() => {})
}
//上传图片
const checkList = ref([])
const listData = ref([
{title:'相册名称',url:'../../../../../public/img/xc.png'},
{title:'相册名称',url:'../../../../../public/img/xc.png'},
{title:'相册名称',url:'../../../../../public/img/xc.png'},
{title:'相册名称',url:'../../../../../public/img/xc.png'},
{title:'相册名称',url:'../../../../../public/img/xc.png'},
{title:'相册名称',url:'../../../../../public/img/xc.png'},
{title:'相册名称',url:'../../../../../public/img/xc.png'},
{title:'相册名称',url:'../../../../../public/img/xc.png'},
])
const uploadFun = (type) =>{
upload.value = type
}
const xzFun = ()=>{
}
</script>
<style lang="scss" scoped>
.xc_box{
padding-bottom: 20px;
.Tips{
display: flex;
height: 40px;
padding-right:18px;
margin-bottom: 15px;
font-family: '微软雅黑 Bold', '微软雅黑 Regular', '微软雅黑', sans-serif;
font-size: 14px;
font-style: normal;
font-weight: 700;
line-height: 28px;
color: #666;
text-align: left;
align-items: center;
justify-content: space-between;
.span{
display: inline-block;
width: 8.41px;
height: 19px;
margin-right:10px;
background: #409eff;
}
}
}
.checkbox-box{
display: flex;
padding: 0 0 30px 30px;
flex-wrap: wrap;
.list{
width: 150px;
height: 180px;
margin: 20px 20px 0 0;
border: 1px solid #e4e4e4;
.img{
width: 150px;
height: 150px;
}
.radio{
display: flex;
height: 30px;
padding-left: 10px;
// margin-left:5px;
line-height: 30px;
// .el-checkbox{
.el-checkbox__input{
top: -5px;
left: 6px;
height: 30px;
margin: 0;
}
// }
p{
padding: 0;
margin: 0;
margin-left: 5px;
font-family: '微软雅黑', sans-serif;
font-size: 12px;
font-style: normal;
font-weight: 400;
line-height: 30px;
color: #999;
text-align: left;
}
}
}
}
.btn{
display: flex;
justify-content: end;
padding: 20px 30px;
border-top:1px solid #e9e9e9;
.el-button{
width: 80px;
height: 30px;
font-family: '微软雅黑', sans-serif;
font-size: 12px;
font-style: normal;
font-weight: 400;
}
.qx{
color: #999;
background: #f9f9f9;
}
.qx:hover{
color: #409eff;
border-color: #409eff;
}
.qr{
color: #FFF;
}
}
::v-deep .el-select__placeholder{
font-family: '微软雅黑', sans-serif;
font-size: 14px;
font-style: normal;
font-weight: 400;
color: #666;
text-align: left;
}
</style>

View File

@@ -0,0 +1,274 @@
<template>
<div class="grzx_box w-95% bg-white flex">
<el-menu
:default-active="mentDefaultActive"
class="pt-25px el-menu-vertical-demo"
@select="handleSelect"
>
<template v-for="item in menuList" :key="item.id">
<el-menu-item class="flex justify-center" :index="item.index">
<span> {{ item.menuItemTitle }}</span>
</el-menu-item>
</template>
</el-menu>
<div class="use-lowdesign">
<template v-if="richFormView.defaultData.richText">
<FormView
formType="view"
handleType="returnData"
showType="view"
:defaultData="richFormView.defaultData"
:enhanceData="richFormView.enhanceData"
:formId="richFormView.formId"
></FormView>
</template>
<template v-else>
<template v-if="menuContent.type == 'exploit'">
<div class="content p-40px">
<div class="title text-18px pl-7px mb-20px fw600 c-#666666">
{{ menuContent.title }}
</div>
<FormView
formType="edit"
handleType="returnData"
showType="view"
:defaultData="menuContent.defaultData"
:formId="menuContent.formId"
></FormView>
</div>
</template>
<template v-if="menuContent.type == 'design'">
<div class="content p-40px">
<div>
<div class="title text-18px pl-7px mb-20px fw600 c-#666666">
{{ menuContent.title }}
</div>
<div class="xttz-util flex" v-if="menuContent.tableId == '1840642756645044226'">
<div v-for="item in xttzBtnList" :key="item.id">
<el-button
:class="xttzActiveClass == item.id ? 'is-active' : ''"
@click="xttzBtnClick(item.id)"
>{{ item.title }}</el-button
>
</div>
<div class="all-read">
<el-button>全部标记为已读</el-button>
</div>
</div>
</div>
<LowTable
ref="xttzTable"
:tableId="menuContent.tableId"
:enhanceData="menuContent.defaultData"
:fixed-search="xttzActiveClass != 1 ? { type: xttzActiveClass } : {}"
>
</LowTable>
</div>
</template>
</template>
</div>
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import { FormView, LowTable } from '@/components/LowDesign/index'
const menuList = ref([
{ id: 1, index: 'zlsz', menuItemTitle: '资料设置' },
{ id: 2, index: 'xgmm', menuItemTitle: '修改密码' },
{ id: 3, index: 'dljl', menuItemTitle: '登录记录' },
{ id: 4, index: 'xttz', menuItemTitle: '系统通知' },
{ id: 5, index: 'xxsz', menuItemTitle: '消息设置' }
])
const xttzBtnList = ref([
{ id: 1, title: '全部消息' },
{ id: 2, title: '服务消息' },
{ id: 3, title: '活动消息' },
{ id: 4, title: '产品消息' },
{ id: 5, title: '安全消息' },
{ id: 6, title: '故障消息' }
])
const xttzActiveClass = ref(1)
const mentDefaultActive = ref('zlsz')
const menuContentList = ref({
zlsz: {
title: '基本资料',
formId: '1840295435986018306',
type: 'exploit',
defaultData: {
dlzh: 'Windir',
updateImg: 'http://oss.yckxt.com/chatgpt/upload/1/2024-09-30/1/user.png',
updateBtn: 'http://oss.yckxt.com/chatgpt/upload/1/2024-09-30/1/user.png'
}
},
xgmm: {
title: '修改密码',
formId: '1840567733712330753',
type: 'exploit'
},
dljl: {
title: '登录记录',
tableId: '1840577516125323266',
type: 'design',
defaultData: {
type: 'view'
}
},
xttz: {
title: '系统通知',
tableId: '1840642756645044226',
type: 'design',
defaultData: {
type: 'view',
rowClick(row) {
if (row.rich_text) {
richFormView.value.defaultData = {
richText: row.rich_text,
type: row.$type,
title: row.title,
createTime: row.create_time
}
}
}
}
},
xxsz: {
title: '消息设置',
tableId: '1843476389638443010',
type: 'design',
defaultData: {
type: 'view'
}
}
})
const xttzTable = ref()
interface RichFormViewDefault {
createTime: string
title?: string
type?: string
richText?: String
}
const richFormView = ref({
formId: '1840671420115873794',
enhanceData: {
richDisplay: false
},
defaultData: {
type: '',
title: '',
createTime: '',
richText: ''
} as RichFormViewDefault
})
watch(
() => richFormView.value.enhanceData.richDisplay,
(val) => {
richFormView.value.defaultData.richText = ''
}
)
const menuContent = ref(menuContentList.value[mentDefaultActive.value])
const handleSelect = (key: string, keyPath: string[]) => {
if (menuContent.value !== menuContentList.value[key] && richFormView.value.defaultData.richText) {
richFormView.value.defaultData.richText = ''
}
menuContent.value = menuContentList.value[key]
}
const xttzBtnClick = (id: number) => {
xttzActiveClass.value = id
xttzTable.value.resetChange()
}
</script>
<style lang="scss" scoped>
.grzx_box {
min-height: 800px;
margin: 0 auto;
border-radius: 5px;
box-shadow: 0 0 5px rgb(0 0 0 / 4.71%);
.el-menu {
width: 180px;
min-height: 800px;
flex-shrink: 0;
background-color: #fcfcfc;
border-radius: 5px 0 0 5px;
.el-menu-item {
height: 45px;
span {
display: flex;
height: 100%;
align-items: center;
font-size: 14px;
}
&.is-active {
font-weight: bold;
background-color: rgb(64 158 255 / 9.8%);
border-right: 3px solid rgb(64 158 255 / 100%);
}
}
}
.use-lowdesign {
width: calc(100% - 180px);
.content {
width: calc(100% - 80px);
height: calc(100% - 80px);
.title {
font-family: '微软雅黑 Bold', '微软雅黑 Regular', '微软雅黑', sans-serif;
line-height: 16px;
border-left: 6px solid #409eff;
}
.xttz-util {
margin-bottom: 20px;
.el-button {
display: flex;
width: 80px;
height: 30px;
margin-right: 10px;
font-size: 12px;
color: #999;
&.is-active {
color: #409eff;
background-color: white;
border-color: #409eff;
}
}
.all-read {
margin-left: auto;
.el-button {
border: none;
&:hover {
background-color: rgb(255 255 255 / 0%);
}
}
}
}
}
}
}
</style>

View File

@@ -0,0 +1,292 @@
<template>
<!-- <div> 个人中心</div> -->
<div>
<div class="box">
<div class="box-left .dark:b-#2A2B2C b-solid .dark:bg-#1D1E1F! b-1px b-transparent ">
<div class="box-left-top">
<div class="head ">
<div style="margin: 20px 0;">
<el-avatar :size="60" :src="circleUrl" />
</div>
<p class="font color6 .dark:c-#fff!" style="margin-bottom:5px;font-size: 18px;">a123</p>
<p class="fontFamily color9 .dark:c-#ccc!" style="font-size: 14px;">专注交互原型设计</p>
</div>
<div class="title-box">
<el-row class="demo-avatar demo-basic">
<el-col :span="8">
<div class="content">
<p class="font color3 .dark:c-#fff!" style="font-size: 16px;">1000</p>
<p class="font-family color9 .dark:c-#ccc!" style="font-size: 12px;">文章</p>
</div>
</el-col>
<el-col :span="8">
<div class="content" style="border-right: 1px solid #f4f4f4;border-left: 1px solid #f4f4f4;">
<p class="font color3 .dark:c-#fff!" style="font-size: 16px;">1000</p>
<p class="font-family color9 .dark:c-#ccc!" style="font-size: 12px;">应用</p>
</div>
</el-col>
<el-col :span="8">
<div class="content">
<p class="font color3 .dark:c-#fff!" style="font-size: 16px;">1000</p>
<p class="font-family color9 .dark:c-#ccc!" style="font-size: 12px;">项目</p>
</div>
</el-col>
</el-row>
</div>
</div>
<div class="list">
<p class="font color6 .dark:c-#fff!" style="margin:20px 0 10px 20px;font-size: 14px;">个人名片</p>
<el-row>
<div class="list-box">
<el-col :span="2">
<Icon icon="fa6-solid:user" width="18" height="18" style="color: #999" />
</el-col>
<el-col :span="20">
<p class="fontFamily color6 .dark:c-#ccc!" style="font-size: 14px;">10</p>
</el-col>
</div>
</el-row>
<el-row>
<div class="list-box">
<el-col :span="2">
<Icon icon="fa6-brands:qq" width="18" height="18" style="color: #999" />
</el-col>
<el-col :span="20">
<p class="fontFamily color6 .dark:c-#ccc!" style="font-size: 14px;">20841030</p>
</el-col>
</div>
</el-row>
<el-row>
<div class="list-box">
<el-col :span="2">
<Icon icon="fa:weixin" width="18" height="18" style="color: #999" />
</el-col>
<el-col :span="20">
<p class="fontFamily color6 .dark:c-#ccc!" style="font-size: 14px;">a123</p>
</el-col>
</div>
</el-row>
<el-row>
<div class="list-box">
<el-col :span="2">
<Icon icon="fa-brands:weibo" width="18" height="18" style="color: #999" />
</el-col>
<el-col :span="20">
<p class="fontFamily color6 .dark:c-#ccc!" style="font-size: 14px;">淘宝创意部</p>
</el-col>
</div>
</el-row>
</div>
<div class="list" style="padding-bottom: 30px;">
<p class="font color6 .dark:c-#fff!" style="margin:20px 0 10px 20px;font-size: 14px;">所属团队</p>
<el-row v-for="(item,index) in sstdData" :key="index">
<div class="list-sstd">
<el-avatar :size="46" :src="item.src" />
<div class="list-sstd-text">
<p class="font color6 .dark:c-#fff!" style="font-size: 14px;">{{item.title}}</p>
<p class="fontFamily color9 .dark:c-#ccc!" style="font-size: 12px;">{{item.content}}</p>
</div>
</div>
</el-row>
</div>
<div class="list">
<p class="font color6 .dark:c-#fff!" style="margin:20px 0 10px 20px;font-size: 14px;">标签</p>
<div style="margin-left: 20px;">
<el-badge class="item" v-for="(item, index) in data" :key="index">
<el-button>{{ item.name }}</el-button>
</el-badge>
</div>
</div>
</div>
<div class="box-right .dark:b-#2A2B2C b-solid .dark:bg-#1D1E1F! b-1px b-transparent">
<el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
<template v-for="(item,index) in tableData" :key="index">
<el-tab-pane :label="item.label" :name="item.name">
<div class="tabs-box">
<!-- <FormView
formType="add"
handleType="returnData"
showType="view"
:defaultData="item.defaultData"
:showButton="true"
:formId="item.formId"
></FormView> -->
<upDate v-if="item.type == 'jurisdiction'"></upDate>
<template v-if="item.type == 'table'">
<LowTable :tableId="item.tableId" :enhanceData="item.enhanceData" > </LowTable>
</template>
</div>
</el-tab-pane>
</template>
</el-tabs>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { reactive, toRefs,ref } from 'vue'
import type { TabsPaneContext } from 'element-plus'
const state = reactive({
circleUrl:
'https://cube.elemecdn.com/3/7c/3ea6beec64369c2642b92c6726f1epng.png',
})
const data = ref([
{name:'很有想法'},
{name:'海纳百川'},
{name:'川妹子'},
{name:'专注设计'},
{name:'喜欢吃辣'},
{name:'好看'},
{name:'能力强'},
{name:'爱臭美'},
])
const sstdData = ref([
{src:'https://cube.elemecdn.com/3/7c/3ea6beec64369c2642b92c6726f1epng.png',title:'淘宝创意部',content:'设计呢,最重要的是开心'},
{src:'https://cube.elemecdn.com/3/7c/3ea6beec64369c2642b92c6726f1epng.png',title:'淘宝创意部',content:'设计呢,最重要的是开心'},
{src:'https://cube.elemecdn.com/3/7c/3ea6beec64369c2642b92c6726f1epng.png',title:'淘宝创意部',content:'设计呢,最重要的是开心'},
])
const tableData = reactive([
{label:'应用',name:'first',defaultData:{},tableId:'1848631600935510017',type:'table',enhanceData: { hideHeader: 'disabled'}},
{label:'项目',name:'second',defaultData:{},tableId:'1848637143087489025',type:'table',enhanceData: { hideHeader: 'disabled'}},
{label:'文章',name:'fourth',defaultData:{},tableId:'1848649270435160066',type:'table',enhanceData: { hideHeader: 'disabled'}},
])
const activeName = ref('first')
const handleClick = (tab: TabsPaneContext, event: Event) => {
console.log(tab, event)
}
const { circleUrl } = toRefs(state)
</script>
<style lang="scss" scoped>
*{
padding: 0;
margin: 0;
}
.box{
display: flex;
width: 100%;
.box-left{
width: 22.6%;
max-height: 950px;
// padding: 0 20px;
margin-right:21px;
background: #fff;
border-radius: 10px;
.box-left-top{
width: 100%;
// padding: 0 20px;
.head{
// margin: 20px 0;
text-align: center;
}
.title-box{
margin:30px 0;
.content{
text-align: center;
}
}
}
.list{
padding-bottom: 20px;
border-top: 1px solid #ececec;
.list-box{
display: flex;
width: 100%;
margin-left:20px;
line-height: 28px;
align-content: center;
}
.list-sstd{
display: flex;
margin-top: 20px;
margin-left:20px;
.list-sstd-text{
margin-left: 10px;
p{
line-height: 24px;
}
}
}
}
}
.box-right{
width: 77%;
padding: 0 20px;
background: #fff;
border-radius: 10px;
}
}
.item {
margin-top: 10px;
margin-right: 10px;
}
.el-dropdown {
margin-top: 1.1rem;
}
::v-deep .el-button{
padding: 8px 15px !important;
font-family: '微软雅黑', sans-serif !important;
font-size: 12px !important;
font-weight: 400 !important;
color: #999 !important;
}
::v-deep .el-tabs__item{
height: 60px !important;
font-family: '微软雅黑 Bold', '微软雅黑 Regular', '微软雅黑', sans-serif !important;
font-size: 16px !important;
font-weight: 700 !important;
line-height: 30px !important;
color: #666 !important;
}
.font{
font-family: '微软雅黑 Bold', '微软雅黑 Regular', '微软雅黑', sans-serif;
font-weight: 700;
}
.fontFamily{
font-family: '微软雅黑', sans-serif;
font-weight: 400;
}
.font-family{
font-family: MicrosoftYaHei, '微软雅黑', sans-serif;
font-weight: 400;
}
.color3{
color: #333;
}
.color6{
color: #666;
}
.color9{
color: #999;
}
</style>

View File

@@ -0,0 +1,152 @@
<template>
<!-- <div> 发布表单页(横向分步) </div> -->
<ContentWrap>
<el-steps :active="active" align-center>
<el-step v-for="(item, index) in stepList" :key="item.refKey">
<template #icon>
<div class="step-icon-box" :class="{ avtive: active == index }">
<div v-if="active == index" class="mt--1px">{{ index + 1 }}</div>
<div v-else class="mt-1px">
<Icon :size="14" icon="ep:select" color="var(--el-color-primary)"></Icon>
</div>
</div>
</template>
<template #title>
<div class="c-[var(--el-text-color-primary)]">{{ item.title }}</div>
</template>
<template #description>
<div
class="c-[var(--el-color-info-light-3)] text-12px"
:class="{ 'des-hide': active != index }"
>{{ item.des }}</div
>
</template>
</el-step>
</el-steps>
<template v-for="(item, index) in stepList" :key="item.refKey">
<div v-if="item.formId" v-show="active == index">
<FormView
:ref="(el) => (formViewRef[item.refKey] = el)"
formType="add"
handleType="returnData"
showType="view"
:showButton="false"
:formId="item.formId"
></FormView>
</div>
<div v-if="active == index && active < 3" class="mt-40px flex justify-center">
<el-button v-if="active != 0" @click="active = active - 1">上一步</el-button>
<el-button type="primary" v-if="active <= 2" @click="setNextForm">{{
active == 2 ? '提交' : '下一步'
}}</el-button>
</div>
</template>
</ContentWrap>
</template>
<script setup lang="ts">
import { FormView } from '@/components/LowDesign/index'
defineOptions({ name: 'FormHxfb' })
const active = ref(0)
const stepList = ref([
{
refKey: 'basic_sp',
title: '基本信息',
des: '请填写公司基本信息',
formId: '1829756210681274369'
},
{
refKey: 'detail_sp',
title: '详细信息',
des: '请填写公司详细信息',
formId: '1829756992465985538'
},
{
refKey: 'financial_sp',
title: '财务信息',
des: '请填写公司财务信息',
formId: '1829757052494864386'
},
{
refKey: 'submit_sp',
title: '提交成功',
des: '公司信息提交成功'
}
])
const formViewRef = ref({})
const formData = ref({})
const setNextForm = async () => {
const currStep = stepList.value[active.value]
if (currStep.formId) {
const formRef = formViewRef.value[currStep.refKey].controlRef
const data = await formRef.handleSubmit(true)
formData.value[currStep.refKey] = data
}
active.value++
}
</script>
<style lang="scss" scoped>
::v-deep(.low-form) {
padding-bottom: 0;
}
.step-icon-box {
display: flex;
width: 30px;
height: 30px;
background-color: #fff;
border: 2px solid var(--el-color-primary);
border-radius: 50%;
box-sizing: border-box;
align-items: center;
justify-content: center;
& > div {
display: flex;
font-weight: bold;
}
&.avtive {
color: #fff;
background-color: var(--el-color-primary);
}
}
::v-deep(.el-steps) {
.el-step__head {
.el-step__line {
background-color: var(--el-color-info-light-7);
}
.el-step__icon {
width: 30px !important;
}
&.is-finish {
.el-step__line {
background-color: var(--el-color-primary);
}
}
}
.el-step:not(:last-child) {
.el-step__head {
&.is-process::before {
position: absolute;
top: calc(50% - 1px);
right: 0;
z-index: 1;
display: block;
width: 50%;
height: 2px;
background-color: var(--el-color-primary);
content: '';
}
}
}
}
</style>

View File

@@ -0,0 +1,201 @@
<template>
<!-- <div> 发布表单页(纵向分步) </div> -->
<ContentWrap>
<el-steps direction="vertical" :active="active">
<el-step v-for="(item, index) in stepList" :key="item.refKey">
<template #icon>
<div class="step-icon-box" :class="{ avtive: active == index }">
<div v-if="active == index" class="mt--1px">{{ index + 1 }}</div>
<div v-else class="mt-1px">
<Icon :size="14" icon="ep:select" color="var(--el-color-primary)"></Icon>
</div>
</div>
</template>
<template #title>
<div class="c-[var(--el-text-color-primary)]">{{ item.title }}</div>
</template>
<template #description>
<div
class="c-[var(--el-color-info-light-3)] text-12px"
:class="{ 'des-hide': active != index }"
>{{ item.des }}</div
>
<div v-if="item.formId" v-show="active == index">
<FormView
:ref="(el) => (formViewRef[item.refKey] = el)"
formType="add"
handleType="returnData"
showType="view"
:showButton="false"
:formId="item.formId"
></FormView>
</div>
<div v-if="active == index && active < 3" class="ml-65px mb-20px">
<el-button v-if="active != 0" @click="active = active - 1">上一步</el-button>
<el-button type="primary" v-if="active <= 2" @click="setNextForm">{{
active == 2 ? '提交' : '下一步'
}}</el-button>
</div>
</template>
</el-step>
</el-steps>
</ContentWrap>
</template>
<script setup lang="ts">
import { FormView } from '@/components/LowDesign/index'
import { getUserProfile, ProfileVO } from '@/api/system/user/profile'
import { formatDate } from '@/utils/formatTime'
defineOptions({ name: 'FormZxfb' })
interface HandleClickProps {
(formData: object): string
}
const props = defineProps<{
addFun: HandleClickProps
}>()
const active = ref(0)
const stepList = ref([
{
refKey: 'basic',
title: '基本信息',
des: '请填写公司基本信息',
formId: '1829756210681274369'
},
{
refKey: 'detail',
title: '详细信息',
des: '请填写公司详细信息',
formId: '1829756992465985538'
},
{
refKey: 'financial',
title: '财务信息',
des: '请填写公司财务信息',
formId: '1829757052494864386'
},
{
refKey: 'submit',
title: '提交成功',
des: '公司信息提交成功'
}
])
const formViewRef = ref({})
const formData = ref({})
const debounce = (func, wait) => {
let timeout
return function () {
const args = arguments
clearTimeout(timeout)
timeout = setTimeout(() => func.apply(args), wait)
}
}
const setNextForm = debounce(async () => {
const currStep = stepList.value[active.value]
if (currStep.formId) {
const formRef = formViewRef.value[currStep.refKey].controlRef
const data = await formRef.handleSubmit(true)
formData.value[currStep.refKey] = data
if (active.value == 2 && data) {
interface primordialTableDataType {
basic: {
company_name: string
client_state: string
industry_type: string
client_source: string
client_level: string
}
}
const userInfo = ref({} as ProfileVO)
const users = await getUserProfile()
userInfo.value = users
let primordialTableData = {
company_name: (formData.value as primordialTableDataType).basic.company_name,
customer_status: (formData.value as primordialTableDataType).basic.client_state,
industry_type: (formData.value as primordialTableDataType).basic.industry_type,
customer_source: (formData.value as primordialTableDataType).basic.client_source,
customer_star: (formData.value as primordialTableDataType).basic.client_level,
add_people: userInfo.value.id,
update_date: formatDate(new Date(), 'YYYY-MM-DD HH:mm:ss'),
bh: '20241001'
}
props.addFun(primordialTableData)
}
active.value++
}
}, 500)
</script>
<style lang="scss" scoped>
::v-deep(.low-form) {
padding-bottom: 0;
}
.step-icon-box {
display: flex;
width: 30px;
height: 30px;
background-color: #fff;
border: 2px solid var(--el-color-primary);
border-radius: 50%;
box-sizing: border-box;
align-items: center;
justify-content: center;
& > div {
display: flex;
font-weight: bold;
}
&.avtive {
color: #fff;
background-color: var(--el-color-primary);
}
}
::v-deep(.el-steps) {
.el-step__head {
width: 30px;
.el-step__line {
left: 14px;
background-color: var(--el-color-info-light-7);
}
.el-step__icon {
width: 30px !important;
}
&.is-finish {
.el-step__line {
background-color: var(--el-color-primary);
}
}
&.is-process::before {
position: absolute;
top: 0;
left: 14px;
z-index: 1;
display: block;
width: 2px;
height: 50%;
background-color: var(--el-color-primary);
content: '';
}
}
.des-hide {
margin-bottom: 50px;
}
}
</style>

View File

@@ -0,0 +1,186 @@
<template>
<!-- <div> 高级筛选页 </div>
顶部搜索表单设计
底部表格表单开发 -->
<div class="box">
<div class="order-top">
<FormView
formType="edit"
handleType="returnData"
showType="view"
:defaultData="orderTopData.defaultData"
:showButton="false"
:enhanceData="{ setSearch}"
:formId="orderTopData.formId"
:ref="(el) => (tableRef[tableData.name] = el)"
></FormView>
</div>
<div class="flex gap-2">
<span>已选条件</span>
<template v-for="tag in dynamicTags" :key="tag.label">
<el-tag
v-if="tag.show"
closable
:disable-transitions="false"
@close="handleClose(tag)"
>
{{ tag.label }}
</el-tag>
</template>
<span class="qcsx" @click="delFun">清除筛选</span>
</div>
<div class="table">
<LowTable :tableId="tableData.tableId" :enhanceData="tableData.enhanceData"> </LowTable>
</div>
</div>
</template>
<script setup lang="ts">
import { FormView, LowTable } from '@/components/LowDesign/index'
import type { TagProps } from 'element-plus'
interface TagsItem {
name: string
type: TagProps['type']
}
// const dynamicTags = ref(['选择项一', '选择项一', '选择项一'])
const dynamicTags = ref<any>([
// { label: '选项一', type: 'primary',lx:'kh',show:true },
// { label: '选项二', type: 'primary',lx:'kh',show:false },
])
const orderTopData = ref({
type: 'exploit',
refKey: 'orderTop',
formId: '1838814762506964994',
defaultData: {
type1:'1',
type2:'1',
type3:'1'
}
})
const tableRef = ref({})
const formData = ref({})
const tableData = ref(
{
label: '高级筛选',
name: 'gjsx',
tableId: '1838824808796180481',
enhanceData: { hideHeader: 'disabled' }
},
)
const tableCrud = ref()
const tableSearch = ref({})
const label = ref<any>()
// 多选处理
const khArr = ref<any>([])
const hyArr = ref<any>([])
const setSearch = (searchObj) => {
if(searchObj.type == 'kh'){
searchObj.dic.map(item=>{
item.type = 'primary'
item.show = searchObj.value.includes(item.value) ? true : false
item.lx = searchObj.type
return item
})
khArr.value = searchObj.dic
}
if(searchObj.type == 'hy'){
searchObj.dic.map(item=>{
item.type = 'primary'
item.show = searchObj.value.includes(item.value) ? true : false
item.lx = searchObj.type
return item
})
hyArr.value = searchObj.dic
}
strFnu(searchObj)
}
const strFnu = (data) =>{
let array = khArr.value.concat(hyArr.value)
dynamicTags.value = array
}
const delFun = () =>{
dynamicTags.value = []
}
//已选条件处理
const str = ref<any>([])
const handleClose = (tag) => {
dynamicTags.value.map(item =>{
if(item.label == tag.label){
item.show = false
}
if(item.lx == tag.lx && item.show){
str.value.push(item.value)
}
return item
})
if(tag.lx == 'kh'){
orderTopData.value.defaultData.type1 = str.value.join()
str.value = []
} else if(tag.lx == 'hy'){
orderTopData.value.defaultData.type2 = str.value.join()
str.value = []
}
}
// watch()
</script>
<style lang="scss" scoped>
.box{
background: #fff;
}
.flex{
margin-left: 68px;
font-family: MicrosoftYaHei, '微软雅黑 Regular', '微软雅黑', sans-serif;
font-size: 14px;
font-style: normal;
font-weight: 400;
line-height: 28px;
color: #999;
text-align: left;
.qcsx{
margin-top: -3px;
margin-left:40px;
font-family: MicrosoftYaHei, '微软雅黑', sans-serif;
font-size: 12px;
font-style: normal;
font-weight: 400;
color: #409EFF;
}
}
.table{
width: calc(90% + 40px);
padding: 20px;
margin: auto;
}
::v-deep .el-form-item__label{
color: #999;
}
::v-deep .el-checkbox-group {
display: contents;
}
::v-deep .low-form {
padding-bottom: 0;
}
</style>

View File

@@ -0,0 +1,583 @@
<template>
<div class="group_gjxqy_box">
<!-- 顶部信息 -->
<FormView
formType="view"
handleType="returnData"
showType="view"
:defaultData="topInformation.defaultData"
:showButton="false"
:formId="topInformation.formId"
></FormView>
<!-- 分类页面X -->
<el-tabs v-model="tabsOneActive" class="demo-tabs" @tab-click="handleClick">
<template v-for="item in tabsOneList" :key="item.name">
<el-tab-pane :label="item.label" :name="item.name"></el-tab-pane>
</template>
</el-tabs>
<!-- 流程进度 -->
<el-card>
<template #header>
<div class="card-header">
<span class="text-16px">流程进度</span>
</div>
</template>
<el-steps :active="stepsActive" align-center>
<template v-for="item in stepsList" :key="item.id">
<el-step
:title="item.title"
:description="item.description"
:class="item.id == stepsActive ? 'stepsActive' : ''"
/>
</template>
</el-steps>
</el-card>
<!-- 操作记录 -->
<el-card>
<template #header>
<div class="card-header">
<span class="text-16px">操作记录</span>
</div>
</template>
<FormView
formType="view"
handleType="returnData"
showType="view"
:defaultData="operationRecord.defaultData"
:showButton="false"
:formId="operationRecord.formId"
></FormView>
</el-card>
<!-- 操作记录流程 -->
<el-card>
<template #header>
<div class="card-header">
<span class="text-16px">操作记录</span>
</div>
</template>
<el-steps
direction="vertical"
:active="stepsVertical.length"
align-center
class="steps-vertical-class"
>
<template v-for="item in stepsVertical" :key="item.id">
<el-step :title="item.title">
<template #description>
<el-card>
<div>
<el-avatar :size="34" :src="item.cardContent.avatarImg" />
</div>
<div class="ml-5px grid">
<div class="flex items-center">
<p class="c-#bcaeae m-0 font">{{ item.cardContent.username }}</p>
<p class="pl-5px m-0 c-#999 text-11px font-family">{{
item.cardContent.userjob
}}</p>
</div>
<div
class="flex items-center c-#bcaeae text-11px font-family"
style="color: #666"
>
<p class="m-0">{{ item.cardContent.examineApproveGrade }}</p>
<p class="pl-3px m-0">{{ item.cardContent.examineApproveName }}</p>
<p class="pl-3px m-0">{{ item.cardContent.examineApproveResult }}</p>
</div>
<div class="flex items-center c-#999">
<el-icon><Clock /></el-icon>
<p class="pl-3px m-0" style="font-family: '微软雅黑', sans-serif">{{
item.cardContent.examineApproveTime
}}</p>
</div>
</div>
<div class="ml-auto c-#bcaeae text-11px font" style="font-size: 12px">
{{ item.cardContent.type }}
</div>
</el-card>
</template>
</el-step>
</template>
</el-steps>
</el-card>
<!-- 日志记录 -->
<el-card>
<template #header>
<div class="card-header">
<span class="text-16px">日志记录</span>
</div>
</template>
<el-empty description="未查询到相关数据" image="/img/img5.svg" />
</el-card>
<!-- 分类标签 -->
<el-card class="card-and-tabs">
<template #header>
<div class="card-header">
<el-tabs v-model="tabsOneActive" @tab-click="handleClick">
<template v-for="item in tabsOneList" :key="item.name">
<el-tab-pane :label="item.label" :name="item.name"></el-tab-pane>
</template>
</el-tabs>
</div>
</template>
<LowTable :tableId="tabsTableData.tabId" :enhanceData="tabsTableData.enhanceData"></LowTable>
</el-card>
</div>
</template>
<script setup lang="ts">
import { FormView, LowTable } from '@/components/LowDesign/index'
import type { TabsPaneContext } from 'element-plus'
import { Clock } from '@element-plus/icons-vue'
defineOptions({ name: 'GroupGjxqy' })
const topInformationData = reactive({
create_date: '2024-09-11 09:04:00',
customer_rating: 4,
customer_source: '7',
customer_status: '3',
fields_4858197: '',
fields_5452530: '',
head_contact: '1833323260582391810',
system_number: '202010001',
tabs_title: '广州某科技有限公司',
type_of_industry: '3',
vesting_officer: '1833323260582391810'
})
const topInformation = ref({
title: '基本信息',
formId: '1838820624684339201',
defaultData: topInformationData
})
const tabsOneActive = ref('1')
const tabsOneList = ref([
{ label: '分类页面一', name: '1' },
{ label: '分类页面二', name: '2' },
{ label: '分类页面三', name: '3' },
{ label: '分类页面四', name: '4' }
])
const stepsActive = ref(4)
const stepsList = ref([
{ id: 1, title: '提交申请', description: '2024-09-24 15:03' },
{ id: 2, title: '部门审批', description: '2024-09-24 15:03' },
{ id: 3, title: '行政审批', description: '2024-09-24 15:03' },
{ id: 4, title: '申请成功', description: '2024-09-24 15:03' }
])
const handleClick = (tab: TabsPaneContext, event: Event) => {
console.log(tab, event)
}
const operationRecordData = ref({
tabs_customer_name: '广州某科技有限公司',
tabs_customer_rating: 4,
tabs_customer_source: '7',
tabs_customer_status: '3',
tabs_now_city: '130000',
tabs_system_number: '202010001',
tabs_type_of_industry: '3',
tabs_update_date: '2024-09-25 00:00:00',
tabs_vesting_officer: '1833323260582391810',
tabs_company_tax: '91440300MA5FQY****',
tabs_company_tel: '3666-756614',
tabs_company_web: 'http://www.xx.com',
tabs_current_title: '5',
tabs_deposit_bank: '交通银行深圳井南山支行',
tabs_detailed_address: '广东省深圳市南山区',
tabs_head_contact: '李小红',
tabs_invoice_title: '广州某科技有限公司',
tabs_phone_number: '15238683333'
})
const operationRecord = ref({
title: '操作记录',
formId: '1838842046060228609',
defaultData: operationRecordData
})
const stepsVertical = ref([
{
id: 1,
title: '09-24',
cardContent: {
avatarImg: 'https://cube.elemecdn.com/3/7c/3ea6beec64369c2642b92c6726f1epng.png',
username: '赵小刚',
userjob: '销售经理',
examineApproveGrade: '1级审批人',
examineApproveName: '李小明',
examineApproveResult: '审批通过,通过原因:无',
examineApproveTime: '2019-08-23 22:31',
type: '订单'
}
},
{
id: 2,
title: '09-24',
cardContent: {
avatarImg: 'https://cube.elemecdn.com/3/7c/3ea6beec64369c2642b92c6726f1epng.png',
username: '赵小刚',
userjob: '销售经理',
examineApproveGrade: '1级审批人',
examineApproveName: '李小明',
examineApproveResult: '审批通过,通过原因:无',
examineApproveTime: '2019-08-23 22:31',
type: '订单'
}
},
{
id: 3,
title: '09-24',
cardContent: {
avatarImg: 'https://cube.elemecdn.com/3/7c/3ea6beec64369c2642b92c6726f1epng.png',
username: '赵小刚',
userjob: '销售经理',
examineApproveGrade: '1级审批人',
examineApproveName: '李小明',
examineApproveResult: '审批通过,通过原因:无',
examineApproveTime: '2019-08-23 22:31',
type: '订单'
}
},
{
id: 4,
title: '09-24',
cardContent: {
avatarImg: 'https://cube.elemecdn.com/3/7c/3ea6beec64369c2642b92c6726f1epng.png',
username: '赵小刚',
userjob: '销售经理',
examineApproveGrade: '1级审批人',
examineApproveName: '李小明',
examineApproveResult: '审批通过,通过原因:无',
examineApproveTime: '2019-08-23 22:31',
type: '订单'
}
}
])
const tabsTableData = ref({
tabId: '1840268794366795777',
enhanceData: {
buttonType: 'hidden'
}
})
</script>
<style lang="scss" scoped>
.group_gjxqy_box {
.el-tabs {
::v-deep(.el-tabs__header) {
margin-bottom: 0;
background-color: white;
.el-tabs__nav-wrap {
border: 1px solid #e4e7ed;
border-top: none;
.el-tabs__active-bar {
height: 1px;
}
.el-tabs__item {
margin-bottom: 15px;
font-family: '微软雅黑 Bold', '微软雅黑 Regular', '微软雅黑', sans-serif;
font-weight: 700;
color: #666;
&:hover {
color: rgb(64 158 255);
}
}
.el-tabs__item.is-active {
color: rgb(64 158 255);
}
&::after {
height: auto;
}
}
}
}
::v-deep(.el-card) {
width: 95%;
margin: 20px auto 0;
border-radius: 10px;
.el-card__header {
height: 60px;
font-family: '微软雅黑 Bold', '微软雅黑 Regular', '微软雅黑', sans-serif;
font-size: 14px;
font-weight: 700;
color: #666;
background-color: rgb(249 249 249 / 100%);
border-bottom: 1px solid rgb(233 233 233 / 100%);
}
.el-card__body {
.el-steps {
height: 90px;
padding-top: 10px;
.el-step {
.el-step__head {
.el-step__icon {
width: 13px;
height: 13px;
border: 3px solid;
.el-step__icon-inner {
display: none;
}
}
}
.el-step__main {
.el-step__title {
font-size: 12px;
font-weight: 400;
line-height: 30px;
color: #666;
}
.el-step__description {
color: #ccc;
}
}
&.stepsActive {
.el-step__head {
.el-step__icon {
background-color: #409eff;
}
}
}
}
}
.steps-vertical-class {
height: auto;
.el-step__head {
display: flex;
justify-content: center;
border-color: #f2f2f2;
.el-step__line {
bottom: -50%;
left: 11.5px;
background-color: #f2f2f200;
}
.el-step__icon {
width: 9px !important;
height: 9px !important;
border-width: 2px !important;
}
}
.el-step__main {
display: flex;
align-items: center;
height: 125px;
margin-top: 10px;
.el-step__title {
position: absolute;
top: -9px;
color: #999 !important;
}
.el-step__description {
width: 100%;
padding-right: 0;
.el-card {
width: 100%;
height: 90px;
margin: 0;
border: none;
box-shadow: 0 0 5px rgb(0 0 0 / 9.8%);
.el-card__body {
display: flex;
height: calc(100% - 16px);
padding: 8px 30px 8px 10px;
}
}
}
}
}
.el-empty {
.el-empty__image {
width: 120px;
height: 120px;
}
.el-empty__description > p {
font-size: 13px;
color: #ccc;
}
}
.avue-crud {
.el-card {
border-radius: 0;
.el-form {
.el-table__header-wrapper {
.el-table__header {
font-family: '微软雅黑 Bold', '微软雅黑 Regular', '微软雅黑', sans-serif;
font-size: 14px;
font-weight: 700;
.el-table__cell {
color: #666;
}
}
}
.el-table__body {
.el-table__row {
background-color: #f5f5f5;
.el-table__cell {
font-family: '微软雅黑 Bold', '微软雅黑 Regular', '微软雅黑', sans-serif;
font-size: 14px;
.el-button {
.el-icon {
line-height: 0.9em;
}
span {
font-size: 14px !important;
}
}
}
}
.el-table__row--striped .el-table__cell {
background-color: #fff;
}
}
}
}
}
}
&.card-and-tabs {
.el-card__header {
height: 60px;
padding: 0 20px 0 0;
.el-tabs {
--el-tabs-header-height: 60px;
.el-tabs__header {
background-color: rgb(249 249 249);
.el-tabs__nav-wrap {
height: 60px;
margin-bottom: 0;
border: none;
}
}
}
}
.el-card__body {
padding-bottom: 40px;
.el-card {
width: calc(100% - 10px);
padding: 0 5px;
.el-card__body {
padding-bottom: 0;
}
}
}
}
}
}
::v-deep .el-form-item {
.el-form-item__label {
font-size: 14px !important;
}
.el-form-item__content {
.el-input__inner {
font-family: MicrosoftYaHei, '微软雅黑', sans-serif;
font-weight: 400;
color: #666 !important;
}
}
}
::v-deep .avue-title p {
font-family: '微软雅黑 Bold', '微软雅黑 Regular', '微软雅黑', sans-serif !important;
font-size: 18px !important;
font-weight: 700 !important;
color: #666 !important;
}
::v-deep .demo-tabs .el-tabs__nav {
margin-left: 25px;
.el-tabs__item {
margin-bottom: 15px;
font-family: '微软雅黑 Bold', '微软雅黑 Regular', '微软雅黑', sans-serif;
font-size: 16px;
font-weight: 700;
}
.el-tabs__active-bar {
left: -1px;
height: 2px !important;
}
}
::v-deep .card-header .el-tabs__nav {
// margin-left: 25px;
.el-tabs__item {
margin-bottom: 0 !important;
font-family: '微软雅黑 Bold', '微软雅黑 Regular', '微软雅黑', sans-serif;
font-size: 16px;
font-weight: 700;
text-align: left;
}
.el-tabs__active-bar {
left: 2px;
height: 2px !important;
}
}
.font {
font-family: '微软雅黑', sans-serif;
font-size: 14px;
font-weight: 400;
color: #666;
}
.font-family {
font-family: MicrosoftYaHei, '微软雅黑', sans-serif;
font-size: 12px;
font-weight: 400;
color: #999;
}
// .fonts{
// font-family: 'MicrosoftYaHei', '微软雅黑 Regular', '微软雅黑', sans-serif;
// font-weight: 400;
// font-style: normal;
// font-size: 12px;
// }
</style>

View File

@@ -0,0 +1,92 @@
<template>
<!-- 基础详情页 -->
<ContentWrap>
<div v-for="item in stepList" :key="item.refKey">
<div class="pl-8px b-l-6px b-solid b-#409EFF mb-15px title">{{ item.title }}</div>
<div class="mb-20px" v-if="item.type == 'exploit'">
<FormView
formType="view"
handleType="returnData"
showType="view"
:defaultData="item.defaultData"
:showButton="false"
:formId="item.formId"
></FormView>
</div>
<div class="mt-20px" v-if="item.type == 'design'">
<LowTable :tableId="item.tableId" :enhanceData="item.enhanceData"></LowTable>
</div>
</div>
</ContentWrap>
</template>
<script setup lang="ts">
import { FormView, LowTable } from '@/components/LowDesign/index'
defineOptions({ name: 'GroupJcxqy' })
const basicDefaultData = reactive({
customer_name: '广州某科技有限公司',
customer_rating: 3,
customer_source: '3',
customer_status: '4',
now_city: '120000,120100,120102',
system_number: '202010033',
type_of_industry: '4',
update_date: '2024-01-23 23:23:23',
vesting_officer: '1836227753657548801'
})
const detailDefaultData = reactive({
company_tax: '91645530MA5FQY4QGB',
company_tel: '15238680350',
company_web: 'http://www.xx.cn',
current_title: '2',
deposit_bank: '建设银行广州白云支行',
detailed_address: '440000,440100,440111',
head_contact: '1836227753657548801',
invoice_title: '发票抬头',
phone_number: '15239683355'
})
const financialEnhanceData = reactive({
hideHeader: 'disabled'
})
const stepList = ref([
{
refKey: 'basic',
title: '基本信息',
type: 'exploit',
formId: '1833063456320286721',
defaultData: basicDefaultData
},
{
refKey: 'detail',
title: '详细信息',
type: 'exploit',
formId: '1833076541672169474',
defaultData: detailDefaultData
},
{
refKey: 'financial',
title: '下级客户',
type: 'design',
tableId: '1833323260582391810',
enhanceData: financialEnhanceData
}
])
</script>
<style lang="scss" scoped>
.title {
height: 18px;
font-family: '微软雅黑 Bold', '微软雅黑 Regular', '微软雅黑', sans-serif;
font-size: 14px;
font-weight: 700;
line-height: 18px;
color: #666670;
border-top: none;
border-right: none;
border-bottom: none;
}
</style>

View File

@@ -0,0 +1,57 @@
<template>
<!-- tabs标签页风格表单开发示例 -->
<el-tabs v-model="activeName" type="border-card" class="demo-tabs" @tab-click="handleClick">
<template v-for="item in tabsPaneList" :key="item.name">
<el-tab-pane :label="item.label" :name="item.name">
<LowTable
:ref="(el) => (tableRef[item.name] = el)"
:tableId="item.tableId"
:calcHeight="item.calcHeight || undefined"
:enhanceData="item.enhanceData"
></LowTable>
</el-tab-pane>
</template>
</el-tabs>
</template>
<script setup lang="ts">
import { LowTable } from '@/components/LowDesign/index'
defineOptions({ name: 'GroupSjbby' })
const activeName = ref('cjje')
const tableRef = ref({})
const tabsPaneList = ref([
{
label: '成交金额',
name: 'cjje',
tableId: '1834136609367400450',
enhanceData: { hideHeader: 'disabled' }
},
{ label: '回款金额', name: 'hkje', tableId: '1851509263837597697', calcHeight: 200 }
])
const handleClick = (tab) => {
const key = tab.props.name
if (key == 'hkje' && tableRef.value[key]) tableRef.value[key].initTableLayout()
}
</script>
<style lang="scss" scoped>
.demo-tabs > .el-tabs__content {
padding: 32px;
font-size: 32px;
font-weight: 600;
color: #6b778c;
}
.demo-tabs {
::v-deep(.el-tabs__nav-wrap) {
.el-tabs__item {
height: 50px;
font-size: 16px;
}
}
}
</style>

View File

@@ -0,0 +1,7 @@
<template>
<div> 高级筛选页 </div>
</template>
<script setup lang="ts"></script>
<style lang="scss" scoped></style>

View File

@@ -0,0 +1,94 @@
<template>
<div class="w-100%">
<div class="box w-100%">
<div class="w-[calc(100%-60px)] header">
<el-radio-group v-model="radio" >
<template v-for="(item,index) in tabbleDate" :key="index">
<el-radio-button :label="item.label" :value="index"/>
</template>
</el-radio-group>
</div>
<div class="tabel">
<LowTable :ref="(el)=>(customRef = el)" :tableId="tabbleDate[radio].tableId" :enhanceData="tabbleDate[radio].enhanceData" > </LowTable>
</div>
</div>
</div>
</template>
<script setup lang="ts">
const radio = ref(0)
const customRef = ref()
const tabbleDate = ref([
{
label:'操作日志',
type:'table',
defaultData:{},
tableId:'1854067250698612737',
enhanceData: { hideHeader: 'disabled'}
},
{
label:'审批日志',
type:'table',
defaultData:{},
tableId:'1854331399533998082',
enhanceData: { hideHeader: 'disabled'}
},
{
label:'登录日志',
type:'table',
defaultData:{},
tableId:'1854341001851940865',
enhanceData: { hideHeader: 'disabled'}
}
])
</script>
<style lang="scss" scoped>
.box{
background-color: rgb(255 255 255 / 100%);
border: 1px solid rgb(233 233 233 / 100%);
border-radius: 10px;
box-shadow: 0 0 5px rgb(0 0 0 / 4.71%);
box-sizing: border-box;
.header{
display: flex;
height: 60px;
padding: 0 30px;
background-color: rgb(249 249 249 / 100%);
border-bottom: 1px solid rgb(233 233 233 / 100%);
border-radius: 10px 10px 0 0;
align-content: center;;
::v-deep(.el-radio-group){
.el-radio-button{
.el-radio-button__inner{
display: flex;
width: 101px;
height: 35px;
font-family: '微软雅黑', sans-serif;
font-size: 14px;
font-style: normal;
font-weight: 400;
color: #999;
align-items: center;
justify-content: center;
}
}
.is-active {
.el-radio-button__inner{
color: #FFF ;
}
}
}
}
.tabel{
padding: 30px;
}
}
</style>

View File

@@ -0,0 +1,340 @@
<template>
<div class="step-orde-form-box">
<div class="order-top">
<div style="display: flex">
<div class="tb-box">
<img src="/img/zwgl.jpg" style="height: 30px" />
</div>
<div class="title-box">
<p class="title">销售总监</p>
<div class="text-box">
<span>暂无相关描述</span>
</div>
</div>
</div>
<FormView
:ref="(el) => (formViewRef[orderTopData.refKey] = el)"
formType="add"
handleType="returnData"
showType="view"
:defaultData="orderTopData.defaultData"
:showButton="false"
:formId="orderTopData.formId"
></FormView>
</div>
<footer class="footer">
<el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
<template v-for="(item, index) in data" :key="index">
<el-tab-pane :label="item.label" :name="item.name">
<div class="tabs-box">
<FormView
v-if="item.formId"
formType="add"
handleType="returnData"
showType="view"
:defaultData="item.defaultData"
:showButton="true"
:formId="item.formId"
></FormView>
<template v-if="item.tableId">
<LowTable :tableId="item.tableId" :enhanceData="item.enhanceData"> </LowTable>
</template>
</div>
</el-tab-pane>
</template>
</el-tabs>
</footer>
</div>
</template>
<script setup lang="ts">
import type { TabsPaneContext } from 'element-plus'
interface Props {
type?: string //控件名称
}
const props = defineProps<Props>()
const orderTopData = ref({
refKey: 'gdgl',
formId: '1846114280447025153',
defaultData: {
gdbh: '202062976600',
gdbt: '处理客户反馈问题',
gdzt: 1,
lx: props.type
}
})
const formViewRef = ref({})
const activeName = ref('first')
const data = reactive([
{
label: '操作权限',
name: 'first',
defaultData: {},
formId: '1846364734045270018'
},
{
label: '数据权限',
name: 'second',
defaultData: {},
formId: '1846383339671629825'
},
{
label: '字段权限',
name: 'third',
defaultData: {},
formId: '1846399447287967745'
},
{
label: '成员列表',
name: 'fourth',
defaultData: {},
tableId: '1846429439782793217',
enhanceData: { hideHeader: 'disabled' }
},
{
label: '操作记录',
name: 'czjl',
defaultData: {},
tableId: '1846103236139950082',
enhanceData: { hideHeader: 'disabled' }
}
])
const handleClick = (tab: TabsPaneContext, event: Event) => {
console.log(tab, event)
}
</script>
<style lang="scss" scoped>
.step-orde-form-box {
.order-top {
display: flex;
height: 110px;
padding: 20px 25px;
margin-bottom: 20px;
background-color: #fff;
border: 1px solid rgb(233 233 233 / 100%);
border-radius: 10px;
box-shadow: 0 0 5px rgb(0 0 0 / 4.71%);
align-items: center;
justify-content: space-between;
.tb-box {
display: flex;
width: 65px;
height: 65px;
line-height: 65px;
justify-content: center;
text-align: center;
background: #fb6260;
border-radius: 50%;
align-items: center;
}
.title-box {
display: flex;
height: 60px;
margin-left: 15px;
flex-direction: column;
justify-content: center;
.title {
padding: 0;
margin: 0;
// margin-bottom: 5px;
font-family: '微软雅黑 Bold', '微软雅黑 Regular', '微软雅黑', sans-serif;
font-size: 18px;
font-style: normal;
font-weight: 700;
line-height: 28px;
text-align: left;
}
.text-box {
display: flex;
font-family: '微软雅黑 Regular', '微软雅黑', sans-serif;
font-size: 12px;
font-style: normal;
font-weight: 400;
line-height: 28px;
color: #999;
text-align: left;
align-items: center;
.text-box-left {
display: flex;
align-items: center;
.dian {
display: inline-block;
width: 7px;
height: 7px;
margin-right: 5px;
margin-left: 10px;
background: #f90;
border-radius: 50%;
}
}
}
}
}
.steps {
width: calc(90% + 40px);
padding: 60px 0 30px;
margin: 0 auto 20px;
background-color: #fff;
border: 1px solid rgb(233 233 233 / 100%);
border-radius: 10px;
::v-deep(.el-steps) {
.el-step {
.el-step__head.is-process {
color: #409eff;
.el-step__icon.is-text {
color: white;
background-color: #409eff;
border-color: #409eff;
}
}
.el-step__head {
.el-step__line {
top: 13px;
}
.el-step__icon.is-text {
width: 25px;
height: 30px;
.el-step__icon-inner {
font-size: 20px;
line-height: 30px;
}
}
}
.el-step__main {
.el-step__title {
font-size: 13px;
font-weight: 400;
line-height: 25px;
color: #666;
}
.el-step__description {
font-size: 13px;
color: #ccc;
}
}
}
}
}
::v-deep .card > .el-card {
width: calc(90% + 40px);
border-radius: 10px;
}
.card {
width: 100%;
// &>::v-deep(.crud){
// width: calc(90% + 40px);
// }
::v-deep(.el-card) {
// width: calc(90% + 40px);
.el-card__header {
background-color: #f9f9f9;
.card-header {
font-family: '微软雅黑 Bold', '微软雅黑 Regular', '微软雅黑', sans-serif;
font-weight: 700;
color: #666;
}
}
.el-card__body {
.avue-crud {
.el-card {
margin: 0 auto;
border-radius: 0;
.el-table__header {
height: 55px;
th {
height: 55px;
font-family: '微软雅黑 Bold', '微软雅黑 Regular', '微软雅黑', sans-serif;
font-size: 13px;
font-weight: 700;
color: #666;
background-color: #f2f2f2;
}
}
.el-table__body {
.el-table__row {
.el-table__cell {
font-size: 13px;
border-right: none;
}
}
}
}
}
}
}
}
}
.footer {
// padding: 0px 10p;
margin-top: 20px;
margin-bottom: 60px;
border: 1px solid rgb(233 233 233 / 100%);
border-radius: 10px;
box-shadow: 0 0 5px rgb(11 11 11 / 5.7%);
::v-deep .el-tabs__nav-wrap::after {
// background: none !important;
}
.tabs-box {
padding: 0 20px;
}
::v-deep .el-tabs__nav-scroll {
display: flex;
height: 60px;
line-height: 60px;
background: #f9f9f9;
align-items: center;
border-radius: 10px 10px 0 0;
.el-tabs__nav {
height: 60px;
align-items: center;
.el-tabs__item {
font-family: '微软雅黑 Bold', '微软雅黑 Regular', '微软雅黑', sans-serif;
font-size: 16px;
font-style: normal;
font-weight: 700;
color: #666;
}
.is-active {
color: #409eff;
}
}
}
}
</style>

View File

@@ -0,0 +1,21 @@
<template>
<div >
<div class="box">
<el-progress :percentage="jdt" :stroke-width="11"/>
</div>
</div>
</template>
<script lang="ts" setup>
interface Props {
jdt?: number //控件名称
}
const props =defineProps<Props>()
</script>
<style lang="scss" scoped>
.box{
margin-top: 8px;
}
</style>

View File

@@ -0,0 +1,138 @@
<template>
<div class="w-100%">
<header class="header ">
<div class="list" v-for="(item,index) in listData" :key="index">
<p class="title">{{item.title}}</p>
<p class="text">{{item.num}}</p>
</div>
</header>
<footer class="content">
<div class="content-top" >
<el-radio-group v-model="radio1" size="large">
<el-radio-button label="全部项目" value="qbxm" />
<el-radio-button label="进行中" value="jxz" />
<el-radio-button label="已完成" value="ywc" />
<el-radio-button label="已延期" value="yyq" />
<el-radio-button label="已取消" value="yqx" />
</el-radio-group>
<el-input
v-model="input"
style="width: 200px;height: 35px;margin-left:20px;"
size="large"
placeholder="输入搜索关键词"
:suffix-icon="Search"
clearable
/>
</div>
<div class="table">
</div>
<LowTable :tableId="data.tableId" :enhanceData="data.enhanceData" > </LowTable>
</footer>
</div>
</template>
<script setup lang="ts">
import { Search } from '@element-plus/icons-vue'
const listData = reactive([
{title:'项目总数',num:'200'},
{title:'进行中',num:'50'},
{title:'已完成',num:'50'},
{title:'已延期',num:'50'},
{title:'已取消',num:'50'},
])
const data = reactive({
label:'全部项目',
name:'qbxm',
defaultData:{},
tableId:'1847094468974710786',
type:'table',
enhanceData: { hideHeader: 'disabled'}
})
const radio1 = ref('qbxm')
const input = ref('')
</script>
<style lang="scss" scoped>
.header{
display: flex;
height: 150px;
padding: 0 20px;
margin-bottom:20px;
background: #fff;
border-radius: 10px;
justify-content: space-between;
align-items: center;
.list{
width: 292px;
width: 100%;
p{
padding: 0;
margin: 0;
text-align: center;
}
.title{
font-family: '微软雅黑', sans-serif;
font-size: 14px;
font-weight: 400;
line-height: 42px;
color: #999;
}
.text{
font-family: '微软雅黑 Bold', '微软雅黑', sans-serif;
font-size: 36px;
font-weight: 700;
line-height: 42px;
color: #666;
}
}
}
.content{
position: relative;
// height: 600px;
padding: 20px;
background: #fff;
border-radius: 10px;
.content-top{
position: absolute;
top: 30px;
z-index: 99;
display: flex;
align-items: center;
::v-deep(.el-radio-group) {
.el-radio-button {
.el-radio-button__inner {
display: flex;
width: 101px;
height: 35px;
padding: 0;
align-items: center;
justify-content: center;
color: #999;
}
&.is-active{
.el-radio-button__inner {
color: white;
}
}
}
}
}
.table{
// position: absolute;
margin-top:10px;
}
}
</style>

View File

@@ -0,0 +1,310 @@
<template>
<div class="step-orde-form-box">
<div class="order-top">
<FormView
:ref="(el) => (formViewRef[orderTopData.refKey] = el)"
formType="add"
handleType="returnData"
showType="view"
:defaultData="orderTopData.defaultData"
:showButton="false"
:formId="orderTopData.formId"
></FormView>
</div>
<footer class="footer">
<el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
<template v-for="(item,index) in data" :key="index">
<el-tab-pane :label="item.label" :name="item.name">
<div class="tabs-box">
<upDate v-if="item.type == 'jurisdiction'"></upDate>
<template v-if="item.type == 'table'">
<LowTable :tableId="item.tableId" :enhanceData="item.enhanceData" > </LowTable>
</template>
</div>
</el-tab-pane>
</template>
</el-tabs>
</footer>
</div>
</template>
<script setup lang="ts">
import type { TabsPaneContext } from 'element-plus'
import upDate from './update.vue'
interface Props {
type?: string //控件名称
}
const props =defineProps<Props>()
const orderTopData = ref({
type:'table',
refKey: 'gdgl',
formId: '1847209781133185025',
defaultData: {},
enhanceData: { hideHeader: 'disabled'}
})
const formViewRef = ref({})
const activeName = ref('first')
const data = reactive([
{label:'任务列表',name:'first',defaultData:{},tableId:'1847472439438737409',type:'table'},
{label:'更新记录',name:'second',defaultData:{},tableId:'',type:'jurisdiction'},
{label:'附件记录',name:'third',defaultData:{},tableId:'1845012516400803842',type:'table',enhanceData: { hideHeader: 'disabled'}},
{label:'成员列表',name:'fourth',defaultData:{},tableId:'1848301752228683777',type:'table',enhanceData: { hideHeader: 'disabled'}},
])
const handleClick = (tab: TabsPaneContext, event: Event) => {
console.log(tab, event)
}
</script>
<style lang="scss" scoped>
.step-orde-form-box {
.order-top {
display: flex;
align-items: center;
justify-content: space-between;
padding: 20px 25px;
margin-bottom: 20px;
background-color: #fff;
// border: 1px solid rgb(233 233 233 / 100%);
border-radius: 10px;
box-shadow: 0 0 5px rgb(11 11 11 / 5.7%);
.tb-box {
display: flex;
width: 50px;
height: 50px;
line-height: 50px;
justify-content: center;
text-align: center;
background: #fb6260;
border-radius: 50%;
align-items: center;
}
.title-box {
margin-left: 10px;
.title {
padding: 0;
margin: 0;
// margin-bottom: 5px;
font-family: '微软雅黑 Bold', '微软雅黑 Regular', '微软雅黑', sans-serif;
font-size: 18px;
font-style: normal;
font-weight: 700;
line-height: 28px;
text-align: left;
}
.text-box {
display: flex;
font-family: '微软雅黑 Regular', '微软雅黑', sans-serif;
font-size: 12px;
font-style: normal;
font-weight: 400;
line-height: 28px;
color: #999;
text-align: left;
align-items: center;
.text-box-left {
display: flex;
align-items: center;
.dian {
display: inline-block;
width: 7px;
height: 7px;
margin-right: 5px;
margin-left: 10px;
background: #f90;
border-radius: 50%;
}
}
}
}
}
.steps {
width: calc(90% + 40px);
padding: 60px 0 30px;
margin: 0 auto 20px;
background-color: #fff;
border: 1px solid rgb(233 233 233 / 100%);
border-radius: 10px;
::v-deep(.el-steps) {
.el-step {
.el-step__head.is-process {
color: #409eff;
.el-step__icon.is-text {
color: white;
background-color: #409eff;
border-color: #409eff;
}
}
.el-step__head {
.el-step__line {
top: 13px;
}
.el-step__icon.is-text {
width: 25px;
height: 30px;
.el-step__icon-inner {
font-size: 20px;
line-height: 30px;
}
}
}
.el-step__main {
.el-step__title {
font-size: 13px;
font-weight: 400;
line-height: 25px;
color: #666;
}
.el-step__description {
font-size: 13px;
color: #ccc;
}
}
}
}
}
::v-deep .card > .el-card {
width: calc(90% + 40px);
border-radius: 10px;
}
.card {
width: 100%;
// &>::v-deep(.crud){
// width: calc(90% + 40px);
// }
::v-deep(.el-card) {
// width: calc(90% + 40px);
.el-card__header {
background-color: #f9f9f9;
.card-header {
font-family: '微软雅黑 Bold', '微软雅黑 Regular', '微软雅黑', sans-serif;
font-weight: 700;
color: #666;
}
}
.el-card__body {
.avue-crud {
.el-card {
margin: 0 auto;
border-radius: 0;
.el-table__header {
height: 55px;
th {
height: 55px;
font-family: '微软雅黑 Bold', '微软雅黑 Regular', '微软雅黑', sans-serif;
font-size: 13px;
font-weight: 700;
color: #666;
background-color: #f2f2f2;
}
}
.el-table__body {
.el-table__row {
.el-table__cell {
font-size: 13px;
border-right: none;
}
}
}
}
}
}
}
}
}
.footer{
// padding: 0px 10p;
margin-top: 30px;
margin-bottom: 60px;
border: 1px solid rgb(233 233 233 / 100%);
border-radius: 10px;
box-shadow: 0 0 5px rgb(11 11 11 / 5.7%);
::v-deep .el-tabs__nav-wrap::after {
background: none !important;
}
::v-deep .el-tabs__nav-scroll {
background: #f9f9f9 !important;
border-radius: 10px 10px 0 0;
}
.tabs-box{
padding: 0 20px;
margin-top: 10px;
}
}
::v-deep .el-tabs__item{
font-family: '微软雅黑 Bold', '微软雅黑', sans-serif;
font-size: 16px;
font-style: normal;
font-weight: 700;
line-height: 32px;
}
::v-deep th.el-table__cell {
height: 55px;
font-family: '微软雅黑 Bold', '微软雅黑', sans-serif;
font-weight: 700;
color: #666 !important;
}
::v-deep .el-tabs .el-tabs__nav-wrap {
height: 60px;
.el-tabs__nav{
height: 60px;
.el-tabs__item{
height: 60px;
// line-height: 60px;
font-family: '微软雅黑 Bold', '微软雅黑 Regular', '微软雅黑', sans-serif;
font-size: 16px;
font-style: normal;
font-weight: 700;
line-height: 32px;
color: #666;
&.is-active{
color: #409eff;
}
}
}
}
</style>

View File

@@ -0,0 +1,305 @@
<template>
<div>
<div class="footer">
<!-- <div style="display: flex; align-items: center; margin-bottom: 20px">
<span class="span"></span><span>操作记录</span>
</div> -->
<div class="footer-list">
<el-steps :space="150" :active="czjlData.length" direction="vertical">
<template v-for="(item, index) in czjlData" :key="index">
<el-step :title="item.title" :description="item.description" last>
<template #title>
<div class="content flex h-100px">
<div class="img mt-10px"
><Icon icon="mingcute:user-3-fill" :size="25" style="color: #fff"
/></div>
<div class="w-[calc(100%-45px)] mt-6px mb-6px grid grid-rows-3">
<div class="content-top">
<div class="list-box-top-left">
<span style="font-size: 14px; color: #666">{{ item.name }}</span>
<p class="font" style="margin-left: 5px">{{ item.text }}</p>
</div>
<div class="list-box-top-right pr-20px mt-30px">
<!-- <div> -->
<span class="box"></span>
<span style="margin: 0 10px 0 5px">正常</span>
<span>完成进度50%</span>
<!-- </div> -->
</div>
</div>
<!-- <div class="content-bottom"> -->
<div>
<p class="text">{{ item.content }}</p>
</div>
<div class="lzgd">
<Icon icon="mingcute:time-line" :size="14" style="color: #999" />
<span style="color: #999 !important">{{ item.time }}</span>
</div>
<!-- </div> -->
</div>
</div>
</template>
</el-step>
</template>
</el-steps>
</div>
</div>
</div>
</template>
<script setup lang="ts">
const czjlData = ref([
{
title: '',
description: '08-23',
text: '销售经理',
name: '赵小刚',
content:
'在中台产品的研发过程中,会出现不同的设计规范和实现方式,但其中往往存在很多类似的页面和组件,这些类似的组件会被抽离成一套标准规范。',
gd: '工单标题',
time: '2020-12-23 22:31'
},
{
title: '',
description: '08-23',
text: '销售经理',
name: '赵小刚',
content:
'在中台产品的研发过程中,会出现不同的设计规范和实现方式,但其中往往存在很多类似的页面和组件,这些类似的组件会被抽离成一套标准规范。',
gd: '工单标题',
time: '2020-12-23 22:31'
},
{
title: '',
description: '08-23',
text: '销售经理',
name: '赵小刚',
content:
'在中台产品的研发过程中,会出现不同的设计规范和实现方式,但其中往往存在很多类似的页面和组件,这些类似的组件会被抽离成一套标准规范。',
gd: '工单标题',
time: '2020-12-23 22:31'
},
{
title: '',
description: '08-23',
text: '销售经理',
name: '赵小刚',
content:
'在中台产品的研发过程中,会出现不同的设计规范和实现方式,但其中往往存在很多类似的页面和组件,这些类似的组件会被抽离成一套标准规范。',
gd: '工单标题',
time: '2020-12-23 22:31'
},
{
title: '',
description: '08-23',
text: '销售经理',
name: '赵小刚',
content:
'在中台产品的研发过程中,会出现不同的设计规范和实现方式,但其中往往存在很多类似的页面和组件,这些类似的组件会被抽离成一套标准规范。',
gd: '工单标题',
time: '2020-12-23 22:31'
}
])
</script>
<style lang="scss" scoped>
.footer {
margin: 30px 50px;
margin-bottom: 50px;
.span {
display: inline-block;
width: 8.5px;
height: 19px;
margin-right: 10px;
background: #409eff;
}
.footer-list {
width: 100%;
// height: 200px;
// padding: 20px;
::v-deep(.el-steps) {
.el-step.is-vertical {
.el-step__head {
.el-step__line {
width: 1px;
margin-top: 25px;
background-color: #f2f2f2;
}
.el-step__icon {
width: 10px !important;
height: 10px;
margin-top: -20px;
margin-left: 7px;
overflow: hidden;
.el-step__icon-inner {
color: #fff;
}
}
}
.el-step__main {
margin-top: 2px;
.el-step__description.is-finish {
color: #999;
}
}
}
// .el-step:last-child {
// .el-step__head::after {
// position: absolute;
// top: 25px;
// right: 11px;
// z-index: 1;
// display: block;
// width: 1.6px;
// height: 110px;
// background-color: #f2f2f2;
// border-color: red;
// content: '';
// }
// }
}
.content {
position: absolute;
top: 35px;
left: 53px;
width: 95.5%;
padding:0 10px;
border-radius: 10px;
box-shadow: 0 0 5px rgb(0 0 0 / 9.8%);
.img {
display: flex;
width: 35px;
height: 35px;
margin-right: 10px;
background: #ccc;
border-radius: 50%;
justify-content: center;
align-items: center;
}
.content-top {
display: flex;
justify-content: space-between;
.list-box-top-left {
display: flex;
font-family: '微软雅黑', sans-serif;
font-size: 12px;
font-weight: 400;
color: #999;
align-items: center;
}
.list-box-top-right {
display: flex;
font-family: '微软雅黑', sans-serif;
font-size: 14px;
font-weight: 400;
line-height: 20px;
color: #666;
align-items: center;
.box {
display: inline-block;
width: 14px;
height: 14px;
background: #51d351;
border-radius: 50%;
}
}
}
// .content-bottom {
// margin-top: -10px;
// margin-left: 38px;
// font-size: 12px;
p {
padding: 0;
margin: 0;
}
.text {
margin: 5px 0;
font-family: MicrosoftYaHei, '微软雅黑 Regular', '微软雅黑', sans-serif;
font-size: 12px;
font-style: normal;
font-weight: 400;
line-height: 20px;
color: #666;
text-align: left;
}
.lzgd {
display: flex;
font-family: '微软雅黑', sans-serif;
font-size: 12px;
font-style: normal;
font-weight: 400;
color: #666;
text-align: left;
align-items: center;
}
}
// }
}
}
::v-deep(.el-steps) {
.el-step__head {
.el-step__line {
background-color: var(--el-color-info-light-7);
}
.el-step__icon {
width: 30px !important;
}
&.is-finish {
margin-top: 5px;
color: #f2f2f2 !important;
border-color: #f2f2f2 !important;
.el-step__line {
background-color: var(--el-color-primary);
}
}
}
.el-step:not(:last-child) {
.el-step__head {
&.is-process::before {
position: absolute;
top: calc(50% - 1px);
right: 0;
z-index: 1;
display: block;
width: 50%;
height: 2px;
background-color: var(--el-color-primary);
content: '';
}
}
}
}
::v-deep .el-step__icon.is-text {
// margin-top: -20px;
color: #666 !important;
border-color: #409eff !important;
}
.font {
font-family: MicrosoftYaHei, '微软雅黑 Regular', '微软雅黑', sans-serif;
}
</style>

View File

@@ -0,0 +1,267 @@
<template>
<div class="article">
<div
class="w-[calc(100%-80px)] h-110px flex items-center bg-#f9f9f9 b-1px b-solid b-#e9e9e9 pl-40px pr-40px"
>
<div>
<div class="h-36px flex items-center">
<div class="font-wryh font-700 text-20px c-#666666 mr-15px">
{{ data.htbt }}
</div>
<div class="flex mr-10px" v-if="data.sd && data.sd == '1'">
<Icon icon="solar:lock-linear"></Icon>
</div>
<div
class="w-52px h-20px bg-#0099ff rounded-2xl c-white flex justify-center items-center text-12px mr-10px"
v-if="data.zd && data.zd == '1'"
>
置顶
</div>
<div
class="w-52px h-20px bg-#ff7a8c rounded-2xl c-white flex justify-center items-center text-12px"
v-if="data.rm && data.rm == '1'"
>
热门
</div>
</div>
<div class="h-38.4px flex items-center">
<el-avatar :size="20" :src="data.cytx" />
<span class="font-wryh ml-10px text-14px c-#999999">{{ data.$create_user }}</span>
<span class="font-wryh ml-10px text-14px c-#999999 flex items-center">
<Icon icon="mingcute:time-line" :size="17"></Icon>
{{ data.create_time }}
</span>
</div>
</div>
<div class="ml-auto">
<el-button type="primary" plain style="width: 80px; height: 35px" @click="bjBtn">
<Icon icon="fa6-solid:pen" :size="15" class="mr-2px"></Icon>
编辑
</el-button>
</div>
</div>
<div class="w-[calc(100%-80px)] pl-40px pr-40px b-1px b-t-0 b-solid b-#e9e9e9">
<div class="pt-30px" v-html="vHtml" style="line-height: 32px"> </div>
<div class="w-100% text-right c-#999 font-wryh"> 最后编辑时间2020-11-24 10:00:00 </div>
<div class="mt-50px">
<div class="flex items-center mb-30px">
<div class="w-6px h-18px bg-#409EFF mr-8px"></div>
<span class="font-wryh font-700 c-#666666"> 发布评论 </span>
</div>
<div class="flex h-60px mb-10px bottom">
<el-input type="text" placeholder="请输入批阅内容" v-model="inputVal" />
<el-button type="primary" @click="fbBtn">发布</el-button>
</div>
</div>
<div>
<div>
<div class="flex items-center mt-40px mb-20px">
<div class="w-6px h-18px bg-#409EFF mr-8px"></div>
<span class="font-wryh font-700 c-#666666 mr-3px"> 评论记录 </span>
<span class="font-400 c-#666666"> 10 </span>
</div>
</div>
<el-alert v-for="item in defineData" :key="item.id" type="info" :closable="false">
<template #title>
<el-avatar :size="28" class="mr-5px" :src="item.imgUrl" />
<span class="c-#666666 mr-10px">{{ item.name }}</span>
<span class="c-#999999 text-12px">{{ item.time }}</span>
</template>
<template #default>
<span class="c-#999999">{{ item.content }}</span>
<div class="like flex">
<Icon
icon="iconamoon:like-bold"
class="mr-2px cursor-pointer"
:class="item.isLike ? 'c-red' : ''"
@click="likeClick(item.id)"
></Icon>
{{ item.like }}
</div>
</template>
</el-alert>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { formatDate } from '@/utils/formatTime'
interface Data {
htbt: string
create_time: string
$create_user: string
cytx: string
rm: string
sd: string
zd: string
}
const prop = defineProps<{
data: Data
hideFun: Function
}>()
const data = prop.data
const bjBtn = () => {
prop.hideFun!()
}
const vHtml = ref(
'<div id="u90044_text" class="text "> <p><span>近日在阿里云2020年云栖大会上阿里云智能网络产品研究员祝顺民重磅发布了多款网络新品其中之一就是应用负载均衡ALB。ALB产品定位应用层高级负载具备超强性能、安全可靠、面向云原生、即开即用等优势价值提供弹性自动伸缩、QUIC协议支持、基于内容的高级路由、自带DDoS安全防护、云原生应用、弹性灵活计费等产品能力满足越来越多元化的应用层负载需求。</span></p><br><p><span>说到负载均衡很多朋友或许都会想到经典负载均衡阿里云负载均衡SLB发布近十年为各行各业的用户提供强大稳定的负载分担能力解决大并发流量负载分担消除单点故障提高业务可用性。但随着企业和互联网业务高速发展业务形态和需求不断变化诸多业务场景已经无法单纯的用传统负载均衡来满足全部需求。在大互联网业务、电商大促、音视频、移动互联网应用、游戏业务、金融服务、云原生开发应用等场景中存在大量高性能、弹性、多协议七层转发、安全、云原生等需求急需新产品设计来满足。</span></p><p><span><br></span></p> </div>'
)
const defineData = ref([
{
id: 1,
imgUrl:
'https://oss.yckxt.com/chatgpt/upload/1/2024-11-06/1/f0ee8a3c7c9638a54940382568c9dpng_5.png',
name: '赵小刚',
time: '2019-03-23 22:31',
content: '非常不错的分享,对我们的工作很有参考价值。',
like: 100,
isLike: false
},
{
id: 2,
imgUrl:
'https://oss.yckxt.com/chatgpt/upload/1/2024-11-06/1/f0ee8a3c7c9638a54940382568c9dpng_5.png',
name: '赵小刚',
time: '2019-03-23 22:31',
content: '非常不错的分享,对我们的工作很有参考价值。',
like: 100,
isLike: false
},
{
id: 3,
imgUrl:
'https://oss.yckxt.com/chatgpt/upload/1/2024-11-06/1/f0ee8a3c7c9638a54940382568c9dpng_5.png',
name: '赵小刚',
time: '2019-03-23 22:31',
content: '非常不错的分享,对我们的工作很有参考价值。',
like: 100,
isLike: false
}
])
let likeIdList = ref<number[]>([])
const inputVal = ref('')
let dataLength = ref(0)
const fbBtn = () => {
if (!inputVal.value) return
dataLength.value = defineData.value?.length || 0
let endVal = defineData.value![dataLength.value - 1]
let id = endVal.id + 1
defineData.value![dataLength.value] = {
id: id,
imgUrl:
'https://oss.yckxt.com/chatgpt/upload/1/2024-11-06/1/f0ee8a3c7c9638a54940382568c9dpng_5.png',
name: '赵小刚',
time: formatDate(new Date(), 'YYYY-MM-DD HH:mm:ss'),
content: inputVal.value,
like: 0,
isLike: false
}
inputVal.value = ''
}
const likeClick = (id) => {
defineData.value = defineData.value.map((item) => {
if (id == item.id) {
let index = likeIdList.value.indexOf(id)
if (index == -1) {
likeIdList.value.push(item.id)
return {
...item,
like: item.like + 1,
isLike: true
}
} else {
likeIdList.value.splice(index, 1)
return {
...item,
like: item.like - 1,
isLike: false
}
}
}
return item
})
}
</script>
<style lang="scss" scoped>
.article {
.font-wryh {
font-family: '微软雅黑 Bold', '微软雅黑 Regular', '微软雅黑', sans-serif;
}
.bottom {
::v-deep(.el-input) {
border: 1px solid rgb(233 233 233 / 100%);
.el-input__wrapper {
border-radius: 0;
box-shadow: none;
}
&:hover {
border-color: #409eff;
}
}
.el-button {
width: 80px;
height: 60px;
font-family: '微软雅黑 Regular', '微软雅黑', sans-serif;
border-radius: 0;
}
}
::v-deep(.el-alert) {
height: 90px;
padding: 0 20px;
margin-bottom: 20px;
background-color: rgb(249 249 249 / 49.8%);
border: 1px solid rgb(233 233 233 / 100%);
border-radius: 0;
.el-alert__content {
height: 100%;
align-items: baseline;
.el-alert__title {
display: flex;
height: 50px;
font-family: '微软雅黑 Regular', '微软雅黑', sans-serif;
font-size: 14px;
font-weight: 400;
align-items: center;
}
.el-alert__description {
font-family: '微软雅黑 Regular', '微软雅黑', sans-serif;
font-size: 14px;
font-weight: 400;
.like {
position: absolute;
top: 50%;
right: 20px;
font-family: MicrosoftYaHei, '微软雅黑', sans-serif;
font-size: 12px;
color: #999;
transform: translateY(-50%);
}
}
.el-alert__close-btn {
font-size: 12px;
}
}
}
}
</style>

View File

@@ -0,0 +1,180 @@
<template>
<div class="w-80% m-auto search">
<div class="bg-white h-60px p-20px mt-10px flex items-center top b-1px b-solid b-#e9e9e9">
<div class="mr-15px">
<Icon icon="flowbite:messages-solid" :size="52" class="c-#999999"></Icon>
</div>
<div class="">
<div class="h-24px c-#666666"> 欢迎来到内部交流论坛 </div>
<div class="h-24px c-#999999 text-12px font-wryh flex items-center">
你可以自由选择你感兴趣的话题
</div>
</div>
<div class="ml-auto flex top-right">
<el-input v-model="inputValue" placeholder="输入搜索关键字" class="mr-20px h-35px" />
<Icon icon="ic:outline-search" :size="22" class="cursor-pointer search"></Icon>
<el-button type="primary" style="width: 100px; height: 35px" @click="inputVisible = true">
<Icon icon="vaadin:plus" :size="18"></Icon>
创建话题
</el-button>
</div>
</div>
<div class="bg-white b-1px b-solid b-#E9E9E9 w-100%">
<div
class="h-70px flex items-center pl-20px pr-20px"
style="border-bottom: 1px solid #e9e9e9"
>
<el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
<el-tab-pane label="最新话题" name="first"></el-tab-pane>
<el-tab-pane label="热门话题" name="second"></el-tab-pane>
</el-tabs>
<div class="ml-auto text-14px c-#999999" style="font-family: '微软雅黑', sans-serif">
总贴数量1000
</div>
</div>
<div class="w-[calc(100%-60px)] pl-30px pr-30px mt-20px">
<LowTable
:ref="(el) => (tabRef = el)"
tableId="1854716968965484545"
:enhanceData="tabEnhanceData"
>
</LowTable>
</div>
</div>
<el-dialog
v-model="inputVisible"
title="创建话题"
width="800"
:before-close="dialogHandleClose"
destroy-on-close
>
<FormView
formType="add"
handleType="returnData"
showType="view"
:showButton="true"
:enhanceData="{ updateDialog, type: 'add' }"
formId="1854442042421391362"
></FormView>
</el-dialog>
</div>
</template>
<script setup lang="ts">
import { FormView, LowTable } from '@/components/LowDesign/index'
import type { TabsPaneContext } from 'element-plus'
const inputValue = ref('')
const inputVisible = ref(false)
const updateDialog = () => {
inputVisible.value = false
tabRef.value.crudRef.refreshChange()
}
const dialogHandleClose = (done: () => void) => {
done()
}
const tabEnhanceData = ref({
type: 'view'
})
const tabRef = ref()
const activeName = ref('first')
const handleClick = (tab: TabsPaneContext, event: Event) => {
console.log(tab, event)
}
</script>
<style lang="scss" scoped>
.search {
.border-style {
border: 1px solid rgb(233 233 233 / 100%);
}
.font-wryh {
font-family: '微软雅黑 Bold', '微软雅黑 Regular', '微软雅黑', sans-serif;
}
.top {
margin-bottom: 20px;
::v-deep(.el-input) {
width: 250px;
.el-input__wrapper {
// color: rgb(204, 204, 204);
border-radius: 200px;
&:hover {
box-shadow: 0 0 0 1px var(--el-input-focus-border-color) inset;
}
}
}
.top-right {
position: relative;
.search {
position: absolute;
top: 50%;
left: 220px;
color: #999;
transform: translateY(-50%);
&:hover {
color: #409eff !important;
}
}
}
}
::v-deep(.el-tabs) {
.el-tabs__header {
margin: 0;
.el-tabs__nav-wrap {
&::after {
height: 0;
}
.el-tabs__nav-scroll {
.el-tabs__item {
width: 100px;
height: 70px;
padding: 0;
font-family: '微软雅黑 Bold', '微软雅黑 Regular', '微软雅黑', sans-serif;
font-size: 16px;
font-weight: 700;
color: #666;
&.is-active {
color: rgb(64 158 255);
}
}
.el-tabs__active-bar {
height: 1px;
}
}
}
}
}
.c-group {
::v-deep(.el-radio-button) {
.el-radio-button__inner {
width: 100px;
height: 30px;
border-width: 0;
}
&.is-active {
.el-radio-button__inner {
border-radius: 50px;
}
}
}
}
}
</style>

View File

@@ -0,0 +1,156 @@
<template>
<div class="riendshipForum-box">
<div class="bg-white h-60px p-20px mt-10px flex items-center top b-1px b-solid b-#e9e9e9">
<div class="mr-15px">
<Icon icon="flowbite:messages-solid" :size="52" class="c-#999999"></Icon>
</div>
<div class="">
<div class="h-24px c-#666666"> 欢迎来到内部交流论坛 </div>
<div class="h-24px c-#999999 text-12px font-wryh flex items-center">
你可以自由选择你感兴趣的话题
</div>
</div>
<div class="ml-auto flex top-right">
<el-input v-model="inputValue" placeholder="输入搜索关键字" class="mr-20px h-35px" />
<Icon
icon="ic:outline-search"
:size="22"
class="cursor-pointer search"
></Icon>
<el-button type="primary" style="width: 100px; height: 35px" @click="inputVisible = true">
<Icon icon="vaadin:plus" :size="18"></Icon>
创建话题
</el-button>
</div>
</div>
<div class="bg-white mt-20px b-1px b-solid b-#e9e9e9">
<div
class="h-70px flex items-center pl-20px pr-20px"
style="border-bottom: 1px solid #e9e9e9"
>
<div
class="text-18px font-700 h-19px flex items-center c-#666666 b-l-6px b-r-0 b-t-0 b-b-0 b-#409EFF b-solid pl-10px font-wryh"
>
讨论板块
</div>
<div class="ml-auto text-14px c-#999999" style="font-family: '微软雅黑', sans-serif">
总贴数量1000
</div>
</div>
<div>
<LowTable tableId="1854408557228961794" :enhanceData="tabEnhanceData"> </LowTable>
</div>
</div>
<el-dialog
v-model="inputVisible"
title="创建话题"
width="800"
:before-close="dialogHandleClose"
destroy-on-close
>
<FormView
formType="add"
handleType="returnData"
showType="view"
:showButton="true"
:enhanceData="{ updateDialog }"
formId="1854442042421391362"
></FormView>
</el-dialog>
</div>
</template>
<script lang="ts" setup>
import { LowTable } from '@/components/LowDesign/index'
defineOptions({ name: 'RiendshipForum' })
const inputValue = ref('')
const tabEnhanceData = ref({
type: 'view'
})
const inputVisible = ref(false)
const updateDialog = () => {
inputVisible.value = false
}
const dialogHandleClose = (done: () => void) => {
done()
}
</script>
<style lang="scss" scoped>
.riendshipForum-box {
width: 1200px;
min-height: 500px;
margin: 0 auto;
// border: 1px solid rgb(233 233 233 / 100%);
// box-shadow: 0 0 5px rgb(0 0 0 / 4.71%);
.font-wryh {
font-family: '微软雅黑 Bold', '微软雅黑 Regular', '微软雅黑', sans-serif;
}
.top {
::v-deep(.el-input) {
width: 250px;
.el-input__wrapper {
// color: rgb(204, 204, 204);
border-radius: 200px;
&:hover {
box-shadow: 0 0 0 1px var(--el-input-focus-border-color) inset;
}
}
}
.top-right {
position: relative;
.search {
position: absolute;
top: 50%;
left: 220px;
color: #999;
transform: translateY(-50%);
&:hover {
color: #409eff !important;
}
}
}
}
}
::v-deep(.el-overlay) {
.el-dialog {
border-radius: 5px;
.el-dialog__header {
padding: 18px 13px 18px 15px;
background-color: #f5f5f5;
border-radius: 5px 5px 0 0;
.el-dialog__title {
font-family: '微软雅黑 Bold', '微软雅黑 Regular', '微软雅黑', sans-serif;
font-size: 16px;
font-weight: bold;
color: #666;
}
.el-dialog__headerbtn {
height: 60px;
}
}
}
.el-drawer {
background-color: rgb(240 242 245 / 100%);
}
}
</style>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,123 @@
<template>
<div>
<el-card class="card-box">
<template #header>
<div class="card-header">
<span>员工管理</span>
</div>
</template>
<div class="flex" style="min-height: 450px">
<div class="flex-basis-200px flex-shrink-0">
<avue-tree
ref="tree"
:option="option"
:data="data"
v-model="form"
@node-expand="nodeExpand"
@node-contextmenu="nodeContextmenu"
@node-click="nodeClick"
>
</avue-tree>
</div>
<div class="flex-1" style="max-width: calc(100% - 220px)">
<LowTable tableId="1846121741006647298" :enhanceData="{ type: 'view' }"> </LowTable>
</div>
</div>
</el-card>
</div>
</template>
<script lang="ts" setup>
import { LowTable } from '@/components/LowDesign/index'
defineOptions({ name: 'StaffManagement' })
import { ElMessage } from 'element-plus'
const form = ref({})
const data = ref([
{
value: 0,
label: '一级部门',
children: [
{ value: 1, label: '一级部门1' },
{ value: 2, label: '一级部门2' },
{ value: 3, label: '一级部门3' },
{ value: 4, label: '一级部门4' }
]
},
{
value: 3,
label: '二级部门',
children: [
{ value: 4, label: '二级部门1' },
{ value: 5, label: '二级部门2' }
]
}
])
const option = ref({
defaultExpandAll: true,
filter: false,
formOption: {
labelWidth: 100,
column: [
{ label: '自定义项', prop: 'label' },
{ label: '测试', prop: 'test' }
]
}
})
const tree = ref()
onMounted(() => {
tree.value.setCurrentKey(0)
})
const nodeContextmenu = (data) => {
ElMessage.success(JSON.stringify(data))
}
const nodeExpand = (data) => {
ElMessage.success(JSON.stringify(data))
}
const nodeClick = (data) => {
ElMessage.success(JSON.stringify(data))
}
</script>
<style lang="scss" scoped>
::v-deep(.el-card) {
&.card-box {
border-radius: 10px;
}
.el-card__header {
font-family: '微软雅黑 Bold', '微软雅黑 Regular', '微软雅黑', sans-serif;
font-size: 15px;
font-weight: 700;
color: #666;
background-color: #f9f9f9;
// .el-card__body { }
}
}
::v-deep(.el-tree) {
.el-tree-node.is-current > .el-tree-node__content {
background-color: white;
}
.el-tree-node__content {
height: 40px;
.el-tree-node__expand-icon {
font-size: 16px;
}
.el-tree-node__label {
font-family: '微软雅黑', sans-serif;
}
}
}
</style>

View File

@@ -0,0 +1,333 @@
<template>
<div class="userManagement-box">
<div class="b-#F0F2F5 b-2px b-solid rounded-xl">
<FormView
formType="view"
handleType="returnData"
showType="view"
:defaultData="staffViewTopData.defaultData"
:showButton="false"
:formId="staffViewTopData.formId"
></FormView>
</div>
<div class="mt-20px pb-20px b-#F0F2F5 b-2px b-solid" style="border-radius: 5px">
<el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
<template v-for="item in tabsList" :key="item.labelKey">
<el-tab-pane :label="item.label" :name="item.labelKey">
<template v-if="item.formId">
<div style="padding: 5px 18px">
<FormView
:formType="item.formType ? item.formType : 'view'"
handleType="returnData"
showType="view"
:defaultData="item.defaultData"
:showButton="true"
:formId="item.formId"
></FormView>
</div>
</template>
<template v-else-if="item.tableId">
<div style="padding: 5px 18px">
<LowTable :tableId="item.tableId" :enhanceData="item.defaultData"> </LowTable>
</div>
</template>
<template v-else-if="!item.formId && !item.tableId">
<div style="padding: 30px 48px">
<div class="mb-26px text-14px">
<span
class="font-bold"
style="font-family: '微软雅黑 Bold', '微软雅黑 Regular', '微软雅黑', sans-serif"
>数据权限</span
>
<span>设置该角色的用户可以操作的数据的范围</span>
</div>
<div>
<el-radio-group v-model="radio" class="grid-cols-1" style="display: grid">
<el-radio :value="Ritem.value" v-for="Ritem in radioList" :key="Ritem.value">
<template #default>
<span class="inline-block w-170px text-14px">{{ Ritem.title }}</span>
<span class="text-13px c-#999999">{{ Ritem.introduce }} </span>
</template>
</el-radio>
</el-radio-group>
</div>
<div class="flex justify-center mt-80px">
<el-button type="primary" style="width: 140px; height: 40px" @click="sjxqCick">
保存
</el-button>
</div>
</div>
</template>
</el-tab-pane>
</template>
</el-tabs>
</div>
</div>
</template>
<script lang="ts" setup>
import { FormView, LowTable } from '@/components/LowDesign/index'
import type { TabsPaneContext } from 'element-plus'
import { ElMessage } from 'element-plus'
defineOptions({ name: 'UserManagement' })
const props = defineProps({
data: {
// 自定义的翻译文件
type: Object,
default: () => {}
},
controlView: {
type: Object
}
})
const controlView = ref(props.controlView)
const staffViewTopDefaultData = ref(props.data)
staffViewTopDefaultData.value = {
...staffViewTopDefaultData.value,
avatar_img:
'http://oss.yckxt.com/chatgpt/upload/1/2024-10-14/1/f0ee8a3c7c9638a54940382568c9dpng.png'
}
const staffViewTopData = ref({
formId: '1846457022071132161',
defaultData: staffViewTopDefaultData.value
})
const radio = ref(1)
interface TableList {
labelKey: string
label: string
formId?: string
tableId?: string
defaultData: object
formType?: 'add' | 'edit' | 'view'
showButton?: string
}
let tabsList = ref<TableList[]>([
{
labelKey: 'dlrz',
label: '登录日志',
tableId: '1846734665412726786',
defaultData: {
type: 'view'
}
},
{
labelKey: 'czjl',
label: '操作记录',
tableId: '1846747363458351106',
defaultData: {
type: 'view'
}
},
{
labelKey: 'czqx',
label: '操作权限',
formId: '1846489623477571585',
defaultData: {
ref: controlView.value
},
formType: 'edit',
showButton: 'true'
},
{
labelKey: 'sjqx',
label: '数据权限',
defaultData: {}
},
{
labelKey: 'zdqx',
label: '字段权限',
formId: '1846758342212648962',
defaultData: {
ref: controlView.value
},
formType: 'edit',
showButton: 'true'
}
])
const activeName = ref('dlrz')
const handleClick = (tab: TabsPaneContext, event: Event) => {
console.log(tab, event)
}
const radioList = ref([
{ title: '个人', introduce: '只能操作自己和下属的数据', value: 1 },
{ title: '所属部门', introduce: '能操作自己、下属、和自己所属部门的数据', value: 2 },
{
title: '所属部门及下属部门',
introduce: '所属部门及下属部门 能操作自己、下属和自己所属部门及其子部门的数据',
value: 3
},
{ title: '全公司', introduce: '能操作全公司的数据', value: 4 }
])
const sjxqCick = () => {
ElMessage({
message: '保存成功',
type: 'success'
})
controlView.value!.show = false
}
</script>
<style lang="scss" scoped>
::v-deep(.el-tabs) {
.el-tabs__nav-wrap {
height: 53px;
background-color: #f9f9f9;
.el-tabs__item {
height: 53px;
font-weight: bold;
line-height: 53px;
color: rgb(102 102 102);
&.is-active {
color: rgb(64 158 255);
}
}
&::after {
height: 1px;
}
}
.el-tabs__content {
.el-radio-group {
.el-radio {
height: 40px;
}
}
}
}
.left-bule-text {
margin-bottom: 20px;
font-family: '微软雅黑 Bold', '微软雅黑 Regular', '微软雅黑', sans-serif;
border-left: 6px solid #409eff;
}
::v-deep(.el-tag) {
width: 110px;
height: 35px;
margin-right: 10px;
font-size: 13px;
color: #999;
background-color: white;
border-color: #ebeef5;
&:hover {
background-color: #f5f5f5;
}
.el-icon {
font-size: 16px;
color: #999;
&:hover {
background-color: #f5f5f5;
}
}
}
.button-new-tag {
background-color: white;
border: none;
}
::v-deep(.el-overlay) {
.el-dialog {
border-radius: 5px;
.el-dialog__header {
padding: 13px 13px 13px 15px;
background-color: #f5f5f5;
border-radius: 5px 5px 0 0;
.el-dialog__title {
font-family: '微软雅黑 Bold', '微软雅黑 Regular', '微软雅黑', sans-serif;
font-size: 13px;
font-weight: bold;
color: #666;
}
.el-dialog__headerbtn {
height: 56.8px;
}
}
.el-dialog__body {
.el-form-item {
margin-bottom: 0;
.el-checkbox-group {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
.el-checkbox {
.el-checkbox__inner {
width: 13px;
height: 13px;
}
.el-checkbox__label {
font-size: 13px;
}
}
}
}
}
.el-dialog__footer {
padding: 12px 20px;
border-top: 1px solid #f0f0f0;
.el-button {
width: 70px;
height: 28px;
font-size: 10px;
color: #999;
background-color: #f9f9f9;
}
.el-button--primary {
color: white;
background-color: #409eff;
}
}
}
}
::v-deep .el-tabs .el-tabs__nav-wrap {
height: 60px;
.el-tabs__nav {
height: 60px;
.el-tabs__item {
height: 60px;
// line-height: 60px;
font-family: '微软雅黑 Bold', '微软雅黑 Regular', '微软雅黑', sans-serif;
font-size: 16px;
font-style: normal;
font-weight: 700;
line-height: 32px;
color: #666;
&.is-active {
color: #409eff;
}
}
}
}
</style>

View File

@@ -0,0 +1,555 @@
<template>
<div class="taskManagement-box flex rounded-xl">
<div class="flex-shrink-0 flex-basis-180px bg-#F9F9F9 taskManagement-left">
<div class="h-50px flex items-center ml-55px mt-20px text-14px c-#999999">
<Icon icon="ion:flag-outline" :size="15" class="mr-1px"></Icon>
任务分类
</div>
<el-menu
:default-active="menuDefaultActive"
class="el-menu-vertical-demo bg-#F9F9F9"
@open="menuHandleOpen"
@close="menuHandleClose"
>
<template v-for="item in meunList" :key="item.value">
<el-menu-item :index="item.value">
<span>{{ item.title }}</span>
</el-menu-item>
</template>
</el-menu>
</div>
<div class="flex-1 bg-white p-31px taskManagement-right" style="max-width: calc(100% - 180px)">
<div class="mt-10px flex items-center util">
<el-radio-group v-model="viewOrListRadio">
<el-radio-button label="看板视图" value="view" />
<el-radio-button label="列表显示" value="list" />
</el-radio-group>
<el-select v-model="selectValue" :fit-input-width="true">
<el-option
v-for="item in selectOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<el-button class="ml-auto w-100px" type="primary" @click="dialogDisplay = true">
<Icon icon="oi:plus" :size="11"></Icon>
<span>创建任务</span>
</el-button>
</div>
<div v-if="viewOrListRadio == 'view'" class="w-100% grid grid-cols-4 gap-x-15px mt-30px">
<div v-for="(LItem, LIndex) in viewList" :key="LIndex">
<div class="c-#666666 text-14px mb-15px">
<span
class="font-700"
style="font-family: '微软雅黑 Bold', '微软雅黑 Regular', '微软雅黑', sans-serif"
>
{{ LItem.title }}
</span>
<span class="ml-5px" style="font-family: '微软雅黑', sans-serif">
<span v-if="LItem.title == '今日任务'">0/</span>{{ LItem.len }}
</span>
</div>
<div v-for="item in LItem.list" :key="item.id" class="flex card-item">
<div class="h-29px flex items-center">
<div
v-if="ViewVhecked.indexOf(LItem.title + item.id) !== -1"
class="check flex items-center justify-center"
>
<Icon
icon="fa-solid:check"
:size="11"
@click="checkedClick(LItem.title + item.id)"
></Icon>
</div>
<div v-else @click="checkedClick(LItem.title + item.id)" class="nocheck"> </div>
</div>
<div class="grid grid-rows-3 h-100% ml-10px">
<div
class="text-14px flex items-center c-#666666 cursor-pointer title-hover"
:class="ViewVhecked.indexOf(LItem.title + item.id) !== -1 ? 'line-through' : ''"
@click="titleClick(item)"
>
{{ item.title }}点击查看详情
</div>
<div class="flex text-12px items-center">
<span>
{{ item.xmmc }}
</span>
<div class="c-#CCCCCC flex items-center ml-15px">
<Icon icon="mage:message" :size="14"></Icon>
<span class="ml-3px">{{ item.lys }}</span>
</div>
<div class="c-#CCCCCC flex items-center ml-5px">
<Icon icon="line-md:link" :size="14"></Icon>
<span class="ml-3px">{{ item.ljs }}</span>
</div>
</div>
<div class="flex items-center" :class="LItem.title == '未完成' ? 'c-#F56C6C' : ''">
<Icon icon="icon-park-outline:alarm-clock" :size="14"></Icon>
<span class="text-12px ml-3px"> {{ item.jzsjTit }}</span>
</div>
</div>
<div class="flex items-center justify-center flex-1">
<el-avatar :size="24" :src="item.tx" />
</div>
</div>
</div>
</div>
<div v-else-if="viewOrListRadio == 'list'" class="mt-20px">
<LowTable
:ref="(el) => (tableListRef = el)"
tableId="1847103675560071169"
:enhanceData="{ type: 'view' }"
>
</LowTable>
</div>
</div>
</div>
<div>
<div class="add-dialog">
<el-dialog
v-model="dialogDisplay"
title="新建任务"
width="550"
:before-close="dialogHandleClose"
>
<FormView
formType="add"
:ref="(el) => (dialogRef = el)"
handleType="returnData"
showType="view"
:showButton="false"
formId="1846825131881762817"
></FormView>
<template #footer>
<div class="dialog-footer">
<el-button @click="dialogDisplay = false">取消</el-button>
<el-button type="primary" @click="dialogSuccess"> 保存 </el-button>
</div>
</template>
</el-dialog>
</div>
<div class="row-dialog">
<el-dialog
v-model="rowDialog"
title="任务详情"
width="900px"
:before-close="dialogHandleClose"
>
<FormView
formType="edit"
handleType="returnData"
showType="view"
:showButton="false"
:defaultData="rowDefaultData"
formId="1850013430948507650"
></FormView>
</el-dialog>
</div>
</div>
</template>
<script lang="ts" setup>
import { FormView, LowTable } from '@/components/LowDesign/index'
import * as TableApi from '@/api/design/table'
import { formatDate } from '@/utils/formatTime'
defineOptions({ name: 'TaskManagement' })
const viewOrListRadio = ref('view')
const selectValue = ref('default')
watch(
() => selectValue.value,
(val) => {
console.log(val, '111')
}
)
watch(
() => viewOrListRadio.value,
(val) => {
console.log(val, '111')
}
)
interface Record {
fj?: string
jzsj?: Date
kssj?: Date
status?: string
xmmc?: string
tx?: string
title?: string
id?: string
lys?: string
ljs?: string
jzsjTit?: string
}
interface ViewList {
title: string
list?: Record[]
len?: number
}
const viewList = ref<ViewList[]>([])
let ViewVhecked = ref<any>([])
const checkedClick = (id) => {
let index = ViewVhecked.value.indexOf(id)
if (index === -1) {
ViewVhecked.value.push(id)
} else {
ViewVhecked.value.splice(index, 1)
}
}
const meunList = ref([
{ value: '1', title: '全部任务' },
{ value: '2', title: '我创建的任务' },
{ value: '3', title: '我参与的任务' },
{ value: '4', title: '下属的任务' },
{ value: '5', title: '关注的任务' }
])
const menuDefaultActive = ref('1')
const menuHandleOpen = (key: string, keyPath: string[]) => {
console.log(key, keyPath)
}
const menuHandleClose = (key: string, keyPath: string[]) => {
console.log(key, keyPath)
}
const selectOptions = [
{
value: 'default',
label: '按默认视图',
subItem: [
{ title: '今日任务', total: 0, completed: 0 },
{ title: '进行中', total: 0, completed: 0 },
{ title: '未完成', total: 0, completed: 0 },
{ title: '已完成', total: 0, completed: 0 }
]
},
{
value: 'degree',
label: '按紧要程度',
subItem: [
{ title: '重要', total: 0, completed: 0 },
{ title: '紧急', total: 0, completed: 0 },
{ title: '普通', total: 0, completed: 0 },
{ title: '较低', total: 0, completed: 0 }
]
},
{
value: 'endTime',
label: '按截止时间',
subItem: [
{ title: '已逾期', total: 0, completed: 0 },
{ title: '今天', total: 0, completed: 0 },
{ title: '三天内', total: 0, completed: 0 },
{ title: '七天内', total: 0, completed: 0 }
]
},
{
value: 'updateTime',
label: '按更新时间',
subItem: [
{ title: '今天', total: 0, completed: 0 },
{ title: '七天内', total: 0, completed: 0 },
{ title: '十五天', total: 0, completed: 0 },
{ title: '更远', total: 0, completed: 0 }
]
}
]
const dialogHandleClose = (done: () => void) => {
done()
}
const dialogDisplay = ref(false)
const rowDialog = ref(false)
const dialogRef = ref()
const tableListRef = ref()
const dialogSuccess = async () => {
const formRef = dialogRef.value.controlRef
const listRef = tableListRef.value.crudRef
const data = await formRef.handleSubmit(true)
if (data) {
listRef.refreshChange()
dialogDisplay.value = false
}
}
const rowDefaultData = ref({})
const titleClick = (row) => {
row.jzsj ? (row.jzsj = formatDate(row.jzsj)) : (row.jzsj = '')
row.kssj ? (row.kssj = formatDate(row.kssj)) : (row.kssj = '')
rowDefaultData.value = row
rowDialog.value = true
}
onMounted(async () => {
let { records } = await TableApi.getTableList(
'1847103675560071169',
{ pageNo: 1, pageSize: 40 },
false
)
const categorizedRecords: { [key: string]: Record[] } = {
今日任务: [],
进行中: [],
未完成: [],
已完成: []
}
records.forEach((ele) => {
const ljs = ele.fj ? (ele.fj.includes(',') ? ele.fj.split(',').length : 1) : 0
ele.ljs = ljs
ele.jzsjTit = ele.jzsj ? `${formatDate(ele.jzsj)} 截止` : ''
let keys: string[] = []
if (ele.kssj && formatDate(ele.kssj).startsWith('2024-10-03')) {
keys.push('今日任务')
}
let statusDictionary = [
{ id: 1, label: '进行中' },
{ id: 2, label: '已完成' },
{ id: 3, label: '未完成' }
]
statusDictionary.forEach((item) => {
if (ele.status == item.id) {
keys.push(item.label)
}
})
keys.forEach((item) => {
if (categorizedRecords[item]) {
categorizedRecords[item].push(ele)
if (item == '已完成') {
ViewVhecked.value.push('已完成' + ele.id)
}
}
})
})
for (const [title, list] of Object.entries(categorizedRecords)) {
viewList.value.push({
title,
list,
len: list.length
})
}
})
</script>
<style lang="scss" scoped>
.taskManagement-box {
min-height: 500px;
border-radius: 10px;
box-shadow: 0 0 5px rgb(0 0 0 / 4.71%);
.taskManagement-left {
border: 1px solid rgb(233 233 233 / 100%);
border-right: none;
border-radius: 10px 0 0 10px;
.el-menu {
background-color: rgb(255 255 255 / 0%);
border-right: none;
.is-active {
font-weight: bold;
background-color: #e7f0fa;
border-right: 3px solid #409eff;
}
.el-menu-item {
height: 50px;
padding-left: 55px;
font-size: 14px;
}
}
}
.taskManagement-right {
border: 1px solid rgb(233 233 233 / 100%);
border-radius: 0 10px 10px 0;
.util {
::v-deep(.el-radio-group) {
.el-radio-button {
.el-radio-button__inner {
display: flex;
width: 101px;
height: 35px;
font-family: MicrosoftYaHei, '微软雅黑 Regular', '微软雅黑', sans-serif;
font-size: 14px;
color: #999;
align-items: center;
justify-content: center;
}
&.is-active {
.el-radio-button__inner {
color: white;
}
}
}
}
::v-deep(.el-select) {
width: 239px;
margin-left: 20px;
.el-select__wrapper {
min-height: 35px;
font-size: 14px;
line-height: 30px;
}
}
.el-button {
height: 35px;
font-size: 14px;
}
}
.card-item {
height: 87px;
padding: 10px;
margin-bottom: 15px;
color: #999;
border-radius: 5px;
box-shadow: 0 0 5px rgb(153 153 153 / 34.9%);
.title-hover:hover {
color: rgb(51 51 51);
}
.check,
.nocheck {
width: 14px;
height: 14px;
cursor: pointer;
border-radius: 2px;
}
.check {
color: white;
background-color: #409eff;
border: 1px solid #409eff;
border-radius: 2px;
}
.nocheck {
border: 1px solid #ccc;
&:hover {
border-color: #409eff;
}
}
}
}
}
.add-dialog {
::v-deep(.el-overlay) {
.el-dialog {
border-radius: 5px;
.el-dialog__header {
padding: 13px 13px 13px 15px;
background-color: #f5f5f5;
border-radius: 5px 5px 0 0;
.el-dialog__title {
font-family: '微软雅黑 Bold', '微软雅黑 Regular', '微软雅黑', sans-serif;
font-size: 14px;
font-weight: bold;
color: #666;
}
.el-dialog__headerbtn {
height: 56.8px;
}
}
.el-dialog__body {
.el-form-item {
margin-bottom: 0;
.el-checkbox-group {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
.el-checkbox {
.el-checkbox__inner {
width: 14px;
height: 14px;
}
.el-checkbox__label {
font-size: 14px;
}
}
}
}
}
.el-dialog__footer {
padding: 12px 20px;
border-top: 1px solid #f0f0f0;
.el-button {
width: 70px;
height: 28px;
font-size: 10px;
color: #999;
background-color: #f9f9f9;
}
.el-button--primary {
color: white;
background-color: #409eff;
}
}
}
}
}
.row-dialog {
::v-deep(.el-overlay) {
.el-dialog__header {
height: 24.8px;
padding: 16px 10px 16px 16px;
font-size: 18px;
border-bottom: 1px solid rgb(240 240 240);
.el-dialog__headerbtn {
height: 58.6px;
}
}
}
}
::v-deep .el-select__placeholder {
font-family: '微软雅黑', sans-serif;
font-style: normal;
font-weight: 400;
color: #666;
text-align: left;
}
</style>
<style>
.el-select__popper {
.el-select-dropdown__item {
font-family: MicrosoftYaHei, '微软雅黑 Regular', '微软雅黑', sans-serif;
font-size: 14px;
&.is-selected {
font-weight: 100;
}
}
}
</style>

View File

@@ -0,0 +1,686 @@
<template>
<div>
<div class="w-100%" v-if="isShow">
<div class="search-box" :class="{'bj':!isTable}">
<div class="mt-4 ">
<el-input
v-model="input"
style="width: 900px"
clearable
placeholder="输入搜索关键字"
>
<template #append>
<div class="search-btn" @click="searchFun(true)">
<el-icon><Search /></el-icon>
<span style="margin-left: 3px;">搜索</span>
</div>
</template>
</el-input>
</div>
<div class="fhsyy" v-if="!isTable" @click="isTable=true,is_px=false,input=''">
<el-icon><Back /></el-icon>
<span style="margin-left: 5px">返回</span>
</div>
</div>
<div class="table" v-if="isTable">
<div class="table-header">
<span></span>
<span class="c-#666666">知识分类</span>
</div>
<LowTable :ref="(el)=>(customRef = el)" :tableId="tabbleDate.tableId" :enhanceData="tabbleDate.enhanceData" > </LowTable>
</div>
<div class="ssjg" v-else>
<template v-if="listData.length">
<div class="ssjg-top" >
<div class="ssjg-top-left">
<p>为您找到相关结果约{{total}} 搜索用时 (0.23)</p>
</div>
<div class="ssjg-top-right">
<span :class="{'color':is_px}" @click="searchFun(true)">默认排序</span>
<span :class="{'color':!is_px}" @click="searchFun(false)">按时间排序</span>
</div>
</div>
<template v-if="is_show">
<div v-loading="loading">
<div class="box" v-for="item in listData" :key="item.id">
<p class="box-title acitive" @click="viewFun(item)">{{item.title}}</p>
<p class="box-text">{{item.text}}</p>
<div class="box-lls">
<el-icon size="18"><View /></el-icon>
<span style="margin: 0 8px;">浏览</span>
<span>{{item.llcs}}</span>
</div>
</div>
</div>
<div class="page">
<el-pagination
v-model:current-page="currentPage"
v-model:page-size="pageSize"
:page-sizes="[10,20,30,40,50,100]"
:size="size"
:disabled="disabled"
background
layout="prev, pager, next,sizes "
:total="total"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
</div>
</template>
</template>
<template v-else>
<div class="null" v-loading="loading">
<div>
<img src="/img/null.svg" alt=""/>
<p class="ts">未查询到相关知识内容</p>
<p>建议您修改搜索关键词重新再试</p>
</div>
</div>
</template>
</div>
</div>
<div class="list" v-else>
<div class="list-left">
<div class="title">
<span></span>
<span @click="isShow=true,isTable=true,is_show=true" class="tabs">知识分类</span>
<span @click="is_show=true" class="tabs"> > 产品知识</span>
<span @click="is_show=false" v-if="!is_show" class="tabs"> > 内容详情 </span>
</div>
<template v-if="is_show">
<div v-loading="loading">
<div class="box" v-for="item in listData" :key="item.id">
<p class="box-title acitive" @click="viewFun(item)">{{item.title}}</p>
<p class="box-text">{{item.text}}</p>
<div class="box-lls">
<el-icon size="18"><View /></el-icon>
<span style="margin: 0 8px;">浏览</span>
<span>{{item.llcs}}</span>
</div>
</div>
</div>
<div class="page">
<el-pagination
v-model:current-page="currentPage"
v-model:page-size="pageSize"
:page-sizes="[10,50, 100, 200, 400]"
:size="size"
:disabled="disabled"
background
layout="prev, pager, next,sizes "
:total="total"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
</div>
</template>
<template v-else>
<div class="view" v-loading="loading">
<div class="top-box">
<p>{{objData.title}}</p>
<div class="top-box-text">
<el-icon size="16"><Clock /></el-icon>
<span style="margin: 0 12px 0 5px;">{{objData.time}}</span>
<el-icon size="16"><View /></el-icon>
<span style="margin: 0 5px;">浏览</span>
<span> {{objData.llcs}}</span>
</div>
</div>
<div class="html-text" v-html="objData.content"></div>
<div class="tips" v-if="is_fk">
<p>以上信息是否对您有帮助</p>
<div>
<el-button type="primary" style="padding: 19px 28px;" @click="is_fk=false">有帮助</el-button>
<el-button type="primary" style="padding: 19px 28px;" @click="is_fk=false" plain>没帮助</el-button>
</div>
</div>
<div class="tips" v-else>
<div class="fk">
<el-icon size="28px" color="#7ed96d" style="margin-right:10px"><CircleCheck /></el-icon>
<span>感谢您的反馈</span>
</div>
</div>
</div>
</template>
</div>
<div class="list-right">
<header class="header">
<p class="header-title">热门知识</p>
</header>
<template v-for="(item,index) in listData" :key="item.id">
<div class="rm" v-if="index < 6">
<p class="rm-title acitive" @click="viewFun(item)">{{item.title}}</p>
<p class="rm-text">{{item.text}}</p>
</div>
</template>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { Search,View,Clock,CircleCheck,Back } from '@element-plus/icons-vue'
import {getTableList,updateTableData} from '@/api/design/table/index'
import type { ComponentSize } from 'element-plus'
import { formatDate } from '@/utils/formatTime'
const isShow = ref<any>(true)
const input = ref('')
const customRef = ref()
const size = ref<ComponentSize>('default')
const loading = ref(false)
const is_show = ref(true)
const is_fk = ref(true)
const isTable = ref(true)
const is_px = ref(true)
//知识分类点击
const clickFun = () =>{
isShow.value = false
initDate({ pageNo: 1 , pageSize: 10 })
}
const tabbleDate = ref({
label:'知识分类',
type:'table',
defaultData:{},
tableId:'1854438272522235905',
enhanceData: { hideHeader: 'disabled',clickFun}
})
//搜索
const searchFun = (type) =>{
isTable.value = false
is_px.value = type
initDate(type ? { pageNo: 1 , pageSize: 10,title:input.value } : { pageNo: 1 , pageSize: 10,column: "create_time",order: "asc"})
}
const listData = ref<any>([])
const pageSize = ref(10)
const total = ref()
//初始化数据
const initDate = (data) =>{
new Promise(async (resolve) => {
loading.value = true
await getTableList('1854438272522235905',data,false).then((res)=>{
listData.value = res.records || []
total.value = res.total
loading.value = false
resolve(res.records)
})
})
}
//分页
const currentPage = ref(1)
const disabled = ref(false)
const handleSizeChange = (val: number) => {
pageSize.value = val
initDate({ pageNo: 1 , pageSize: val })
}
const handleCurrentChange = (val: number) => {
initDate({ pageNo: val , pageSize: 10 })
}
//详情
const objData = ref()
const viewFun = (data) =>{
loading.value = true
isShow.value = false
is_show.value = false
data.time = formatDate(data.create_time,'YYYY-MM-DD HH:mm:ss')
data.llcs = ++data.llcs
objData.value = data
updateTableData('1854438272522235905',data)
loading.value = false
}
onMounted(()=>{
})
</script>
<style lang="scss" scoped>
.search-box{
position: relative;
display: flex;
height: 180px;
background: #FFF;
align-items: center;
justify-content: center;
::v-deep .el-input-group__append {
padding: 0;
.search-btn{
display: flex;
padding: 4px 19px;
font-family: "微软雅黑", sans-serif;
font-size: 14px;
font-weight: 400;
color: #fff;
background: #409eff;
border-top-right-radius: 5px;
border-bottom-right-radius: 5px;
align-items: center;
justify-content: center;
}
}
.fhsyy{
position: absolute;
top: 10px;
left: 20px;
display: flex;
font-size: 12px;
color: #666;
align-items: center;
cursor: pointer;
}
.fhsyy:hover{
color: #409eff;
}
}
.table{
width:100%;
margin-top: 20px;
.table-header span:nth-child(1){
display: inline-block;
width: 5.5px;
height: 17px;
margin-right: 7px;
background: #409eff;
}
.table-header{
display: flex;
align-items: center;
margin: 20px 0;
font-family: '微软雅黑 Bold', '微软雅黑 Regular', '微软雅黑', sans-serif;
font-size: 18px;
font-style: normal;
font-weight: 700;
line-height: 20px;
text-align: left;
}
}
.ssjg{
padding: 32px;
background: #fff;
border: 1px solid rgb(233 233 233 / 100%);
border-top: 0;
.ssjg-top{
display: flex;
padding: 6px 0;
justify-content: space-between;
align-items: center;
margin-bottom: 33px;
.ssjg-top-left{
p{
padding: 0;
margin: 0;
font-family: '微软雅黑', sans-serif;
font-size: 14px;
font-style: normal;
font-weight: 400;
line-height: 28px;
color: #999;
text-align: left;
}
}
.ssjg-top-right{
span{
display: inline-block;
padding: 5.5px 22px;
font-family: '微软雅黑', sans-serif;
font-size: 14px;
font-style: normal;
font-weight: 400;
letter-spacing: normal;
color: #666;
border-radius: 20px;
}
}
}
.null{
display: flex;
min-height: 410px;
background: #fff;
align-items: center;
justify-content: center;
p{
padding: 0;
margin: 0;
font-family: '微软雅黑', sans-serif;
font-size: 14px;
font-style: normal;
font-weight: 400;
line-height: 28px;
color: #999;
text-align: center;
}
.ts{
font-family: '微软雅黑 Bold', '微软雅黑 Regular', '微软雅黑', sans-serif !important;
font-size: 16px !important;
font-weight: 700 !important;
color: #666 !important;
}
}
}
.list{
display: flex;
gap: 25px;
.list-left{
padding: 40px;
flex: 8;
background: #fff;
.title span:nth-child(1){
display: inline-block;
width: 5.2px;
height: 16px;
margin-right: 5px;
background: #409eff;
}
.title{
display: flex;
margin-bottom: 30px;
font-family: '微软雅黑', sans-serif;
font-size: 14px;
font-weight: 400;
color: #666;
align-items: center;
}
// .box{
// position: relative;
// width: 100%;
// padding-bottom: 20px ;
// border-bottom: 1px solid rgb(242 242 242 / 100%);
// p{
// padding: 0;
// margin: 0;
// }
// .box-title{
// font-family: "微软雅黑 Bold", "微软雅黑 Regular", "微软雅黑", sans-serif;
// font-size: 18px;
// font-style: normal;
// font-weight: 700;
// line-height: 30px;
// color:#666;
// cursor: pointer;
// }
// .box-text{
// font-family: MicrosoftYaHei, '微软雅黑', sans-serif;
// font-size: 14px;
// font-style: normal;
// font-weight: 400;
// line-height: 30px;
// color: #999;
// text-align: left;
// }
// .box-lls{
// position: absolute;
// right: 50px;
// bottom: 50px;
// display: flex;
// font-family: '微软雅黑', sans-serif;
// font-size: 12px;
// font-weight: 400;
// color: #999;
// align-items: center;
// }
// }
// .page{
// display: flex;
// padding: 20px;
// justify-content: center;
// }
.view{
.top-box{
padding-bottom: 10px;
border-bottom: 1px solid rgb(242 242 242 / 100%);
p{
padding: 0;
margin: 0;
font-family: '微软雅黑 Bold', '微软雅黑 Regular', '微软雅黑', sans-serif;
font-size: 20px;
font-weight: 700;
line-height: 36px;
color: #666;
text-transform: none;
word-wrap: break-word;
}
.top-box-text{
display: flex;
font-family: MicrosoftYaHei, '微软雅黑', sans-serif;
font-size: 14px;
font-weight: 400;
line-height: 36px;
color: #999;
align-items: center;
}
}
.html-text{
font-family: MicrosoftYaHei, '微软雅黑', sans-serif;
font-size: 14px;
font-style: normal;
font-weight: 400;
line-height: 28px;
color: #666;
text-align: left;
}
.tips{
display: flex;
padding: 19px;
background:#f9f9f9;
border: 1px solid rgb(233 233 233 / 100%);
justify-content: space-between;
align-items: center;
p{
padding: 0;
margin: 0;
font-family: '微软雅黑', sans-serif;
font-size: 18px;
font-style: normal;
font-weight: 400;
line-height: 36px;
color: #666;
text-align: left;
}
.fk{
display: flex;
align-items: center;
span{
font-family: '微软雅黑 Bold', '微软雅黑 Regular', '微软雅黑', sans-serif;
font-size: 14px;
font-style: normal;
font-weight: 700;
line-height: 36px;
color: #666;
text-align: left;
}
}
}
}
}
.list-right{
flex: 2;
background: #fff;
.header{
display: flex;
height: 50px;
align-items: center;
padding: 0 20px;
border-bottom: 1px solid rgb(233 233 233 / 100%);
.header-title{
padding: 0;
margin: 0;
font-family: '微软雅黑 Bold', '微软雅黑 Regular', '微软雅黑', sans-serif;
font-size: 14px;
font-style: normal;
font-weight: 700;
line-height: 20px;
color: #666;
text-align: left;
}
}
.rm{
padding: 15px 0;
margin: 0 20px;
border-bottom: 1px solid rgb(233 233 233 / 100%);
p{
padding: 0;
margin: 0;
}
.rm-title{
font-family: "微软雅黑 Bold", "微软雅黑 Regular", "微软雅黑", sans-serif;
font-size: 16px;
font-style: normal;
font-weight: 700;
line-height: 28px;
color: #666;
text-align: left;
text-transform: none;
word-wrap: break-word;
cursor: pointer;
visibility: inherit;
}
.rm-text{
font-family: MicrosoftYaHei, '微软雅黑', sans-serif;
font-size: 14px;
font-style: normal;
font-weight: 400;
line-height: 24px;
color: #999;
text-align: left;
text-transform: none;
word-wrap: break-word;
visibility: inherit;
}
}
}
}
.box{
position: relative;
width: 100%;
padding: 10px ;
border-bottom: 1px solid rgb(242 242 242 / 100%);
p{
padding: 0;
margin: 0;
}
.box-title{
display: inline-block;
font-family: "微软雅黑 Bold", "微软雅黑 Regular", "微软雅黑", sans-serif;
font-size: 18px;
font-style: normal;
font-weight: 700;
line-height: 30px;
color:#666;
cursor: pointer;
}
.box-text{
font-family: MicrosoftYaHei, '微软雅黑', sans-serif;
font-size: 14px;
font-style: normal;
font-weight: 400;
line-height: 30px;
color: #999;
text-align: left;
}
.box-lls{
position: absolute;
right: 50px;
bottom: 50px;
display: flex;
font-family: '微软雅黑', sans-serif;
font-size: 12px;
font-weight: 400;
color: #999;
align-items: center;
}
}
.page{
display: flex;
padding: 20px;
justify-content: center;
}
.acitive:hover{
color: #409eff !important;
}
.tabs:hover{
color: #409eff !important;
cursor: pointer;
}
.bj{
background: #f9f9f9 !important;
border: 1px solid rgb(233 233 233 / 100%);
}
.color{
color: #fff !important;
background: #409eff;
}
::v-deep .el-card {
background-color: rgba($color: #000, $alpha: 0%) !important;
}
::v-deep .el-input__wrapper{
border-right:0;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
box-shadow: 0 0 0 1px #409eff inset;
}
</style>

View File

@@ -0,0 +1,343 @@
<template>
<div class="TeamDetails-box rounded-xl">
<div class="flex border-box p-20px h-110px items-center">
<div class="mr-15px">
<el-avatar class="avatar" :size="60" :src="PropsData.tx" />
</div>
<div class="flex">
<div>
<div class="text-18px font-700 c-#666666 font-wryh h-28px flex items-center">
{{ PropsData.name }}
</div>
<div class="text-14px c-#999999 flex items-center w-90%" style="line-height: 28px">
{{ PropsData.tdjs }}
</div>
</div>
<div class="flex items-center">
<el-button type="primary" @click="dialogBjtd = true">
<Icon icon="fa-solid:pen" class="mr-3px"></Icon>
编辑团队
</el-button>
<el-button @click="dialogDel = true">
<Icon icon="ic:sharp-delete" class="mr-3px"></Icon>
删除团队
</el-button>
</div>
</div>
</div>
<div class="flex w-100% mt-20px items-start">
<!-- -->
<div class="flex-shrink-0 w-70% mr-10px border-box p-20px">
<div class="h-60px flex items-center">
<div
class="font-wryh font-700 c-#666666 text-14px pl-10px"
style="border-left: 6px solid #409eff"
>
数据统计
</div>
</div>
<LowTable tableId="1852234473116233730" :enhanceData="{ type: 'view' }"> </LowTable>
<div class="h-60px flex items-center">
<div
class="font-wryh font-700 c-#666666 text-14px pl-10px"
style="border-left: 6px solid #409eff"
>
团队动态
</div>
</div>
<div
v-for="(item, index) in tddtList"
:key="index"
class="flex pl-20px h-70px items-center"
style="border-bottom: 1px solid rgb(233 233 233 / 100%)"
>
<div class="mr-20px">
<el-avatar v-if="item.avatar" class="avatar" :size="35" :src="item.avatar" />
<el-avatar
v-else
class="avatar"
:size="35"
src="https://oss.yckxt.com/chatgpt/upload/1/2024-10-30/1/f0ee8a3c7c9638a54940382568c9dpng_3.png"
/>
</div>
<div style="font-family: MicrosoftYaHei, '微软雅黑 Regular', '微软雅黑', sans-serif">
<div claas="h-24px flex items-center">
<span class="mr-5px"> {{ item.xm }} </span>
<template v-if="item.sjType == 0">
<span class="mr-5px c-#409EFF"> {{ item.blueText }} </span>
<span class="c-#666666"> {{ item.text }} </span>
</template>
<template v-else-if="item.sjType == 1">
<span class="mr-5px c-#666666"> {{ item.text }}</span>
<span class="c-#409EFF"> {{ item.blueText }} </span>
</template>
</div>
<div class="text-12px h-24px flex items-center c-#999999">几秒前</div>
</div>
</div>
<div class="h-100px pb-10px flex items-center justify-center ">
<el-button round class="w-120px" style="height: 35px;">查看更多</el-button>
</div>
</div>
<div class="w-25% ml-10px cylb border-box">
<el-card>
<template #header>
<div class="flex h-60px items-center justify-between pl-20px pr-20px bg-#F9F9F9">
<div class="text-16px c-#666666 font-wryh font-700"> 成员列表 </div>
<div>
<el-button-group @click="dialogDel = true">
<el-button style="width: 50px; height: 35px">
<Icon icon="formkit:left" class="c-#999999"></Icon>
</el-button>
<el-button style="width: 50px; height: 35px">
<Icon icon="formkit:right" class="c-#999999"></Icon>
</el-button>
</el-button-group>
</div>
</div>
</template>
<div
v-for="(item, index) in cylbList"
:key="index"
class="h-70px flex items-center pl-20px pr-20px"
style="border-bottom: 1px solid rgb(242 242 242 / 100%)"
>
<el-avatar class="avatar" :size="35" :src="item" />
<span class="ml-10px c-#666666 font-700 font-wryh">小明</span>
<span class="ml-10px c-#999999 font-wryh">销售总监</span>
<Icon
class="ml-auto c-#999999 cursor-pointer"
icon="mingcute:delete-line"
@click="iconClick"
></Icon>
</div>
</el-card>
</div>
</div>
</div>
<div class="dialog-bjtd">
<el-dialog v-model="dialogBjtd" title="创建团队" width="720px" :before-close="handleClose">
<FormView
formType="add"
handleType="returnData"
showType="view"
:showButton="false"
:defaultData="PropsData"
formId="1852168337334951938"
></FormView>
<template #footer>
<div class="dialog-footer">
<el-button @click="dialogBjtd = false">取消</el-button>
<el-button type="primary" @click="dialogBjtdClick"> 保存 </el-button>
</div>
</template>
</el-dialog>
</div>
<div class="dialog-czqr">
<el-dialog v-model="dialogDel" title="操作确认" width="450" :before-close="handleClose">
<div class="flex p-20px h-100px">
<div class="w-50px h-50px flex justify-center items-center">
<el-avatar
class="bg-white"
:size="27"
src="http://oss.yckxt.com/chatgpt/upload/1/2024-10-14/1/mdi--question-mark-circle-outline (1).png"
/>
</div>
<div class="mt-15px">
<div class="text-16px c-#666666 font-700 h-28px">是否确定删除数据</div>
<div class="c-#999999 h-28px">是否确定删除数据</div>
</div>
</div>
<template #footer>
<div class="dialog-footer">
<el-button @click="dialogDel = false">取消</el-button>
<el-button type="primary" @click="dialogDelClick"> 确定 </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script lang="ts" setup>
import { FormView, LowTable } from '@/components/LowDesign/index'
import { ElMessage } from 'element-plus'
defineOptions({ name: 'TeamDetails' })
const props = defineProps({
data: {
// 自定义的翻译文件
type: Object,
default: () => {}
}
})
const PropsData = props.data
const cylbList = ref([])
cylbList.value = PropsData.cytx.split(',')
const dialogBjtd = ref(false)
const dialogBjtdClick = () => {
dialogBjtd.value = false
ElMessage({
message: '保存成功',
type: 'success'
})
}
const handleClose = (done: () => void) => {
done()
}
const dialogDel = ref(false)
const iconClick = () => {
dialogDel.value = true
}
const dialogDelClick = () => {
dialogDel.value = false
ElMessage({
message: '删除成功',
type: 'success'
})
}
const tddtList = ref([
{
avatar:
'https://oss.yckxt.com/chatgpt/upload/1/2024-10-30/1/f0ee8a3c7c9638a54940382568c9dpng_3.png',
xm: '赵小刚',
blueText: '将 5 月日常迭代',
text: '更新至已发布状态',
fbTime: '几秒前',
sjType: 0
},
{
avatar:
'https://oss.yckxt.com/chatgpt/upload/1/2024-10-30/1/f0ee8a3c7c9638a54940382568c9dpng_3.png',
xm: '赵小刚',
blueText: '将 5 月日常迭代',
text: '更新至已发布状态',
fbTime: '几秒前',
sjType: 1
},
{
avatar: 'http://oss.yckxt.com/chatgpt/upload/1/2024-10-30/1/formkit--people.png',
xm: '赵小刚',
blueText: '将 5 月日常迭代',
text: '更新至已发布状态',
fbTime: '几秒前',
sjType: 0
},
{
avatar: '',
xm: '赵小刚',
blueText: '将 5 月日常迭代',
text: '更新至已发布状态',
fbTime: '几秒前',
sjType: 1
}
])
</script>
<style lang="scss" scoped>
.TeamDetails-box {
min-height: 500px;
.font-wryh {
font-family: '微软雅黑 Bold', '微软雅黑 Regular', '微软雅黑', sans-serif;
}
.border-box {
border: 1px solid rgb(233 233 233 / 100%);
border-radius: 10px;
box-shadow: 0 0 5px rgb(0 0 0 / 4.71%);
.avatar {
background-color: white;
}
}
.cylb {
::v-deep(.el-card) {
border: none;
border-radius: 10px;
box-shadow: none;
.el-card__header {
padding: 0;
}
.el-card__body {
padding: 0;
padding-bottom: 10px;
}
}
}
}
.dialog-bjtd,
.dialog-czqr {
::v-deep(.el-overlay) {
.el-dialog {
border-radius: 5px;
.el-dialog__header {
display: flex;
height: 50px;
padding-top: 0;
padding-bottom: 0;
background-color: rgb(245 245 245 / 100%);
border-radius: 5px 5px 0 0;
box-shadow: 0 1px 1px rgb(233 233 233 / 100%);
align-items: center;
.el-dialog__title {
font-family: '微软雅黑 Bold', '微软雅黑 Regular', '微软雅黑', sans-serif;
font-size: 14px;
font-weight: 700;
color: #666;
}
.el-dialog__headerbtn {
display: flex;
height: 50px;
align-items: center;
justify-content: center;
.el-icon {
color: #999;
}
}
}
.el-dialog__footer {
height: 60px;
padding: 15px 20px;
box-shadow: 0 1px 1px 0 rgb(233 233 233 / 100%) inset;
.el-button {
width: 80px;
height: 30px;
padding: 5px 15px;
font-family: MicrosoftYaHei, '微软雅黑 Regular', '微软雅黑', sans-serif;
font-size: 12px;
}
}
}
}
}
.dialog-czqr {
::v-deep(.el-overlay) {
.el-dialog__body {
.el-avatar {
background-color: white;
}
}
}
}
</style>

View File

@@ -0,0 +1,394 @@
<template>
<div class="userManagement-box">
<div class="b-#F0F2F5 b-2px b-solid rounded-xl">
<FormView
formType="view"
handleType="returnData"
showType="view"
:defaultData="userViewTopData.defaultData"
:showButton="false"
:formId="userViewTopData.formId"
></FormView>
</div>
<div class="mt-20px pb-20px b-#F0F2F5 b-2px b-solid" style="border-radius: 5px">
<el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
<template v-for="item in tabsList" :key="item.labelKey">
<el-tab-pane :label="item.label" :name="item.labelKey">
<template v-if="item.lowDesign.type == 'design' && item.lowDesign.formId">
<FormView
formType="view"
handleType="returnData"
showType="view"
:defaultData="item.lowDesign?.defaultData"
:showButton="false"
:formId="item.lowDesign.formId"
></FormView>
</template>
<template v-if="item.lowDesign.type == 'exploit' && item.lowDesign.tableId">
<div style="padding: 5px 18px">
<LowTable
:tableId="item.lowDesign.tableId"
:enhanceData="item.lowDesign?.defaultData"
>
</LowTable>
</div>
</template>
<template v-if="item.lowDesign.type == 'designAndExploit' && item.lowDesign.formId">
<FormView
formType="view"
handleType="returnData"
showType="view"
:defaultData="item.lowDesign?.defaultData"
:showButton="false"
:formId="item.lowDesign.formId"
></FormView>
<div class="ml-28px mr-28px">
<div class="mt-22px font-700 text-14px c-#666666 left-bule-text">
<span class="pl-8px">用户标签</span>
</div>
<div class="flex">
<el-tag
v-for="tag in dynamicTags"
:key="tag"
closable
:disable-transitions="false"
@close="tagHandleClose(tag)"
>
{{ tag }}
</el-tag>
<el-button
v-if="!inputVisible"
class="button-new-tag"
@click="inputVisible = true"
>
<Icon icon="ic:twotone-plus" class="text-#409EFF"></Icon>
<span class="text-#409EFF text-14px">添加标签</span>
</el-button>
</div>
<div class="mt-38px font-700 text-14px c-#666666 left-bule-text">
<span class="pl-8px">收货地址</span>
</div>
<div>
<LowTable tableId="1846073998846337026" :enhanceData="{ type: 'view' }">
</LowTable>
</div>
</div>
</template>
</el-tab-pane>
</template>
</el-tabs>
</div>
<el-dialog
v-model="inputVisible"
title="标签设置"
width="600"
:before-close="dialogHandleClose"
destroy-on-close
>
<FormView
formType="add"
:ref="(el) => (yhxqRef = el)"
handleType="returnData"
showType="view"
:showButton="false"
formId="1845041920745218050"
></FormView>
<template #footer>
<div class="dialog-footer">
<el-button @click="inputVisible = false">取消</el-button>
<el-button type="primary" @click="dialogSuccess"> 确认 </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script lang="ts" setup>
import { FormView, LowTable } from '@/components/LowDesign/index'
import type { TabsPaneContext } from 'element-plus'
defineOptions({ name: 'UserManagement' })
const props = defineProps({
data: {
// 自定义的翻译文件
type: Object,
default: () => {}
}
})
const userViewTopDefaultData = ref(props.data)
userViewTopDefaultData.value = {
...userViewTopDefaultData.value,
avatar_img:
'http://oss.yckxt.com/chatgpt/upload/1/2024-10-14/1/f0ee8a3c7c9638a54940382568c9dpng.png'
}
const userViewTopData = ref({
formId: '1845673651634458625',
defaultData: userViewTopDefaultData.value
})
let tabsList = ref([
{
labelKey: 'yhxq',
label: '用户详情',
lowDesign: {
formId: '1845757477997731842',
type: 'designAndExploit',
defaultData: {
...props.data,
cs: '220000,220100,220102',
czz: '100',
dlcs: '100',
fields_8038839: '统计信息',
fields_9105030: '用户资料',
fs: '100',
gxqm: '一个有个性的男子',
gz: '100',
id: 'id',
scht: '100',
scpj: '100',
scsp: '100',
sczt: '100',
sjhm: '18088889999',
sppj: '100',
sr: '2016-10-18',
sycjcs: '100',
thjl: '100',
xb: '1',
xhdfl: '服装、餐厨',
yhj: '100',
yqhy: '100',
zhdl: '2024-08-22 22:10:00',
zy: '学生'
}
}
},
{
labelKey: 'ddjl',
label: '订单记录',
lowDesign: {
tableId: '1844275960258019330',
type: 'exploit',
defaultData: {
type: 'view'
}
}
},
{
labelKey: 'jfjl',
label: '积分记录',
lowDesign: {
tableId: '1846095079682482177',
type: 'exploit',
defaultData: {}
}
},
{
labelKey: 'dlrz',
label: '登录日志',
lowDesign: {
tableId: '1846100518918823938',
type: 'exploit',
defaultData: {}
}
},
{
labelKey: 'czjl',
label: '操作记录',
lowDesign: {
tableId: '1846103236139950082',
type: 'exploit',
defaultData: {}
}
}
])
const activeName = ref('yhxq')
const handleClick = (tab: TabsPaneContext, event: Event) => {
console.log(tab, event)
}
const dynamicTags = ref(['标签名称一', '标签名称二', '标签名称三', '标签名称四'])
const inputVisible = ref(false)
const yhxqRef = ref()
const tagHandleClose = (tag: string) => {
dynamicTags.value.splice(dynamicTags.value.indexOf(tag), 1)
}
const dialogHandleClose = (done: () => void) => {
done()
}
const dialogSuccess = async () => {
const formRef = yhxqRef.value.controlRef
const data = await formRef.handleSubmit(true)
let bq = data.$tjbq
if (bq) {
if (bq.indexOf('|') == -1) {
dynamicTags.value.push(bq)
} else {
let bqList = bq.split('|')
bqList.forEach((ele) => {
dynamicTags.value.push(ele)
})
}
}
inputVisible.value = false
}
</script>
<style lang="scss" scoped>
::v-deep(.el-tabs) {
.el-tabs__nav-wrap {
height: 53px;
background-color: #f9f9f9;
.el-tabs__item {
height: 53px;
font-weight: bold;
line-height: 53px;
color: rgb(102 102 102);
&.is-active {
color: rgb(64 158 255);
}
}
&::after {
height: 1px;
}
}
}
.left-bule-text {
margin-bottom: 20px;
font-family: '微软雅黑 Bold', '微软雅黑 Regular', '微软雅黑', sans-serif;
border-left: 6px solid #409eff;
}
::v-deep(.el-tag) {
width: 120px;
height: 40px;
margin-right: 10px;
font-size: 14px;
color: #999;
background-color: white;
border-color: #ebeef5;
&:hover {
background-color: #f5f5f5;
}
.el-icon {
font-size: 16px;
color: #999;
&:hover {
background-color: #f5f5f5;
}
}
}
.button-new-tag {
height: 40px;
background-color: white;
border: none;
}
::v-deep(.el-overlay) {
.el-dialog {
border-radius: 5px;
.el-dialog__header {
padding: 13px 13px 13px 15px;
background-color: #f5f5f5;
border-radius: 5px 5px 0 0;
.el-dialog__title {
font-family: '微软雅黑 Bold', '微软雅黑 Regular', '微软雅黑', sans-serif;
font-size: 14px;
font-weight: bold;
color: #666;
}
.el-dialog__headerbtn {
height: 56.8px;
}
}
.el-dialog__body {
.el-form-item {
margin-bottom: 0;
.el-checkbox-group {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
.el-checkbox {
.el-checkbox__inner {
width: 14px;
height: 14px;
}
.el-checkbox__label {
font-size: 14px;
}
}
}
}
}
.el-dialog__footer {
display: flex;
height: 60px;
padding: 10px 20px;
border-top: 1px solid #f0f0f0;
align-items: center;
justify-content: right;
.el-button {
width: 80px;
height: 30px;
font-size: 12px;
color: #999;
background-color: #f9f9f9;
}
.el-button--primary {
color: white;
background-color: #409eff;
}
}
}
}
::v-deep .el-tabs .el-tabs__nav-wrap {
height: 60px;
.el-tabs__nav {
height: 60px;
.el-tabs__item {
height: 60px;
// line-height: 60px;
font-family: '微软雅黑 Bold', '微软雅黑 Regular', '微软雅黑', sans-serif;
font-size: 16px;
font-style: normal;
font-weight: 700;
line-height: 32px;
color: #666;
&.is-active {
color: #409eff;
}
}
}
}
</style>

View File

@@ -0,0 +1,108 @@
<template>
<div>
<el-alert v-for="item in defineData" :key="item.id" type="info">
<template #title>
<el-avatar :size="28" class="mr-5px" :src="item.imgUrl" />
<span class="c-#666666 mr-10px">{{ item.name }}</span>
<span class="c-#999999 text-12px">{{ item.time }}</span>
</template>
<template #default>
<span class="c-#999999">{{ item.content }}</span>
</template>
</el-alert>
<div class="flex h-60px mb-10px bottom">
<el-input type="text" placeholder="请输入批阅内容" v-model="inputVal" />
<el-button type="primary" @click="fbBtn">发布</el-button>
</div>
</div>
</template>
<script setup lang="ts">
import { formatDate } from '@/utils/formatTime'
interface DefineData {
id: number
imgUrl: string
name: string
time: string
content: string
}
const props = defineProps<{
data?: DefineData[]
}>()
const defineData = ref(props.data)
const inputVal = ref('')
let dataLength = ref(0)
const fbBtn = () => {
if (!inputVal.value) return
dataLength.value = defineData.value?.length || 0
let endVal = defineData.value![dataLength.value - 1]
let id = endVal.id
defineData.value![dataLength.value] = {
id: id,
imgUrl:
'https://oss.yckxt.com/chatgpt/upload/1/2024-11-06/1/f0ee8a3c7c9638a54940382568c9dpng_5.png',
name: '赵小刚',
time: formatDate(new Date(), 'YYYY-MM-DD HH:mm:ss'),
content: inputVal.value
}
inputVal.value = ''
}
</script>
<style lang="scss" scoped>
::v-deep(.el-alert) {
height: 90px;
margin-bottom: 20px;
background-color: rgb(249 249 249 / 49.8%);
border: 1px solid rgb(233 233 233 / 100%);
border-radius: 0;
.el-alert__content {
height: 72px;
align-items: baseline;
.el-alert__title {
display: flex;
font-family: '微软雅黑 Regular', '微软雅黑', sans-serif;
font-size: 14px;
font-weight: 400;
align-items: end;
}
.el-alert__description {
font-family: '微软雅黑 Regular', '微软雅黑', sans-serif;
font-size: 14px;
font-weight: 400;
}
.el-alert__close-btn {
font-size: 12px;
}
}
}
.bottom {
::v-deep(.el-input) {
border: 1px solid rgb(233 233 233 / 100%);
.el-input__wrapper {
border-radius: 0;
box-shadow: none;
}
&:hover {
border-color: #409eff;
}
}
.el-button {
width: 80px;
height: 60px;
font-family: '微软雅黑 Regular', '微软雅黑', sans-serif;
border-radius: 0;
}
}
</style>

View File

@@ -0,0 +1,53 @@
<template>
<div class="flex items-start">
<div class="w-30% mr-20px border-style">
<FormView
formType="edit"
handleType="returnData"
showType="view"
:defaultData="form1Data"
:showButton="false"
formId="1853701496069386242"
></FormView>
</div>
<div class="w-[calc(70%-20px)] border-style">
<FormView
formType="edit"
handleType="returnData"
showType="view"
:enhanceData="form2EData"
:defaultData="form2Data"
:showButton="false"
formId="1853994635845922818"
></FormView>
</div>
</div>
</template>
<script setup lang="ts">
import { FormView } from '@/components/LowDesign/index'
defineOptions({ name: 'WorkReportView' })
const prop = defineProps({
data: Object,
stepList: Object,
form2Data: Object
})
const form1Data = computed(() => {
return {
...prop.data,
stepList: prop.stepList
}
})
const form2EData = ref({})
</script>
<style scoped>
.border-style {
border: 1px solid rgb(233 233 233 / 100%);
border-radius: 10px;
box-shadow: 0 0 5px rgb(0 0 0 / 4.71%);
}
</style>

View File

@@ -0,0 +1,77 @@
<template>
<div>
<el-steps direction="vertical" align-center>
<el-step v-for="item in props.data" :key="item.id" title="Step 1">
<template #icon>
<div
class="w-30px h-30px b-1px b-solid rounded-1/2 flex items-center justify-center"
:style="{ borderColor: item.iconColor }"
>
<Icon :icon="item.icon" :style="{ color: item.iconColor }"></Icon>
</div>
</template>
<template #title>
{{ item.time }}
</template>
<template #description>
<span> {{ item.type }} </span>
<span class="mr-5px"> : </span>
<span class="mr-5px"> {{ item.do }} </span>
<span class="c-#409EFF"> {{ item.content }} </span>
</template>
</el-step>
</el-steps>
</div>
</template>
<script setup lang="ts">
const props = defineProps({
data: Object
})
</script>
<style lang="scss" scoped>
::v-deep(.el-steps) {
height: 280px;
.el-step {
.el-step__head {
width: 30px;
.el-step__line {
top: 29px;
height: calc(100% - 30px);
background-color: #e4e4e4;
}
.el-step__icon {
width: 30px;
}
}
.el-step__main {
margin-top: -6px;
.el-step__title {
height: 22px;
padding-bottom: 0;
font-family: '微软雅黑', sans-serif;
font-size: 12px;
font-weight: 400;
line-height: 22px;
color: #999;
}
.el-step__description {
height: 22px;
margin-top: 0;
font-family: '微软雅黑 Bold', '微软雅黑 Regular', '微软雅黑', sans-serif;
font-size: 12px;
font-weight: 700;
line-height: 22px;
color: #666;
}
}
}
}
</style>

View File

@@ -0,0 +1,208 @@
<template>
<div class="WorkReport-box rounded-xl">
<el-tabs v-model="activeName" type="card" class="demo-tabs" @tab-click="handleClick">
<el-tab-pane v-for="item in tabsList" :key="item.name" :label="item.label" :name="item.name">
<LowTable tableId="1853269839533273090" :enhanceData="tabEnhanceData"> </LowTable>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script lang="ts" setup>
import { LowTable } from '@/components/LowDesign/index'
import type { TabsPaneContext } from 'element-plus'
defineOptions({ name: 'WorkReport' })
const tabsList = ref([
{ label: '全部报告', name: 1 },
{ label: '我提交的', name: 2 },
{ label: '抄送给我的', name: 3 },
{ label: '提交给我的', name: 4 }
])
const activeName = ref(1)
const handleClick = (tab: TabsPaneContext, event: Event) => {
console.log(tab, event)
}
const tabEnhanceData = ref({
stepList: [
{
id: 1,
icon: 'mynaui:flag-solid',
iconColor: '#0099FF',
time: '19:54:03',
type: '任务',
do: '创建了',
content: '项目日常任务'
},
{
id: 2,
icon: 'mingcute:upload-fill',
iconColor: '#FF7A8C',
time: '19:54:03',
type: '文件',
do: '上传了',
content: '交互设计文档'
},
{
id: 3,
icon: 'mynaui:box-solid',
iconColor: '#FF7A8C',
time: '19:54:03',
type: '项目',
do: '创建了',
content: '示例项目名称'
},
{
id: 4,
icon: 'mdi:address-marker',
iconColor: '#FF7A8C',
time: '19:54:03',
type: '日程',
do: '创建了',
content: '项目日常会议'
},
{
id: 5,
icon: 'si:user-fill',
iconColor: '#52C1F5',
time: '19:54:03',
type: '联系人',
do: '新增了',
content: '项目联系人'
}
],
form2Data: {
areaOne:
'对于一个客服代表来说,做客服工作的感受就象是一个学会了吃辣椒的人,整个过程感受最多的只有一个字:辣。如果到有一天你已经习惯了这种味道,不再被这种味道呛得咳嗽或是摸鼻涕流眼泪的时候就说明你已经是一个非常有经验的老员工了。我是从一线员工上来的,所以深谙这种味道。作为一个班长,在接近两年的班长工作中,我就一直在不断地探索,企图能够找到另外一种味道,能够化解和消融前台因用户所产生的这种辣味,这就是话务员情绪管理。毕竟大多数的人需要对自己的情绪进行管理、控制和调节。',
areaTwo:
'细细回忆这段时间以来的工作过程及目前公话组的整个状态,虽然在我们大家的共同努力下有了较大的变化,但是仍有许多的缺点和不足等着我们去规划和改观。首先在服务质量和服务意识方面离省局的要求还存在较大差距,不管成功与否,我们都将不断地摸索和尝试,如作大型的关于服务意识及情绪管理方面的培训来激发前台的工作积极性。或为了提高语音亲和力,作语音艺术培训及在公司工会的倡导和鼓励下号召全话务中心参与诗歌朗诵大赛等尝试,在培养声音魅力过程中,让电话交流的载体更加生动,由此而产生一批更加出色的客服代表。然后是在座席间工作纪律及员工思想动态上将进一步加大管理力度,由于公话组是呼叫中心人数最多的一个组,对于今后的工作可谓任重而道远。',
table: [
{
id: 1,
table_file: 'http://oss.yckxt.com/chatgpt/upload/1/2024-11-06/1/111.txt',
tale_size: '2MB',
table_time: '2024-11-15 15:43:23',
table_user: '1'
},
{
id: 2,
table_file: 'http://oss.yckxt.com/chatgpt/upload/1/2024-11-06/1/111.txt',
tale_size: '2MB',
table_time: '2024-11-15 16:43:23',
table_user: '1'
},
{
id: 3,
table_file: 'http://oss.yckxt.com/chatgpt/upload/1/2024-11-06/1/111.txt',
tale_size: '2MB',
table_time: '2024-11-15 16:43:23',
table_user: '1'
},
{
id: 4,
table_file: 'http://oss.yckxt.com/chatgpt/upload/1/2024-11-06/1/111.txt',
tale_size: '2MB',
table_time: '2024-11-15 16:43:23',
table_user: '1'
},
{
id: 5,
table_file: 'http://oss.yckxt.com/chatgpt/upload/1/2024-11-06/1/111.txt',
tale_size: '2MB',
table_time: '2024-11-15 16:43:23',
table_user: '1'
},
{
id: 6,
table_file: 'http://oss.yckxt.com/chatgpt/upload/1/2024-11-06/1/111.txt',
tale_size: '2MB',
table_time: '2024-11-15 16:43:23',
table_user: '1'
}
],
alertList: [
{
id: 1,
imgUrl:
'https://oss.yckxt.com/chatgpt/upload/1/2024-11-06/1/f0ee8a3c7c9638a54940382568c9dpng_5.png',
name: '赵小刚',
time: '2019-03-23 22:31',
content: '非常不错的分享,对我们的工作很有参考价值。'
},
{
id: 2,
imgUrl:
'https://oss.yckxt.com/chatgpt/upload/1/2024-11-06/1/f0ee8a3c7c9638a54940382568c9dpng_5.png',
name: '赵小刚',
time: '2019-03-23 22:31',
content: '非常不错的分享,对我们的工作很有参考价值。'
},
{
id: 3,
imgUrl:
'https://oss.yckxt.com/chatgpt/upload/1/2024-11-06/1/f0ee8a3c7c9638a54940382568c9dpng_5.png',
name: '赵小刚',
time: '2019-03-23 22:31',
content: '非常不错的分享,对我们的工作很有参考价值。'
}
]
}
})
</script>
<style lang="scss" scoped>
.WorkReport-box {
min-height: 500px;
border: 1px solid rgb(233 233 233 / 100%);
box-shadow: 0 0 5px rgb(0 0 0 / 4.71%);
.font-wryh {
font-family: '微软雅黑 Bold', '微软雅黑 Regular', '微软雅黑', sans-serif;
}
::v-deep(.el-tabs) {
.el-tabs__header {
display: flex;
height: 60px;
padding-left: 25px;
// border-bottom: none;
margin-bottom: 0;
align-items: center;
.el-tabs__nav {
border-bottom: 1px solid #e4e7ed;
border-radius: 5px;
.el-tabs__item {
width: 101px;
height: 35px;
font-family: MicrosoftYaHei, '微软雅黑 Regular', '微软雅黑', sans-serif;
color: #999;
background-color: white;
&.is-active {
color: white;
background-color: rgb(64 158 255 / 100%);
}
&:first-child {
border-radius: 5px 0 0 5px;
}
&:last-child {
border-radius: 0 5px 5px 0;
}
}
}
}
.el-tabs__content {
padding: 25px 20px;
background-color: white;
}
}
}
</style>