1. 生产模块按工序拆分为两个一级菜单 - 生产-前缫(落丝记录)、生产-后缫(纤度检验、黑板检验) - 旧的「生产管理」(/prod) 目录及子菜单由种子自动清理,页面组件与权限标识保持不变 - 消息中心跳转路径、首页快捷入口路径同步更新 2. 职工管理独立为一级菜单(原挂在「基础数据」目录下),并清理历史子菜单 3. 修复侧边栏菜单展开卡顿(基础数据等子项较多的目录尤其明显) - 去掉 Element Plus 的 height 过渡动画(会逐帧重排全部子项) - 收起时改用 height:0 + visibility:hidden 而非 display:none,子项提前完成布局 - 菜单区独立滚动并预留滚动条宽度(scrollbar-gutter),消除展开时的横向抖动 - 菜单项增加 contain 布局隔离,淡入动画改为容器级 4. 修复页面首次打开重复请求 - 分页组件挂载时会触发一次 current-change,页码未变化时不再重复加载(18 个页面) - 职工管理去掉 onMounted 与默认选中部门的重复加载 - 工种管理、原料庄口的注册表下拉由按 key 多次请求改为一次全量拉取 5. 后端增加前端静态托管与 SPA 路由回退,支持 IIS 单站点部署(前后端同源) 6. 新增部署脚本 deploy-iis.ps1(首次部署)与 update-iis.ps1(更新发布)
123 lines
6.8 KiB
C#
123 lines
6.8 KiB
C#
using FreeSql;
|
||
using FreeSql.Aop;
|
||
using F9WebAiTest.Application.Interfaces.Repositories.SYS.Departments;
|
||
using F9WebAiTest.Application.Interfaces.Repositories.SYS.RBAC.Menus;
|
||
using F9WebAiTest.Application.Interfaces.Repositories.SYS.RBAC.Roles;
|
||
using F9WebAiTest.Application.Interfaces.Repositories.SYS.RBAC.Users;
|
||
using F9WebAiTest.Application.Interfaces.Repositories.SYS.WorkTypes;
|
||
using F9WebAiTest.Application.Interfaces.Repositories.SYS.Registries;
|
||
using F9WebAiTest.Application.Interfaces.Repositories.SYS.YuanliaoZhuangkous;
|
||
using F9WebAiTest.Application.Interfaces.Repositories.SYS.Employees;
|
||
using F9WebAiTest.Application.Interfaces.Repositories.SYS.Gongyingshangs;
|
||
using F9WebAiTest.Application.Interfaces.Repositories.SYS.WuziMulus;
|
||
using F9WebAiTest.Application.Interfaces.Repositories.SYS.Zq;
|
||
using F9WebAiTest.Application.Interfaces.Security;
|
||
using F9WebAiTest.Application.Interfaces.SnowflakeID;
|
||
using F9WebAiTest.Application.Interfaces.UOW;
|
||
using F9WebAiTest.Domain.Common;
|
||
using F9WebAiTest.Domain.Entities;
|
||
using F9WebAiTest.Domain.Interfaces.SYS.Departments;
|
||
using F9WebAiTest.Domain.Interfaces.SYS.RBAC.Menus;
|
||
using F9WebAiTest.Domain.Interfaces.SYS.RBAC.Permissions;
|
||
using F9WebAiTest.Domain.Interfaces.SYS.RBAC.Roles;
|
||
using F9WebAiTest.Domain.Interfaces.SYS.RBAC.Users;
|
||
using F9WebAiTest.Domain.Interfaces.SYS.WorkTypes;
|
||
using F9WebAiTest.Domain.Interfaces.SYS.Registries;
|
||
using F9WebAiTest.Domain.Interfaces.SYS.YuanliaoZhuangkous;
|
||
using F9WebAiTest.Domain.Interfaces.SYS.Employees;
|
||
using F9WebAiTest.Domain.Interfaces.SYS.Gongyingshangs;
|
||
using F9WebAiTest.Domain.Interfaces.SYS.WuziMulus;
|
||
using F9WebAiTest.Domain.Interfaces.SYS.Zq;
|
||
using F9WebAiTest.Infrastructure.FreeSqls.Persistence;
|
||
using F9WebAiTest.Infrastructure.FreeSqls.Repositories.SYS.Departments;
|
||
using F9WebAiTest.Infrastructure.FreeSqls.Repositories.SYS.RBAC.Menus;
|
||
using F9WebAiTest.Infrastructure.FreeSqls.Repositories.SYS.RBAC.Permissions;
|
||
using F9WebAiTest.Infrastructure.FreeSqls.Repositories.SYS.RBAC.Roles;
|
||
using F9WebAiTest.Infrastructure.FreeSqls.Repositories.SYS.RBAC.Users;
|
||
using F9WebAiTest.Infrastructure.FreeSqls.Repositories.SYS.WorkTypes;
|
||
using F9WebAiTest.Infrastructure.FreeSqls.Repositories.SYS.Registries;
|
||
using F9WebAiTest.Infrastructure.FreeSqls.Repositories.SYS.YuanliaoZhuangkous;
|
||
using F9WebAiTest.Infrastructure.FreeSqls.Repositories.SYS.Employees;
|
||
using F9WebAiTest.Infrastructure.FreeSqls.Repositories.SYS.Gongyingshangs;
|
||
using F9WebAiTest.Infrastructure.FreeSqls.Repositories.SYS.WuziMulus;
|
||
using F9WebAiTest.Infrastructure.FreeSqls.Repositories.SYS.Zq;
|
||
using F9WebAiTest.Infrastructure.InterfaceImplements.Security;
|
||
using F9WebAiTest.Infrastructure.InterfaceImplements.SnowflakeID;
|
||
using F9WebAiTest.Infrastructure.Repositories;
|
||
using Microsoft.Extensions.Configuration;
|
||
using Microsoft.Extensions.DependencyInjection;
|
||
|
||
namespace F9WebAiTest.Infrastructure;
|
||
|
||
public static class DependencyInjection
|
||
{
|
||
public static IServiceCollection AddInfrastructure(this IServiceCollection services, IConfiguration configuration)
|
||
{
|
||
// 创建 FreeSql 实例(SQLite),关闭自动同步结构(只建新表,不修改旧库)
|
||
var connStr = configuration.GetConnectionString("Default");
|
||
var fsql = new FreeSqlBuilder()
|
||
.UseConnectionString(DataType.Sqlite, connStr)
|
||
.UseAutoSyncStructure(false)
|
||
.Build();
|
||
|
||
// 软删除全局过滤器:自动应用到新旧两套实体基类
|
||
fsql.GlobalFilter.Apply<BaseEntity>("软删除", a => a.IsDeleted == false);
|
||
fsql.GlobalFilter.Apply<Entity>("软删除", a => a.IsDeleted == false);
|
||
|
||
// 枚举统一映射为 int(与旧库 INTEGER 存储保持一致)
|
||
fsql.Aop.ConfigEntityProperty += (_, e) =>
|
||
{
|
||
if (e.Property.PropertyType.IsEnum)
|
||
e.ModifyResult.MapType = typeof(int);
|
||
};
|
||
|
||
services.AddSingleton(fsql);
|
||
services.AddScoped(typeof(IRepository<>), typeof(Repository<>));
|
||
|
||
// ==================== F9 风格 RBAC(DDD + CQRS)依赖注册 ====================
|
||
|
||
// 雪花 ID(有状态,单例)
|
||
services.AddSingleton<ISnowflakeIdGenerator, SnowflakeIdGenerator>();
|
||
// 密码哈希
|
||
services.AddScoped<IPasswordHasher, PasswordHasher>();
|
||
// 工作单元(事务)
|
||
services.AddScoped<IUnitOfWork_F9, UnitOfWork_F9>();
|
||
|
||
// 写仓储(Domain 接口)
|
||
services.AddScoped<IUserWriteRepository, UserWriteRepository>();
|
||
services.AddScoped<IUserRoleWriteRepository, UserRoleWriteRepository>();
|
||
services.AddScoped<IRoleWriteRepository, RoleWriteRepository>();
|
||
services.AddScoped<IRolePermissionWriteRepository, RolePermissionWriteRepository>();
|
||
services.AddScoped<IMenuWriteRepository, MenuWriteRepository>();
|
||
services.AddScoped<IPermissionWriteRepository, PermissionWriteRepository>();
|
||
services.AddScoped<IDepartmentWriteRepository, DepartmentWriteRepository>();
|
||
services.AddScoped<IDepartmentUserRepository, DepartmentUserRepository>();
|
||
services.AddScoped<IWorkTypeWriteRepository, WorkTypeWriteRepository>();
|
||
services.AddScoped<IWorkTypeDepartmentRepository, WorkTypeDepartmentRepository>();
|
||
services.AddScoped<IWorkTypeRoleRepository, WorkTypeRoleRepository>();
|
||
services.AddScoped<IZhangqiWriteRepository, ZhangqiWriteRepository>();
|
||
services.AddScoped<IRegistryWriteRepository, RegistryWriteRepository>();
|
||
services.AddScoped<IYuanliaoZhuangkouWriteRepository, YuanliaoZhuangkouWriteRepository>();
|
||
services.AddScoped<IWuziGroupWriteRepository, WuziGroupWriteRepository>();
|
||
services.AddScoped<IGongyingshangWriteRepository, GongyingshangWriteRepository>();
|
||
services.AddScoped<IEmployeeWriteRepository, EmployeeWriteRepository>();
|
||
services.AddScoped<IWuziMuluWriteRepository, WuziMuluWriteRepository>();
|
||
|
||
// 读仓储(Application 接口)
|
||
services.AddScoped<IUserReadRepository, UserReadRepository>();
|
||
services.AddScoped<IRoleReadRepository, RoleReadRepository>();
|
||
services.AddScoped<IMenuReadRepository, MenuReadRepository>();
|
||
services.AddScoped<IDepartmentReadRepository, DepartmentReadRepository>();
|
||
services.AddScoped<IWorkTypeReadRepository, WorkTypeReadRepository>();
|
||
services.AddScoped<IZhangqiReadRepository, ZhangqiReadRepository>();
|
||
services.AddScoped<IRegistryReadRepository, RegistryReadRepository>();
|
||
services.AddScoped<IYuanliaoZhuangkouReadRepository, YuanliaoZhuangkouReadRepository>();
|
||
services.AddScoped<IWuziGroupReadRepository, WuziGroupReadRepository>();
|
||
services.AddScoped<IGongyingshangReadRepository, GongyingshangReadRepository>();
|
||
services.AddScoped<IEmployeeReadRepository, EmployeeReadRepository>();
|
||
services.AddScoped<IWuziMuluReadRepository, WuziMuluReadRepository>();
|
||
|
||
return services;
|
||
}
|
||
}
|