通用权限管理组件
目前3天内搞定一个独立的内部管理系统,而且五脏俱全的是我从业10年左右的最快记录,当然若第二次做类似的东西,可能有希望2天内可以搞定了。 经过多年的积累,手上才会有一个运行稳定、可以灵活配置的B/S开发架构,虽然看看都很简单,但是最起码不断完善几年后,才会达到铜墙铁壁的程度,我们经常会发现,开发一个小小的软件,往往1个月也开发不完,很可能是由于没有稳定的B/S开发架构导致的,这个架构也不是说技术,就是一个美观的整体效果良好的运行稳定的B/S系统吧,从头开发的B/S架构,由于需要调整很多细节环节、特别是页面、菜单的美观设计等上会耗费很多精力。 有时候界面设计良好、程序思路严谨、用户交互效果好的B/S空框架也能卖出几万元,以前不能理解,现在是彻底能体会了,稳定的B/S架构的确可以值一些钱,因为是经过精雕细刻后才能形成最后的劳动成果的。 软件的大体效果做到这里,大概花费了3天时间、接下来可能要花费的时间会更多,应该不止3天了,可能是30天,因为很多业务上的细节会耗费很多时间来调整,例如新增页面的先后输入的内容,页面输入的检查、页面的美观设计、光标的顺序优化、回车优化,输入内容的完善补充等等,查询页面的排序顺序优化、查询内容的先后顺序排版、表格中各列的宽度调整,一些提醒颜色的优化等等会有很多细节问题上还要耗费很久时间的, 做软件其实就是做细节,你需要有一个良好的B/S开发框架,否则全部自己弄,不知道什么时候才能弄好,有个良好的框架、再有良好的例子程序,整个管理系统,就是一个量的问题了,其次就是很多细节的优化上,会花费很多时间。 有良好的稳定的B/S开发框架,前期工作只用了3天,若没有这个,从头开始做,可能30天也做不完,更不会把大多精力都花费在业务逻辑的细节优化上,可能更多的精力都耗费在B/S系统架构的稳定、优化上了,那这个软件的质量就更没保障了。 有了稳定的B/S开发框架后,才好进行大规模生产、大量招聘人员做开发工作,若这些都没有,招聘来一大堆开发人员,那很可能局面就乱套了,大家就容易乱来了。 ProjectManager.cs手工编写的商业逻辑代码如下: 代码 //------------------------------------------------------------
// All Rights Reserved , Copyright (C) 2010 , Jirisoft , Ltd .
//------------------------------------------------------------
using System;
using System.Data;
using System.Data.Common;
using System.Collections.Generic;
namespace Project
{
using DotNet.DbUtilities;
using DotNet.Manager;
using DotNet.Utilities;
using DotNet.Business;
/// <summary>
/// ProjectManager
/// 项目跟进表
///
/// 修改纪录
///
/// 2010-09-28 版本:1.0 JiRiGaLa 创建主键。
///
/// 版本:1.0
///
/// <author>
/// <name>JiRiGaLa</name>
/// <date>2010-09-28</date>
/// </author>
/// </summary>
public partial class ProjectManager : BaseManager, IBaseManager
{
public DataTable Search(string userId, string searchValue)
{
// 一、这里是开始进行动态SQL语句拼接,字段名、表明都进行了常量定义,表名字段名发生变化时,很容易就知道程序哪里都调用了这些。
string sqlQuery = string.Empty;
sqlQuery = " SELECT * "
+ " FROM " + this.CurrentTableName
+ " WHERE " + ProjectTable.FieldDeleteMark + " = 0 ";
// 二、我们认为 userId 这个查询条件是安全,不是人为输入的参数,所以直接进行了SQL语句拼接
if (!String.IsNullOrEmpty(userId))
{
sqlQuery += " AND " + ProjectTable.FieldCreateUserId + " = '" + userId + "'";
}
// 三、这里是进行参数化的准备,因为是多个不确定的查询参数,所以用了List。
List<DbParameter> dbParameters = new List<DbParameter>();
// 四、这里看查询条件是否为空
searchValue = searchValue.Trim();
if (!String.IsNullOrEmpty(searchValue))
{
// 五、这里是进行支持多种数据库的参数化查询
sqlQuery += " AND (" + ProjectTable.FieldKeHuMingCheng + " LIKE " + DbHelper.GetParameter(ProjectTable.FieldKeHuMingCheng);
sqlQuery += " OR " + ProjectTable.FieldKeHuXiangMuMingCheng + " LIKE " + DbHelper.GetParameter(ProjectTable.FieldKeHuXiangMuMingCheng);
sqlQuery += " OR " + ProjectTable.FieldCreateUserRealname + " LIKE " + DbHelper.GetParameter(ProjectTable.FieldCreateUserRealname);
sqlQuery += " OR " + ProjectTable.FieldDescription + " LIKE " + DbHelper.GetParameter(ProjectTable.FieldDescription) + ")";
// 六、这里是判断,用户是否已经输入了%
if (searchValue.IndexOf("%") < 0)
{
searchValue = "%" + searchValue + "%";
}
// 七、这里生成支持多数据库的参数
dbParameters.Add(DbHelper.MakeInParam(ProjectTable.FieldKeHuMingCheng, searchValue));
dbParameters.Add(DbHelper.MakeInParam(ProjectTable.FieldKeHuXiangMuMingCheng, searchValue));
dbParameters.Add(DbHelper.MakeInParam(ProjectTable.FieldCreateUserRealname, searchValue));
dbParameters.Add(DbHelper.MakeInParam(ProjectTable.FieldDescription, searchValue));
}
sqlQuery += " ORDER BY " + ProjectTable.FieldSortCode + " DESC ";
// 八、这里是将List转换为数组,进行数据库查询
return DbHelper.Fill(sqlQuery, dbParameters.ToArray());
}
/// <summary>
/// 更新(带有修改记录功能)
/// </summary>
/// <param name="projectEntity">实体</param>
/// <param name="changeLog">修改记录</param>
/// <returns>影响行数</returns>
public int Update(ProjectEntity projectEntity, bool changeLog)
{
// 若不需要修改记录
if (!changeLog)
{
return this.UpdateEntity(projectEntity);
}
String changeMessage = String.Empty;
// 获取原来的数据
ProjectEntity oldProjectEntity = this.GetEntity((int)projectEntity.Id);
if (oldProjectEntity.KeHuXiangMuMingCheng != projectEntity.KeHuXiangMuMingCheng)
{
changeMessage += "客户项目名称被修改为:" + projectEntity.KeHuXiangMuMingCheng + " 原值:" + oldProjectEntity.KeHuXiangMuMingCheng + "<br>";
}
if (oldProjectEntity.KeHuMingCheng != projectEntity.KeHuMingCheng)
{
changeMessage += "客户名称被修改为:" + projectEntity.KeHuMingCheng + " 原值:" + oldProjectEntity.KeHuMingCheng + "<br>";
}
if (oldProjectEntity.KaiGaiRiQi != projectEntity.KaiGaiRiQi)
{
// changeMessage += "开改模日期被修改为:" + ((DateTime)projectEntity.KaiGaiRiQi).ToString(BaseSystemInfo.DateFormat) + " 原值:" + ((DateTime)oldProjectEntity.KaiGaiRiQi).ToString(BaseSystemInfo.DateFormat) + "<br>";
}
if (!String.IsNullOrEmpty(changeMessage))
{
BaseCommentManager commentManager = new BaseCommentManager(this.DbHelper, this.UserInfo);
commentManager.Add("工程管理", projectEntity.Id.ToString(), projectEntity.KeHuXiangMuMingCheng, changeMessage, false, String.Empty, false, this.UserInfo.IPAddress);
}
return this.UpdateEntity(projectEntity);
}
}
} posted @ 2010-10-07 21:39 不仅仅是通用权限设计 阅读(6477) | 评论(99) | 编辑
下载 http://www.jirigala.tk/JiRiGaLa_FunctionPreview.wmv C# ASP.NET走火入魔通用权限管理_进行配置文件管理
下载 http://www.jirigala.tk/JiRiGaLa_Configuration.wmv C# ASP.NET走火入魔通用权限管理_登录功能01
下载 http://www.jirigala.tk/JiRiGaLa_Login01.wmv
C# ASP.NET走火入魔通用权限管理_登录功能02
下载 http://www.jirigala.tk/JiRiGaLa_Login02.wmv
C# ASP.NET走火入魔通用权限管理_登录功能03
下载 http://www.jirigala.tk/JiRiGaLa_Login03.wmv C# ASP.NET走火入魔通用权限管理_登录功能接口之说一 下载 http://www.jirigala.tk/JiRiGaLa_Interface01.wmv C# ASP.NET走火入魔通用权限管理_登录功能接口之说二 下载 http://www.jirigala.tk/JiRiGaLa_Interface02.wmv C# ASP.NET走火入魔通用权限管理_登录功能服务程序之说 下载 http://www.jirigala.tk/JiRiGaLa_Service.wmv C# ASP.NET走火入魔通用权限管理_登录功能服务程序多种运行模式之说 下载 http://www.jirigala.tk/JiRiGaLa_RunMode.wmv C# ASP.NET走火入魔通用权限管理_登录功能 B/S 架构之代码复用说
下载 http://www.jirigala.tk/JiRiGaLa_Code.wmv C# ASP.NET走火入魔通用权限管理_实体结构定义
下载 http://www.jirigala.tk/JiRiGaLa_Entities.wmv C# ASP.NET走火入魔通用权限管理_为什要用代码生成器(必要性) 下载 http://www.jirigala.tk/JiRiGaLa_CodeBuilder01.wmv C# ASP.NET走火入魔通用权限管理_代码生成器如何用(实战)
下载 http://www.jirigala.tk/JiRiGaLa_CodeBuilder02.wmv C# ASP.NET走火入魔通用权限管理_数据库设计注意思想指导
下载 http://www.jirigala.tk/JiRiGaLa_DbDesign.wmv C# ASP.NET走火入魔通用权限管理_添加角色数据
下载 http://www.jirigala.tk/JiRiGaLa_FrmRoleAdd01.wmv C# ASP.NET走火入魔通用权限管理_异常信息管理
下载 http://www.jirigala.tk/JiRiGaLa_Exception.wmv C# ASP.NET走火入魔通用权限管理_如何集成通用权限管理系统 下载 http://www.jirigala.tk/JiRiGaLa_Integration.wmv 配套软件购买地址 :http://item.taobao.com/item.htm?id=3430408842 相关下载 相关数据库设计免费下载:http://www.cnblogs.com/Files/jirigala/DotNet.DesignDocument.rar (PowerDesigner15格式) 说明文档免费下载:http://www.cnblogs.com/Files/jirigala/handbookV3.0.pdf 相关视频免费下载:http://www.cnblogs.com/jirigala/archive/2010/09/16/1828482.html ============================================================ posted @ 2010-09-16 23:03 不仅仅是通用权限设计 阅读(1187) | 评论(9) | 编辑
// All Rights Reserved , Copyright (C) 2010 , Jirisoft , Ltd .
//------------------------------------------------------------
using System;
using System.Data;
using System.Data.Common;
using System.Collections.Generic;
namespace Project
{
using DotNet.DbUtilities;
using DotNet.Manager;
using DotNet.Utilities;
using DotNet.Business;
/// <summary>
/// ProjectManager
/// 项目跟进表
///
/// 修改纪录
///
/// 2010-09-28 版本:1.0 JiRiGaLa 创建主键。
///
/// 版本:1.0
///
/// <author>
/// <name>JiRiGaLa</name>
/// <date>2010-09-28</date>
/// </author>
/// </summary>
public partial class ProjectManager : BaseManager, IBaseManager
{
public DataTable Search(string userId, string searchValue)
{
// 一、这里是开始进行动态SQL语句拼接,字段名、表明都进行了常量定义,表名字段名发生变化时,很容易就知道程序哪里都调用了这些。
string sqlQuery = string.Empty;
sqlQuery = " SELECT * "
+ " FROM " + this.CurrentTableName
+ " WHERE " + ProjectTable.FieldDeleteMark + " = 0 ";
// 二、我们认为 userId 这个查询条件是安全,不是人为输入的参数,所以直接进行了SQL语句拼接
if (!String.IsNullOrEmpty(userId))
{
sqlQuery += " AND " + ProjectTable.FieldCreateUserId + " = '" + userId + "'";
}
// 三、这里是进行参数化的准备,因为是多个不确定的查询参数,所以用了List。
List<DbParameter> dbParameters = new List<DbParameter>();
// 四、这里看查询条件是否为空
searchValue = searchValue.Trim();
if (!String.IsNullOrEmpty(searchValue))
{
// 五、这里是进行支持多种数据库的参数化查询
sqlQuery += " AND (" + ProjectTable.FieldKeHuMingCheng + " LIKE " + DbHelper.GetParameter(ProjectTable.FieldKeHuMingCheng);
sqlQuery += " OR " + ProjectTable.FieldKeHuXiangMuMingCheng + " LIKE " + DbHelper.GetParameter(ProjectTable.FieldKeHuXiangMuMingCheng);
sqlQuery += " OR " + ProjectTable.FieldCreateUserRealname + " LIKE " + DbHelper.GetParameter(ProjectTable.FieldCreateUserRealname);
sqlQuery += " OR " + ProjectTable.FieldDescription + " LIKE " + DbHelper.GetParameter(ProjectTable.FieldDescription) + ")";
// 六、这里是判断,用户是否已经输入了%
if (searchValue.IndexOf("%") < 0)
{
searchValue = "%" + searchValue + "%";
}
// 七、这里生成支持多数据库的参数
dbParameters.Add(DbHelper.MakeInParam(ProjectTable.FieldKeHuMingCheng, searchValue));
dbParameters.Add(DbHelper.MakeInParam(ProjectTable.FieldKeHuXiangMuMingCheng, searchValue));
dbParameters.Add(DbHelper.MakeInParam(ProjectTable.FieldCreateUserRealname, searchValue));
dbParameters.Add(DbHelper.MakeInParam(ProjectTable.FieldDescription, searchValue));
}
sqlQuery += " ORDER BY " + ProjectTable.FieldSortCode + " DESC ";
// 八、这里是将List转换为数组,进行数据库查询
return DbHelper.Fill(sqlQuery, dbParameters.ToArray());
}
/// <summary>
/// 更新(带有修改记录功能)
/// </summary>
/// <param name="projectEntity">实体</param>
/// <param name="changeLog">修改记录</param>
/// <returns>影响行数</returns>
public int Update(ProjectEntity projectEntity, bool changeLog)
{
// 若不需要修改记录
if (!changeLog)
{
return this.UpdateEntity(projectEntity);
}
String changeMessage = String.Empty;
// 获取原来的数据
ProjectEntity oldProjectEntity = this.GetEntity((int)projectEntity.Id);
if (oldProjectEntity.KeHuXiangMuMingCheng != projectEntity.KeHuXiangMuMingCheng)
{
changeMessage += "客户项目名称被修改为:" + projectEntity.KeHuXiangMuMingCheng + " 原值:" + oldProjectEntity.KeHuXiangMuMingCheng + "<br>";
}
if (oldProjectEntity.KeHuMingCheng != projectEntity.KeHuMingCheng)
{
changeMessage += "客户名称被修改为:" + projectEntity.KeHuMingCheng + " 原值:" + oldProjectEntity.KeHuMingCheng + "<br>";
}
if (oldProjectEntity.KaiGaiRiQi != projectEntity.KaiGaiRiQi)
{
// changeMessage += "开改模日期被修改为:" + ((DateTime)projectEntity.KaiGaiRiQi).ToString(BaseSystemInfo.DateFormat) + " 原值:" + ((DateTime)oldProjectEntity.KaiGaiRiQi).ToString(BaseSystemInfo.DateFormat) + "<br>";
}
if (!String.IsNullOrEmpty(changeMessage))
{
BaseCommentManager commentManager = new BaseCommentManager(this.DbHelper, this.UserInfo);
commentManager.Add("工程管理", projectEntity.Id.ToString(), projectEntity.KeHuXiangMuMingCheng, changeMessage, false, String.Empty, false, this.UserInfo.IPAddress);
}
return this.UpdateEntity(projectEntity);
}
}
} posted @ 2010-10-07 21:39 不仅仅是通用权限设计 阅读(6477) | 评论(99) | 编辑
[置顶]【经典C#.NET入门教程】管理软件开发必备知识免费视频教程下载
走火入魔通用权限管理视频讲解(娱乐大家、给生活加点儿料、突破思想框框),第三次录视频希望大家能谅解、都上传好了,给大家分享一下,不足之处请大家指点。 干事情需要要有激情,有力度,要像飞机的发动机一样有强有力的推动力,才容易不断进步走在行业领先的位置上。如何我们死去活来的做架构、做软件、做组件,然后又卖不出1毛钱,那还如在家休息看看电影逛逛街好了对身体也很好,搞那么累干啥?我们这么努力学技术,说白了,就是为了卖点儿钱不是? 感谢曾经的同事, 肖晓光给我们提供了视频空间,我在这里代表大家谢谢你了。 C# ASP.NET走火入魔通用权限管理_功能概要下载 http://www.jirigala.tk/JiRiGaLa_FunctionPreview.wmv C# ASP.NET走火入魔通用权限管理_进行配置文件管理
下载 http://www.jirigala.tk/JiRiGaLa_Configuration.wmv C# ASP.NET走火入魔通用权限管理_登录功能01
下载 http://www.jirigala.tk/JiRiGaLa_Login01.wmv
C# ASP.NET走火入魔通用权限管理_登录功能02
下载 http://www.jirigala.tk/JiRiGaLa_Login02.wmv
C# ASP.NET走火入魔通用权限管理_登录功能03
下载 http://www.jirigala.tk/JiRiGaLa_Login03.wmv C# ASP.NET走火入魔通用权限管理_登录功能接口之说一 下载 http://www.jirigala.tk/JiRiGaLa_Interface01.wmv C# ASP.NET走火入魔通用权限管理_登录功能接口之说二 下载 http://www.jirigala.tk/JiRiGaLa_Interface02.wmv C# ASP.NET走火入魔通用权限管理_登录功能服务程序之说 下载 http://www.jirigala.tk/JiRiGaLa_Service.wmv C# ASP.NET走火入魔通用权限管理_登录功能服务程序多种运行模式之说 下载 http://www.jirigala.tk/JiRiGaLa_RunMode.wmv C# ASP.NET走火入魔通用权限管理_登录功能 B/S 架构之代码复用说
下载 http://www.jirigala.tk/JiRiGaLa_Code.wmv C# ASP.NET走火入魔通用权限管理_实体结构定义
下载 http://www.jirigala.tk/JiRiGaLa_Entities.wmv C# ASP.NET走火入魔通用权限管理_为什要用代码生成器(必要性) 下载 http://www.jirigala.tk/JiRiGaLa_CodeBuilder01.wmv C# ASP.NET走火入魔通用权限管理_代码生成器如何用(实战)
下载 http://www.jirigala.tk/JiRiGaLa_CodeBuilder02.wmv C# ASP.NET走火入魔通用权限管理_数据库设计注意思想指导
下载 http://www.jirigala.tk/JiRiGaLa_DbDesign.wmv C# ASP.NET走火入魔通用权限管理_添加角色数据
下载 http://www.jirigala.tk/JiRiGaLa_FrmRoleAdd01.wmv C# ASP.NET走火入魔通用权限管理_异常信息管理
下载 http://www.jirigala.tk/JiRiGaLa_Exception.wmv C# ASP.NET走火入魔通用权限管理_如何集成通用权限管理系统 下载 http://www.jirigala.tk/JiRiGaLa_Integration.wmv 配套软件购买地址 :http://item.taobao.com/item.htm?id=3430408842 相关下载 相关数据库设计免费下载:http://www.cnblogs.com/Files/jirigala/DotNet.DesignDocument.rar (PowerDesigner15格式) 说明文档免费下载:http://www.cnblogs.com/Files/jirigala/handbookV3.0.pdf 相关视频免费下载:http://www.cnblogs.com/jirigala/archive/2010/09/16/1828482.html ============================================================ posted @ 2010-09-16 23:03 不仅仅是通用权限设计 阅读(1187) | 评论(9) | 编辑
[置顶]10年磨一剑,软件编程走火入魔之:把简单的功能做个彻彻底底、把劳动成果重复利用
让管理软件开发人员早点儿回家休息,做个跟老外有的一PK的软件组件,铜墙铁壁的权限组件。 年轻时、精力旺盛,有用不完的劲儿,但是工作经验不多,对各种行业实际应用没有深入的了解,大多停留在表面问题上,做不出过硬的有质量的软件组件来,刚精通C#程序时,发现又需要精通C/S、B/S才可以,这时又发现自己的数据库技术不过关,等刚掌握了SQLServer,又发现自己不懂Oralce,也不懂MySql,自己写出来的程序又不兼容这些数据库,等数据库也都精通了一些,发现自己的写文档能力不行,做个像样的东西非常不容易。 这时又发现自己的设计能力不行,等把设计能力也提高了,发现写文档的表达能力还是不行,等自己的表达能力也变得很强了,对各种行业应用也开始有了深入的了解,技术又变了很多,以前积累的技术又淘汰了。 当这些能力都接近已具备时,发现自己从早上忙到晚上,根本没有精力去写一个理想中的软件来,工作上的、家庭上的杂事也变得多如毛,当能力提高到了一定的境界后,普通人做出来的东西也都看不上了,也都不能放心了,因为知道得太多了,就能找出太多的问题了,但是自己又往往没那么多精力、空去做这个心目中的东东。 当真的全身心去投入了,去精心制作了这个东西后又发现这个东西,市场定位错了,只有很少数的人才肯花钱购买这个东东,所以成功很难,不仅需要有能力、而且需要更准确的市场定位能力,你做出来的软件?谁为此买单? 把设计文档写好、把程序写好、把操作手册写好,又要有一定的深度广度,的确也不是很容易;虽然我没有惊人的技术能力,但是我用了接近前后10年,不断完善改进这么一个很简单的功能,把这个简单的功能,做个彻彻底底,能达到真正的产品化的重复利用的要求,花费了2个月的业余时间,精心把使用手册编写完毕了,虽然软件没有开源,但是大部分的功能都写出来了,有做权限方面的开发人员,可以有一定的参考作用。 权限管理涉及的东西太多了,他需要涉及到数据库、要涉及到用户、组织机构、角色、日志、序列生成器、开发框架、甚至代码生成器,页面操作、底层存储结构设计等等方方面面,说是开发通用权限组件还不如是说:“轻量级的快速管理类软件开发平台”也不过分的。 既然爱好这个,又投入了这么多年的心血,也就不差再投入几年,再深入研究、再不断推广了,把一个简单的东西做个彻彻底底,做个真正对开发人员有帮助,能解放开发人员的部分工作,能把劳动成果重复利用10次、100次、1000次、10000次,那就足够有把这个功能模块做个彻底质量过关,让大家彻底能认可的意义了,一个人只能做好那么几件事情,若是人人都有那么几件事情彻底做好了,舍得全身心去研究完善,那我们软件开发人员也没必要那么累了,都可以早点儿回家休息了,因为我们有很多可重复利用的组建、可提高我们工作效率的懒人工具。 小时候亲眼见过也亲身体验过人耕牛拉式的辛勤种地;社会总是需要有人冒险,去发明、研究、制造、改进拖拉机,虽然为此付出的代价会很高很高,但是用拖拉机种地效率就高很多产值也会高很多,大家也可以从繁重的体力劳动解放出来,虽然购买拖拉机要花钱、平时还需要烧油。 但是大家都不舍得购买拖拉机、平时也不舍得烧油,那只能继续“人耕牛拉”了,牛总比拖拉机便宜很多,平时吃草就可以了有点也很多,还环保底炭。通用权限管理组件、轻量级的快速管理类软件开发平台能成为大家学习开发软件的拖拉机、开发软件的拖拉机。 以下部分是花费了接近2个月时间,精心编写的部分使用说明,虽然有些广告夹杂,但是认真对待了每篇文章的说明、希望有兴趣的朋友,可以补充完善、让有需要的人能直接重复利用、逐渐完善成大家都能认可的精品软件组件,大家都可以参考对比的标准权限功能。 人有追求有目标也是个闹心的事情、达不到目的,睡不好,吃不好,总想达到自己的目的,白天想、晚上想,几天、几周、几个月、几年都过的很快,人有追求了,也就不迷茫了,也就不腐败了,也不会堕落了,也挺有意思的。就把一个简单的东西做个精品出来,能彻底重复利用、没多大必要再重新开发,也别浪费人力物力了,该休息就休息、该早点儿回家就回家,该干啥就干啥吧。转载于:https://blog.51cto.com/2347979/428659
总结
- 上一篇: 用SMS2003部署Windows XP
- 下一篇: 配置多台三层交换VLAN间相互通信