写这篇文章之前先吐槽一下,最近换了一个公司,是给一个国企做外包,有两个月了,感觉这里的气氛有点不爽,还有点怀念以前的公司。具体听我说来,这里有几个团队,.net,java,手机开发,.net只有6个人,其他团队都很多人,没办法,这个貌似国际惯例了。

  用.net在这里开发一个类似展示信息的系统,是航空公司的运营信息,包括飞机,跑道,地勤,机场等。java做的是飞机排班系统,一听说明白,.net受歧视啊。这个还不是最主要的,我们做的这个系统没有什么重要的逻辑,无非是展示一下表,图等,但是项目经理给我们传达的思想是:他的头头是一个非常有“主见”的老大,对这个系统要求很严格,不断的提出各种新的想法,起初用的telerik控件,底层用的本地webservice+ado.net访问数据,我开始就疑问,这本地的webservice意义何在,还不如直接用ado.net访问呢,还有telerik控件比asp.net控件好看一些,但是效率不怎么样,最终系统中几个重要的页面很慢,部署到服务器中之后访问达不到预期的效果。

  后来改用mvc+easyui,本来也没什么,但是要将easyui中的控件包装成控件,就是直接在cshtml中可以配置,不写js代码这样的,本来mvc也不是很熟,还要包装成easyui标签控件,结果项目进展很缓慢。貌似老大们的IT意识很强,这样做是为了减轻前段程序员的工作量,但是easyui都不熟,包装谈何容易。

  总之两个字:“折腾”。可能这就是国企的特点吧。

  吐槽结束,以上的遭遇让我想起去年给一个大学同学的图书销售公司写的一个小系统,这个主要是为了他们员工使用excel来记录众多繁杂的信息,可以说是一个小的erp系统。技术是最简单易懂的,最直接的,开发速度是比较快的,最后效果是过得去的。在这里跟大家分享一下。

1.需求

主要的模块如下,需求还是很简单的,就是一些对象的增删改查。

1.业务管理,包含图书,客户,业务
2.订单管理,订单编辑,订单搜索
3.人事管理,主要是业务员的工作量
4.系统配置,主要是维护图书销售的区域和学校

2.UI设计

  因为他们主要矛盾是解决excel过大造成的操作困难这种最原始的需求,所以对UI没有很高的要求,所以本人不才,自己绣花,结果还算过得去,最起码这个客户他们没有说不好看。截图如下图1。

图1

这里看能看到asp.net默认的实例项目的UI设计,我是在它的基础上做的。每个订单有多个订单子项,这个地方添加订单子项或编辑的时候写了很多的js,,界面如下图2

图2

所有的表格都使用了一样的样式,风格是一致的。如下图3

aaarticlea/png;base64,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" alt="" />

图3

3.代码结构

  这里不敢说用到什么架构,只能说代码结构了。这里采用最常用的三成架构的方式实现功能,可能大家都习以为常了,确实写了这些年的代码,无非都是三层架构的变形,或者底层访问数据使用接口,顶多返回json客户端用js拼接界面,其他的也没有什么了。这里简单地说一下。

  可能和你们一样,也用到了代码实现工具Codematic,这个工具确实好用,节省了不少时间,并且基本的代码结构也实现了。如下图4。

图4

  这个工具已经实现了所有的单表查询,可惜大部分的逻辑都是需要连接查询了,要不然关系数据库就没什么意思了,所以自己写的代码也不少的。

1.数据访问层

数据访问层写了一个动态存储过程,生成分页数据,这里没有把分页放在控件里或者内存中实现,存过过程每次返回固定条数的数据,这样减轻数据量,但是牺牲了一部分新能,动态存储过程每次都执行不同的语句,没法调试性能。还有一点,这里牺牲了一些灵活性,比如每页显示多少航,转到多少页。 调用的存储过程如下:

exec UP_GetRecordByPage
@tblName1='Orders',
@tblName2='Orders left join MaintainMessage on Orders.MaintainId=MaintainMessage.ID left join Teacher on MaintainMessage.TeacherID=Teacher.ID left join Employee on MaintainMessage.EmployeeID=Employee.ID left join Book on MaintainMessage.BookID=Book.ID left join School on Teacher.SchoolID=School.ID ',
@fldName='Orders.*,Teacher.TeacherName,Employee.Name,Book.Price,Book.BookName,MaintainMessage.OrderStructure',
@OrderfldName='Orders.ID',
@PageSize=20,
@PageIndex=1,
@IsReCount=1,
@OrderType=1,
@strWhere=' 1=1 and School.CityID=1',
@IsPrint=1

存储过程生成的select语句如下:

select top 20
Orders.*,Teacher.TeacherName,
Employee.Name,Book.Price,Book.BookName,
MaintainMessage.OrderStructure
from
Orders left join MaintainMessage on Orders.MaintainId=MaintainMessage.ID
left join Teacher on MaintainMessage.TeacherID=Teacher.ID
left join Employee on MaintainMessage.EmployeeID=Employee.ID
left join Book on MaintainMessage.BookID=Book.ID
left join School on Teacher.SchoolID=School.ID
where
1=1 and School.CityID=1
order by Orders.ID desc
/*----*/
select
count(1) as Total
from
Orders
left join MaintainMessage on Orders.MaintainId=MaintainMessage.ID
left join Teacher on MaintainMessage.TeacherID=Teacher.ID
left join Employee on MaintainMessage.EmployeeID=Employee.ID
left join Book on MaintainMessage.BookID=Book.ID
left join School on Teacher.SchoolID=School.ID
where
1=1 and School.CityID=1

得到数据之后就是很常见的转换成实体类了。

2.业务逻辑层就是将数据返回到展现层,顶多有复杂的数据需要再次访问数据库。如下在一个方法中两次访问数据,需要说的是这种情况如果数据太多会有很多的性能损失,所幸这里数据不多,因为要分页,每次顶多返回20条。

 public List<Erp.Model.Employee> GetEmployeeFerformance(Model.EmpPerformance performance)
{
List<Erp.Model.Employee> employees = new List<Model.Employee>();
SqlParameter[] parameters = {
new SqlParameter("@BeginDate", SqlDbType.DateTime),
new SqlParameter("@EndDate", SqlDbType.DateTime)
};
parameters[].Value = performance.BeginDate;
parameters[].Value = performance.EndDate;
DataTable table = DbHelperSQL.RunProcedure("sp_GetEmpPerformance" , parameters , "performance").Tables[];
if (table!=null && table.Rows.Count>0)
{
for (int i = 0; i < table.Rows.Count; i++)
{
Erp.Model.Employee employee = new Model.Employee();
employee.ID = Convert.ToInt32(table.Rows[i]["EmployeeID"].ToString());
employee.Name = table.Rows[i]["Name"].ToString();
employee.EmployeePerformance.MaintainMessageNum = Convert.ToInt32(table.Rows[i]["MaintainMessageNum"].ToString());
employee.EmployeePerformance.CommunicateNum = Convert.ToInt32(table.Rows[i]["CommunicateNum"].ToString());
employee.EmployeePerformance.OrdersNum = Convert.ToInt32(table.Rows[i]["OrdersNum"].ToString());
employee.EmployeePerformance.TotalAmount = Convert.ToDecimal(table.Rows[i]["TotalAmount"].ToString());
employee.EmployeePerformance.TotalRebate = Convert.ToDecimal(table.Rows[i]["TotalRebate"].ToString());
SqlParameter[] parametersDetail = {
new SqlParameter("@BeginDate", SqlDbType.DateTime),
new SqlParameter("@EndDate", SqlDbType.DateTime),
new SqlParameter("@EmployeeID", SqlDbType.Int)
};
parametersDetail[].Value = performance.BeginDate;
parametersDetail[].Value = performance.EndDate;
parametersDetail[].Value = employee.ID;
DataSet dsPerformanceDetail = DbHelperSQL.RunProcedure("sp_GetEmpPerformanceNumDetail", parametersDetail, "performanceDetail");
if (dsPerformanceDetail != null && dsPerformanceDetail.Tables.Count > 1)
{
DataTable tbPerformanceDetail = dsPerformanceDetail.Tables[];
if (tbPerformanceDetail != null && tbPerformanceDetail.Rows.Count > 0)
{
for (int j = 0; j < tbPerformanceDetail.Rows.Count; j++)
{
employee.EmployeePerformance.MaintainMessageNumDetail += string.Format("{0}:{1} ", tbPerformanceDetail.Rows[j]["BusinessImportance"].ToString(), tbPerformanceDetail.Rows[j]["number"].ToString());
}
}
tbPerformanceDetail = dsPerformanceDetail.Tables[];
if (tbPerformanceDetail != null && tbPerformanceDetail.Rows.Count > 0)
{
for (int k = 0; k < tbPerformanceDetail.Rows.Count; k++)
{
employee.EmployeePerformance.CommunicateNumDetail += string.Format("{0}:{1} ", tbPerformanceDetail.Rows[k]["BusinessImportance"].ToString(), tbPerformanceDetail.Rows[k]["number"].ToString());
}
}
} employees.Add(employee); }
}
return employees;
}

调用存储过程的实例代码如下:

public DataTable GetTitleList(int currentPage, out int pages, Erp.Model.Employee employee)
{
Erp.DAL.PageData pData = new Erp.DAL.PageData();
pData.TblName1 = "a";
pData.TblName2 = "Employee a left join EmployeeType b on a.EmployeeTypeID = b.ID left join Employee c on a.ManagerID=c.ID";
pData.FldName = "a.ID,a.Name,a.UserName,b.TypeName,c.Name as ManagerName,a.Sex,a.Telphone,a.CellPhone,a.QQ,a.Email,a.Statue,a.Remark,a.ManagerID,a.EmployeeTypeID,a.RegionsIDs,a.Password";
pData.OrderFldName = "a.ID";
pData.OrderType = ;
pData.StrWhere = " 1=1 ";
pData.PageIndex = currentPage.ToString();
pData.IsPrint = ;
pData.IsReCount = ;
pData.PageSize = ""; if(employee != null)
{
if(!string.IsNullOrEmpty(employee.Name))
{
pData.StrWhere += " and a.Name like '%" + employee.Name + "%' ";
}
if(!string.IsNullOrEmpty(employee.Sex))
{
pData.StrWhere += " and a.Sex like '%" + employee.Sex + "%' ";
}
if(!string.IsNullOrEmpty(employee.UserName))
{
pData.StrWhere += " and a.UserName like '%" + employee.UserName + "%' ";
}
if(!string.IsNullOrEmpty(employee.Statue))
{
pData.StrWhere += " and a.Statue like '%" + employee.Statue + "%' ";
}
if(!string.IsNullOrEmpty(employee.Email))
{
pData.StrWhere += " and a.Email like '%" + employee.Email + "%' ";
}
if(!string.IsNullOrEmpty(employee.CellPhone))
{
pData.StrWhere += " and a.CellPhone like '%" + employee.CellPhone + "%' ";
}
if(!string.IsNullOrEmpty(employee.QQ))
{
pData.StrWhere += " and a.QQ like '%" + employee.QQ + "%' ";
}
if(!string.IsNullOrEmpty(employee.Telphone))
{
pData.StrWhere += " and a.Telphone like '%" + employee.Telphone + "%' ";
}
if(employee.EmployeeTypeID > )
{
pData.StrWhere += " and a.EmployeeTypeID = " + employee.EmployeeTypeID.ToString();
}
if(employee.ManagerID > )
{
pData.StrWhere += " and a.ManagerID = " + employee.ManagerID.ToString();
}
} DataSet dSet = pData.GetPagedData();
pages = ;
if(dSet != null && dSet.Tables != null && dSet.Tables.Count > && dSet.Tables[] != null && dSet.Tables[].Rows.Count > )
{
if(!string.IsNullOrEmpty(dSet.Tables[].Rows[]["Total"].ToString()))
{
int items = Convert.ToInt32(dSet.Tables[].Rows[]["Total"].ToString());
if(items % Convert.ToInt32(pData.PageSize) == )
{
pages = items / Convert.ToInt32(pData.PageSize);
}
else
{
pages = items / Convert.ToInt32(pData.PageSize) + ;
}
}
}
return dSet.Tables[];
}

3.展现层就更加简单了,一般都是使用“万能的repeater”,没有什么难度。

                <asp:Repeater ID="repEmployees" runat="server" OnItemCommand="repEmployees_ItemCommand">
<ItemTemplate>
<tr>
<td class="r">
<%#Eval("ID")%>
</td>
<td>
<%#Eval("Name")%>
</td>
<td>
<%#Eval("UserName")%>
</td>
<td>
<%#Eval("TypeName")%>
</td>
<td>
<%#Eval("ManagerName")%>
</td>
<td>
<%#Eval("Sex")%>
</td>
<td>
<%#Eval("Telphone")%>
</td>
<td>
<%#Eval("CellPhone")%>
</td>
<td>
<%#Eval("QQ")%>
</td>
<td>
<%#Eval("Email")%>
</td>
<td>
<%#Eval("Statue")%>
</td>
<td>
<%#Eval("Remark")%>
</td>
<td>
<asp:HiddenField ID="hidManagerID" runat="server" Value='<%#Eval("ManagerID") %>' />
<asp:HiddenField ID="hidEmployeeTypeID" runat="server" Value='<%#Eval("EmployeeTypeID") %>' />
<asp:HiddenField ID="hidRegionsIDs" runat="server" Value='<%#Eval("RegionsIDs") %>' />
<asp:HiddenField ID="hidPassword" runat="server" Value='<%#Eval("Password") %>' />
<asp:LinkButton ID="linEdit" runat="server" Style="padding: 0px;" CommandName="select" CommandArgument='<%#Eval("ID") %>'>编辑</asp:LinkButton>
</td>
</tr>
</ItemTemplate>
</asp:Repeater>

4.总结

这个小项目没有什么出彩的地方,如果大家有用得到类似的,欢迎来联系我。欢迎大家来怕转。

一个asp.net小项目总结的更多相关文章

  1. 第一个Asp.net小项目,主页写了下后台代码

    一个比较完善的登录模块,就目前的知识范围来说应该算是完美的. 涉及到:cookies,Session,验证码等知识面 Cookies存放一组值: HttpCookie cook = new HttpC ...

  2. 跟我一起做一个vue的小项目(二)

    这个vue项目是紧跟着之前的项目跟我一起做一个vue的小项目(一)来的. 我继续后面的开发(写的比较粗糙,边学边记录) 下图是header头部的样式 header组件内容如下 //header.vue ...

  3. 最近做的一个Spring Boot小项目,欢迎大家访问 http://39.97.115.152/

    最近做的一个Spring Boot小项目,欢迎大家访问 http://39.97.115.152/,帮忙找找bug,网站里有源码地址 网站说明 甲壳虫社区(Beetle Community) 一个开源 ...

  4. 创建第一个ASP.NET MVC项目

    创建 新建->项目->展开Web->ASP.NET Web应用程序->MVC->确认 ASP.NET MVC应用程序的目录结构 /Controllers该目录保存处理UR ...

  5. 跟我一起做一个vue的小项目(APPvue2.5完结篇)

    先放一下这个完结项目的整体效果 下面跟我我一起进行下面项目的进行吧~~~ 接下来我们进行的是实现header的渐隐渐显效果,并且点击返回要回到首页 我们先看效果 在处理详情页向下移动过程中,heade ...

  6. 跟我一起做一个vue的小项目(八)

    接下来我们进行的是城市选择页面的路由配置 添加city.vue,使其点击城市,然后跳转到city页面 //router.js import Vue from 'vue' import Router f ...

  7. 跟我一起做一个vue的小项目(七)

    先看下我们所做项目的效果 这些数据都是我们在data中定义的,不是从后端数据中请求的.那么 接下来我们使用axios渲染数据 npm install axios --save 每个组件里面的数据都不相 ...

  8. 跟我一起做一个vue的小项目(五)

    接下来我们要做的是热门推荐页面,我们写一个推荐组件 使用的方法也是前端data中的数据渲染到页面上面,这里对文字过长取省略号的方法不成功使用了一个小技巧 使用了min-width:0 我们来看完整的代 ...

  9. 跟我一起做一个vue的小项目(四)

    接下来我们进行的是轮播页面下面的导航页的开发 我们需要的是实现轮播页下面的图标,并且实现轮播效果 这个话,其实基本思路先是渲染出小图标,然后,我们要对页数进行判断,如果图标的个数展示的就是8个,那个这 ...

随机推荐

  1. KOA 与 CO 实现浅析

    KOA 与 CO 的实现都非常的短小精悍,只需要花费很短的时间就可以将源代码通读一遍.以下是一些浅要的分析. 如何用 node 实现一个 web 服务器 既然 KOA 实现了 web 服务器,那我们就 ...

  2. 登陆界面背景动画的css样式

    为了达到更好的用户体验,登陆界面需要设计多张背景图进行动态切换 <!doctype html> <html lang="en"> <head> ...

  3. 在 Linux 平台下使用 JNI

    引言 Java 的出现给大家开发带来的极大的方便.但是,如果我们有大量原有的经过广泛测试的非 Java 代码,将它们全部用 Java 来重写,恐怕会带来巨大的工作量和长期的测试:如果我们的应用中需要访 ...

  4. 九度oj 1002 Grading 2011年浙江大学计算机及软件工程研究生机试真题

    #include<iostream> #include<queue> #include<cstdio> #include<cstring> #inclu ...

  5. IE浏览器报Promise未定义

    用vue-cli做的项目,用了promise,结果IE下报promise未定义,甚至在比较老的andriod手机浏览器上会显示空白页面,解决方案如下: 首先安装:babel-polyfill npm ...

  6. Django settings.py添加静态文件夹

    我们需要一个静态文件夹来存放文件,例如jQuery的模块 <script src="statics/jquery-3.2.1.js"></script> 引 ...

  7. Go语言备忘录(2):反射的原理与使用详解

    本文内容是本人对Go语言的反射原理与使用的备忘录,记录了关键的相关知识点,以供翻查. 文中如有错误的地方请大家指出,以免误导!转摘本文也请注明出处:Go语言备忘录(2):反射的原理与使用详解,多谢! ...

  8. RequireJs使用快速入门

    前言:Requirejs作为一个ES5环境流行的模块加载器,在很多项目中使用它.而且这个开源库任然在更新,同类产品seajs已经不更新了. ES6之后引入import 或者使用Commonjs的方式引 ...

  9. 【Bigdecimal】

    ---恢复内容开始--- 大位数除法的时候注意1/3问题:异常:[Exception in thread "main" java.lang.ArithmeticException: ...

  10. mybatis mapper调用mysql存储过程

    mybatis版本:3.4.4 存储过程 1.mapper.xml文件中配置相关的sql语句. <select id="callTest" statementType=&qu ...