feat: 处理部分样式与体验问题

This commit is contained in:
ZhuRui
2026-08-26 15:05:32 +08:00
parent 64fdaba93d
commit 045e491ade
6 changed files with 127 additions and 20 deletions
+33
View File
@@ -0,0 +1,33 @@
.cell {
display: flex;
align-items: center;
gap: 6px;
width: 100%;
cursor: default;
}
.text {
flex: 1;
min-width: 0;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
line-height: 1.5;
word-break: break-all;
color: rgba(0, 0, 0, 0.88);
}
.view {
flex-shrink: 0;
color: #1677ff;
cursor: pointer;
user-select: none;
line-height: 1.5;
white-space: nowrap;
&:hover {
opacity: 0.85;
}
}
+77 -3
View File
@@ -1,11 +1,81 @@
import { defineComponent } from 'vue'; import { defineComponent, ref, nextTick } from 'vue';
import { Button, Input, Table, DatePicker, Form, Space, Select, Pagination } from 'ant-design-vue'; import {
Button,
Input,
Table,
DatePicker,
Form,
Space,
Select,
Pagination,
Modal,
} from 'ant-design-vue';
import { useLogModel, ACTION_TYPE_OPTIONS, ACTION_TYPE_MAP } from './model/useLogModel'; import { useLogModel, ACTION_TYPE_OPTIONS, ACTION_TYPE_MAP } from './model/useLogModel';
import { useContainerSize } from '@/hooks'; import { useContainerSize, useState, useEffect } from '@/hooks';
import pageStyles from '@/assets/styles/pageLayout.module.less'; import pageStyles from '@/assets/styles/pageLayout.module.less';
import cellStyles from './index.module.less';
const { RangePicker } = DatePicker; const { RangePicker } = DatePicker;
/**
* 操作内容单元格:最多 2 行截断,溢出时显示"查看"按钮
*/
const LogContentCell = defineComponent({
name: 'LogContentCell',
props: { text: { type: String, required: true } },
setup(props) {
const textRef = ref<HTMLElement | null>(null);
const [overflow, setOverflow] = useState(false);
const [modalOpen, setModalOpen] = useState(false);
const checkOverflow = () => {
const el = textRef.value;
if (el) setOverflow(el.scrollHeight > el.clientHeight);
};
let observer: ResizeObserver | null = null;
useEffect(() => {
if (!textRef.value) return;
nextTick(checkOverflow);
observer = new ResizeObserver(checkOverflow);
observer.observe(textRef.value);
return () => {
observer?.disconnect();
observer = null;
};
}, [() => textRef.value]);
return () => {
const raw = props.text;
return (
<div class={cellStyles.cell}>
<div ref={textRef} class={cellStyles.text}>
{raw}
</div>
{overflow.value ? (
<span class={cellStyles.view} onClick={() => setModalOpen(true)}>
</span>
) : null}
<Modal
visible={modalOpen.value}
title="操作内容"
footer={null}
width={600}
centered
destroyOnClose
onCancel={() => setModalOpen(false)}
>
<div style={{ whiteSpace: 'pre-wrap', wordBreak: 'break-all', lineHeight: 1.8 }}>
{raw}
</div>
</Modal>
</div>
);
};
},
});
/** /**
* bodyCell 渲染 * bodyCell 渲染
*/ */
@@ -13,6 +83,10 @@ function renderBodyCell({ column, text }: { column: any; text: any }) {
if (column.key === 'type') { if (column.key === 'type') {
return <span>{ACTION_TYPE_MAP[text as number] || text || '--'}</span>; return <span>{ACTION_TYPE_MAP[text as number] || text || '--'}</span>;
} }
if (column.dataIndex === 'content') {
const raw = text || '';
return raw ? <LogContentCell text={raw} /> : <span>--</span>;
}
return <span>{text || '--'}</span>; return <span>{text || '--'}</span>;
} }
+1 -1
View File
@@ -103,7 +103,7 @@ export function useLogModel() {
const columns = [ const columns = [
{ title: '操作类型', dataIndex: 'type', key: 'type', width: 140 }, { title: '操作类型', dataIndex: 'type', key: 'type', width: 140 },
{ title: '操作人', dataIndex: 'nickname', key: 'nickname', width: 140 }, { title: '操作人', dataIndex: 'nickname', key: 'nickname', width: 140 },
{ title: '操作内容', dataIndex: 'content', key: 'content', minWidth: 360 }, { title: '操作内容', dataIndex: 'content', key: 'content', width: 480 },
{ title: '操作时间', dataIndex: 'createDate', key: 'createDate', width: 180 }, { title: '操作时间', dataIndex: 'createDate', key: 'createDate', width: 180 },
]; ];
@@ -104,13 +104,13 @@ export default defineComponent({
</Form.Item> </Form.Item>
<Form.Item label="参数值" name="paramValue" rules={paramValueRules}> <Form.Item label="参数值" name="paramValue" rules={paramValueRules}>
<Input <TextArea
value={formData.paramValue} value={formData.paramValue}
onUpdate:value={(val: any) => { onUpdate:value={(val: any) => {
formData.paramValue = val?.target?.value ?? val ?? ''; formData.paramValue = val?.target?.value ?? val ?? '';
}} }}
placeholder="请输入参数值" placeholder="请输入参数值"
allowClear rows={2}
/> />
</Form.Item> </Form.Item>
@@ -123,7 +123,7 @@ export default defineComponent({
placeholder="请输入备注说明(选填,最多200字)" placeholder="请输入备注说明(选填,最多200字)"
maxlength={200} maxlength={200}
showCount showCount
rows={3} rows={4}
/> />
</Form.Item> </Form.Item>
</Form> </Form>
+12 -12
View File
@@ -8,11 +8,14 @@ import pageStyles from '@/assets/styles/pageLayout.module.less';
import cellStyles from './index.module.less'; import cellStyles from './index.module.less';
/** /**
* 参数值单元格:最多 2 行截断,溢出时显示"查看"按钮 * 文本单元格:最多 2 行截断,溢出时显示"查看"按钮
*/ */
const ParamValueCell = defineComponent({ const TruncatedTextCell = defineComponent({
name: 'ParamValueCell', name: 'TruncatedTextCell',
props: { text: { type: String, required: true } }, props: {
text: { type: String, required: true },
modalTitle: { type: String, required: true },
},
setup(props) { setup(props) {
const textRef = ref<HTMLElement | null>(null); const textRef = ref<HTMLElement | null>(null);
const [overflow, setOverflow] = useState(false); const [overflow, setOverflow] = useState(false);
@@ -49,7 +52,7 @@ const ParamValueCell = defineComponent({
) : null} ) : null}
<Modal <Modal
visible={modalOpen.value} visible={modalOpen.value}
title="参数值" title={props.modalTitle}
footer={null} footer={null}
width={600} width={600}
centered centered
@@ -90,14 +93,11 @@ function renderBodyCell({
</Space> </Space>
); );
} }
// 参数值列:两行截断 + 查看弹窗 // 参数值 / 备注列:两行截断 + 查看弹窗
if (column.dataIndex === 'paramValue') { if (column.dataIndex === 'paramValue' || column.dataIndex === 'remark') {
const raw = text || ''; const raw = text || '';
return raw ? <ParamValueCell text={raw} /> : <span>--</span>; const modalTitle = column.dataIndex === 'paramValue' ? '参数值' : '备注说明';
} return raw ? <TruncatedTextCell text={raw} modalTitle={modalTitle} /> : <span>--</span>;
// 备注列:空值显示 --
if (column.dataIndex === 'remark' && !text) {
return <span>--</span>;
} }
return <span>{text ?? '--'}</span>; return <span>{text ?? '--'}</span>;
} }
@@ -28,7 +28,7 @@ export function useParamsColumns() {
title: '备注说明', title: '备注说明',
dataIndex: 'remark', dataIndex: 'remark',
key: 'remark', key: 'remark',
minWidth: 240, width: 240,
}, },
]; ];