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

目录

      • 浏览次数
        • 页面加载发送请求
        • 后台处理请求
        • 前台展示
      • 展示日期
      • 富文本编辑
        • 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:文件上传功能

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

浅析 Jetty 中的线程优化思路

作者&#xff1a;vivo 互联网服务器团队- Wang Ke 本文介绍了 Jetty 中 ManagedSelector 和 ExecutionStrategy 的设计实现&#xff0c;通过与原生 select 调用的对比揭示了 Jetty 的线程优化思路。Jetty 设计了一个自适应的线程执行策略&#xff08;EatWhatYouKill&#xff09…

华为eNSP入门实验,Vlan配置,路由配置,用户模式,链路聚合

文章目录 一、同一交换机下的PC通信二、不交换机下的PC通信三、配置静态路由通信四、路由器rip协议配置五、路由器ospf协议配置六、单臂路由七、通过三层交换机使不同的Vlan能连通八、设备consolo密码模式九、设备consolo用户密码模式&#xff08;AAA模式&#xff09;十、Telne…

运算放大器(一):电压跟随器

一、电压跟随器 电压跟随器&#xff08;单位增益放大器、缓冲放大器或隔离放大器&#xff09;是一种电压放大倍数为 1 的运算放大器&#xff0c;能够将输入信号的电压放大到同样的幅度并输出&#xff0c;同时保持输入输出电阻不变&#xff08;电压跟随器的输入电阻很大&#x…

【后端】SSM框架下REST风格代码注释详解

前言 最近学习了一下SSM&#xff0c;不得不说&#xff0c;spring不用注解真的是天打雷劈&#xff0c;就那个bean真的就是折磨人。 下面是我总结的spring注解。 Value 此注解可以用来获取导入的jdbc.properties文件的值。 Value("${jdbc.driver}")private String…

(论文阅读)Chain-of-Thought Prompting Elicits Reasoning in Large Language Models

论文地址 https://openreview.net/pdf?id_VjQlMeSB_J 摘要 我们探索如何生成一个思维链——一系列中间推理步骤——如何显著提高大型语言模型执行复杂推理的能力。 特别是&#xff0c;我们展示了这种推理能力如何通过一种称为思维链提示的简单方法自然地出现在足够大的语言模…

【Flutter】Flutter 如何使用 flutter_swiper

文章目录 一、前言二、flutter_swiper 的概念三、Flutter 中的 flutter_swiper1. 使用的库2. 方法介绍 四、代码示例1. 简单示例2. 完整示例 五、总结 一、前言 在移动应用开发中&#xff0c;轮播图是一种常见的 UI 元素&#xff0c;它可以用来展示一系列的图片或者内容。在 F…

Baumer工业相机堡盟工业相机如何通过BGAPISDK设置多帧采集模式(C++)

Baumer工业相机堡盟工业相机如何通过BGAPISDK设置多帧采集模式&#xff08;C&#xff09; Baumer工业相机Baumer工业相机BGAPISDK和多帧采集模式的技术背景Baumer工业相机通过BGAPISDK设置多帧采集模式功能1.引用合适的类文件2.通过BGAPISDK设置多帧采集模式功能 Baumer工业相机…

Servlet (上篇)

哥几个来学 Servlet 啦 ~~ 目录 &#x1f332;一、什么是 Servlet &#x1f333;二、第一个 Servlet 程序 &#x1f347;1. 创建项目 &#x1f348;2. 引入依赖 &#x1f349;3. 创建目录 &#x1f34a;4. 编写代码 &#x1f34b;5. 打包程序 &#x1f96d;6. 部署程序…

【力扣刷题 | 第十五天】

目录 前言&#xff1a; ​​​​​​​63. 不同路径 II - 力扣&#xff08;LeetCode&#xff09; 343. 整数拆分 - 力扣&#xff08;LeetCode&#xff09; 总结&#xff1a; 前言&#xff1a; 本篇我们主要刷动态规划的题&#xff0c;解题还是严格按照我们在【夜深人静写算法…

macOS Sonoma 14 beta 2 (23A5276g) Boot ISO 原版可引导镜像

macOS Sonoma 14 beta 2 (23A5276g) Boot ISO 原版可引导镜像 本站下载的 macOS 软件包&#xff0c;既可以拖拽到 Applications&#xff08;应用程序&#xff09;下直接安装&#xff0c;也可以制作启动 U 盘安装&#xff0c;或者在虚拟机中启动安装。另外也支持在 Windows 和 …

第4章 流程控制

第4章 流程控制 if else常规用法 单分支&#xff0c;双分支&#xff0c;多分支 带返回值 ​ scala实现java三元运算符 ​ for循环控制 基本语法 for ( 循环变量 <- 数据集 ) { 循环体} package chapter04import scala.language.postfixOpsobject Test02_ForLoop {def ma…

java的嵌套类(nested class)、内部类(inner class)的区别

嵌套类即nested class&#xff0c;内部类即Inner class。 概括来说&#xff0c;嵌套类的概念比内部类概念大。嵌套类包含内部类和非内部类。一个内部类一定是一个嵌套类&#xff0c;但一个嵌套类不一定是一个内部类。 在一个类内部或者接口内部声明的类是嵌套类。 下面这些类是…

php个人简历模板

php个人简历模板一 目前所在&#xff1a; 广州 年 龄&#xff1a; 31 户口所在&#xff1a; 汕头 国 籍&#xff1a; 中国 婚姻状况&#xff1a; 已婚 民 族&#xff1a; 汉族 身 高&#xff1a; 175 cm 体 重&#xff1a; 求职意向 人才类型&#xff1a; 普通求职 应聘职…

React封装axios请求

1、前言 因为最近在进行老系统用新框架改造&#xff0c;正好用到了react&#xff0c;就顺便整理了一下react中对axios进行封装的相关知识点和步骤。 2、如何封装 可以参考一下chat gpt给出的回答。 我大概总结一下&#xff0c;其实就是使用axios.create创建一个axios的实例&…

如何清除浏览器的 DNS 缓存 (Chrome, Firefox, Safari)

如何清除浏览器的 DNS 缓存 (Chrome, Firefox, Safari) Chrome Chromium Edge Firefox Safari clear DNS Cache, flush DNS cache 请访问原文链接&#xff1a;https://sysin.org/blog/clear-browser-dns-cache/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。…

设计模型学习-UML图

1&#xff0c;简介 UML图有很多种类型&#xff0c;但掌握其中的类图、用例图和时序图就可以完成大部分的工作。其中最重要的便是「类图」&#xff0c;它是面向对象建模中最常用和最重要的图&#xff0c;是定义其他图的基础。 类图主要是用来显示系统中的类、接口以及它们之间的…

Qt/C++编写手机版本视频播放器和Onvif工具(可云台和录像)

一、前言 用Qtffmpeg写播放器很多人有疑问&#xff0c;为何不用Qt自己的多媒体框架来写&#xff0c;最重要的原因是Qt自带的目前都依赖具体的本地解码器&#xff0c;如果解码器不支持&#xff0c;那就是歇菜的&#xff0c;最多支持个MP4格式&#xff0c;而且在手机上也都是支持…

音视频数据处理-H265/HEVC视频码流分析

一、H265概述 H265/HEVC&#xff08;Hight Efficiency Video Coding&#xff09;是由ITU-T和ISO/IEC两大组织在H264/AVC的基础之上推出的新一代高效视频编码标准&#xff0c;主要为应对高清和超高清视频在网络传输和数据存储方面带来的挑战。上一篇文章对H264/AVC视频码流进行…

python复习第一章

什么是 Python&#xff1f; Python 是一门流行的编程语言。它由 Guido van Rossum 创建&#xff0c;于 1991 年发布。 它用于&#xff1a; Web 开发&#xff08;服务器端&#xff09;软件开发数学系统脚本 Python 可以做什么&#xff1f; 可以在服务器上使用 Python 来创建…

【软件设计师暴击考点】下午题高频考点暴击系列

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;软件…