B049-cms04-浏览次数 富文本 轮播图 上传

news2024/12/23 20:09:33

目录

      • 浏览次数
        • 页面加载发送请求
        • 后台处理请求
        • 前台展示
      • 展示日期
      • 富文本编辑
        • static下引入富文本资源文件夹
        • 模态框文本域替换成如下内容
        • 底部引入相关文件
        • 调整模态框样式
        • 把富文本选项移到模态框前面
        • 上传表情或图片等富文本
        • 添加操作手动清空富文本编辑器内容
        • 修改操作手动回显富文本编辑器内容
      • 轮播图
        • 侧边菜单栏添加轮播图管理
        • 轮播图跳转和页面准备
        • 查询所有后端实现
        • 页面展示轮播图
        • 高级查询,图片后台展示
      • 上传图片
        • 修改添加或修改模态框
        • 配置上传解析器
        • 后端代码
        • tips:文件上传功能

浏览次数

文章页面浏览次数的实现

页面加载发送请求

	<script type="text/javascript">
		$(function(){// 页面加载
			// 地址栏路径
			var href = location.href;
			// alert(href);  http://localhost/static/template/1611537130388.html
			// 获取url
			var url = href.substring(href.lastIndexOf("/")+1);
			// alert(url)
			$.ajax({
				type: "post",
				url: "/home/updateClickCountByUrl",   //后台路径
				data: {"url":url},
				dataType: "json",
				success: function(msg){
					console.debug(msg.clickCount);
				}
			}); 
		})
	</script>	

后台处理请求

HomeController

	/**
	 * @Description:根据url更新点击量
	 */
	@RequestMapping("/updateClickCountByUrl")
	@ResponseBody
	public Article updateClickCountByUrl(String url){
		
		return service.updateClickCountByUrl(url);
	}

ArticleServiceImpl

	@Override
	public Article updateClickCountByUrl(String url) {
		
		// 根据url查询数据   article
		Article article = mapper.findArticleByUrl(url);
		// 获取点击量
		Integer count = article.getClickCount();
		// 自增一再set回去
		article.setClickCount(count+1);
		mapper.update(article);
		
		return article;
	}

ArticleMapper

	<!-- Article findArticleByUrl(String url); -->
	<select id="findArticleByUrl" resultType="article">
		select * from t_article where url=#{url}
	</select>

前台展示

<span><span b>分类: </span>视频教程</span><span><span b>浏览: </span><span id="clickCount">0</span></span>
	<script type="text/javascript">
		$(function(){// 页面加载
			// 地址栏路径
			var href = location.href;
			// alert(href);  http://localhost/static/template/1611537130388.html
			// 获取url
			var url = href.substring(href.lastIndexOf("/")+1);
			// alert(url)
			$.ajax({
				type: "post",
				url: "/home/updateClickCountByUrl",
				data: {"url":url},
				dataType: "json",
				success: function(msg){
					//console.debug(msg.clickCount);
					$("#clickCount").html(msg.clickCount);
				}
			}); 
		})
	</script>

展示日期

数据由添加操作生成页面的时候Article对象里的数据进到模板里来生成

<div class="info">
    <span><span b>日期: </span><span>${createDate ?date}</span></span><span><span b>浏览: </span><span id="clickCount">0</span></span>
</div>

富文本编辑

图片与视频等非文本多媒体内容一般放入本地工程即本地服务器或云端三方服务器中
案例参考:http://fex.baidu.com/ueditor/
在这里插入图片描述

static下引入富文本资源文件夹

模态框文本域替换成如下内容

<!-- 加载编辑器的容器 -->
<script id="container" name="content" type="text/plain">
       这里写你的初始化内容
</script>

底部引入相关文件

配置文件,编辑器源码文件,和实例化编辑器,修改路径,调整z轴显示可选表情

	<!-- 配置文件 -->
    <script type="text/javascript" src="/static/ueditor/ueditor.config.js">			</script>
	<!-- 编辑器源码文件 -->
    <script type="text/javascript" src="/static/ueditor/ueditor.all.js"></script>
	<!-- 实例化编辑器 -->
    <script type="text/javascript">
	        var ue = UE.getEditor('container');
    </script>

调整模态框样式

大模态框:来自bootstarp官网
修改文字和框体之间空隙:col-md-?

把富文本选项移到模态框前面

加上大数字的z轴

	    <!-- 实例化编辑器 -->
	    <script type="text/javascript">
	        var ue = UE.getEditor('container',{
	        	zIndex: 8888
	        });
	    </script>

上传表情或图片等富文本

默认保存文件到项目中,地址保存进数据库。可在config.json中修改上传参数。

添加操作手动清空富文本编辑器内容

注意重启服务后清空缓存

		    // 添加操作  绑定添加按钮  事件委托
		    $("body").on("click","#addBtn",function(){
 		    	// 清空form中数据
		    	$("#saveForm").clearForm();
				
		    	// 手动清空富文本编辑器内容
		    	 var ue = UE.getEditor('container');		          		           
		             ue.ready(function(){
		                ue.setContent('');  //赋值给UEditor
		             });
		             
		    	// 手动清空隐藏域id
		    	$("#saveId").val("");
		    	
		    	// 弹出模态框
		    	$("#saveModal").modal("show");
		    })

修改操作手动回显富文本编辑器内容

注意重启服务后清空缓存

		    // 修改操作  绑定修改按钮  事件委托
		    $("body").on("click","a[data-row]",function(){
		    	// 清空form中数据
		    	$("#saveForm").clearForm();	// clearForm()、ajaxSubmit()都是jquery-form.js插件的方法
		    	// 数据回显  获取数据
		    	var row = $(this).data("row");
		    	// console.debug(row);
		    	
		    	// 数据回显	插件提供的方法
		    	$("#saveForm").setForm(row);
		    	
		    	// 手动回显富文本编辑器内容
		    	var ue = UE.getEditor('container');		          		           
		            ue.ready(function(){
		                ue.setContent(row.content);  //赋值给UEditor
		            });
		    	
		    	// 弹出模态框
		    	$("#saveModal").modal("show");
		    })

轮播图

侧边菜单栏添加轮播图管理

index.jsp的leftMenu.jsp添加轮播图

<div class="app-sidebar__overlay" data-toggle="sidebar"></div>
    	<aside class="app-sidebar">
      		<div class="app-sidebar__user">	
      			<img class="app-sidebar__user-avatar" width="48px" height="48px" src="/static/system/images/m1.jpg" alt="User Image">
        		<div>
          			<p class="app-sidebar__user-name">John Doe</p>
        		</div>
      		</div>
      		<ul class="app-menu">
	        	<li>
	        		<a class="app-menu__item" href="/system/article/index">
                 <!-- 通过controller跳转到/WEB-INF/views/article/article.jsp -->
	        			<i class="app-menu__icon fa fa-dashboard"></i>
	        			<span class="app-menu__label">文章管理</span>
	        		</a>
	        	</li>
	        	<li>
	        		<a class="app-menu__item" href="/system/slide/index">
	        			<i class="app-menu__icon fa fa-dashboard"></i>
	        			<span class="app-menu__label">轮播图管理</span>
	        		</a>
	        	</li>
      		</ul>
		</aside>

轮播图跳转和页面准备

新建slideController

@Controller
@RequestMapping("/system/slide")
public class SlideController {
	
	@RequestMapping("/index")
	public String index(){					
		return "slide/slide";
	}
}

复制Article文件夹和Article.jsp文件到同级目录并改名slide和slide.jsp,修改slide.js引入路径

复制Article文件夹和Article.js文件到同级目录并改名slide和slide.js,slide.js中修改findAll路径

查询所有后端实现

slide.js

document.querySelector('#table-demo-ajaxPageCode').GM({
		        gridManagerName: 'demo-ajaxPageCode',	//名字随意
		        ajaxData: '/system/slide/findAll',	//改成findAll
		        ajaxType: 'POST',
		        supportAjaxPage: true,		//是否支持分页
		        sizeData: [5,10,15,20],
		        pageSize: 5,
		        currentPageKey: "localPage",
		        pageSizeKey: "pageSize",
		        supportAdjust: false,
		        supportDrag: false,
		        columnData: [

后端代码

页面展示轮播图

document.querySelector('#table-demo-ajaxPageCode').GM({
		        gridManagerName: 'demo-ajaxPageCode',	//名字随意
		        ajaxData: '/system/slide/findAll',	//改成findAll
		        ajaxType: 'POST',
		        supportAjaxPage: true,		//是否支持分页
		        sizeData: [5,10,15,20],
		        pageSize: 5,
		        currentPageKey: "localPage",
		        pageSizeKey: "pageSize",
		        supportAdjust: false,
		        supportDrag: false,
		        columnData: [
		            {
		            	key: 'name',
		                align: "center",
		                text: '图片名称'
		            },{
		                key: 'path',
		                align: "center",
		                text: 'path',
		            },{
		                key: 'createDate',
		                align: "center",
		                text: '日期'
		            },{
		            	key: 'enable',
		                align: "center",
		                text: '是否启用',
		                template: function(cell, row, index, key){// 模板
		                	//console.debug(cell) // enable属性对应的值
		                	//console.debug(row) // 一行数据的信息  是一个对象
		                	//console.debug(index) // 索引
		                	//console.debug(key) // key对应的字段
		                    return cell?"启用":"禁用";
		                }
		            },{
		                key: 'id',
		                align: "center",
		                text: '操作 &nbsp;&nbsp;<a style="color:green" id="addBtn" href="javascript:;">添加</a>',
		                template: function(cell, row, index, key){// 模板
		                	// row是一个json对象,要转成string
		                	 var str = JSON.stringify(row);
		                	//  console.debug(str);
		                	// data:  数据必须是标准格式  {'id':10,'name':'zs'}
		                    return '<a style="color:red" data-id="'+cell+'" href="javascript:;">删除</a>&nbsp;&nbsp;'+
		                    	   "<a style='color:blue' data-row='"+str+"' href='javascript:;'>修改</a>";
		                }
		            }
		        ]
		    });

高级查询,图片后台展示

jsp,js,query,mapper,

SlideQuery

@Data
@AllArgsConstructor
@NoArgsConstructor
public class SlideQuery extends PageQuery{

	private String name;
	private Boolean enable;
}

mapper

<mapper namespace="cn.itsource.mapper.SlideMapper">
	<select id="findAll" resultType="Slide">
		select * from t_slide
		<include refid="query"></include>
		limit #{begin}, #{pageSize}
		
	</select>	
	
	<!-- Integer findCount(ArticleQuery aq); -->
	<select id="findCount" resultType="int">
		select count(id) from t_slide
		<include refid="query"></include>
	</select>	
	
	<!-- void add(Slide slide); -->
	<insert id="add">
		insert into t_slide(name,path,createDate,enable) 
		values(#{name},#{path},#{createDate},#{enable})
	</insert>
		
	<!-- sql片段 -->
	<sql id="query">
		<where>
			<if test="enable!=null">
				and enable = #{enable}
			</if>
			
			<if test="name!=null and ''!=name.trim()">
				and name like concat('%',trim(#{name}),'%' )
			</if>
		</where> 
	</sql>	
</mapper>

图片后台展示

					{
		                key: 'path',
		                align: "center",
		                text: 'path',
		                template: function(cell, row, index, key){// 模板
		                    return "<img width='50px' src='"+cell+"'>";
		                }
		            },

创建upload文件夹,放入图片,数据库引用路径,前台展示引用图片

tips:删除富文本

上传图片

文件通过上传解析器和IO流代码上传到工程里,信息保存进数据库。

修改添加或修改模态框

<!-- 添加或者修改的模态框 -->
<div class="modal fade bs-example-modal-lg" id="saveModal">
    <div class="modal-dialog modal-lg">
        <div class="modal-content message_align">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                    <span aria-hidden="true">×</span>
                </button>
            </div>
            <div class="modal-body">
                <form action="/system/slide/save" method="post" class="form-horizontal" id="saveForm">
                    <input type="hidden" name="id" id="saveId">
                    <div class="form-group row">
                        <label for="photo" class="control-label col-md-2">上传图片</label>
                        <div class="col-md-10">
                            <input class="form-control" type="file" name="photo">
                        </div>
                    </div>
                    <div class="form-group row">
                        <label for="enable" class="control-label col-md-2" >是否启用</label>
                        <div class="col-md-10">
                            <div class="form-check">
                                <label class="form-check-label">
                                    <input class="form-check-input" type="radio" checked="checked" id="enable" name="enable" value="1">启用
                                </label>
                            </div>
                            <div class="form-check">
                                <label class="form-check-label">
                                    <input class="form-check-input" type="radio" name="enable" value="0">禁用
                                </label>
                            </div>
                        </div>
                    </div>

                </form>
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
                <a href='javascript:void(0);' id="saveButton" class="btn btn-success" >确定</a>
            </div>
        </div>
    </div>
</div>

配置上传解析器

applicationContext-mvc.xml

	<!-- 上传解析器 -->
	<bean id="multipartResolver"
		class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<!-- 设置上传文件的最大尺寸为1MB -->
		<property name="maxUploadSize">
			<!-- spring el写法:1MB -->
			<value>#{1024*1024*20}</value>
		</property>
		<!-- 效果同上 -->
		<!-- <property name="maxUploadSize" value="1048576" /> -->
	</bean>

后端代码

SlideController

	@RequestMapping("/save")
	@ResponseBody
	public AjaxResult save(Slide slide,HttpServletRequest req,MultipartFile photo){
		
		try {
			service.save(slide,req,photo);
			return new AjaxResult();
		} catch (Exception e) {
			e.printStackTrace(); // 打印异常信息
			return new AjaxResult(false, "保存失败");
		}
	}

SlideServiceImpl

	@Override
	public void save(Slide slide, HttpServletRequest req,MultipartFile photo) throws Exception {
		// 获取upload路径
		String realPath = req.getServletContext().getRealPath("/upload");
		File file = new File(realPath);		
		if(!file.exists()){// 如果路径不存在,就创建一个
			file.mkdirs();
		}		
		// 判断photo是否为空
		if(photo!=null){// 做上传操作	
			// 获取文件名
			//获取后缀
			String oName = photo.getOriginalFilename(); // asldfsadf.jpg
			String suffix = oName.substring(oName.lastIndexOf("."));
			String name = System.currentTimeMillis()+suffix;
			// 准备输入流
			InputStream input = photo.getInputStream();			
			// 输出流
			FileOutputStream output = new FileOutputStream(new File(realPath, name));
			// 上传的核心代码
			IOUtils.copy(input, output);
			
			// 关流
			output.close();
			input.close();
			
			// name path
			slide.setName(name);
			slide.setPath("/upload/"+name);
				
		}
		
		// 添加数据库操作
		if(slide.getId()==null){
			if(photo!=null){
				mapper.add(slide);
			}
		}else{// 修改操作
			
		}	
	}

SlideMapper

	<!-- void add(Slide slide); -->
	<insert id="add">
		insert into t_slide(name,path,createDate,enable) 
		values(#{name},#{path},#{createDate},#{enable})
	</insert>

tips:文件上传功能

上传三要素 上传解析器 文件上传

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/683164.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

postman接口测试—Restful接口开发与测试

开发完接口&#xff0c;接下来我们需要对我们开发的接口进行测试。接口测试的方法比较多&#xff0c;使用接口工具或者Python来测试都可以&#xff0c;工具方面比如之前我们学习过的Postman或者Jmeter &#xff0c;Python脚本测试可以使用Requests unittest来测试。 测试思路…

抖音短视频矩阵系统源码:技术开发与实践

目录 一.短视频账号矩阵管理系统囊括的技术 1.开发必备的开发文档说明&#xff1a; 二.技术文档分享&#xff1a; 1.底层框架系统架构&#xff1a; 2.数据库接口设计 1.技术开发必备的开发文档说明&#xff1a; 1.1系统架构&#xff1a; 抖音SEO排名系统主要由以下几个模…

PHP 对PDF文件实现数字签名

PHP通过TCPDF库对生成的PDF文件进行数字签名。 效果如下&#xff1a; 这个是因为签名证书不在可信任证书列表中。 目录 准备数字证书 1.申请数字证书 2.自签名证书 安装TCPDF 证书签名 设置证书路径 设置证书信息 设置文档签名 设置签名外观 图像签名外观 空签名外观…

git使用命令技巧

文章目录 前言查看提交用户名更改提交用户名查看文件的diff查看提交记录Git 本地分支管理查看、切换、创建和删除分支 前言 我们在使用git的时候&#xff0c;提交后会看到如下记录&#xff1a; 经常会遇到提交后&#xff0c;这个作者的名字和自己设置的名字不一致&#xff0…

Python文件操作指南:编码、读取、写入和异常处理

文章目录 文件的编码文件的读取使用 read 方法读取整个文件内容&#xff1a;使用 readlines 方法按行读取文件内容并存储到列表中&#xff1a;使用迭代器遍历文件内容&#xff1a; 文件的写入文件的追加文件操作的综合案例文件的关闭文件的存在性检查异常处理文件操作的更多方法…

如何下载外文文献,PubMed中的文献怎么获取

查找外文文献常用数据库有&#xff1a;PubMed、ScienceDirect、Wiley、Web of Science、EI等等。今天单独讲一下PubMed数据库文献的获取方法。 PubMed是生物医药领域使用最广泛的免费文献检索系统。但PubMed 的资讯并不包括期刊论文的全文&#xff0c;只是提供了指向全文提供者…

Meta Quest v55系统推送,浏览器支持多点触摸

6月25日青亭网报道&#xff0c;此前我们报道了Quest v55公测版系统更新解锁了GPU和CPU频率限制&#xff0c;以及动态分辨率渲染功能。 现在v55系统正式向所有人开启推送&#xff0c;并且加入了更多功能&#xff1a; 1&#xff0c;解锁GPU和CPU限制&#xff0c;支持动态分辨率渲…

Linux进程间通信——管道(上)

目录 前文 一&#xff0c;进程间通信介绍 二&#xff0c;什么是管道&#xff1f; 三&#xff0c;管道的基本原理 3.1 匿名管道 3.2 管道基本原理 四&#xff0c;样例代码 五&#xff0c;管道的读写规则 六&#xff0c;管道的特点 总结 前文 本文主要是讲解一下进程间…

一文告诉你低代码的价值

随着数字化时代的到来&#xff0c;软件开发已经成为企业不可或缺的一部分。然而&#xff0c;传统的软件开发过程往往缓慢而昂贵。由此&#xff0c;低代码开发平台的出现给企业带来了一种新的软件开发方式。在本文中&#xff0c;我们将探讨低代码开发平台的用处和发展史&#xf…

【数据分享】1929-2022年全球站点的逐年平均露点数据(Shp\Excel\12000个站点)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、能见度等指标&#xff0c;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 对于具体到监测站点的气象数据&#xff0c;之前我们分享过1929-2022年全球气象…

centos7.x升级openeuler详细操作教程

本次升级使用工具为苏研提供 1. 升级前准备操作 1.1 注意事项 ● 迁移工具安装在辅助机中&#xff08;不进行系统迁移的机器&#xff09; ● 辅助机至少给迁移工具的安装预留 1.6G 内存空间 ● 安装之前需要关闭防火墙和 SELinux 的特殊要求 ● 工具安装环境需开启工具端口…

论文格式中要求作者加入orcid的链接在名字后边

论文格式中要求作者加入orcid的链接在名字后边&#xff0c;如下图&#xff1a; 使用网上给的各种写法会出现以下问题&#xff1a; &#xff08;1&#xff09;插入位置不合适 &#xff08;2&#xff09;出现一个正方形的框 &#xff08;3&#xff09;所有参考文献带框&#xff…

中国人民大学与加拿大女王大学金融硕士——努力必有回响,加油,金融人!

有付出&#xff0c;就会有收获&#xff1b;有努力&#xff0c;就会有回响。我们为梦想挥汗如雨&#xff0c;我们为未来奋力跋涉。金融领域在职读研的我们&#xff0c;突破了工作、生活等重围&#xff0c;进入到紧张学习的阶段&#xff0c;充分利用有限的时间完成自己蜕变&#…

微前端(micro-app)使用手册

转载请注明出处&#xff0c;点击此处 查看更多精彩内容 micro-app 使用手册 micro-app 是借鉴了 Web Component 的思想&#xff0c;通过 Custom Element 结合自定义的 Shadow Dom&#xff0c;将微前端封装成一个类 Web Component 组件&#xff0c;从而实现微前端的组件化渲染。…

项目集活动—项目集交付阶段活动

项目集交付阶段活动包括协调和管理项目集实际交付所需执行的项目集活动。这些活动包括围绕 变更控制、报告和信息发布所开展的活动&#xff0c;以及围绕成本、采购、质量和风险所开展的活动。 这些活动提供了贯穿整个项目集生命周期的支持活动和流程&#xff0c;旨在提供项目集…

第十三章 Transformer注意力机制

系列文章目录 第一章 AlexNet网络详解 第二章 VGG网络详解 第三章 GoogLeNet网络详解 第四章 ResNet网络详解 第五章 ResNeXt网络详解 第六章 MobileNetv1网络详解 第七章 MobileNetv2网络详解 第八章 MobileNetv3网络详解 第九章 ShuffleNetv1网络详解 第十章…

日志分析篇之Linux日志分析

0x00 前言 Linux系统拥有非常灵活和强大的日志功能&#xff0c;可以保存几乎所有的操作记录&#xff0c;并可以从中检索出我们需要的信息。 本文 简介一下Linux系统日志及日志分析技巧。 0x01 日志简介 日志默认存放位置&#xff1a;/var/log/ 查看日志配置情况&#xff1a;…

抖音本地生活林客服务商开通

抖音林客系统是一种面向本地生活服务的平台&#xff0c;它将消费者与商家联系在一起&#xff0c;在提供更便捷的服务的同时也创造了商业机会。考虑到目前互联网和移动设备的普及程度&#xff0c;以及人们对于生活质量和便利性的不断追求&#xff0c;抖音林客系统具有广阔的市场…

【AUTOSAR】AUTOSAR开发工具链(十)----基于BTC的MIL/SIL测试操作说明(2)

三、PowerWindow demon SIL测试 <一>、如果是手写的纯C代码使用方法如下 创建C代码工程文件 添加C代码的工程文件和不在一个文件夹的头文件路径 选择测试结构 接口参数格式定义 设置采样时间等于调度周期 点击import,添加测试用例类似于MIL测试 <二>、如果是模型…

小航助学2023年6月GESP_C++二级试卷(含题库答题软件账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;_程序猿下山的博客-CSDN博客 单选题2.0分 删除编辑附件图文 答案:D 第1题高级语言编写的程序需要经过以下&#xff08; &#xff09;操作&#xff0c;可以生成在…