当抄完MusicStore时,你应该对MVC有一个比较清晰的认识了.接下来就需要做个网站来继续增加自己的知识了.那么,该做个什么网站呢.做个图片浏览网站吧,简单而实用.

简单设计

1.首先,页面中间是个图片列表.将所有图片列出来是不太科学的,所以要做个分页浏览的功能.

2.页面右边,有个图片排行榜,列出点击量前10名的图片名称.而且,同一时间段同一客户端的重复点击只能计算一次才合理的.

3.有图片浏览就肯定有图片上传功能啦,还必须要是登录后才能上传.

数据层

采用EF的Code First方式构建数据库,先定义一个ImageModle,放到DbContext数据上下文中,再定义一个DropCreateDatabaseIfModelChanges迁移类,在seed方法中初始化数据,如下

    public class ImageModle
{
[Display(Name="编号")]
public int Id { get; set; }
[Display(Name="图片名")]
public string ImageName { get; set; }
[Display(Name = "图片相对路径")]
public string ImageUrl { get; set; }
[Display(Name = "上传者")]
public string Uploader { get; set; }
[Display(Name = "点击数")]
public int HitCount { get; set; }
[Display(Name = "上传时间")]
public DateTime UploadDateTime { get; set; }
} public class ImageMangeEntities:DbContext
{
public ImageMangeEntities()
: base("DefaultConnection")
{
}
public DbSet<ImageModle> Images { get; set; }
} public class ImageData : DropCreateDatabaseIfModelChanges<ImageMangeEntities>
{
protected override void Seed(ImageMangeEntities context)
{
context.Images.Add(new ImageModle() { ImageUrl = "~/Images/9662C9V1UU02.jpg", ImageName = "图片1", HitCount = 1, UploadDateTime = DateTime.Now });
context.Images.Add(new ImageModle() { ImageUrl = "~/Images/1343698710MJjSR8.jpg", ImageName = "图片2", HitCount = 1, UploadDateTime = DateTime.Now });
context.Images.Add(new ImageModle() { ImageUrl = "~/Images/1343698710MJjSR8.jpg", ImageName = "图片3", HitCount = 1, UploadDateTime = DateTime.Now });
context.Images.Add(new ImageModle() { ImageUrl = "~/Images/9662C9V1UU02.jpg", ImageName = "图片4", HitCount = 1, UploadDateTime = DateTime.Now });
context.Images.Add(new ImageModle() { ImageUrl = "~/Images/1343698710MJjSR8.jpg", ImageName = "图片5", HitCount = 1, UploadDateTime = DateTime.Now });
context.Images.Add(new ImageModle() { ImageUrl = "~/Images/9662C9V1UU02.jpg", ImageName = "图片6", HitCount = 1, UploadDateTime = DateTime.Now });
context.Images.Add(new ImageModle() { ImageUrl = "~/Images/1343698710MJjSR8.jpg", ImageName = "图片7", HitCount = 1, UploadDateTime = DateTime.Now });
context.Images.Add(new ImageModle() { ImageUrl = "~/Images/1343698710MJjSR8.jpg", ImageName = "图片8", HitCount = 1, UploadDateTime = DateTime.Now });
context.Images.Add(new ImageModle() { ImageUrl = "~/Images/9662C9V1UU02.jpg", ImageName = "图片9", HitCount = 1, UploadDateTime = DateTime.Now });
context.Images.Add(new ImageModle() { ImageUrl = "~/Images/1343698713w8Epfw.jpg", ImageName = "图片10", HitCount = 1, UploadDateTime = DateTime.Now });
context.Images.Add(new ImageModle() { ImageUrl = "~/Images/1343698710MJjSR8.jpg", ImageName = "图片11", HitCount = 1, UploadDateTime = DateTime.Now });
context.Images.Add(new ImageModle() { ImageUrl = "~/Images/9662C9V1UU02.jpg", ImageName = "图片12", HitCount = 1, UploadDateTime = DateTime.Now });
context.Images.Add(new ImageModle() { ImageUrl = "~/Images/9662C9V1UU02.jpg", ImageName = "图片13", HitCount = 1, UploadDateTime = DateTime.Now });
context.Images.Add(new ImageModle() { ImageUrl = "~/Images/1343698713w8Epfw.jpg", ImageName = "图片14", HitCount = 1, UploadDateTime = DateTime.Now });
context.Images.Add(new ImageModle() { ImageUrl = "~/Images/1343698713w8Epfw.jpg", ImageName = "图片15", HitCount = 1, UploadDateTime = DateTime.Now });
context.SaveChanges();
}
}

主页

主页的构成很简单,中间是个ul列表,右边是点击排行榜,分页主要是利用PagedListPager扩展方法,View和Control如下

ImageMangeEntities ImageDB = new ImageMangeEntities();

        public ActionResult Index(int? page)
{
List<ImageModle> model = new List<ImageModle>();
model = ImageDB.Images.ToList();
int pagenumber = page ?? 1;
var retmodel = model.ToPagedList(pagenumber, 12);
return View(retmodel);
}
@model IPagedList<MusicStoreTest.Models.ImageModle>
@{
ViewBag.Title = "主页";
}
@using PagedList;
@using PagedList.Mvc;
<h2>图片浏览</h2> <div style="float: left;">
<ul id="album-list">
@foreach (var item in Model)
{
<li><a href="@Url.Action("Details", "Image",
new {id = item.Id})"> <img style="width: 100px; height: 100px" alt="@item.ImageName" src="@Url.Content(@item.ImageUrl)"/>
<span >@item.ImageName</span> </a>
</li>
}
</ul>
</div>
<div style="float:left;">
@{Html.RenderAction("ImageHitList");}
</div>
<div style="vertical-align: middle; clear: both;margin-left: 50px">
@Html.PagedListPager((IPagedList) Model, page => Url.Action("Index", new {page = page}))
</div>

点击量计算实现
    要实现同一时间段内不算点击量累计,可以用HttpContext.Session实现,就定30分钟期限吧,30分钟内无操作就可以继续计算点击量,如下

         <sessionState timeout="30"/>
        public ActionResult Details(int id)
{
List<ImageModle> model = new List<ImageModle>();
var item = ImageDB.Images.Find(id);
var session = HttpContext.Session[id.ToString()];
if (session == null)
{
HttpContext.Session[id.ToString()] = "browseId";
item.HitCount = item.HitCount + 1;
ImageDB.Entry(item).State = EntityState.Modified;
ImageDB.SaveChanges();
} ViewBag.ImageName = item.ImageName;
ViewBag.ImageUrl = item.ImageUrl;return View();
}

上传图片
     还有上传图片功能,要加上[Authorize]特性实现登录后才能上传图片,如下

        [HttpPost]
[Authorize]
public JsonResult UploadImage(HttpPostedFileBase image)
{
if (image != null)
{
string guid = Guid.NewGuid().ToString();
string fileName = Path.GetFileName(image.FileName);
string filePath = Path.Combine(Server.MapPath("~/Files"), guid + "-" + fileName);
string clientPath = "/Files/" + guid + "-" + fileName;
image.SaveAs(filePath);
ImageModle imageModle = new ImageModle();
imageModle.ImageName = fileName;
imageModle.ImageUrl = clientPath;
imageModle.HitCount = 0;
imageModle.Uploader = User.Identity.Name;
imageModle.UploadDateTime=DateTime.Now;
ImageDB.Images.Add(imageModle);
ImageDB.SaveChanges();
return Json(new { success = true, result = clientPath });
}
else
{
return Json(new { success = false, msg = "上传失败!" });
}
}
@{
ViewBag.Title = "UploadImage";
}
<h2 id="ssss">上传图片</h2>
@using (Html.BeginForm("UploadImage", "Image", FormMethod.Post, new { enctype = "multipart/form-data", id = "ImageForm" }))
{
<img alt="请上传图片" id="img" width="800" height="500"/>
<input type="file" id="imageInput" name="image" accept="image/gif,image/jpeg,image/png,gif|jpg|png"/>
<input type="button" id="btn" value="提交"/>
<span class="img-msg"></span>
}
@section Scripts {
<script> $('#imageInput').change(function () {
if ($(this).val().length > 0) {
var file = this.files[0];
var reader = new FileReader();
reader.onload=function (e)
{
$("#img").attr("src", e.target.result);
}
reader.readAsDataURL(file);
}
}); $('#btn').click(function () {
if ($("#imageInput").val().length > 0) {
alert($("#imageInput").val());
$('#ImageForm').ajaxSubmit({
dataType: 'json',
success: function (data) {
$('.img-msg').text("");
if (data.success) {
$("#img").attr("src", data.result);
} else {
alert(data.msg);
}
},
error: function () {
alert("上传失败");
},
beforeSend: function () {
$('.img-msg').text("正在上传,请稍后...");
}
});
}
});
</script>
}

小结

做这么一个网站很简单,熟练的人大概半个小时就可以完成了,但这是入门的必修课.另外,当完成第一个网站时,你就会发现MVC之路才是刚刚开始.

 
 
标签: MVC

【MVC】快速构建一个图片浏览网站的更多相关文章

  1. 【jQuery插件】用jQuery Masonry快速构建一个pinterest网站布局(转)

    [jQuery插件]用jQuery Masonry快速构建一个pinterest网站布局 时间:2011年03月21日作者:愚人码头查看次数:29,744 views评论次数:25条评论 前段时间领导 ...

  2. springboot:快速构建一个springboot项目

    前言: springboot作为springcloud的基础,springboot的热度一直很高,所以就有了这个springboot系列,花些时间来了解和学习为自己做技术储备,以备不时之需[手动滑稽] ...

  3. 快速构建一个简单的单页vue应用

    技术栈 vue-cli webpack vux,vux-loader less,less-loader vue-jsonp vue-scroller ES6 vue-cli:一个vue脚手架工具,利用 ...

  4. 快速构建一个 Springboot

    快速构建一个 Springboot 官网:http://projects.spring.io/spring-boot/ Spring Boot可以轻松创建可以“运行”的独立的,生产级的基于Spring ...

  5. 利用angular4和nodejs-express构建一个简单的网站(五)—用户的注册和登录-HttpClient

    上一节简单介绍了一下利用angular构建的主路由模块,根据上一节的介绍,主页面加载时直接跳转到用户管理界面,下面就来介绍一下用户管理模块.启动应用后,初始界面应该是这样的: 用户管理模块(users ...

  6. 快速构建一个vue项目

    首先介绍一下命令行构建一个vue项目步骤: 1.下载安装node.js(直接运行安装包根据步骤安装完),打开命令行输入:node -v ,出现版本号即安装成功. 2.命令行界面输入:cnpm inst ...

  7. 《Entity Framework 6 Recipes》中文翻译系列 (20) -----第四章 ASP.NET MVC中使用实体框架之在MVC中构建一个CRUD示例

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第四章  ASP.NET MVC中使用实体框架 ASP.NET是一个免费的Web框架 ...

  8. 利用angular4和nodejs-express构建一个简单的网站(一)——构建前后端开发环境

    学习了一段时间的angular4知识,结合以前自学的nodejs-express后端框架知识,做了一个利用angular4作为前端,node-express作为后端服务器的网站.这个网站的功能很简单, ...

  9. 快速构建一个使用axios的vue应用程序(转)

    英文原文:https://www.sitepoint.com/fetching-data-third-party-api-vue-axios/ 译文:https://segmentfault.com/ ...

随机推荐

  1. 从flask视角理解angular(四)Route

    app-routing.modules.ts import { NgModule } from '@angular/core'; import { RouterModule, Routes } fro ...

  2. Visual Studio常用设置

    ●Visual Studio 2008以后,修改代码中大括号的颜色:Tools-->Environment-->Fonts and Colors-->右边[Display items ...

  3. python paramiko 模块简单介绍

    背景,公司的很多服务包括数据库访问都需要通过跳板机访问,为日常工作及使用带来了麻烦,特别数python直接操作数据更是麻烦了,所以一直想实现python 通过跳板机访问数据库的操作. 首先了解到了 p ...

  4. selenium+Page Objects(第一话)

    简单介绍一种selenium用来做web自动化测试的设计模式:Page Objects 一.Page Objects介绍 用官话说它是selenium中的一种页面对象设计模式(不是测试框架!是一种开展 ...

  5. SpringBoot集成TkMybatis插件 (二)

    一.Tkmybatis的好处 Tkmybatis是在mybatis框架的基础上提供了很多工具,让开发更加高效.这个插件里面封装好了我们需要用到的很多sql语句,不过这个插件是通过我们去调用它封装的各种 ...

  6. So you want to be a computational biologist?

    So you want to be a computational biologist? computational biology course

  7. linux文件管理之查找

    1 文件查找 1.1 which 查找可执行文件的路径which是通过 PATH环境变量到该路径内查找可执行文件,所以基本的功能是寻找可执行文件[root@www ~]# which [-a] com ...

  8. 他将Yahoo!Hadoop从20个节点扩展为42000个节点

    他将Yahoo!Hadoop从20个节点扩展为42000个节点 http://www.csdn.net/article/2012-11-08/2811629-Interview-Hortonworks ...

  9. Confluence 6 从一个模板中创建一个空间

    Confluence 已经存储了一系列的模板,这些模板被称为 空间蓝图(space blueprints),这模板具有一些自定义的主页,边栏或者可能有蓝图页面或一些示例内容来帮助你开始使用 Confl ...

  10. Vue音乐项目笔记(一)

    看到一位小可爱的手记,这里记录一下自己需要注意的地方的链接 1.手写轮播图(上) https://blog.csdn.net/weixin_40814356/article/details/80298 ...