Merge pull request 'dev' (#10) from dev into master

Reviewed-on: #10
This commit is contained in:
hy 2025-08-27 09:25:08 +08:00
commit f08e73a42e
6 changed files with 111 additions and 10 deletions

View File

@ -0,0 +1,41 @@
# 构建阶段
FROM m.daocloud.io/docker.io/library/node:22.14.0 AS builder
# 设置工作目录
WORKDIR /app
# 设置 npm 镜像源
RUN npm config set registry https://registry.npmmirror.com/
RUN npm config set fetch-retries 3
RUN npm config set fetch-retry-mintimeout 5000
RUN npm config set fetch-retry-maxtimeout 60000
# 安装pnpm
RUN npm install -g pnpm
# 复制源代码
COPY . .
# 设置 pnpm 下载源
RUN pnpm config set registry https://registry.npmmirror.com/
# 安装依赖
RUN pnpm i --fetch-timeout 300000
# 构建项目
RUN pnpm build
# 部署阶段
FROM m.daocloud.io/docker.io/library/nginx:alpine
# 复制构建产物到 Nginx 目录
COPY --from=builder --chown=nginx:nginx /app/dist /usr/share/nginx/html
# 复制 Nginx 配置
COPY Dockerfiles/Dockerfile-staging/default.conf /etc/nginx/conf.d/default.conf
# 暴露端口
EXPOSE 80
# 启动 Nginx
CMD ["nginx", "-g", "daemon off;"]

View File

@ -0,0 +1,47 @@
server {
listen 80;
server_name localhost;
# 基础设置
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html;
client_max_body_size 100m;
# 错误页面配置
error_page 500 502 503 504 /50x.html;
location = /50x.html {
internal; # 仅用于内部错误请求
}
# Gzip 压缩设置
gzip on;
gzip_min_length 1k;
gzip_comp_level 6;
gzip_types text/plain text/css text/javascript application/json
application/javascript application/x-javascript application/xml;
gzip_vary on;
gzip_disable "MSIE [1-6]\.";
# 静态资源缓存优化
location ~* \.(jpg|jpeg|gif|ico|css|js)$ {
expires 7d;
add_header Cache-Control "public, no-transform";
}
# API 代理配置
location /api/ {
proxy_pass http://learn-archives-api-svc:8080/api/;
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_connect_timeout 30s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
proxy_buffering on;
}
}

View File

@ -12,6 +12,17 @@ type Rule = {
pattern?: RegExp;
};
export const ruleRequiredGrade = [
{ required: true, message: "不能为空", trigger: "blur" },
{
pattern: /^(初[一二三]|高[一二三]|初\d{4}|高\d{4})$/,
message: "请输入正确的年级 例[初一,初2025]",
trigger: "blur"
}
];
export const ruleRequiredI = (max: number = 20, min: number = 0): Rule[] => {
let res: Rule[] = [
{ required: true, message: "不能为空", trigger: "blur" },

View File

@ -103,13 +103,13 @@ const tableData: TableConfig = {
add: false, //
edit: false, //
},
entryPerson: {
label: "录入人",
width: "200px",
search: true,
add: false, //
edit: false, //
},
// entryPerson: {
// label: "",
// width: "200px",
// search: false,
// add: false, //
// edit: false, //
// },
createTime: {
label: "录入时间",
width: "200px",

View File

@ -8,6 +8,7 @@ import { getenum } from "@/api/enum";
import {
ruleNumber,
ruleRequired,
ruleRequiredGrade,
ruleRequiredI,
ruleRequiredNumber,
} from "@/utils/rules";
@ -108,7 +109,7 @@ const tableData: TableConfig = {
},
grade: {
label: "年级",
rules: ruleRequiredI(6, 2),
rules: ruleRequiredGrade,
width: "100px",
search: true,
add: true, //

View File

@ -380,12 +380,13 @@ const handleSubmitForm = () => {
userEditForm.value.validate(async (valid) => {
if (valid) {
loading.value = true;
let ac = form.value.account || new Date().getTime() + "";
const formData = {
id: form.value.uId || 0,
userType: form.value.userType || 1,
level: form.value.level || 0,
account: form.value.account || "",
// PassWord: form.value.id === 0 ? md5(form.value.PassWord).toUpperCase() : "",
account: form.value.account || new Date().getTime() + "",
PassWord: form.value.id === 0 ? "无效密码" : "",
realName: form.value.realName || "",
studentId: form.value.studentId || "",
templateId: form.value.templateId || 0,