【無私分享:從入門到精通ASP.NET MVC】從0開始,一起搭框架、做項目 (13)客戶管理

来源:http://www.cnblogs.com/yuangang/archive/2016/07/16/5674147.html
-Advertisement-
Play Games

聲明:本系列為原創,分享本人現用框架,未經本人同意,禁止轉載!http://yuangang.cnblogs.com 希望大家好好一步一步做,所有的技術和項目,都毫無保留的提供,希望大家能自己跟著做一套,還有,請大家放心,只要大家喜歡,有人需要,絕對不會爛尾,我會堅持寫完~ 如果你感覺文章有幫助,點 ...


聲明:本系列為原創,分享本人現用框架,未經本人同意,禁止轉載!http://yuangang.cnblogs.com

希望大家好好一步一步做,所有的技術和項目,都毫無保留的提供,希望大家能自己跟著做一套,還有,請大家放心,只要大家喜歡,有人需要,絕對不會爛尾,我會堅持寫完~

如果你感覺文章有幫助,點一下推薦,讓更多的朋友參與進來,也是對本人勞動成果的鼓勵,謝謝大家!由於還要工作,所以基本都是犧牲午休時間來寫博客的,寫博客呢不是簡單的Ctrl+C、Ctrl+V,我是要挨著做一遍的,這也是對大家負責,所以有些時候更新不及時,或者問題沒有及時解答,希望大家諒解,再次感謝大家!!

因為我引用了許多以前積累的類庫,所以有些東西是重覆的(後來更新),有些東西是過時的,包括我寫的代碼,希望大家不要純粹的複製,取其精華去其糟粕>_<。

索引

【無私分享:從入門到精通ASP.NET MVC】從0開始,一起搭框架、做項目 目錄索引

簡述

簡單的客戶管理

項目準備

我們用的工具是:VS 2013 + SqlServer 2012 + IIS7.5

希望大家對ASP.NET MVC有一個初步的理解,理論性的東西我們不做過多解釋,有些地方不理解也沒關係,會用就行了,用的多了,用的久了,自然就理解了。

項目開始

一、資料庫設計

表名:SYS_BUSSINESSCUSTOMER  
序號 列名 數據類型 長度 小數位 標識 主鍵 外鍵 允許空 預設值 說明
1 ID int 4 0      
2 Fk_DepartId nvarchar 36 0          
3 FK_RELATIONID nvarchar 72 0         公司介紹外鍵
4 CompanyName nvarchar 50 0         公司名稱
5 CompanyProvince nvarchar 10 0         公司所在省份
6 CompanyCity nvarchar 10 0         公司所在城市
7 CompanyArea nvarchar 10 0         公司所在縣區
8 CompanyAddress nvarchar 500 0         公司通訊地址
9 CompanyTel nvarchar 50 0         公司辦公電話
10 CompanyWebSite nvarchar 100 0         公司網址
11 ChargePersionName nvarchar 50 0         負責人姓名
12 ChargePersionSex int 4 0         負責人性別
13 ChargePersionQQ nvarchar 20 0         負責人QQ
14 ChargePersionEmail nvarchar 50 0         負責人郵箱
15 ChargePersionPhone nvarchar 50 0         負責人電話
16 IsValidate bit 1 0         公司是否已驗證
17 CreateUser nvarchar 50 0         創建人
18 CreateDate datetime 8 3         創建時間
19 UpdateUser nvarchar 50 0         更新人
20 UpdateDate datetime 8 3         更新時間
21 CustomerStyle int 4 0         客戶類型

 

二、創建介面和實現類

1、我們在Service類庫下IService文件夾的SysManage文件夾下新建一個介面 IBussinessCustomerManage

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace Service.IService
 8 {
 9     /// <summary>
10     /// 客戶管理介面
11     /// add yuangang by 2016-06-17
12     /// </summary>
13     public interface IBussinessCustomerManage:IRepository<Domain.SYS_BUSSINESSCUSTOMER>
14     {
15     }
16 }

 

2、我們在ServiceImp文件夾的SysManage文件夾下麵新建一個實現類 BussinessCustomerManage

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace Service.ServiceImp
 8 {
 9     public class BussinessCustomerManage:RepositoryBase<Domain.SYS_BUSSINESSCUSTOMER>,IService.IBussinessCustomerManage
10     {
11     }
12 }

 

3、然後呢?對了,千萬別忘記,我們在Service類庫下麵的Service.xml配置一下

 

三、控制器和視圖

1、我們在/Areas/SysManage/Controllers 下新建一個控制器 BussinessCustomerController 繼承基礎控制器 BaseController

 

2、我們配置一下/Config/Controllers.xml 實現spring的註入

 

3、我們聲明一下這些容器

 1 #region 聲明容器
 2         /// <summary>
 3         /// 公司客戶管理
 4         /// </summary>
 5         IBussinessCustomerManage BussinessCustomerManage { get; set; }
 6         /// <summary>
 7         /// 省市區管理
 8         /// </summary>
 9         ICodeAreaManage CodeAreaManage { get; set; }
10         /// <summary>
11         /// 大數據欄位管理
12         /// </summary>
13         IContentManage ContentManage { get; set; }
14         /// <summary>
15         /// 編碼管理
16         /// </summary>
17         ICodeManage CodeManage { get; set; }
18         #endregion

 

4、我們為Index添加視圖,並且加入驗證模塊 模塊別名為 BussinessCustomer 操作驗證為 View

1 /// <summary>
2         /// 客戶管理載入主頁
3         /// </summary>
4         /// <returns></returns>
5         [UserAuthorizeAttribute(ModuleAlias = "BussinessCustomer", OperaAction = "View")]
6         public ActionResult Index()
7         {
8             
9         }

 

5、我們添加菜單連接

5.1 我們打開 系統管理中心 → 系統管理 → 模塊管理  添加一個頂部分類  【客戶管理中心】

 

5.2 我們在【客戶管理中心】 下新建一個 右側頂級菜單 【客戶管理】

 

5.3 我們在【客戶管理】菜單下 新建一個菜單 【客戶中心】 模塊別名: BussinessCustomer  模塊類型: 列表頁   模塊路徑: /Sys/BussinessCustomer

 

5.4 這樣我們是否就有菜單了呢?答案是否定的。因為我們為Index添加了許可權驗證 View 而我們這個模塊還沒有許可權。所以我們要創建許可權

為了快速,我們可以直接選擇 【初始化許可權】 會自動為我們添加 基本的操作許可權 如果我們需要其它許可權 比如:審核、發佈、下載、導出等,我們可以通過【創建新許可權】 來添加自定義操作許可權

 

OK,現在可以打開頁面了。

 

6、修改Index 輸出客戶列表

 

6.1 輸出省份列表和客戶類型列表

1 ViewData["ProvinceList"] = CodeAreaManage.LoadListAll(p => p.LEVELS == 1);
2 ViewBag.KHLX = this.CodeManage.LoadAll(p => p.CODETYPE == "LXRLX").OrderBy(p => p.SHOWORDER).ToList();

 

6.2  處理查詢參數 輸出客戶列表

 1 /// <summary>
 2         /// 客戶管理載入主頁
 3         /// </summary>
 4         /// <returns></returns>
 5         [UserAuthorizeAttribute(ModuleAlias = "BussinessCustomer", OperaAction = "View")]
 6         public ActionResult Index()
 7         {
 8             try
 9             {
10 
11                 #region 處理查詢參數
12                 //接收省份
13                 string Province = Request.QueryString["Province"];
14                 ViewData["Province"] = Province;
15                 //接收客戶類型
16                 string CustomerStyle = Request.QueryString["CustomerStyle"];
17                 ViewData["CustomerStyle"] = CustomerStyle;
18                 //文本框輸入查詢關鍵字
19                 ViewBag.Search = base.keywords;                
20                 #endregion
21 
22                 ViewData["ProvinceList"] = CodeAreaManage.LoadListAll(p => p.LEVELS == 1);
23                 ViewBag.KHLX = this.CodeManage.LoadAll(p => p.CODETYPE == "LXRLX").OrderBy(p => p.SHOWORDER).ToList();
24 
25                 //輸出客戶分頁列表
26                 return View(BindList(Province, CustomerStyle));
27             }
28             catch (Exception e)
29             {
30                 WriteLog(Common.Enums.enumOperator.Select, "客戶管理載入主頁:", e);
31                 throw e.InnerException;
32             }
33         }

 

6.3 分頁查詢客戶列表方法

 1  #region 幫助方法及其他控制器調用
 2         /// <summary>
 3         /// 分頁查詢公司客戶列表
 4         /// </summary>
 5         private Common.PageInfo BindList(string Province, string CustomerStyle)
 6         {
 7             //基礎數據(緩存)
 8             var query = this.BussinessCustomerManage.LoadAll(null);
 9 
10             //非超級管理員只允許查看用戶所在部門客戶
11             if(!CurrentUser.IsAdmin)
12             {
13                 query = query.Where(p => p.Fk_DepartId == CurrentUser.DptInfo.ID);
14             }
15 
16             //客戶所在省份
17             if (!string.IsNullOrEmpty(Province))
18             {               
19                 query = query.Where(p => p.CompanyProvince == Province);
20             }
21 
22             //客戶類型
23             if (!string.IsNullOrEmpty(CustomerStyle))
24             {
25                 int styleId = int.Parse(CustomerStyle);
26                 query = query.Where(p => p.CustomerStyle == styleId);
27             }
28 
29             //查詢關鍵字
30             if (!string.IsNullOrEmpty(keywords))
31             {
32                 keywords = keywords.ToLower();
33                 query = query.Where(p => p.CompanyName.Contains(keywords) || p.ChargePersionName.Contains(keywords));
34             }
35             //排序
36             query = query.OrderByDescending(p => p.UpdateDate).OrderByDescending(p => p.ID);
37             //分頁
38             var result = this.BussinessCustomerManage.Query(query, page, pagesize);
39 
40             var list = result.List.Select(p => new
41             {
42                 p.ID,
43                 p.CompanyName,
44                 p.IsValidate,
45                 CompanyProvince = this.CodeAreaManage.Get(m => m.ID == p.CompanyProvince).NAME,
46                 CompanyCity = this.CodeAreaManage.Get(m => m.ID == p.CompanyCity).NAME,
47                 CompanyArea = this.CodeAreaManage.Get(m => m.ID == p.CompanyArea).NAME,
48                 p.CompanyTel,
49                 p.ChargePersionName,
50                 p.CreateUser,
51                 CreateDate=p.CreateDate.ToString("yyyy-MM-dd"),
52                 p.CustomerStyle
53 
54 
55             }).ToList();
56 
57             return new Common.PageInfo(result.Index, result.PageSize, result.Count, Common.JsonConverter.JsonClass(list));
58         }59         #endregion

 

6.4 頁面輸出

 

 

7、添加、修改、刪除客戶

7.1  載入客戶詳情 生成表單

 1  /// <summary>
 2         /// 載入詳情
 3         /// </summary>
 4         /// <param name="id"></param>
 5         /// <returns></returns>
 6         [UserAuthorizeAttribute(ModuleAlias = "BussinessCustomer", OperaAction = "Detail")]
 7         public ActionResult Detail(int? id)
 8         {
 9             //初始化客戶
10             var entity = new Domain.SYS_BUSSINESSCUSTOMER() { ChargePersionSex = 1 };
11 
12             if(id!=null && id>0)
13             {
14                 //客戶實體
15                 entity = BussinessCustomerManage.Get(p => p.ID == id);
16                 //公司介紹
17                 ViewData["CompanyInstroduce"] = ContentManage.Get(p => p.FK_RELATIONID == entity.FK_RELATIONID && p.FK_TABLE == "SYS_BUSSINESSCUSTOMER") ?? new Domain.COM_CONTENT();
18             }
19 
20             //客戶類型
21             ViewBag.KHLX = this.CodeManage.LoadAll(p => p.CODETYPE == "LXRLX").OrderBy(p=>p.SHOWORDER).ToList();
22 
23             return View(entity);
24         }

 

7.2 Detail.cshtml

  1 @{
  2     ViewBag.Title = "Detail";
  3     Layout = "~/Views/Shared/_Layout.cshtml";
  4     var content = ViewData["CompanyInstroduce"] == null ? new Domain.COM_CONTENT() : ViewData["CompanyInstroduce"] as Domain.COM_CONTENT;
  5 }
  6 @model Domain.SYS_BUSSINESSCUSTOMER
  7 <style type="text/css">
  8     .gray-bg {
  9         background-color: white;
 10     }
 11 </style>
 12 @using (Ajax.BeginForm("Save", null, new AjaxOptions()
 13                            {
 14                                HttpMethod = "Post",
 15                                OnBegin = "SubAjax.Loading",
 16                                OnComplete = "SubAjax.Complate",
 17                                OnFailure = "SubAjax.Failure",
 18                                OnSuccess = "SubAjax.Success"
 19                            },
 20                                new { @class = "form-horizontal dig-from", @role = "form" }))
 21 {
 22     @Html.HiddenFor(p => p.ID)
 23     @Html.HiddenFor(p=>p.FK_RELATIONID)
 24     @Html.HiddenFor(p=>p.Fk_DepartId)
 25     @Html.HiddenFor(p => p.CreateUser)
 26     @Html.HiddenFor(p => p.CreateDate)
 27     @Html.Hidden("ContentId", content.ID)
 28     <div class="wrapper wrapper-content animated fadeInUp">
 29         <div class="row">
 30             <div class="ibox-detail-title">
 31                 <i class="fa fa-pencil-square-o"></i>添加/修改客戶
 32             </div>
 33             <div class="ibox-content">
 34                 <div class="row">
 35                     <div class="col-xs-6">
 36                         <div class="form-group">
 37                             <label class="col-xs-4 control-label">客戶名稱:</label>
 38                             <div class="col-xs-8">
 39                                 @Html.TextBoxFor(p => p.CompanyName, new { @class = "form-control", @placeholder = "請輸入客戶名稱", @datatype = "*", @nullmsg = "請輸入客戶名稱!", @errormsg = "請輸入客戶名稱!" })
 40                             </div>
 41                         </div>
 42                     </div>
 43                     <div class="col-xs-6">
 44                         <div class="form-group">
 45                             <label class="col-xs-4 control-label">客戶類型:</label>
 46                             <div class="col-xs-8">
 47                                 <select name="CustomerStyle" class="form-control input-sm  input-s-sm inline">
 48                                     @{
 49     foreach (var item in ViewBag.KHLX)
 50     {
 51                             <option value="@item.CODEVALUE" @(Model.CustomerStyle!=null&&Model.CustomerStyle.ToString() == @item.CODEVALUE ? "selected" : "")>@item.NAMETEXT</option>
 52     }
 53                                     }
 54                                 </select>
 55 
 56                             </div>
 57                         </div>
 58                     </div>
 59                 </div>
 60                 <div class="hr-line-dashed"></div>
 61                 <div class="row">
 62                     <div class="col-xs-6">
 63                         <div class="form-group">
 64                             <label class="col-xs-4 control-label">公司電話:</label>
 65                             <div class="col-xs-8">
 66                                 @Html.TextBoxFor(p => p.CompanyTel, new { @class = "form-control", @placeholder = "請輸入公司電話" })
 67                             </div>
 68                         </div>
 69                     </div>
 70                     <div class="col-xs-6">
 71                         <div class="form-group">
 72                             <label class="col-xs-4 control-label">公司網址:</label>
 73                             <div class="col-xs-8">
 74                                 @Html.TextBoxFor(p => p.CompanyWebSite, new { @class = "form-control", @placeholder = "請輸入公司網址" })
 75                             </div>
 76                         </div>
 77                     </div>
 78                 </div>
 79                 <div class="hr-line-dashed"></div>
 80                         <div class="form-group">
 81                             <label class="col-xs-2 control-label">所在地:</label>
 82                             <div class="col-xs-10">
 83                                 @Html.HiddenFor(p => p.CompanyProvince)
 84                                 @Html.HiddenFor(p => p.CompanyCity)
 85                                 @Html.HiddenFor(p => p.CompanyArea)
 86                                 <select name="Province" id="Province" onchange="SelectCity('Province', 'City')" class="form-control input-sm  input-s-sm inline">
 87                                     <option value="-1">--請選擇--</option>
 88                                 </select>
 89                                 <select name="City" id="City" onchange="SelectCountry('City', 'Area')" class="form-control input-sm  input-s-sm inline">
 90                                     <option value="-1">--請選擇--</option>
 91                                 </select>
 92                                 <select name="Area" id="Area" onchange="SelectAreas('Area')" class="form-control input-sm  input-s-sm inline">
 93                                     <option value="-1">--請選擇--</option>
 94                                 </select>
 95                             </div>
 96                         </div>
 97                 <div class="hr-line-dashed"></div>
 98                 <div class="form-group">
 99                     <label class="col-xs-2 control-label">通訊地址:</label>
100                     <div class="col-xs-10">
101                         @Html.TextBoxFor(p => p.CompanyAddress, new { @class = "form-control", @placeholder = "請輸入通訊地址" })
102                     </div>
103                 </div>
104                 <div class="hr-line-dashed"></div>
105                 <div class="row">
106                     <div class="col-xs-6">
107                         <div class="form-group">
108                             <label class="col-xs-4 control-label">負責人:</label>
109                             <div class="col-xs-8">
110                                 @Html.TextBoxFor(p => p.ChargePersionName, new { @class = "form-control", @placeholder = "請輸入負責人姓名", @datatype = "*", @nullmsg = "請輸入負責人姓名!", @errormsg = "請輸入負責人姓名!" })
111                             </div>
112                         </div>
113                     </div>
114                     <div class="col-xs-6">
115                         <div class="form-group">
116                             <label class="col-xs-4 control-label">性別:</label>
117                             <div class="col-xs-8">
118                                 <label class="icheck_line">
119                                     <input type="radio" name="ChargePersionSex" value="1" @(Model.ChargePersionSex != null && Model.ChargePersionSex == 
              
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在如今的互聯網時代,微信已是一個超級App。這篇通過ViewPager + Fragment實現一個類似於微信的界面,之前有用FragmentTabHost實現過類似界面,ViewPager的實現方式相對於FragmentTabHost的方式更簡單明瞭。 ViewPager: ViewPager繼承 ...
  • 一個簡單的SDK製作是很容易的,複雜的sdk其實就和複雜化的應用一樣,都是從簡單開始的,這裡介紹一下sdk的簡單製作 步驟: 1.創建sdk,公開文件 2.編譯、獲取sdk文件 3.導入工程,配置文件 4.解決錯誤,完成 1.創建sdk,公開文件 然後起個需要的名字 創建出這樣的sdk,自動生成的文 ...
  • PageRank 簡單理解為網頁排名,但是網頁是根據什麼排名的,接下來就簡單介紹一下。 舉例: 假設網頁 A 的內容中有網頁 B,C 和 D 的鏈接,並且 A 的 PageRank的值為0.25。 那接下里我們就可以計算在網頁 A 中的其他網頁的PageRank的值了。我們拿網頁 B 來進行說明, ...
  • 在SQL語句優化過程中,我們經常會用到hint,現總結一下在SQL優化過程中常見Oracle HINT的用法: 1. /*+ALL_ROWS*/ 表明對語句塊選擇基於開銷的優化方法,並獲得最佳吞吐量,使資源消耗最小化. 例如: SELECT /*+ALL+_ROWS*/ EMP_NO,EMP_NAM ...
  • 轉載請附原文鏈接:http://www.cnblogs.com/wingsless/p/5672057.html mongodb現在為止還是沒有像XtraBackup這樣好用的備份工具,因此一般來說會有兩種備份辦法:拷貝文件和mongodump。拷貝文件這招在MySQL里經常用,但是必須要停掉寫入服 ...
  • Redis 的set是string類型的無序集合。set元素最大可以包含(2的32次方-1)個元素。set的是通過hash table實現的,所以添加,刪除,查找的複雜度都是O(1)。hash table會隨著添加或者刪除自動的調整大小。需要註意的是調整hash table大小時候需要同步(獲取寫鎖 ...
  • 前言,知道自己騰訊雲伺服器安全組配置併在安全組裡開放了所有埠的用戶可以粗略的看看下邊的內容,否則就仔細看看吧。 因為有學習及業務需要,我要在騰訊雲上安裝了CentOS7.2版本的伺服器上安裝MySQL 提示,不知道怎麼在CentOS7.2上安裝MySQL的可以訪問以下網站,有詳細的步驟: http ...
  • 今天寫模糊查詢的時候,按照時間排序併進行分頁時,在mybatis的映射文件中有這樣一條sql語句 如果先排序後分頁的話就能得到想要的結果,但是反之 這樣的話就會報錯。SQL的執行順序是from where select。那我可不可以認為,在相同優先順序的where條件下誰在前面誰會優先執行,而orde ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...