diff --git a/.env b/.env index b958619d..8b79ed05 100644 --- a/.env +++ b/.env @@ -21,8 +21,8 @@ VITE_APP_BAIDU_CODE = a1ff8825baa73c3a78eb96aa40325abc # 默认账户密码 VITE_APP_DEFAULT_LOGIN_TENANT = 芋道源码 -VITE_APP_DEFAULT_LOGIN_USERNAME = admin -VITE_APP_DEFAULT_LOGIN_PASSWORD = admin123 +# VITE_APP_DEFAULT_LOGIN_USERNAME = admin +# VITE_APP_DEFAULT_LOGIN_PASSWORD = admin123 # API 加解密 VITE_APP_API_ENCRYPT_ENABLE = true diff --git a/.env.prod b/.env.prod index ca7cb8e4..a2ffda9d 100644 --- a/.env.prod +++ b/.env.prod @@ -4,7 +4,7 @@ NODE_ENV=production VITE_DEV=false # 请求路径 -VITE_BASE_URL='http://localhost:48080' +VITE_BASE_URL='' # 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持S3服务 VITE_UPLOAD_TYPE=server @@ -31,4 +31,9 @@ VITE_OUT_DIR=dist-prod VITE_MALL_H5_DOMAIN='http://mall.yudao.iocoder.cn' # GoView域名 -VITE_GOVIEW_URL='http://127.0.0.1:3000' \ No newline at end of file +VITE_GOVIEW_URL='http://127.0.0.1:3000' + +VITE_APP_CAPTCHA_ENABLE=true + +VITE_APP_DEFAULT_LOGIN_PASSWORD='' +VITE_APP_DEFAULT_LOGIN_USERNAME='' diff --git a/.env.prod.bak b/.env.prod.bak new file mode 100644 index 00000000..c4ca8980 --- /dev/null +++ b/.env.prod.bak @@ -0,0 +1,34 @@ +# 生产环境:只在打包时使用 +NODE_ENV=production + +VITE_DEV=false + +# 请求路径 +VITE_BASE_URL='' + +# 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持S3服务 +VITE_UPLOAD_TYPE=server + +# 接口地址 +VITE_API_URL=/admin-api + +# 是否删除debugger +VITE_DROP_DEBUGGER=true + +# 是否删除console.log +VITE_DROP_CONSOLE=true + +# 是否sourcemap +VITE_SOURCEMAP=false + +# 打包路径 +VITE_BASE_PATH=/ + +# 输出路径 +VITE_OUT_DIR=dist-prod + +# 商城H5会员端域名 +VITE_MALL_H5_DOMAIN='http://mall.yudao.iocoder.cn' + +# GoView域名 +VITE_GOVIEW_URL='http://127.0.0.1:3000' \ No newline at end of file diff --git a/docker/frontend/nginx.conf b/docker/frontend/nginx.conf new file mode 100644 index 00000000..cc40d784 --- /dev/null +++ b/docker/frontend/nginx.conf @@ -0,0 +1,117 @@ +worker_processes auto; +error_log /var/log/nginx/error.log warn; +pid /var/run/nginx.pid; + +events { + worker_connections 1024; + use epoll; + multi_accept on; +} + +http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + + # 日志格式 + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for" ' + 'rt=$request_time uct="$upstream_connect_time" uht="$upstream_header_time" urt="$upstream_response_time"'; + + access_log /var/log/nginx/access.log main; + + # 性能优化 + sendfile on; + tcp_nopush on; + tcp_nodelay on; + keepalive_timeout 65; + types_hash_max_size 2048; + server_tokens off; + + # Gzip 压缩 + gzip on; + gzip_vary on; + gzip_proxied any; + gzip_comp_level 6; + gzip_min_length 1024; + gzip_types text/plain text/css text/xml application/json application/javascript application/rss+xml application/atom+xml image/svg+xml; + + # 缓冲区大小 + client_body_buffer_size 16k; + client_max_body_size 100m; + proxy_buffer_size 128k; + proxy_buffers 4 256k; + proxy_busy_buffers_size 128k; + + # 上游服务器配置 + upstream backend { + server backend:48080; + keepalive 32; + } + + server { + listen 80; + server_name _; + root /usr/share/nginx/html; + index index.html; + + # 安全头 + add_header X-Frame-Options "SAMEORIGIN" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-XSS-Protection "1; mode=block" always; + + # 前端静态资源缓存 + location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot|map|json)$ { + expires 30d; + add_header Cache-Control "public, immutable"; + access_log off; + } + + # 前端路由支持 + location / { + try_files $uri $uri/ /index.html; + } + + # 后端 API 代理 + location /prod-api/ { + proxy_pass http://backend; + 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_set_header X-Forwarded-Port $server_port; + + # 连接超时 + proxy_connect_timeout 60s; + proxy_send_timeout 60s; + proxy_read_timeout 60s; + + # WebSocket 支持 + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + + # 缓冲设置 + proxy_buffering on; + proxy_buffer_size 4k; + proxy_buffers 8 4k; + } + + # 静态资源目录 + location /static/ { + alias /usr/share/nginx/html/static/; + expires 30d; + add_header Cache-Control "public"; + } + + # 上传文件大小限制 + client_max_body_size 100m; + + # 错误页面 + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 59ed61ce..5ba0bd38 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -273,9 +273,6 @@ importers: postcss-html: specifier: ^1.6.0 version: 1.7.0 - postcss-pxtorem: - specifier: ^6.1.0 - version: 6.1.0(postcss@8.4.49) postcss-scss: specifier: ^4.0.9 version: 4.0.9(postcss@8.4.49) @@ -4581,11 +4578,6 @@ packages: resolution: {integrity: sha512-MfcMpSUIaR/nNgeVS8AyvyDugXlADjN9AcV7e5rDfrF1wduIAGSkL4q2+wgrZgA3sHVAHLDO9FuauHhZYW2nBw==} engines: {node: ^12 || >=14} - postcss-pxtorem@6.1.0: - resolution: {integrity: sha512-ROODSNci9ADal3zUcPHOF/K83TiCgNSPXQFSbwyPHNV8ioHIE4SaC+FPOufd8jsr5jV2uIz29v1Uqy1c4ov42g==} - peerDependencies: - postcss: ^8.0.0 - postcss-resolve-nested-selector@0.1.6: resolution: {integrity: sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==} @@ -10466,10 +10458,6 @@ snapshots: postcss: 8.4.49 postcss-safe-parser: 6.0.0(postcss@8.4.49) - postcss-pxtorem@6.1.0(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-resolve-nested-selector@0.1.6: {} postcss-safe-parser@6.0.0(postcss@8.4.49): diff --git a/src/api/prison/evaluation/index.ts b/src/api/prison/evaluation/index.ts index 44f6f814..521d5fd3 100644 --- a/src/api/prison/evaluation/index.ts +++ b/src/api/prison/evaluation/index.ts @@ -172,7 +172,12 @@ export const EvaluationTemplateApi = { // 导出模板 exportTemplate: async (params: EvaluationTemplatePageParams) => { - return await request.download({ url: '/prison/evaluation-report/template/export-excel', params }) + return await request.download({ url: '/prison/evaluation-report/template/export-excel', params, method: 'POST' }) + }, + + // 导出单个模板及其维度信息 + exportTemplateWithDimensions: async (id: number) => { + return await request.download({ url: '/prison/evaluation-report/template/export-with-dimensions', params: { id } }) } } @@ -275,7 +280,7 @@ export const EvaluationReportApi = { // 导出报告 Excel exportReportExcel: async (params: EvaluationReportPageParams) => { - return await request.download({ url: '/prison/evaluation-report/report/export-excel', params }) + return await request.download({ url: '/prison/evaluation-report/report/export-excel', params, method: 'POST' }) }, // 根据报告ID获取维度数据列表 diff --git a/src/config/axios/service.ts b/src/config/axios/service.ts index 75f6df0f..bea2d0fc 100644 --- a/src/config/axios/service.ts +++ b/src/config/axios/service.ts @@ -69,6 +69,11 @@ service.interceptors.request.use( config.headers['visit-tenant-id'] = visitTenantId } } + // 监狱系统:即使 tenantEnable 为 false,也尝试获取并设置租户 ID + const tenantId = getTenantId() + if (tenantId) { + config.headers['tenant-id'] = tenantId + } const method = config.method?.toUpperCase() // 防止 GET 请求缓存 if (method === 'GET') { diff --git a/src/views/DashEntry/DashEntry.vue b/src/views/DashEntry/DashEntry.vue index 0f3af436..f6922b06 100644 --- a/src/views/DashEntry/DashEntry.vue +++ b/src/views/DashEntry/DashEntry.vue @@ -1,6 +1,66 @@