首页 > 其他分享 >造轮子之种子数据

造轮子之种子数据

时间:2023-10-16 11:24:41浏览次数:27  
标签:Wheel cancellationToken await MenuType 种子 轮子 new 数据 public

在前面我们基本把应用框架的基础设施搭建完成。接下来我们就得着手处理一下种子数据的问题。
在一个基础框架里面,种子数据很重要,比如一些基础数据,初始用户等等,这些都需要初始化,否则程序启动却无法使用就很尴尬了。

IDataSeeder

首先定义一个种子数据接口

using Wheel.DependencyInjection;

namespace Wheel.DataSeeders
{
    public interface IDataSeeder : ITransientDependency
    {
        Task Seed(CancellationToken cancellationToken = default);
    }
}

接下来所有的种子数据实现都需要继承这个接口。

DataSeederExtensions

封装一个扩展方法,获取所有IDataSeeder的实现,并执行数据初始化。

namespace Wheel.DataSeeders
{
    public static class DataSeederExtensions
    {
        public static async Task<IApplicationBuilder> SeedData(this IApplicationBuilder app) 
        {
            var dataSeeders = app.ApplicationServices.GetServices<IDataSeeder>();

            foreach (var dataSeeder in dataSeeders)
            {
                await dataSeeder.Seed();
            }
            return app;
        }
    }
}

在Program中添加代码

var app = builder.Build();

//初始化种子信息
await app.SeedData();

这样就初步完成了种子数据的配置。

实现种子数据

接下来就实现一些种子数据。

用户角色种子数据

IdentityDataSeeder

using Microsoft.AspNetCore.Identity;
using Wheel.Domain;
using Wheel.Domain.Identity;

namespace Wheel.DataSeeders.Identity
{
    public class IdentityDataSeeder : IDataSeeder
    {
        private readonly IBasicRepository<Role, string> _roleRepository;
        private readonly IBasicRepository<User, string> _userRepository;
        private readonly UserManager<User> _userManager;
        private readonly IUserStore<User> _userStore;
        private readonly RoleManager<Role> _roleManager;

        public IdentityDataSeeder(IBasicRepository<Role, string> roleRepository, IBasicRepository<User, string> userRepository, UserManager<User> userManager, IUserStore<User> userStore, RoleManager<Role> roleManager)
        {
            _roleRepository = roleRepository;
            _userRepository = userRepository;
            _userManager = userManager;
            _userStore = userStore;
            _roleManager = roleManager;
        }

        public async Task Seed(CancellationToken cancellationToken = default)
        {
            if (!await _roleRepository.AnyAsync(a => a.Name == "admin"))
            {
                await _roleManager.CreateAsync(new Role("admin", Enums.RoleType.Admin));
            }
            if (!await _roleRepository.AnyAsync(a => a.Name == "user"))
            {
                await _roleManager.CreateAsync(new Role("user", Enums.RoleType.App));
            }

            if (!await _userRepository.AnyAsync(a => a.UserName == "admin"))
            {
                var adminUser = new User();
                await _userStore.SetUserNameAsync(adminUser, "admin", cancellationToken);

                var emailStore = (IUserEmailStore<User>)_userStore;
                await emailStore.SetEmailAsync(adminUser, "136590076@qq.com", cancellationToken);
                await _userManager.CreateAsync(adminUser, "Wheel@2023");
                await _userManager.AddToRoleAsync(adminUser, "admin");
                await _userManager.UpdateAsync(adminUser);
            }
        }
    }
}

这里初始化一个普通User角色和管理后台admin角色,以及一个admin角色的账号。

多语言种子数据

LocalizationDataSeeder

using Wheel.Domain;
using Wheel.Domain.Localization;

namespace Wheel.DataSeeders.Localization
{
    public class LocalizationDataSeeder : IDataSeeder
    {
        private readonly IBasicRepository<LocalizationCulture, int> _localizationCultureRepository;

        public LocalizationDataSeeder(IBasicRepository<LocalizationCulture, int> localizationCultureRepository)
        {
            _localizationCultureRepository = localizationCultureRepository;
        }

        public async Task Seed(CancellationToken cancellationToken = default)
        {
            if (!(await _localizationCultureRepository.AnyAsync(cancellationToken)))
            {
                await _localizationCultureRepository.InsertAsync(new LocalizationCulture() { Name = "en" }, true);
                await _localizationCultureRepository.InsertAsync(new LocalizationCulture() { Name = "zh-CN"}, true);
            }
        }
    }
}

这里给多语言初始化两种国家语言。

菜单种子

MenuDataSeeder

using Wheel.Domain;
using Wheel.Domain.Menus;

namespace Wheel.DataSeeders.Identity
{
    public class MenuDataSeeder : IDataSeeder
    {
        private readonly IBasicRepository<Menu, Guid> _menuRepository;

        public MenuDataSeeder(IBasicRepository<Menu, Guid> menuRepository)
        {
            _menuRepository = menuRepository;
        }

        public async Task Seed(CancellationToken cancellationToken = default)
        {
            if (!(await _menuRepository.AnyAsync(cancellationToken)))
            {
                await _menuRepository.InsertAsync(new Menu
                {
                    Name = "SystemManage",
                    DisplayName = "系统管理",
                    Sort = 99,
                    Id = Guid.NewGuid(),
                    Icon = "SettingOutlined",
                    Path = "/System",
                    MenuType = Enums.MenuType.Menu,
                    Children = new List<Menu>
                    {
                        new Menu
                        {
                            Name = "UserManage",
                            DisplayName = "用户管理",
                            Sort = 0,
                            Id = Guid.NewGuid(),
                            Path = "/System/User",
                            MenuType = Enums.MenuType.Page
                        },
                        new Menu
                        {
                            Name = "RoleManage",
                            DisplayName = "角色管理",
                            Sort = 1,
                            Id = Guid.NewGuid(),
                            Path = "/System/Role",
                            MenuType = Enums.MenuType.Page,
                        },
                        new Menu
                        {
                            Name = "PermissionManage",
                            DisplayName = "权限管理",
                            Sort = 2,
                            Id = Guid.NewGuid(),
                            Path = "/System/Permission",
                            MenuType = Enums.MenuType.Page
                        },
                        new Menu
                        {
                            Name = "MenuManage",
                            DisplayName = "菜单管理",
                            Sort = 3,
                            Id = Guid.NewGuid(),
                            Path = "/System/Menu",
                            MenuType = Enums.MenuType.Page
                        },
                        new Menu
                        {
                            Name = "LocalizationManage",
                            DisplayName = "多语言管理",
                            Sort = 4,
                            Id = Guid.NewGuid(),
                            Path = "/System/Localization",
                            MenuType = Enums.MenuType.Page
                        },
                    }
                }, true, cancellationToken: cancellationToken);
            }
        }
    }
}

这里菜单初始化基础管理后台页面所需的菜单。

启动程序后,打开数据库
image.png
image.png
image.png
image.png
可以看到数据初始化成功。
这样就轻轻松松完成了我们种子数据的实现。

轮子仓库地址https://github.com/Wheel-Framework/Wheel
欢迎进群催更。

image.png

标签:Wheel,cancellationToken,await,MenuType,种子,轮子,new,数据,public
From: https://www.cnblogs.com/fanshaoO/p/17766929.html

相关文章

  • electron 本地数据库sqlite
    背景某些不会频繁变动,但是数据量可能比较大,查询也比较频繁地数据,例如通讯录等。如果每次都查询服务器的数据库可能造成服务器压力过大,考虑在本地做数据库存储,有更新时从服务器同步数据到本地数据库,用户操作查询则使用本地数据库查询。方案进入页面时(或者其他适当时机)请求服务......
  • 常用JDBC数据库驱动包和类名
    MySQL数据库:  1)驱动包:https://mvnrepository.com/artifact/mysql/mysql-connector-java(下载路径)  2)驱动类名:com.mysql.jdbc.Driver  3)JDBC的URL:jdbc:mysql://IP地址:端口号/数据库名字   注:端口号缺省为:3306    SQLserver数据库:  1)驱动包:https......
  • 数据存储工程解决
    数据存储工程解决在构建大规模爬虫系统时,数据存储是一个至关重要的环节。面对大量数据的处理和存储,我们需要采取一些工程化的解决方案,以确保数据的有效管理和快速检索。在本文中,我将与大家分享一些关于大规模爬虫数据存储的解决方案,这些方案具有实际操作价值,希望对你构建高效的数据......
  • hadoop集群 大数据项目实战_电信用户行为分析_day02
    集群配置好后,运行一个小例子,统计单词1.hdfsdfs-put将本地系统的文件或文件夹复制到HDFS上2.hdfsdfs-ls/output  将所有的文件显示出来3.hdfsdfs-cat/output/ 将所有的文件读取出来 下载part-r-000000安装Redis1.下载Rediswgethttps://download.redis.i......
  • 树叶识别系统python+Django网页界面+TensorFlow+算法模型+数据集+图像识别分类
    一、介绍树叶识别系统。使用Python作为主要编程语言开发,通过收集常见的6中树叶('广玉兰','杜鹃','梧桐','樟叶','芭蕉','银杏')图片作为数据集,然后使用TensorFlow搭建ResNet50算法网络模型,通过对数据集进行处理后进行模型迭代训练,得到一个识别精度较高的H5模型文件。并基于Dja......
  • 晶圆寻边器的一种快速数据计算方法
    晶圆寻边器采用线阵CCD传感器,吸盘带动晶圆转动一周,传感器采集到的数据为正弦波形。数据采集数学模型根据运动的相对性,CCD传感器可以看成是反方向绕旋转中心运动。如下图所示,坐标系建立在旋转中心,初始时刻硅片圆心的位置在Q(a,b)处,到旋转中心距离为d。CCD传感器位于X轴上;在时刻t......
  • 手撕Vue-数据驱动界面改变下
    经过上一篇的介绍,已经实现了观察者模式的基本内容,接下来要完成的就是将上一篇的发布订阅模式运用到Nue中,实现数据驱动界面改变。在监听数据变化的章节当中,根据指定的区域和数据去编译渲染界面这个步骤处,我写了一个注释,这个注释是这样的:第一步:给外界传入的所有数据都添加get/se......
  • 手撕Vue-数据驱动界面改变上
    经过上一篇的介绍,已经实现了监听数据的变化,接下来就是要实现数据变化后,界面也跟着变化,这就是数据驱动界面改变。想要实现数据变化之后更新UI界面,我们可以使用发布订阅模式来实现,先定义一个观察者类,再定义一个发布订阅类,然后再通过发布订阅的类来管理观察者类。接下来我们就......
  • Graph Wave Net模型中的数据集hdf5和pkl文件的读取问题
    引入:GraphWaveNet的流量数据的文件格式是.h5,路网结构文件格式是.pkl,它们怎么打开呢?HDF5HDF5文件一般以.h5或者.hdf5作为后缀名,其中包含两种结构:Group(文件夹)和Datasets(数据)python可以使用h5py或pandas打开.h5文件h5pypath='metr-la.h5'f=h5py.File(path,'r')......
  • 金蝶云星空调用《其他入库单》的新增界面给序列号子单据体数据赋值
     金蝶云星空调用《其他入库单》的新增界面给序列号子单据体数据赋值 金蝶云星空平台,业务对象的实体层级关系,表头,表头下可以有多个单据体,各单据体之间无关联,单据体下可以有子单单据体。另外各个实体都可以设置拆分表。比如,《其他入库单》表头有客户、日期、单据编号等,有拆分表......