新增查看页面

This commit is contained in:
2026-01-23 23:14:44 +08:00
parent c10bcd14c3
commit 73a9249278
12 changed files with 166 additions and 85 deletions

View File

@@ -0,0 +1,22 @@
/**
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
* No deletion without permission, or be held responsible to law.
* @author gaoxq
*/
import { defHttp } from '@jeesite/core/utils/http/axios';
import { useGlobSetting } from '@jeesite/core/hooks/setting';
import { BasicModel } from '@jeesite/core/api/model/baseModel';
const { adminPath } = useGlobSetting();
export interface MyWorkInfo extends BasicModel<MyWorkInfo> {
notifyNums?: number;
notifyAllNums?: number;
projectNums?: number;
projectAllNums?: number;
calendarNums?: number;
calendarAllNums?: number;
teamNums?: number;
}
export const bizMyWorkInfoList = () =>
defHttp.get<MyWorkInfo>({ url: adminPath + '/biz/myWork/list'});

View File

@@ -16,7 +16,15 @@
<Icon :icon="getTitle.icon" class="m-1 pr-1" /> <Icon :icon="getTitle.icon" class="m-1 pr-1" />
<span> {{ getTitle.value }} </span> <span> {{ getTitle.value }} </span>
</template> </template>
<BasicForm @register="registerForm" /> <BasicForm @register="registerForm">
<template #remarks="{ model, field }">
<WangEditor
v-model:value="model[field]"
:bizKey="record.id"
:height="300"
/>
</template>
</BasicForm>
</BasicModal> </BasicModal>
</template> </template>
<script lang="ts" setup name="ViewsBizListItemForm"> <script lang="ts" setup name="ViewsBizListItemForm">
@@ -25,6 +33,7 @@
import { useMessage } from '@jeesite/core/hooks/web/useMessage'; import { useMessage } from '@jeesite/core/hooks/web/useMessage';
import { router } from '@jeesite/core/router'; import { router } from '@jeesite/core/router';
import { Icon } from '@jeesite/core/components/Icon'; import { Icon } from '@jeesite/core/components/Icon';
import { WangEditor } from '@jeesite/core/components/WangEditor';
import { BasicForm, FormSchema, useForm } from '@jeesite/core/components/Form'; import { BasicForm, FormSchema, useForm } from '@jeesite/core/components/Form';
import { BasicModal, useModalInner } from '@jeesite/core/components/Modal'; import { BasicModal, useModalInner } from '@jeesite/core/components/Modal';
import { BizListItem, bizListItemSave, bizListItemForm } from '@jeesite/biz/api/biz/listItem'; import { BizListItem, bizListItemSave, bizListItemForm } from '@jeesite/biz/api/biz/listItem';
@@ -46,7 +55,7 @@
const inputFormSchemas: FormSchema<BizListItem>[] = [ const inputFormSchemas: FormSchema<BizListItem>[] = [
{ {
label: t('通知标题'), label: t('标题名称'),
field: 'title', field: 'title',
component: 'Input', component: 'Input',
componentProps: { componentProps: {
@@ -117,6 +126,7 @@
field: 'description', field: 'description',
component: 'InputTextArea', component: 'InputTextArea',
required: true, required: true,
slot: 'remarks',
colProps: { md: 24, lg: 24 }, colProps: { md: 24, lg: 24 },
}, },
]; ];

View File

@@ -86,7 +86,7 @@
}, },
}, },
{ {
label: t('通知标题'), label: t('标题名称'),
field: 'title', field: 'title',
component: 'Input', component: 'Input',
}, },
@@ -145,7 +145,7 @@
slot: 'slotBizAvatar', slot: 'slotBizAvatar',
}, },
{ {
title: t('通知标题'), title: t('标题名称'),
dataIndex: 'title', dataIndex: 'title',
key: 'a.title', key: 'a.title',
sorter: true, sorter: true,

View File

@@ -15,7 +15,15 @@
<Icon :icon="getTitle.icon" class="m-1 pr-1" /> <Icon :icon="getTitle.icon" class="m-1 pr-1" />
<span> {{ getTitle.value }} </span> <span> {{ getTitle.value }} </span>
</template> </template>
<BasicForm @register="registerForm" /> <BasicForm @register="registerForm">
<template #remarks="{ model, field }">
<WangEditor
v-model:value="model[field]"
:bizKey="record.id"
:height="300"
/>
</template>
</BasicForm>
</BasicModal> </BasicModal>
</template> </template>
<script lang="ts" setup name="ViewsBizListItemForm"> <script lang="ts" setup name="ViewsBizListItemForm">
@@ -24,6 +32,7 @@
import { useMessage } from '@jeesite/core/hooks/web/useMessage'; import { useMessage } from '@jeesite/core/hooks/web/useMessage';
import { router } from '@jeesite/core/router'; import { router } from '@jeesite/core/router';
import { Icon } from '@jeesite/core/components/Icon'; import { Icon } from '@jeesite/core/components/Icon';
import { WangEditor } from '@jeesite/core/components/WangEditor';
import { BasicForm, FormSchema, useForm } from '@jeesite/core/components/Form'; import { BasicForm, FormSchema, useForm } from '@jeesite/core/components/Form';
import { BasicModal, useModalInner } from '@jeesite/core/components/Modal'; import { BasicModal, useModalInner } from '@jeesite/core/components/Modal';
import { BizListItem, bizListItemSave, bizListItemForm } from '@jeesite/biz/api/biz/listItem'; import { BizListItem, bizListItemSave, bizListItemForm } from '@jeesite/biz/api/biz/listItem';
@@ -45,7 +54,7 @@
const inputFormSchemas: FormSchema<BizListItem>[] = [ const inputFormSchemas: FormSchema<BizListItem>[] = [
{ {
label: t('通知标题'), label: t('标题名称'),
field: 'title', field: 'title',
component: 'Input', component: 'Input',
componentProps: { componentProps: {
@@ -117,6 +126,7 @@
field: 'description', field: 'description',
component: 'InputTextArea', component: 'InputTextArea',
dynamicDisabled: true, dynamicDisabled: true,
slot: 'remarks',
colProps: { md: 24, lg: 24 }, colProps: { md: 24, lg: 24 },
}, },
]; ];

View File

@@ -16,12 +16,12 @@
<span> {{ getTitle.value }} </span> <span> {{ getTitle.value }} </span>
</template> </template>
<BasicForm @register="registerForm" > <BasicForm @register="registerForm" >
<template #remarks> <template #remarks="{ model, field }">
<div <WangEditor
v-html="record?.meetingContent" v-model:value="model[field]"
style="border: 1px solid #dcdcdc; max-height: 300px; overflow-y: auto; line-height: 1.8; white-space: pre-wrap; padding: 8px; border-radius: 4px;" :bizKey="record.id"
> :height="300"
</div> />
</template> </template>
</BasicForm> </BasicForm>
</BasicModal> </BasicModal>
@@ -32,6 +32,7 @@
import { useMessage } from '@jeesite/core/hooks/web/useMessage'; import { useMessage } from '@jeesite/core/hooks/web/useMessage';
import { router } from '@jeesite/core/router'; import { router } from '@jeesite/core/router';
import { Icon } from '@jeesite/core/components/Icon'; import { Icon } from '@jeesite/core/components/Icon';
import { WangEditor } from '@jeesite/core/components/WangEditor';
import { BasicForm, FormSchema, useForm } from '@jeesite/core/components/Form'; import { BasicForm, FormSchema, useForm } from '@jeesite/core/components/Form';
import { BasicModal, useModalInner } from '@jeesite/core/components/Modal'; import { BasicModal, useModalInner } from '@jeesite/core/components/Modal';
import { BizMeetingInfo, bizMeetingInfoSave, bizMeetingInfoForm } from '@jeesite/biz/api/biz/meetingInfo'; import { BizMeetingInfo, bizMeetingInfoSave, bizMeetingInfoForm } from '@jeesite/biz/api/biz/meetingInfo';

View File

@@ -16,10 +16,11 @@
<span> {{ getTitle.value }} </span> <span> {{ getTitle.value }} </span>
</template> </template>
<BasicForm @register="registerForm" > <BasicForm @register="registerForm" >
<template #remarks> <template #remarks="{ model, field }">
<div <WangEditor
v-html="record?.requirementDescription" v-model:value="model[field]"
style="border: 1px solid #dcdcdc; max-height: 300px; overflow-y: auto; line-height: 1.8; white-space: pre-wrap; padding: 8px; border-radius: 4px;" :bizKey="record.id"
:height="300"
/> />
</template> </template>
</BasicForm> </BasicForm>
@@ -31,6 +32,7 @@
import { useMessage } from '@jeesite/core/hooks/web/useMessage'; import { useMessage } from '@jeesite/core/hooks/web/useMessage';
import { router } from '@jeesite/core/router'; import { router } from '@jeesite/core/router';
import { Icon } from '@jeesite/core/components/Icon'; import { Icon } from '@jeesite/core/components/Icon';
import { WangEditor } from '@jeesite/core/components/WangEditor';
import { BasicForm, FormSchema, useForm } from '@jeesite/core/components/Form'; import { BasicForm, FormSchema, useForm } from '@jeesite/core/components/Form';
import { BasicModal, useModalInner } from '@jeesite/core/components/Modal'; import { BasicModal, useModalInner } from '@jeesite/core/components/Modal';
import { BizAreaSource, bizAreaSourceTreeData } from '@jeesite/biz/api/biz/areaSource'; import { BizAreaSource, bizAreaSourceTreeData } from '@jeesite/biz/api/biz/areaSource';

View File

@@ -15,7 +15,7 @@
<span class="info-item">类型{{ getTypeText(NoticeList?.type) }}</span> <span class="info-item">类型{{ getTypeText(NoticeList?.type) }}</span>
</div> </div>
<div class="detail-content"> <div class="detail-content">
<pre class="db-content">{{ NoticeList?.description || '无内容' }}</pre> <div class="text-content" v-html="NoticeList?.description || '无内容'"></div>
</div> </div>
<div v-if="NoticeList?.type === '3'" class="todo-opinion"> <div v-if="NoticeList?.type === '3'" class="todo-opinion">
<div class="opinion-card card"> <div class="opinion-card card">
@@ -132,9 +132,9 @@
.detail-container { .detail-container {
background-color: #f0f8ff; /* 统一淡蓝色背景 */ background-color: #f0f8ff; /* 统一淡蓝色背景 */
padding: 12px; padding: 12px;
border-radius: 8px; border-radius: 4px;
min-height: 400px; min-height: 55vh;
font-size: 14px; font-size: 16px;
color: #333; color: #333;
} }
@@ -178,17 +178,18 @@
background-color: #ffffff; background-color: #ffffff;
border-radius: 8px; border-radius: 8px;
border: 1px solid #d1e7ff; border: 1px solid #d1e7ff;
max-height: 200px; height: 200px;
overflow-y: auto; overflow-y: auto;
box-shadow: 0 1px 3px rgba(0,0,0,0.05); box-shadow: 0 1px 3px rgba(0,0,0,0.05);
} }
.db-content { .text-content {
margin: 0; margin: 0;
font-family: 'Consolas', 'Monaco', 'Courier New', monospace; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
white-space: pre-wrap; white-space: pre-wrap;
word-break: break-all; word-break: break-all;
color: #333; color: #333;
line-height: 1.6;
} }
/* 待办意见容器 */ /* 待办意见容器 */

View File

@@ -13,7 +13,7 @@
$props.titleRows && $props.titleRows > 0 ? { rows: $props.titleRows, tooltip: !!item.title } : false $props.titleRows && $props.titleRows > 0 ? { rows: $props.titleRows, tooltip: !!item.title } : false
" "
:content="item.title" :content="item.title"
@click="openModal(true, item)" @click="openModal(true, item)"
/> />
<div class="extra" v-if="item.extra"> <div class="extra" v-if="item.extra">
<a-tag class="tag" :color="item.color"> <a-tag class="tag" :color="item.color">
@@ -34,15 +34,21 @@
<template #description> <template #description>
<div> <div>
<div class="description" v-if="item.description"> <div class="description" v-if="item.description">
<a-typography-paragraph <a-tooltip placement="bottom" :mouseEnterDelay="0.3">
style="width: 100%; margin-bottom: 0 !important" <template #title>
:ellipsis=" <div v-html="item.description" style="max-width: 400px; white-space: pre-wrap;"></div>
$props.descRows && $props.descRows > 0 </template>
? { rows: $props.descRows, tooltip: !!item.description } <a-typography-paragraph
: false style="width: 100%; margin-bottom: 0 !important"
" :ellipsis="
:content="item.description" $props.descRows && $props.descRows > 0
/> ? { rows: $props.descRows, tooltip: false }
: false
"
>
<span v-html="item.description"></span>
</a-typography-paragraph>
</a-tooltip>
</div> </div>
<div class="datetime"> <div class="datetime">
{{ item.datetime }} {{ item.datetime }}
@@ -60,7 +66,7 @@
import { BizListItem, tabListDataAll } from '@jeesite/biz/api/biz/listItem'; import { BizListItem, tabListDataAll } from '@jeesite/biz/api/biz/listItem';
import { useDesign } from '@jeesite/core/hooks/web/useDesign'; import { useDesign } from '@jeesite/core/hooks/web/useDesign';
import { useModal } from '@jeesite/core/components/Modal'; import { useModal } from '@jeesite/core/components/Modal';
import { List, Avatar, Tag, Typography } from 'ant-design-vue'; import { List, Avatar, Tag, Typography, Tooltip } from 'ant-design-vue';
import { Icon } from '@jeesite/core/components/Icon'; import { Icon } from '@jeesite/core/components/Icon';
import { isNumber } from '@jeesite/core/utils/is'; import { isNumber } from '@jeesite/core/utils/is';
import Modal from './NoticeInfo.vue'; import Modal from './NoticeInfo.vue';
@@ -77,12 +83,12 @@
AListItemMeta: List.Item.Meta, AListItemMeta: List.Item.Meta,
ATypographyParagraph: Typography.Paragraph, ATypographyParagraph: Typography.Paragraph,
[Tag.name as string]: Tag, [Tag.name as string]: Tag,
[Tooltip.name as string]: Tooltip, // 关键修改4注册Tooltip组件
Icon, Icon,
Modal, Modal,
}, },
props: { props: {
list: { list: {
// 更新列表项类型为扩展后的字符串版本
type: Array as PropType<ExtendedBizListItem[]>, type: Array as PropType<ExtendedBizListItem[]>,
default: () => [], default: () => [],
}, },
@@ -108,28 +114,28 @@
}, },
emits: ['update:currentPage'], emits: ['update:currentPage'],
setup(props, { emit }) { setup(props, { emit }) {
const [register, { openModal }] = useModal(); const [register, { openModal }] = useModal();
const { prefixCls } = useDesign('header-notify-list'); const { prefixCls } = useDesign('header-notify-list');
const current = ref(props.currentPage || 1); const current = ref(props.currentPage || 1);
const getData = computed<ExtendedBizListItem[]>(() => { const getData = computed<ExtendedBizListItem[]>(() => {
const { pageSize, list } = props; const { pageSize, list } = props;
if (pageSize === false) return []; if (pageSize === false) return [];
let size = isNumber(pageSize) ? pageSize : 5; let size = isNumber(pageSize) ? pageSize : 5;
return list.slice(size * (unref(current) - 1), size * unref(current)); return list.slice(size * (unref(current) - 1), size * unref(current));
}); });
watch( watch(
() => props.currentPage, () => props.currentPage,
(v) => { (v) => {
current.value = v; current.value = v;
}, },
); );
const isTitleClickable = computed(() => !!props.onTitleClick); const isTitleClickable = computed(() => !!props.onTitleClick);
const getPagination = computed(() => { const getPagination = computed(() => {
const { list, pageSize } = props; const { list, pageSize } = props;
if ((pageSize as number) > 0 && list && list.length > (pageSize as number)) { if ((pageSize as number) > 0 && list && list.length > (pageSize as number)) {
@@ -148,19 +154,18 @@
} }
}); });
// 更新函数参数类型
function handleTitleClick(item: ExtendedBizListItem) { function handleTitleClick(item: ExtendedBizListItem) {
props.onTitleClick && props.onTitleClick(item); props.onTitleClick && props.onTitleClick(item);
} }
return { return {
prefixCls, prefixCls,
getPagination, getPagination,
getData, getData,
handleTitleClick, handleTitleClick,
isTitleClickable, isTitleClickable,
register, register,
openModal, openModal,
}; };
}, },
}); });
</script> </script>
@@ -223,6 +228,7 @@
.description { .description {
font-size: 12px; font-size: 12px;
line-height: 18px; line-height: 18px;
cursor: pointer;
} }
.datetime { .datetime {
@@ -232,4 +238,4 @@
} }
} }
} }
</style> </style>

View File

@@ -5,31 +5,50 @@
<h1 class="text-md md:text-lg">您好, {{ userinfo.userName }}, 开始您一天的工作吧</h1> <h1 class="text-md md:text-lg">您好, {{ userinfo.userName }}, 开始您一天的工作吧</h1>
<span class="text-secondary"> 今日晴20 - 32 </span> <span class="text-secondary"> 今日晴20 - 32 </span>
</div> </div>
<div class="mt-4 flex flex-1 justify-end md:mt-0"> <div class="mt-4 flex flex-1 justify-end items-center md:mt-0 gap-x-8 md:gap-x-16">
<div class="flex flex-col justify-center text-right"> <div class="flex flex-col justify-center items-center">
<span class="text-secondary"> 待办 </span> <span class="text-secondary"> 待办 </span>
<span class="text-2xl">2/10</span> <span class="text-2xl mt-1">{{ workInfo?.notifyNums }}/{{ workInfo?.notifyAllNums }}</span>
</div> </div>
<div class="flex flex-col justify-center items-center">
<div class="mx-12 flex flex-col justify-center text-right md:mx-16"> <span class="text-secondary"> 日程 </span>
<span class="text-2xl mt-1">{{ workInfo?.calendarNums }}/{{ workInfo?.calendarAllNums }}</span>
</div>
<div class="flex flex-col justify-center items-center">
<span class="text-secondary"> 项目 </span> <span class="text-secondary"> 项目 </span>
<span class="text-2xl">8</span> <span class="text-2xl mt-1">{{ workInfo?.projectNums }}/{{ workInfo?.projectAllNums }}</span>
</div> </div>
<div class="mr-4 flex flex-col justify-center text-right md:mr-10"> <div class="flex flex-col justify-center items-center">
<span class="text-secondary"> 团队 </span> <span class="text-secondary"> 团队 </span>
<span class="text-2xl">300</span> <span class="text-2xl mt-1">{{ workInfo?.teamNums }}</span>
</div> </div>
</div> </div>
</div> </div>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { computed } from 'vue'; import { ref, computed, onMounted } from 'vue';
import { Avatar } from 'ant-design-vue'; import { Avatar } from 'ant-design-vue';
import { useRouter } from 'vue-router'; import { useRouter } from 'vue-router';
import { useUserStore } from '@jeesite/core/store/modules/user'; import { useUserStore } from '@jeesite/core/store/modules/user';
import headerImg from '@jeesite/assets/images/header.jpg'; import headerImg from '@jeesite/assets/images/header.jpg';
import { MyWorkInfo, bizMyWorkInfoList } from '@jeesite/biz/api/biz/myWork';
const router = useRouter(); const router = useRouter();
const userStore = useUserStore(); const userStore = useUserStore();
const userinfo = computed(() => userStore.getUserInfo); const userinfo = computed(() => userStore.getUserInfo);
</script>
const workInfo = ref<MyWorkInfo>();
const workList = async () => {
try {
const result = await bizMyWorkInfoList();
workInfo.value = result;
} catch (error) {
console.error('获取数据失败:', error);
}
};
onMounted(() => {
workList();
});
</script>

View File

@@ -16,7 +16,15 @@
<Icon :icon="getTitle.icon" class="m-1 pr-1" /> <Icon :icon="getTitle.icon" class="m-1 pr-1" />
<span> {{ getTitle.value }} </span> <span> {{ getTitle.value }} </span>
</template> </template>
<BasicForm @register="registerForm" /> <BasicForm @register="registerForm">
<template #remarks="{ model, field }">
<WangEditor
v-model:value="model[field]"
:bizKey="record.id"
:height="300"
/>
</template>
</BasicForm>
</BasicModal> </BasicModal>
</template> </template>
<script lang="ts" setup name="ViewsBizListItemForm"> <script lang="ts" setup name="ViewsBizListItemForm">
@@ -25,6 +33,7 @@
import { useMessage } from '@jeesite/core/hooks/web/useMessage'; import { useMessage } from '@jeesite/core/hooks/web/useMessage';
import { router } from '@jeesite/core/router'; import { router } from '@jeesite/core/router';
import { Icon } from '@jeesite/core/components/Icon'; import { Icon } from '@jeesite/core/components/Icon';
import { WangEditor } from '@jeesite/core/components/WangEditor';
import { BasicForm, FormSchema, useForm } from '@jeesite/core/components/Form'; import { BasicForm, FormSchema, useForm } from '@jeesite/core/components/Form';
import { BasicModal, useModalInner } from '@jeesite/core/components/Modal'; import { BasicModal, useModalInner } from '@jeesite/core/components/Modal';
import { BizListItem, bizListItemSave, bizListItemForm } from '@jeesite/biz/api/biz/listItem'; import { BizListItem, bizListItemSave, bizListItemForm } from '@jeesite/biz/api/biz/listItem';
@@ -89,6 +98,14 @@
}, },
required: true, required: true,
}, },
{
label: t('内容信息'),
field: 'description',
component: 'InputTextArea',
required: true,
slot: 'remarks',
colProps: { md: 24, lg: 24 },
},
{ {
label: t('待办意见'), label: t('待办意见'),
field: 'extraDesc', field: 'extraDesc',

View File

@@ -68,6 +68,16 @@
showTime: { format: 'HH:mm' }, showTime: { format: 'HH:mm' },
}, },
}, },
{
label: t('是否关闭'),
field: 'clickClose',
defaultValue: '0',
component: 'Select',
componentProps: {
dictType: 'is_open',
allowClear: true,
},
},
{ {
label: t('待办标题'), label: t('待办标题'),
field: 'title', field: 'title',
@@ -87,15 +97,6 @@
allowClear: true, allowClear: true,
}, },
}, },
{
label: t('是否关闭'),
field: 'clickClose',
component: 'Select',
componentProps: {
dictType: 'is_open',
allowClear: true,
},
},
{ {
label: t('是否删除'), label: t('是否删除'),
field: 'titleDelete', field: 'titleDelete',
@@ -152,14 +153,6 @@
width: 130, width: 130,
align: 'left', align: 'left',
dictType: 'is_open', dictType: 'is_open',
},
{
title: t('内容信息'),
dataIndex: 'description',
key: 'a.description',
sorter: true,
width: 225,
align: 'left',
}, },
{ {
title: t('待办意见'), title: t('待办意见'),

View File

@@ -36,8 +36,8 @@
width: 100%; width: 100%;
background-color: #e8f4f8; background-color: #e8f4f8;
display: flex; display: flex;
flex-direction: column; // 垂直布局 flex-direction: column;
overflow: hidden; // 防止内容溢出 overflow: hidden;
padding: 0 8px; padding: 0 8px;
} }
</style> </style>