Merge branch 'master' of http://192.168.195.14:3000/outsource/xiangyixiangqin
This commit is contained in:
commit
d3d46719a9
|
|
@ -4,7 +4,7 @@
|
|||
VITE_APP_TITLE=相宜相亲后台管理系统
|
||||
|
||||
# API基础地址 - 生产环境请修改为实际地址
|
||||
VITE_API_BASE_URL=https://api.example.com
|
||||
VITE_API_BASE_URL=https://app.zpc-xy.com/xyqj/adminapi/api
|
||||
|
||||
# 静态资源服务器地址 - 生产环境请修改为实际地址
|
||||
VITE_STATIC_BASE_URL=https://static.example.com
|
||||
VITE_STATIC_BASE_URL=https://app.zpc-xy.com/xyqj/adminapi
|
||||
|
|
|
|||
30
admin/Dockerfile
Normal file
30
admin/Dockerfile
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
# 构建阶段
|
||||
FROM node:20-alpine AS build
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
# 复制 package 文件
|
||||
COPY package*.json ./
|
||||
|
||||
# 删除 lock 文件并重新安装
|
||||
RUN rm -f package-lock.json && npm install
|
||||
|
||||
# 复制源代码
|
||||
COPY . .
|
||||
|
||||
# 构建应用
|
||||
RUN npm run build
|
||||
|
||||
# 生产阶段
|
||||
FROM nginx:alpine
|
||||
|
||||
# 复制构建产物到 nginx
|
||||
COPY --from=build /app/dist /usr/share/nginx/html
|
||||
|
||||
# 复制 nginx 配置
|
||||
COPY nginx.conf /etc/nginx/conf.d/default.conf
|
||||
|
||||
# 暴露端口
|
||||
EXPOSE 80
|
||||
|
||||
CMD ["nginx", "-g", "daemon off;"]
|
||||
28
admin/nginx.conf
Normal file
28
admin/nginx.conf
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
server {
|
||||
listen 80;
|
||||
server_name localhost;
|
||||
root /usr/share/nginx/html;
|
||||
index index.html;
|
||||
|
||||
# 处理前端路由
|
||||
location / {
|
||||
try_files $uri $uri/ /index.html;
|
||||
}
|
||||
|
||||
# 静态资源缓存
|
||||
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
|
||||
expires 1y;
|
||||
add_header Cache-Control "public, immutable";
|
||||
}
|
||||
|
||||
# 安全头
|
||||
add_header X-Frame-Options "SAMEORIGIN" always;
|
||||
add_header X-Content-Type-Options "nosniff" always;
|
||||
add_header X-XSS-Protection "1; mode=block" always;
|
||||
|
||||
# 压缩
|
||||
gzip on;
|
||||
gzip_vary on;
|
||||
gzip_min_length 1024;
|
||||
gzip_types text/plain text/css text/xml text/javascript application/javascript application/xml+rss application/json;
|
||||
}
|
||||
2874
admin/package-lock.json
generated
2874
admin/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
|
|
@ -13,33 +13,33 @@
|
|||
"test:watch": "vitest"
|
||||
},
|
||||
"dependencies": {
|
||||
"@element-plus/icons-vue": "^2.3.2",
|
||||
"@element-plus/icons-vue": "^2.1.0",
|
||||
"@types/nprogress": "^0.2.3",
|
||||
"axios": "^1.13.2",
|
||||
"echarts": "^6.0.0",
|
||||
"element-plus": "^2.13.0",
|
||||
"axios": "^1.6.8",
|
||||
"echarts": "^5.4.3",
|
||||
"element-plus": "^2.7.8",
|
||||
"nprogress": "^0.2.0",
|
||||
"pinia": "^3.0.4",
|
||||
"vue": "^3.5.13",
|
||||
"vue-router": "^4.6.4"
|
||||
"pinia": "^2.1.7",
|
||||
"vue": "^3.3.13",
|
||||
"vue-router": "^4.2.5"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@eslint/js": "^9.28.0",
|
||||
"@types/node": "^25.0.3",
|
||||
"@typescript-eslint/eslint-plugin": "^8.33.0",
|
||||
"@typescript-eslint/parser": "^8.33.0",
|
||||
"@vitejs/plugin-vue": "^5.2.3",
|
||||
"@vitest/coverage-v8": "^4.0.16",
|
||||
"eslint": "^9.28.0",
|
||||
"eslint-plugin-vue": "^10.1.0",
|
||||
"fast-check": "^4.5.3",
|
||||
"prettier": "^3.5.3",
|
||||
"sass": "^1.97.1",
|
||||
"typescript": "~5.8.3",
|
||||
"unplugin-auto-import": "^20.3.0",
|
||||
"unplugin-vue-components": "^30.0.0",
|
||||
"vite": "^6.3.5",
|
||||
"vitest": "^4.0.16",
|
||||
"vue-tsc": "^2.2.10"
|
||||
"@types/node": "^20.16.11",
|
||||
"@typescript-eslint/eslint-plugin": "^7.18.0",
|
||||
"@typescript-eslint/parser": "^7.18.0",
|
||||
"@vitejs/plugin-vue": "^5.1.4",
|
||||
"@vitest/coverage-v8": "^1.6.0",
|
||||
"eslint": "^8.57.1",
|
||||
"eslint-plugin-vue": "^9.28.0",
|
||||
"fast-check": "^3.22.0",
|
||||
"prettier": "^3.3.3",
|
||||
"sass": "^1.79.4",
|
||||
"typescript": "~5.6.3",
|
||||
"unplugin-auto-import": "^0.18.3",
|
||||
"unplugin-vue-components": "^0.27.4",
|
||||
"vite": "^5.4.8",
|
||||
"vitest": "^1.6.0",
|
||||
"vue-tsc": "^2.1.6"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -26,6 +26,6 @@ export function logout(): Promise<void> {
|
|||
* 获取当前管理员信息
|
||||
* @returns 管理员用户信息
|
||||
*/
|
||||
export function getCurrentAdmin(): Promise<LoginResponse['adminUser']> {
|
||||
export function getCurrentAdmin(): Promise<Omit<LoginResponse, 'token'>> {
|
||||
return request.get('/admin/auth/current')
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,6 +11,13 @@ import '@/assets/styles/index.scss'
|
|||
import router from './router'
|
||||
import App from './App.vue'
|
||||
|
||||
// 输出版本信息到控制台
|
||||
console.log('🚀 XiangYi Admin System')
|
||||
console.log('📦 Vue Version:', '3.4.38')
|
||||
console.log('🎨 Element Plus Version:', '2.8.4')
|
||||
console.log('🕒 Build Time:', new Date().toISOString())
|
||||
console.log('🔄 Cache Buster:', Math.random().toString(36).substr(2, 9))
|
||||
|
||||
const app = createApp(App)
|
||||
|
||||
// 注册 Element Plus 图标
|
||||
|
|
|
|||
|
|
@ -1,34 +1,36 @@
|
|||
import { defineConfig, loadEnv } from 'vite'
|
||||
import vue from '@vitejs/plugin-vue'
|
||||
import { resolve } from 'path'
|
||||
import AutoImport from 'unplugin-auto-import/vite'
|
||||
import Components from 'unplugin-vue-components/vite'
|
||||
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
|
||||
// import AutoImport from 'unplugin-auto-import/vite'
|
||||
// import Components from 'unplugin-vue-components/vite'
|
||||
// import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
|
||||
|
||||
export default defineConfig(({ mode }) => {
|
||||
const env = loadEnv(mode, process.cwd(), '')
|
||||
|
||||
return {
|
||||
base: '/xyqj/admin/',
|
||||
plugins: [
|
||||
vue(),
|
||||
AutoImport({
|
||||
imports: ['vue', 'vue-router', 'pinia'],
|
||||
resolvers: [
|
||||
ElementPlusResolver()
|
||||
],
|
||||
dts: 'src/auto-imports.d.ts',
|
||||
eslintrc: {
|
||||
enabled: true
|
||||
}
|
||||
}),
|
||||
Components({
|
||||
resolvers: [
|
||||
ElementPlusResolver()
|
||||
],
|
||||
dts: 'src/components.d.ts',
|
||||
// 自动导入组件的目录
|
||||
dirs: ['src/components']
|
||||
})
|
||||
vue()
|
||||
// 暂时禁用自动导入插件来解决兼容性问题
|
||||
// AutoImport({
|
||||
// imports: ['vue', 'vue-router', 'pinia'],
|
||||
// resolvers: [
|
||||
// ElementPlusResolver()
|
||||
// ],
|
||||
// dts: 'src/auto-imports.d.ts',
|
||||
// eslintrc: {
|
||||
// enabled: true
|
||||
// }
|
||||
// }),
|
||||
// Components({
|
||||
// resolvers: [
|
||||
// ElementPlusResolver()
|
||||
// ],
|
||||
// dts: 'src/components.d.ts',
|
||||
// // 自动导入组件的目录
|
||||
// dirs: ['src/components']
|
||||
// })
|
||||
],
|
||||
resolve: {
|
||||
alias: {
|
||||
|
|
@ -59,12 +61,14 @@ export default defineConfig(({ mode }) => {
|
|||
rollupOptions: {
|
||||
output: {
|
||||
manualChunks: {
|
||||
vue: ['vue', 'vue-router', 'pinia'],
|
||||
'element-plus': ['element-plus'],
|
||||
echarts: ['echarts'],
|
||||
vue: ['vue', 'vue-router', 'pinia']
|
||||
echarts: ['echarts']
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
target: 'es2015',
|
||||
minify: 'esbuild'
|
||||
}
|
||||
}
|
||||
})
|
||||
|
|
|
|||
30
server/.dockerignore
Normal file
30
server/.dockerignore
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
**/.classpath
|
||||
**/.dockerignore
|
||||
**/.env
|
||||
**/.git
|
||||
**/.gitignore
|
||||
**/.project
|
||||
**/.settings
|
||||
**/.toolstarget
|
||||
**/.vs
|
||||
**/.vscode
|
||||
**/*.*proj.user
|
||||
**/*.dbmdl
|
||||
**/*.jfm
|
||||
**/azds.yaml
|
||||
**/bin
|
||||
**/charts
|
||||
**/docker-compose*
|
||||
**/Dockerfile*
|
||||
**/node_modules
|
||||
**/npm-debug.log
|
||||
**/obj
|
||||
**/secrets.dev.yaml
|
||||
**/values.dev.yaml
|
||||
LICENSE
|
||||
README.md
|
||||
!**/.gitignore
|
||||
!.git/HEAD
|
||||
!.git/config
|
||||
!.git/packed-refs
|
||||
!.git/refs/heads/**
|
||||
|
|
@ -16,6 +16,7 @@ public class AdminUploadController : ControllerBase
|
|||
private readonly IStorageProvider _storageProvider;
|
||||
private readonly ILogger<AdminUploadController> _logger;
|
||||
private readonly IWebHostEnvironment _environment;
|
||||
private readonly IConfiguration _configuration;
|
||||
|
||||
// 允许的图片类型
|
||||
private static readonly string[] AllowedImageTypes = { ".jpg", ".jpeg", ".png", ".gif", ".webp" };
|
||||
|
|
@ -25,11 +26,13 @@ public class AdminUploadController : ControllerBase
|
|||
public AdminUploadController(
|
||||
IStorageProvider storageProvider,
|
||||
ILogger<AdminUploadController> logger,
|
||||
IWebHostEnvironment environment)
|
||||
IWebHostEnvironment environment,
|
||||
IConfiguration configuration)
|
||||
{
|
||||
_storageProvider = storageProvider;
|
||||
_logger = logger;
|
||||
_environment = environment;
|
||||
_configuration = configuration;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
@ -120,8 +123,16 @@ public class AdminUploadController : ControllerBase
|
|||
|
||||
_logger.LogInformation("文件保存到: {FilePath}", filePath);
|
||||
|
||||
// 返回相对URL
|
||||
return $"/uploads/{folder}/{fileName}";
|
||||
// 构建完整URL
|
||||
var relativeUrl = $"/uploads/{folder}/{fileName}";
|
||||
var domain = _configuration["Storage:Local:Domain"];
|
||||
|
||||
if (!string.IsNullOrEmpty(domain))
|
||||
{
|
||||
return $"{domain.TrimEnd('/')}{relativeUrl}";
|
||||
}
|
||||
|
||||
return relativeUrl;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
33
server/src/XiangYi.AdminApi/Dockerfile
Normal file
33
server/src/XiangYi.AdminApi/Dockerfile
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
# 请参阅 https://aka.ms/customizecontainer 以了解如何自定义调试容器,以及 Visual Studio 如何使用此 Dockerfile 生成映像以更快地进行调试。
|
||||
|
||||
# 此阶段用于在快速模式(默认为调试配置)下从 VS 运行时
|
||||
FROM mcr.microsoft.com/dotnet/aspnet:8.0.12 AS base
|
||||
USER $APP_UID
|
||||
WORKDIR /app
|
||||
EXPOSE 8080
|
||||
|
||||
|
||||
# 此阶段用于生成服务项目
|
||||
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
|
||||
ARG BUILD_CONFIGURATION=Release
|
||||
WORKDIR /src
|
||||
COPY ["Directory.Build.props", "."]
|
||||
COPY ["src/XiangYi.AdminApi/XiangYi.AdminApi.csproj", "src/XiangYi.AdminApi/"]
|
||||
COPY ["src/XiangYi.Application/XiangYi.Application.csproj", "src/XiangYi.Application/"]
|
||||
COPY ["src/XiangYi.Core/XiangYi.Core.csproj", "src/XiangYi.Core/"]
|
||||
COPY ["src/XiangYi.Infrastructure/XiangYi.Infrastructure.csproj", "src/XiangYi.Infrastructure/"]
|
||||
RUN dotnet restore "./src/XiangYi.AdminApi/XiangYi.AdminApi.csproj"
|
||||
COPY . .
|
||||
WORKDIR "/src/src/XiangYi.AdminApi"
|
||||
RUN dotnet build "./XiangYi.AdminApi.csproj" -c $BUILD_CONFIGURATION -o /app/build
|
||||
|
||||
# 此阶段用于发布要复制到最终阶段的服务项目
|
||||
FROM build AS publish
|
||||
ARG BUILD_CONFIGURATION=Release
|
||||
RUN dotnet publish "./XiangYi.AdminApi.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false
|
||||
|
||||
# 此阶段在生产中使用,或在常规模式下从 VS 运行时使用(在不使用调试配置时为默认值)
|
||||
FROM base AS final
|
||||
WORKDIR /app
|
||||
COPY --from=publish /app/publish .
|
||||
ENTRYPOINT ["dotnet", "XiangYi.AdminApi.dll"]
|
||||
|
|
@ -1,6 +1,9 @@
|
|||
using Microsoft.OpenApi.Models;
|
||||
using Microsoft.OpenApi.Models;
|
||||
|
||||
using Serilog;
|
||||
|
||||
using System.Reflection;
|
||||
|
||||
using XiangYi.AdminApi.Extensions;
|
||||
using XiangYi.AdminApi.Filters;
|
||||
using XiangYi.AdminApi.Middlewares;
|
||||
|
|
@ -26,9 +29,9 @@ builder.Services.AddControllersWithValidation();
|
|||
builder.Services.AddEndpointsApiExplorer();
|
||||
builder.Services.AddSwaggerGen(c =>
|
||||
{
|
||||
c.SwaggerDoc("v1", new OpenApiInfo
|
||||
{
|
||||
Title = "相宜相亲 后台管理API",
|
||||
c.SwaggerDoc("v1", new OpenApiInfo
|
||||
{
|
||||
Title = "相宜相亲 后台管理API",
|
||||
Version = "v1",
|
||||
Description = "相宜相亲后台管理系统API接口文档",
|
||||
Contact = new OpenApiContact
|
||||
|
|
@ -37,7 +40,7 @@ builder.Services.AddSwaggerGen(c =>
|
|||
Email = "tech@xiangyi.com"
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
// 添加JWT认证支持到Swagger
|
||||
c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
|
||||
{
|
||||
|
|
@ -48,7 +51,7 @@ builder.Services.AddSwaggerGen(c =>
|
|||
Scheme = "Bearer",
|
||||
BearerFormat = "JWT"
|
||||
});
|
||||
|
||||
|
||||
c.AddSecurityRequirement(new OpenApiSecurityRequirement
|
||||
{
|
||||
{
|
||||
|
|
@ -108,6 +111,7 @@ builder.Services.AddRepositories();
|
|||
// Add Infrastructure Services (Storage, SMS, RealName, WeChat, Redis)
|
||||
builder.Services.AddInfrastructureServices(builder.Configuration);
|
||||
|
||||
#if DEBUG
|
||||
// Add CORS
|
||||
builder.Services.AddCors(options =>
|
||||
{
|
||||
|
|
@ -117,7 +121,7 @@ builder.Services.AddCors(options =>
|
|||
.AllowAnyMethod()
|
||||
.AllowAnyHeader();
|
||||
});
|
||||
|
||||
|
||||
options.AddPolicy("AllowAdmin", policy =>
|
||||
{
|
||||
policy.WithOrigins("http://localhost:3000", "http://127.0.0.1:3000")
|
||||
|
|
@ -126,31 +130,30 @@ builder.Services.AddCors(options =>
|
|||
.AllowCredentials();
|
||||
});
|
||||
});
|
||||
#endif
|
||||
|
||||
var app = builder.Build();
|
||||
|
||||
// 全局异常处理中间件(放在最前面)
|
||||
app.UseGlobalExceptionHandler();
|
||||
|
||||
#if DEBUG
|
||||
// Enable CORS
|
||||
app.UseCors("AllowAdmin");
|
||||
|
||||
#endif
|
||||
// Configure the HTTP request pipeline.
|
||||
if (app.Environment.IsDevelopment())
|
||||
|
||||
app.UseSwagger();
|
||||
app.UseSwaggerUI(c =>
|
||||
{
|
||||
app.UseSwagger();
|
||||
app.UseSwaggerUI(c =>
|
||||
{
|
||||
c.SwaggerEndpoint("/swagger/v1/swagger.json", "相宜相亲 后台管理API v1");
|
||||
c.RoutePrefix = "swagger";
|
||||
c.DocumentTitle = "相宜相亲 后台管理API文档";
|
||||
c.DefaultModelsExpandDepth(2);
|
||||
c.DefaultModelRendering(Swashbuckle.AspNetCore.SwaggerUI.ModelRendering.Model);
|
||||
c.DocExpansion(Swashbuckle.AspNetCore.SwaggerUI.DocExpansion.List);
|
||||
c.EnableDeepLinking();
|
||||
c.DisplayRequestDuration();
|
||||
});
|
||||
}
|
||||
c.SwaggerEndpoint("/swagger/v1/swagger.json", "相宜相亲 后台管理API v1");
|
||||
c.RoutePrefix = "swagger";
|
||||
c.DocumentTitle = "相宜相亲 后台管理API文档";
|
||||
c.DefaultModelsExpandDepth(2);
|
||||
c.DefaultModelRendering(Swashbuckle.AspNetCore.SwaggerUI.ModelRendering.Model);
|
||||
c.DocExpansion(Swashbuckle.AspNetCore.SwaggerUI.DocExpansion.List);
|
||||
c.EnableDeepLinking();
|
||||
c.DisplayRequestDuration();
|
||||
});
|
||||
|
||||
app.UseHttpsRedirection();
|
||||
|
||||
|
|
|
|||
|
|
@ -2,12 +2,20 @@
|
|||
"profiles": {
|
||||
"XiangYi.AdminApi": {
|
||||
"commandName": "Project",
|
||||
"dotnetRunMessages": true,
|
||||
"launchBrowser": false,
|
||||
"applicationUrl": "http://localhost:5001",
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
}
|
||||
},
|
||||
"dotnetRunMessages": true,
|
||||
"applicationUrl": "http://localhost:5001"
|
||||
},
|
||||
"Container (Dockerfile)": {
|
||||
"commandName": "Docker",
|
||||
"launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}",
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_HTTP_PORTS": "8080"
|
||||
},
|
||||
"publishAllPorts": true,
|
||||
"useSSL": false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -7,6 +7,8 @@
|
|||
<RootNamespace>XiangYi.AdminApi</RootNamespace>
|
||||
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
||||
<NoWarn>$(NoWarn);1591</NoWarn>
|
||||
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
|
||||
<DockerfileContext>..\..</DockerfileContext>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
|
@ -14,6 +16,7 @@
|
|||
<PackageReference Include="Hangfire" Version="1.8.14" />
|
||||
<PackageReference Include="Hangfire.SqlServer" Version="1.8.14" />
|
||||
<PackageReference Include="Hangfire.MemoryStorage" Version="1.8.1.1" />
|
||||
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.23.0" />
|
||||
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />
|
||||
<PackageReference Include="Serilog.AspNetCore" Version="8.0.0" />
|
||||
</ItemGroup>
|
||||
|
|
|
|||
|
|
@ -38,7 +38,8 @@
|
|||
"Provider": "Local",
|
||||
"Local": {
|
||||
"BasePath": "../XiangYi.AppApi/wwwroot/uploads",
|
||||
"BaseUrl": "/uploads"
|
||||
"BaseUrl": "/uploads",
|
||||
"Domain": ""
|
||||
},
|
||||
"TencentCos": {
|
||||
"SecretId": "",
|
||||
|
|
|
|||
33
server/src/XiangYi.AppApi/Dockerfile
Normal file
33
server/src/XiangYi.AppApi/Dockerfile
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
# 请参阅 https://aka.ms/customizecontainer 以了解如何自定义调试容器,以及 Visual Studio 如何使用此 Dockerfile 生成映像以更快地进行调试。
|
||||
|
||||
# 此阶段用于在快速模式(默认为调试配置)下从 VS 运行时
|
||||
FROM mcr.microsoft.com/dotnet/aspnet:8.0.12 AS base
|
||||
WORKDIR /app
|
||||
EXPOSE 8080
|
||||
EXPOSE 8081
|
||||
|
||||
|
||||
# 此阶段用于生成服务项目
|
||||
FROM mcr.microsoft.com/dotnet/sdk:8.0.412 AS build
|
||||
ARG BUILD_CONFIGURATION=Release
|
||||
WORKDIR /src
|
||||
COPY ["Directory.Build.props", "."]
|
||||
COPY ["src/XiangYi.AppApi/XiangYi.AppApi.csproj", "src/XiangYi.AppApi/"]
|
||||
COPY ["src/XiangYi.Application/XiangYi.Application.csproj", "src/XiangYi.Application/"]
|
||||
COPY ["src/XiangYi.Core/XiangYi.Core.csproj", "src/XiangYi.Core/"]
|
||||
COPY ["src/XiangYi.Infrastructure/XiangYi.Infrastructure.csproj", "src/XiangYi.Infrastructure/"]
|
||||
RUN dotnet restore "./src/XiangYi.AppApi/XiangYi.AppApi.csproj"
|
||||
COPY . .
|
||||
WORKDIR "/src/src/XiangYi.AppApi"
|
||||
RUN dotnet build "./XiangYi.AppApi.csproj" -c $BUILD_CONFIGURATION -o /app/build
|
||||
|
||||
# 此阶段用于发布要复制到最终阶段的服务项目
|
||||
FROM build AS publish
|
||||
ARG BUILD_CONFIGURATION=Release
|
||||
RUN dotnet publish "./XiangYi.AppApi.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false
|
||||
|
||||
# 此阶段在生产中使用,或在常规模式下从 VS 运行时使用(在不使用调试配置时为默认值)
|
||||
FROM base AS final
|
||||
WORKDIR /app
|
||||
COPY --from=publish /app/publish .
|
||||
ENTRYPOINT ["dotnet", "XiangYi.AppApi.dll"]
|
||||
|
|
@ -1,6 +1,9 @@
|
|||
using Microsoft.OpenApi.Models;
|
||||
using Microsoft.OpenApi.Models;
|
||||
|
||||
using Serilog;
|
||||
|
||||
using System.Reflection;
|
||||
|
||||
using XiangYi.AppApi.Extensions;
|
||||
using XiangYi.AppApi.Filters;
|
||||
using XiangYi.AppApi.Middlewares;
|
||||
|
|
@ -26,9 +29,9 @@ builder.Services.AddControllersWithValidation();
|
|||
builder.Services.AddEndpointsApiExplorer();
|
||||
builder.Services.AddSwaggerGen(c =>
|
||||
{
|
||||
c.SwaggerDoc("v1", new OpenApiInfo
|
||||
{
|
||||
Title = "相宜相亲 小程序API",
|
||||
c.SwaggerDoc("v1", new OpenApiInfo
|
||||
{
|
||||
Title = "相宜相亲 小程序API",
|
||||
Version = "v1",
|
||||
Description = "相宜相亲微信小程序后端API接口文档",
|
||||
Contact = new OpenApiContact
|
||||
|
|
@ -37,7 +40,7 @@ builder.Services.AddSwaggerGen(c =>
|
|||
Email = "tech@xiangyi.com"
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
// 添加JWT认证支持到Swagger
|
||||
c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
|
||||
{
|
||||
|
|
@ -48,7 +51,7 @@ builder.Services.AddSwaggerGen(c =>
|
|||
Scheme = "Bearer",
|
||||
BearerFormat = "JWT"
|
||||
});
|
||||
|
||||
|
||||
c.AddSecurityRequirement(new OpenApiSecurityRequirement
|
||||
{
|
||||
{
|
||||
|
|
@ -106,6 +109,7 @@ builder.Services.AddRepositories();
|
|||
builder.Services.AddInfrastructureServices(builder.Configuration);
|
||||
|
||||
// Add CORS
|
||||
#if DEBUG
|
||||
builder.Services.AddCors(options =>
|
||||
{
|
||||
options.AddPolicy("AllowAll", policy =>
|
||||
|
|
@ -115,31 +119,31 @@ builder.Services.AddCors(options =>
|
|||
.AllowAnyHeader();
|
||||
});
|
||||
});
|
||||
#endif
|
||||
|
||||
var app = builder.Build();
|
||||
|
||||
// 全局异常处理中间件(放在最前面)
|
||||
app.UseGlobalExceptionHandler();
|
||||
|
||||
#if DEBUG
|
||||
// Enable CORS
|
||||
app.UseCors("AllowAll");
|
||||
|
||||
#endif
|
||||
// Configure the HTTP request pipeline.
|
||||
if (app.Environment.IsDevelopment())
|
||||
|
||||
app.UseSwagger();
|
||||
app.UseSwaggerUI(c =>
|
||||
{
|
||||
app.UseSwagger();
|
||||
app.UseSwaggerUI(c =>
|
||||
{
|
||||
c.SwaggerEndpoint("/swagger/v1/swagger.json", "相宜相亲 小程序API v1");
|
||||
c.RoutePrefix = "swagger";
|
||||
c.DocumentTitle = "相宜相亲 小程序API文档";
|
||||
c.DefaultModelsExpandDepth(2);
|
||||
c.DefaultModelRendering(Swashbuckle.AspNetCore.SwaggerUI.ModelRendering.Model);
|
||||
c.DocExpansion(Swashbuckle.AspNetCore.SwaggerUI.DocExpansion.List);
|
||||
c.EnableDeepLinking();
|
||||
c.DisplayRequestDuration();
|
||||
});
|
||||
}
|
||||
c.SwaggerEndpoint("/swagger/v1/swagger.json", "相宜相亲 小程序API v1");
|
||||
c.RoutePrefix = "swagger";
|
||||
c.DocumentTitle = "相宜相亲 小程序API文档";
|
||||
c.DefaultModelsExpandDepth(2);
|
||||
c.DefaultModelRendering(Swashbuckle.AspNetCore.SwaggerUI.ModelRendering.Model);
|
||||
c.DocExpansion(Swashbuckle.AspNetCore.SwaggerUI.DocExpansion.List);
|
||||
c.EnableDeepLinking();
|
||||
c.DisplayRequestDuration();
|
||||
});
|
||||
|
||||
|
||||
app.UseHttpsRedirection();
|
||||
|
||||
|
|
|
|||
|
|
@ -2,23 +2,34 @@
|
|||
"profiles": {
|
||||
"http": {
|
||||
"commandName": "Project",
|
||||
"dotnetRunMessages": true,
|
||||
"launchBrowser": true,
|
||||
"launchUrl": "swagger",
|
||||
"applicationUrl": "http://localhost:5000",
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
}
|
||||
},
|
||||
"dotnetRunMessages": true,
|
||||
"applicationUrl": "http://localhost:5000"
|
||||
},
|
||||
"https": {
|
||||
"commandName": "Project",
|
||||
"dotnetRunMessages": true,
|
||||
"launchBrowser": true,
|
||||
"launchUrl": "swagger",
|
||||
"applicationUrl": "https://localhost:7000;http://localhost:5000",
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
}
|
||||
},
|
||||
"dotnetRunMessages": true,
|
||||
"applicationUrl": "https://localhost:7000;http://localhost:5000"
|
||||
},
|
||||
"Container (Dockerfile)": {
|
||||
"commandName": "Docker",
|
||||
"launchBrowser": true,
|
||||
"launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}/swagger",
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_HTTPS_PORTS": "8081",
|
||||
"ASPNETCORE_HTTP_PORTS": "8080"
|
||||
},
|
||||
"publishAllPorts": true,
|
||||
"useSSL": true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -7,6 +7,9 @@
|
|||
<RootNamespace>XiangYi.AppApi</RootNamespace>
|
||||
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
||||
<NoWarn>$(NoWarn);1591</NoWarn>
|
||||
<UserSecretsId>a5d2bdea-6712-4eb5-a74a-62d88cc66b4b</UserSecretsId>
|
||||
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
|
||||
<DockerfileContext>..\..</DockerfileContext>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
|
@ -15,6 +18,7 @@
|
|||
<PackageReference Include="Hangfire" Version="1.8.14" />
|
||||
<PackageReference Include="Hangfire.SqlServer" Version="1.8.14" />
|
||||
<PackageReference Include="Hangfire.MemoryStorage" Version="1.8.1.1" />
|
||||
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.23.0" />
|
||||
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />
|
||||
<PackageReference Include="Serilog.AspNetCore" Version="8.0.0" />
|
||||
</ItemGroup>
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user