cms04--后端-网站管理修改页面接口

修改页面 修改页面用户操作流程: 1、用户进入修改页面,在页面上显示了修改页面的信息 2、用户修改页面的内容,点击“提交”,提示“修改成功”或“修改失败” 修改页面接口定义 /** * 根据页面id查询页面信息 */ @ApiOperation("根据id查询页面接口") public CmsPage findPageById(String pageId); /** * 修改页面 */ @ApiOperation("修改页面接口") public CmsPageResult editPage(String pageId,CmsPage cmsPage); 说明:提交数据使用post、put都可以,只是根据http方法的规范,put方法是对服务器指定资源进行修改,所以这里使用put方法对页面修改进行修改。 修改页面服务端开发 Dao 使用 Spring Data提供的fifindById方法完成根据主键查询 。 使用 Spring Data提供的save方法完成数据保存 。 Service /** * 根据id查询页面 * @param pageId * @return */ public CmsPage findPageById(String pageId) { Optional<CmsPage> optional = cmsPageRepository.findById(pageId); if (optional.isPresent()) { CmsPage cmsPage = optional.get(); return cmsPage; } return null; } /** * 修改页面 * @param pageId * @param cmsPage * @return */ public CmsPageResult editPage(String pageId, CmsPage cmsPage) { // 调用方法查询是否存在 CmsPage pageById = this. »

cms04-前端-删除页面开发与调试

删除页面前端开发 Api方法 /*页面删除*/ export const page_del = id => { return http.requestDelete(apiUrl+'/cms/page/del/'+id) } 编写页面 1、在page_list.vue页面添加删除按钮 <el-table-column label="操作" width="80"> <!--slot-scope:插槽,取得当前行数据,命名为page 拿到行数据,从行中取出pageid--> <template slot-scope="page"> <el-button size="small"type="text" @click="edit(page.row.pageId)">编辑 </el-button> <el-button size="small"type="text" @click="del(page.row.pageId)">删除 </el-button> </template> </el-table-column> 在原来,修改页面按钮的插槽中直接再加一个按钮 删除事件 del:function (pageId) { //调用接口 this.$confirm('确认删除吗?', '提示', {}).then(() => { cmsApi.page_del(pageId).then(res=>{ if (res.success) { this.$message.success("删除成功") //刷新页面 this.query() }else { this.$message.success("删除失败") } }); }) } }, »

cms05--后端-网站管理删除页面接口

删除页面 用户操作流程: 1、用户进入用户列表,点击“删除” 2、执行删除操作,提示“删除成功”或“删除失败” 删除页面接口定义 @ApiOperation("通过ID删除页面") public ResponseResult delete(String id); 删除页面服务端开发 Dao 使用 Spring Data提供的deleteById方法完成删除操作 。 Service //删除页面 public ResponseResult delete(String id){ CmsPage one = this.getById(id); if(one!=null){ //删除页面 cmsPageRepository.deleteById(id); return new ResponseResult(CommonCode.SUCCESS); } return new ResponseResult(CommonCode.FAIL); } Controller @DeleteMapping("/del/{id}") //使用http的delete方法完成岗位操作 public ResponseResult delete(@PathVariable("id") String id) { return pageService.delete(id); } »

freemaker快速入门

Freemarker研究 FreeMarker介绍 1、freemarker是一个用Java开发的模板引擎 常用的java模板引擎还有哪些? Jsp、Freemarker、Thymeleaf 、Velocity 等。 2、模板+数据模型=输出 freemarker并不关心数据的来源,只是根据模板的内容,将数据模型在模板中显示并输出文件(通常为html,也 可以生成其它格式的文本文件) 1、数据模型 数据模型在java中可以是基本类型也可以List、Map、Pojo等复杂类型。 2、来自官方的例子:(https://freemarker.apache.org/docs/dgui_quickstart_basics.html) 数据模型: 模板: 输出: FreeMarker快速入门 freemarker作为springmvc一种视图格式,默认情况下SpringMVC支持freemarker视图格式。 需要创建Spring Boot+Freemarker工程用于测试模板。 创建测试工程 创建一个freemarker 的测试工程专门用于freemarker的功能测试与模板的测试。 pom.xml如下 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>xc-framework-parent</artifactId> <groupId>com.xuecheng</groupId> <version>1.0-SNAPSHOT</version> <relativePath>../xc-framework-parent/pom.xml</relativePath> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>test-freemarker</artifactId> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <!-- http远程访问包--> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-io</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> </project> 配置文件 配置application. »

博客书写说明

配置文件 [[menu.main]] name = “说明” weight = -1 identifier = “sm” url = “/tags/sm” [[menu.main]] name = “主页” weight = -2 identifier = “blog” url = “/” [[menu.main]] name = “Java基础” weight = -3 identifier = “jc” url = “/tags/jc” [[menu.main]] name = “前端” weight = -4 identifier = “qd” url = “/tags/qd” [[menu.main]] name = “后端” weight = -5 identifier = “hd” url = “/tags/hd” [[menu.main]] name = “ms” weight = -6 identifier = “ms” url = “/tags/ms” »

Author image HuangRui on #sm,

多线程

多线程 1.并行与并发概念 ​ 并发是指cpu在一段之间内交替执行多个任务. ​ 并行是指cpu在一个时刻同时执行多个任务 2.进程与线程概念 进程:是指在内存中运行的应用程序,每一个进程都有一个独立的内存空间,一个应用程序可以同时运行多个进程. 线程:是指进程中的一个执行单元,负责当前线程中程序的执行,一个进程至少有一个线程. cpu:中央处理器,对数据进行计算,只会电脑中软件和硬件干活.例如:电脑管家点击运行就会进入内存中,就是一个进程.点击不同的功能,就会开启一条应用程序到cpu的执行路径中,就叫线程. 线程是属于进程的,是进程中的一个执行单元,负责程序的执行. 线程调度: ​ 分时调度:轮流使用cpu,平均分配使用时间. ​ 抢占式调度:优先让优先级高的线程使用cpu,优先级相同则随机选择一个.java用的就是抢占式的方式. 3.单线程演示 主线程:执行(main)方法的线程 单线程程序:java程序中只有一个线程,从main方法开始,从上到下依次执行 public class demoThread01 { public static void main(String[] args) { Person person = new Person("小强"); person.run(); Person person2 = new Person("小哥"); person2.run(); } } public class Person { private String name; public void run() { for (int i = 0; i < 20; i++) { System.out.println(name+i); } } public String getName() { return name; } public void setName(String name) { this. »

常用API1

常用的API1 1.Scanner类 作用:一个可以解析基本类型和字符串的简单文本扫描器。 ​ 例如,以下代码使用户能够从 System.in 中读取一个数: 备注:System.in 系统输入指的是通过键盘录入数据。 使用步骤 导包 java.util.Scanner; 创建对象 `Scanner sc=new Scanner(System.in); 调用 int i=sc.nextInt(); //接受一个键盘录入数据 /** * Scanner 初使用 */ public class Scanner01 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int i = sc.nextInt(); System.out.println(i+"..."); } } 练习 /** * 键盘输入两个数字,并且求和 */ public class Scanner02 { public static void main(String[] args) { Scanner sc = new Scanner(System. »

消息队列与GridFS

消息队列 GridFS 页面发布 需求分析 业务流程如下: 1、管理员进入管理界面点击“页面发布”,前端请求cms页面发布接口。 2、cms页面发布接口执行页面静态化,并将静态化页面(html文件)存储至GridFS中。 3、静态化成功后,向消息队列发送页面发布的消息。 页面发布的最终目标是将页面发布到服务器。 通过消息队列将页面发布的消息发送给各各服务器。 3、消息队列负责将消息发送给各各服务器上部署的Cms Client(Cms客户端)。 在服务器上部署Cms Client(Cms客户端),客户端接收消息队列的通知。 4、每个接收到页面发布消息的Cms Client从GridFS获取Html页面文件,并将Html文件存储在本地服务器。 CmsClient根据页面发布消息的内容请求GridFS获取页面文件,存储在本地服务器。 整个流程就是,基于前面的页面静态化工作之后,在进行页面预览之后,符合要求的页面需要发布到服务器端存一份,由于服务器是分布式的,所以要用到消息队列,发送消息请求发布,服务器接收到消息,从数据库中拿页面存到自己的服务器文件夹中,完成页面发布工作. RabbitMQ研究 要实现上边页面发布的功能,有一个重要的环节就是由消息队列将页面发布的消息通知给各各服务器。 本节的教学目标是对MQ的研究: 1、理解MQ的应用场景 2、理解MQ常用的工作模式 RabbitMQ相关知识参考Rabbitmq笔记模块 »

Author image HuangRui on #xm, #hd,

网络编程

网络编程 主要内容 软件架构CS/BS 网络通信三要素 TCP通信 Socket套接字 ServerSocket 第一章 网络编程入门 1.1软件结构 C/S结构 :全称为Client/Server结构,是指客户端和服务器结构。常见程序有QQ、迅雷等软件。 B/S结构 :全称为Browser/Server结构,是指浏览器和服务器结构。常见浏览器有谷歌、火狐等。 两种架构各有优势,但是无论哪种架构,都离不开网络的支持。网络编程,就是在一定的协议下,实现两台计算机的通信的程序。 1.2 网络通信协议 网络通信协议:通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则,这就好比在道路中行驶的汽车一定要遵守交通规则一样。在计算机网络中,这些连接和通信的规则被称为网络通信协议,它对数据的传输格式、传输速率、传输步骤等做了统一规定,通信双方必须同时遵守才能完成数据交换。 TCP/IP协议: 传输控制协议/因特网互联协议( Transmission Control Protocol/Internet Protocol),是Internet最基本、最广泛的协议。它定义了计算机如何连入因特网,以及数据如何在它们之间传输的标准。它的内部包含一系列的用于处理数据通信的协议,并采用了4层的分层模型,每一层都呼叫它的下一层所提供的协议来完成自己的需求。 上图中,TCP/IP协议中的四层分别是应用层、传输层、网络层和链路层,每层分别负责不同的通信功能。 链路层:链路层是用于定义物理传输通道,通常是对某些网络连接设备的驱动协议,例如针对光纤、网线提供的驱动。 网络层:网络层是整个TCP/IP协议的核心,它主要用于将传输的数据进行分组,将分组数据发送到目标计算机或者网络。 运输层:主要使网络程序进行通信,在进行网络通信时,可以采用TCP协议,也可以采用UDP协议。 应用层:主要负责应用程序的协议,例如HTTP协议、FTP协议等。 1.3 协议分类 通信的协议还是比较复杂的,java.net 包中包含的类和接口,它们提供低层次的通信细节。我们可以直接使用这些类和接口,来专注于网络程序开发,而不用考虑通信的细节。 java.net 包中提供了两种常见的网络协议的支持: UDP:用户数据报协议(User Datagram Protocol)。UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接。简单来说,当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在,就会发出数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据。 由于使用UDP协议消耗资源小,通信效率高,所以通常都会用于音频、视频和普通数据的传输例如视频会议都使用UDP协议,因为这种情况即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。 但是在使用UDP协议传送数据时,由于UDP的面向无连接性,不能保证数据的完整性,因此在传输重要数据时不建议使用UDP协议。UDP的交换过程如下图所示。 特点:数据被限制在64kb以内,超出这个范围就不能发送了。 数据报(Datagram):网络传输的基本单位 TCP:传输控制协议 (Transmission Control Protocol)。TCP协议是面向连接的通信协议,即传输数据之前,在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。 在TCP连接中必须要明确客户端与服务器端,由客户端向服务端发出连接请求,每次连接的创建都需要经过“三次握手”。 三次握手:TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠。 第一次握手,客户端向服务器端发出连接请求,等待服务器确认。 第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求。 第三次握手,客户端再次向服务器端发送确认信息,确认连接。整个交互过程如下图所示。 ​ 完成三次握手,连接建立后,客户端和服务器就可以开始进行数据传输了。由于这种面向连接的特性,TCP协议可以保证传输数据的安全,所以应用十分广泛,例如下载文件、浏览网页等。 »

课程管理-course_add新增课程接口

新增课程 需求分析 用户操作流程如下: 1、用户进入“我的课程”页面,点击“新增课程”,进入新增课程页面 2、填写课程信息,选择课程分类、课程等级、学习模式等。 3、信息填写完毕,点击“提交”,课程添加成功或课程添加失败并提示失败原因。 需要解决的是在新增页面上输入的信息: 1、课程分类 多级分类,需要方便用户去选择。 2、课程等级、学习模式等这些选项建议是可以配置的。 课程分类查询 介绍 在新增课程界面需要选择课程所属分类, 分类信息是整个项目非常重要的信息,课程即商品,分类信息设置的好 坏直接影响用户访问量。 分类信息在哪里应用? 1、首页分类导航 2、课程的归属地 添加课程时要选择课程的所属分类。 数据结构 分类表category的结构如下: 分类查询 数据格式 在添加课程时需要选择课程所属的分类,这里需要定义课程分类查询接口。 接口格式要根据前端需要的数据格式来定义,前端展示课程分类使用elemenet-ui的cascader(级联选择器)组 件。 数据格式例子如下: [ { value: 'zhinan', label: '指南', children: [{ value: 'shejiyuanze', label: '设计原则', children: [{ value: 'yizhi', label: '一致' }, { value: 'fankui', label: '反馈' }, { value: 'xiaolv', label: '效率' }, { value: 'kekong', label: '可控' }] }] } ] 数据模型 1)定义category的模型 »