基於layui+asp.net mvc實現個人部落格系統
阿新 • • 發佈:2019-01-25
功能如下:
後臺:
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<