Commit dee4d0eb by 李宁

1

1 parent 9c18465f
*.DS_Store
**/node_modules/
**/dist/
**/package-lock.json
**/yarn.lock
**/dist.zip
# local env files
.env.local
.env.*.local
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
<div class="header-content"> <div class="header-content">
<img src="img/logo.png" alt="Logo" class="logo"> <img src="img/logo.png" alt="Logo" class="logo">
<img src="img/hello.png" alt="Logo" class="hello"> <img src="img/hello.png" alt="Logo" class="hello">
<div class="name">欢迎登录和家智</div> <div class="name">欢迎怀化移动智能质</div>
</div> </div>
</div> </div>
</div> </div>
......
...@@ -3,7 +3,9 @@ ...@@ -3,7 +3,9 @@
"allow": [ "allow": [
"Bash(npm run build)", "Bash(npm run build)",
"Read(//Users/lining/Desktop/xsdCode/Activity/huaiHua/app/**)", "Read(//Users/lining/Desktop/xsdCode/Activity/huaiHua/app/**)",
"Read(//Users/lining/Desktop/xsdCode/Activity/huaiHua/**)" "Read(//Users/lining/Desktop/xsdCode/Activity/huaiHua/**)",
"Read(//Users/lining/Downloads/**)",
"Bash(npm run dev)"
], ],
"deny": [], "deny": [],
"ask": [] "ask": []
......
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
...@@ -5,8 +5,8 @@ ...@@ -5,8 +5,8 @@
<link rel="icon" href="/favicon.ico" /> <link rel="icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>视频质检系统</title> <title>视频质检系统</title>
<script type="module" crossorigin src="./assets/index-D1E41z8w.js"></script> <script type="module" crossorigin src="./assets/index-BpBuKBGo.js"></script>
<link rel="stylesheet" crossorigin href="./assets/index--TXUEGg1.css"> <link rel="stylesheet" crossorigin href="./assets/index-BPUNzQVu.css">
</head> </head>
<body> <body>
<div id="app"></div> <div id="app"></div>
......
...@@ -24,6 +24,10 @@ ...@@ -24,6 +24,10 @@
<el-icon><List /></el-icon> <el-icon><List /></el-icon>
<span>质检信息列表</span> <span>质检信息列表</span>
</el-menu-item> </el-menu-item>
<el-menu-item index="/quality-result">
<el-icon><DocumentChecked /></el-icon>
<span>质检结果列表</span>
</el-menu-item>
<el-menu-item index="/staff-list"> <el-menu-item index="/staff-list">
<el-icon><User /></el-icon> <el-icon><User /></el-icon>
<span>工维人员管理</span> <span>工维人员管理</span>
...@@ -42,7 +46,7 @@ ...@@ -42,7 +46,7 @@
<script setup> <script setup>
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router'
import { Upload, List, User } from '@element-plus/icons-vue' import { Upload, List, User, DocumentChecked } from '@element-plus/icons-vue'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import { onMounted } from 'vue' import { onMounted } from 'vue'
import Header from './components/Header.vue' import Header from './components/Header.vue'
......
...@@ -2,25 +2,16 @@ ...@@ -2,25 +2,16 @@
<div class="header"> <div class="header">
<div class="header-left"> <div class="header-left">
<img src="../assets/logo.png" alt="Logo" class="header-logo" /> <img src="../assets/logo.png" alt="Logo" class="header-logo" />
<span class="header-title">和家智检管理系统</span> <span class="header-title">怀化移动智能质检</span>
</div> </div>
<div class="header-right"> <div class="header-right">
<el-dropdown @command="handleCommand"> <div class="header-actions" @click="downLoad">
<div class="user-info"> <el-tooltip content="操作手册" placement="bottom" effect="dark">
<span class="username">Hi,{{ username }}</span> <div class="manual-icon">
<el-icon class="arrow-icon"> <el-icon><Document /></el-icon>
<ArrowDown /> </div>
</el-icon> </el-tooltip>
</div> </div>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item command="logout">
<el-icon><SwitchButton /></el-icon>
退出登录
</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
<el-dropdown @command="handleCommand"> <el-dropdown @command="handleCommand">
<div class="user-info"> <div class="user-info">
<span class="username">Hi,{{ username }}</span> <span class="username">Hi,{{ username }}</span>
...@@ -45,7 +36,7 @@ ...@@ -45,7 +36,7 @@
import { ref, onMounted } from 'vue' import { ref, onMounted } from 'vue'
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router'
import { ElMessage, ElMessageBox } from 'element-plus' import { ElMessage, ElMessageBox } from 'element-plus'
import { ArrowDown, SwitchButton } from '@element-plus/icons-vue' import { ArrowDown, SwitchButton, Document } from '@element-plus/icons-vue'
const router = useRouter() const router = useRouter()
const username = ref('') const username = ref('')
...@@ -55,6 +46,10 @@ onMounted(() => { ...@@ -55,6 +46,10 @@ onMounted(() => {
username.value = localStorage.getItem('adminNum') || '用户' username.value = localStorage.getItem('adminNum') || '用户'
}) })
const downLoad = () => {
window.open('https://jfq5tn3wbn.feishu.cn/docx/P5bvdCV3jo0E2axFa9bczwdQnQc?from=from_copylink')
}
const handleCommand = async (command) => { const handleCommand = async (command) => {
if (command === 'logout') { if (command === 'logout') {
try { try {
...@@ -118,6 +113,33 @@ const handleCommand = async (command) => { ...@@ -118,6 +113,33 @@ const handleCommand = async (command) => {
.header-right { .header-right {
display: flex; display: flex;
align-items: center; align-items: center;
gap: 16px;
}
.header-actions {
display: flex;
align-items: center;
}
.manual-icon {
display: flex;
align-items: center;
justify-content: center;
width: 36px;
height: 36px;
border-radius: 6px;
cursor: pointer;
transition: all 0.3s ease;
color: #666666;
}
.manual-icon:hover {
background-color: #f5f5f5;
color: #409eff;
}
.manual-icon .el-icon {
font-size: 18px;
} }
.user-info { .user-info {
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
</div> </div>
<div class="form-header"> <div class="form-header">
<h2>智能质检运营平台</h2> <h2>怀化移动智能质检</h2>
</div> </div>
<el-form :model="loginForm" :rules="rules" ref="loginFormRef" class="login-form-inner"> <el-form :model="loginForm" :rules="rules" ref="loginFormRef" class="login-form-inner">
...@@ -112,8 +112,8 @@ const loading = ref(false) ...@@ -112,8 +112,8 @@ const loading = ref(false)
const currentCaptcha = ref('') const currentCaptcha = ref('')
const loginForm = reactive({ const loginForm = reactive({
adminNum: 'huaihuayidong', adminNum: '',
password: 'Hhyd2025..', password: '',
captchaCode: '', captchaCode: '',
code: '', code: '',
codeId: '' codeId: ''
......
...@@ -70,8 +70,8 @@ ...@@ -70,8 +70,8 @@
<el-table-column prop="applyId" label="质检号ID" width="220"></el-table-column> <el-table-column prop="applyId" label="质检号ID" width="220"></el-table-column>
<el-table-column prop="campaignId" label="工维人员工号" width="120"></el-table-column> <el-table-column prop="campaignId" label="工维人员工号" width="120"></el-table-column>
<el-table-column prop="accNbr" label="用户账号" width="120"></el-table-column> <el-table-column prop="accNbr" label="用户账号" width="120"></el-table-column>
<el-table-column prop="orderCode" label="工单号" width="120"></el-table-column> <el-table-column prop="orderCode" label="工单号" width="220" show-overflow-tooltip></el-table-column>
<el-table-column prop="addressName" label="工单地址" width="220"></el-table-column> <el-table-column prop="addressName" label="工单地址" width="220" show-overflow-tooltip></el-table-column>
<el-table-column prop="orderType" label="工单类型" width="220" show-overflow-tooltip></el-table-column> <el-table-column prop="orderType" label="工单类型" width="220" show-overflow-tooltip></el-table-column>
<el-table-column prop="deviceType" label="设备类型" width="220" show-overflow-tooltip></el-table-column> <el-table-column prop="deviceType" label="设备类型" width="220" show-overflow-tooltip></el-table-column>
<el-table-column prop="finish" label="质检状态" width="120"> <el-table-column prop="finish" label="质检状态" width="120">
...@@ -84,16 +84,14 @@ ...@@ -84,16 +84,14 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="finishTime" label="完成时间" width="180"></el-table-column> <el-table-column prop="finishTime" label="完成时间" width="180"></el-table-column>
<el-table-column label="操作" width="180" fixed="right"> <el-table-column label="操作" width="180" fixed="right" align="center">
<template #default="scope"> <template #default="scope">
<div style="display: flex; gap: 5px;"> <el-button size="small" type="danger" @click="deleteWorkOrder(scope.row)" :disabled="scope.row.finish === 1">
<el-button size="small" type="danger" @click="deleteWorkOrder(scope.row)" :disabled="scope.row.finish === 1">
删除 删除
</el-button> </el-button>
<el-button size="small" type="primary" @click="addWorkOrder(scope.row)" :disabled="scope.row.finish===1 || (scope.row.orderType&&scope.row.orderType.includes('故障投诉'))"> <el-button size="small" type="primary" @click="addWorkOrder(scope.row)" :disabled="scope.row.finish===1 || (scope.row.orderType&&scope.row.orderType.includes('故障投诉'))">
新增工单 新增工单
</el-button> </el-button>
</div>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
......
...@@ -124,9 +124,20 @@ const handleFilter = async () => { ...@@ -124,9 +124,20 @@ const handleFilter = async () => {
batchStatusList: filterForm.batchStatus batchStatusList: filterForm.batchStatus
}; };
let fn = (dateString)=>{
const date = new Date(dateString);
date.setDate(date.getDate() + 1);
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
return `${year}-${month}-${day}`;
}
if (filterForm.uploadTime && filterForm.uploadTime.length === 2) { if (filterForm.uploadTime && filterForm.uploadTime.length === 2) {
params.uploadStartTime = filterForm.uploadTime[0]; params.uploadStartTime = filterForm.uploadTime[0];
params.uploadEndTime = filterForm.uploadTime[1]; params.uploadEndTime = fn(filterForm.uploadTime[1]);
} }
const response = await getQualityBatches(params); const response = await getQualityBatches(params);
......
<template>
<div class="quality-result-container">
<el-card>
<template #header>
<div class="card-header">
<span>质检结果列表</span>
</div>
</template>
<div class="filter-section">
<el-row :gutter="20" style="margin-bottom: 20px;">
<el-col :span="5" style="margin-right: 20px;">
<el-date-picker
v-model="filterForm.finishTime"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
style="width: 100%;"
>
</el-date-picker>
</el-col>
<el-col :span="4">
<el-input
v-model="filterForm.accNbr"
placeholder="用户账号"
clearable
></el-input>
</el-col>
<el-col :span="4">
<el-input
v-model="filterForm.campaignId"
placeholder="工维人员工号"
clearable
></el-input>
</el-col>
<el-col :span="4">
<el-input
v-model="filterForm.orderId"
placeholder="工单ID"
clearable
></el-input>
</el-col>
<el-col :span="4">
<el-select
v-model="filterForm.finishStatusList"
placeholder="质检结果"
clearable
multiple
style="width: 100%"
>
<el-option v-for="result in pagination.resultList" :key="result.value" :label="result.label" :value="result.value"></el-option>
</el-select>
</el-col>
<el-col :span="4" style="margin-top: 10px;">
<el-button type="primary" @click="handleFilter">查询</el-button>
<el-button @click="resetFilter">重置</el-button>
</el-col>
</el-row>
</div>
<el-table :data="tableData" :height="tableForm.height" border style="width: 100%">
<el-table-column prop="applyId" label="质检ID" width="200"></el-table-column>
<el-table-column prop="accNbr" label="用户账号" width="150"></el-table-column>
<el-table-column prop="addressName" label="装机地址" width="230" show-overflow-tooltip></el-table-column>
<el-table-column prop="orderType" label="工单类型" width="250" show-overflow-tooltip></el-table-column>
<el-table-column prop="campaignId" label="工维人员工号" width="150"></el-table-column>
<el-table-column prop="orderCode" label="工单ID" width="230" show-overflow-tooltip></el-table-column>
<el-table-column prop="deviceType" label="设备类型" width="230" show-overflow-tooltip></el-table-column>
<el-table-column prop="finishTime" label="质检完成时间" width="180"></el-table-column>
<el-table-column prop="finish" label="质检结果" width="100">
<template #default="scope">
<el-tag
:type="getResultTagType(scope.row.finish,scope.row.checkStatus)"
>
{{ getResultText(scope.row.finish,scope.row.checkStatus) }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="120" fixed="right" align="center">
<template #default="scope">
<el-button
size="small"
type="primary"
@click="viewDetail(scope.row)"
:disabled="scope.row.finish==0"
>
查看详情
</el-button>
</template>
</el-table-column>
</el-table>
<div class="pagination-container" style="margin-top: 20px; text-align: right;">
<el-pagination
:current-page="pagination.currentPage"
:page-size="pagination.pageSize"
:total="pagination.total"
:page-sizes="pagination.pageSizes"
@sizeChange="handleSizeChange"
layout="total, prev, pager, next, jumper,sizes"
@current-change="handlePageChange"
>
</el-pagination>
</div>
<!-- 质检详情弹窗 -->
<el-dialog
v-model="detailForm.isShow"
title="质检详情"
width="800px"
:before-close="handleClose"
top="5vh"
style="height: 90vh;overflow:auto;"
class="detail-dialog">
<div class="inner">
<!-- 基础信息 -->
<div class="detail-section">
<h3 class="section-title">基础信息</h3>
<div class="info-grid">
<div class="infoList">
<div class="li">
<div class="name">质检ID</div>
<div class="value">{{ detailForm.data.applyId || '--' }}</div>
</div>
<div class="li">
<div class="name">用户账号</div>
<div class="value">{{ detailForm.data.accNbr || '--' }}</div>
</div>
<div class="li">
<div class="name">工维人员</div>
<div class="value">{{ detailForm.data.campaignId || '--' }}</div>
</div>
</div>
<div class="infoList">
<div class="li">
<div class="name">装机地址</div>
<div class="value">{{ detailForm.data.addressName || '--' }}</div>
</div>
</div>
<div class="infoList">
<div class="li">
<div class="name">工单类型</div>
<div class="value">{{ detailForm.data.serviceNames || '--' }}</div>
</div>
<div class="li">
<div class="name">工单ID</div>
<div class="value">{{ detailForm.data.orderCode || '--' }}</div>
</div>
<div class="li">
<div class="name">设备类型</div>
<div class="value">{{ detailForm.data.terminalClass || '--' }}</div>
</div>
</div>
<div class="infoList">
<div class="li">
<div class="name">质检开始时间</div>
<div class="value">{{ detailForm.data.startTime || '--' }}</div>
</div>
<div class="li">
<div class="name">质检结束时间</div>
<div class="value">{{ detailForm.data.endTime || '--' }}</div>
</div>
<div class="li">
<div class="name">是否完成</div>
<div class="value">{{ getResultText(detailForm.data.finish,detailForm.data.checkStatus)}}</div>
<div v-if="detailForm.data.failReason">原因:{{detailForm.data.failReason}}</div>
</div>
</div>
</div>
</div>
<!-- 质检详情表格 -->
<div class="detail-section" v-if="detailForm.data.items && detailForm.data.items.length > 0">
<h3 class="section-title">质检详情</h3>
<el-table :data="detailForm.data.items" border style="width: 100%;">
<el-table-column prop="dec" label="检查项" width="200"></el-table-column>
<el-table-column prop="result" label="检查结果" width="150"></el-table-column>
<el-table-column prop="picUrl" label="现场快照">
<template #default="scope">
<el-image
v-for="(item,index) in scope.row.picArr"
:src="item"
:initial-index="index"
:preview-src-list="scope.row.picArr"
style="width: 60px; height: 60px;"
/>
</template>
</el-table-column>
</el-table>
</div>
<!-- 质检录像 -->
<div class="detail-section">
<h3 class="section-title">质检录像</h3>
<div class="video-container">
<template v-if="detailForm.data.videos.length>0">
<video
v-for="item in detailForm.data.videos"
:src="item.videoUrl"
controls
style="width: calc(100% - 2px); max-height: 300px;border:1px solid #ebebeb;"
></video>
</template>
<div v-else class="no-video">
<div class="up">质检视频正在生成中</div>
<div class="down">预计次日凌晨完成,请稍后查看</div>
</div>
</div>
</div>
</div>
</el-dialog>
</el-card>
</div>
</template>
<script setup>
import { ref, reactive, onMounted } from 'vue'
import { useRouter } from 'vue-router'
import { ElMessage } from 'element-plus'
import { getQualityResults , getQualityResultsDetail} from '../utils/api'
const router = useRouter()
const filterForm = reactive({
finishTime: '',
accNbr: '',
campaignId: '',
orderId: '',
finishStatusList: []
})
const detailForm = reactive({
isShow: false,
data: {}
})
const pagination = reactive({
currentPage: 1,
pageSize: 20,
pageSizes: [20, 50, 100],
total: 0,
resultList: [{
label: '未完成',
value: '0'
},{
label: '已完成',
value: '1'
},{
label: '无法质检',
value: '2'
}]
})
const tableForm = reactive({
height: window.top.document.body.offsetHeight - 388
})
const handleSizeChange = (newSize) => {
pagination.pageSize = newSize;
pagination.currentPage = 1;
handleFilter();
};
const tableData = ref([])
const handleFilter = async () => {
try {
const params = {
pageNum: pagination.currentPage,
pageSize: pagination.pageSize,
accNbr: filterForm.accNbr,
campaignId: filterForm.campaignId,
orderId: filterForm.orderId,
finishStatusList: filterForm.finishStatusList
};
let fn = (dateString)=>{
const date = new Date(dateString);
date.setDate(date.getDate() + 1);
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
return `${year}-${month}-${day}`;
}
if (filterForm.finishTime && filterForm.finishTime.length === 2) {
params.finishStartTime = filterForm.finishTime[0];
params.finishEndTime = fn(filterForm.finishTime[1]);
}
const response = await getQualityResults(params);
if (response.code === 200) {
tableData.value = response.data.records || [];
pagination.total = response.data.total;
ElMessage.success('查询成功');
} else {
ElMessage.error(response.msg || '查询失败');
}
} catch (error) {
ElMessage.error('查询失败: ' + error.message);
}
}
const resetFilter = () => {
filterForm.finishTime = '';
filterForm.accNbr = ''
filterForm.campaignId = '',
filterForm.orderId = '',
filterForm.finishStatusList = []
handleFilter();
}
const getResultText = (result,status) => {
let ret = '未知'
if(result==1 && status>1){
result = '2'
}
pagination.resultList.forEach(item => {
if(item.value == result) {
ret = item.label
}
})
return ret
}
const getResultTagType = (result,status) => {
const typeMap = {
0: 'info',
2: 'warning',
1: 'success'
}
if(result==1 && status>1){
result = '2'
}
return typeMap[result] || 'info'
}
const viewDetail = async (row) => {
let res = await getQualityResultsDetail({
applyId: row.applyId
})
res.data.items.forEach(item=>{
item.picArr = item.picUrl.split(',')
//item.picArr = ['https://hhzj.lgyzpt.com/huaiHuaPc/assets/logo-D9UGterv.png','https://hhzj.lgyzpt.com/huaiHuaPc/assets/bg-C097ZT0U.png']
item.furl = item.picArr[0]||''
})
detailForm.isShow = true
detailForm.data = res.data
}
const handlePageChange = (page) => {
pagination.currentPage = page;
handleFilter();
}
const handleClose = () => {
detailForm.isShow = false
}
onMounted(() => {
handleFilter();
})
</script>
<style scoped>
.quality-result-container {
padding: 20px;
}
.card-header {
display: flex;
justify-content: space-between;
align-items: center;
}
.detail-dialog .inner{
height: calc(100vh - 161px);
overflow: auto;
}
.detail-dialog .inner :deep(.el-table__cell){
position: unset!important;
}
.info-grid {
background: #F7F8FA;
border-radius: 4px;
padding: 20px;
}
.info-grid .infoList{
display: flex;
margin-bottom: 30px;
}
.info-grid .infoList .li{
width: 250px;
margin-right: 20px;
}
.info-grid .infoList .name{
font-size: 16px;
font-weight: 500;
}
.section-title{
font-weight: bold;
font-size: 18px;
color: #333;
}
.info-grid .infoList .value{
font-size: 15px;
margin-top: 5px;
}
.info-grid .infoList:last-child{
margin-bottom: 0;
}
.no-video{
background: #F7F8FA;
border-radius: 4px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 200px;
}
.no-video .up{
font-size: 18px;
font-weight: 600;
margin-bottom: 8px;
}
.no-video .down{
font-size: 15px;
}
</style>
\ No newline at end of file \ No newline at end of file
...@@ -3,6 +3,7 @@ import Login from '../pages/Login.vue' ...@@ -3,6 +3,7 @@ import Login from '../pages/Login.vue'
import Upload from '../pages/Upload.vue' import Upload from '../pages/Upload.vue'
import QualityList from '../pages/QualityList.vue' import QualityList from '../pages/QualityList.vue'
import QualityDetail from '../pages/QualityDetail.vue' import QualityDetail from '../pages/QualityDetail.vue'
import QualityResult from '../pages/QualityResult.vue'
import StaffList from '../pages/StaffList.vue' import StaffList from '../pages/StaffList.vue'
const routes = [ const routes = [
...@@ -31,6 +32,11 @@ const routes = [ ...@@ -31,6 +32,11 @@ const routes = [
component: QualityDetail component: QualityDetail
}, },
{ {
path: '/quality-result',
name: 'quality-result',
component: QualityResult
},
{
path: '/staff-list', path: '/staff-list',
name: 'staff-list', name: 'staff-list',
component: StaffList component: StaffList
......
...@@ -70,6 +70,30 @@ export const getQualityBatchDetail = (params) => { ...@@ -70,6 +70,30 @@ export const getQualityBatchDetail = (params) => {
.then(response => response.json()); .then(response => response.json());
}; };
// 获取质检结果列表
export const getQualityResults = (params) => {
return fetch(`${API_BASE_URL}/zhijian-trial/zhiJianOrder/applyPage`, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
.then(response => response.json());
};
// 获取质检结果详情
export const getQualityResultsDetail = (params) => {
return fetch(`${API_BASE_URL}/zhijian-trial/zhiJianOrder/getResultDetail`, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
.then(response => response.json());
};
// 获取此次质检单的设备和工单类型 // 获取此次质检单的设备和工单类型
export const queryOrderAndDevice = (params) => { export const queryOrderAndDevice = (params) => {
return fetch(`${API_BASE_URL}/zhijian-trial/zhiJianOrder/getDevices`, { return fetch(`${API_BASE_URL}/zhijian-trial/zhiJianOrder/getDevices`, {
......
...@@ -6,6 +6,13 @@ export default defineConfig({ ...@@ -6,6 +6,13 @@ export default defineConfig({
plugins: [vue()], plugins: [vue()],
base: './', base: './',
assetsInclude: ['**/*.xlsx', '**/*.xls', '**/*.csv'], assetsInclude: ['**/*.xlsx', '**/*.xls', '**/*.csv'],
css: {
preprocessorOptions: {
scss: {
additionalData: `@use "@/styles/variables.scss" as *;`
}
}
},
server: { server: {
host: '0.0.0.0', host: '0.0.0.0',
port: 8080, port: 8080,
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!