From f082f20fc864581a0e78e698215e4dc95c17067e Mon Sep 17 00:00:00 2001 From: zpc Date: Sat, 21 Feb 2026 13:18:11 +0800 Subject: [PATCH] =?UTF-8?q?fix(order,encoding):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E5=88=9B=E5=BB=BA=E5=AD=97=E6=AE=B5=E5=90=8D?= =?UTF-8?q?=E4=B8=8D=E5=8C=B9=E9=85=8D=E5=92=8C=E4=B8=AD=E6=96=87=E4=B9=B1?= =?UTF-8?q?=E7=A0=81=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 前端 productType/userInfo 改为 orderType/assessmentInfo 对齐后端 DTO - 添加 gender/age/educationStage 数据格式转换(字符串转int) - Program.cs 设置 Console.OutputEncoding = UTF8 解决日志中文乱码 - AddJsonOptions 配置 UnsafeRelaxedJsonEscaping 解决响应中文转义 - Dockerfile 添加 LANG/LC_ALL=C.UTF-8 环境变量 --- .../src/MiAssessment.Admin/Dockerfile | 3 +++ .../src/MiAssessment.Admin/Program.cs | 10 +++++++ .../src/MiAssessment.Api/Dockerfile | 3 +++ .../src/MiAssessment.Api/Program.cs | 9 +++++++ uniapp/api/order.js | 6 +++-- uniapp/composables/usePayment.js | 6 +++-- uniapp/pages/assessment/info/index.vue | 27 +++++++++++++++---- 7 files changed, 55 insertions(+), 9 deletions(-) diff --git a/server/MiAssessment/src/MiAssessment.Admin/Dockerfile b/server/MiAssessment/src/MiAssessment.Admin/Dockerfile index 1b43cfe..82e9783 100644 --- a/server/MiAssessment/src/MiAssessment.Admin/Dockerfile +++ b/server/MiAssessment/src/MiAssessment.Admin/Dockerfile @@ -30,6 +30,9 @@ RUN dotnet publish MiAssessment.Admin.csproj -c $BUILD_CONFIGURATION -o /app/pub # ==================== 阶段3: 最终运行镜像 ==================== FROM mcr.microsoft.com/dotnet/aspnet:10.0-noble AS final +ENV LANG=C.UTF-8 +ENV LC_ALL=C.UTF-8 +ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=false # 安装 SkiaSharp 原生依赖(用于验证码生成等图形处理) RUN apt-get update && apt-get install -y \ diff --git a/server/MiAssessment/src/MiAssessment.Admin/Program.cs b/server/MiAssessment/src/MiAssessment.Admin/Program.cs index cdd64cd..497662d 100644 --- a/server/MiAssessment/src/MiAssessment.Admin/Program.cs +++ b/server/MiAssessment/src/MiAssessment.Admin/Program.cs @@ -5,6 +5,11 @@ using MiAssessment.Model.Data; using Microsoft.EntityFrameworkCore; using Scalar.AspNetCore; using Serilog; +using System.Text; + +// 设置控制台输出编码为 UTF-8,解决中文乱码 +Console.OutputEncoding = Encoding.UTF8; +Console.InputEncoding = Encoding.UTF8; var builder = WebApplication.CreateBuilder(args); @@ -19,6 +24,11 @@ var mvcBuilder = builder.Services.AddControllers(options => { options.Filters.Add(); options.Filters.Add(); +}) +.AddJsonOptions(options => +{ + // 允许中文直接输出,不转义为 \uXXXX + options.JsonSerializerOptions.Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping; }); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddOpenApi(); diff --git a/server/MiAssessment/src/MiAssessment.Api/Dockerfile b/server/MiAssessment/src/MiAssessment.Api/Dockerfile index 70c0387..5afb52a 100644 --- a/server/MiAssessment/src/MiAssessment.Api/Dockerfile +++ b/server/MiAssessment/src/MiAssessment.Api/Dockerfile @@ -2,6 +2,9 @@ # ==================== 阶段1: 基础运行环境 ==================== FROM mcr.microsoft.com/dotnet/aspnet:10.0-noble AS base +ENV LANG=C.UTF-8 +ENV LC_ALL=C.UTF-8 +ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=false USER $APP_UID WORKDIR /app EXPOSE 8080 diff --git a/server/MiAssessment/src/MiAssessment.Api/Program.cs b/server/MiAssessment/src/MiAssessment.Api/Program.cs index 81d0f10..fa9fa1f 100644 --- a/server/MiAssessment/src/MiAssessment.Api/Program.cs +++ b/server/MiAssessment/src/MiAssessment.Api/Program.cs @@ -19,6 +19,10 @@ using Serilog; using System.Text; +// 设置控制台输出编码为 UTF-8,解决中文乱码 +Console.OutputEncoding = Encoding.UTF8; +Console.InputEncoding = Encoding.UTF8; + // 配置 Serilog Log.Logger = new LoggerConfiguration() .ReadFrom.Configuration(new ConfigurationBuilder() @@ -113,6 +117,11 @@ try { // 添加全局异常过滤器 options.Filters.Add(); + }) + .AddJsonOptions(options => + { + // 允许中文直接输出,不转义为 \uXXXX + options.JsonSerializerOptions.Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping; }); // 配置 OpenAPI(.NET 10 内置支持) diff --git a/uniapp/api/order.js b/uniapp/api/order.js index 6fd3999..8f985e4 100644 --- a/uniapp/api/order.js +++ b/uniapp/api/order.js @@ -28,9 +28,11 @@ export function getOrderDetail(orderId) { /** * 创建订单 * @param {Object} data - 订单数据 - * @param {number} data.productType - 产品类型 + * @param {number} data.orderType - 订单类型:1测评订单 2规划订单 * @param {number} data.productId - 产品ID - * @param {Object} [data.userInfo] - 用户信息 + * @param {Object} [data.assessmentInfo] - 测评信息(测评订单时必填) + * @param {Object} [data.plannerInfo] - 规划预约信息(规划订单时必填) + * @param {number} [data.inviteCodeId] - 邀请码ID * @returns {Promise} */ export function createOrder(data) { diff --git a/uniapp/composables/usePayment.js b/uniapp/composables/usePayment.js index ac5be98..a8d1848 100644 --- a/uniapp/composables/usePayment.js +++ b/uniapp/composables/usePayment.js @@ -16,9 +16,11 @@ export function usePayment() { /** * 创建订单 * @param {Object} params - 订单参数 - * @param {number} params.productType - 产品类型 + * @param {number} params.orderType - 订单类型:1测评订单 2规划订单 * @param {number} params.productId - 产品ID - * @param {Object} [params.userInfo] - 用户信息 + * @param {Object} [params.assessmentInfo] - 测评信息(测评订单时必填) + * @param {Object} [params.plannerInfo] - 规划预约信息(规划订单时必填) + * @param {number} [params.inviteCodeId] - 邀请码ID * @returns {Promise} */ async function handleCreateOrder(params) { diff --git a/uniapp/pages/assessment/info/index.vue b/uniapp/pages/assessment/info/index.vue index cdd811b..6eb51af 100644 --- a/uniapp/pages/assessment/info/index.vue +++ b/uniapp/pages/assessment/info/index.vue @@ -51,6 +51,23 @@ const genderOptions = ['男', '女'] const ageOptions = Array.from({ length: 41 }, (_, i) => `${i + 10}岁`) const educationOptions = ['小学及以下', '初中', '高中', '大专', '本科', '研究生及以上'] +/** + * 学业阶段文本转数值 + * @param {string} label - 学业阶段文本 + * @returns {number} 学段值:1小学 2初中 3高中 4大学 + */ +function getEducationStageValue(label) { + const map = { + '小学及以下': 1, + '初中': 2, + '高中': 3, + '大专': 4, + '本科': 4, + '研究生及以上': 4 + } + return map[label] || 1 +} + // 选择器索引 const genderIndex = ref(-1) const ageIndex = ref(-1) @@ -184,14 +201,14 @@ async function handlePayAssessment() { // 发起支付 const result = await processPayment({ - productType: 1, // 测评类型 + orderType: 1, // 测评订单 productId: typeId.value, - userInfo: { + assessmentInfo: { name: formData.value.name, phone: formData.value.phone, - gender: formData.value.gender, - age: formData.value.age, - educationStage: formData.value.educationStage, + gender: formData.value.gender === '男' ? 1 : 2, + age: parseInt(formData.value.age) || 0, + educationStage: getEducationStageValue(formData.value.educationStage), province: formData.value.province, city: formData.value.city, district: formData.value.district