-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
6 changed files
with
577 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -23,3 +23,4 @@ bld/ | |
*.nupkg | ||
/BinTest | ||
/BinUnitTest | ||
/Samples/DatabaseTest/Entity/Config |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
<?xml version="1.0" encoding="utf-8"?> | ||
<EntityModel xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:schemaLocation="https://newlifex.com https://newlifex.com/Model202309.xsd" Document="https://newlifex.com/xcode/model" xmlns="https://newlifex.com/Model202309.xsd"> | ||
<Option> | ||
<!--类名模板。其中{name}替换为Table.Name,如{name}Model/I{name}Dto等--> | ||
<ClassNameTemplate /> | ||
<!--显示名模板。其中{displayName}替换为Table.DisplayName--> | ||
<DisplayNameTemplate /> | ||
<!--基类。可能包含基类和接口,其中{name}替换为Table.Name--> | ||
<BaseClass>Entity</BaseClass> | ||
<!--命名空间--> | ||
<Namespace>DatabaseTest.Data</Namespace> | ||
<!--输出目录--> | ||
<Output>.\</Output> | ||
<!--是否使用中文文件名。默认false--> | ||
<ChineseFileName>True</ChineseFileName> | ||
<!--用于生成Copy函数的参数类型。例如{name}或I{name}--> | ||
<ModelNameForCopy /> | ||
<!--带有索引器。实现IModel接口--> | ||
<HasIModel>True</HasIModel> | ||
<!--可为null上下文。生成String?等--> | ||
<Nullable>True</Nullable> | ||
<!--数据库连接名--> | ||
<ConnName>Test</ConnName> | ||
<!--模型类模版。设置后生成模型类,用于接口数据传输,例如{name}Model--> | ||
<ModelClass /> | ||
<!--模型类输出目录。默认当前目录的Models子目录--> | ||
<ModelsOutput>.\Models\</ModelsOutput> | ||
<!--模型接口模版。设置后生成模型接口,用于约束模型类和实体类,例如I{name}--> | ||
<ModelInterface /> | ||
<!--模型接口输出目录。默认当前目录的Interfaces子目录--> | ||
<InterfacesOutput>.\Interfaces\</InterfacesOutput> | ||
<!--用户实体转为模型类的模型类。例如{name}或{name}DTO--> | ||
<ModelNameForToModel /> | ||
<!--命名格式。Default/Upper/Lower/Underline--> | ||
<NameFormat>Default</NameFormat> | ||
<!--魔方区域显示名--> | ||
<DisplayName /> | ||
<!--魔方控制器输出目录--> | ||
<CubeOutput /> | ||
</Option> | ||
<Tables> | ||
<Table Name="Member" Description="用户。用户帐号信息,以身份验证为中心,拥有多种角色,可加入多个租户"> | ||
<Columns> | ||
<Column Name="Id" DataType="Int32" Identity="True" PrimaryKey="True" Description="编号" /> | ||
<Column Name="Name" DataType="String" Master="True" Nullable="False" Description="名称。登录用户名" /> | ||
<Column Name="Password" DataType="String" Length="200" Description="密码" /> | ||
<Column Name="DisplayName" DataType="String" Description="昵称" /> | ||
<Column Name="Sex" DataType="Int32" Description="性别。未知、男、女" Type="XCode.Membership.SexKinds" /> | ||
<Column Name="Mail" DataType="String" ItemType="mail" Description="邮件。支持登录" /> | ||
<Column Name="Mobile" DataType="String" ItemType="mobile" Description="手机。支持登录" /> | ||
<Column Name="Enable" DataType="Boolean" Description="启用" Category="登录信息" /> | ||
<Column Name="UpdateUser" DataType="String" Nullable="False" DefaultValue="''" Description="更新者" Model="False" Category="扩展" /> | ||
<Column Name="UpdateUserID" DataType="Int32" Description="更新用户" Model="False" Category="扩展" /> | ||
<Column Name="UpdateIP" DataType="String" Description="更新地址" Model="False" Category="扩展" /> | ||
<Column Name="UpdateTime" DataType="DateTime" Nullable="False" Description="更新时间" Model="False" Category="扩展" /> | ||
<Column Name="Remark" DataType="String" Length="500" Description="备注" Category="扩展" /> | ||
</Columns> | ||
<Indexes> | ||
<Index Columns="Name" Unique="True" /> | ||
<Index Columns="Mail" /> | ||
<Index Columns="Mobile" /> | ||
<Index Columns="UpdateTime" /> | ||
</Indexes> | ||
</Table> | ||
</Tables> | ||
</EntityModel> |
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,228 @@ | ||
using System; | ||
using System.Collections.Generic; | ||
using System.ComponentModel; | ||
using System.ComponentModel.DataAnnotations; | ||
using System.IO; | ||
using System.Linq; | ||
using System.Reflection; | ||
using System.Runtime.Serialization; | ||
using System.Text; | ||
using System.Threading.Tasks; | ||
using System.Web; | ||
using System.Web.Script.Serialization; | ||
using System.Xml.Serialization; | ||
using NewLife; | ||
using NewLife.Data; | ||
using NewLife.Log; | ||
using NewLife.Model; | ||
using NewLife.Reflection; | ||
using NewLife.Threading; | ||
using NewLife.Web; | ||
using XCode; | ||
using XCode.Cache; | ||
using XCode.Configuration; | ||
using XCode.DataAccessLayer; | ||
using XCode.Membership; | ||
using XCode.Shards; | ||
|
||
namespace DatabaseTest.Data; | ||
|
||
public partial class Member : Entity<Member> | ||
{ | ||
#region 对象操作 | ||
static Member() | ||
{ | ||
// 累加字段,生成 Update xx Set Count=Count+1234 Where xxx | ||
//var df = Meta.Factory.AdditionalFields; | ||
//df.Add(nameof(Sex)); | ||
|
||
// 过滤器 UserModule、TimeModule、IPModule | ||
Meta.Modules.Add<UserModule>(); | ||
Meta.Modules.Add<TimeModule>(); | ||
Meta.Modules.Add<IPModule>(); | ||
|
||
// 单对象缓存 | ||
var sc = Meta.SingleCache; | ||
sc.FindSlaveKeyMethod = k => Find(_.Name == k); | ||
sc.GetSlaveKeyMethod = e => e.Name; | ||
} | ||
|
||
/// <summary>验证并修补数据,通过抛出异常的方式提示验证失败。</summary> | ||
/// <param name="isNew">是否插入</param> | ||
public override void Valid(Boolean isNew) | ||
{ | ||
// 如果没有脏数据,则不需要进行任何处理 | ||
if (!HasDirty) return; | ||
|
||
// 这里验证参数范围,建议抛出参数异常,指定参数名,前端用户界面可以捕获参数异常并聚焦到对应的参数输入框 | ||
if (Name.IsNullOrEmpty()) throw new ArgumentNullException(nameof(Name), "名称不能为空!"); | ||
|
||
// 建议先调用基类方法,基类方法会做一些统一处理 | ||
base.Valid(isNew); | ||
|
||
// 在新插入数据或者修改了指定字段时进行修正 | ||
// 处理当前已登录用户信息,可以由UserModule过滤器代劳 | ||
/*var user = ManageProvider.User; | ||
if (user != null) | ||
{ | ||
if (!Dirtys[nameof(UpdateUserID)]) UpdateUserID = user.ID; | ||
}*/ | ||
//if (!Dirtys[nameof(UpdateTime)]) UpdateTime = DateTime.Now; | ||
//if (!Dirtys[nameof(UpdateIP)]) UpdateIP = ManageProvider.UserHost; | ||
|
||
// 检查唯一索引 | ||
// CheckExist(isNew, nameof(Name)); | ||
} | ||
|
||
///// <summary>首次连接数据库时初始化数据,仅用于实体类重载,用户不应该调用该方法</summary> | ||
//[EditorBrowsable(EditorBrowsableState.Never)] | ||
//protected override void InitData() | ||
//{ | ||
// // InitData一般用于当数据表没有数据时添加一些默认数据,该实体类的任何第一次数据库操作都会触发该方法,默认异步调用 | ||
// if (Meta.Session.Count > 0) return; | ||
|
||
// if (XTrace.Debug) XTrace.WriteLine("开始初始化Member[用户]数据……"); | ||
|
||
// var entity = new Member(); | ||
// entity.Name = "abc"; | ||
// entity.Password = "abc"; | ||
// entity.DisplayName = "abc"; | ||
// entity.Sex = 0; | ||
// entity.Mail = "abc"; | ||
// entity.Mobile = "abc"; | ||
// entity.Enable = true; | ||
// entity.UpdateUser = "abc"; | ||
// entity.UpdateUserID = 0; | ||
// entity.UpdateIP = "abc"; | ||
// entity.UpdateTime = DateTime.Now; | ||
// entity.Remark = "abc"; | ||
// entity.Insert(); | ||
|
||
// if (XTrace.Debug) XTrace.WriteLine("完成初始化Member[用户]数据!"); | ||
//} | ||
|
||
///// <summary>已重载。基类先调用Valid(true)验证数据,然后在事务保护内调用OnInsert</summary> | ||
///// <returns></returns> | ||
//public override Int32 Insert() | ||
//{ | ||
// return base.Insert(); | ||
//} | ||
|
||
///// <summary>已重载。在事务保护范围内处理业务,位于Valid之后</summary> | ||
///// <returns></returns> | ||
//protected override Int32 OnDelete() | ||
//{ | ||
// return base.OnDelete(); | ||
//} | ||
#endregion | ||
|
||
#region 扩展属性 | ||
#endregion | ||
|
||
#region 扩展查询 | ||
/// <summary>根据编号查找</summary> | ||
/// <param name="id">编号</param> | ||
/// <returns>实体对象</returns> | ||
public static Member FindById(Int32 id) | ||
{ | ||
if (id <= 0) return null; | ||
|
||
//// 实体缓存 | ||
//if (Meta.Session.Count < 1000) return Meta.Cache.Find(e => e.Id == id); | ||
|
||
//// 单对象缓存 | ||
//return Meta.SingleCache[id]; | ||
|
||
return Find(_.Id == id); | ||
} | ||
|
||
/// <summary>根据名称查找</summary> | ||
/// <param name="name">名称</param> | ||
/// <returns>实体对象</returns> | ||
public static Member FindByName(String name) | ||
{ | ||
if (name.IsNullOrEmpty()) return null; | ||
|
||
//// 实体缓存 | ||
//if (Meta.Session.Count < 1000) return Meta.Cache.Find(e => e.Name.EqualIgnoreCase(name)); | ||
|
||
// 单对象缓存 | ||
//return Meta.SingleCache.GetItemWithSlaveKey(name) as Member; | ||
|
||
return Find(_.Name == name); | ||
} | ||
|
||
/// <summary>根据邮件查找</summary> | ||
/// <param name="mail">邮件</param> | ||
/// <returns>实体列表</returns> | ||
public static IList<Member> FindAllByMail(String mail) | ||
{ | ||
if (mail.IsNullOrEmpty()) return new List<Member>(); | ||
|
||
// 实体缓存 | ||
if (Meta.Session.Count < 1000) return Meta.Cache.FindAll(e => e.Mail.EqualIgnoreCase(mail)); | ||
|
||
return FindAll(_.Mail == mail); | ||
} | ||
|
||
/// <summary>根据手机查找</summary> | ||
/// <param name="mobile">手机</param> | ||
/// <returns>实体列表</returns> | ||
public static IList<Member> FindAllByMobile(String mobile) | ||
{ | ||
if (mobile.IsNullOrEmpty()) return new List<Member>(); | ||
|
||
// 实体缓存 | ||
if (Meta.Session.Count < 1000) return Meta.Cache.FindAll(e => e.Mobile.EqualIgnoreCase(mobile)); | ||
|
||
return FindAll(_.Mobile == mobile); | ||
} | ||
#endregion | ||
|
||
#region 高级查询 | ||
/// <summary>高级查询</summary> | ||
/// <param name="name">名称。登录用户名</param> | ||
/// <param name="mail">邮件。支持登录</param> | ||
/// <param name="mobile">手机。支持登录</param> | ||
/// <param name="start">更新时间开始</param> | ||
/// <param name="end">更新时间结束</param> | ||
/// <param name="key">关键字</param> | ||
/// <param name="page">分页参数信息。可携带统计和数据权限扩展查询等信息</param> | ||
/// <returns>实体列表</returns> | ||
public static IList<Member> Search(String name, String mail, String mobile, DateTime start, DateTime end, String key, PageParameter page) | ||
{ | ||
var exp = new WhereExpression(); | ||
|
||
if (!name.IsNullOrEmpty()) exp &= _.Name == name; | ||
if (!mail.IsNullOrEmpty()) exp &= _.Mail == mail; | ||
if (!mobile.IsNullOrEmpty()) exp &= _.Mobile == mobile; | ||
exp &= _.UpdateTime.Between(start, end); | ||
if (!key.IsNullOrEmpty()) exp &= _.Name.Contains(key) | _.Password.Contains(key) | _.DisplayName.Contains(key) | _.Mail.Contains(key) | _.Mobile.Contains(key) | _.UpdateUser.Contains(key) | _.UpdateIP.Contains(key) | _.Remark.Contains(key); | ||
|
||
return FindAll(exp, page); | ||
} | ||
|
||
// Select Count(Id) as Id,Mail From Member Where CreateTime>'2020-01-24 00:00:00' Group By Mail Order By Id Desc limit 20 | ||
static readonly FieldCache<Member> _MailCache = new FieldCache<Member>(nameof(Mail)) | ||
{ | ||
//Where = _.CreateTime > DateTime.Today.AddDays(-30) & Expression.Empty | ||
}; | ||
|
||
/// <summary>获取邮件列表,字段缓存10分钟,分组统计数据最多的前20种,用于魔方前台下拉选择</summary> | ||
/// <returns></returns> | ||
public static IDictionary<String, String> GetMailList() => _MailCache.FindAllName(); | ||
|
||
// Select Count(Id) as Id,Mobile From Member Where CreateTime>'2020-01-24 00:00:00' Group By Mobile Order By Id Desc limit 20 | ||
static readonly FieldCache<Member> _MobileCache = new FieldCache<Member>(nameof(Mobile)) | ||
{ | ||
//Where = _.CreateTime > DateTime.Today.AddDays(-30) & Expression.Empty | ||
}; | ||
|
||
/// <summary>获取手机列表,字段缓存10分钟,分组统计数据最多的前20种,用于魔方前台下拉选择</summary> | ||
/// <returns></returns> | ||
public static IDictionary<String, String> GetMobileList() => _MobileCache.FindAllName(); | ||
#endregion | ||
|
||
#region 业务操作 | ||
#endregion | ||
} |
Oops, something went wrong.