WebApp簡單製作(後端也可以裝逼啦)

来源:http://www.cnblogs.com/qtqq/archive/2016/03/13/5271164.html
-Advertisement-
Play Games

年後回來,跟之前和幾個同事和朋友聊天,發現有兩個.net的和一個php的朋友都轉到了前端,真是出乎意料。自從之前的webapp興起後,前端感覺比後端吃香很多,總結朋友們轉的原因,大概就幾點 1.易上手,相對其他語言來說,作為後端人員,轉到前端,其實已經有了很好的底子和基礎了,畢竟以前多少都會和js,


前端越來越吃香的感覺

  年後回來,跟之前和幾個同事和朋友聊天,發現有兩個.net的和一個php的朋友都轉到了前端,真是出乎意料。自從之前的webapp興起後,前端感覺比後端吃香很多,總結朋友們轉的原因,大概就幾點

1.易上手,相對其他語言來說,作為後端人員,轉到前端,其實已經有了很好的底子和基礎了,畢竟以前多少都會和js,jq,html,css打交道

2.前端比後端容易找工作,這裡的容易找工作,是指不會被後端的語言限死。就像我朋友說的“做網站不一樣需要.net,可以是java,可以是php,但一定離不開js,jq,html,css這些東西”。

3.前端妹子多......

   其實自己也覺得有一定道理,感覺這兩年.net的需求度相對其他的語言都弱了些,前程上搜索發現,.net的職位數是1100+,php是1800+, 前端是2000+,java 是3600+(都是僅限於廣州)。所以還是蠻明顯的。

   看到了那麼多朋友轉前端,自己也開始搞點前端的東西,近期剛好有點時間,正好研究下webapp開發, 其實webapp開發說到底就是響應式佈局嘛,配合html5+css3就看上去高大上點了。不過作為後端程式猿來說,我還沒打算深入去研究html5和css3,反正就是響應式佈局,用現成的前端框架來練練手。於是,就想用bootstrap做一個簡單的新聞網站來裝下逼。

 初試

  Boootstrap,來自 Twitter,是目前很受歡迎的前端框架,主要是響應式佈局,無論是文檔,資料,還是demo等都比較齊全,而且界面好看,提供多樣式主題,還有很多開源的插件和模板,上手相對簡單,讓後端程式屌絲也能做出好看的界面。

 文件的下載和相關引用,可參考如下地址,詳細明瞭

 http://v3.bootcss.com/getting-started/

 就是下載後只要依次引入:

bootstrap.min.css

bootstrap-theme.min.css

Jquery.min.js

Bootstrap.min.js

這四個文件就好了,然後 在<head> 之中添加 viewport 元數據標簽,用來指定移動設備優先

<meta name="viewport" content="width=device-width, initial-scale=1">
viewport

登陸,註冊

使用到的組件 panel(面板),navbar(導航條),from(表單) jNotify(提示框)

 

表單驗證,Bootstrap下的表單本身不帶驗證功能,不過它的插件很多,表單插件bootstrapvalidator就是其中一款,感覺它封裝的驗證功能比easyui的還要強大。

 下載地址: https://github.com/nghuuphuoc/bootstrapvalidator

 使用方式,引入 bootstrapValidator.min.css  和  bootstrapValidator.min.js

 這兩個文件,然後初始化表單

Bootstrapvalidator下載的代碼中有大量的demo,可以根據需要自己選擇查看。

 

提示框,jNotify

jNotify是一款提示消息的插件,不過它並不是Bootstrap專有的插件。它提示界面好看,而已又是屬於輕量級的,方法使用也簡單,下載地址:http://www.jq22.com/jquery-info1377

 使用方式,引入  jNotify.jquery.js  和  jNotify.jquery.css

這兩個文件,然後就可以直接使用

jError("錯誤信息提示");

jSuccess("成功信息提示");

jNotify("一般信息提示");

 1 <div class="panel">
 2     <div class="wrapper-dropdown active navbar navbar-default" id="navbar">
 3         <label style="color: white; padding-left: 8px; font-size: 20px;"><strong>登錄</strong></label>
 4         <div class="h_Icon">
 5             <a class="dropdown-toggle" id="dropdownMenu" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
 6                 <img src="/Content/img/head/nemu.png" />
 7             </a>
 8             <ul class="dropdown dropdown-menu" id="menu" aria-labelledby="dropdownMenu">
 9                 <li><a href="/Home/Index"><i class="glyphicon glyphicon-home"></i> 首頁</a></li>
10                 <li><a href="/Home/Registere"><i class="glyphicon glyphicon-user"></i>註冊</a></li>
11             </ul>
12         </div>
13     </div>
14     <div class="row panel-body">
15         <form id="loginform">
16             <div class="form-group">
17                 <input type="text" class="form-control" id="username" name="username" placeholder="用戶名">
18             </div>
19             <div class="form-group">
20                 <input type="password" class="form-control" id="password" name="password" placeholder="密碼">
21             </div>
22             <button type="button" data-loading-text="正在提交" autocomplete="off" id="validateBtn" class="btn btn-info btn-block">登陸</button>
23         </form>
24     </div>
25 </div>
登錄頁代碼
 1 <div class="panel">
 2     <div class="wrapper-dropdown active navbar navbar-default" id="navbar">
 3         <label style="color: white; padding-left: 8px; font-size: 20px;"><strong>註冊</strong></label>
 4         <div class="h_Icon">
 5             <a class="dropdown-toggle" id="dropdownMenu" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
 6                 <img src="/Content/img/head/nemu.png" />
 7             </a>
 8             <ul class="dropdown dropdown-menu" id="menu" aria-labelledby="dropdownMenu">
 9                 <li><a href="/Home/Index"><i class="glyphicon glyphicon-home"></i>首頁</a></li>
10                 <li><a href="/Home/Login"><i class="glyphicon glyphicon-lock"></i>登錄</a></li>
11 
12             </ul>
13         </div>
14     </div>
15     <div class="row panel-body">
16         <form id="loginform">
17             <div class="form-group">
18                 <input type="text" class="form-control" name="username" placeholder="用戶名">
19             </div>
20             <div class="form-group">
21                 <input type="text" class="form-control" name="nickName" placeholder="用戶昵稱">
22             </div>
23             <div class="form-group">
24                 <input type="password" class="form-control" name="password" placeholder="密碼">
25             </div>
26             <div class="form-group">
27                 <input type="password" class="form-control" name="confirmPassword" placeholder="確認密碼">
28             </div>
29             <button type="button" data-loading-text="正在提交" autocomplete="off" id="validateBtn" class="btn btn-info btn-block">註冊</button>
30         </form>
31     </div>
32 </div>
註冊頁代碼
 1  var $btn;
 2         $('#loginform').bootstrapValidator({
 3             message: 'This value is not valid',
 4             feedbackIcons: {
 5                 valid: 'glyphicon glyphicon-ok',
 6                 invalid: 'glyphicon glyphicon-remove',
 7                 validating: 'glyphicon glyphicon-refresh'
 8             },
 9             fields: {
10                 username: {
11                     validators: {
12                         notEmpty: {
13                             message: '用戶名不能為空'
14                         },
15                         stringLength: {
16                             min: 6,
17                             max: 30,
18                             message: '用戶名必須在6-30位之間'
19                         },
20                         remote: {
21                             type: 'POST',
22                             url: '/User/CheckUserName',
23                             message: '該用戶名已經存在'
24                         },
25                         different: {
26                             field: 'password,confirmPassword',
27                             message: '用戶名不能與密碼一致'
28                         }
29                     }
30                 },
31                 nickName: {
32                     validators: {
33                         notEmpty: {
34                             message: '用戶昵稱不能為空'
35                         },
36                         stringLength: {
37                             min: 2,
38                             max: 8,
39                             message: '用戶昵稱必須在2-8位之間'
40                         },
41                         remote: {
42                             type: 'POST',
43                             url: '/User/CheckNickName',
44                             message: '該用戶昵稱已經存在'
45                         }
46                     }
47                 },
48                 password:
49                 {
50                     validators: {
51                         notEmpty: {
52                             message: '密碼不能為空'
53                         },
54                         stringLength: {
55                             min: 8,
56                             max: 20,
57                             message: '密碼長度必須在8-20位之間'
58                         },
59                         different: {
60                             field: 'username',
61                             message:
62                                 '用戶名不能與密碼一致'
63                         }
64                     }
65                 },
66                 confirmPassword: {
67                     validators: {
68                         notEmpty: {
69                             message: '確認密碼不能為空'
70                         },
71                         identical: {
72                             field: 'password',
73                             message:
74                                 '兩次密碼不一致,請檢查'
75                         },
76                         different: {
77                             field: 'username',
78                             message:
79                                 '用戶名不能與密碼一致'
80                         }
81                     }
82                 }
83             }
84         });
表單驗證初始化
 1 (function ($) {
 2     $.extend($,
 3         {
 4             //成功提示
 5             MsgSuccess: function (msg, func) {
 6                 jSuccess(msg, {
 7                     VerticalPosition: 'center',
 8                     HorizontalPosition: 'center',
 9                     TimeShown: 1000,
10                     onClosed: function () {
11                         if (func) func();
12                     }
13                 });
14             },
15             //出錯時的提示
16             MsgError: function (msg, func) {
17                 jError(msg, {
18                     VerticalPosition: 'center',
19                     HorizontalPosition: 'center',
20                     TimeShown: 1000,
21                     onClosed: function () {
22                         if (func) func();
23                     }
24                 });
25             },
26 
27             //一般的提示
28             MsgInfo: function (msg, func) {
29                 jNotify(msg, {
30                     VerticalPosition: 'center',
31                     HorizontalPosition: 'center',
32                     TimeShown: 1000,
33                     onClosed: function () {
34                         if (func) func();
35                     }
36                 });
37             },
38             //統一處理 返回的json數據格式
39             DealAjaxData: function (data, funcSuc, funcErr) {
40 
41                 //如果是字元串格式的josn,就變為json對象
42                 if (typeof (data) == "string") {
43                     try {
44                         data = eval("(" + data + ")");
45                     } catch (e) {
46 
47                     }
48                 }
49 
50                 if (!data || data.Code == undefined) {
51                     return;
52                 }
53 
54                 switch (data.Code) {
55                     //錯誤的提示
56                     case 0:
57                         $.MsgError(data.Msg, function () { if (funcErr) { funcErr(data); } });
58                         break;
59                         //成功的提示
60                     case 1:
61                         $.MsgSuccess(data.Msg, function () { if (funcSuc) { funcSuc(data); } });
62                         break;
63                         //帶跳轉的提示
64                     case 2:
65                         $.MsgInfo(data.Msg, function () { if (window.top) window.top.location = data.BackUrl; else window.location = data.BackUrl; });
66                         break;
67                 }
68             }
69         });
70 }(jQuery));
JNotify簡單封裝

效果如下:

    

 新聞列表

使用到的組件 panel(面板),dropdown(下來菜單),Carousel(輪播)glyphicon(圖標) 柵格佈局 

 1 <div class="head">
 2     <div class="wrapper-dropdown active navbar navbar-default" id="navbar">
 3         <label style="color: white; padding-left: 8px; font-size: 20px;"><strong>新聞列表</strong></label>
 4         <div class="h_Icon">
 5             <a class="dropdown-toggle" id="dropdownMenu" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
 6                 <img src="/Content/img/head/nemu.png" />
 7             </a>
 8             <ul class="dropdown dropdown-menu" id="menu" aria-labelledby="dropdownMenu">
 9                 <li><a href="/Home/Index"><i class="glyphicon glyphicon-home"></i> 首頁</a></li>
10                 <li><a href="/Home/Login"><i class="glyphicon glyphicon-lock"></i>登錄</a></li>
11                 <li><a href="/Home/Registere"><i class="glyphicon glyphicon-user"></i>註冊</a></li>
12                 <li><a href="/Collection/Index"><i class="glyphicon glyphicon-star"></i>我的收藏</a></li>
13 
14             </ul>
15         </div>
16     </div>
17     <nav class="head-bar">
18             <a class="action" href="jvavscript:;">推薦</a>
19                     <a href="/News/NewsList?type=News">新聞</a>
20                     <a href="/News/NewsList?type=Sports">體育</a>
21                     <a href="/News/NewsList?type=Entertainment">娛樂</a>
22 
23     </nav>
24 </div>
頂部菜單代碼
 1 <div class="row fix-bottom">
 2     <div class="col-xs-6">
 3         <a href="/Home/Index">
 4             <img src="/Content/img/Login/home.png" />
 5         </a>
 6     </div>
 7     <div class="col-xs-6">
 8         <a href="/Collection/Index">
 9             <img src="/Content/img/Login/collect.png" />
10         </a>
11     </div>
12 </div>
13 
14 <!--返回頂部-->
15 <div class="toTop">
16     <a href="javascript:void(0)" onclick='$("body").animate({ "scrollTop": "0px" }, 300)'>
17         <img src="/Content/top.png"/>
18     </a>
19 </div>
尾部菜單代碼
 1 <!--焦點圖start-->
 2 <div class="carousel slide" id="NewsCarousel">
 3     <!--Indicators-->
 4     <ol class="carousel-indicators">
 5         <li class="active" data-slide-to="0" data-target="#NewsCarousel"></li>
 6         <li data-slide-to="1" data-target="#NewsCarousel"></li>
 7         <li data-slide-to="2" data-target="#News

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、開發環境 操作系統:Win10 編譯器:VS2013 framework版本:.net 4.5 Spring版本:1.3.1 二、涉及程式集 Spring.Core.dll Common.Loggin.dll 三、項目結構 四、開發過程 1.新建一個介面文件 namespace SpringNe...
  •    
  • 屬性分為無參屬性和有參屬性(即索引器)。 屬性相對於欄位的優點不僅僅是為了封裝,還可以在讀寫的時候做一些額外操作,緩存某些值或者推遲創建一些內部對象,也適用於以線程安全的方式訪問欄位。 話說最基本的屬性就不講了,太平常了。 基本上很多文章都是講屬性的好處的,所以下麵就講一下屬性的不足: 屬性不能作為
  • C#語法中有個特別的關鍵字yield, 它是乾什麼用的呢? 來看看專業的解釋: yield 是在迭代器塊中用於向枚舉數對象提供值或發出迭代結束信號。它的形式為下列之一:yield return <expression>;yield break   看如下例子:         上面的例子是實現了一個
  • GC記憶體回收的時機的確具有不確定性,所以GC不是救命稻草,請一定不要忘記發佈程式的時候,使用Release編譯模式!
  • 給Model中變數賦初始值就OK了。
  •   本篇體驗擴展StringBuilder使之支持鏈式方法。這裡有一個根據鍵值集合生成select元素的方法。     以上,html.AppendFormat("<select id=\"{0}\" name=\"{0}\">", id);html.AppendLine();可以對這兩個語句封裝,
  • 每一種編程語言,要想執行,就必須要轉換為目標操作系統能夠理解的語言才能執行,這種語言叫做本機代碼(native code)。C#也是一樣的,也要做這樣的轉換,但是它不是一處到位的,在.NET Framework這個平臺下,該過程分為兩個階段。 (1)C#代碼編譯為中間語言代碼的階段 在編譯C#代碼時
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...