您的位置:首页 > 运维架构 > 网站架构

【分享】一个通用强大的主数据管理系统(架构设计讲解及源码下载)

2011-11-07 03:41 1141 查看
  这篇文章要讲主数据管理系统(Master Data Management System),是本人创业的其中一个项目,用于管理公司的内部所有系统、系统用户、系统角色、系统权限、服务器管理、系统日志等数据。项目开发只用了1个多月时间,全部由一个人完成的,目前只是个初版本,只满足了初期的需求,如果没时间看下面的架构设计,可以直接下载源码。

点击下载源码

在线demo: http://mdms.kudystudio.com/

用户/密码:test1/test1 test2/test2 (注:同一用户在另一浏览器登录,另一用户在session失效后会被逼下线)

不少朋友下载源码后不怎么知道运行,请看这里补充的说明:

项目使用vs2010打开,数据使用sql server2005/2008

一、数据库创建与初始化数据

新建名为 Db_MDMS 的数据库

然后按顺序执行目录 Documents\MDMS.Documents\DB 1.0\Scripts 里的sql

1_tables.sql
2_functions.sql
3_stored-procedures.sql
4_init_data.sql

二、修改数据库连接信息
在目录 build\MSH 里修改 MSH.exe.config 的配置节点 MDMS.Db_ConnectionString 的值

三、
在vs2010中运行Web项目 MDMS.Web 或右键选择 default.aspx 页面点击在浏览器中浏览,然后打开目录 build\MSH ,双击MSH.exe运行之

这时,你可以用默认用户/密码 admin/admin888 登录系统了

  主数据管理问题存在的根源
  对于大多数的企业都存在主数据管理的问题,个人以为这是由于业务发展的渐进性以及IT技术发展的渐进性造成的,正是由于这种渐进性,各大企业的业务系统从经历了从无到有,从简单到复杂,从而形成了一个又一个的业务竖井。从根本上来说,不可能只使用一个业务系统就能覆盖企业的所有业务,即便对一些国际大型的公司提供的套件来说也是一个不可能完成的任务(即便对套件来说,经常也存在一个跨国企业在不同的国家或地区部署多个实例的现象,也就是没有集中部署该套件,而是在很多地方分散部署了该套件)。对企业来说,业务系统的构建更多是以项目为中心,从下而上的构建系统,而不是至上而下的构建系统——这必然缺乏整个企业范围内的统一规划,从而使得一些需要在各个业务中共享的数据(主数据)被分散到了各个业务系统进行分别管理。由于分散管理的主数据不具备一致性、准确性、完整性,使得各个企业普遍存在着产品管理不力、供应商管理不力、订单管理不力等现象。解决这一问题的根本方法就是引入主数据管理(MDM),主数据不光指需要共享的数据,更包含需要共享的业务规则和策略。

一、主要功能需求

  1.公司内部系统的管理,包括管理系统信息、系统权限定义、系统角色、系统角色拥有的权限等等。

  2.统一的用户管理,包括管理用户信息、登录系统的限制、个人在各个系统的角色、个人在各个系统的永久与临时权限等等。

  3.各系统的日志记录与查看。

  4.服务器的管理。(说明一下,这里只是管理服务器的信息,数据是提供给一个专门管理服务器远程登录的子系统的)

  ...其它扩展需求(多语言目前不需要,但MTV框架已实现了)

二、主要界面展示

1.主界面

UserProvider

///<summary>
/// 用户接口实现
///</summary>
public sealed class UserProvider : ProviderBase, IUserProvider
{
public bool Add(string userName, string password, string passwordSalt, UserGender gender, string realName, string email, string mobile, UserStatus status)
{
object value = ExecuteNonQueryWithReturnValueParameter("SP_MDMS_User_Add", userName, password, passwordSalt, gender, realName, email, mobile, status);

return (Convert.ToInt32(value) > 0);
}

public bool EditById(Guid id, string password, string passwordSalt, UserGender gender, string realName, string email, string mobile, UserStatus status)
{
object value = ExecuteNonQueryWithReturnValueParameter("SP_MDMS_User_EditById", id, password, passwordSalt, gender, realName, email, mobile, status);

return (Convert.ToInt32(value) > 0);
}

public bool EditPasswordByUserName(string userName, string password, string passwordSalt)
{
object value = ExecuteNonQueryWithReturnValueParameter("SP_MDMS_User_EditPasswordByUserName", userName, password, passwordSalt);

return (Convert.ToInt32(value) > 0);
}

public bool DeleteByIds(Guid[] ids)
{
object value = ExecuteNonQueryWithReturnValueParameter("SP_MDMS_User_DeleteByIds", SqlServerHelper.ToCommaString(ids));

return (Convert.ToInt32(value) > 0);
}

public bool SetStatusByIds(Guid[] ids, UserStatus status)
{
object value = ExecuteNonQueryWithReturnValueParameter("SP_MDMS_User_SetStatusByIds", SqlServerHelper.ToCommaString(ids), (byte)status);

return (Convert.ToInt32(value) > 0);
}

public UserModel GetById(Guid id)
{
return GetModel(GetUserModel, "SP_MDMS_User_GetById", id);
}

public UserModel GetByUserName(string userName)
{
return GetModel(GetUserModel, "SP_MDMS_User_GetByUserName", userName);
}

public PagedList<UserModel> GetPagedList(string userName, UserGender? gender, UserStatus? status, int pageSize, int pageIndex)
{
PagedSqlParameters sqlParameters = new PagedSqlParameters()
{
SelectExpression = "*",
FromExpression = "[dbo].[User]",
MasterTable = "[dbo].[User]",
MasterPrimaryKey = "[Id]",
AutoIncrementKeyMode = false,
WhereExpression = string.Empty,
OrderExpression = "[CreateDate]",
Descending = true,
MaxPageIndex = 0,
PageSize = pageSize,
PageIndex = pageIndex
};

if (!string.IsNullOrEmpty(userName))
{
sqlParameters.WhereExpression += " AND [UserName] LIKE '%" + SqlServerHelper.EscapeLike(userName) + "%'";
}
if (gender.HasValue)
{
sqlParameters.WhereExpression += " AND [Gender]=" + ((byte)gender.Value).ToString();
}
if (status.HasValue)
{
sqlParameters.WhereExpression += " AND [Status]=" + ((byte)status.Value).ToString();
}

return GetPagedList(GetUserModel, sqlParameters);
}

private UserModel GetUserModel(DataReader reader)
{
return new UserModel
{
Id = reader.GetGuid("Id"),
UserName = reader.GetString("UserName").Trim(),
Password = reader.GetString("Password"),
PasswordSalt = reader.GetString("PasswordSalt"),
Gender = (UserGender)reader.GetByte("Gender"),
RealName = reader.GetString("RealName").Trim(),
Email = reader.GetString("Email"),
Mobile = reader.GetString("Mobile").Trim(),
Status = (UserStatus)reader.GetByte("Status"),
CreateDate = reader.GetDateTime("CreateDate")
};
}
}


.....其它省略....

四、子系统怎么与主数据管理系统整合?

只要继承 MDMS.UserApiModule 项目里的ServiceContextBase类,就可以很轻松的实现用户的登录,退出,添加日志,读取权限等操作,其中主数据管理系统也作为了其中的一个子系统来管理了,可以参考此系统是怎么整合的,时间问题,不想再多写解说了。请谅解。

另一文中讲解了此系统的权限设计方案:如何给多个子系统设计一个简单通用的权限管理方案?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐