【MVC】快速构建一个图片浏览网站

引言

当抄完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>
        $(‘#btn‘).click(function() {

            if ($("#imageInput").val().length > 0) {
                $(‘#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之路才是刚刚开始.

时间: 2024-09-30 06:57:17

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

Python Flask 快速构建高性能大型web网站项目实战

Python Flask 快速构建高性能大型web网站项目实战视频[下载地址:https://pan.baidu.com/s/1cUggNbUvptYz5vvwBhsdrg ] 作为最最流行的Python Web开发的微框架,Flask独树一帜.它不会强迫开发者遵循预置的开发规范,为开发者提供了自由度和创意空间.突然发现这个对自动化运维开发非常有用,发上来,给大家! Python Flask 快速构建高性能大型web网站项目实战视频 project.zip 第1章 课程介绍1.1-1.2课程导学

快速构建一个 Springboot

快速构建一个 Springboot 官网:http://projects.spring.io/spring-boot/ Spring Boot可以轻松创建可以"运行"的独立的,生产级的基于Spring的应用程序.我们对Spring平台和第三方图书馆有一个看法,所以你可以从最开始的时候开始吧.大多数Spring Boot应用程序需要很少的Spring配置. 特征 创建独立的Spring应用程序 直接嵌入Tomcat,Jetty或Undertow(不需要部署WAR文件) 提供有意思的&qu

如何快速开发一个漂亮的网站?包括前端的设计,css布局等

如何快速开发一个漂亮的网站?包括前端的设计,css布局等 网站开发看起来简单,但是做起来很乱,对于个人来说尤其如此.比如,需要ps,css,html,js,java等知识,有什么好的办法,可以快速的开发一个网站的前端? 如今有很多快速开发平台:图形化可视化操作,所见即所得:通过拖拉即可完成表单.流程.报表页面的设计:用户通过编写JS文件,调用封装的单据的保存.查询.删除等方法,即可完成页面的功能设计: 平台工具设计的所有的页面发布后,将生成HTML格式的源码文件,WEB系统采用HTML伪静态技术

快速构建一个Spring Boot+MyBatis的项目IDEA(附源码下载)

如何快速构建一个Spring Boot的项目 工具 idea JDK版本 1.8 Spring Boot 版本 1.5.9 环境搭建实现:最基础前端可以访问到数据库内的内容 开始 IDEA 内部新建一个项目,项目类型选择Spring Initializr,Project SDK选择适合你当前环境的版本,这里我选择的是1.8(Spring Boot 2.0以上的版本,JDK选择请选择1.8即以上版本),构建服务选择默认就好,点击Next 填写Group和Artifact(此处我使用的是默认,请根据

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

翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第四章  ASP.NET MVC中使用实体框架 ASP.NET是一个免费的Web框架,它支持3种不同的技术来创建websites(网站)和Web应用:他们分别是,Web Pages,Web Forms,和MVC.虽然MVC是一种非常流行的,有完整的用于软件开发模式理论的技术,但它在ASP.NET中却是一种新的技术. 目前最新的版本是2012年发布的ASP.NET MVC4.自从2008年发布

ember.js快速构建一个应用项目(1)

步骤: 安装Ember. 创建一个新应用程序. 定义路由. 编写一个UI组件. 构建您的应用程序以部署到生产环境. 安装Ember 您可以使用npm(Node.js包管理器,你需要安装node.js)使用单个命令来安装Ember.在终端中输入以下内容: ember new ember-quickstart 创建一个新应用程序 一旦你通过npm安装了Ember CLI,你将可以ember在你的终端中访问一个新的命令.您可以使用该ember new命令来创建一个新的应用程序: ember new e

快速构建一个权限项目(三)

如何构建一个权限项目这里接着我们上次说的来编写代码,我们这个点主要讲的是接口请求全局异常处理, 接下来跟我一起看我编写的代码如何实现的,首先我们要定义一个全局异常的处理类,在common包下建一个类SpringExceptionResolver: package cn.oyc.common; import cn.oyc.exception.ParamException; import cn.oyc.exception.PermissionException; import lombok.exte

react快速构建一个应用项目

安装 dva-cli 你应该会更希望关注逻辑本身,而不是手动敲入一行行代码来构建初始的项目结构,以及配置开发环境. 那么,首先需要安装的是 dva-cli .dva-cli 是 dva 的命令行工具,包含 init.new.generate 等功能,目前最重要的功能是可以快速生成项目以及你所需要的代码片段. $ npm install -g dva-cli 安装完成后,可以通过 dva -v 查看版本,以及 dva -h 查看帮助信息. 创建新应用 安装完 dva-cli 后,我们用他来创建一个

快速构建一个权限项目(二)

好各位小伙伴们我们接着上一篇文章来叙述完善我们的项目,希望大家能够喜欢: 在上一篇文章中我们已经把前面基本的配置都配置好了,下面就来教大家一个我们这个项目的核心类去搭建mybatis吧, 首先我们需要一个工具generate,这个工具我们在网站上也能搜索到,但是我们这里接下来也会直接教大家使用. 首先我们要导入这个工具,这里呢不能上传文件所以我将以代码的形式展示给你们: 首先我们的工具是这样一个节点展示的,其中最重要的是这generator.xml文件,文件内容如下: <?xml version