Commit 4ff0ebd7 by Neo Turing

chore: 统一文件行尾符格式为CRLF (Windows)

parent c6c25559
...@@ -28,9 +28,9 @@ export const chineseMessages = { ...@@ -28,9 +28,9 @@ export const chineseMessages = {
'@typescript-eslint/prefer-nullish-coalescing': '应使用空值合并运算符', '@typescript-eslint/prefer-nullish-coalescing': '应使用空值合并运算符',
// 代码风格规则 // 代码风格规则
'indent': '缩进不正确', indent: '缩进不正确',
'quotes': '引号使用不一致', quotes: '引号使用不一致',
'semi': '缺少分号', semi: '缺少分号',
'comma-dangle': '尾随逗号使用不正确', 'comma-dangle': '尾随逗号使用不正确',
'eol-last': '文件末尾应有换行符', 'eol-last': '文件末尾应有换行符',
'no-trailing-spaces': '行尾存在多余空格', 'no-trailing-spaces': '行尾存在多余空格',
......
...@@ -193,4 +193,4 @@ ...@@ -193,4 +193,4 @@
"Status": 0 "Status": 0
} }
] ]
} }
\ No newline at end of file
...@@ -9,7 +9,7 @@ export const REG_PHONE = ...@@ -9,7 +9,7 @@ export const REG_PHONE =
* *
* 6-18 characters, including letters, numbers, and underscores * 6-18 characters, including letters, numbers, and underscores
*/ */
export const REG_PWD = /^.*$/ // /^\w{6,18}$/; export const REG_PWD = /^.*$/; // /^\w{6,18}$/;
/** Email reg */ /** Email reg */
export const REG_EMAIL = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/; export const REG_EMAIL = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/;
......
...@@ -2,10 +2,10 @@ ...@@ -2,10 +2,10 @@
import { createReusableTemplate } from '@vueuse/core'; import { createReusableTemplate } from '@vueuse/core';
import type { RouteKey } from '@elegant-router/types'; import type { RouteKey } from '@elegant-router/types';
import { h } from 'vue'; import { h } from 'vue';
import { breadcrumbDark } from 'naive-ui';
import { useThemeStore } from '@/store/modules/theme'; import { useThemeStore } from '@/store/modules/theme';
import { useRouteStore } from '@/store/modules/route'; import { useRouteStore } from '@/store/modules/route';
import { useRouterPush } from '@/hooks/common/router'; import { useRouterPush } from '@/hooks/common/router';
import { breadcrumbDark } from 'naive-ui';
defineOptions({ defineOptions({
name: 'GlobalBreadcrumb' name: 'GlobalBreadcrumb'
......
...@@ -20,10 +20,12 @@ withDefaults(defineProps<Props>(), { ...@@ -20,10 +20,12 @@ withDefaults(defineProps<Props>(), {
<template> <template>
<RouterLink to="/" class="w-full flex-center nowrap-hidden"> <RouterLink to="/" class="w-full flex-center nowrap-hidden">
<!-- <SystemLogo class="text-32px text-primary" /> <!--
<SystemLogo class="text-32px text-primary" />
<h2 v-show="showTitle" class="pl-8px text-16px text-primary font-bold transition duration-300 ease-in-out"> <h2 v-show="showTitle" class="pl-8px text-16px text-primary font-bold transition duration-300 ease-in-out">
{{ $t('system.title') }} {{ $t('system.title') }}
</h2> --> </h2>
-->
<img v-if="Icon" :src="Icon" alt="" style="width: 32px" /> <img v-if="Icon" :src="Icon" alt="" style="width: 32px" />
<SystemLogo v-else class="text-32px text-primary" /> <SystemLogo v-else class="text-32px text-primary" />
<h2 v-show="showTitle" class="pl-8px text-16px text-primary font-bold transition duration-300 ease-in-out"> <h2 v-show="showTitle" class="pl-8px text-16px text-primary font-bold transition duration-300 ease-in-out">
......
...@@ -70,7 +70,8 @@ function toggleSiderCollapse() { ...@@ -70,7 +70,8 @@ function toggleSiderCollapse() {
<i :class="icon"></i> <i :class="icon"></i>
<p <p
class="w-full ellipsis-text text-center text-12px transition-height-300" class="w-full ellipsis-text text-center text-12px transition-height-300"
:class="[isMini ? 'h-0 pt-0' : 'h-20px pt-4px']"> :class="[isMini ? 'h-0 pt-0' : 'h-20px pt-4px']"
>
{{ label }} {{ label }}
</p> </p>
</div> </div>
......
...@@ -104,9 +104,17 @@ registerShortcut(); ...@@ -104,9 +104,17 @@ registerShortcut();
</script> </script>
<template> <template>
<NModal v-model:show="visible" :segmented="{ footer: 'soft' }" :closable="false" preset="card" auto-focus <NModal
footer-style="padding: 0; margin: 0" class="fixed left-0 right-0" v-model:show="visible"
:class="[isMobile ? 'size-full top-0px rounded-0' : 'w-630px top-50px']" @after-leave="handleClose"> :segmented="{ footer: 'soft' }"
:closable="false"
preset="card"
auto-focus
footer-style="padding: 0; margin: 0"
class="fixed left-0 right-0"
:class="[isMobile ? 'size-full top-0px rounded-0' : 'w-630px top-50px']"
@after-leave="handleClose"
>
<NInputGroup> <NInputGroup>
<NInput v-model:value="keyword" clearable :placeholder="$t('common.keywordSearch')" @input="handleSearch"> <NInput v-model:value="keyword" clearable :placeholder="$t('common.keywordSearch')" @input="handleSearch">
<template #prefix> <template #prefix>
......
...@@ -11,7 +11,7 @@ defineOptions({ ...@@ -11,7 +11,7 @@ defineOptions({
}); });
const authStore = useAuthStore(); const authStore = useAuthStore();
const themeStore = useThemeStore(); const themeStore = useThemeStore();
themeStore.watermark.text = authStore.userInfo.FullName themeStore.watermark.text = authStore.userInfo.FullName;
const layoutMode = computed(() => themeStore.layout.mode); const layoutMode = computed(() => themeStore.layout.mode);
const isMixLayoutMode = computed(() => layoutMode.value.includes('mix')); const isMixLayoutMode = computed(() => layoutMode.value.includes('mix'));
......
...@@ -11,7 +11,7 @@ import './plugins/assets'; ...@@ -11,7 +11,7 @@ import './plugins/assets';
import { localStg } from '@/utils/storage'; import { localStg } from '@/utils/storage';
// main.js or main.ts // main.js or main.ts
import 'font-awesome/css/font-awesome.css'; import 'font-awesome/css/font-awesome.css';
// 引入 KaTeX 样式以支持数学公式渲?import 'katex/dist/katex.min.css'; // 引入 KaTeX 样式以支持数学公式渲?import 'katex/dist/katex.min.css';
import { setupDayjs, setupIconifyOffline, setupLoading, setupNProgress } from './plugins'; import { setupDayjs, setupIconifyOffline, setupLoading, setupNProgress } from './plugins';
import { setupStore } from './store'; import { setupStore } from './store';
import { setupRouter } from './router'; import { setupRouter } from './router';
...@@ -48,7 +48,7 @@ import App from './App.vue'; ...@@ -48,7 +48,7 @@ import App from './App.vue';
// startInactivityTimer(app); // startInactivityTimer(app);
// } // }
// 检查认证状?// function checkAuthStatus(app: any) { // 检查认证状?// function checkAuthStatus(app: any) {
// if (window.uiGlobalConfig?.IsAuthenticated === false) { // if (window.uiGlobalConfig?.IsAuthenticated === false) {
// localStg.remove('token'); // localStg.remove('token');
// localStg.remove('refreshToken'); // localStg.remove('refreshToken');
...@@ -73,16 +73,16 @@ async function setupApp() { ...@@ -73,16 +73,16 @@ async function setupApp() {
await setupRouter(app); await setupRouter(app);
setupI18n(app); setupI18n(app);
// 检查认证状? // checkAuthStatus(app); // 检查认证状? // checkAuthStatus(app);
// 检查上次活动时? // checkLastActivity(app); // 检查上次活动时? // checkLastActivity(app);
// 监听用户的操? // window.addEventListener('mousemove', () => resetInactivityTimer(app)); // 监听用户的操? // window.addEventListener('mousemove', () => resetInactivityTimer(app));
// window.addEventListener('keydown', () => resetInactivityTimer(app)); // window.addEventListener('keydown', () => resetInactivityTimer(app));
// window.addEventListener('click', () => resetInactivityTimer(app)); // window.addEventListener('click', () => resetInactivityTimer(app));
// window.addEventListener('scroll', () => resetInactivityTimer(app)); // window.addEventListener('scroll', () => resetInactivityTimer(app));
// 启动计时? // startInactivityTimer(app); // 启动计时? // startInactivityTimer(app);
app.use(VueGridLayout); app.use(VueGridLayout);
app.use(MateChat); app.use(MateChat);
...@@ -94,7 +94,7 @@ async function setupApp() { ...@@ -94,7 +94,7 @@ async function setupApp() {
app.mount('#app'); app.mount('#app');
} }
// 页面卸载时保存最后活动时?// window.addEventListener('beforeunload', () => { // 页面卸载时保存最后活动时?// window.addEventListener('beforeunload', () => {
// localStorage.setItem('lastActivityTime', Date.now().toString()); // localStorage.setItem('lastActivityTime', Date.now().toString());
// }); // });
......
/*# sourceMappingURL=global.css.map */ /*# sourceMappingURL=global.css.map */
\ No newline at end of file
/*# sourceMappingURL=scrollbar.css.map */ /*# sourceMappingURL=scrollbar.css.map */
\ No newline at end of file
declare module 'vue-grid-layout' { declare module 'vue-grid-layout' {
import { Plugin } from 'vue'; import type { Plugin } from 'vue';
export const GridLayout: any; export const GridLayout: any;
export const GridItem: any; export const GridItem: any;
......
...@@ -101,19 +101,21 @@ export const renderMarkdownWithMath = (content: string): string => { ...@@ -101,19 +101,21 @@ export const renderMarkdownWithMath = (content: string): string => {
// 处理段落(双换行表示段落分隔) // 处理段落(双换行表示段落分隔)
const paragraphs = processed.split(/\n\s*\n/); const paragraphs = processed.split(/\n\s*\n/);
processed = paragraphs.map(paragraph => { processed = paragraphs
const trimmed = paragraph.trim(); .map(paragraph => {
if (!trimmed) return ''; const trimmed = paragraph.trim();
if (!trimmed) return '';
// 如果已经是HTML标签,不要包装
if (trimmed.startsWith('<')) { // 如果已经是HTML标签,不要包装
return trimmed; if (trimmed.startsWith('<')) {
} return trimmed;
}
// 处理单行换行
const withBreaks = trimmed.replace(/\n/g, '<br>'); // 处理单行换行
return `<p>${withBreaks}</p>`; const withBreaks = trimmed.replace(/\n/g, '<br>');
}).join('\n'); return `<p>${withBreaks}</p>`;
})
.join('\n');
console.log('最终处理结果:', processed); console.log('最终处理结果:', processed);
return processed; return processed;
......
...@@ -7,7 +7,7 @@ export const createMarkdownRenderer = () => { ...@@ -7,7 +7,7 @@ export const createMarkdownRenderer = () => {
const md = new MarkdownIt({ const md = new MarkdownIt({
html: true, html: true,
linkify: true, linkify: true,
typographer: true, typographer: true
}); });
// 使用 markdown-it-katex 插件 // 使用 markdown-it-katex 插件
...@@ -15,7 +15,7 @@ export const createMarkdownRenderer = () => { ...@@ -15,7 +15,7 @@ export const createMarkdownRenderer = () => {
blockClass: 'math-display', blockClass: 'math-display',
errorColor: '#cc0000', errorColor: '#cc0000',
macros: { macros: {
"\\RR": "\\mathbb{R}" '\\RR': '\\mathbb{R}'
} }
}); });
......
<template>
<div class="plan-detail-selector">
<!-- <div class="header">
<div class="title">测试方案明细选择</div>
<n-space style="display: flex; align-items: center;">
<span class="plan-name">{{ planName }}</span>
<n-tag type="info">{{ checkedRowKeys.length }}项已选择</n-tag>
</n-space>
</div> -->
<n-alert type="info" style="margin-bottom: 16px">
请选择需要进行比对测试的项目,选中的项目将被添加到测试数据表格中。
</n-alert>
<n-data-table
:columns="columns"
:data="planDetails"
:bordered="false"
:row-key="(row) => row.key"
:checked-row-keys="checkedRowKeys"
@update:checked-row-keys="handleCheckedRowKeysChange"
:children-key="'children'"
:indent="20"
:max-height="300"
:min-height="300"
:pagination="false"
striped
:loading="loading"
></n-data-table>
<div class="footer">
<n-space justify="end">
<n-button @click="cancel">取消</n-button>
<n-button type="primary" @click="confirm" :disabled="checkedRowKeys.length === 0">
确认选择({{ checkedRowKeys.length }})
</n-button>
</n-space>
</div>
</div>
</template>
<script setup lang="ts"> <script setup lang="ts">
import { computed, defineEmits, defineProps, ref, watch, onMounted } from 'vue'; import { computed, defineEmits, defineProps, onMounted, ref, watch } from 'vue';
// 主体框架内置的第三方方法通过window对象暴露、供外部组件使用 // 主体框架内置的第三方方法通过window对象暴露、供外部组件使用
const axios = (window as any).$axios; const axios = (window as any).$axios;
// 获取主题状态 // 获取主题状态
...@@ -56,11 +15,11 @@ const legendTextColor = computed(() => (isDarkMode.value ? 'rgba(255, 255, 255, ...@@ -56,11 +15,11 @@ const legendTextColor = computed(() => (isDarkMode.value ? 'rgba(255, 255, 255,
const borderColor = computed(() => (isDarkMode.value ? '#303030' : '#ffffff')); const borderColor = computed(() => (isDarkMode.value ? '#303030' : '#ffffff'));
// CSS变量 // CSS变量
const cssVars = computed(() => ({ const cssVars = computed(() => ({
'--text-color': textColor.value, '--text-color': textColor.value,
'--bg-color': isDarkMode.value ? '#1f1f1f' : '#f5f5f5', '--bg-color': isDarkMode.value ? '#1f1f1f' : '#f5f5f5',
'--panel-bg': isDarkMode.value ? '#262626' : '#ffffff', '--panel-bg': isDarkMode.value ? '#262626' : '#ffffff',
'--card-bg': isDarkMode.value ? '#303030' : '#ffffff', '--card-bg': isDarkMode.value ? '#303030' : '#ffffff',
'--border-color': isDarkMode.value ? '#434343' : '#e8e8e8' '--border-color': isDarkMode.value ? '#434343' : '#e8e8e8'
})); }));
interface PlanDetailItem { interface PlanDetailItem {
...@@ -108,7 +67,7 @@ async function fetchTestDetails() { ...@@ -108,7 +67,7 @@ async function fetchTestDetails() {
} }
} catch (error) { } catch (error) {
message.error('获取测试详情失败'); message.error('获取测试详情失败');
// console.error(error); // console.error(error);
} finally { } finally {
loading.value = false; loading.value = false;
} }
...@@ -161,15 +120,19 @@ function processTreeData(data: any[]) { ...@@ -161,15 +120,19 @@ function processTreeData(data: any[]) {
} }
// 监听standardKvid变化,重新获取数据 // 监听standardKvid变化,重新获取数据
watch(() => props.standardKvid, (newValue) => { watch(
if (newValue) { () => props.standardKvid,
fetchTestDetails(); newValue => {
// 重置选中状态 if (newValue) {
checkedRowKeys.value = []; fetchTestDetails();
} else { // 重置选中状态
planDetails.value = []; checkedRowKeys.value = [];
} } else {
}, { immediate: true }); planDetails.value = [];
}
},
{ immediate: true }
);
// 处理行选择变化 // 处理行选择变化
function handleCheckedRowKeysChange(keys: (string | number)[]) { function handleCheckedRowKeysChange(keys: (string | number)[]) {
...@@ -185,7 +148,7 @@ const planName = computed(() => { ...@@ -185,7 +148,7 @@ const planName = computed(() => {
// 表格列定义 // 表格列定义
const columns = [ const columns = [
{ {
type: 'selection', type: 'selection'
}, },
{ title: '测试项目', key: 'testItem', align: 'center' }, { title: '测试项目', key: 'testItem', align: 'center' },
{ title: '标准值', key: 'standardValue', align: 'center' }, { title: '标准值', key: 'standardValue', align: 'center' },
...@@ -283,6 +246,49 @@ onMounted(() => { ...@@ -283,6 +246,49 @@ onMounted(() => {
}); });
</script> </script>
<template>
<div class="plan-detail-selector">
<!--
<div class="header">
<div class="title">测试方案明细选择</div>
<n-space style="display: flex; align-items: center;">
<span class="plan-name">{{ planName }}</span>
<n-tag type="info">{{ checkedRowKeys.length }}项已选择</n-tag>
</n-space>
</div>
-->
<NAlert type="info" style="margin-bottom: 16px">
请选择需要进行比对测试的项目,选中的项目将被添加到测试数据表格中。
</NAlert>
<NDataTable
:columns="columns"
:data="planDetails"
:bordered="false"
:row-key="row => row.key"
:checked-row-keys="checkedRowKeys"
children-key="children"
:indent="20"
:max-height="300"
:min-height="300"
:pagination="false"
striped
:loading="loading"
@update:checked-row-keys="handleCheckedRowKeysChange"
></NDataTable>
<div class="footer">
<NSpace justify="end">
<NButton @click="cancel">取消</NButton>
<NButton type="primary" :disabled="checkedRowKeys.length === 0" @click="confirm">
确认选择({{ checkedRowKeys.length }})
</NButton>
</NSpace>
</div>
</div>
</template>
<style scoped> <style scoped>
.plan-detail-selector { .plan-detail-selector {
/* padding: 0 0 16px 0; */ /* padding: 0 0 16px 0; */
...@@ -315,4 +321,4 @@ onMounted(() => { ...@@ -315,4 +321,4 @@ onMounted(() => {
border-top: 1px solid #f0f0f0; border-top: 1px solid #f0f0f0;
margin-top: auto; margin-top: auto;
} }
</style> </style>
\ No newline at end of file
<script setup lang="ts"> <script setup lang="ts">
import { computed, defineProps, onMounted, reactive, ref, watch, withDefaults } from 'vue'; import { computed, defineProps, onMounted, reactive, ref, watch, withDefaults } from 'vue';
// 定义Item对象的接口 // 定义Item对象的接口
...@@ -45,7 +45,6 @@ const detailedData = reactive<ItemProps>({}); ...@@ -45,7 +45,6 @@ const detailedData = reactive<ItemProps>({});
// 存储原始数据,用于比较是否有变化 // 存储原始数据,用于比较是否有变化
const originalData = ref<ItemProps>({}); const originalData = ref<ItemProps>({});
// 创建一个通用的日期处理函数 // 创建一个通用的日期处理函数
const createDateComputed = (getter: () => string | null, setter: (val: string | null) => void) => { const createDateComputed = (getter: () => string | null, setter: (val: string | null) => void) => {
return computed({ return computed({
...@@ -87,8 +86,6 @@ const createDateComputed = (getter: () => string | null, setter: (val: string | ...@@ -87,8 +86,6 @@ const createDateComputed = (getter: () => string | null, setter: (val: string |
}); });
}; };
// 创建处理后的DealDate计算属性 // 创建处理后的DealDate计算属性
const formattedDealDate = createDateComputed( const formattedDealDate = createDateComputed(
() => detailedData.DealDate, () => detailedData.DealDate,
...@@ -158,8 +155,6 @@ const fetchDetail = async (kvid: string) => { ...@@ -158,8 +155,6 @@ const fetchDetail = async (kvid: string) => {
} }
}; };
// 监听props.item变化,同步到detailedData // 监听props.item变化,同步到detailedData
watch( watch(
() => props.item, () => props.item,
...@@ -175,10 +170,6 @@ watch( ...@@ -175,10 +170,6 @@ watch(
{ immediate: true, deep: true } { immediate: true, deep: true }
); );
// 组件加载时初始化 // 组件加载时初始化
onMounted(() => { onMounted(() => {
// console.log('applicationInformation组件已挂载'); // console.log('applicationInformation组件已挂载');
...@@ -267,7 +258,6 @@ const createEntity = async () => { ...@@ -267,7 +258,6 @@ const createEntity = async () => {
// console.error('创建失败:', response.data); // console.error('创建失败:', response.data);
message.error(response.data?.Message || '创建失败,请重试'); message.error(response.data?.Message || '创建失败,请重试');
return { success: false, error: response.data?.Message || '创建失败' }; return { success: false, error: response.data?.Message || '创建失败' };
} catch (error) { } catch (error) {
// console.error('创建实体失败:', error); // console.error('创建实体失败:', error);
message.error('系统错误,请稍后重试'); message.error('系统错误,请稍后重试');
...@@ -318,7 +308,6 @@ const updateEntity = async (changedFields: Partial<ItemProps> = {}) => { ...@@ -318,7 +308,6 @@ const updateEntity = async (changedFields: Partial<ItemProps> = {}) => {
// console.error('更新失败:', response.data); // console.error('更新失败:', response.data);
message.error(response.data?.Message || '更新失败,请重试'); message.error(response.data?.Message || '更新失败,请重试');
return { success: false, error: response.data?.Message || '更新失败' }; return { success: false, error: response.data?.Message || '更新失败' };
} catch (error) { } catch (error) {
// console.error('更新实体失败:', error); // console.error('更新实体失败:', error);
message.error('系统错误,请稍后重试'); message.error('系统错误,请稍后重试');
...@@ -351,26 +340,24 @@ const validateAndSave = async () => { ...@@ -351,26 +340,24 @@ const validateAndSave = async () => {
originalData.value = JSON.parse(JSON.stringify(detailedData)); originalData.value = JSON.parse(JSON.stringify(detailedData));
} }
return result.success; return result.success;
} else {
// 有Kvid,检查是否有数据变化
const { changed, changedFields } = hasDataChanged();
if (!changed) {
// 没有变化,直接返回成功
// console.log('数据没有变化,无需更新');
message.success('数据已是最新,无需保存');
return true;
} else {
// 有变化,需要更新
// console.log('检测到数据变化,执行更新操作,变更字段:', changedFields);
const result = await updateEntity(changedFields);
if (result.success) {
// 更新成功后更新原始数据副本
originalData.value = JSON.parse(JSON.stringify(detailedData));
}
return result.success;
}
} }
// 有Kvid,检查是否有数据变化
const { changed, changedFields } = hasDataChanged();
if (!changed) {
// 没有变化,直接返回成功
// console.log('数据没有变化,无需更新');
message.success('数据已是最新,无需保存');
return true;
}
// 有变化,需要更新
// console.log('检测到数据变化,执行更新操作,变更字段:', changedFields);
const result = await updateEntity(changedFields);
if (result.success) {
// 更新成功后更新原始数据副本
originalData.value = JSON.parse(JSON.stringify(detailedData));
}
return result.success;
}; };
// 导出方法供父组件调用 // 导出方法供父组件调用
...@@ -394,12 +381,7 @@ defineExpose({ ...@@ -394,12 +381,7 @@ defineExpose({
</div> </div>
<div style="display: flex; width: 100%"> <div style="display: flex; width: 100%">
<NFormItem path="SampleName" label="实验室名称" style="width: 50%"> <NFormItem path="SampleName" label="实验室名称" style="width: 50%">
<NInput <NInput v-model:value="detailedData.SampleName" placeholder="请输入实验室名称" clearable size="medium" />
v-model:value="detailedData.SampleName"
placeholder="请输入实验室名称"
clearable
size="medium"
/>
</NFormItem> </NFormItem>
<NFormItem path="labAddress" label="实验室地址" style="width: 50%"> <NFormItem path="labAddress" label="实验室地址" style="width: 50%">
......
<script setup lang="ts"> <script setup lang="ts">
import { computed, defineEmits, defineProps, h, onMounted, ref, resolveComponent } from 'vue'; import { computed, defineEmits, defineProps, h, onMounted, ref, resolveComponent } from 'vue';
import TestPlanDetailSelector from './TestPlanDetailSelector.vue'; // '/codes/TestPlanDetailSelector.vue'; import TestPlanDetailSelector from './TestPlanDetailSelector.vue'; // '/codes/TestPlanDetailSelector.vue';
...@@ -75,7 +75,7 @@ async function fetchTestPlanOptions() { ...@@ -75,7 +75,7 @@ async function fetchTestPlanOptions() {
// 调用标准实体查询接口 // 调用标准实体查询接口
const response = await axios.post('/Restful/Kivii.Standards.Entities.Standard/Query.json?Type=比对测试'); const response = await axios.post('/Restful/Kivii.Standards.Entities.Standard/Query.json?Type=比对测试');
// console.log('测试方案响应数据:', response.data); // console.log('测试方案响应数据:', response.data);
// 添加数据存在性检查 // 添加数据存在性检查
if (response.data && response.data.Results) { if (response.data && response.data.Results) {
...@@ -85,12 +85,12 @@ async function fetchTestPlanOptions() { ...@@ -85,12 +85,12 @@ async function fetchTestPlanOptions() {
value: item.Kvid value: item.Kvid
})); }));
} else { } else {
// console.error('无效的数据格式:', response.data); // console.error('无效的数据格式:', response.data);
message.error('数据格式不正确'); message.error('数据格式不正确');
} }
} catch (error) { } catch (error) {
message.error('获取测试方案失败'); message.error('获取测试方案失败');
// console.error('获取测试方案失败:', error); // console.error('获取测试方案失败:', error);
} finally { } finally {
loading.value = false; loading.value = false;
} }
......
...@@ -271,7 +271,7 @@ async function fetchAuditItems() { ...@@ -271,7 +271,7 @@ async function fetchAuditItems() {
message.success('审核项目加载成功'); message.success('审核项目加载成功');
} catch (error) { } catch (error) {
message.error('获取审核项目失败'); message.error('获取审核项目失败');
// console.error('获取审核项目失败:', error); // console.error('获取审核项目失败:', error);
} finally { } finally {
loading.value = false; loading.value = false;
} }
......
...@@ -232,7 +232,7 @@ async function fetchAuditSchemes() { ...@@ -232,7 +232,7 @@ async function fetchAuditSchemes() {
message.success('审核方案加载成功'); message.success('审核方案加载成功');
} catch (error) { } catch (error) {
message.error('获取审核方案失败'); message.error('获取审核方案失败');
// console.error('获取审核方案失败:', error); // console.error('获取审核方案失败:', error);
} finally { } finally {
schemesLoading.value = false; schemesLoading.value = false;
} }
...@@ -288,7 +288,7 @@ async function fetchAuditTeam() { ...@@ -288,7 +288,7 @@ async function fetchAuditTeam() {
message.success('审核团队加载成功'); message.success('审核团队加载成功');
} catch (error) { } catch (error) {
message.error('获取审核团队失败'); message.error('获取审核团队失败');
// console.error('获取审核团队失败:', error); // console.error('获取审核团队失败:', error);
} finally { } finally {
teamLoading.value = false; teamLoading.value = false;
} }
......
...@@ -57,14 +57,20 @@ const bgColor = computed(() => { ...@@ -57,14 +57,20 @@ const bgColor = computed(() => {
<NCard :bordered="false" class="relative z-4 w-auto rd-12px"> <NCard :bordered="false" class="relative z-4 w-auto rd-12px">
<div class="w-400px lt-sm:w-300px"> <div class="w-400px lt-sm:w-300px">
<header class="flex-y-center justify-between"> <header class="flex-y-center justify-between">
<img v-if="Icon" :src="Icon" alt="" style="width: 50px;" /> <img v-if="Icon" :src="Icon" alt="" style="width: 50px" />
<SystemLogo v-else class="text-64px text-primary lt-sm:text-48px" /> <SystemLogo v-else class="text-64px text-primary lt-sm:text-48px" />
<h3 class="text-28px text-primary font-500 lt-sm:text-22px">{{ DisplayName }}</h3> <h3 class="text-28px text-primary font-500 lt-sm:text-22px">{{ DisplayName }}</h3>
<div class="i-flex-col"> <div class="i-flex-col">
<ThemeSchemaSwitch :theme-schema="themeStore.themeScheme" :show-tooltip="false" <ThemeSchemaSwitch
class="text-20px lt-sm:text-18px" @switch="themeStore.toggleThemeScheme" /> :theme-schema="themeStore.themeScheme"
<!-- <LangSwitch :lang="appStore.locale" :lang-options="appStore.localeOptions" :show-tooltip="false" :show-tooltip="false"
@change-lang="appStore.changeLocale" /> --> class="text-20px lt-sm:text-18px"
@switch="themeStore.toggleThemeScheme"
/>
<!--
<LangSwitch :lang="appStore.locale" :lang-options="appStore.localeOptions" :show-tooltip="false"
@change-lang="appStore.changeLocale" />
-->
</div> </div>
</header> </header>
<main class="pt-24px"> <main class="pt-24px">
......
...@@ -97,20 +97,24 @@ async function handleSubmit() { ...@@ -97,20 +97,24 @@ async function handleSubmit() {
<NButton type="primary" size="large" round block :loading="authStore.loginLoading" @click="handleSubmit"> <NButton type="primary" size="large" round block :loading="authStore.loginLoading" @click="handleSubmit">
{{ $t('common.confirm') }} {{ $t('common.confirm') }}
</NButton> </NButton>
<!-- <div class="flex-y-center justify-between gap-12px"> <!--
<div class="flex-y-center justify-between gap-12px">
<NButton class="flex-1" block @click="toggleLoginModule('code-login')"> <NButton class="flex-1" block @click="toggleLoginModule('code-login')">
{{ $t(loginModuleRecord['code-login']) }} {{ $t(loginModuleRecord['code-login']) }}
</NButton> </NButton>
<NButton class="flex-1" block @click="toggleLoginModule('register')"> <NButton class="flex-1" block @click="toggleLoginModule('register')">
{{ $t(loginModuleRecord.register) }} {{ $t(loginModuleRecord.register) }}
</NButton> </NButton>
</div> --> </div>
<!-- <NDivider class="text-14px text-#666 !m-0">{{ $t('page.login.pwdLogin.otherAccountLogin') }}</NDivider> -->
<!--
<NDivider class="text-14px text-#666 !m-0">{{ $t('page.login.pwdLogin.otherAccountLogin') }}</NDivider>
<div class="flex-center gap-12px"> <div class="flex-center gap-12px">
<NButton v-for="item in accounts" :key="item.key" type="primary" @click="handleAccountLogin(item)"> <NButton v-for="item in accounts" :key="item.key" type="primary" @click="handleAccountLogin(item)">
{{ item.label }} {{ item.label }}
</NButton> </NButton>
</div> --> </div>
-->
</NSpace> </NSpace>
</NForm> </NForm>
</template> </template>
......
...@@ -429,7 +429,7 @@ onUnmounted(() => { ...@@ -429,7 +429,7 @@ onUnmounted(() => {
</div> </div>
<div class="header-actions"> <div class="header-actions">
<i class="icon-add action-btn" @click="newChat"></i> <i class="icon-add action-btn" @click="newChat"></i>
<i class="icon-settings action-btn" title="API配置" @click="showConfig = !showConfig"></i> <i class="action-btn icon-settings" title="API配置" @click="showConfig = !showConfig"></i>
</div> </div>
</div> </div>
...@@ -508,7 +508,7 @@ onUnmounted(() => { ...@@ -508,7 +508,7 @@ onUnmounted(() => {
<div v-if="!showStartPage" ref="chatContentRef" class="chat-content"> <div v-if="!showStartPage" ref="chatContentRef" class="chat-content">
<template v-for="msg in messages" :key="`${msg.id}-${msg.phase}-${Date.now()}`"> <template v-for="msg in messages" :key="`${msg.id}-${msg.phase}-${Date.now()}`">
<!-- 用户消息 --> <!-- 用户消息 -->
<div v-if="msg.from === 'user'" class="message user-message"> <div v-if="msg.from === 'user'" class="user-message message">
<div class="message-content">{{ msg.content }}</div> <div class="message-content">{{ msg.content }}</div>
<div class="message-avatar">👤</div> <div class="message-avatar">👤</div>
</div> </div>
......
...@@ -193,4 +193,4 @@ ...@@ -193,4 +193,4 @@
"Status": 0 "Status": 0
} }
] ]
} }
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment