Merge remote-tracking branch 'websoft/master'

# Conflicts:
#	src/views/business/process-config.vue
This commit is contained in:
2026-08-14 14:19:48 +08:00
15 changed files with 119 additions and 67 deletions
+19
View File
@@ -31,3 +31,22 @@
3. option:将 `expireStatus` 列的 `search: true → search: false`(否则会在搜索网格里多渲染一个空输入框);`searchIndex` 设为 ≥ 真实搜索列数(vehicle: `4 → 6`ship 已是 `6`),使 `columnLen ≤ searchIndex`Avue 不再显示「展开」按钮。 3. option:将 `expireStatus` 列的 `search: true → search: false`(否则会在搜索网格里多渲染一个空输入框);`searchIndex` 设为 ≥ 真实搜索列数(vehicle: `4 → 6`ship 已是 `6`),使 `columnLen ≤ searchIndex`Avue 不再显示「展开」按钮。
- 原理:Avue `header-search3.js``#search-menu` 插槽内容渲染进 `menu-form`,位于默认搜索/重置按钮之后、展开按钮之前;`order: -1` 将标签推到按钮左侧。 - 原理:Avue `header-search3.js``#search-menu` 插槽内容渲染进 `menu-form`,位于默认搜索/重置按钮之后、展开按钮之前;`order: -1` 将标签推到按钮左侧。
- 验证:`node --check` 两个 option 文件通过;页面刷新即可见效果。 - 验证:`node --check` 两个 option 文件通过;页面刷新即可见效果。
## process-config.vue 弹窗重构为手写 el-dialog(对齐 customer-archive 风格)
- 需求:用户要求 `/business/process-config.vue` 排版风格改成和 `/vehicle/customer-archive.vue` 一样,保持风格统一。
- 根因:两页弹窗架构根本不同——customer-archive 用手写 `<el-dialog>` + `section-card` 分组 + `#footer` 按钮;process-config 原用 Avue 内置弹窗(`#basicInfo-form`/`#nodeConfigJson-form` 插槽 + `#menu-form-before` 保存按钮)。要真正统一,只能把 process-config 改成手写弹窗。
- 模板改动(已完成):
- 移除 avue-crud 的 `:before-open`/`@row-save`/`@row-update`/`@row-del``#menu-form-before``#basicInfo-form``#nodeConfigJson-form` 插槽。
-`</avue-crud>` 后新增手写 `<el-dialog class="process-dialog" v-model="processBox" width="92%" top="4vh" append-to-body @closed="resetProcess">`,内部 `<el-form ref="processForm" :model="form" label-width="calc(6em + 24px)" :disabled="dialogReadonly" class="process-form dialog-form-label-fixed">`,含 3 个 `section-card`:基本信息 / 现行过程节点(时间线)/ 节点设置(节点表格);`#footer` 含 保存草稿(plain) + 保存并启用(primary) + 取消/关闭。
- 顶部「新建过程配置」、表格「查看/编辑」链接改调 `openProcessConfig()` / `openProcessConfig(row, true)` / `openProcessConfig(row, false)`
- 脚本改动(本次完成):删除 Avue 生命周期方法 `beforeOpen/rowSave/rowUpdate/submitRow/stopSubmitLoading/handleProcessConfigSave`;新增 `openProcessConfig(row, readonly)`load 详情后 `this.form=data` + `selectedProjectId` + `parseNodeConfig` + 开框;新增则清空表单 + `resetNodeRows`)、`submitProcessConfig(mode)``this.$refs.processForm.validate``syncNodeFields``normalizeRow``validateRow``confirmDuplicateVoucher``api.submit`,成功后关框并刷新)、`resetProcess()``@closed` 重置 `dialogReadonly/submitting/submitStatus/form/selectedProjectId` + `resetNodeRows` + `clearValidate`)。`data()` 已含 `processBox/submitting``computed.dialogTitle``rowDel`/`handleCopy`/`handleAction` 不变(独立 API 调用)。
- option 改动(已完成):`src/option/business/process-config.js``saveBtn/updateBtn/addBtn/viewBtn/editBtn/delBtn:false`,关闭 Avue 内置弹窗按钮。
- 样式:新增 `:deep(.process-dialog .el-dialog__body){max-height:72vh;overflow:auto}`,对齐 customer-archive 的 `.archive-dialog` 滚动行为(长内容时 body 滚动、footer 固定)。
- 验证:`vite build --outDir /tmp/pc-build-check` 全量编译通过(仅动态导入 chunk 警告,与本改动无关);之前 `npm run build` 失败仅因沙箱 safe-delete 守卫清理旧 dist/ 触发,非代码错误。
## contract-manage 到期筛选标签靠右对齐
- 需求:用户截图反馈 `/business/contract-manage` 搜索栏中「全部/30天内到期/90天内到期/90天以上/已到期」标签需要靠右对齐。
- 改动:`src/views/business/components/business-crud-page.vue``.business-crud-page__contract-expiry-search` 样式由 `order: -1; margin-right: auto` 改为 `margin-left: auto`。这样该 slot 内容会被推到 `#search-menu` 行的右侧,搜索/重置按钮留在左侧,与 vehicle/ship 的左侧标签方案相反,符合用户本次要求。
- 验证:`vite build --outDir /tmp/pc-build-check-2` 全量编译通过。
+3
View File
@@ -386,6 +386,7 @@ export const option = createCrudOption([
{ {
label: '合同格式', label: '合同格式',
prop: 'contractFormat', prop: 'contractFormat',
labelWidth: '72px',
type: 'select', type: 'select',
dicData: [ dicData: [
{ label: '电子合同', value: '电子合同' }, { label: '电子合同', value: '电子合同' },
@@ -399,6 +400,7 @@ export const option = createCrudOption([
{ {
label: '是否需要加盖法人章', label: '是否需要加盖法人章',
prop: 'legalSealFlag', prop: 'legalSealFlag',
labelWidth: '72px',
type: 'select', type: 'select',
dicData: [ dicData: [
{ label: '否', value: 0 }, { label: '否', value: 0 },
@@ -413,6 +415,7 @@ export const option = createCrudOption([
{ {
label: '一式', label: '一式',
prop: 'copyCount', prop: 'copyCount',
labelWidth: '72px',
formslot: true, formslot: true,
hide: true, hide: true,
order: 60, order: 60,
+4
View File
@@ -177,6 +177,10 @@ export const option = {
]), ]),
saveBtn: false, saveBtn: false,
updateBtn: false, updateBtn: false,
addBtn: false,
viewBtn: false,
editBtn: false,
delBtn: false,
dialogTop: '10px', dialogTop: '10px',
dialogWidth: '96%', dialogWidth: '96%',
menuWidth: 220, menuWidth: 220,
@@ -113,7 +113,7 @@ export const option = {
value: 'projectName', value: 'projectName',
}, },
filterable: true, filterable: true,
span: 12, span: 8,
minWidth: 180, minWidth: 180,
rules: textRule('项目名称', 100, true), rules: textRule('项目名称', 100, true),
}, },
@@ -128,7 +128,7 @@ export const option = {
prop: 'projectCode', prop: 'projectCode',
hide: true, hide: true,
disabled: true, disabled: true,
span: 12, span: 8,
minWidth: 150, minWidth: 150,
rules: textRule('项目编号', 50), rules: textRule('项目编号', 50),
}, },
@@ -137,7 +137,7 @@ export const option = {
prop: 'undertakeDeptName', prop: 'undertakeDeptName',
hide: true, hide: true,
disabled: true, disabled: true,
span: 12, span: 8,
minWidth: 150, minWidth: 150,
rules: textRule('承办部门', 50, true), rules: textRule('承办部门', 50, true),
}, },
@@ -146,7 +146,7 @@ export const option = {
prop: 'projectFundLimit', prop: 'projectFundLimit',
hide: true, hide: true,
disabled: true, disabled: true,
span: 12, span: 8,
minWidth: 200, minWidth: 200,
rules: [nonNegativeRule('项目资金使用额度')], rules: [nonNegativeRule('项目资金使用额度')],
}, },
@@ -155,7 +155,7 @@ export const option = {
prop: 'usedFundLimit', prop: 'usedFundLimit',
hide: true, hide: true,
disabled: true, disabled: true,
span: 12, span: 8,
minWidth: 220, minWidth: 220,
value: 0, value: 0,
rules: [nonNegativeRule('已使用项目资金额度')], rules: [nonNegativeRule('已使用项目资金额度')],
@@ -165,7 +165,7 @@ export const option = {
prop: 'remainingFundLimit', prop: 'remainingFundLimit',
hide: true, hide: true,
disabled: true, disabled: true,
span: 12, span: 8,
minWidth: 230, minWidth: 230,
value: 0, value: 0,
rules: [nonNegativeRule('剩余项目资金使用额度')], rules: [nonNegativeRule('剩余项目资金使用额度')],
@@ -174,7 +174,7 @@ export const option = {
label: '申请临时额度(万元)', label: '申请临时额度(万元)',
prop: 'applyLimit', prop: 'applyLimit',
formslot: true, formslot: true,
span: 12, span: 8,
minWidth: 180, minWidth: 180,
rules: [ rules: [
{ required: true, message: '请输入申请临时额度', trigger: 'blur' }, { required: true, message: '请输入申请临时额度', trigger: 'blur' },
@@ -187,7 +187,7 @@ export const option = {
type: 'date', type: 'date',
format: 'YYYY-MM-DD', format: 'YYYY-MM-DD',
valueFormat: 'YYYY-MM-DD', valueFormat: 'YYYY-MM-DD',
span: 12, span: 8,
minWidth: 140, minWidth: 140,
rules: [{ required: true, message: '请选择申请有效期至', trigger: 'change' }], rules: [{ required: true, message: '请选择申请有效期至', trigger: 'change' }],
}, },
@@ -5,7 +5,7 @@ export const option = {
searchShow: true, searchShow: true,
searchMenuSpan: 24, searchMenuSpan: 24,
searchIcon: true, searchIcon: true,
searchIndex: 6, searchIndex: 4,
searchMenuPosition: 'right', searchMenuPosition: 'right',
border: true, border: true,
index: true, index: true,
@@ -5,7 +5,7 @@ export const option = {
searchShow: true, searchShow: true,
searchMenuSpan: 24, searchMenuSpan: 24,
searchIcon: true, searchIcon: true,
searchIndex: 6, searchIndex: 4,
searchMenuPosition: 'right', searchMenuPosition: 'right',
border: true, border: true,
index: true, index: true,
+13
View File
@@ -806,3 +806,16 @@
.el-form-item__label { .el-form-item__label {
margin-left: 12px !important; margin-left: 12px !important;
} }
.el-form-item--default .el-form-item__label {
line-height: 14px;
}
.el-form-item--label-right .el-form-item__label {
align-items: center;
}
.el-form-item--default {
margin-bottom: 14px;
}
.el-form-item {
margin-bottom: 14px;
}
@@ -12704,10 +12704,9 @@ export default {
&__contract-expiry-search { &__contract-expiry-search {
display: flex; display: flex;
order: -1;
align-items: center; align-items: center;
gap: 8px; gap: 8px;
margin-right: auto; margin-left: auto;
min-width: 0; min-width: 0;
:deep(.el-select) { :deep(.el-select) {
@@ -14232,7 +14231,7 @@ export default {
min-width: 56px; min-width: 56px;
height: 22px; height: 22px;
margin: 0 14px; margin: 0 14px;
border-bottom: 3px solid #303133; border-bottom: 4px solid #e4e7ed;
} }
&__transport-plan-waybill-card { &__transport-plan-waybill-card {
@@ -14337,7 +14336,7 @@ export default {
&__waybill-summary-grid { &__waybill-summary-grid {
display: grid; display: grid;
grid-template-columns: repeat(4, minmax(130px, 1fr)) minmax(360px, 2fr); grid-template-columns: repeat(4, minmax(130px, 1fr)) minmax(420px, 2.5fr);
gap: 16px 24px; gap: 16px 24px;
} }
@@ -14410,9 +14409,9 @@ export default {
&::before { &::before {
flex: 1; flex: 1;
order: 2; order: 2;
height: 2px; height: 4px;
content: ''; content: '';
background: #606266; background: #e4e7ed;
} }
b.end { b.end {
@@ -134,7 +134,7 @@ export default {
.route-map__node { display: grid; flex: 0 0 150px; justify-items: center; gap: 6px; text-align: center; strong { font-size: 16px; white-space: nowrap; } small { color: #606266; white-space: nowrap; } } .route-map__node { display: grid; flex: 0 0 150px; justify-items: center; gap: 6px; text-align: center; strong { font-size: 16px; white-space: nowrap; } small { color: #606266; white-space: nowrap; } }
.route-map__progress { color: #409eff !important; } .route-map__progress { color: #409eff !important; }
.route-badge { display: inline-flex; width: 32px; height: 32px; align-items: center; justify-content: center; border-radius: 4px; background: #67c23a; color: #fff; font-weight: 600; &.start { background: #409eff; } &.end { background: #e6a23c; } } .route-badge { display: inline-flex; width: 32px; height: 32px; align-items: center; justify-content: center; border-radius: 4px; background: #67c23a; color: #fff; font-weight: 600; &.start { background: #409eff; } &.end { background: #e6a23c; } }
.route-map__line { flex: 1 0 64px; min-width: 64px; height: 32px; border-bottom: 2px solid #606266; } .route-map__line { flex: 1 0 64px; min-width: 64px; height: 32px; border-bottom: 6px solid #e4e7ed; }
.execution-detail-heading { padding: 20px 24px 12px; h3 { margin: 0; padding-left: 12px; border-left: 4px solid #409eff; font-size: 16px; } } .execution-detail-heading { padding: 20px 24px 12px; h3 { margin: 0; padding-left: 12px; border-left: 4px solid #409eff; font-size: 16px; } }
.segment-detail { padding: 16px 24px; border-top: 1px solid #eff1f7; header { display: flex; align-items: center; justify-content: space-between; margin: -16px -24px 8px; padding: 12px 24px; cursor: pointer; background: #fafbfc; h3 { display: flex; min-width: 0; align-items: center; flex-wrap: wrap; gap: 12px; margin: 0; font-size: 16px; } em { color: #409eff; font-style: normal; } } } .segment-detail { padding: 16px 24px; border-top: 1px solid #eff1f7; header { display: flex; align-items: center; justify-content: space-between; margin: -16px -24px 8px; padding: 12px 24px; cursor: pointer; background: #fafbfc; h3 { display: flex; min-width: 0; align-items: center; flex-wrap: wrap; gap: 12px; margin: 0; font-size: 16px; } em { color: #409eff; font-style: normal; } } }
.segment-detail__progress { color: #606266; font-size: 14px; font-weight: 400; } .segment-detail__progress { color: #606266; font-size: 14px; font-weight: 400; }
@@ -672,7 +672,7 @@ export default {
.route-overview { display: flex; align-items: flex-start; justify-content: flex-end; padding-top: 8px; overflow-x: auto; } .route-overview { display: flex; align-items: flex-start; justify-content: flex-end; padding-top: 8px; overflow-x: auto; }
.route-overview__node { display: grid; flex: 0 0 130px; justify-items: center; gap: 6px; text-align: center; strong { font-size: 16px; white-space: nowrap; } small { color: #606266; white-space: nowrap; } } .route-overview__node { display: grid; flex: 0 0 130px; justify-items: center; gap: 6px; text-align: center; strong { font-size: 16px; white-space: nowrap; } small { color: #606266; white-space: nowrap; } }
.route-badge { display: inline-flex; width: 32px; height: 32px; align-items: center; justify-content: center; border-radius: 4px; background: #67c23a; color: #fff; font-weight: 600; &.start { background: #409eff; } &.end { background: #e6a23c; } } .route-badge { display: inline-flex; width: 32px; height: 32px; align-items: center; justify-content: center; border-radius: 4px; background: #67c23a; color: #fff; font-weight: 600; &.start { background: #409eff; } &.end { background: #e6a23c; } }
.route-overview__line { flex: 1 0 56px; min-width: 56px; height: 32px; margin-top: 0; border-bottom: 2px solid #606266; } .route-overview__line { flex: 1 0 56px; min-width: 56px; height: 32px; margin-top: 0; border-bottom: 6px solid #e4e7ed; }
.segment-header { min-height: 46px; padding: 0 20px; border-bottom: 1px solid #eff1f7; font-weight: 600; em { color: #409eff; font-style: normal; } } .segment-header { min-height: 46px; padding: 0 20px; border-bottom: 1px solid #eff1f7; font-weight: 600; em { color: #409eff; font-style: normal; } }
.segment-content { padding: 16px 24px; } .segment-content { padding: 16px 24px; }
.dispatch-form { :deep(.el-form-item) { margin-bottom: 16px; } :deep(.el-input), :deep(.el-select), :deep(.el-date-editor), :deep(.el-input-number) { width: 100%; } } .dispatch-form { :deep(.el-form-item) { margin-bottom: 16px; } :deep(.el-input), :deep(.el-select), :deep(.el-date-editor), :deep(.el-input-number) { width: 100%; } }
+8
View File
@@ -18,3 +18,11 @@ export default {
}, },
}; };
</script> </script>
<style>
/* 合同管理弹窗:长 label(如"是否需要加盖法人章")在标签列内自动换行 */
.el-dialog .el-form-item__label {
white-space: normal;
line-height: 1.2;
}
</style>
+1 -1
View File
@@ -2458,7 +2458,7 @@ export default {
.loading-detail__value { display: flex; flex-wrap: wrap; gap: 8px; text-align: left; } .loading-detail__value { display: flex; flex-wrap: wrap; gap: 8px; text-align: left; }
.loading-detail__steps { display: flex; align-items: flex-start; overflow-x: auto; padding: 8px 4px 16px; } .loading-detail__steps { display: flex; align-items: flex-start; overflow-x: auto; padding: 8px 4px 16px; }
.loading-detail__step { position: relative; min-width: 190px; flex: 1; text-align: center; } .loading-detail__step { position: relative; min-width: 190px; flex: 1; text-align: center; }
.loading-detail__step:not(:last-child)::after { position: absolute; z-index: 0; top: 16px; left: calc(50% + 25px); width: calc(100% - 50px); height: 2px; content: ''; background: #606266; } .loading-detail__step:not(:last-child)::after { position: absolute; z-index: 0; top: 16px; left: calc(50% + 25px); width: calc(100% - 50px); height: 6px; content: ''; background: #e4e7ed; }
.loading-detail__step-line { display: flex; align-items: center; justify-content: center; } .loading-detail__step-line { display: flex; align-items: center; justify-content: center; }
.loading-detail__step-dot { position: relative; z-index: 1; display: inline-flex; width: 34px; height: 34px; align-items: center; justify-content: center; color: #fff; border-radius: 4px; font-weight: 600; } .loading-detail__step-dot { position: relative; z-index: 1; display: inline-flex; width: 34px; height: 34px; align-items: center; justify-content: center; color: #fff; border-radius: 4px; font-weight: 600; }
.loading-detail__step-dot.start { background: #409eff; }.loading-detail__step-dot.middle { background: #67c23a; }.loading-detail__step-dot.end { background: #e6a23c; } .loading-detail__step-dot.start { background: #409eff; }.loading-detail__step-dot.middle { background: #67c23a; }.loading-detail__step-dot.end { background: #e6a23c; }
+7 -5
View File
@@ -76,7 +76,7 @@
<div class="route-point"> <div class="route-point">
<span :class="['route-node', node.type]">{{ node.text }}</span> <span :class="['route-node', node.type]">{{ node.text }}</span>
<div class="route-detail"> <div class="route-detail">
<strong>{{ node.name }}</strong> <el-tooltip placement="top"><template #content>{{ node.name }}</template><strong>{{ node.name }}</strong></el-tooltip>
<span v-for="line in node.lines" :key="line">{{ line }}</span> <span v-for="line in node.lines" :key="line">{{ line }}</span>
</div> </div>
</div> </div>
@@ -516,8 +516,8 @@ export default {
} }
} }
.route-connector { .route-connector {
width: clamp(180px, 20vw, 344px); width: clamp(180px, 20vw, 266px);
flex: 0 0 clamp(180px, 20vw, 344px); flex: 0 0 clamp(180px, 20vw, 266px);
padding-top: 2px; padding-top: 2px;
margin: 0 -6px; margin: 0 -6px;
small { small {
@@ -530,8 +530,8 @@ export default {
line-height: 1.2; line-height: 1.2;
} }
:deep(.el-progress-bar__outer) { :deep(.el-progress-bar__outer) {
height: 8px !important; height: 6px !important;
background-color: #f1f2f5; background-color: #e4e7ed;
} }
:deep(.el-progress-bar__inner) { :deep(.el-progress-bar__inner) {
background-color: #409eff; background-color: #409eff;
@@ -543,6 +543,8 @@ export default {
header { header {
margin-bottom: 10px; margin-bottom: 10px;
font-weight: 600; font-weight: 600;
font-size: 14px;
text-align: center;
} }
.el-link { .el-link {
display: flex; display: flex;
+34 -30
View File
@@ -153,15 +153,16 @@
destroy-on-close destroy-on-close
:before-close="beforeUploadDialogClose" :before-close="beforeUploadDialogClose"
> >
<el-form <section-card>
ref="uploadFormRef" <el-form
:model="editing" ref="uploadFormRef"
:rules="rules" :model="editing"
label-position="right" :rules="rules"
label-width="auto" label-position="right"
class="voucher-manage-page__upload-form" label-width="auto"
> class="voucher-manage-page__upload-form"
<el-form-item label="项目名称" prop="projectId" >
<el-form-item label="项目名称" prop="projectId"
><el-select ><el-select
v-model="editing.projectId" v-model="editing.projectId"
class="voucher-manage-page__project-select" class="voucher-manage-page__project-select"
@@ -169,13 +170,13 @@
filterable filterable
placeholder="请选择" placeholder="请选择"
@change="changeProject" @change="changeProject"
><el-option ><el-option
v-for="item in projectOptions" v-for="item in projectOptions"
:key="item.id" :key="item.id"
:label="item.projectName" :label="item.projectName"
:value="item.id" /></el-select :value="item.id" /></el-select
></el-form-item> ></el-form-item>
<el-form-item label="执行凭证" prop="fileUrl" <el-form-item label="执行凭证" prop="fileUrl"
><el-upload ><el-upload
action="#" action="#"
accept=".zip,.7z" accept=".zip,.7z"
@@ -183,26 +184,28 @@
:limit="1" :limit="1"
:on-change="selectVoucherFile" :on-change="selectVoucherFile"
:on-remove="clearFile" :on-remove="clearFile"
><el-button ><el-button
type="primary" type="primary"
:loading="uploading" :loading="uploading"
:disabled="!editing.projectId || uploading" :disabled="!editing.projectId || uploading"
>上传</el-button >上传</el-button
><template #tip ><template #tip
><span class="voucher-manage-page__upload-tip" ><span class="voucher-manage-page__upload-tip"
>支持 zip7z 格式采用分片上传上传中断后可在上传进度继续上传</span >支持 zip7z 格式采用分片上传上传中断后可在上传进度继续上传</span
></template ></template
></el-upload ></el-upload
><el-progress ><el-progress
v-if="uploading || editing.fileTaskId" v-if="uploading || editing.fileTaskId"
:percentage="uploadPercent" :percentage="uploadPercent"
:status="uploadPercent === 100 ? 'success' : undefined" :status="uploadPercent === 100 ? 'success' : undefined"
class="voucher-manage-page__upload-progress" class="voucher-manage-page__upload-progress"
/></el-form-item> /></el-form-item>
<el-form-item label="关联运输批次" prop="waybillImportBatchIds" <el-form-item label="关联运输批次" prop="waybillImportBatchIds"
><el-button type="primary" @click="openBatchDialog">选择</el-button></el-form-item ><el-button type="primary" @click="openBatchDialog">选择</el-button></el-form-item
> >
</el-form> </el-form>
</section-card>
<el-table :data="selectedBatches" border <el-table :data="selectedBatches" border
><el-table-column type="index" label="序号" width="80" /><el-table-column ><el-table-column type="index" label="序号" width="80" /><el-table-column
prop="batchNo" prop="batchNo"
@@ -405,6 +408,7 @@ import md5 from 'js-md5';
import { ElMessage, ElMessageBox } from 'element-plus'; import { ElMessage, ElMessageBox } from 'element-plus';
import { getList as getProjectList } from '@/api/business/project-apply'; import { getList as getProjectList } from '@/api/business/project-apply';
import * as api from '@/api/business/voucher-manage'; import * as api from '@/api/business/voucher-manage';
import SectionCard from '@/components/section-card/main.vue';
const loading = ref(false), const loading = ref(false),
rows = ref([]), rows = ref([]),
+13 -13
View File
@@ -50,26 +50,26 @@ export default ({
__VUE_I18N_LEGACY_API__: true, __VUE_I18N_LEGACY_API__: true,
__INTLIFY_PROD_DEVTOOLS__: false, __INTLIFY_PROD_DEVTOOLS__: false,
}, },
// server: {
// port: 2888,
// proxy: {
// '/api': {
// target: 'http://localhost',
// //target: 'https://saber3.bladex.cn/api',
// changeOrigin: true,
// rewrite: path => path.replace(/^\/api/, ''),
// },
// },
// },
server: { server: {
port: 2889, port: 2888,
proxy: { proxy: {
'/api': { '/api': {
target: 'http://172.16.203.228:8000', target: 'http://localhost',
//target: 'https://saber3.bladex.cn/api',
changeOrigin: true, changeOrigin: true,
rewrite: path => path.replace(/^\/api/, ''),
}, },
}, },
}, },
// server: {
// port: 2889,
// proxy: {
// '/api': {
// target: 'http://172.16.203.228:8000',
// changeOrigin: true,
// },
// },
// },
resolve: { resolve: {
alias: { alias: {
'~': resolve(__dirname, './'), '~': resolve(__dirname, './'),