1. 程式人生 > >基於layui+asp.net mvc實現個人部落格系統

基於layui+asp.net mvc實現個人部落格系統

功能如下:

後臺:

1.文章管理
2.分類管理
3.設定
4.日誌管理

前臺

1.顯示後臺釋出的文章資訊
2.評論功能

專案類圖:

放大檢視
這裡寫圖片描述

ArticleController.cs

using WuBlog.Core;
using WuBlog.Models;
using WuBlog.Service.Interfaces;
using WuBlog.Service.Messaging.Request;
using WuBlog.ViewModels;
using System;
using System.Collections.Generic;
using
System.Linq; using System.Web; using System.Web.Mvc; namespace WuBlog.Controllers { public class ArticleController : BaseController { private readonly IRepository<Article> _articleRepository; private readonly IRepository<Category> _categoryRepository; private
readonly IArticleService _articleService; public ArticleController(IRepository<Article> articleRepository, IRepository<Category> categoryRepository, IArticleService articleService) { _articleRepository = articleRepository; _categoryRepository = categoryRepository; _articleService = articleService; } public
ActionResult List(int pageIndex = 1, int pageSize = 15) { //var query = _articleRepository.Table; var setting = GetSetting(); if (setting != null) pageSize = setting.ManagePageSize; var request = new GetPageArticlesRequest(pageIndex, pageSize); #region Filter var title = Request["title"]; var category = Request["category"]; var state = Request["state"]; int cId; int s; if (!string.IsNullOrEmpty(title)) { request.Title = title; ViewBag.ArticleTitle = title; } if (int.TryParse(category, out cId) && cId != 0) { request.CategoryId = cId; ViewBag.CagegotyId = cId; } if (int.TryParse(state, out s) && s != 0) { request.Status = s; ViewBag.State = s; } //排序 var field = Request["field"]; var sort = Request["sort"]; var createTimeSort = "desc"; if (field != null && sort != null) { if (field == "CreateTime" && (sort == "asc" || sort == "desc")) { request.Sort = new Sort("CreateTime", sort == "asc" ? SortMode.Asc : SortMode.Desc); createTimeSort = sort == "asc" ? "desc" : "asc"; } } ViewBag.CreateTimeSort = createTimeSort; #endregion var response = _articleService.GetPageArticles(request); ViewBag.Categories = _categoryRepository.FindAll(); return View(response.Pages); } public ActionResult Create() { ViewBag.Categories = _categoryRepository.FindAll(); return View(); } [HttpPost] [ValidateAntiForgeryToken] [ValidateInput(false)] public ActionResult Create(ArticleModel model) { var article = new Article { Title = model.Title, Content = model.Content, Author = model.Author, CreateTime = DateTime.Now, IsTop = model.IsTop, State = model.State, Hits = model.Hits, Tags = model.Tags, CategoryId = model.CategoryId, Sort = model.Sort, MetaTitle = model.MetaTitle, MetaKeywords = model.MetaKeywords, MetaDescription = model.MetaDescription }; _articleService.Insert(article); return RedirectToAction("List"); } public ActionResult Edit(string articleId) { int id; if (int.TryParse(articleId, out id)) { var article = _articleRepository.FindById(id); ViewBag.Categories = _categoryRepository.FindAll(); if (article != null) return View(article); } return RedirectToAction("NotFound", "Message"); } [HttpPost] [ValidateAntiForgeryToken] [ValidateInput(false)] public ActionResult Edit(ArticleModel model) { var article = _articleRepository.FindById(model.Id); article.Title = model.Title; article.Content = model.Content; article.Author = model.Author; article.IsTop = model.IsTop; article.State = model.State; article.Hits = model.Hits; article.Tags = model.Tags; article.CategoryId = model.CategoryId; article.Sort = model.Sort; article.MetaTitle = model.MetaTitle; article.MetaKeywords = model.MetaKeywords; article.MetaDescription = model.MetaDescription; _articleRepository.Update(article); return RedirectToAction("List"); } } }

CategoryController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using WuBlog.Core;
using WuBlog.Models;
using WuBlog.Core.Extension;
using WuBlog.ViewModels;
using WuBlog.Helper;

namespace WuBlog.Controllers
{
    public class CategoryController : BaseController
    {
        private readonly IRepository<Category> _categoryRepository;
        private readonly IRepository<Article> _articleRepository;

        public CategoryController(IRepository<Category> categoryRepository, IRepository<Article> articleRepository)
        {
            _categoryRepository = categoryRepository;
            _articleRepository = articleRepository;
        }


        // GET: Category
        public ActionResult List(int pageIndex = 1, int pageSize = 15)
        {
            var setting = GetSetting();
            if (setting != null)
                pageSize = setting.ManagePageSize;

            var query = _categoryRepository.Table;

            var list = query.OrderByDescending(p => p.IsTop)
                .ThenByDescending(p => p.Sort)
                .ToPagedList(pageIndex, pageSize, true);

            return View(list);
        }

        public ActionResult Create()
        {
            return View();
        }
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create(CategoryModel model)
        {
            if (model == null)
                throw new ArgumentNullException("model");

            if (model.CategoryName.Length > 15)
            {
                ViewBag.IsError = true;
                return View();
            }

            var entity = new Category
            {
                CategoryName = model.CategoryName,
                IsTop = model.IsTop,
                Sort = model.Sort,
                CreateTime = DateTime.Now
            };

            _categoryRepository.Insert(entity);

            return RedirectToAction("List");
        }

        public ActionResult Edit()
        {
            var id = Request["id"];
            int cId = 0;
            if (string.IsNullOrEmpty(id))
                return RedirectToAction("List");
            if (!int.TryParse(id, out cId))
                return RedirectToAction("List");
            var entity = _categoryRepository.FindById(cId);

            return View(entity);
        }

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit(CategoryModel model)
        {
            if (model == null)
                throw new ArgumentNullException("model");
            if (model.CategoryName.Length > 15)
            {
                ViewBag.IsError = true;
                return View();
            }

            var entity = _categoryRepository.FindById(model.Id);
            entity.CategoryName = model.CategoryName;
            entity.IsTop = model.IsTop;
            entity.Sort = model.Sort;

            _categoryRepository.Update(entity);

            return RedirectToAction("List");

        }
        [HttpPost]
        public ActionResult Delete()
        {
            var id = Request["id"];
            if (string.IsNullOrEmpty(id))
                return Json(new { success = false, message = "刪除失敗,請重新整理頁面重試!" });
            int cId;
            if (!int.TryParse(id, out cId))
                return Json(new { success = false, message = "非法引數,請重新整理頁面重試!" });

            var exists = _articleRepository.Table.Any(p => p.CategoryId == cId);
            if (exists)
                return Json(new { success = false, message = "該分類下存在文章,請先刪除文章!" });

            _categoryRepository.Delete(p => p.Id == cId);

            return Json(new { success = true, message = "刪除成功!" });
        }

        [HttpGet]
        public ActionResult CheckName()
        {
            var value = Request["name"];
            if (string.IsNullOrEmpty(value))
                return Json(new { success = false, message = "名稱可用!" }, JsonRequestBehavior.AllowGet);
            var flag = false;
            var query = _categoryRepository.Table;
            var id = Request["id"];
            if (!string.IsNullOrEmpty(id))
            {
                var cId = Convert.ToInt32(id);
                if (query.Any(p => p.Id == cId && p.CategoryName == value.Trim()))
                    flag = false;
                else
                    flag = query.Any(p => p.CategoryName == value.Trim());
            }
            else
            {
                flag = query.Any(p => p.CategoryName == value.Trim());
            }
            return Json(new { success = flag, message = flag ? "分類名稱已存在" : "名稱可用!" }, JsonRequestBehavior.AllowGet);
        }
    }
}

Article檢視資料夾:

Create.cshtml

@{
    ViewBag.Title = "發表文章";
    Layout = "~/Views/Shared/_ManageLayoutPage.cshtml";
    var categories = ViewBag.Categories as IList<WuBlog.Models.Category>;
}
<blockquote class="layui-elem-quote blog-manage-breadcrumb">
    <span class="layui-breadcrumb">
        <a href="@Url.Action("List","Article")">文章管理</a>
        <a><cite>建立文章</cite></a>
    </span>
</blockquote>
<fieldset class="layui-elem-field layui-field-title">
    <legend>建立文章</legend>
</fieldset>

@using (Html.BeginForm("Create", "Article", FormMethod.Post, new { @class = "layui-form blog-manage-form" }))
{
    @Html.AntiForgeryToken()
    <input type="hidden" name="state" value="1" />
    <div class="layui-form-item">
        <label class="layui-form-label">文章分類</label>
        <div class="layui-input-block">
            <select name="categoryId" required lay-verify="category">
                <option value=""></option>
                @if (categories != null && categories.Count > 0)
                {
                    foreach (var item in categories)
                    {
                        <option value="@item.Id">@item.CategoryName</option>
                    }
                }
            </select>
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">標題</label>
        <div class="layui-input-block">
            <input type="text" name="title" lay-verify="title" autocomplete="off" placeholder="這裡輸入文章的標題,注意啦,別做標題黨了..." class="layui-input">
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">作者</label>
        <div class="layui-input-block">
            <input type="text" name="author" lay-verify="author" placeholder="這裡輸入文章作者哦..." autocomplete="off" class="layui-input">
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">標籤</label>
        <div class="layui-input-block">
            <input type="text" name="tags" lay-verify="tags" placeholder="這裡是輸入標籤的呢,如果有多個標籤的話,就用逗號分割開吧,記得她是英文逗號才有效的呢..." autocomplete="off" class="layui-input">
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">瀏覽量</label>
        <div class="layui-input-block">
            <input type="number" name="hits" lay-verify="number" value="0" autocomplete="off" class="layui-input">
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">排序值</label>
        <div class="layui-input-block">
            <input type="number" name="sort" lay-verify="number" value="0" min="0" placeholder="這裡輸入的數值越高,排序的位置就越前哦.." autocomplete="off" class="layui-input" />
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">置頂</label>
        <div class="layui-input-block">
            <input type="checkbox" name="isTop" value="true" lay-skin="switch" title="置頂" />
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">SEO標題</label>
        <div class="layui-input-block">
            <input type="text" name="metaTitle" placeholder="這裡寫文章的SEO標題..." autocomplete="off" class="layui-input" />
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">SEO關鍵字</label>
        <div class="layui-input-block">
            <input type="text" name="metaKeywords" placeholder="這裡寫文章的SEO關鍵字..." autocomplete="off" class="layui-input" />
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">SEO描述</label>
        <div class="layui-input-block">
            <input type="text" name="metaDescription" placeholder="這裡寫文章SEO描述..." autocomplete="off" class="layui-input">
        </div>
    </div>
    <div class="layui-form-item layui-form-text">
        <label class="layui-form-label">內容</label>
        <div class="layui-input-block">
            <textarea class="layui-textarea layui-hide" required lay-verify="content" id="content" name="content"></textarea>
        </div>
    </div>
    <div class="layui-form-item">
        <div class="layui-input-block">
            <button type="submit" lay-submit="" class="layui-btn">釋出</button>
            <button type="submit" lay-submit="" class="layui-btn" lay-filter="draft">存草稿</button>
            <button type="reset" class="layui-btn layui-btn-primary">重置</button>
        </div>
    </div>
}
@section scripts{
    <script>
        layui.use(['form', 'layedit', 'jquery'], function () {
            var form = layui.form()
            , layer = layui.layer
            , layedit = layui.layedit
            , $ = layui.jquery;

            //自定義驗證規則
            form.verify({
                category: function (value) {
                    if (value === '') return '請選擇分類啦^_^';
                },
                title: function (value) {
                    if (value.length < 5) return '標題至少也得5個字元吧';
                    if (value.length > 50) return '標題寫得太多啦,不要超過50個字元好嗎?';
                },
                author: function (value) {
                    if (value === '') return '至少得告訴人家,這篇文章是誰寫的吧?';
                },
                tags: function (value) {
                    if (value === '') return '給她貼個標籤唄,可以用逗號分割哦。';
                },
                content: function (value) {
                    if (value === '') return '既然寫文章、發部落格,總得寫點什麼吧?';
                    if (value.length <= 30) return '你寫的字數太少啦,起碼也得寫上30個字元吧。';
                }

            });

            //建立一個編輯器
            layedit.build('content', {
                height:600,
                uploadImage: {
                    url: '@Url.Action("UploadImage", "Upload")'
                }
            });

            //監聽提交
            form.on('submit(draft)', function (data) {

                //將狀態設定為2
                $('form input[name=state]').val('2');
                return true;
            });

            var $item = $('.layui-nav > .layui-nav-item');
            $item.removeClass('layui-this').eq(1).addClass('layui-this');
        });
    </script>
}

Edit.cshtml

@model WuBlog.Models.Article
@{
    ViewBag.Title = "編輯文章";
    Layout = "~/Views/Shared/_ManageLayoutPage.cshtml";
    var categories = ViewBag.Categories as IList<WuBlog.Models.Category>;
}
<blockquote class="layui-elem-quote blog-manage-breadcrumb">
    <span class="layui-breadcrumb">
        <a href="@Url.Action("List","Article")">文章管理</a>
        <a><cite>編輯文章</cite></a>
    </span>
</blockquote>
<fieldset class="layui-elem-field layui-field-title">
    <legend>編輯文章</legend>
</fieldset>

@using (Html.BeginForm("Edit", "Article", FormMethod.Post, new { @class = "layui-form blog-manage-form" }))
{
    @Html.AntiForgeryToken()
    <input type="hidden" name="id" value="@Model.Id" />
    <input type="hidden" name="state" value="@Model.State" />
    <div class="layui-form-item">
        <label class="layui-form-label">文章分類</label>
        <div class="layui-input-block">
            <select name="categoryId" required lay-verify="category">
                <option value=""></option>
                @if (categories != null && categories.Count > 0)
                {
                    foreach (var item in categories)
                    {
                        var selected = item.Id == Model.CategoryId ? "selected" : "";
                        <option value="@item.Id" @selected>@item.CategoryName</option>
                    }
                }
            </select>
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">標題</label>
        <div class="layui-input-block">
            <input type="text" name="title" lay-verify="title" autocomplete="off" placeholder="這裡輸入文章的標題,注意啦,別做標題黨了..." class="layui-input" value="@Model.Title" />
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">作者</label>
        <div class="layui-input-block">
            <input type="text" name="author" lay-verify="author" placeholder="這裡輸入文章作者哦..." autocomplete="off" class="layui-input" value="@Model.Author" />
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">標籤</label>
        <div class="layui-input-block">
            <input type="text" name="tags" lay-verify="tags" placeholder="這裡是輸入標籤的呢,如果有多個標籤的話,就用逗號分割開吧,記得她是英文逗號才有效的呢..." autocomplete="off" class="layui-input" value="@Model.Tags" />
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">瀏覽量</label>
        <div class="layui-input-block">
            <input type="number" name="hits" lay-verify="number" value="@Model.Hits" autocomplete="off" class="layui-input">
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">排序值</label>
        <div class="layui-input-block">
            <input type="number" name="sort" lay-verify="number" value="@Model.Sort" min="0" placeholder="這裡輸入的數值越高,排序的位置就越前哦.." autocomplete="off" class="layui-input" />
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">置頂</label>
        <div class="layui-input-block">
            @{
                var isTop = Model.IsTop ? "checked" : "";
            }
            <input type="checkbox" name="isTop" value="true" lay-skin="switch" @isTop title="置頂" />
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">SEO標題</label>
        <div class="layui-input-block">
            <input type="text" name="metaTitle" placeholder="這裡寫文章的SEO標題..." value="@Model.MetaTitle" autocomplete="off" class="layui-input">
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">SEO關鍵字</label>
        <div class="layui-input-block">
            <input type="text" name="metaKeywords" placeholder="這裡寫文章的SEO關鍵字..." value="@Model.MetaKeywords" autocomplete="off" class="layui-input">
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">SEO描述</label>
        <div class="layui-input-block">
            <input type="text" name="metaDescription" placeholder="這裡寫文章SEO描述..." value="@Model.MetaDescription" autocomplete="off" class="layui-input">
        </div>
    </div>
    <div class="layui-form-item layui-form-text">
        <label class="layui-form-label">內容</label>
        <div class="layui-input-block">
            <textarea class="layui-textarea layui-hide" required lay-verify="content" id="content" name="content">@Model.Content</textarea>
        </div>
    </div>
    <div class="layui-form-item">
        <div class="layui-input-block">
            <button type="submit" lay-submit="" class="layui-btn" lay-filter="publish">釋出</button>
            <button type="submit" lay-submit="" class="layui-btn" lay-filter="draft">存草稿</button>
            <button type="reset" class="layui-btn layui-btn-primary">重置</button>
        </div>
    </div>
                }
@section scripts{
    <script>
        layui.use(['form', 'layedit', 'jquery'], function () {
            var form = layui.form()
            , layer = layui.layer
            , layedit = layui.layedit
            , $ = layui.jquery;

            //自定義驗證規則
            form.verify({
                title: function (value) {
                    if<