😎1、增加docker的编译环境,取消对windows编译结果的依赖 2、修复按钮、菜单图标线条模糊问题

This commit is contained in:
zuohuaijun 2025-09-15 01:34:11 +08:00
parent 4f029aba0c
commit 7a332e4c21
9 changed files with 131 additions and 62 deletions

View File

@ -23,6 +23,7 @@ import setIntroduction from '/@/utils/setIconfont';
// import Watermark from '/@/utils/watermark'; // import Watermark from '/@/utils/watermark';
import { initIdleTimeout } from '/@/utils/idleTimeout'; import { initIdleTimeout } from '/@/utils/idleTimeout';
import { updateFavicon } from '/@/utils/sysInfo'; import { updateFavicon } from '/@/utils/sysInfo';
// //
const LockScreen = defineAsyncComponent(() => import('/@/layout/lockScreen/index.vue')); const LockScreen = defineAsyncComponent(() => import('/@/layout/lockScreen/index.vue'));
const Settings = defineAsyncComponent(() => import('/@/layout/navBars/topBar/settings.vue')); const Settings = defineAsyncComponent(() => import('/@/layout/navBars/topBar/settings.vue'));

View File

@ -2,7 +2,7 @@
<template v-for="val in chils"> <template v-for="val in chils">
<el-sub-menu :index="val.path" :key="val.path" v-if="val.children && val.children.length > 0"> <el-sub-menu :index="val.path" :key="val.path" v-if="val.children && val.children.length > 0">
<template #title> <template #title>
<SvgIcon :name="val.meta.icon" /> <SvgIcon :name="val.meta.icon" style="font-size: 16px" />
<span>{{ $t(`message.menu.${val.meta.title}`) }}</span> <span>{{ $t(`message.menu.${val.meta.title}`) }}</span>
</template> </template>
<sub-item :chil="val.children" /> <sub-item :chil="val.children" />
@ -10,12 +10,12 @@
<template v-else> <template v-else>
<el-menu-item :index="val.path" :key="val.path"> <el-menu-item :index="val.path" :key="val.path">
<template v-if="!val.meta.isLink || (val.meta.isLink && val.meta.isIframe)"> <template v-if="!val.meta.isLink || (val.meta.isLink && val.meta.isIframe)">
<SvgIcon :name="val.meta.icon" /> <SvgIcon :name="val.meta.icon" style="font-size: 16px" />
<span>{{ $t(`message.menu.${val.meta.title}`) }}</span> <span>{{ $t(`message.menu.${val.meta.title}`) }}</span>
</template> </template>
<template v-else> <template v-else>
<a class="w100" @click.prevent="onALinkClick(val)"> <a class="w100" @click.prevent="onALinkClick(val)">
<SvgIcon :name="val.meta.icon" /> <SvgIcon :name="val.meta.icon" style="font-size: 16px" />
{{ $t(`message.menu.${val.meta.title}`) }} {{ $t(`message.menu.${val.meta.title}`) }}
</a> </a>
</template> </template>

View File

@ -5,21 +5,21 @@
.el-button { .el-button {
font-family: var(--el-font-family); font-family: var(--el-font-family);
} }
// 第三方字体图标大小 // // 第三方字体图标大小
.el-button:not(.is-circle) i.el-icon, // .el-button:not(.is-circle) i.el-icon,
.el-button i.iconfont, // .el-button i.iconfont,
.el-button i.fa, // .el-button i.fa,
.el-button--default i.iconfont, // .el-button--default i.iconfont,
.el-button--default i.fa { // .el-button--default i.fa {
font-size: 14px !important; // font-size: 14px !important;
// margin-right: 5px; // vue-next-admin 原有样式 // // margin-right: 5px; // vue-next-admin 原有样式
} // }
.el-button--small i.iconfont, // .el-button--small i.iconfont,
.el-button--small i.fa { // .el-button--small i.fa {
font-size: 12px !important; // font-size: 12px !important;
// margin-right: 5px; // vue-next-admin 原有样式 // // margin-right: 5px; // vue-next-admin 原有样式
} // }
/* Input 输入框InputNumber 计数器 /* Input 输入框InputNumber 计数器
------------------------------- */ ------------------------------- */
@ -390,7 +390,7 @@
height: 28px; height: 28px;
} }
.el-button [class*=el-icon]+span{ .el-button [class*=el-icon]+span{
margin-left: 0; margin-left: 4px;
} }
} }
.el-table [class*=el-table__row--level] .el-table__expand-icon { .el-table [class*=el-table__row--level] .el-table__expand-icon {
@ -483,10 +483,10 @@
max-height: 274px !important; max-height: 274px !important;
} }
/*修复Cascader 级联选择器高度问题*/ // /*修复Cascader 级联选择器高度问题*/
.el-cascader-menu__wrap.el-scrollbar__wrap { // .el-cascader-menu__wrap.el-scrollbar__wrap {
height: 204px !important; // height: 204px !important;
} // }
/*用于界面高度自适应main.vue区分 scrollbar__view防止其它使用 scrollbar 的地方出现滚动条消失*/ /*用于界面高度自适应main.vue区分 scrollbar__view防止其它使用 scrollbar 的地方出现滚动条消失*/
.layout-container-view .el-scrollbar__view { .layout-container-view .el-scrollbar__view {
@ -521,24 +521,24 @@
color: var(--el-color-danger) !important; color: var(--el-color-danger) !important;
} }
// 级联选择-点击文本也生效 // // 级联选择-点击文本也生效
.el-cascader-panel .el-radio { // .el-cascader-panel .el-radio {
width: 100%; // width: 100%;
height: 100%; // height: 100%;
z-index: 10; // z-index: 10;
position: absolute; // position: absolute;
top: 0px; // top: 0px;
right: -8px; // right: -8px;
} // }
.el-cascader-panel .el-checkbox { // .el-cascader-panel .el-checkbox {
width: 100%; // width: 100%;
height: 100%; // height: 100%;
z-index: 10; // z-index: 10;
position: absolute; // position: absolute;
top: 0px; // top: 0px;
right: 0px; // right: 0px;
} // }
$--el-table-text-color: #fb6d49; $--el-table-text-color: #fb6d49;

View File

@ -283,7 +283,7 @@
<script setup lang="ts" name="mqttx"> <script setup lang="ts" name="mqttx">
import { reactive, ref, onMounted, nextTick } from 'vue'; import { reactive, ref, onMounted, nextTick } from 'vue';
import { Search, ChatDotSquare, TopRight, Star, Operation, Setting, Connection, Discount, Open, Delete, Position } from '@element-plus/icons-vue'; import { Search, ChatDotSquare, TopRight, Star, Operation, Setting, Connection, Discount, Open, Delete, Position } from '@element-plus/icons-vue';
import * as MQTT from 'mqtt/dist/mqtt.min'; // 4.3.75.7.x (import * as MQTT from "mqtt") import * as MQTT from "mqtt"
import mittBus from '/@/utils/mitt'; // 线mitt Uncaught (in promise) ReferenceError: Cannot access 'oe' before initialization import mittBus from '/@/utils/mitt'; // 线mitt Uncaught (in promise) ReferenceError: Cannot access 'oe' before initialization
// vue 3 + vite use MQTT.js refer to https://github.com/mqttjs/MQTT.js/issues/1269 // vue 3 + vite use MQTT.js refer to https://github.com/mqttjs/MQTT.js/issues/1269

View File

@ -125,12 +125,12 @@ import { JobCreateTypeEnum, UpdateJobDetailInput } from '/@/api-services/system/
// HttpMethod HttpMethod // HttpMethod HttpMethod
// getHttpJobMessage JSON.stringify(httpJobMessageNet.HttpMethod) // getHttpJobMessage JSON.stringify(httpJobMessageNet.HttpMethod)
const httpMethodDef = { const httpMethodDef: Record<string, string> = {
get: '{"Method":"GET"}', get: '{"Method":"GET"}',
post: '{"Method":"POST"}', post: '{"Method":"POST"}',
put: '{"Method":"PUT"}', put: '{"Method":"PUT"}',
delete: '{"Method":"DELETE"}', delete: '{"Method":"DELETE"}',
} as EmptyObjectType; };
const props = defineProps({ const props = defineProps({
title: String, title: String,

View File

@ -159,7 +159,7 @@ const state = reactive({
ruleForm: {} as UpdateMenuInput, ruleForm: {} as UpdateMenuInput,
}); });
// //
const cascaderProps = { checkStrictly: true, emitPath: false, value: 'id', label: 'title' }; const cascaderProps = { checkOnClickNode: true, checkStrictly: true, emitPath: false, value: 'id', label: 'title' };
// //
const getGlobalComponentSize = computed(() => { const getGlobalComponentSize = computed(() => {

View File

@ -0,0 +1,18 @@
version: "3"
services:
web-builder:
image: node:22-alpine # 官方Node.js v22镜像Alpine版仅约180MB:ml-citation{ref="3,4" data="citationList"}
volumes:
- ../Web/:/app # 挂载项目代码目录
- ./.env.production:/app/.env.production
working_dir: /app
environment:
NODE_ENV: development
command: sh -c "npm install --legacy-peer-deps --registry=https://registry.npmmirror.com && npm run build"
net-builder:
image: mcr.microsoft.com/dotnet/sdk:9.0
volumes:
- ../Admin.NET/:/app
working_dir: /app
command: dotnet build Admin.NET.sln -c Release

View File

@ -9,7 +9,7 @@ services:
environment: environment:
- TZ=Asia/Shanghai - TZ=Asia/Shanghai
volumes: volumes:
- "./nginx/dist:/usr/share/nginx/html" - ../Web/dist:/usr/share/nginx/html
- "./nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro" - "./nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro"
- "./nginx/key:/etc/nginx/key/" - "./nginx/key:/etc/nginx/key/"
links: links:
@ -38,16 +38,69 @@ services:
volumes: volumes:
- ./mysql/mysql:/var/lib/mysql - ./mysql/mysql:/var/lib/mysql
- ./mysql/mysql.cnf:/etc/mysql/conf.d/mysql.cnf - ./mysql/mysql.cnf:/etc/mysql/conf.d/mysql.cnf
redis:
image: 'redis:latest' # 使用最新版本的 Redis 镜像,也可以指定特定版本如 'redis:6.2.7'
container_name: my-redis # 自定义容器名称
ports:
- '6379:6379' # 映射宿主机的 6379 端口到容器的 6379 端口
volumes: # 持久化数据
- ./redis/redis.conf:/usr/local/etc/redis/redis.conf
- ./redis/data:/data:rw
- ./redis/logs:/logs
#command: ['redis-server', '--appendonly', 'yes'] # 启用AOF持久化
command: ['redis-server','/usr/local/etc/redis/redis.conf']
environment: # 设置环境变量,例如密码
- REDIS_PASSWORD=123456
minio:
image: minio/minio:RELEASE.2025-04-22T22-12-26Z
container_name: minio
restart: always
environment:
- MINIO_ROOT_USER=admin
- MINIO_ROOT_PASSWORD=admin123456
volumes:
- ./minio/data:/data
- ./minio/config:/root/.minio
ports:
- "9104:9000" # API端口
- "9105:9001" # 控制台端口
command: server /data --console-address ":9001"
tdengine:
image: tdengine/tdengine:3.3.6.13
volumes:
- ./tdengine/taos/dnode/data:/var/lib/taos
- ./tdengine/taos/dnode/log:/var/log/taos
hostname: tdengine
container_name: tdengine
privileged: true
environment:
TAOS_FQDN: "tdengine"
TAOS_FIRST_EP: "tdengine" # 指向首个节点主机名
TAOS_SECOND_EP: "tdengine" # 可选备用节点
ports:
- 6030:6030
- 6041:6041
- 6044-6049:6044-6049
- 6044-6045:6044-6045/udp
- 6060:6060
adminNet: adminNet:
image: mcr.microsoft.com/dotnet/aspnet:6.0 image: mcr.microsoft.com/dotnet/aspnet:9.0
ports: ports:
- "9102:5050" - "9102:5050"
environment: environment:
- TZ=Asia/Shanghai - TZ=Asia/Shanghai
volumes: volumes:
- "./app:/app" - ../Admin.NET/Admin.NET.Web.Entry/bin/Release/net9.0/:/app
- ./app/Configuration/:/app/Configuration/
- ./app/wait-for-it.sh:/app/wait-for-it.sh
working_dir: /app working_dir: /app
command: ["/app/wait-for-it.sh", "mysql:3306", "-t", "120", "--","dotnet", "Admin.NET.Web.Entry.dll"] command: ["/bin/bash", "-c", "/app/wait-for-it.sh mysql:3306 -t 120 && dotnet Admin.NET.Web.Entry.dll --content-root /app/wwwroot"]
depends_on: depends_on:
- mysql - mysql
- redis

View File

@ -24,10 +24,12 @@ http {
listen 443 ssl; listen 443 ssl;
listen 80; listen 80;
server_name localhost; server_name localhost;
charset utf-8; charset utf-8;
ssl_certificate /etc/nginx/key/abc.admin.com.pem; ssl_certificate /etc/nginx/key/abc.admin.com.pem;
ssl_certificate_key /etc/nginx/key/abc.admin.com.key; ssl_certificate_key /etc/nginx/key/abc.admin.com.key;
ssl_session_cache shared:SSL:1m; ssl_session_cache shared:SSL:1m;
location / { location / {
root /usr/share/nginx/html; root /usr/share/nginx/html;
try_files $uri $uri/ /index.html; try_files $uri $uri/ /index.html;
@ -40,25 +42,20 @@ http {
location /prod-api/hubs { location /prod-api/hubs {
proxy_pass http://adminNet:5050/hubs; #启用http长连接支持websocket proxy_pass http://adminNet:5005/hubs; #启用http长连接支持websocket
proxy_http_version 1.1; proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade; proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade"; proxy_set_header Connection "upgrade";
} }
location /prod-api/ { location /prod-api/ {
proxy_set_header Host $http_host; proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://adminNet:5050/; proxy_pass http://adminNet:5005/;
} }
error_page 500 502 503 504 /50x.html; error_page 500 502 503 504 /50x.html;
location = /50x.html { location = /50x.html {
root html; root html;