登录页

This commit is contained in:
wyuu 2026-05-27 18:05:58 +08:00
parent e022b6861a
commit c43e714c45
14 changed files with 671 additions and 595 deletions

View File

@ -55,8 +55,8 @@ export function fetchCodeReqmain(query?: Object) {
export function reportList(query?: Object) {
return request({
url: '/report/ReportList',
method: 'post',
data: query,
method: 'get',
params: query,
});
}
// 查询报告Pdf预览
@ -123,4 +123,18 @@ export function cancelExecSQD(query?: Object) {
data: query,
});
}
export function getSQDDetailList(query?: Object) {
return request({
url: '/report/getSQDDetail',
method: 'get',
params: query,
});
}
export function getCdssUrl(query?: Object) {
return request({
url: '/report/InterfaceData',
method: 'post',
data: query,
});
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 473 KiB

View File

@ -124,9 +124,9 @@ const emits = defineEmits(['current-change', "column-drag-end", "row-drag-end",
const tableRef = ref<any>(null)
const currentRow = ref<any>(null)
// 处理行点击
const handleRowClick = (params: { row: any }) => {
const handleRowClick = (params: { row: any, $rowIndex, column, $columnIndex, cell, $event }) => {
currentRow.value = params.row
emits('current-change', params.row)
emits('current-change', params.row, params.$rowIndex, params.column, params.$columnIndex, params.cell, params.$event)
}
const handleCheckboxChange = ({ checked, records }: { checked: boolean, records: any[] }) => {

View File

@ -65,31 +65,29 @@
@clear="handleQuery" />
</el-form-item>
</el-col>
<el-col :span="3">
<el-form-item>
<el-button icon="search" type="primary" @click="handleQuery">
搜索
</el-button>
<!-- <el-button icon="Refresh" @click="resetQuery">重置</el-button> -->
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-row>
</div>
<el-row :gutter="15">
<el-col :span="16" class="right-table">
<el-row :gutter="10" class="mb8 mt10">
<el-col :span="1.5">
<el-button type="primary" plain icon="Edit" :size="aotuSize" @click="selectStatusRows">勾选所有未打印</el-button>
</el-col>
<el-col :span="1.5">
</el-col>
<el-col :span="1.5">
<el-button type="primary" plain icon="Upload" :size="aotuSize" @click="printPdf">打印报告</el-button>
</el-col>
</el-row>
<el-row :gutter="10" class="mb8 mt10">
<el-col :span="1.5">
<el-button icon="search" type="primary" :size="aotuSize" @click="handleQuery">搜索</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="primary" plain icon="Edit" :size="aotuSize" @click="selectStatusRows">勾选所有未打印</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Upload" :size="aotuSize" @click="printPdf">打印报告</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="primary" :size="aotuSize" plain @click="openDB">对比历史</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="primary" :size="aotuSize" plain @click="getCDSS">CDSS</el-button>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="16" class="right-table sqd-box">
<CustomVxeTable :table-data="tableData" :loading="loading" :columns="columns" @current-change="rowHandle"
size="small" :scrollYConfig="{ enabled: true, rSize: 30, height: '100%', }" class="mytable-style"
ref="tableRefs" :row-style="rowClassNameHd" :cell-style="cellStyleHd" @selection-change="selectionChange"
@ -104,39 +102,51 @@
{{ row.jzbz == 1 ? '急' : '' }}
</template>
</CustomVxeTable>
<div class="mask" :style="{ top: `${pageY}px` }">
<el-popover placement="left" :width="300" trigger="click">
<template #reference>
<div class="text">项目明细</div>
</template>
<el-table :data="sqlisReqs" style="width: 100%" border @row-click="sqxmClick" highlight-current-row
show-overflow-tooltip max-height="300px">
<el-table-column prop="sqxmdh" width="100" label="项目代号" />
<el-table-column prop="sqxmmc" label="项目名称" />
</el-table>
</el-popover>
</div>
<div class="mt10">
<el-pagination background @size-change="handleSizeChange" @current-change="handleCurrentChange"
:size="aotuSize" :current-page="queryParams.pageNum" :page-sizes="[10, 20, 50, 100]"
:page-size="queryParams.pageSize" layout="total, sizes, prev, pager, next, jumper" :total="total">
</el-pagination>
</div>
</el-col>
<el-col :span="8" class="right-table">
<!-- <div class="title">检验结果</div> -->
<div class="mb8 mt10">
<el-button type="primary" :size="aotuSize" plain @click="openDB">对比历史</el-button>
<el-select class="ml10" placeholder="请选择复制" style="width: 140px" @change="copyData" :size="aotuSize">
<el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
<!-- <el-button type="primary">知识库</el-button> -->
</div>
<div>
<CustomTable :data="rightTableData" :columns="rightColumns" :config="rightTableConfig"
@row-click="xmrowHandle" ref="rightTableRef">
<template #jgbz="{ row }">
{{ formatJgbz(row.jgbz) }}
</template>
<template #xmmc="{ row }">
<el-tooltip class="box-item" effect="dark" :content="row.clinicref" placement="top"
:disabled="!row.clinicref">
<span>{{ row.xmmc }}</span>
</el-tooltip>
</template>
</CustomTable>
</div>
<div class="mt10" v-if="bottomTableData.length > 0"></div>
<div>
<CustomTable v-if="bottomTableData.length > 0" :data="bottomTableData" :columns="bottomColumns"
:config="bottomTableConfig">
</CustomTable>
</div>
<div v-if="bottomTableData.length > 0" class="expert-comment" :title="expertComment">
专家评语:{{ expertComment }}
<ContextMenu :items="contextMenuItems" @select="handleMenuSelect" menu-width="120">
<CustomTable :data="rightTableData" :columns="rightColumns" :config="rightTableConfig"
@row-click="xmrowHandle" ref="rightTableRef">
<template #jgbz="{ row }">
{{ formatJgbz(row.jgbz) }}
</template>
<template #xmmc="{ row }">
<el-tooltip class="box-item" effect="dark" :content="row.clinicref" placement="top"
:popper-style="{ width: '320px', maxWidth: '320px' }" :disabled="!row.clinicref">
<span>{{ row.xmmc }}</span>
</el-tooltip>
</template>
</CustomTable>
</ContextMenu>
<div class="mt10" v-if="bottomTableData.length > 0"></div>
<div>
<CustomTable v-if="bottomTableData.length > 0" :data="bottomTableData" :columns="bottomColumns"
:config="bottomTableConfig">
</CustomTable>
</div>
<div v-if="bottomTableData.length > 0" class="expert-comment" :title="expertComment">
专家评语:{{ expertComment }}
</div>
</div>
</el-col>
</el-row>
@ -180,19 +190,17 @@ import { ref, reactive, toRaw, computed, watch, nextTick, onMounted } from 'vue'
import CustomTable from '@/components/elTable/index.vue'
import CustomVxeTable from '@/components/vxeTable/index.vue'
import { useRouter } from 'vue-router'
import { reportList, reportPrintPdf, reportResult, reportMedList, reportFsresult } from '@/api/checkCode/index'
import ContextMenu from "@/components/contextMenu/index.vue";
import { reportList, reportPrintPdf, reportResult, reportMedList, reportFsresult, getSQDDetailList, getCdssUrl } from '@/api/checkCode/index'
import dayjs from 'dayjs';
import SelectTable from '@/components/SelectTable/index.vue';
import { ElMessage, ElMessageBox } from 'element-plus'
import { classCom } from '@/utils/classCom'
import { HiprintPrinter } from '@/utils/hiprintPrinter';
import { ContextMenuItem } from '@/types/index'
import * as echarts from 'echarts';
//@ts-ignore
import { comDict } from '@/utils/dict'
//@ts-ignore
import { getDicts } from '@/api/system/dict/data'
import { usePrintStore } from '@/store/modules/printStore'
//@ts-ignore
import useUserStore from '@/store/modules/user'
import { useRoute } from 'vue-router'
const route = useRoute()
@ -223,6 +231,8 @@ interface QueryParams {
sqh: string,
userid: string,
yljg: string,
pageNum: number,
pageSize: number,
}
// 提交表单数据
@ -241,7 +251,9 @@ const queryParams = reactive<QueryParams>({
ch: '',
dybz: '',
userid: '',
yljg: ''
yljg: '',
pageNum: 1,
pageSize: 20,
});
const single = ref(true);
@ -285,7 +297,7 @@ const lastTimeIndex = computed(() => {
return lastIndex;
}
});
const total = ref(0)
const handleQuery = async () => {
const valid = await queryRef.value.validate().catch(() => { });
if (!valid) return false;
@ -312,6 +324,7 @@ const columns = ref([
{ field: 'brxm', title: '病人姓名', align: 'center', resizable: true, width: 60 },
{ field: 'brxbname', title: '性别', align: 'center', resizable: true, width: 40 },
{ field: 'ch', title: '床号', align: 'center', resizable: true, width: 50 },
{ field: 'sqh', title: '申请单号', align: 'center', resizable: true, width: 100 },
{ field: 'jymd', title: '检验目的', align: 'center', resizable: true, width: 200 },
{ field: 'yblxname', title: '样本类型', align: 'center', resizable: true, width: 60 },
{ field: 'sqsj', title: '送检时间', align: 'center', resizable: true, width: 150 },
@ -330,9 +343,11 @@ const selectionChange = (selection: any) => {
single.value = selection.length != 1;
multiple.value = !selection.length;
}
const pageY = ref(0)
const sqlisReqs = ref([])
const rightTableRef = ref()
const rowHandle = (row: any) => {
const rowHandle = (row, $rowIndex, column, $columnIndex, cell, $event) => {
pageY.value = $event?.pageY - 200 || 0
if (row.yqdl == '细菌仪') {
rightColumns.value[1].visible = false
rightColumns.value[2].visible = true
@ -357,10 +372,21 @@ const rowHandle = (row: any) => {
]
Info.value = row
getxmmxList(row)
getSQDDetailList({ sqh: row.sqh }).then((res: any) => {
if (res.code == 0) {
sqlisReqs.value = res.data
}
})
}
const getxmmxList = (row) => {
const data = {
jyrq: row.jyrq,
yq: row.yq,
ybh: row.ybh,
sqxmdh: row.sqxmdh
}
reportResult(data).then((res: any) => {
if (res.code == 0) {
@ -378,6 +404,10 @@ const rowHandle = (row: any) => {
})
}
const sqxmClick = (row) => {
getxmmxList({ ...Info.value, ...row })
}
const handleColumnDragEnd = (newColumns: any) => {
columns.value = [];
// 使用nextTick确保DOM更新后再设置新值
@ -569,6 +599,17 @@ const rightTableConfig = ref(
}
)
const contextMenuItems = computed<ContextMenuItem[]>(() => [
{ label: '复制全部数据', action: 'All' },
{ label: '复制异常数据', action: 'N' },
{ label: '复制正常数据', action: 'Y' },
]);
const handleMenuSelect = ((item: ContextMenuItem) => {
copyData(item.action)
})
const formatJgbz = (v: string) => {
const jgbzMap = {
'H': '高',
@ -649,6 +690,19 @@ const openDB = () => {
})
}
const getCDSS = () => {
const data = {
msg: Info.value.sqh,
userId: queryParams.userid,
yljg: queryParams.yljg
}
getCdssUrl(data).then((res) => {
if (res.data) {
window.open(res.data)
}
})
}
interface copyItem {
xmdh: string;
@ -660,7 +714,7 @@ interface copyItem {
od: string;
}
// 复制函数
const copyData = (type: string) => {
const copyData = (type: string | undefined) => {
let str = '';
// 处理空值的工具函数:null/undefined/空字符串都返回空白
const getFieldValue = (value: any) => {
@ -728,7 +782,6 @@ const formatGroupedData = (data: any[]) => {
const handleRowClick = (row: any) => {
getEcharts(row)
}
const getEcharts = (data: any) => {
const dateKeys = Object.keys(data).filter(key =>
/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/.test(key)
@ -929,6 +982,18 @@ const getDayDiff = (start: string, end: string): number => {
const dayDiff = Math.ceil((endTime - startTime) / (24 * 60 * 60 * 1000));
return dayDiff < 0 ? -1 : dayDiff; // -1 表示结束时间早于开始时间,>=0 为正常天数
};
const handleSizeChange = (size: number) => {
pageY.value = 0
queryParams.pageSize = size
getList()
}
const handleCurrentChange = (val: number) => {
pageY.value = 0
queryParams.pageNum = val
getList()
};
const getList = () => {
const data = {
@ -944,6 +1009,8 @@ const getList = () => {
st: queryParams.st,
et: queryParams.et,
yljg: queryParams.yljg,
pageNum: queryParams.pageNum,
pageSize: queryParams.pageSize
}
if (!data.ksdh) return ElMessage.error('科室代号不能为空');
@ -955,12 +1022,13 @@ const getList = () => {
loading.value = true
reportList(data).then((res: any) => {
if (res.code == 0) {
if (res.code == 200) {
loading.value = false
tableData.value = res.data
if (res.data.length > 0) {
tableRefs.value.setCurrentRow(res.data[0])
rowHandle(res.data[0])
tableData.value = res.rows
total.value = res.total
if (res.rows.length > 0) {
tableRefs.value.setCurrentRow(res.rows[0])
rowHandle(res.rows[0])
} else {
rightTableData.value = []
bottomTableData.value = []
@ -975,12 +1043,12 @@ const getList = () => {
<style scoped lang="scss">
.mytable-style {
height: 68vh;
height: 64vh;
}
.tips {
font-family: SourceHanSansCN, SourceHanSansCN;
font-size: 16px;
font-size: 1rem;
color: #409eff;
font-weight: 600;
margin-bottom: 5px;
@ -1084,4 +1152,25 @@ const getList = () => {
font-size: .875rem;
margin-top: .3125rem;
}
.sqd-box {
position: relative;
.mask {
position: absolute;
right: -5px;
top: 40%;
cursor: pointer;
.text {
width: 18px;
padding: 8px 2px;
text-align: center;
color: #FFF;
font-size: 12px;
background-color: #4096ff;
border-radius: 0 4px 4px 0;
}
}
}
</style>

View File

@ -6,16 +6,16 @@
size="small">
<el-row>
<el-col :span="3">
<el-form-item label="部门组别:" prop="instrGroup">
<SelectTable v-model:data="queryParams.instrGroup" :fields="instrGroupFields"
:tableData="instrGroupOptions" label="zdmc" value="zddh" objKey="zddh" :border="true" size="small"
placeholder="请选择部门" :clearable="false" @get-data-value="getYqConfig" />
<el-form-item label="部门组别:" prop="lisgroup">
<SelectTable v-model:data="queryParams.lisgroup" :fields="lisgroupFields" :tableData="lisgroupOptions"
label="zdmc" value="zddh" objKey="zddh" :border="true" size="small" placeholder="请选择部门"
@get-data-value="getYqConfig" />
</el-form-item>
</el-col>
<el-col :span="3">
<el-form-item label="仪器:" prop="yq">
<SelectTable v-model:data="queryParams.yq" :tableData="instrOptions" width="100%" placeholder="请选择仪器"
clearable size="small" @getDataValue="getXmList" />
size="small" />
</el-form-item>
</el-col>
@ -32,24 +32,11 @@
</el-form-item>
</el-col>
<el-col :span="3">
<el-form-item label="病人类型:" prop="brly">
<el-form-item label="病人来源:" prop="brly">
<SelectTable v-model:data="queryParams.brly" dictType="PT" placeholder="请选择" size="small"
@getDataValue="handleQuery" />
</el-form-item>
</el-col>
<el-col :span="3">
<el-form-item label="送检医生:" prop="sjys">
<SelectTable v-model:data="queryParams.sjys" :fields="ysFields" :tableData="userList || []" size="small"
label="nickName" value="userName" objKey="userName" placeholder="请选择" @getDataValue="handleQuery" />
</el-form-item>
</el-col>
<el-col :span="3">
<el-form-item label="检验医生:" prop="yhdh">
<SelectTable v-model:data="queryParams.yhdh" :fields="ysFields" :tableData="userList || []" size="small"
label="nickName" value="userName" objKey="userName" placeholder="请选择" @getDataValue="handleQuery" />
</el-form-item>
</el-col>
<el-col :span="3">
<el-form-item label="标本类型:" prop="yblx">
@ -57,22 +44,18 @@
@getDataValue="handleQuery" />
</el-form-item>
</el-col>
<el-col :span="3">
<el-form-item label="标本号:" prop="brxm">
<el-form-item label="标本号:" prop="ch">
<el-input v-model="queryParams.ch" clearable placeholder="请输入" @keyup.enter="handleQuery"
@clear="handleQuery" />
</el-form-item>
</el-col>
<el-col :span="3">
<el-form-item label="检验项:" prop="brxm">
<SelectTable v-model:data="queryParams.yblx" :tableData="xmList" placeholder="请选择" size="small"
@getDataValue="handleQuery" />
<el-form-item label="检验项目:" prop="sqxmmc">
<el-input v-model="queryParams.sqxmmc" clearable placeholder="请输入" @keyup.enter="handleQuery"
@clear="handleQuery" />
</el-form-item>
</el-col>
<el-col :span="3">
<el-form-item label="科室:" prop="ksdh">
<SelectTable v-model:data="queryParams.ksdh" dictType='DP' placeholder="请选择科室" size="small"
@ -114,6 +97,13 @@
</el-select>
</el-form-item>
</el-col>
<el-col :span="3">
<el-form-item label="医疗机构:" prop="yljg">
<SelectTable v-model:data="queryParams.yljg" dictType="HOS" placeholder="请选择" size="small"
@getDataValue="handleQuery" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="标本日期:" prop="times">
<el-date-picker v-model="queryParams.st" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD"
@ -122,18 +112,6 @@
@change="handletime" style="width: 46%" />
</el-form-item>
</el-col>
<el-col :span="3">
<el-form-item label="备注:" prop="bz">
<el-input v-model="queryParams.bz" clearable placeholder="请输入" @keyup.enter="handleQuery"
@clear="handleQuery" />
</el-form-item>
</el-col>
<el-col :span="3">
<el-form-item label="医疗机构:" prop="yljg">
<SelectTable v-model:data="queryParams.yljg" dictType="HOS" placeholder="请选择" size="small"
@getDataValue="handleQuery" />
</el-form-item>
</el-col>
&nbsp;
<el-checkbox v-model="queryParams.jzbz" label="急诊" true-value="1" false-value="0" />
<el-checkbox v-model="queryParams.dcny" label="多重耐药(细菌查询用)" true-value="1" false-value="0" />
@ -141,7 +119,7 @@
</el-form>
</el-row>
</div>
<div class="mb8 mt10">
<div class="mb5 mt5">
<el-button icon="search" type="primary" :size="aotuSize" @click="handleQuery"> 搜索 </el-button>
<el-button type="primary" plain icon="Edit" :size="aotuSize" @click="selectStatusRows">勾选所有未打印</el-button>
<el-button type="warning" plain icon="Printer" :size="aotuSize" @click="printPdf">打印报告</el-button>
@ -166,7 +144,12 @@
{{ row.jzbz == 1 ? '急' : '' }}
</template>
</CustomVxeTable>
<div class="mt10">
<el-pagination background @size-change="handleSizeChange" @current-change="handleCurrentChange"
:size="aotuSize" :current-page="queryParams.pageNum" :page-sizes="[10, 20, 50, 100]"
:page-size="queryParams.pageSize" layout="total, sizes, prev, pager, next, jumper" :total="total">
</el-pagination>
</div>
</el-col>
<el-col :span="8" class="right-table">
<div>
@ -175,6 +158,12 @@
<template #jgbz="{ row }">
{{ formatJgbz(row.jgbz) }}
</template>
<template #xmmc="{ row }">
<el-tooltip class="box-item" effect="dark" :popper-style="{ width: '320px', maxWidth: '320px' }"
:content="row.clinicref" placement="top" :disabled="!row.clinicref">
<span>{{ row.xmmc }}</span>
</el-tooltip>
</template>
</CustomTable>
</div>
<div class="mt10" v-if="bottomTableData.length > 0"></div>
@ -215,12 +204,9 @@ import SelectTable from '@/components/SelectTable/index.vue';
import { ElMessage, ElMessageBox } from 'element-plus'
import { classCom } from '@/utils/classCom'
import { HiprintPrinter } from '@/utils/hiprintPrinter';
// @ts-ignore
import { listhospital } from "@/api/regional/dict/hospital.js";
// @ts-ignore
import { listUser } from '@/api/system/user.js'
import { usePrintStore } from '@/store/modules/printStore'
//@ts-ignore
import useUserStore from '@/store/modules/user'
import { useRoute, useRouter } from 'vue-router'
import { getComDicts } from '@/api/liswork/dict/ComDict';
@ -234,12 +220,11 @@ const tableRefs = ref()
interface QueryParams {
// times: string[]; // 明确类型为字符串元组
instrGroup: string;
lisgroup: string;
yq: string;
st: string;
et: string;
alarmflag: boolean,
jzbz: boolean,
jzbz: string,
ksdh: string,
brlyname: string,
brxm: string,
@ -248,47 +233,45 @@ interface QueryParams {
dybz: string,
sqh: string,
userid: string,
sqxmmc: string,
yljg: string,
bz: string,
yblx: string,
yhdh: string,
sjys: string,
brly: string,
jgbz: string,
dcny: string
dcny: string,
pageNum: number,
pageSize: number;
}
// 提交表单数据
const queryParams = reactive<QueryParams>({
// times: ['2025-08-19', '2025-08-19'],
instrGroup: '',
lisgroup: '',
yq: '',
st: '',
et: '',
ksdh: '0210',
ksdh: '',
brlyname: '',
sqh: '',
alarmflag: false,
jzbz: false,
jzbz: '0',
brxm: '',
brdh: '',
ch: '',
dybz: '',
userid: '',
sqxmmc: '',
yljg: userStore.sysLoginParam.loginYLJG,
bz: '',
yblx: '',
yhdh: '',
sjys: '',
brly: '',
jgbz: '',
dcny: ''
dcny: '',
pageNum: 1,
pageSize: 50,
});
const total = ref(0);
const single = ref(true);
const multiple = ref(true);
const alarmflag = ref()
const jzbz = ref()
const showSearch = ref(true);
const queryRef = ref()
// 项目点击数据
@ -360,7 +343,7 @@ const columns = ref([
{ field: 'brxm', title: '姓名', align: 'center', resizable: true, width: 50 },
{ field: 'brdh', title: '住院号', align: 'center', resizable: true, sortable: true, width: 100 },
{ field: 'sqh', title: '申请号', align: 'center', resizable: true, width: 100 },
{ field: 'brlyname', title: '病人类型', align: 'center', resizable: true, width: 60 },
{ field: 'brlyname', title: '病人来源', align: 'center', resizable: true, width: 60 },
{ field: 'brxbname', title: '性别', align: 'center', resizable: true, width: 40 },
{ field: 'nl', title: '年龄', align: 'center', resizable: true, width: 40 },
{ field: 'ksname', title: '科室', align: 'center', resizable: true, width: 90 },
@ -421,6 +404,7 @@ const rowHandle = (row: any) => {
jyrq: row.jyrq,
yq: row.yq,
ybh: row.ybh,
sqxmdh: row.sqxmdh,
}
reportResult(data).then((res: any) => {
if (res.code == 0) {
@ -512,7 +496,6 @@ const cellStyleHd = ({ row, column, rowIndex, columnIndex }: {
// 表格配置
const tableConfig = ref({
height: '71vh', // 高度
// 复选框配置
checkboxConfig: {
// 可选配置项
@ -534,43 +517,7 @@ const selectStatusRows = () => {
}
})
}
const alarmHandle = (val: boolean) => {
if (val) {
queryParams.jzbz = false
alarmflag.value = '1'
jzbz.value = null
} else {
alarmflag.value = null
}
getList()
}
const jzbzHandle = (val: boolean) => {
if (val) {
queryParams.alarmflag = false
alarmflag.value = null
jzbz.value = '1'
} else {
jzbz.value = null
}
getList()
}
const xmList = ref([])
const getXmList = () => {
const data = {
yq: queryParams.yq,
pageSize: 1000,
pageNum: 1
}
queryXmInfo(data).then((res: any) => {
xmList.value = res.data.map((item: any) => {
return {
label: item.xmmc,
value: item.xmdh
}
})
})
}
// 右侧数据源
@ -578,7 +525,7 @@ const rightTableData = ref([])
// 配置项
const rightColumns = ref([
{ prop: 'xmdh', label: '项目代号', align: 'center', visible: true, },
{ prop: 'xmmc', label: '项目名称', align: 'center', visible: true, },
{ prop: 'xmmc', label: '项目名称', align: 'center', visible: true, slot: 'xmmc' },
{ prop: 'xmmc', label: '培养结果', align: 'center', visible: true, width: 150 },
{ prop: 'csjg', label: '检验结果', align: 'center', visible: true, },
{ prop: 'refs', label: '参考值', align: 'center', visible: true, },
@ -698,23 +645,23 @@ const bottomTableConfig = ref(
)
const instrGroupOptions = ref<any[]>([])
const instrGroupFields = ref([
const lisgroupOptions = ref<any[]>([])
const lisgroupFields = ref([
{ prop: 'zddh', label: '代号', width: 80, enablePinyinSearch: true },
{ prop: 'zdmc', label: '名称', width: 150, enablePinyinSearch: true },
])
// 部门
const getinstrGroupOptions = () => {
const getlisgroupOptions = () => {
getComDicts({ zdlb: 'GROUP' }).then((res: any) => {
instrGroupOptions.value = res.data
instrGroupOptions.value.push({ zddh: 'ALL', zdmc: '所有仪器' })
lisgroupOptions.value = res.data
lisgroupOptions.value.push({ zddh: 'ALL', zdmc: '所有仪器' })
getYqConfig()
});
}
const instrOptions = ref([])
// 仪器
const getYqConfig = () => {
getGroupInstrdList({ lisgroup: queryParams.instrGroup })
getGroupInstrdList({ lisgroup: queryParams.lisgroup })
.then((res: any) => {
if (res.code == 0) {
instrOptions.value = res.data.map((item: any) => ({
@ -731,7 +678,7 @@ onMounted(async () => {
listUser(data).then((res: any) => {
userList.value = res.rows;
});
getinstrGroupOptions()
getlisgroupOptions()
// 获取当前日期(当天)
const today = dayjs();
@ -769,37 +716,30 @@ const getDayDiff = (start: string, end: string): number => {
const dayDiff = Math.ceil((endTime - startTime) / (24 * 60 * 60 * 1000));
return dayDiff < 0 ? -1 : dayDiff; // -1 表示结束时间早于开始时间,>=0 为正常天数
};
const handleSizeChange = (size: number) => {
queryParams.pageSize = size
getList()
}
const handleCurrentChange = (val: number) => {
queryParams.pageNum = val
getList()
};
const getList = () => {
const data = {
alarmflag: alarmflag.value,
jzbz: jzbz.value,
dybz: queryParams.dybz,
ksdh: queryParams.ksdh,
brlyname: queryParams.brlyname,
brxm: queryParams.brxm,
brdh: queryParams.brdh,
ch: queryParams.ch,
userid: queryParams.userid,
st: queryParams.st,
et: queryParams.et,
yljg: queryParams.yljg,
}
if (!data.ksdh) return ElMessage.error('科室代号不能为空');
if (!data.yljg) return ElMessage.error('医疗机构yljg不能为空');
// 校验日期格式
const dayDiff = getDayDiff(queryParams.st, queryParams.et);
if (dayDiff === -1 || dayDiff === -2) return ElMessage.warning('请选择有效的日期范围');
loading.value = true
reportList(data).then((res: any) => {
if (res.code == 0) {
reportList(queryParams).then((res: any) => {
if (res.code == 200) {
loading.value = false
tableData.value = res.data
if (res.data.length > 0) {
tableRefs.value.setCurrentRow(res.data[0])
rowHandle(res.data[0])
total.value = res.total
tableData.value = res.rows
if (res.rows.length > 0) {
tableRefs.value.setCurrentRow(res.rows[0])
rowHandle(res.rows[0])
} else {
rightTableData.value = []
bottomTableData.value = []
@ -814,7 +754,7 @@ const getList = () => {
<style scoped lang="scss">
.mytable-style {
height: 63vh;
height: 58vh;
}
.tips {

View File

@ -23,8 +23,7 @@
<el-row class="table-row" style="margin-top: 10px;">
<el-col :span="24" class="table-col">
<CustomTable ref="tableRef" v-model:data="tableData" :columns="columns" :config="tableConfig"
@row-dblclick="handleRowDblclick">
<CustomTable ref="tableRef" v-model:data="tableData" :columns="columns" :config="tableConfig">
<template #yq="{ row }">
{{ formatInstr(row.yq) }}
</template>
@ -35,6 +34,7 @@
<el-checkbox :model-value="row.zdsr == 'Y'" />
</template>
<template #action="{ row }">
<el-button type="primary" icon="Edit" link @click="handleEdit(row)">编辑</el-button>
<el-button type="primary" icon="Delete" link @click="handleDel(row)">删除</el-button>
</template>
</CustomTable>
@ -68,9 +68,9 @@
</el-col>
<el-col :span="14">
<div class="mb10">
<el-button type="primary" @click="handleSave">保存</el-button>
<el-button type="primary" @click="addItem">新增</el-button>
<el-button type="danger" @click="delItem">删除</el-button>
<el-button type="success" icon="Check" plain @click="handleSave">保存</el-button>
<el-button type="primary" icon="Plus" plain @click="addItem">新增</el-button>
<el-button type="danger" icon="Delete" plain @click="delItem">删除</el-button>
</div>
<div style="height: 400px">
<CustomTable ref="tableRefRight" :data="rightTableData" :columns="rightColumns" :config="tableConfig"
@ -134,7 +134,7 @@ const tableConfig = ref({
height: '100%', // 高度
border: true, // 边框
highlightCurrentRow: true, // 当前行高亮
actionWidth: 150,
actionWidth: 180,
})
const regdictList = ref<Array<{ value: string, label: string }>>([])
const rightTableData = ref<Array<{ xmdh: string, mrz: string }>>([])
@ -169,7 +169,7 @@ const handleAdd = () => {
visible.value = true
}
const handleRowDblclick = (row: any) => {
const handleEdit = (row: any) => {
getDetailsList(row)
row.yq = row.yq.trim()
row.oldMbmc = row.mbmc

View File

@ -1,13 +1,13 @@
<template>
<div class="login">
<el-form ref="loginRef" class="login-form">
<el-form ref="loginRef" class="login-form" :model="loginForm" :rules="loginRules" :hide-required-asterisk="true">
<div class="login-header">
<div class="login-logo">
<img src="@/assets/images/logo_new.png" alt="系统Logo" />
</div>
<div class="login-split"></div>
<div class="login-title">
<h1>{{ oem.appname}}</h1>
<h1>{{ oem.appname }}</h1>
</div>
</div>
@ -15,25 +15,17 @@
<el-tabs v-model="activeName" type="card" @tab-click="handleClick" class="login-tabs">
<!-- 工号登录 Tab -->
<el-tab-pane label="账号密码登录" name="first">
<el-form-item label="医疗机构:" prop="hospid"class="custom-select">
<el-select
v-model="loginForm.hospid"
placeholder="请选择医疗机构"
style="width: 100%"
>
<el-form-item label="医疗机构:" prop="loginParam.loginYLJG" class="custom-select">
<el-select v-model="loginForm.loginParam.loginYLJG" placeholder="请选择医疗机构" style="width: 100%"
@change="handleChange">
<template #prefix>
<svg-icon icon-class="international" class="el-input__icon input-icon" />
</template>
<el-option
v-for="item in selectOptions"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
<el-option v-for="item in selectOptions" :key="item.id" :label="item.name" :value="item.id"></el-option>
</el-select>
</el-form-item>
<el-form-item label="用户代号:" prop="username">
<el-form-item label="用户工号:" prop="username">
<el-input v-model="loginForm.username" type="text" size="large" auto-complete="off" placeholder="账号">
<template #prefix>
<svg-icon icon-class="user" class="el-input__icon input-icon" />
@ -43,28 +35,15 @@
<el-form-item label="登录密码:" prop="password">
<el-input v-model="loginForm.password" type="password" size="large" auto-complete="off" placeholder="密码"
@keyup.enter="handleLogin">
@keyup.enter="handleLogin">
<template #prefix>
<svg-icon icon-class="password" class="el-input__icon input-icon" />
</template>
</el-input>
</el-form-item>
<!-- 修复:移除空的el-form-item,验证码关闭时不渲染任何内容 -->
<el-form-item prop="code" v-if="!captchaEnabled" size="large">
</el-form-item>
<el-form-item prop="code" label="验 证 码 :" v-if="captchaEnabled">
<el-input
v-model="loginForm.code"
size="large"
auto-complete="off"
placeholder="验证码"
style="width: 53%"
@keyup.enter="handleLogin"
>
<el-input v-model="loginForm.code" size="large" auto-complete="off" placeholder="验证码" style="width: 53%"
@keyup.enter="handleLogin">
<template #prefix>
<svg-icon icon-class="validCode" class="el-input__icon input-icon" />
</template>
@ -75,7 +54,8 @@
</el-form-item>
<el-form-item style="width: 100%;">
<el-button :loading="loading" size="large" type="primary" class="login-btn" style="width: 100%;" @click.prevent="handleLogin">
<el-button :loading="loading" size="large" type="primary" class="login-btn" style="width: 100%;"
@click.prevent="handleLogin">
<span v-if="!loading">登 录</span>
<span v-else>登 录 中...</span>
</el-button>
@ -87,7 +67,9 @@
<el-tab-pane label="扫码登录" name="second">
<div class="tab-placeholder">
<el-icon class="placeholder-icon"><Sms /></el-icon>
<el-icon class="placeholder-icon">
<!-- <Sms /> -->
</el-icon>
<p>正在加载二维码...</p>
<el-button type="success" icon="wechat" class="wechat-login-btn">刷新二维码</el-button>
</div>
@ -95,7 +77,9 @@
<el-tab-pane label="UKEY登录" name="third">
<div class="tab-placeholder">
<el-icon class="placeholder-icon"><Wechat /></el-icon>
<el-icon class="placeholder-icon">
<!-- <Wechat /> -->
</el-icon>
<p>UKEY登录功能开发中...</p>
</div>
</el-tab-pane>
@ -103,7 +87,9 @@
</el-form>
<div class="el-login-footer">
<span>版权所有(R)2022-2026 {{ oem.compay}} 电话:{{oem.phone}} E-mail:{{oem.Email}} version:{{oem.version}}</span>
<span>版权所有(R){{ oem.copyrightyear }} {{ oem.compay }} 电话:{{ oem.phone }} E-mail:{{ oem.Email }} version:{{
oem.version
}}</span>
</div>
</div>
</template>
@ -111,75 +97,75 @@
<script setup>
import { ref, watch, getCurrentInstance, onMounted } from 'vue';
import { useRoute, useRouter } from 'vue-router';
import { useFingerprint } from '@/utils/useFingerprint';
import { getCodeImg, getInfo, getLocalconfig } from "@/api/login";
import { getCodeImg, getInfo, getLocalconfig, login } from "@/api/login";
import Cookies from "js-cookie";
import { encrypt, decrypt } from "@/utils/jsencrypt";
import useUserStore from '@/store/modules/user';
import { useCommonStore } from '@/store/modules/commonStore'
const mbStore = useCommonStore();
// 初始化响应式变量
const activeName = ref('first');
const userStore = useUserStore();
const route = useRoute();
const router = useRouter();
const oem = ref({
appname: "实验室信息管理系统",
appname: "区域检验数据平台",
phone: "",
compay: "",
version: "",
Email: ""
Email: "",
copyrightyear: ""
});
const loginRef = ref(null); // 修复:直接用ref获取表单引用
const loginRef = useTemplateRef('loginRef');
const loginForm = ref({
username: "admin",
username: "",
password: "",
rememberMe: false,
code: "",
uuid: "",
hospid: "1"
loginParam: { loginYLJG: '1', localid: undefined, loginYLJGName: '' }
});
const selectOptions = ref([{ id: '1', name: '总院' }]);
const loginRules = ref({ // 修复:改为ref响应式,方便动态修改
username: [{ required: true, trigger: "blur", message: "请输入您的账号" }],
const selectOptions = ref([]);
const loginRules = ref({
'loginParam.loginYLJG': [{ required: true, message: '请选择医疗机构', trigger: 'change' }],
username: [{ required: true, trigger: "blur", message: "请输入您的工号" }],
password: [{ required: true, trigger: "blur", message: "请输入您的密码" }],
hospid: [{ required: true, message: '请选择医疗机构', trigger: 'change' }],
code: [{ required: true, trigger: "change", message: "请输入验证码" }]
});
const codeUrl = ref("");
const loading = ref(false);
const captchaEnabled = ref(true);
const captchaEnabled = ref(false);
const register = ref(false);
const redirect = ref(undefined);
// 路由监听(优化版)
watch(
() => route.query.redirect,
(newRedirect) => {
if (redirect.value !== newRedirect) {
redirect.value = newRedirect || '';
}
},
{ immediate: true, deep: false }
() => route.query.redirect,
(newRedirect) => {
if (redirect.value !== newRedirect) {
redirect.value = newRedirect || '';
}
},
{ immediate: true, deep: false }
);
// 登录方法(修复proxy.$refs问题)
const handleChange = (value) => {
const item = selectOptions.value.find(item => item.id == value);
loginForm.value.loginParam.loginYLJG = value;
loginForm.value.loginParam.loginYLJGName = item?.name || '';
}
// 登录方法
const handleLogin = async () => {
console.log("sss",loginForm.value)
try {
const valid = await loginRef.value.validate(); // 直接用ref.validate()
loginRef.value.validate((valid) => {
if (valid) {
loading.value = true;
// 记住密码逻辑
if (loginForm.value.rememberMe) {
Cookies.set("username", loginForm.value.username, { expires: 30 });
Cookies.set("password", encrypt(loginForm.value.password), { expires: 30 });
Cookies.set("rememberMe", loginForm.value.rememberMe, { expires: 30 });
} else {
Cookies.remove("username");
Cookies.remove("password");
Cookies.remove("rememberMe");
}
// 调用action的登录方法
Cookies.set("czlis_username", loginForm.value.username, { expires: 30 });
Cookies.set("czlis_loginYLJG", loginForm.value.loginParam.loginYLJG, { expires: 30 });
// Cookies.set("czlis_loginYLJGName", loginForm.value.loginParam.loginYLJGName, { expires: 30 });
// loginForm.value.password = encrypt(loginForm.value.password); // 密码加密
userStore.login(loginForm.value).then(() => {
const query = route.query;
const otherQueryParams = Object.keys(query).reduce((acc, cur) => {
@ -188,8 +174,9 @@ const handleLogin = async () => {
}
return acc;
}, {});
const targetPath = redirect.value || "/";
if (route.path !== targetPath) {
router.push({path: redirect.value || "/", query: otherQueryParams});
router.push({ path: targetPath, query: otherQueryParams });
}
}).catch(() => {
loading.value = false;
@ -198,27 +185,8 @@ const handleLogin = async () => {
getCode();
}
});
/*
// 调用登录接口
await userStore.login(loginForm.value);
// 路由跳转(防重复跳转)
const query = route.query;
const otherQueryParams = Object.keys(query).reduce((acc, cur) => {
if (cur !== "redirect") acc[cur] = query[cur];
return acc;
}, {});
const targetPath = redirect.value || "/";
if (route.path !== targetPath) {
router.push({ path: targetPath, query: otherQueryParams });
}
*/
}
} catch (err) {
console.error("登录验证失败:", err);
} finally {
loading.value = false;
if (captchaEnabled.value) getCode(); // 失败后刷新验证码
}
})
};
// 获取验证码
@ -229,90 +197,67 @@ const getCode = () => {
codeUrl.value = "data:image/gif;base64," + res.img;
loginForm.value.uuid = res.uuid;
}
// 验证码关闭时移除校验规则,避免报错
if (!captchaEnabled.value) {
loginRules.value.code = [];
} else {
loginRules.value.code = [{ required: true, trigger: "change", message: "请输入验证码" }];
}
});
};
// 从Cookie获取账号密码
const getCookie = () => {
const username = Cookies.get("username");
const password = Cookies.get("password");
const rememberMe = Cookies.get("rememberMe");
loginForm.value = {
...loginForm.value,
username: username ?? loginForm.value.username,
password: password ? decrypt(password) : loginForm.value.password,
rememberMe: rememberMe ? Boolean(rememberMe) : false
};
const cookieUsername = Cookies.get("czlis_username");
const cookieloginYLJG = Cookies.get("czlis_loginYLJG");
loginForm.value.username = cookieUsername;
if (cookieloginYLJG) {
loginForm.value.loginParam.loginYLJG = cookieloginYLJG;
loginForm.value.loginParam.loginYLJGName = selectOptions.value.find(item => item.id == cookieloginYLJG)?.name || '';
} else {
loginForm.value.loginParam.loginYLJG = selectOptions.value[0]?.id || '1';
loginForm.value.loginParam.loginYLJGName = selectOptions.value[0]?.name || '';
}
};
// 获取本地配置
const Localconfig = (localid) => {
getLocalconfig({ localid }).then(res => {
const Localconfig = () => {
getLocalconfig().then(res => {
if (res) {
const { localconfig, hosplist, oem: oemData } = res;
console.log('本地配置:', localconfig, '医院列表:', hosplist);
// 修复:赋值oem数据,显示动态标题
mbStore.setDefaultConfig(localconfig)
if (oemData) oem.value = oemData;
// 修复:判重后更新下拉选项,避免递归
if (JSON.stringify(selectOptions.value) !== JSON.stringify(hosplist)) {
selectOptions.value = hosplist || [{ id: '1', name: '总院' }];
// 判重后赋值,避免重复修改触发更新
if (!selectOptions.value.some(item => item.id === loginForm.value.hospid)) {
loginForm.value.hospid = selectOptions.value[0]?.id || '1';
}
}
selectOptions.value = hosplist || [];
getCookie();
}
}).catch(err => {
console.error("获取本地配置失败:", err);
});
};
// 获取指纹并加载配置
const { getFingerprint } = useFingerprint();
const refreshFingerprint = async () => {
try {
const res = await getFingerprint();
Localconfig(res.visitorId);
} catch (err) {
console.error("获取指纹失败:", err);
Localconfig("default"); // 兜底使用默认ID
}
};
// Tab切换事件(移除activeName手动赋值,避免递归)
const handleClick = (tab) => {
console.log('当前Tab:', tab.name);
// console.log('当前Tab:', tab.name);
// 仅在切回账号密码登录时刷新验证码
if (tab.name === 'first' && captchaEnabled.value) {
getCode();
}
};
// 页面挂载时初始化
onMounted(() => {
refreshFingerprint();
getCode();
getCookie();
});
Localconfig();
getCode();
</script>
<style lang='scss' scoped>
.login {
display: flex;
justify-content: center;
align-items: center;
position: relative;
height: 100vh;
background-image: url("../assets/images/login-background.jpg");
background-size: cover;
overflow: hidden;
}
.login-form {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background: rgba(255, 255, 255, 0.4);
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
@ -416,9 +361,12 @@ onMounted(() => {
overflow: visible !important;
}
}
.custom-select {
margin-top: 20px; /* 可根据需求调整数值 */
margin-top: 20px;
/* 可根据需求调整数值 */
}
/* Tab占位样式 */
.tab-placeholder {
display: flex;

View File

@ -1,95 +1,88 @@
<template>
<div class="login">
<el-form ref="loginRef" class="login-form" :model="loginForm" :rules="loginRules" :hide-required-asterisk="true">
<div class="login-header">
<div class="login-logo">
<img src="@/assets/images/logo_new.png" alt="系统Logo" />
</div>
<div class="login-split"></div>
<div class="login-title">
<h1>{{ oem.appname }}</h1>
<div class="login-container">
<div class="left_img"></div>
<div class="login-form">
<el-form ref="loginRef" :model="loginForm" :rules="loginRules" :hide-required-asterisk="true">
<div class="login-header">
<div class="login-logo">
<img src="@/assets/images/logo_new.png" alt="系统Logo" />
</div>
<div class="login-split"></div>
<div class="login-title">
<h1>{{ oem.appname }}</h1>
</div>
</div>
<!-- Tab切换容器 -->
<el-tabs v-model="activeName" type="card" @tab-click="handleClick" class="login-tabs">
<!-- 工号登录 Tab -->
<el-tab-pane label="账号密码登录" name="first">
<el-form-item label="医疗机构" prop="loginParam.loginYLJG" class="custom-select">
<el-select v-model="loginForm.loginParam.loginYLJG" placeholder="请选择医疗机构" style="width: 100%"
class="no-border" @change="handleChange">
<el-option v-for="item in selectOptions" :key="item.id" :label="item.name"
:value="item.id"></el-option>
</el-select>
</el-form-item>
<el-form-item label="用户工号" prop="username">
<el-input v-model="loginForm.username" type="text" auto-complete="off" placeholder="" class="no-border">
</el-input>
</el-form-item>
<el-form-item label="登录密码" prop="password">
<el-input v-model="loginForm.password" type="password" auto-complete="off" placeholder=""
class="no-border" @keyup.enter="handleLogin">
</el-input>
</el-form-item>
<el-form-item prop="code" label="验 证 码" v-if="captchaEnabled">
<el-input v-model="loginForm.code" auto-complete="off" placeholder="" style="width: 53%"
class="no-border" @keyup.enter="handleLogin">
</el-input>
<div class="login-code">
<img :src="codeUrl" @click="getCode" class="login-code-img" />
</div>
</el-form-item>
<el-form-item style="width: 100%;">
<el-button :loading="loading" type="primary" class="login-btn" style="width: 100%;"
@click.prevent="handleLogin">
<span v-if="!loading">登 录</span>
<span v-else>登 录 中...</span>
</el-button>
<div style="float: right;" v-if="register">
<router-link class="link-type" :to="'/register'">立即注册</router-link>
</div>
</el-form-item>
</el-tab-pane>
<el-tab-pane label="扫码登录" name="second">
<div class="tab-placeholder">
<el-icon class="placeholder-icon">
<!-- <Sms /> -->
</el-icon>
<p>正在加载二维码...</p>
<el-button type="success" icon="wechat" class="wechat-login-btn">刷新二维码</el-button>
</div>
</el-tab-pane>
<el-tab-pane label="UKEY登录" name="third">
<div class="tab-placeholder">
<el-icon class="placeholder-icon">
<!-- <Wechat /> -->
</el-icon>
<p>UKEY登录功能开发中...</p>
</div>
</el-tab-pane>
</el-tabs>
</el-form>
<div class="el-login-footer">
<span>版权所有(R){{ oem.copyrightyear }} {{ oem.compay }} <br />电话:{{ oem.phone }} E-mail:{{ oem.Email }}
</span>
</div>
</div>
<!-- Tab切换容器 -->
<el-tabs v-model="activeName" type="card" @tab-click="handleClick" class="login-tabs">
<!-- 工号登录 Tab -->
<el-tab-pane label="账号密码登录" name="first">
<el-form-item label="医疗机构:" prop="loginParam.loginYLJG" class="custom-select">
<el-select v-model="loginForm.loginParam.loginYLJG" placeholder="请选择医疗机构" style="width: 100%"
@change="handleChange">
<template #prefix>
<svg-icon icon-class="international" class="el-input__icon input-icon" />
</template>
<el-option v-for="item in selectOptions" :key="item.id" :label="item.name" :value="item.id"></el-option>
</el-select>
</el-form-item>
<el-form-item label="用户工号:" prop="username">
<el-input v-model="loginForm.username" type="text" size="large" auto-complete="off" placeholder="账号">
<template #prefix>
<svg-icon icon-class="user" class="el-input__icon input-icon" />
</template>
</el-input>
</el-form-item>
<el-form-item label="登录密码:" prop="password">
<el-input v-model="loginForm.password" type="password" size="large" auto-complete="off" placeholder="密码"
@keyup.enter="handleLogin">
<template #prefix>
<svg-icon icon-class="password" class="el-input__icon input-icon" />
</template>
</el-input>
</el-form-item>
<el-form-item prop="code" label="验 证 码 :" v-if="captchaEnabled">
<el-input v-model="loginForm.code" size="large" auto-complete="off" placeholder="验证码" style="width: 53%"
@keyup.enter="handleLogin">
<template #prefix>
<svg-icon icon-class="validCode" class="el-input__icon input-icon" />
</template>
</el-input>
<div class="login-code">
<img :src="codeUrl" @click="getCode" class="login-code-img" />
</div>
</el-form-item>
<el-form-item style="width: 100%;">
<el-button :loading="loading" size="large" type="primary" class="login-btn" style="width: 100%;"
@click.prevent="handleLogin">
<span v-if="!loading">登 录</span>
<span v-else>登 录 中...</span>
</el-button>
<div style="float: right;" v-if="register">
<router-link class="link-type" :to="'/register'">立即注册</router-link>
</div>
</el-form-item>
</el-tab-pane>
<el-tab-pane label="扫码登录" name="second">
<div class="tab-placeholder">
<el-icon class="placeholder-icon">
<!-- <Sms /> -->
</el-icon>
<p>正在加载二维码...</p>
<el-button type="success" icon="wechat" class="wechat-login-btn">刷新二维码</el-button>
</div>
</el-tab-pane>
<el-tab-pane label="UKEY登录" name="third">
<div class="tab-placeholder">
<el-icon class="placeholder-icon">
<!-- <Wechat /> -->
</el-icon>
<p>UKEY登录功能开发中...</p>
</div>
</el-tab-pane>
</el-tabs>
</el-form>
<div class="el-login-footer">
<span>版权所有(R){{ oem.copyrightyear }} {{ oem.compay }} 电话:{{ oem.phone }} E-mail:{{ oem.Email }} version:{{
oem.version
}}</span>
</div>
</div>
</template>
@ -248,43 +241,65 @@ getCode();
.login {
position: relative;
height: 100vh;
background-image: url("../assets/images/login-background.jpg");
background: #02a5ff;
background-size: cover;
overflow: hidden;
}
.login-form {
.login-container {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background: rgba(255, 255, 255, 0.4);
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
border: 1px solid rgba(255, 255, 255, 0.9);
/* 关键1:替换固定百分比宽度为最大宽度+自适应,避免缩放时过度拉伸 */
width: clamp(800px, 70%, 1400px);
max-width: 1400px;
min-width: 800px;
height: 80vh;
min-height: 500px;
background: #fff;
display: flex;
border-radius: 12px;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
width: 480px;
padding: 35px 35px 5px 35px;
overflow: hidden;
.el-input {
height: 40px;
.left_img {
background-image: url(../assets/images/login_left.png);
background-size: 100% 100%;
flex: 0 0 50%;
max-width: 50%;
height: 100%;
}
}
input {
height: 40px;
}
.login-form {
flex: 1;
min-width: 350px;
height: 100%;
padding: clamp(40px, 8%, 100px);
box-sizing: border-box;
.el-form-item:not(:last-child) {
border-bottom: 1px solid #ccc
}
.input-icon {
height: 39px;
width: 14px;
margin-left: 0px;
.no-border {
--el-input-border-color: transparent !important;
--el-input-hover-border-color: transparent !important;
--el-input-focus-border-color: transparent !important;
--el-select-input-border-color: transparent !important;
border-color: transparent !important;
}
.no-border :deep(.el-input__wrapper),
.no-border :deep(.el-select__wrapper) {
border: none !important;
box-shadow: none !important;
}
}
.login-code {
width: 33%;
height: 40px;
float: right;
img {
@ -296,17 +311,23 @@ getCode();
}
}
.login-btn {
background: linear-gradient(#00d3f9, #00b1f3);
border: none;
margin-top: 20px;
width: 100%;
height: 50px;
font-size: 16px;
}
.el-login-footer {
height: 40px;
line-height: 40px;
position: fixed;
bottom: 0;
line-height: 30px;
width: 100%;
text-align: center;
color: #fff;
color: #000;
font-family: Arial;
font-size: 12px;
letter-spacing: 1px;
margin-top: 30px;
}
/* Logo和标题样式 */
@ -314,11 +335,14 @@ getCode();
display: flex;
align-items: center;
margin-bottom: 30px;
/* 缩放时标题区域自适应 */
flex-wrap: nowrap;
}
.login-logo img {
height: 40px;
width: auto;
min-height: 30px;
}
.login-split {
@ -330,28 +354,40 @@ getCode();
.login-title h1 {
margin: 0;
font-size: 24px;
color: #1989fa;
font-size: clamp(18px, 2vw, 24px);
color: #000;
font-weight: 500;
}
/* Tab容器样式(修复冲突) */
/* Tab容器样式 */
.login-tabs {
width: 100%;
height: 350px;
height: clamp(280px, 70%, 350px);
min-height: 280px;
overflow: hidden;
border-radius: 8px;
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
border: 1px solid rgba(255, 255, 255, 0.1);
padding: 1px 10px 10px;
background: transparent;
:deep(.el-tabs__header) {
background: transparent;
margin: 0;
}
:deep(.el-tabs__nav) {
width: 100% !important;
}
:deep(.el-tabs__item) {
width: 33.33% !important;
&.is-active {
border-bottom: 2px solid #00d3f9 !important;
}
}
:deep(.el-tabs__nav-prev),
:deep(.el-tabs__nav-next) {
display: none !important; // 隐藏Tab左右箭头
@ -363,8 +399,7 @@ getCode();
}
.custom-select {
margin-top: 20px;
/* 可根据需求调整数值 */
margin-top: 30px;
}
/* Tab占位样式 */
@ -375,22 +410,20 @@ getCode();
justify-content: center;
padding: 40px 0;
color: #666;
height: calc(100% - 40px); // 适配Tab容器高度
/* 适配Tab容器高度,防止溢出 */
height: calc(100% - 40px);
.placeholder-icon {
font-size: 48px;
font-size: clamp(36px, 8vw, 48px);
/* 图标大小自适应 */
margin-bottom: 20px;
color: #ccc;
}
.wechat-login-btn {
margin-top: 20px;
width: 200px;
width: clamp(150px, 40%, 200px);
/* 按钮宽度自适应 */
}
}
/* 隐藏必填项星号 */
:deep(.el-form-item.is-required:not(.is-no-asterisk) .el-form-item__label-wrap .el-form-item__asterisk) {
display: none !important;
}
</style>

View File

@ -60,69 +60,77 @@
@clear="handleQuery" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label-width="50px">
<el-button icon="search" type="primary" @click="handleQuery">
搜索
</el-button>
<!-- <el-button icon="Refresh" @click="resetQuery">重置</el-button> -->
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-row>
</div>
<el-row :gutter="20">
<el-col :span="16" class="right-table">
<el-row :gutter="10" class="mb8 mt10">
<el-col :span="1.5">
<el-button type="primary" plain icon="Edit" :size="aotuSize" @click="selectStatusRows">勾选所有未打印</el-button>
</el-col>
<el-col :span="1.5">
</el-col>
<el-col :span="1.5">
<el-button type="primary" plain icon="Upload" :size="aotuSize" @click="printPdf">打印报告</el-button>
</el-col>
<!-- <right-toolbar v-model:showSearch="showSearch" @updateColumns="updateColumns" @queryTable="handleQuery"
:columns="columns"></right-toolbar> -->
</el-row>
<CustomTable ref="tableRefs" :data="tableData" :columns="columns" :config="tableConfig" :loading="loading"
@selection-change="selectionChange" @row-click="rowHandle" :enableColumnDrag="true"
@column-drag-end="handleColumnDragEnd">
<template #dybz="{ row }">
<svg-icon v-if="row.dybz == 1" icon-class="lvgou" />
</template>
<template #srcHospName="{ row }">
武汉市汉阳区江堤街社区卫生服务中心
</template>
<template #alarmflag="{ row }">
{{ row.alarmflag == 1 ? '危' : '' }}
</template>
<template #jzbz="{ row }">
{{ row.jzbz == 1 ? '急' : '' }}
</template>
</CustomTable>
<el-row :gutter="10" class="mb5 mt5">
<el-col :span="1.5">
<el-button icon="search" type="primary" @click="handleQuery"> 搜索 </el-button>
</el-col>
<el-col :span="1.5">
<el-button type="primary" plain icon="Edit" :size="aotuSize" @click="selectStatusRows">勾选所有未打印</el-button>
</el-col>
<el-col :span="1.5">
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Printer" :size="aotuSize" @click="printPdf">打印报告</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="primary" plain :size="aotuSize" @click="openDB">对比历史</el-button>
</el-col>
</el-row>
<el-row :gutter="25">
<el-col :span="16" class="right-table sqd-box">
<div>
<CustomTable ref="tableRefs" :data="tableData" :columns="columns" :config="tableConfig" :loading="loading"
@selection-change="selectionChange" @row-click="rowHandle" :enableColumnDrag="true"
@column-drag-end="handleColumnDragEnd">
<template #dybz="{ row }">
<svg-icon v-if="row.dybz == 1" icon-class="lvgou" />
</template>
<template #alarmflag="{ row }">
{{ row.alarmflag == 1 ? '危' : '' }}
</template>
<template #jzbz="{ row }">
{{ row.jzbz == 1 ? '急' : '' }}
</template>
</CustomTable>
<!-- <div class="mask">
<el-popover placement="left" :width="400" trigger="click">
<template #reference>
<div class="text">项目明细</div>
</template>
<el-table :data="[]">
<el-table-column property="date" label="test1" />
<el-table-column property="name" label="test2" />
<el-table-column property="address" label="test3" />
</el-table>
</el-popover>
</div> -->
<div class="mt10">
<el-pagination background @size-change="handleSizeChange" @current-change="handleCurrentChange"
:size="aotuSize" :current-page="queryParams.pageNum" :page-sizes="[10, 20, 50, 100]"
:page-size="queryParams.pageSize" layout="total, sizes, prev, pager, next, jumper" :total="total">
</el-pagination>
</div>
</div>
</el-col>
<el-col :span="8" class="right-table">
<!-- <div class="title">检验结果</div> -->
<div class="mb8 mt10">
<el-button type="primary" plain :size="aotuSize" @click="openDB">对比历史</el-button>
<el-select class="ml10" placeholder="请选择复制" style="width: 140px" @change="copyData" :size="aotuSize">
<el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
<!-- <el-button type="primary">知识库</el-button> -->
</div>
<CustomTable :data="rightTableData" :columns="rightColumns" :config="rightTableConfig" @row-click="xmrowHandle"
ref="rightTableRef">
<template #jgbz="{ row }">
{{ formatJgbz(row.jgbz) }}
</template>
</CustomTable>
<ContextMenu :items="contextMenuItems" @select="handleMenuSelect" menu-width="120">
<CustomTable :data="rightTableData" :columns="rightColumns" :config="rightTableConfig"
@row-click="xmrowHandle" ref="rightTableRef">
<template #jgbz="{ row }">
{{ formatJgbz(row.jgbz) }}
</template>
<template #xmmc="{ row }">
<el-tooltip class="box-item" effect="dark" :content="row.clinicref" placement="top"
:popper-style="{ width: '320px', maxWidth: '320px' }" :disabled="!row.clinicref">
<span>{{ row.xmmc }}</span>
</el-tooltip>
</template>
</CustomTable>
</ContextMenu>
<div class="mt10" v-if="bottomTableData.length > 0"></div>
<CustomTable v-if="bottomTableData.length > 0" :data="bottomTableData" :columns="bottomColumns"
:config="bottomTableConfig">
@ -177,12 +185,11 @@ import dayjs from 'dayjs';
import SelectTable from '@/components/SelectTable/index.vue';
import { ElMessage, ElMessageBox } from 'element-plus'
import { classCom } from '@/utils/classCom'
import { HiprintPrinter } from '@/utils/hiprintPrinter';
import ContextMenu from "@/components/contextMenu/index.vue";
import * as echarts from 'echarts';
//@ts-ignore
import { comDict } from '@/utils/dict'
import { usePrintStore } from '@/store/modules/printStore'
//@ts-ignore
import { ContextMenuItem } from '@/types/index'
import useUserStore from '@/store/modules/user'
import { useRoute } from 'vue-router'
@ -196,11 +203,7 @@ const dialogVisible = ref(false)
const tableRefs = ref()
const diaTableRef = ref()
const myEcharts = ref()
const options = ref([
{ label: '复制全部数据', value: 'All' },
{ label: '复制异常数据', value: 'N' },
{ label: '复制正常数据', value: 'Y' },
])
const total = ref(0)
interface QueryParams {
times: string[]; // 明确类型为字符串元组
alarmflag: boolean,
@ -212,9 +215,12 @@ interface QueryParams {
ch: string,
dybz: string,
sqh: string,
userid: string
userid: string,
pageNum: number,
pageSize: number,
}
// 提交表单数据
const queryParams = reactive<QueryParams>({
times: ['2025-08-19', '2025-08-19'],
@ -228,7 +234,9 @@ const queryParams = reactive<QueryParams>({
brdh: '',
ch: '',
dybz: '',
userid: ''
userid: '',
pageNum: 1,
pageSize: 50,
});
// 获取当前日期(当天)
const today = dayjs();
@ -266,6 +274,16 @@ const queryRules = ref({
// ],
})
const contextMenuItems = computed<ContextMenuItem[]>(() => [
{ label: '复制全部数据', action: 'All' },
{ label: '复制异常数据', action: 'N' },
{ label: '复制正常数据', action: 'Y' },
]);
const handleMenuSelect = ((item: ContextMenuItem) => {
copyData(item.action)
})
// 时间线数据
const timelineItems = ref(
@ -309,7 +327,6 @@ const tableData = ref([])
// 配置项
const columns = ref([
{ type: 'selection', visible: true, align: 'center', width: 30, label: '多选框' },
{ prop: 'srcHospName', label: '委托机构', align: 'center', visible: true, slot: 'srcHospName', width: 200 },
{ prop: 'dybz', label: '印', align: 'center', visible: true, slot: 'dybz', width: 40 },
{ prop: 'jzbz', label: '急', align: 'center', visible: true, slot: 'jzbz', width: 40 },
{ prop: 'alarmflag', label: '危', align: 'center', visible: true, slot: 'alarmflag', width: 40 },
@ -498,7 +515,7 @@ const rightTableData = ref([])
// 配置项
const rightColumns = ref([
{ prop: 'xmdh', label: '项目代号', align: 'center', visible: true, },
{ prop: 'xmmc', label: '项目名称', align: 'center', visible: true, },
{ prop: 'xmmc', label: '项目名称', align: 'center', visible: true, slot: 'xmmc' },
{ prop: 'xmmc', label: '培养结果', align: 'center', visible: true, width: 150 },
{ prop: 'csjg', label: '检验结果', align: 'center', visible: true, },
{ prop: 'refs', label: '参考值', align: 'center', visible: true, },
@ -631,7 +648,7 @@ interface copyItem {
jgbz: string;
}
// 复制函数
const copyData = (type: string) => {
const copyData = (type: string | undefined) => {
let str = ''
const getCommonRow = (item: copyItem) => `${item.xmdh}\t${item.xmmc}\t${item.csjg}\t${item.refs}\t${item.dw}\t${item.jgbz}\t\r\n`;
rightTableData.value.forEach((v: any) => {
@ -840,8 +857,6 @@ onMounted(async () => {
// const start = dayjs().subtract(1, 'day').format('YYYY-MM-DD HH:mm:ss'); //add 时间往后
// queryParams.times = [start, end];
// console.log(queryParams.times);
// 进入页面单点登录
userStore.loginAnonymous({ name: 'admin' })
getList()
adjustTableHeight();
@ -855,7 +870,14 @@ onMounted(async () => {
};
});
const handleSizeChange = (size: number) => {
queryParams.pageSize = size
getList()
}
const handleCurrentChange = (val: number) => {
queryParams.pageNum = val
getList()
};
const getList = () => {
if (!queryParams.ksdh) return ElMessage.error('科室代号不能为空');
if (!queryParams.userid) return ElMessage.error('用户userid不能为空');
@ -872,7 +894,8 @@ const getList = () => {
st: '',
et: '',
yljg: 1,
pageNum: queryParams.pageNum,
pageSize: queryParams.pageSize
}
if (queryParams.times && queryParams.times.length) {
data.st = queryParams.times[0]
@ -882,12 +905,13 @@ const getList = () => {
}
loading.value = true
reportList(data).then((res: any) => {
if (res.code == 0) {
if (res.code == 200) {
loading.value = false
tableData.value = res.data
if (res.data.length > 0) {
tableRefs.value.setCurrentRow(res.data[0])
rowHandle(res.data[0])
tableData.value = res.rows
total.value = res.total
if (res.rows.length > 0) {
tableRefs.value.setCurrentRow(res.rows[0])
rowHandle(res.rows[0])
} else {
rightTableData.value = []
bottomTableData.value = []
@ -908,7 +932,7 @@ function adjustTableHeight() {
heightForm.value = compactForm.value.offsetHeight;
nextTick(() => {
tableConfig.value.height = `calc(74vh - ${heightForm.value}px)`
tableConfig.value.height = `calc(70vh - ${heightForm.value}px)`
tableRefs.value?.doLayout && tableRefs.value.doLayout();
});
@ -1014,4 +1038,25 @@ function adjustTableHeight() {
/* 允许鼠标交互 */
cursor: default;
}
.sqd-box {
position: relative;
.mask {
position: absolute;
right: -5px;
top: 40%;
cursor: pointer;
.text {
width: 18px;
padding: 8px 2px;
text-align: center;
color: #FFF;
font-size: 12px;
background-color: #4096ff;
border-radius: 0 4px 4px 0;
}
}
}
</style>

View File

@ -1,6 +1,6 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" class="query-form">
<el-form-item label="部门名称" prop="deptName">
<el-input v-model="queryParams.deptName" placeholder="请输入部门名称" clearable style="width: 200px"
@keyup.enter="handleQuery" />
@ -10,13 +10,15 @@
<el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
</el-col>
<el-col :span="1.5">
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:dept:add']">新增</el-button>
</el-col>

View File

@ -1,6 +1,6 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" class="query-form">
<el-form-item label="公告标题" prop="noticeTitle">
<el-input v-model="queryParams.noticeTitle" placeholder="请输入公告标题" clearable style="width: 200px"
@keyup.enter="handleQuery" />
@ -14,13 +14,15 @@
<el-option v-for="dict in sys_notice_type" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
</el-col>
<el-col :span="1.5">
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:notice:add']">新增</el-button>
</el-col>
@ -35,7 +37,7 @@
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="noticeList" @selection-change="handleSelectionChange"
<el-table v-loading="loading" :data="noticeList" @selection-change="handleSelectionChange" border
height="calc(100vh - 280px)">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="序号" align="center" prop="noticeId" width="100" />
@ -90,7 +92,7 @@
<el-form-item label="状态">
<el-radio-group v-model="form.status">
<el-radio v-for="dict in sys_notice_status" :key="dict.value" :label="dict.value">{{ dict.label
}}</el-radio>
}}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>

View File

@ -1,6 +1,6 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" class="query-form">
<el-form-item label="岗位编码" prop="postCode">
<el-input v-model="queryParams.postCode" placeholder="请输入岗位编码" clearable style="width: 200px"
@keyup.enter="handleQuery" />
@ -14,13 +14,15 @@
<el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
</el-col>
<el-col :span="1.5">
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:post:add']">新增</el-button>
</el-col>
@ -39,7 +41,7 @@
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="postList" @selection-change="handleSelectionChange"
<el-table v-loading="loading" :data="postList" @selection-change="handleSelectionChange" border
height="calc(100vh - 280px)">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="岗位编号" align="center" prop="postId" />
@ -84,7 +86,7 @@
<el-form-item label="岗位状态" prop="status">
<el-radio-group v-model="form.status">
<el-radio v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.value">{{ dict.label
}}</el-radio>
}}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="备注" prop="remark">

View File

@ -1,6 +1,7 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryRef" v-show="showSearch" :inline="true" label-width="68px">
<el-form :model="queryParams" ref="queryRef" v-show="showSearch" :inline="true" label-width="68px"
class="query-form">
<el-form-item label="角色名称" prop="roleName">
<el-input v-model="queryParams.roleName" placeholder="请输入角色名称" clearable style="width: 240px"
@keyup.enter="handleQuery" />
@ -18,12 +19,14 @@
<el-date-picker v-model="dateRange" value-format="YYYY-MM-DD" type="daterange" range-separator="-"
start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
</el-col>
<el-col :span="1.5">
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:role:add']">新增</el-button>
</el-col>
@ -43,7 +46,7 @@
</el-row>
<!-- 表格数据 -->
<el-table v-loading="loading" :data="roleList" @selection-change="handleSelectionChange"
<el-table v-loading="loading" :data="roleList" @selection-change="handleSelectionChange" border
height="calc(100vh - 280px)">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="角色编号" prop="roleId" width="120" />
@ -109,7 +112,7 @@
<el-form-item label="状态">
<el-radio-group v-model="form.status">
<el-radio v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.value">{{ dict.label
}}</el-radio>
}}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="菜单权限">

View File

@ -3,10 +3,6 @@
<el-row :gutter="20">
<!--部门数据-->
<el-col :span="4" :xs="24">
<div class="head-container">
<el-input v-model="deptName" placeholder="请输入部门名称" clearable prefix-icon="Search"
style="margin-bottom: 20px" />
</div>
<div class="head-container">
<el-tree :data="deptOptions" :props="{ label: 'label', children: 'children' }" :expand-on-click-node="false"
:filter-node-method="filterNode" ref="deptTreeRef" node-key="id" highlight-current default-expand-all
@ -33,13 +29,15 @@
<el-date-picker v-model="dateRange" value-format="YYYY-MM-DD" type="daterange" range-separator="-"
start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
</el-col>
<el-col :span="1.5">
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd"
v-hasPermi="['system:user:add']">新增</el-button>
@ -67,8 +65,8 @@
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange"
height="calc(100vh - 300px)">
<el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange" border
height="calc(100vh - 280px)">
<el-table-column type="selection" width="50" align="center" />
<el-table-column label="用户编号" align="center" key="userId" prop="userId" v-if="columns[0].visible" />
<el-table-column label="用户名称" align="center" key="userName" prop="userName" v-if="columns[1].visible"