This commit is contained in:
biybuy 2026-02-06 12:01:39 +08:00
parent afcaaf104a
commit 3eb0641842
37 changed files with 509 additions and 408 deletions

View File

@ -1,6 +1,14 @@
# ============ 生产环境部署必读(避免「本地可以、线上不行」)============
# 1. 本文件必须真正生效:确认 oms.nanafa.com 的请求由「本 server 块」处理
# - 若用 include:确保 include 的是含本 server 的 conf,且无其它 server 抢先匹配
# - 更新后必须执行:nginx -t && nginx -s reload
# 2. /api、/Track 由 nginx 代理到 api.nanafa.com,避免浏览器跨域 405;rbac 由前端直连 admin
# 3. 使用 HTTP(listen 80);root 指向「包含 index.html 的目录」
# ============================================================================
server {
listen 80;
server_name 10.1.20.6;
listen 80; # HTTP
server_name oms.nanafa.com 10.1.20.6;
# 启用gzip压缩
gzip on;
@ -16,35 +24,15 @@ server {
# brotli_comp_level 6;
# brotli_types text/plain text/css text/xml text/javascript application/javascript application/xml+rss application/json application/xml image/svg+xml;
# 启用 HTTP/2(如果使用 HTTPS)
# listen 443 ssl http2;
# 静态文件根目录
root /usr/share/nginx/html;
# ============ API 代理配置(放在最前面,使用 ^~ 提高优先级)============
# RBAC 权限管理服务代理
location ^~ /rbac {
proxy_pass http://43.139.210.35:5281;
# ============ API 代理(同源请求,避免跨域 405)============
location ^~ /api/ {
rewrite ^/api/(.*)$ /itfx/$1 break;
proxy_pass http://api.nanafa.com;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_connect_timeout 30s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
proxy_buffering off;
}
# trackApi 服务代理(使用 ^~ 确保优先匹配)
location ^~ /api/trackApi {
rewrite ^/api/trackApi(.*)$ $1 break;
proxy_pass http://43.139.210.35:8889;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header Host api.nanafa.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
@ -52,17 +40,11 @@ server {
proxy_send_timeout 30s;
proxy_read_timeout 30s;
}
# 排除前端路由路径,只代理真正的 API 请求
# 前端路由路径(驼峰命名):upstreamInterface, downstreamInterface, upstreamInterfaceConfig,
# upstreamInterfaceConfigEdit, appList, requestLog, callStatistics, apiDebugger 等
# 使用负向前瞻正则,排除这些前端路由路径
# 前端路由会继续往下走到 location /,由 try_files 返回 index.html(与 /track/ 路由一样)
location ~ ^/api/(?!(trackApi|upstreamInterface|downstreamInterface|upstreamInterfaceConfig|upstreamInterfaceConfigEdit|appList|requestLog|callStatistics|apiDebugger)) {
rewrite ^/api(.*)$ $1 break;
proxy_pass http://43.139.210.35:8888;
location ^~ /Track {
rewrite ^/Track(.*)$ /track/Track$1 break;
proxy_pass http://api.nanafa.com;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header Host api.nanafa.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
@ -102,17 +84,18 @@ server {
}
# ============ SPA 前端路由(放在最后)============
# 所有非文件请求都回落到 index.html,避免刷新/直接访问子路径 404
location / {
index index.html;
try_files $uri $uri/ /index.html;
}
# HTML 不缓存
location ~* \.html?$ {
add_header Cache-Control "no-cache, no-store, must-revalidate";
add_header Pragma "no-cache";
add_header Expires "0";
}
# HTML 不缓存(单独 location 避免嵌套导致 fallback 异常)
location = /index.html {
add_header Cache-Control "no-cache, no-store, must-revalidate";
add_header Pragma "no-cache";
add_header Expires "0";
}
# 错误页面

View File

@ -61,7 +61,7 @@ export default [
serversPath: './src/api',
requestLibPath: '@/utils/request',
projectName: 'interface-Provider',
apiPrefix: "'api/trackApi'",
apiPrefix: "'Track'",
},
// 轨迹状态
@ -71,7 +71,7 @@ export default [
serversPath: './src/api',
requestLibPath: '@/utils/request',
projectName: 'TrajectoryState',
apiPrefix: "'api/trackApi'",
apiPrefix: "'Track'",
},
// 轨迹标志
@ -82,7 +82,7 @@ export default [
serversPath: './src/api',
requestLibPath: '@/utils/request',
projectName: 'TrajectoryFlag',
apiPrefix: "'api/trackApi'",
apiPrefix: "'Track'",
},
{
@ -91,7 +91,7 @@ export default [
serversPath: './src/api',
requestLibPath: '@/utils/request',
projectName: 'TrajectoryContent',
apiPrefix: "'api/trackApi'",
apiPrefix: "'Track'",
},
// 预警服务
@ -102,7 +102,7 @@ export default [
serversPath: './src/api',
requestLibPath: '@/utils/request',
projectName: 'WarningServices',
apiPrefix: "'api/trackApi'",
apiPrefix: "'Track'",
},
// 轨迹订单
@ -112,7 +112,7 @@ export default [
serversPath: './src/api',
requestLibPath: '@/utils/request',
projectName: 'TrajectoryOrder',
apiPrefix: "'api/trackApi'",
apiPrefix: "'Track'",
},
// 轨迹拉取
@ -122,7 +122,7 @@ export default [
serversPath: './src/api',
requestLibPath: '@/utils/request',
projectName: 'TrajectoryPull',
apiPrefix: "'api/trackApi'",
apiPrefix: "'Track'",
},
// 轨迹推送
{
@ -131,7 +131,7 @@ export default [
serversPath: './src/api',
requestLibPath: '@/utils/request',
projectName: 'TrajectoryPush',
apiPrefix: "'api/trackApi'",
apiPrefix: "'Track'",
},
// 提供接口
@ -141,7 +141,7 @@ export default [
serversPath: './src/api',
requestLibPath: '@/utils/request',
projectName: 'InterfaceMappingProvider',
apiPrefix: "'api/trackApi'",
apiPrefix: "'Track'",
},
// 应用服务接口
@ -151,7 +151,7 @@ export default [
serversPath: './src/api',
requestLibPath: '@/utils/request',
projectName: 'ApplicationServicesProvider',
apiPrefix: "'api/trackApi'",
apiPrefix: "'Track'",
},
{

View File

@ -8,7 +8,7 @@ export async function postCleanCache(
params: API.postCleanCacheParams,
options?: { [key: string]: any }
) {
return request<any>(`api/trackApi/Dictionary/CleanCache`, {
return request<any>(`Track/Dictionary/CleanCache`, {
method: 'POST',
params: {
...params,
@ -23,7 +23,7 @@ export async function getGetList(
params: API.getGetListParams,
options?: { [key: string]: any }
) {
return request<API.EnumCacheEntry[]>(`api/trackApi/Dictionary/GetList`, {
return request<API.EnumCacheEntry[]>(`Track/Dictionary/GetList`, {
method: 'GET',
params: {
...params,

View File

@ -7,7 +7,7 @@ export async function postOrderBatchUpsert(
body: API.BatchUpsertOrderInput,
options?: { [key: string]: any }
) {
return request<any>(`api/trackApi/ProviderService/Order/BatchUpsert`, {
return request<any>(`Track/ProviderService/Order/BatchUpsert`, {
method: 'POST',
headers: {
'Content-Type': 'application/json-patch+json',
@ -22,7 +22,7 @@ export async function postOrderDelete(
body: API.DeleteOrderInput,
options?: { [key: string]: any }
) {
return request<API.IdBaseDto>(`api/trackApi/ProviderService/Order/Delete`, {
return request<API.IdBaseDto>(`Track/ProviderService/Order/Delete`, {
method: 'POST',
headers: {
'Content-Type': 'application/json-patch+json',
@ -37,7 +37,7 @@ export async function postOrderLink(
body: API.LinkOrderInput,
options?: { [key: string]: any }
) {
return request<any>(`api/trackApi/ProviderService/Order/Link`, {
return request<any>(`Track/ProviderService/Order/Link`, {
method: 'POST',
headers: {
'Content-Type': 'application/json-patch+json',
@ -53,7 +53,7 @@ export async function postOrderUpdateOrderPullConfigs(
options?: { [key: string]: any }
) {
return request<any>(
`api/trackApi/ProviderService/Order/UpdateOrderPullConfigs`,
`Track/ProviderService/Order/UpdateOrderPullConfigs`,
{
method: 'POST',
headers: {
@ -70,7 +70,7 @@ export async function postOrderUpsert(
body: API.UpsertOrderInput,
options?: { [key: string]: any }
) {
return request<API.IdBaseDto>(`api/trackApi/ProviderService/Order/Upsert`, {
return request<API.IdBaseDto>(`Track/ProviderService/Order/Upsert`, {
method: 'POST',
headers: {
'Content-Type': 'application/json-patch+json',

View File

@ -7,7 +7,7 @@ export async function postTrackBatchDelete(
body: API.BatchDeleteTrackInput,
options?: { [key: string]: any }
) {
return request<any>(`api/trackApi/ProviderService/Track/BatchDelete`, {
return request<any>(`Track/ProviderService/Track/BatchDelete`, {
method: 'POST',
headers: {
'Content-Type': 'application/json-patch+json',
@ -22,7 +22,7 @@ export async function postTrackBatchDeleteByEsId(
body: API.BatchDeleteTrackByEsIdInput,
options?: { [key: string]: any }
) {
return request<any>(`api/trackApi/ProviderService/Track/BatchDeleteByEsId`, {
return request<any>(`Track/ProviderService/Track/BatchDeleteByEsId`, {
method: 'POST',
headers: {
'Content-Type': 'application/json-patch+json',
@ -37,7 +37,7 @@ export async function postTrackBatchUpsert(
body: API.BatchUpsertTrackInput,
options?: { [key: string]: any }
) {
return request<any>(`api/trackApi/ProviderService/Track/BatchUpsert`, {
return request<any>(`Track/ProviderService/Track/BatchUpsert`, {
method: 'POST',
headers: {
'Content-Type': 'application/json-patch+json',
@ -52,7 +52,7 @@ export async function postTrackDelete(
body: API.DeleteTrackInput,
options?: { [key: string]: any }
) {
return request<any>(`api/trackApi/ProviderService/Track/Delete`, {
return request<any>(`Track/ProviderService/Track/Delete`, {
method: 'POST',
headers: {
'Content-Type': 'application/json-patch+json',
@ -68,7 +68,7 @@ export async function postTrackQuery(
options?: { [key: string]: any }
) {
return request<API.GetTrackOutput[]>(
`api/trackApi/ProviderService/Track/Query`,
`Track/ProviderService/Track/Query`,
{
method: 'POST',
headers: {
@ -86,7 +86,7 @@ export async function postTrackQueryV2(
options?: { [key: string]: any }
) {
return request<API.GetTrackOutput[]>(
`api/trackApi/ProviderService/Track/QueryV2`,
`Track/ProviderService/Track/QueryV2`,
{
method: 'POST',
headers: {
@ -103,7 +103,7 @@ export async function postTrackUpsert(
body: API.UpsertTrackInput,
options?: { [key: string]: any }
) {
return request<any>(`api/trackApi/ProviderService/Track/Upsert`, {
return request<any>(`Track/ProviderService/Track/Upsert`, {
method: 'POST',
headers: {
'Content-Type': 'application/json-patch+json',

View File

@ -9,7 +9,7 @@ export async function postTrackGetTrackContents(
options?: { [key: string]: any }
) {
return request<API.TrackContentOutput[]>(
`api/trackApi/ProviderService/Track/GetTrackContents`,
`Track/ProviderService/Track/GetTrackContents`,
{
method: 'POST',
params: {

View File

@ -7,7 +7,7 @@ export async function postTrackRefresh(
body: API.RefreshTrackInput,
options?: { [key: string]: any }
) {
return request<boolean>(`api/trackApi/ProviderService/Track/Refresh`, {
return request<boolean>(`Track/ProviderService/Track/Refresh`, {
method: 'POST',
headers: {
'Content-Type': 'application/json-patch+json',
@ -23,7 +23,7 @@ export async function postTrackTrackRefreshEventTest(
options?: { [key: string]: any }
) {
return request<boolean>(
`api/trackApi/ProviderService/Track/TrackRefreshEventTest`,
`Track/ProviderService/Track/TrackRefreshEventTest`,
{
method: 'POST',
headers: {

View File

@ -9,7 +9,7 @@ export async function getTrackGetTrackPushContentList(
options?: { [key: string]: any }
) {
return request<API.TrackPushContentDto[]>(
`api/trackApi/ProviderService/Track/GetTrackPushContentList`,
`Track/ProviderService/Track/GetTrackPushContentList`,
{
method: 'GET',
params: {
@ -27,7 +27,7 @@ export async function getTrackGetTrackPushRecords(
options?: { [key: string]: any }
) {
return request<API.TrackPushRecordOutput[]>(
`api/trackApi/ProviderService/Track/GetTrackPushRecords`,
`Track/ProviderService/Track/GetTrackPushRecords`,
{
method: 'GET',
params: {
@ -43,7 +43,7 @@ export async function postTrackPush(
body: API.PushTrackInput,
options?: { [key: string]: any }
) {
return request<any>(`api/trackApi/ProviderService/Track/Push`, {
return request<any>(`Track/ProviderService/Track/Push`, {
method: 'POST',
headers: {
'Content-Type': 'application/json-patch+json',
@ -59,7 +59,7 @@ export async function postTrackQueryTrackPushRecords(
options?: { [key: string]: any }
) {
return request<API.TrackPushRecordOutput[]>(
`api/trackApi/ProviderService/Track/QueryTrackPushRecords`,
`Track/ProviderService/Track/QueryTrackPushRecords`,
{
method: 'POST',
headers: {

View File

@ -8,7 +8,7 @@ export async function postTrackQueryTrackPullMappings(
options?: { [key: string]: any }
) {
return request<API.QueryTrackPullMappingsInfo[]>(
`api/trackApi/ProviderService/Track/QueryTrackPullMappings`,
`Track/ProviderService/Track/QueryTrackPullMappings`,
{
method: 'POST',
headers: {

View File

@ -7,7 +7,7 @@ export async function postEdit(
body: API.EditTrackContentInput,
options?: { [key: string]: any }
) {
return request<any>(`api/trackApi/Track/Content/Edit`, {
return request<any>(`Track/Track/Content/Edit`, {
method: 'POST',
headers: {
'Content-Type': 'application/json-patch+json',
@ -22,7 +22,7 @@ export async function postEditMap(
body: API.EditTrackContentMapInput,
options?: { [key: string]: any }
) {
return request<boolean>(`api/trackApi/Track/Content/EditMap`, {
return request<boolean>(`Track/Track/Content/EditMap`, {
method: 'POST',
headers: {
'Content-Type': 'application/json-patch+json',
@ -38,7 +38,7 @@ export async function postGetAvailableContent(
options?: { [key: string]: any }
) {
return request<API.GetAvailableContentOutput[]>(
`api/trackApi/Track/Content/GetAvailableContent`,
`Track/Track/Content/GetAvailableContent`,
{
method: 'POST',
headers: {
@ -56,7 +56,7 @@ export async function postGetContentDetail(
options?: { [key: string]: any }
) {
return request<API.GetContentDetailOutput>(
`api/trackApi/Track/Content/GetContentDetail`,
`Track/Track/Content/GetContentDetail`,
{
method: 'POST',
headers: {
@ -75,7 +75,7 @@ export async function getGetDetail(
options?: { [key: string]: any }
) {
return request<API.GetTrackContentDetailDto>(
`api/trackApi/Track/Content/GetDetail`,
`Track/Track/Content/GetDetail`,
{
method: 'GET',
params: {
@ -92,7 +92,7 @@ export async function postGetList(
options?: { [key: string]: any }
) {
return request<API.GetTrackContentListDtoPagedResult>(
`api/trackApi/Track/Content/GetList`,
`Track/Track/Content/GetList`,
{
method: 'POST',
headers: {
@ -111,7 +111,7 @@ export async function getGetMapDetail(
options?: { [key: string]: any }
) {
return request<API.GetTrackContentMapDetailOutputVO>(
`api/trackApi/Track/Content/GetMapDetail`,
`Track/Track/Content/GetMapDetail`,
{
method: 'GET',
params: {
@ -128,7 +128,7 @@ export async function postGetMapPage(
options?: { [key: string]: any }
) {
return request<API.GetTrackContentMapPageOutputVOPagedResult>(
`api/trackApi/Track/Content/GetMapPage`,
`Track/Track/Content/GetMapPage`,
{
method: 'POST',
headers: {
@ -146,7 +146,7 @@ export async function postGetTrackContentByCode(
options?: { [key: string]: any }
) {
return request<API.GetTrackContentByCodeOutput>(
`api/trackApi/Track/Content/GetTrackContentByCode`,
`Track/Track/Content/GetTrackContentByCode`,
{
method: 'POST',
headers: {

View File

@ -7,7 +7,7 @@ export async function postEdit(
body: API.EditTrackFlagInput,
options?: { [key: string]: any }
) {
return request<any>(`api/trackApi/Track/Flag/Edit`, {
return request<any>(`Track/Track/Flag/Edit`, {
method: 'POST',
headers: {
'Content-Type': 'application/json-patch+json',
@ -24,7 +24,7 @@ export async function getGetDetail(
options?: { [key: string]: any }
) {
return request<API.GetTrackFlagDetailDto>(
`api/trackApi/Track/Flag/GetDetail`,
`Track/Track/Flag/GetDetail`,
{
method: 'GET',
params: {
@ -41,7 +41,7 @@ export async function postGetList(
options?: { [key: string]: any }
) {
return request<API.GetTrackFlagListDtoPagedResult>(
`api/trackApi/Track/Flag/GetList`,
`Track/Track/Flag/GetList`,
{
method: 'POST',
headers: {

View File

@ -8,7 +8,7 @@ export async function postDeleteTrackById(
params: API.postDeleteTrackByIdParams,
options?: { [key: string]: any }
) {
return request<boolean>(`api/trackApi/Track/Order/DeleteTrackById`, {
return request<boolean>(`Track/Track/Order/DeleteTrackById`, {
method: 'POST',
params: {
...params,
@ -24,7 +24,7 @@ export async function postGetDetails(
options?: { [key: string]: any }
) {
return request<API.TrackOrderDetailDto[]>(
`api/trackApi/Track/Order/GetDetails`,
`Track/Track/Order/GetDetails`,
{
method: 'POST',
params: {
@ -41,7 +41,7 @@ export async function postGetDetailTimeline(
options?: { [key: string]: any }
) {
return request<API.GetDetailTimelineOutput[]>(
`api/trackApi/Track/Order/GetDetailTimeline`,
`Track/Track/Order/GetDetailTimeline`,
{
method: 'POST',
headers: {
@ -60,7 +60,7 @@ export async function getGetOrderOperationsById(
options?: { [key: string]: any }
) {
return request<API.OrderOperationRecordIndex[]>(
`api/trackApi/Track/Order/GetOrderOperationsById`,
`Track/Track/Order/GetOrderOperationsById`,
{
method: 'GET',
params: {
@ -77,7 +77,7 @@ export async function postGetTrackOrderList(
options?: { [key: string]: any }
) {
return request<API.TrackOrderDtoPagedResult>(
`api/trackApi/Track/Order/GetTrackOrderList`,
`Track/Track/Order/GetTrackOrderList`,
{
method: 'POST',
headers: {
@ -96,7 +96,7 @@ export async function getGetTrackPushRecords(
options?: { [key: string]: any }
) {
return request<API.TrackPushRecordOutput[]>(
`api/trackApi/Track/Order/GetTrackPushRecords`,
`Track/Track/Order/GetTrackPushRecords`,
{
method: 'GET',
params: {
@ -112,7 +112,7 @@ export async function postUpdateOrderStatus(
body: API.UpdateOrderStatusInput,
options?: { [key: string]: any }
) {
return request<boolean>(`api/trackApi/Track/Order/UpdateOrderStatus`, {
return request<boolean>(`Track/Track/Order/UpdateOrderStatus`, {
method: 'POST',
headers: {
'Content-Type': 'application/json-patch+json',

View File

@ -7,7 +7,7 @@ export async function postEdit(
body: API.EditTrackPullConfigInput,
options?: { [key: string]: any }
) {
return request<boolean>(`api/trackApi/Track/PullConfig/Edit`, {
return request<boolean>(`Track/Track/PullConfig/Edit`, {
method: 'POST',
headers: {
'Content-Type': 'application/json-patch+json',
@ -22,7 +22,7 @@ export async function postEditContent(
body: API.EditTrackPullContentInput,
options?: { [key: string]: any }
) {
return request<boolean>(`api/trackApi/Track/PullConfig/EditContent`, {
return request<boolean>(`Track/Track/PullConfig/EditContent`, {
method: 'POST',
headers: {
'Content-Type': 'application/json-patch+json',
@ -39,7 +39,7 @@ export async function getGetContentDetail(
options?: { [key: string]: any }
) {
return request<API.GetTrackPullContentDetailOutputVO>(
`api/trackApi/Track/PullConfig/GetContentDetail`,
`Track/Track/PullConfig/GetContentDetail`,
{
method: 'GET',
params: {
@ -56,7 +56,7 @@ export async function postGetContentPage(
options?: { [key: string]: any }
) {
return request<API.GetTrackPullContentPageOutputVOPagedResult>(
`api/trackApi/Track/PullConfig/GetContentPage`,
`Track/Track/PullConfig/GetContentPage`,
{
method: 'POST',
headers: {
@ -75,7 +75,7 @@ export async function getGetDetail(
options?: { [key: string]: any }
) {
return request<API.GetTrackPullConfigDetailOutputVO>(
`api/trackApi/Track/PullConfig/GetDetail`,
`Track/Track/PullConfig/GetDetail`,
{
method: 'GET',
params: {
@ -92,7 +92,7 @@ export async function postGetPage(
options?: { [key: string]: any }
) {
return request<API.GetTrackPullConfigPageOutputVOPagedResult>(
`api/trackApi/Track/PullConfig/GetPage`,
`Track/Track/PullConfig/GetPage`,
{
method: 'POST',
headers: {
@ -110,7 +110,7 @@ export async function postGetPriorityPage(
options?: { [key: string]: any }
) {
return request<API.GetTrackPullPriorityPageOutputVOPagedResult>(
`api/trackApi/Track/PullConfig/GetPriorityPage`,
`Track/Track/PullConfig/GetPriorityPage`,
{
method: 'POST',
headers: {
@ -129,7 +129,7 @@ export async function getGetPriorityDetail(
options?: { [key: string]: any }
) {
return request<API.GetTrackPullPriorityDetailOutputVO>(
`api/trackApi/Track/PullConfig/GetPriorityDetail`,
`Track/Track/PullConfig/GetPriorityDetail`,
{
method: 'GET',
params: {
@ -145,7 +145,7 @@ export async function postEditPriority(
body: API.EditTrackPullPriorityInput,
options?: { [key: string]: any }
) {
return request<boolean>(`api/trackApi/Track/PullConfig/EditPriority`, {
return request<boolean>(`Track/Track/PullConfig/EditPriority`, {
method: 'POST',
headers: {
'Content-Type': 'application/json-patch+json',

View File

@ -7,7 +7,7 @@ export async function postEdit(
body: API.EditTrackPushConfigInput,
options?: { [key: string]: any }
) {
return request<string>(`api/trackApi/Track/PushConfig/Edit`, {
return request<string>(`Track/Track/PushConfig/Edit`, {
method: 'POST',
headers: {
'Content-Type': 'application/json-patch+json',
@ -22,7 +22,7 @@ export async function postEditContent(
body: API.EditTrackPushContentInput,
options?: { [key: string]: any }
) {
return request<boolean>(`api/trackApi/Track/PushConfig/EditContent`, {
return request<boolean>(`Track/Track/PushConfig/EditContent`, {
method: 'POST',
headers: {
'Content-Type': 'application/json-patch+json',
@ -39,7 +39,7 @@ export async function getGetContentDetail(
options?: { [key: string]: any }
) {
return request<API.GetTrackPushContentDetailOutputVO>(
`api/trackApi/Track/PushConfig/GetContentDetail`,
`Track/Track/PushConfig/GetContentDetail`,
{
method: 'GET',
params: {
@ -56,7 +56,7 @@ export async function postGetContentPage(
options?: { [key: string]: any }
) {
return request<API.GetTrackPushContentPageOutputVOPagedResult>(
`api/trackApi/Track/PushConfig/GetContentPage`,
`Track/Track/PushConfig/GetContentPage`,
{
method: 'POST',
headers: {
@ -75,7 +75,7 @@ export async function getGetDetail(
options?: { [key: string]: any }
) {
return request<API.GetTrackPushConfigDetailOutputVO>(
`api/trackApi/Track/PushConfig/GetDetail`,
`Track/Track/PushConfig/GetDetail`,
{
method: 'GET',
params: {
@ -92,7 +92,7 @@ export async function postGetPage(
options?: { [key: string]: any }
) {
return request<API.GetTrackPushConfigPageOutputVOPagedResult>(
`api/trackApi/Track/PushConfig/GetPage`,
`Track/Track/PushConfig/GetPage`,
{
method: 'POST',
headers: {
@ -109,7 +109,7 @@ export async function postSortContent(
body: API.SortTrackPushContentInput,
options?: { [key: string]: any }
) {
return request<boolean>(`api/trackApi/Track/PushConfig/SortContent`, {
return request<boolean>(`Track/Track/PushConfig/SortContent`, {
method: 'POST',
headers: {
'Content-Type': 'application/json-patch+json',

View File

@ -7,7 +7,7 @@ export async function postEdit(
body: API.EditTrackStatusInput,
options?: { [key: string]: any }
) {
return request<any>(`api/trackApi/Track/Status/Edit`, {
return request<any>(`Track/Track/Status/Edit`, {
method: 'POST',
headers: {
'Content-Type': 'application/json-patch+json',
@ -24,7 +24,7 @@ export async function getGetDetail(
options?: { [key: string]: any }
) {
return request<API.GetTrackStatusDetailDto>(
`api/trackApi/Track/Status/GetDetail`,
`Track/Track/Status/GetDetail`,
{
method: 'GET',
params: {
@ -41,7 +41,7 @@ export async function postGetList(
options?: { [key: string]: any }
) {
return request<API.GetTrackStatusListDtoPagedResult>(
`api/trackApi/Track/Status/GetList`,
`Track/Track/Status/GetList`,
{
method: 'POST',
headers: {

View File

@ -8,7 +8,7 @@ export async function postWarningCompleteEditCompleteWarningRuleItem(
options?: { [key: string]: any }
) {
return request<any>(
`api/trackApi/Warning/Complete/EditCompleteWarningRuleItem`,
`Track/Warning/Complete/EditCompleteWarningRuleItem`,
{
method: 'POST',
headers: {
@ -26,7 +26,7 @@ export async function postWarningCompleteGetCompleteWarningRuleItem(
options?: { [key: string]: any }
) {
return request<API.CompleteWarningRuleItemDto[]>(
`api/trackApi/Warning/Complete/GetCompleteWarningRuleItem`,
`Track/Warning/Complete/GetCompleteWarningRuleItem`,
{
method: 'POST',
headers: {
@ -44,7 +44,7 @@ export async function postWarningCompleteGetPageCompleteWarningDetails(
options?: { [key: string]: any }
) {
return request<API.CompleteWarningDetailsDtoPagedResult>(
`api/trackApi/Warning/Complete/GetPageCompleteWarningDetails`,
`Track/Warning/Complete/GetPageCompleteWarningDetails`,
{
method: 'POST',
headers: {

View File

@ -8,7 +8,7 @@ export async function postForewarningServiceKpiAreaAddAreaInfo(
options?: { [key: string]: any }
) {
return request<API.IdBaseDto>(
`api/trackApi/ForewarningService/KpiArea/AddAreaInfo`,
`Track/ForewarningService/KpiArea/AddAreaInfo`,
{
method: 'POST',
headers: {
@ -26,7 +26,7 @@ export async function postForewarningServiceKpiAreaCreateKpiArea(
options?: { [key: string]: any }
) {
return request<API.IdBaseDto>(
`api/trackApi/ForewarningService/KpiArea/CreateKpiArea`,
`Track/ForewarningService/KpiArea/CreateKpiArea`,
{
method: 'POST',
headers: {
@ -44,7 +44,7 @@ export async function deleteForewarningServiceKpiAreaDeleteKpiArea(
params: API.deleteForewarningServiceKpiAreaDeleteKpiAreaParams,
options?: { [key: string]: any }
) {
return request<any>(`api/trackApi/ForewarningService/KpiArea/DeleteKpiArea`, {
return request<any>(`Track/ForewarningService/KpiArea/DeleteKpiArea`, {
method: 'DELETE',
params: {
...params,
@ -60,7 +60,7 @@ export async function deleteForewarningServiceKpiAreaDeleteKpiAreaInfo(
options?: { [key: string]: any }
) {
return request<any>(
`api/trackApi/ForewarningService/KpiArea/DeleteKpiAreaInfo`,
`Track/ForewarningService/KpiArea/DeleteKpiAreaInfo`,
{
method: 'DELETE',
params: {
@ -77,7 +77,7 @@ export async function postForewarningServiceKpiAreaGetKpiAreaInfos(
options?: { [key: string]: any }
) {
return request<API.RuleAreaInfoDtoPagedResult>(
`api/trackApi/ForewarningService/KpiArea/GetKpiAreaInfos`,
`Track/ForewarningService/KpiArea/GetKpiAreaInfos`,
{
method: 'POST',
headers: {
@ -95,7 +95,7 @@ export async function postForewarningServiceKpiAreaGetKpiAreas(
options?: { [key: string]: any }
) {
return request<API.AreaDtoPagedResult>(
`api/trackApi/ForewarningService/KpiArea/GetKpiAreas`,
`Track/ForewarningService/KpiArea/GetKpiAreas`,
{
method: 'POST',
headers: {
@ -112,7 +112,7 @@ export async function postForewarningServiceKpiAreaModifyKpiArea(
body: API.UpdateRuleAreaRequest,
options?: { [key: string]: any }
) {
return request<any>(`api/trackApi/ForewarningService/KpiArea/ModifyKpiArea`, {
return request<any>(`Track/ForewarningService/KpiArea/ModifyKpiArea`, {
method: 'POST',
headers: {
'Content-Type': 'application/json-patch+json',
@ -128,7 +128,7 @@ export async function postForewarningServiceKpiAreaModifyKpiAreaInfo(
options?: { [key: string]: any }
) {
return request<any>(
`api/trackApi/ForewarningService/KpiArea/ModifyKpiAreaInfo`,
`Track/ForewarningService/KpiArea/ModifyKpiAreaInfo`,
{
method: 'POST',
headers: {

View File

@ -7,7 +7,7 @@ export async function postWarningReturnEditReturnWarningRuleItem(
body: API.EditReturnWarningRuleItemInput,
options?: { [key: string]: any }
) {
return request<any>(`api/trackApi/Warning/Return/EditReturnWarningRuleItem`, {
return request<any>(`Track/Warning/Return/EditReturnWarningRuleItem`, {
method: 'POST',
headers: {
'Content-Type': 'application/json-patch+json',
@ -23,7 +23,7 @@ export async function postWarningReturnGetPageReturnWarningDetails(
options?: { [key: string]: any }
) {
return request<API.ReturnWarningDetailsDtoPagedResult>(
`api/trackApi/Warning/Return/GetPageReturnWarningDetails`,
`Track/Warning/Return/GetPageReturnWarningDetails`,
{
method: 'POST',
headers: {
@ -41,7 +41,7 @@ export async function postWarningReturnGetReturnMessageRecord(
options?: { [key: string]: any }
) {
return request<API.ReturnMessageRecordDto[]>(
`api/trackApi/Warning/Return/GetReturnMessageRecord`,
`Track/Warning/Return/GetReturnMessageRecord`,
{
method: 'POST',
headers: {
@ -59,7 +59,7 @@ export async function postWarningReturnGetReturnWarningRuleItem(
options?: { [key: string]: any }
) {
return request<API.ReturnWarningRuleItemDto[]>(
`api/trackApi/Warning/Return/GetReturnWarningRuleItem`,
`Track/Warning/Return/GetReturnWarningRuleItem`,
{
method: 'POST',
headers: {
@ -76,7 +76,7 @@ export async function postWarningReturnReturnPush(
body: API.ReturnPushInput,
options?: { [key: string]: any }
) {
return request<string>(`api/trackApi/Warning/Return/ReturnPush`, {
return request<string>(`Track/Warning/Return/ReturnPush`, {
method: 'POST',
headers: {
'Content-Type': 'application/json-patch+json',

View File

@ -8,7 +8,7 @@ export async function postWarningTransportDeleteTransportWarningScene(
options?: { [key: string]: any }
) {
return request<any>(
`api/trackApi/Warning/Transport/DeleteTransportWarningScene`,
`Track/Warning/Transport/DeleteTransportWarningScene`,
{
method: 'POST',
headers: {
@ -26,7 +26,7 @@ export async function postWarningTransportEditTransportWarningSceneRuleItem(
options?: { [key: string]: any }
) {
return request<any>(
`api/trackApi/Warning/Transport/EditTransportWarningSceneRuleItem`,
`Track/Warning/Transport/EditTransportWarningSceneRuleItem`,
{
method: 'POST',
headers: {
@ -44,7 +44,7 @@ export async function postWarningTransportGetPageTransportWarningDetails(
options?: { [key: string]: any }
) {
return request<API.TransportWarningDetailsDtoPagedResult>(
`api/trackApi/Warning/Transport/GetPageTransportWarningDetails`,
`Track/Warning/Transport/GetPageTransportWarningDetails`,
{
method: 'POST',
headers: {
@ -62,7 +62,7 @@ export async function postWarningTransportGetTransportWarningScene(
options?: { [key: string]: any }
) {
return request<API.TransportWarningSceneDto[]>(
`api/trackApi/Warning/Transport/GetTransportWarningScene`,
`Track/Warning/Transport/GetTransportWarningScene`,
{
method: 'POST',
headers: {
@ -80,7 +80,7 @@ export async function postWarningTransportGetTransportWarningSceneRuleItem(
options?: { [key: string]: any }
) {
return request<API.TransportWarningSceneRuleItemDto[]>(
`api/trackApi/Warning/Transport/GetTransportWarningSceneRuleItem`,
`Track/Warning/Transport/GetTransportWarningSceneRuleItem`,
{
method: 'POST',
headers: {
@ -98,7 +98,7 @@ export async function postWarningTransportUpsertTransportWarningScene(
options?: { [key: string]: any }
) {
return request<API.IdBaseDto>(
`api/trackApi/Warning/Transport/UpsertTransportWarningScene`,
`Track/Warning/Transport/UpsertTransportWarningScene`,
{
method: 'POST',
headers: {

View File

@ -7,7 +7,7 @@ export async function postWarningGetWarningRule(
body: API.GetWarningRuleInput,
options?: { [key: string]: any }
) {
return request<API.WarningRuleDto[]>(`api/trackApi/Warning/GetWarningRule`, {
return request<API.WarningRuleDto[]>(`Track/Warning/GetWarningRule`, {
method: 'POST',
headers: {
'Content-Type': 'application/json-patch+json',
@ -22,7 +22,7 @@ export async function postWarningUpdateEnabledStatus(
body: API.UpdateEnabledStatusInput,
options?: { [key: string]: any }
) {
return request<API.IdBaseDto>(`api/trackApi/Warning/UpdateEnabledStatus`, {
return request<API.IdBaseDto>(`Track/Warning/UpdateEnabledStatus`, {
method: 'POST',
headers: {
'Content-Type': 'application/json-patch+json',
@ -37,7 +37,7 @@ export async function postWarningUpsertWarningRule(
body: API.UpsertWarningRuleInput,
options?: { [key: string]: any }
) {
return request<API.IdBaseDto>(`api/trackApi/Warning/UpsertWarningRule`, {
return request<API.IdBaseDto>(`Track/Warning/UpsertWarningRule`, {
method: 'POST',
headers: {
'Content-Type': 'application/json-patch+json',

View File

@ -8,7 +8,7 @@ export async function postWarningCompleteEditCompleteWarningRuleItem(
options?: { [key: string]: any }
) {
return request<any>(
`api/trackApi/Warning/Complete/EditCompleteWarningRuleItem`,
`Track/Warning/Complete/EditCompleteWarningRuleItem`,
{
method: 'POST',
headers: {
@ -26,7 +26,7 @@ export async function postWarningCompleteGetCompleteWarningRuleItem(
options?: { [key: string]: any }
) {
return request<API.CompleteWarningRuleItemDto[]>(
`api/trackApi/Warning/Complete/GetCompleteWarningRuleItem`,
`Track/Warning/Complete/GetCompleteWarningRuleItem`,
{
method: 'POST',
headers: {
@ -44,7 +44,7 @@ export async function postWarningCompleteGetPageCompleteWarningDetails(
options?: { [key: string]: any }
) {
return request<API.CompleteWarningDetailsDtoPagedResult>(
`api/trackApi/Warning/Complete/GetPageCompleteWarningDetails`,
`Track/Warning/Complete/GetPageCompleteWarningDetails`,
{
method: 'POST',
headers: {

View File

@ -8,7 +8,7 @@ export async function postForewarningServiceKpiAreaAddAreaInfo(
options?: { [key: string]: any }
) {
return request<API.IdBaseDto>(
`api/trackApi/ForewarningService/KpiArea/AddAreaInfo`,
`Track/ForewarningService/KpiArea/AddAreaInfo`,
{
method: 'POST',
headers: {
@ -26,7 +26,7 @@ export async function postForewarningServiceKpiAreaCreateKpiArea(
options?: { [key: string]: any }
) {
return request<API.IdBaseDto>(
`api/trackApi/ForewarningService/KpiArea/CreateKpiArea`,
`Track/ForewarningService/KpiArea/CreateKpiArea`,
{
method: 'POST',
headers: {
@ -44,7 +44,7 @@ export async function deleteForewarningServiceKpiAreaDeleteKpiArea(
params: API.deleteForewarningServiceKpiAreaDeleteKpiAreaParams,
options?: { [key: string]: any }
) {
return request<any>(`api/trackApi/ForewarningService/KpiArea/DeleteKpiArea`, {
return request<any>(`Track/ForewarningService/KpiArea/DeleteKpiArea`, {
method: 'DELETE',
params: {
...params,
@ -60,7 +60,7 @@ export async function deleteForewarningServiceKpiAreaDeleteKpiAreaInfo(
options?: { [key: string]: any }
) {
return request<any>(
`api/trackApi/ForewarningService/KpiArea/DeleteKpiAreaInfo`,
`Track/ForewarningService/KpiArea/DeleteKpiAreaInfo`,
{
method: 'DELETE',
params: {
@ -77,7 +77,7 @@ export async function postForewarningServiceKpiAreaGetKpiAreaInfos(
options?: { [key: string]: any }
) {
return request<API.RuleAreaInfoDtoPagedResult>(
`api/trackApi/ForewarningService/KpiArea/GetKpiAreaInfos`,
`Track/ForewarningService/KpiArea/GetKpiAreaInfos`,
{
method: 'POST',
headers: {
@ -95,7 +95,7 @@ export async function postForewarningServiceKpiAreaGetKpiAreas(
options?: { [key: string]: any }
) {
return request<API.AreaDtoPagedResult>(
`api/trackApi/ForewarningService/KpiArea/GetKpiAreas`,
`Track/ForewarningService/KpiArea/GetKpiAreas`,
{
method: 'POST',
headers: {
@ -112,7 +112,7 @@ export async function postForewarningServiceKpiAreaModifyKpiArea(
body: API.UpdateRuleAreaRequest,
options?: { [key: string]: any }
) {
return request<any>(`api/trackApi/ForewarningService/KpiArea/ModifyKpiArea`, {
return request<any>(`Track/ForewarningService/KpiArea/ModifyKpiArea`, {
method: 'POST',
headers: {
'Content-Type': 'application/json-patch+json',
@ -128,7 +128,7 @@ export async function postForewarningServiceKpiAreaModifyKpiAreaInfo(
options?: { [key: string]: any }
) {
return request<any>(
`api/trackApi/ForewarningService/KpiArea/ModifyKpiAreaInfo`,
`Track/ForewarningService/KpiArea/ModifyKpiAreaInfo`,
{
method: 'POST',
headers: {

View File

@ -7,7 +7,7 @@ export async function postWarningReturnEditReturnWarningRuleItem(
body: API.EditReturnWarningRuleItemInput,
options?: { [key: string]: any }
) {
return request<any>(`api/trackApi/Warning/Return/EditReturnWarningRuleItem`, {
return request<any>(`Track/Warning/Return/EditReturnWarningRuleItem`, {
method: 'POST',
headers: {
'Content-Type': 'application/json-patch+json',
@ -23,7 +23,7 @@ export async function postWarningReturnGetPageReturnWarningDetails(
options?: { [key: string]: any }
) {
return request<API.ReturnWarningDetailsDtoPagedResult>(
`api/trackApi/Warning/Return/GetPageReturnWarningDetails`,
`Track/Warning/Return/GetPageReturnWarningDetails`,
{
method: 'POST',
headers: {
@ -41,7 +41,7 @@ export async function postWarningReturnGetReturnMessageRecord(
options?: { [key: string]: any }
) {
return request<API.ReturnMessageRecordDto[]>(
`api/trackApi/Warning/Return/GetReturnMessageRecord`,
`Track/Warning/Return/GetReturnMessageRecord`,
{
method: 'POST',
headers: {
@ -59,7 +59,7 @@ export async function postWarningReturnGetReturnWarningRuleItem(
options?: { [key: string]: any }
) {
return request<API.ReturnWarningRuleItemDto[]>(
`api/trackApi/Warning/Return/GetReturnWarningRuleItem`,
`Track/Warning/Return/GetReturnWarningRuleItem`,
{
method: 'POST',
headers: {
@ -76,7 +76,7 @@ export async function postWarningReturnReturnPush(
body: API.ReturnPushInput,
options?: { [key: string]: any }
) {
return request<string>(`api/trackApi/Warning/Return/ReturnPush`, {
return request<string>(`Track/Warning/Return/ReturnPush`, {
method: 'POST',
headers: {
'Content-Type': 'application/json-patch+json',

View File

@ -8,7 +8,7 @@ export async function postWarningTransportDeleteTransportWarningScene(
options?: { [key: string]: any }
) {
return request<any>(
`api/trackApi/Warning/Transport/DeleteTransportWarningScene`,
`Track/Warning/Transport/DeleteTransportWarningScene`,
{
method: 'POST',
headers: {
@ -26,7 +26,7 @@ export async function postWarningTransportEditTransportWarningSceneRuleItem(
options?: { [key: string]: any }
) {
return request<any>(
`api/trackApi/Warning/Transport/EditTransportWarningSceneRuleItem`,
`Track/Warning/Transport/EditTransportWarningSceneRuleItem`,
{
method: 'POST',
headers: {
@ -44,7 +44,7 @@ export async function postWarningTransportGetPageTransportWarningDetails(
options?: { [key: string]: any }
) {
return request<API.TransportWarningDetailsDtoPagedResult>(
`api/trackApi/Warning/Transport/GetPageTransportWarningDetails`,
`Track/Warning/Transport/GetPageTransportWarningDetails`,
{
method: 'POST',
headers: {
@ -62,7 +62,7 @@ export async function postWarningTransportGetTransportWarningScene(
options?: { [key: string]: any }
) {
return request<API.TransportWarningSceneDto[]>(
`api/trackApi/Warning/Transport/GetTransportWarningScene`,
`Track/Warning/Transport/GetTransportWarningScene`,
{
method: 'POST',
headers: {
@ -80,7 +80,7 @@ export async function postWarningTransportGetTransportWarningSceneRuleItem(
options?: { [key: string]: any }
) {
return request<API.TransportWarningSceneRuleItemDto[]>(
`api/trackApi/Warning/Transport/GetTransportWarningSceneRuleItem`,
`Track/Warning/Transport/GetTransportWarningSceneRuleItem`,
{
method: 'POST',
headers: {
@ -98,7 +98,7 @@ export async function postWarningTransportUpsertTransportWarningScene(
options?: { [key: string]: any }
) {
return request<API.IdBaseDto>(
`api/trackApi/Warning/Transport/UpsertTransportWarningScene`,
`Track/Warning/Transport/UpsertTransportWarningScene`,
{
method: 'POST',
headers: {

View File

@ -7,7 +7,7 @@ export async function postWarningGetWarningRule(
body: API.GetWarningRuleInput,
options?: { [key: string]: any }
) {
return request<API.WarningRuleDto[]>(`api/trackApi/Warning/GetWarningRule`, {
return request<API.WarningRuleDto[]>(`Track/Warning/GetWarningRule`, {
method: 'POST',
headers: {
'Content-Type': 'application/json-patch+json',
@ -22,7 +22,7 @@ export async function postWarningUpdateEnabledStatus(
body: API.UpdateEnabledStatusInput,
options?: { [key: string]: any }
) {
return request<API.IdBaseDto>(`api/trackApi/Warning/UpdateEnabledStatus`, {
return request<API.IdBaseDto>(`Track/Warning/UpdateEnabledStatus`, {
method: 'POST',
headers: {
'Content-Type': 'application/json-patch+json',
@ -37,7 +37,7 @@ export async function postWarningUpsertWarningRule(
body: API.UpsertWarningRuleInput,
options?: { [key: string]: any }
) {
return request<API.IdBaseDto>(`api/trackApi/Warning/UpsertWarningRule`, {
return request<API.IdBaseDto>(`Track/Warning/UpsertWarningRule`, {
method: 'POST',
headers: {
'Content-Type': 'application/json-patch+json',

View File

@ -5,9 +5,7 @@ import { OpenAPI, clearAuthToken } from './index'
import { useRbacUserStore } from '@/store/modules/rbac-user'
// 创建自定义 axios 实例
// 注意:baseURL 设置为空,因为 OpenAPI.BASE 已经处理了 URL 构建
// 生产环境:OpenAPI.BASE = 'http://43.139.210.35:5281'
// 开发环境:OpenAPI.BASE = ''(通过 Vite 代理)
// baseURL 为空,URL 由 OpenAPI.BASE + path 构建;生产环境 OpenAPI.BASE = http://api.nanafa.com/admin
export const axiosInstance = axios.create({
baseURL: '', // 始终为空,URL 由 OpenAPI.BASE + path 构建
timeout: 30000,

View File

@ -10,19 +10,11 @@ export * from './generated'
import { OpenAPI } from './generated/core/OpenAPI'
import { axiosInstance } from './axios-config'
// 设置基础 URL
// 生产环境和开发环境都使用相对路径,通过 nginx/Vite 代理转发
// 生产环境:通过 nginx 代理 /rbac -> http://43.139.210.35:5281
// 开发环境:通过 Vite 代理 /rbac -> http://43.139.210.35:5281
OpenAPI.BASE = ''
// 调试信息
// 设置基础 URL:生产直连 http://api.nanafa.com/admin,开发走 Vite 代理
const isProduction = (import.meta as any).env?.MODE === 'production' || (import.meta as any).env?.PROD === true
if (isProduction) {
console.log('[RBAC Config] Production mode: BASE =', OpenAPI.BASE, '(using nginx proxy)')
} else {
console.log('[RBAC Config] Development mode: BASE =', OpenAPI.BASE, '(using Vite proxy)')
}
OpenAPI.BASE = isProduction
? (import.meta.env.VITE_API_ADMIN_URL || 'http://api.nanafa.com/admin')
: ''
// 认证 token 管理
export function setAuthToken(token: string) {

View File

@ -54,6 +54,8 @@
actionColumnWidth?: number;
// 是否显示复选框列
showCheckboxColumn?: boolean;
// 复选框列表头文案(空则表头为空)
checkboxColumnHeader?: string;
// 复选框变化回调
onCheckboxChange?: (row: any, checked: boolean, rowIndex: number) => void;
// 操作列渲染器
@ -86,6 +88,7 @@
actionColumnPosition: 'start',
actionColumnWidth: 60,
showCheckboxColumn: false,
checkboxColumnHeader: '',
readOnly: true,
multiValueFields: () => [],
height: undefined,
@ -108,6 +111,7 @@
}>();
const hotContainer = ref<HTMLElement | null>(null);
const containerRef = ref<HTMLElement | null>(null);
let hotInstance: Handsontable | null = null;
const selectedRows = ref<any[]>([]);
@ -173,7 +177,7 @@
// 复选框列
if (props.showCheckboxColumn) {
columns.push({ data: currentDataIndex, type: 'checkbox', readOnly: false, width: 60, className: 'htLeft' });
headerTexts.push('');
headerTexts.push(props.checkboxColumnHeader ?? '');
currentDataIndex++;
}
@ -266,6 +270,10 @@
});
try {
// 未传 height 时使用容器实际高度,使列表高度与容器一致
const containerH = containerRef.value?.clientHeight ?? 0;
const tableHeight = props.height ?? (containerH > 0 ? containerH : calculatedHeight.value);
const hotConfig: any = {
data: data,
columns: columns,
@ -273,7 +281,7 @@
rowHeaders: false,
selectionMode: 'multiple',
width: '100%',
height: calculatedHeight.value,
height: tableHeight,
licenseKey: 'non-commercial-and-evaluation',
className: 'ht-theme-classic',
language: 'zh-CN',
@ -1068,12 +1076,26 @@
}
};
// 容器尺寸变化时同步表格高度,使列表高度与容器一致
let resizeObserver: ResizeObserver | null = null;
const setupResizeObserver = () => {
if (!containerRef.value) return;
resizeObserver = new ResizeObserver((entries) => {
const entry = entries[0];
if (entry && hotInstance && entry.contentRect.height > 0) {
hotInstance.updateSettings({ height: entry.contentRect.height });
}
});
resizeObserver.observe(containerRef.value);
};
onMounted(() => {
nextTick(() => {
// 确保样式已加载后再初始化
setTimeout(() => {
initHandsontable();
finalizeInit();
setupResizeObserver();
}, 200);
});
@ -1085,6 +1107,12 @@
});
onUnmounted(() => {
if (resizeObserver && containerRef.value) {
try {
resizeObserver.unobserve(containerRef.value);
} catch (_) {}
resizeObserver = null;
}
// 停止定期刷新
stopDimensionRefresh();
@ -1112,7 +1140,7 @@
</script>
<template>
<div class="handsontable-pro-container">
<div ref="containerRef" class="handsontable-pro-container">
<div ref="hotContainer" class="handsontable-wrapper ht-theme-classic"></div>
</div>
</template>

View File

@ -9,7 +9,7 @@
<b><i class="fa fa-user mr-2"></i>个人中心</b>
</a-doption>
<a-doption @click="() => onMenuClick({ key: 'settings' })">
<b><i class="fa fa-cog mr-2"></i>主题 / 页面配置</b>
<b><i class="fa fa-cog mr-2"></i>页面配置</b>
</a-doption>
<a-doption @click="() => onMenuClick({ key: 'logout' })">
<b class="text-red-500"><i class="fa fa-sign-in mr-2"></i>退出登录</b>

View File

@ -10,7 +10,6 @@ import router from '@/router';
import { clearToken } from '@/utils/auth';
import { useUserStore } from '@/store';
// 创建axios实例
const service: AxiosInstance = axios.create({
baseURL: '/',
timeout: 10000, // 请求超时时间
@ -22,7 +21,9 @@ const service: AxiosInstance = axios.create({
// 请求拦截器
service.interceptors.request.use(
(config: AxiosRequestConfig) => {
// 在发送请求之前做些什么
config.headers = config.headers ?? {};
// 生产:/api、/Track 走同源,由 nginx 代理到 api.nanafa.com,避免跨域 405;rbac 直连 admin
// 开发:Vite 代理 /api、/Track、/rbac
// 从 localStorage 获取 token
const token = localStorage.getItem('token');
if (token) {

View File

@ -1854,11 +1854,41 @@
.header-actions {
display: flex;
gap: 8px;
gap: 2px;
flex-shrink: 0;
margin-left: auto;
display: flex;
gap: 8px;
}
/* 下游接口中间容器:刷新、新增按钮无背景无框,黑色纯符号 */
.middle-content.nav-panel .header-actions .action-icon-btn.refresh-btn {
color: #000 !important;
background-color: transparent !important;
border-color: transparent !important;
&:hover:not(:disabled) {
color: #262626 !important;
background-color: transparent !important;
border-color: transparent !important;
}
&:disabled {
color: #d9d9d9 !important;
background-color: transparent !important;
border-color: transparent !important;
}
}
.middle-content.nav-panel .header-actions .action-icon-btn.add-btn {
color: #000 !important;
background-color: transparent !important;
border-color: transparent !important;
&:hover:not(:disabled) {
color: #262626 !important;
background-color: transparent !important;
border-color: transparent !important;
}
&:disabled {
color: #d9d9d9 !important;
background-color: transparent !important;
border-color: transparent !important;
}
}
.content-body {

View File

@ -1686,23 +1686,24 @@ import { IconClose, IconEdit, IconPlus, IconSearch, IconMore, IconMinus, IconRef
}
.mapping-search-box {
flex: 1;
flex: 1 1 calc(100% - 22px);
padding: 0;
margin-right: 8px;
margin-right: 4px;
box-sizing: border-box;
min-width: 0;
}
.mapping-search-box :deep(.arco-input-wrapper) {
background: #fff !important;
border: 1px solid var(--color-border-2) !important;
border-radius: 4px !important;
border-radius: 24px !important;
height: auto !important;
}
.mapping-search-box :deep(.arco-input) {
background: #fff !important;
border: none !important;
border-radius: 4px !important;
border-radius: 24px !important;
color: var(--color-text-1) !important;
height: auto !important;
}
@ -1863,19 +1864,40 @@ import { IconClose, IconEdit, IconPlus, IconSearch, IconMore, IconMinus, IconRef
.header-actions {
display: flex;
gap: 8px;
gap: 0px;
flex-shrink: 0;
margin-left: auto;
}
// 映射列表区域的刷新按钮改为灰色
.middle-content.nav-panel .header-actions .refresh-btn {
color: #8c8c8c !important;
&:hover {
color: #666 !important;
/* 映射列表区域:刷新、新增按钮为黑色纯符号(无背景无框),两按钮紧挨 */
.middle-content.nav-panel .header-actions .action-icon-btn.refresh-btn {
color: #000 !important;
background-color: transparent !important;
border-color: transparent !important;
&:hover:not(:disabled) {
color: #262626 !important;
background-color: transparent !important;
border-color: transparent !important;
}
&:disabled {
color: #d9d9d9 !important;
background-color: transparent !important;
border-color: transparent !important;
}
}
.middle-content.nav-panel .header-actions .action-icon-btn.add-btn {
color: #000 !important;
background-color: transparent !important;
border-color: transparent !important;
&:hover:not(:disabled) {
color: #262626 !important;
background-color: transparent !important;
border-color: transparent !important;
}
&:disabled {
color: #d9d9d9 !important;
background-color: transparent !important;
border-color: transparent !important;
}
}

View File

@ -1362,27 +1362,28 @@
</div>
</div>
<!-- Handsontable 表格 -->
<HandsontablePro
ref="handsontableRef"
:columns="columns"
:data="processedTableData"
:total="totalCount"
:current-page="currentPage"
:page-size="pageSize"
:search-params="searchParams"
:show-checkbox-column="true"
:show-action-column="true"
:action-column-position="'end'"
:action-renderer="actionRenderer"
:multi-value-fields="['orderNos']"
:custom-cell-renderer="customCellRenderer"
:read-only="false"
@checkbox-change="handleCheckboxChange"
@action-click="handleActionClick"
@search="handleHeaderSearch"
@selection-change="handleSelectionChange"
/>
<!-- 列表区域:占满剩余高度,滚动条高度正确 -->
<div class="list-wrap">
<HandsontablePro
ref="handsontableRef"
:columns="columns"
:data="processedTableData"
:total="totalCount"
:current-page="currentPage"
:page-size="pageSize"
:search-params="searchParams"
:show-checkbox-column="false"
:show-action-column="true"
:action-column-position="'start'"
:action-renderer="actionRenderer"
:multi-value-fields="['orderNos']"
:custom-cell-renderer="customCellRenderer"
:read-only="false"
@action-click="handleActionClick"
@search="handleHeaderSearch"
@selection-change="handleSelectionChange"
/>
</div>
<!-- 隐藏原始表格 -->
<TablePro ref="tableRef" v-bind="tableProps" style="display: none;">
@ -1523,11 +1524,12 @@
</template>
<style scoped lang="less">
/* 与左侧 tab 容器高度一致:填满 content-area(和 vertical-tabs 同高) */
.xxx-container {
padding: 16px;
background-color: #fff;
height: calc(100vh - 86px - 100px); // 减去导航栏和tab高度
max-height: calc(100vh - 86px - 100px);
height: 100%;
min-height: 0;
box-sizing: border-box;
width: 100%;
overflow: hidden;
@ -1535,7 +1537,27 @@
flex-direction: column;
}
/* 列表区域:占满工具栏下方剩余高度,滚动条高度与容器一致 */
.list-wrap {
flex: 1;
min-height: 0;
overflow: hidden;
display: flex;
flex-direction: column;
}
.list-wrap :deep(.handsontable-pro-container) {
flex: 1;
min-height: 0;
height: 100%;
}
.list-wrap :deep(.handsontable-wrapper) {
height: 100%;
}
.table-toolbar {
flex-shrink: 0;
margin-bottom: 8px;
display: flex;
justify-content: space-between;

View File

@ -177,7 +177,7 @@
}
// 跳转页码
const jumpPage = ref('1');
const jumpPage = ref(1);
function handleJumpPage() {
const page = Number(jumpPage.value);
if (page > 0 && page <= Math.ceil(totalCount.value / pageSize.value)) {
@ -314,7 +314,7 @@
<template>
<div class="xxx-container" style="background-color: #fff;">
<!-- 表格操作按钮 -->
<!-- 表格操作按钮和分页控制(与运输时效 tab 一致) -->
<div class="table-toolbar">
<div class="toolbar-left">
<div class="custom-buttons">
@ -329,26 +329,28 @@
</div>
<div class="toolbar-right">
<div class="pagination-controls">
<span class="total-records">共{{ totalCount }}条记录</span>
<span class="total-records">共 {{ totalCount }} 条记录</span>
<a-button
type="text"
size="small"
:disabled="currentPage <= 1"
:disabled="currentPage === 1"
@click="handlePageChange(currentPage - 1)"
>
&lt;
上一页
</a-button>
<span class="current-page">{{ currentPage }}</span>
<a-button
type="text"
size="small"
:disabled="currentPage >= Math.ceil(totalCount / pageSize)"
:disabled="currentPage * pageSize >= totalCount"
@click="handlePageChange(currentPage + 1)"
>
&gt;
下一页
</a-button>
<a-select
v-model="pageSize"
size="small"
class="page-size-select"
:style="{ width: '110px' }"
@change="handlePageSizeChange"
>
<a-option :value="300">300</a-option>
@ -358,10 +360,10 @@
</a-select>
<span class="page-size-text">条/页</span>
<span class="go-to-text">前往</span>
<a-input
<a-input-number
v-model="jumpPage"
size="small"
class="jump-input"
:style="{ width: '60px' }"
@keyup.enter="handleJumpPage"
/>
<span class="page-text">页</span>
@ -369,22 +371,24 @@
</div>
</div>
<!-- Handsontable 表格 -->
<HandsontablePro
ref="handsontableRef"
:columns="columns"
:data="processedTableData"
:total="totalCount"
:current-page="currentPage"
:page-size="pageSize"
:search-params="searchParams"
:show-action-column="true"
:multi-value-fields="['orderNos']"
:custom-cell-renderer="customCellRenderer"
@action-click="onViewPushRecord"
@search="handleHeaderSearch"
@selection-change="handleSelectionChange"
/>
<!-- 列表区域:占满剩余高度,滚动条高度正确 -->
<div class="list-wrap">
<HandsontablePro
ref="handsontableRef"
:columns="columns"
:data="processedTableData"
:total="totalCount"
:current-page="currentPage"
:page-size="pageSize"
:search-params="searchParams"
:show-action-column="true"
:multi-value-fields="['orderNos']"
:custom-cell-renderer="customCellRenderer"
@action-click="onViewPushRecord"
@search="handleHeaderSearch"
@selection-change="handleSelectionChange"
/>
</div>
<!-- 隐藏原始表格 -->
<TablePro ref="tableRef" v-bind="tableProps" style="display: none;">
@ -428,10 +432,12 @@
</template>
<style scoped lang="less">
/* 与左侧 tab 容器高度一致:填满 content-area(和 vertical-tabs 同高) */
.xxx-container {
padding: 0;
padding: 16px;
background-color: #fff;
height: 100%;
min-height: 0;
box-sizing: border-box;
width: 100%;
overflow: hidden;
@ -439,133 +445,136 @@
flex-direction: column;
}
/* 列表区域:占满工具栏下方剩余高度,滚动条高度与容器一致 */
.list-wrap {
flex: 1;
min-height: 0;
overflow: hidden;
display: flex;
flex-direction: column;
}
.list-wrap :deep(.handsontable-pro-container) {
flex: 1;
min-height: 0;
height: 100%;
}
.list-wrap :deep(.handsontable-wrapper) {
height: 100%;
}
.table-toolbar {
flex-shrink: 0;
margin-bottom: 8px;
display: flex;
justify-content: space-between;
align-items: center;
.toolbar-left {
flex: 1;
.custom-buttons {
display: flex;
gap: 12px;
align-items: center;
.arco-btn {
border-radius: 20px;
font-weight: 500;
transition: all 0.3s ease;
border: 2px solid;
position: relative;
overflow: hidden;
padding: 8px 16px;
height: auto;
// 所有按钮 - 深青色
&.btn-push {
background: var(--app-primary-color);
border-color: var(--app-primary-color);
color: #ffffff;
&:hover:not(:disabled) {
background: #2A7F7F;
border-color: #2A7F7F;
}
&:active:not(:disabled) {
background: #257272;
border-color: #257272;
}
}
// 禁用状态
&:disabled {
opacity: 1;
cursor: not-allowed;
background: rgba(169, 169, 169, 0.8) !important;
border-color: rgba(169, 169, 169, 0.8) !important;
color: #ffffff !important;
transform: none !important;
box-shadow: none !important;
}
}
}
}
}
.toolbar-right {
.pagination-controls {
display: flex;
align-items: center;
gap: 8px;
white-space: nowrap;
flex-wrap: nowrap;
.total-records,
.go-to-text,
.page-size-text,
.page-text {
font-size: 12px;
color: #4e5969;
white-space: nowrap;
}
.current-page {
font-size: 12px;
font-weight: 500;
color: #1d2129;
white-space: nowrap;
}
.arco-btn-size-small {
padding: 0 8px;
height: 24px;
min-width: 24px;
border-radius: 4px;
color: #4e5969;
border: 1px solid #e5e6eb;
background-color: #fff;
&:hover {
background-color: #f2f3f5;
}
&:disabled {
cursor: not-allowed;
opacity: 0.6;
}
}
.arco-select-size-small {
.arco-select-view {
height: 24px;
line-height: 24px;
font-size: 12px;
}
}
.arco-input-size-small {
.arco-input-wrapper {
height: 24px;
line-height: 24px;
font-size: 12px;
}
}
}
.toolbar-left {
flex: 1;
}
.page-size-select {
width: 110px;
.custom-buttons {
display: flex;
gap: 12px;
align-items: center;
}
.jump-input {
width: 60px;
.table-toolbar .arco-btn {
border-radius: 20px;
font-weight: 500;
transition: all 0.3s ease;
border: 2px solid;
position: relative;
overflow: hidden;
padding: 8px 16px;
height: auto;
}
// 表格滚动面板样式
.table-toolbar .arco-btn.btn-push {
background: var(--app-primary-color);
border-color: var(--app-primary-color);
color: #ffffff;
}
.table-toolbar .arco-btn.btn-push:hover:not(:disabled) {
background: #2A7F7F;
border-color: #2A7F7F;
}
.table-toolbar .arco-btn.btn-push:active:not(:disabled) {
background: #257272;
border-color: #257272;
}
.table-toolbar .arco-btn:disabled {
opacity: 1;
cursor: not-allowed;
background: rgba(169, 169, 169, 0.8) !important;
border-color: rgba(169, 169, 169, 0.8) !important;
color: #ffffff !important;
transform: none !important;
box-shadow: none !important;
}
.toolbar-right .pagination-controls {
display: flex;
align-items: center;
gap: 8px;
white-space: nowrap;
flex-wrap: nowrap;
}
.toolbar-right .total-records,
.toolbar-right .go-to-text,
.toolbar-right .page-size-text,
.toolbar-right .page-text {
font-size: 12px;
color: #4e5969;
white-space: nowrap;
}
.toolbar-right .current-page {
font-size: 12px;
font-weight: 500;
color: #1d2129;
white-space: nowrap;
}
.toolbar-right .arco-btn-size-small {
padding: 0 8px;
height: 24px;
min-width: 24px;
border-radius: 4px;
color: #4e5969;
border: 1px solid #e5e6eb;
background-color: #fff;
}
.toolbar-right .arco-btn-size-small:hover {
background-color: #f2f3f5;
}
.toolbar-right .arco-btn-size-small:disabled {
cursor: not-allowed;
opacity: 0.6;
}
.toolbar-right .arco-select-size-small .arco-select-view {
height: 24px;
line-height: 24px;
font-size: 12px;
}
.toolbar-right .arco-input-number-size-small .arco-input-wrapper {
height: 24px;
line-height: 24px;
font-size: 12px;
}
// 表格滚动面板样式(历史保留)
.table-wrapper {
border: 1px solid #e5e6eb;
border-radius: 4px;

View File

@ -434,22 +434,24 @@
</div>
</div>
<!-- Handsontable 表格 -->
<HandsontablePro
ref="handsontableRef"
:columns="columns"
:data="processedTableData"
:total="totalCount"
:current-page="currentPage"
:page-size="pageSize"
:search-params="searchParams"
:show-action-column="true"
:multi-value-fields="['orderNos']"
:custom-cell-renderer="customCellRenderer"
@action-click="() => {}"
@search="handleHeaderSearch"
@selection-change="handleSelectionChange"
/>
<!-- 列表区域:占满剩余高度,滚动条高度正确 -->
<div class="list-wrap">
<HandsontablePro
ref="handsontableRef"
:columns="columns"
:data="processedTableData"
:total="totalCount"
:current-page="currentPage"
:page-size="pageSize"
:search-params="searchParams"
:show-action-column="true"
:multi-value-fields="['orderNos']"
:custom-cell-renderer="customCellRenderer"
@action-click="() => {}"
@search="handleHeaderSearch"
@selection-change="handleSelectionChange"
/>
</div>
<!-- 隐藏原始表格 -->
<TablePro ref="tableRef" v-bind="tableProps" style="display: none;">
@ -515,11 +517,12 @@
</template>
<style scoped lang="less">
/* 与左侧 tab 容器高度一致:填满 content-area(和 vertical-tabs 同高) */
.xxx-container {
padding: 16px;
background-color: #fff;
height: calc(100vh - 86px - 100px); // 减去导航栏和tab高度
max-height: calc(100vh - 86px - 100px);
height: 100%;
min-height: 0;
box-sizing: border-box;
width: 100%;
overflow: hidden;
@ -527,7 +530,27 @@
flex-direction: column;
}
/* 列表区域:占满工具栏下方剩余高度,滚动条高度与容器一致 */
.list-wrap {
flex: 1;
min-height: 0;
overflow: hidden;
display: flex;
flex-direction: column;
}
.list-wrap :deep(.handsontable-pro-container) {
flex: 1;
min-height: 0;
height: 100%;
}
.list-wrap :deep(.handsontable-wrapper) {
height: 100%;
}
.table-toolbar {
flex-shrink: 0;
margin-bottom: 8px;
display: flex;
justify-content: space-between;

View File

@ -105,6 +105,7 @@
.content-area {
flex: 1;
min-width: 0;
min-height: 0;
overflow: hidden;
display: flex;
flex-direction: column;

View File

@ -19,10 +19,9 @@ export default defineConfig({
// 添加中间件,在代理之前拦截前端路由
middlewareMode: false,
proxy: {
// RBAC 权限管理服务代理 - http://43.139.210.35:5281
// 注意:后端 API 路径包含 /rbac 前缀,所以不需要 rewrite
// 权限(admin)43.139.210.35:5281 -> http://api.nanafa.com/admin(路径保持 /rbac/xxx -> .../admin/rbac/xxx)
'/rbac': {
target: 'http://43.139.210.35:5281',
target: 'http://api.nanafa.com/admin',
changeOrigin: true,
secure: false,
configure: (proxy, options) => {
@ -39,34 +38,27 @@ export default defineConfig({
});
},
},
// 对应 nginx: location /api/trackApi -> http://43.139.210.35:8889
'/api/trackApi': {
target: 'http://43.139.210.35:8889',
// 轨迹(track)43.139.210.35:8889 -> http://api.nanafa.com/track,路径与 rbac、api 一致:/Track/xxx
'/Track': {
target: 'http://api.nanafa.com',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api\/trackApi/, ''),
rewrite: (path) => '/track' + path,
configure: (proxy, options) => {
proxy.on('error', (err, req, res) => {
console.log('proxy error', err);
});
proxy.on('proxyReq', (proxyReq, req, res) => {
console.log('[trackApi-8889] Sending Request to the Target:', req.method, req.url);
console.log('[Track] Sending Request:', req.method, req.url);
});
proxy.on('proxyRes', (proxyRes, req, res) => {
console.log(
'[trackApi-8889] Received Response from the Target:',
proxyRes.statusCode,
req.url
);
console.log('[Track] Received Response:', proxyRes.statusCode, req.url);
});
},
},
// 对应 nginx: location /api -> http://43.139.210.35:8888
// API(itfx)43.139.210.35:8888 -> http://api.nanafa.com/itfx
// 使用正则表达式匹配,排除前端路由路径
// 只代理真正的 API 请求,不代理前端路由
// 排除所有驼峰命名的前端路由(包含大写字母的路径)
'^/api/(?!upstreamInterface|upstreamInterfaceConfig|upstreamInterfaceConfigEdit|downstreamInterface|downstreamInterface/newPort|appList|appList/createApplication|requestLog|callStatistics|apiDebugger|trackApi)': {
target: 'http://43.139.210.35:8888',
target: 'http://api.nanafa.com/itfx',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, ''),
timeout: 30000,