第1章 数据库及其表的自动生成

1实体

1.1 Core.Domain.BaseEntity

namespace Core.Domain

{

    /// <summary>

    /// 【基实体--类】

    /// <remarks>

    /// 摘要:

    ///     1、所有的具体实现实体通过继承该抽象实体,以获取相应的的长整型编号值。

    ///     2、为所有的具体实现实体的反射/依赖注入实例化操作,提供1个通用的抓手。

    /// </remarks>

    /// </summary>

    public abstract class BaseEntity

    {

        /// <summary>

        /// 【编号】

        /// <remarks>

        /// 摘要:

        ///     获取/设置所有实体实例的长整型编号值。

        /// </remarks>

        /// </summary>

        public long Id { get; set; }

    }

}

1.2 Core.Domain.ILogicDeletedEntity

namespace Core.Domain

{

    /// <summary>

    /// 【逻辑删除实体--接口】

    /// <remarks>

    /// 摘要:

    ///     1、继承于该接口的所有的具体实现实体,都需要实现逻辑删除功能。

    ///     2、为所有的具体实现实体的反射/依赖注入实例化操作,提供1个通用的抓手,这些实例都具有逻辑删除功能。

    /// </remarks>

    /// </summary>

    public interface ILogicDeletedEntity

    {

        /// <summary>

        /// (逻辑)删除?】

        /// <remarks>

        /// 摘要:

        ///     获取/设置1个值false((逻辑)删除)/true(已经(逻辑)删除),该值指示1指定实体的1个指定实例是否已经处于(逻辑)删除状态。

        /// </remarks>

        /// </summary>

        bool Deleted { get; set; }

    }

}

1.3 Core.Domain.Role

//项目

using Core.Domain.Security;

namespace Core.Domain.Users

{

    /// <summary>

    /// 【角色--类】

    /// <remarks>

    /// 摘要:

    ///     通过该实体类及其属性成员,用于实现当前程序【Core.【领域】.【用户集】.【角色】实体与“[ShopDemo].[Role]”表之间的CURD的交互操作,并把这些数据存储到数据库设置实例中(内存)

    /// </remarks>

    /// </summary>

    public class Role : BaseEntity

    {

        #region 属性

        /// <summary>

        /// 【角色名】

        /// <remarks>

        /// 摘要:

        ///     获取/设置1个指定的角色名。

        /// </remarks>

        /// </summary>

        public string Name { get; set; }

        /// <summary>

        /// 【启用?】

        /// <remarks>

        /// 摘要:

        ///     获取/设置1个值false(禁用)/true(默认值:启用),该值指示角色实体的1个指定实例是否处于启用状态。

        /// </remarks>

        /// </summary>

        public bool IsActive { get; set; }

        /// <summary>

        /// 【备注】

        /// <remarks>

        /// 摘要:

        ///     获取/设置1个指定角色的备注信息。

        /// </remarks>

        /// </summary>

        public string Remark { get; set; }

        #endregion

        #region 属性--映射和级联构建

        /// <summary>

        /// 【权限角色映射集】

        /// <remarks>

        /// 摘要:

        ///     获取/设置1个指定角色实例所对应的所有权限角色映射实例。

        /// 说明:

        ///     构建权限与角色实体及其表之间的n:n映射关系,但在实现和逻辑定义实现上二者是平等关系。

        /// </remarks>

        /// </summary>

        public virtual ICollection<PermissionRole> PermissionRoleCollection { get; set; }

        #endregion

    }

}

1.4 Core.Domain.User

namespace Core.Domain.Users

{

    /// <summary>

    /// 【用户--类】

    /// <remarks>

    /// 摘要:

    ///     通过该实体类及其属性成员,用于实现当前程序【Core.【领域】.【用户集】.【用户】实体与“[ShopDemo].[User]”表之间的CURD的交互操作,并把这些数据存储到数据库设置实例中(内存)

    /// </remarks>

    /// </summary>

    public class User : BaseEntity, ILogicDeletedEntity

    {

        #region 属性

        /// <summary>

        /// 【用户名】

        /// <remarks>

        /// 摘要:

        ///     获取/设置1个指定的用户名(账户、昵称)

        /// </remarks>

        /// </summary>

        public string Name { get; set; }

        /// <summary>

        /// 【电子邮箱】

        /// <remarks>

        /// 摘要:

        ///     获取/设置1个指定用户所对应的电子邮箱。

        /// </remarks>

        /// </summary>

        public string Email { get; set; }

        /// <summary>

        /// 【密码】

        /// <remarks>

        /// 摘要:

        ///     获取/设置1个指定用户所对应的密码。

        /// </remarks>

        /// </summary>

        public string Password { get; set; }

        /// <summary>

        /// 【手机号】

        /// <remarks>

        /// 摘要:

        ///     获取/设置1个指定用户所对应的手机号。

        /// </remarks>

        /// </summary>

        public string Phone { get; set; }

        /// <summary>

        /// 【记住我(Token)

        /// <remarks>

        /// 摘要:

        ///     获取/设置把1个指定用户在执行登录操作后,当时所产生的Token字符串。

        /// </remarks>

        /// </summary>

        public string RememberToken { get; set; }

        /// <summary>

        /// 【头像】

        /// <remarks>

        /// 摘要:

        ///     获取/设置1个指定用户所对应的头像图片的名称(带扩展名)

        /// </remarks>

        /// </summary>

        public string Avatar { get; set; }

        /// <summary>

        /// 【启用?】

        /// <remarks>

        /// 摘要:

        ///     获取/设置1个值false(禁用)/true(默认值:启用),该值指示用户实体的1个指定实例是否处于启用状态。

        /// </remarks>

        /// </summary>

        public bool IsActive { get; set; }

        #region 属性--ILogicDeletedEntity

        /// <summary>

        /// (逻辑)删除?】

        /// <remarks>

        /// 摘要:

        ///     获取/设置1个值false((逻辑)删除)/true(已经(逻辑)删除),该值指示用户实体的1个指定实例是否已经处于(逻辑)删除状态。

        /// </remarks>

        /// </summary>

        public bool Deleted { get; set; }

        #endregion

        /// <summary>

        /// 【创建时间】

        /// <remarks>

        /// 摘要:

        ///     获取/设置用户实体1个指定实例第1次被持久化到角色表中的时间。

        /// </remarks>

        /// </summary>

        public DateTime CreatedDateTime { get; set; }

        /// <summary>

        /// 【创建时间】

        /// <remarks>

        /// 摘要:

        ///     获取/设置用户实体1个指定实例最后1次被修改后,持久化到角色表中的时间。

        /// </remarks>

        /// </summary>

        public DateTime UpdatedDateTime { get; set; }

        #endregion

        #region 属性--映射和级联构建

        /// <summary>

        /// 【角色集】

        /// <remarks>

        /// 摘要:

        ///     获取/设置1个指定用户实例所对应的所有角色实例。

        /// 说明:

        ///     构建用户与角色实体及其表之间的n:n映射关系,但在实现和逻辑定义实现上以用户为主。

        /// </remarks>

        /// </summary>

        public virtual ICollection<Role> RoleCollection { get; set; }

        /// <summary>

        /// 【用户角色映射集】

        /// <remarks>

        /// 摘要:

        ///     获取/设置1个指定用户实例所对应的所有用户角色映射实例。

        /// 说明:

        ///     构建用户与用户角色映射实体及其表之间的1:n映射关系,但在实现和逻辑定义实现上以用户为主。

        /// </remarks>

        /// </summary>

        public virtual ICollection<UserRole> UserRoleCollection { get; set; }

        #endregion

    }

}

1.5 Core.Domain.UserRole

namespace Core.Domain.Users

{

    /// <summary>

    /// 【用户角色映射--类】

    /// <remarks>

    /// 摘要:

    ///     1、通过该实体类及其属性成员,用于实现当前程序【Core.【领域】.【用户集】.【用户角色映射】实体与“[ShopDemo].[UserRole]”表之间的CURD的交互操作,并把这些数据存储到数据库设置实例中(内存)

    ///     2、构建用户实体与角色实例之间的n:n映射关系;构建用户表与角色表之间的n:n级联关系。

    /// </remarks>

    /// </summary>

    public class UserRole : BaseEntity

    {

        #region 属性

        /// <summary>

        /// 【用户编号】

        /// <remarks>

        /// 摘要:

        ///     获取/设置用户实体1个指定实例的长整型编号值。

        /// </remarks>

        /// </summary>

        public long UserId { get; set; }

        /// <summary>

        /// 【角色编号】

        /// <remarks>

        /// 摘要:

        ///     获取/设置角色实体1个指定实例的长整型编号值。

        /// </remarks>

        /// </summary>

        public long RoleId { get; set; }

        #endregion

        #region 属性--映射和级联构建

        /// <summary>

        /// 【单个用户】

        /// <remarks>

        /// 摘要:

        ///     获取/设置1个指定用户角映色射实例所对应的1个用户实例。

        /// 说明:

        ///     构建用户与用户角色映射实体及其表之间的1:n映射关系,但在实现和逻辑定义实现上以用户为主。

        /// </remarks>

        /// </summary>

        public virtual User UserSingle { get; set; }

        /// <summary>

        /// 【单个角色】

        /// <remarks>

        /// 摘要:

        ///     获取/设置1个指定用户角映色射实例所对应的1个角色实例。

        /// 说明:

        ///     构建角色与用户角色映射实体及其表之间的1:n映射关系,但在实现和逻辑定义实现上以角色为主。

        /// </remarks>

        /// </summary>

        public virtual Role RoleSingle{ get; set; }

        #endregion

    }

}

1.6 Core.Domain.Permission

namespace Core.Domain.Security

{

    /// <summary>

    /// 【权限--类】

    /// <remarks>

    /// 摘要:

    ///     通过该实体类及其属性成员,用于实现当前程序【Core.【领域】.【安全】.【权限】实体与“[ShopDemo].[权限]”表之间的CURD的交互操作,并把这些数据存储到数据库设置实例中(内存)

    /// </remarks>

    /// </summary>

    public class Permission : BaseEntity

    {

        #region 属性

        /// <summary>

        /// 【权限名】

        /// <remarks>

        /// 摘要:

        ///     获取/设置1个指定的权限名。

        /// </remarks>

        /// </summary>

        public string Name { get; set; }

        /// <summary>

        /// 【模块】

        /// <remarks>

        /// 摘要:

        ///     获取/设置1个指定权限实例所对应的模块名,即该模拟拥有该权限。

        /// </remarks>

        /// </summary>

        public string Category { get; set; }

        #endregion

        #region 属性--映射和级联构建

        /// <summary>

        /// 【权限角色映射集】

        /// <remarks>

        /// 摘要:

        ///     获取/设置1个指定权限实例所对应的所有权限角色映射实例。

        /// 说明:

        ///     构建权限与角色实体及其表之间的n:n映射关系,但在实现和逻辑定义实现上二者是平等关系。

        /// </remarks>

        /// </summary>

        public virtual ICollection<PermissionRole> PermissionRoleCollection { get; set; }

        #endregion

    }

}

1.7 Core.Domain. PermissionRole

//项目

using Core.Domain.Users;

namespace Core.Domain.Security

{

    /// <summary>

    /// 【权限角色映射--类】

    /// <remarks>

    /// 摘要:

    ///     1、通过该实体类及其属性成员,用于实现当前程序【Core.【领域】.【安全】.【权限角色映射】实体与“[ShopDemo].[PermissionRole]”表之间的CURD的交互操作,并把这些数据存储到数据库设置实例中(内存)

    ///     2、构建权限实体与角色实例之间的n:n映射关系;构建权限表与角色表之间的n:n级联关系。

    /// </remarks>

    /// </summary>

    public class PermissionRole : BaseEntity

    {

        #region 属性

        /// <summary>

        /// 【权限编号】

        /// <remarks>

        /// 摘要:

        ///     获取/设置权限实体1个指定实例的长整型编号值。

        /// </remarks>

        /// </summary>

        public long PermissionId { get; set; }

        /// <summary>

        /// 【角色编号】

        /// <remarks>

        /// 摘要:

        ///     获取/设置角色实体1个指定实例的长整型编号值。

        /// </remarks>

        /// </summary>

        public long RoleId { get; set; }

        #endregion

        #region 属性--映射和级联构建

        /// <summary>

        /// 【单个权限】

        /// <remarks>

        /// 摘要:

        ///     获取/设置1个指定权限角映色射实例所对应的1个权限实例。

        /// 说明:

        ///     构建权限与权限角色映射实体及其表之间的1:n映射关系,但在实现和逻辑定义实现上以权限为主。

        /// </remarks>

        /// </summary>

        public virtual Permission PermissionSingle { get; set; }

        /// <summary>

        /// 【单个角色】

        /// <remarks>

        /// 摘要:

        ///     获取/设置1个指定权限角映色射实例所对应的1个角色实例。

        /// 说明:

        ///     构建角色与权限角色映射实体及其表之间的1:n映射关系,但在实现和逻辑定义实现上以角色为主。

        /// </remarks>

        /// </summary>

        public virtual Role RoleSingle { get; set; }

        #endregion

    }

}

2  Data.EFCoreContext

//Nuget

//Nuget--Microsoft.EntityFrameworkCore.SqlServer

using Microsoft.EntityFrameworkCore;

//项目

using Core.Domain.Security;

using Core.Domain.Users;

namespace Data

{

    /// <summary>

    /// EFCore上下文】

    /// <remarks>

    /// 摘要:

    ///     基类构造方法通过该类构造方法中的参数实例,实例化了“Microsoft.EntityFrameworkCore.SqlServer”中间件,

    /// 以实现“Microsoft.EntityFrameworkCore.SqlServer”中间件与指定数据库(SQL Server)数据库软件中的指定数据库的连接,

    /// 最终达到实体与相应表之间通过“Microsoft.EntityFrameworkCore.SqlServer”中间件进行CURD的交互操作的目的(功能)

    /// </remarks>

    /// </summary>

    public class EFCoreContext : DbContext

    {

        #region 拷贝构造方法

        ///<param name="options">配置参数实例,通过配置参数实例,调用基类的拷贝构造方法以实现“Microsoft.EntityFrameworkCore.SqlServer”中间件与(SQL Server)数据库软件中指定数据库的连接。</param>

        /// <summary>

        /// 【拷贝构造方法】

        /// <remarks>

        /// 摘要:

        ///    基类构造方法通过该类构造方法中的参数实例,实例化了“Microsoft.EntityFrameworkCore.SqlServer”中间件,

        /// 以实现“Microsoft.EntityFrameworkCore.SqlServer”中间件与指定数据库(SQL Server)数据库软件中的指定数据库的连接,

        /// 最终达到实体与相应表之间通过“Microsoft.EntityFrameworkCore.SqlServer”中间件进行CURD的交互操作的目的(功能)

        /// </remarks>

        /// </summary>

        public EFCoreContext(DbContextOptions<EFCoreContext> options) : base(options)

        {

            //如果(SQL Server)数据库软件中没有指定的数据库, 当通过Code First模式时,在第1次生成数据库时,则通过下1行语句结合数据库连接字符串,在(SQL Server)数据库软件中生成指定的数据库数据库、表和字段。

            Database.EnsureCreated();

            /*

            如果(SQL Server)数据库软件中没有指定的数据库, 当通过Code First模式时,在第1次生成数据库时,则也通过下行执行迁移和更新命令行的结合数据库连接字符串,在(SQL Server)数据库软件中生成指定的数据库数据库、表和字段。

            Add-Migration Initialize(Initialize:自动生成的迁移类名,这里特指:20220803125612_Initialize.cs):

            Update-Database Initialize(通过自动生成的迁移类中的定义,自动在指定的数据库软件中生成指定的数据库、表、字段和约束规则)

             */

        }

        #endregion

        #region 属性

        /// <summary>

        /// 【角色数据库设置】

        /// <remarks>

        /// 摘要:

        ///      获取/设置角色实体的数据库设置实例,用于实现当前程序【Core.【领域】.【用户集】.【角色】实体与“[ShopDemo].[Role]”表之间的CURD的交互操作,并把这些数据存储到数据库设置实例中(内存)

        /// </remarks>

        /// </summary>

        public DbSet<Role> RoleDbSet { get; set; }

        /// <summary>

        /// 【用户数据库设置】

        /// <remarks>

        /// 摘要:

        ///      获取/设置用户实体的数据库设置实例,用于实现当前程序【Core.【领域】.【用户集】.【用户】实体与“[ShopDemo].[User]”表之间的CURD的交互操作,并把这些数据存储到数据库设置实例中(内存)

        /// </remarks>

        /// </summary>

        public DbSet<User> UserDbSet { get; set; }

        /// <summary>

        /// 【用户角色映射数据库设置】

        /// <remarks>

        /// 摘要:

        ///      获取/设置用户角色映射实体的数据库设置实例,用于实现当前程序【Core.【领域】.【用户集】.【用户角色映射】实体与“[ShopDemo].[UserRole]”表之间的CURD的交互操作,并把这些数据存储到数据库设置实例中(内存)

        /// </remarks>

        /// </summary>

        public DbSet<UserRole> UserRoleDbSet { get; set; }

        /// <summary>

        /// 【权限数据库设置】

        /// <remarks>

        /// 摘要:

        ///      获取/设置权限实体的数据库设置实例,用于实现当前程序【Core.【领域】.【安全】.【权限】实体与“[ShopDemo].[权限]”表之间的CURD的交互操作,并把这些数据存储到数据库设置实例中(内存)

        /// </remarks>

        /// </summary>

        public DbSet<Permission> PermissionDbSet { get; set; }

        /// <summary>

        /// 【权限角色映射数据库设置】

        /// <remarks>

        /// 摘要:

        ///      获取/设置权限角色映射实体的数据库设置实例,用于实现当前程序【Core.【领域】.【用户集】.【权限角色映射】实体与“[ShopDemo].[PermissionRole]”表之间的CURD的交互操作,并把这些数据存储到数据库设置实例中(内存)

        /// </remarks>

        /// </summary>

        public DbSet<PermissionRole> PermissionRoleDbSet { get; set; }

        #endregion

        #region 方法--私有/保护--覆写

        ///<param name="builder">模型生成器实例,用于把当前程序中实体和属性所定义的约束规则,映射到数据库指定表及其字段上。</param>

        /// <summary>

        /// 【模型生成执行...

        /// <remarks>

        /// 摘要:

        ///     该方法把当前程序中实体和属性所定义的约束规则,映射到数据库指定表及其字段上。

        /// </remarks>

        /// </summary>

        protected override void OnModelCreating(ModelBuilder builder)

        {

            //角色表及其字段约束规则,映射定义。

            builder.Entity<Role>().ToTable(nameof(Role));

            builder.Entity<Role>().HasKey(role => role.Id);

            builder.Entity<Role>().Property(role => role.Name).IsRequired().HasMaxLength(255);

            //用户表及其字段约束规则,映射定义。

            builder.Entity<User>().ToTable(nameof(User));

            builder.Entity<User>().HasKey(user => user.Id);

            builder.Entity<User>().Property(user => user.Name).IsRequired().HasMaxLength(255);

            builder.Entity<User>().Property(user => user.Email).IsRequired().HasMaxLength(255);

            builder.Entity<User>().Property(user => user.Password).IsRequired().HasMaxLength(255);

            builder.Entity<User>().Property(user => user.Phone).HasMaxLength(50);

            builder.Entity<User>().Property(user => user.RememberToken).HasMaxLength(500);

            builder.Entity<User>().Property(user => user.Avatar).HasMaxLength(255);

            builder.Entity<User>().Property(user => user.CreatedDateTime).IsRequired();

            builder.Entity<User>().Property(user => user.UpdatedDateTime).IsRequired();

            builder.Entity<User>().Ignore(user => user.RoleCollection);

            //用户角色映射表及其字段约束规则,映射定义。

            builder.Entity<UserRole>().ToTable(nameof(UserRole));

            builder.Entity<UserRole>().HasKey(userRole => new { userRole.UserId, userRole.RoleId });

            builder.Entity<UserRole>()

                .HasOne(userRole => userRole.UserSingle)

                .WithMany(user=>user.UserRoleCollection)

                .HasForeignKey(userRole => userRole.UserId)

                .IsRequired();

            builder.Entity<UserRole>()

                .HasOne(userRole => userRole.RoleSingle)

                .WithMany()

                .HasForeignKey(userRole=> userRole.RoleId)

                .IsRequired();

            builder.Entity<UserRole>().Ignore(userRole => userRole.Id);

            //权限表及其字段约束规则,映射定义。

            builder.Entity<Permission>().ToTable(nameof(Permission));

            builder.Entity<Permission>().HasKey(permission => permission.Id);

            builder.Entity<Permission>().Property(permission => permission.Name).IsRequired().HasMaxLength(255);

            builder.Entity<Permission>().Property(permission => permission.Category).IsRequired().HasMaxLength(500);

            //权限角色映射表及其字段约束规则,映射定义。

            builder.Entity<PermissionRole>().ToTable(nameof(PermissionRole));

            builder.Entity<PermissionRole>().HasKey(permissionRole => new { permissionRole.PermissionId, permissionRole.RoleId });

            builder.Entity<PermissionRole>()

                .HasOne(permissionRole => permissionRole.PermissionSingle)

                .WithMany(permission => permission.PermissionRoleCollection)

                .HasForeignKey(permissionRole => permissionRole.PermissionId)

                .IsRequired();

            builder.Entity<PermissionRole>()

                .HasOne(permissionRole => permissionRole.RoleSingle)

                .WithMany(role=>role.PermissionRoleCollection)

                .HasForeignKey(permissionRole => permissionRole.RoleId)

                .IsRequired();

            builder.Entity<PermissionRole>().Ignore(permissionRole => permissionRole.Id);

            base.OnModelCreating(builder);

        }

        #endregion

    }

}

3 启动项

3.1 appsettings.json

"ConnectionStrings": {

    //Trusted_Connection=trueIntegrated Security=true/SSPI:“Windows凭据SQL Server进行身份验证,表示可以在不知道数据库用户名和密码的情况下时,依然可以连接SQL Server数据库。

    //"integrated":"security=true是通过“Windows身份认证SQL Server数据库进行身份验证,并与SQL Server数据库进行连接;表示可以在不知道数据库用户名和密码的情况下时,依然可以连接SQL Server数据库,如果integrated", "security=false","或者不写,表示一定要输入正确的数据库登录名和密码。": null

    //Persist Security Info:该配置只用于通过“SQL Server身份认证SQL Server数据库进行身份验证,并与SQL Server数据库进行连接;简单的理解为"ADO在数据库连接成功后是否保存密码信息"True表示保存,False表示不保存.ADO缺省为True(ADO.net缺省为False,未测试,根据参考资料上说的)

    //MultipleActiveResultSets:它允许在单个连接上执行多重的数据库查询或存储过程,目前只适用于Sql Server 2005及其以上版本;如果不用MultipleActiveResultSets ,则一般报错为sqldatareader未关闭,即需要关闭了之后才能打开另一个。

    //Trust Server Certificate:是否使用SSL证书和加密方式,对SQL Server数据库的连接字符串进行加密,该操作属性安全性配置,目前只适用于Sql Server 2005及其以上版本;

    "SqlServerWindows": "Data Source=.;Initial Catalog=ShopDemo;Integrated Security=true;MultipleActiveResultSets=true;Trust Server Certificate=True"

    //"SqlServerSQL": "Data Source=.;Initial Catalog=ShopDemo;Integrated Security=False;Persist Security Info=False;User ID=zz;Password=zz;MultipleActiveResultSets=true;Trust Server Certificate=True"

  },

3.2 Program.cs

var builder = WebApplication.CreateBuilder(args);

//“Microsoft.EntityFrameworkCore.SqlServer”中间件实例,依赖注入到.Net(Core)6框架内置容器中。

builder.Services.AddDbContext<EFCoreContext>(

    //通过“DbContextOptionsBuilder”实例中的参数实例,为“Microsoft.EntityFrameworkCore.SqlServer”中间件的实例化提供参数实例,

    //最终把“Microsoft.EntityFrameworkCore.SqlServer”中间件实例,依赖注入到.Net(Core)6框架内置容器中。

    options => options.UseSqlServer(builder.Configuration.GetConnectionString("SqlServerWindows")));

builder.Services.AddControllers();

3.3 WebApi.Controllers.WeatherForecastController

using Core.Domain.Users;

using Data;

using Microsoft.AspNetCore.Mvc;

namespace WebApi.Controllers

{

    [ApiController]

    [Route("[controller]")]

    public class WeatherForecastController : ControllerBase

    {

        private readonly EFCoreContext _context;

        public WeatherForecastController(EFCoreContext context)

        {

            _context = context;

        }

        [HttpGet(Name = "GetWeatherForecast")]

        public IEnumerable<Role> Get()

        {

            return _context.RoleDbSet.ToList();

        }

    }

}

    按F5执行程序,执行“GetWeatherForecast”Api,即可自动生成数据库及其表。

    对以上功能更为具体实现和注释见:221219_001ShopDemo(数据及其表的自动生成)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值