前端技术
HTML
CSS
Javascript
前端框架和UI库
VUE
ReactJS
AngularJS
JQuery
NodeJS
JSON
Element-UI
Bootstrap
Material UI
服务端和客户端
Java
Python
PHP
Golang
Scala
Kotlin
Groovy
Ruby
Lua
.net
c#
c++
后端WEB和工程框架
SpringBoot
SpringCloud
Struts2
MyBatis
Hibernate
Tornado
Beego
Go-Spring
Go Gin
Go Iris
Dubbo
HessianRPC
Maven
Gradle
数据库
MySQL
Oracle
Mongo
中间件与web容器
Redis
MemCache
Etcd
Cassandra
Kafka
RabbitMQ
RocketMQ
ActiveMQ
Nacos
Consul
Tomcat
Nginx
Netty
大数据技术
Hive
Impala
ClickHouse
DorisDB
Greenplum
PostgreSQL
HBase
Kylin
Hadoop
Apache Pig
ZooKeeper
SeaTunnel
Sqoop
Datax
Flink
Spark
Mahout
数据搜索与日志
ElasticSearch
Apache Lucene
Apache Solr
Kibana
Logstash
数据可视化与OLAP
Apache Atlas
Superset
Saiku
Tesseract
系统与容器
Linux
Shell
Docker
Kubernetes
[博客内容管理与更新的Vue解决方案]的搜索结果
这里是文章列表。热门标签的颜色随机变换,标签颜色没有特殊含义。
点击某个标签可搜索标签相关的文章。
点击某个标签可搜索标签相关的文章。
转载文章
...代前端开发领域,随着Vue3的发布和广泛应用,开发者们对其生态建设的关注度与日俱增。近期,Vue3社区不断推出新的工具和库以适应更高效、规范化的开发需求。例如,Vite作为由Vue.js作者尤雨溪亲自操刀的新型构建工具,以其快速热更新、按需编译等特性深受开发者喜爱,配合TypeScript可以进一步提升项目代码质量及可维护性。 在UI组件库方面,Element-Plus作为Vue3生态的重要一环,持续迭代升级,提供更多丰富且易于使用的组件供开发者选择。与此同时,状态管理库Pinia也在Vue3的状态管理解决方案中崭露头角,其简洁易用的设计理念让状态管理更为灵活便捷。 在工程化配置上,Eslint和Prettier的组合已成为业界标准,保证代码风格一致性的同时提升了团队协作效率。此外,TailwindCSS这类实用的原子化CSS框架被更多项目采纳,简化了样式编写流程,尤其适合后台管理系统等复杂项目的样式设计。 至于测试环节,Jest凭借其强大的断言库和模拟功能,在单元测试领域占据主导地位。对于Vue3应用,Vue Test Utils提供了对Vue组件进行单元测试的强大支持,确保代码质量与稳定性。 综上所述,Vue3生态正在以前所未有的速度发展和完善,无论是核心框架还是周边工具链都在与时俱进,为开发者带来更加先进、高效的开发体验。建议读者关注官方文档、技术博客以及GitHub上的最新动态,紧跟社区步伐,不断提升自身的技能树,以应对未来日益复杂的前端开发挑战。
2023-10-05 12:27:41
116
转载
转载文章
本篇文章为转载内容。原文链接:https://blog.csdn.net/codeyee/article/details/107558901。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。 😎 知识点概览 为了方便后续回顾该项目时能够清晰的知道本章节讲了哪些内容,并且能够从该章节的笔记中得到一些帮助,所以在完成本章节的学习后在此对本章节所涉及到的知识点进行总结概述。 本章节为【学成在线】项目的 day15 的内容 根据 课程ID 搜索该课程已发布的课程信息,并返回该课程的所有课程计划信息。 将指定课程 发布时 所的课程计划的媒资信息保存到 teachplan_media_publish 表中, 根据 课程计划id 搜索该课程计划所对应的媒资信息,需要用到的是该课程计划对应的 m3u8 地址,用于在线播放视频,该接口在课程管理服务中开发,供学习服务进行远程调用。 在学习服务中远程调用 课程计划媒资信息查询接口,获取该课程计划的视频播放的 m3u8 url地址,并返回给前端,前端使用该 url 进行视频的在线播放。 在线学习完整的测试流程:媒资信息的上传、选择、发布到前端门户、搜索门户测试,在线学习的播放视频。 目录 内容会比较多,小伙伴门可以根据目录进行按需查阅。 文章目录 😎 知识点概览 目录 一、学习页面:查询课程计划 0x01 需求分析 0x02 Api接口 0x03 服务端开发 Controller Service 测试 0x04 前端开发 配置NGINX虚拟主机 前端 API 方法 前端 API 方法调用 测试 二、学习页面:获取视频播放地址 0x01 需求分析 0x02 课程发布:储存媒资信息 需求分析 数据模型 Dao Service 测试 0x03 Logstash:扫描课程计划媒资 创建索引 创建模板文件 配置 mysql.conf 启动 logstash.bat Logstash多实例运行 0x04 搜素服务:查询课程媒资接口 需求分析 Api接口定义 Service Controller 测试 三、在线学习:接口开发 0x01 需求分析 0x02 搭建开发环境 0x03 Api接口 0x04 服务端开发 需求分析 搜索服务注册Eureka 搜索服务客户端 自定义错误代码 Service Controller 测试 0x05 前端开发 需求分析 api方法 配置代理 视频播放页面 简单的测试 完整的测试 1、上传文件 一些问题 ~~方案1:删除本地分块文件重新尝试上传~~ 方案2:检查前端提交的MD5值是否正确 2、为课程计划选择媒资信息 3、前端门户测试 四、待完善的一些功能 😁 认识作者 一、学习页面:查询课程计划 0x01 需求分析 到目前为止,我们已可以编辑课程计划信息并上传课程视频,下一步我们要实现在线学习页面动态读取章节对应的视频并进行播放。在线学习页面所需要的信息有两类: 课程计划信息 课程学习信息(视频地址、学习进度等) 如下图: 在线学习集成媒资管理的需求如下: 1、在线学习页面显示课程计划 2、点击课程计划播放该课程计划对应的视频 本章节实现学习页面动态显示课程计划,进入不同课程的学习页面右侧动态显示当前课程的课程计划。 0x02 Api接口 课程计划信息从哪里获取? 在课程发布完成后会自动发布到一个 course_pub 的表中,logstash 会自动将课程发布后的信息自动采集到 ES 索引库中,这些信息也包含课程计划信息。 所以考虑性能要求,课程发布后对课程的查询统一从 ES 索引库中查询。 前端通过请求 搜索服务 获取课程信息,需要单独在 搜索服务 中定义课程信息查询接口。 本接口接收课程id,查询课程所有信息返回给前端。 我们在搜素服务 API 下添加以下方法 @ApiOperation("根据id搜索课程发布信息")public Map<String,CoursePub> getdetail(String id); 返回的课程信息为 json 结构:key 为课程id,value 为课程内容。 0x03 服务端开发 在搜索服务中开发查询课程信息接口。 Controller 在搜素服务下添加以下方法 / 根据id搜索课程发布信息 @param id 课程id @return JSON数据/@Override@GetMapping("/getdetail/{id}")public Map<String, CoursePub> getdetail(@PathVariable("id")String id) {return esCourseService.getdetail(id);} Service / 根据id搜索课程发布信息 @param id 课程id @return JSON数据/public Map<String, CoursePub> getdetail(String id) {//设置索引SearchRequest searchRequest = new SearchRequest(es_index);//设置类型searchRequest.types(es_type);//创建搜索源对象SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//设置查询条件,根据id进行查询searchSourceBuilder.query(QueryBuilders.termQuery("id",id));//这里不使用source的原字段过滤,查询所有字段// searchSourceBuilder.fetchSource(new String[]{"name", "grade", "charge","pic"}, newString[]{});//设置搜索源对象searchRequest.source(searchSourceBuilder);//执行搜索SearchResponse searchResponse = null;try {searchResponse = restHighLevelClient.search(searchRequest);} catch (IOException e) {e.printStackTrace();}//获取搜索结果SearchHits hits = searchResponse.getHits();SearchHit[] searchHits = hits.getHits(); //获取最优结果Map<String,CoursePub> map = new HashMap<>();for (SearchHit hit: searchHits) {//从搜索结果中取值并添加到coursePub对象Map<String, Object> sourceAsMap = hit.getSourceAsMap();String courseId = (String) sourceAsMap.get("id");String name = (String) sourceAsMap.get("name");String grade = (String) sourceAsMap.get("grade");String charge = (String) sourceAsMap.get("charge");String pic = (String) sourceAsMap.get("pic");String description = (String) sourceAsMap.get("description");String teachplan = (String) sourceAsMap.get("teachplan");CoursePub coursePub = new CoursePub();coursePub.setId(courseId);coursePub.setName(name);coursePub.setPic(pic);coursePub.setGrade(grade);coursePub.setTeachplan(teachplan);coursePub.setDescription(description);//设置map对象map.put(courseId,coursePub);}return map;} 测试 使用 swagger-ui 或 postman 测试查询课程信息接口。 0x04 前端开发 配置NGINX虚拟主机 学习中心的二级域名为 ucenter.xuecheng.com ,我们在 nginx 中配置 ucenter 虚拟主机。 学成网用户中心server {listen 80;server_name ucenter.xuecheng.com;个人中心location / {proxy_pass http://ucenter_server_pool;} } 前端ucenterupstream ucenter_server_pool{server 127.0.0.1:7081 weight=10;server 127.0.0.1:13000 weight=10;} 在学习中心要调用搜索的 API,使用 Nginx 解决代理,如下图: 在 ucenter 虚拟主机下配置搜索 Api 代理路径 后台搜索(公开api)upstream search_server_pool{server 127.0.0.1:40100 weight=10;} 学成网用户中心server {listen 80;server_name ucenter.xuecheng.com;个人中心location / {proxy_pass http://ucenter_server_pool;}后端搜索服务location /openapi/search/ {proxy_pass http://search_server_pool/search/;} } 前端 API 方法 在学习中心 xc-ui-pc-leanring 对课程信息的查询属于基础常用功能,所以我们将课程查询的 api 方法定义在base 模块下,如下图: 在system.js 中定义课程查询方法: import http from './public'export const course_view = id => {return http.requestGet('/openapi/search/course/getdetail/'+id);} 前端 API 方法调用 在 learning_video.vue 页面中调用课程信息查询接口得到课程计划,将课程计划json 串转成对象。 xc-ui-pc-leanring/src/module/course/page/learning_video.vue 1、定义视图 课程计划 <!--课程计划部分代码--><div class="navCont"><div class="course-weeklist"><div class="nav nav-stacked" v-for="(teachplan_first, index) in teachplanList"><div class="tit nav-justified text-center"><i class="pull-left glyphicon glyphicon-th-list"></i>{ {teachplan_first.pname} }<i class="pull-right"></i></div><li v-if="teachplan_first.children!=null" v-for="(teachplan_second, index) in teachplan_first.children"><i class="glyphicon glyphicon-check"></i><a :href="url" @click="study(teachplan_second.id)">{ {teachplan_second.pname} }</a></li><!-- <div class="tit nav-justified text-center"><i class="pull-left glyphicon glyphicon-th-list"></i>第一章<i class="pull-right"></i></div><li ><i class="glyphicon glyphicon-check"></i><a :href="url" >第一节</a></li>--><!--<li><i class="glyphicon glyphicon-unchecked"></i>为什么分为A、B、C部分</li>--></div></div></div> 课程名称 <div class="top text-center">{ {coursename} }</div> 定义数据对象 data() {return {url:'',//当前urlcourseId:'',//课程idchapter:'',//章节Idcoursename:'',//课程名称coursepic:'',//课程图片teachplanList:[],//课程计划playerOptions: {//播放参数autoplay: false,controls: true,sources: [{type: "application/x-mpegURL",src: ''}]},} } 在 created 钩子方法中获取课程信息 created(){//当前请求的urlthis.url = window.location//课程idthis.courseId = this.$route.params.courseId//章节idthis.chapter = this.$route.params.chapter//查询课程信息systemApi.course_view(this.courseId).then((view_course)=>{if(!view_course || !view_course[this.courseId]){this.$message.error("获取课程信息失败,请重新进入此页面!")return ;} let courseInfo = view_course[this.courseId]console.log(courseInfo)this.coursename = courseInfo.nameif(courseInfo.teachplan){let teachplan = JSON.parse(courseInfo.teachplan);this.teachplanList = teachplan.children;} })}, 测试 在浏览器请求:http://ucenter.xuecheng.com//learning/4028e581617f945f01617f9dabc40000/0 4028e581617f945f01617f9dabc40000:第一个参数为课程 id,测试时从 ES索引库找一个课程 id 0:第二个参数为课程计划 id,此参数用于点击课程计划播放视频。 如果出现跨域问题,但是确定已经配置了跨域,请尝试结束所以 nginx.exe 的进程 和 清空浏览器缓存。 如果还没有解决?重启电脑试试。 二、学习页面:获取视频播放地址 0x01 需求分析 用户进入在线学习页面,点击课程计划将播放该课程计划对应的教学视频。 业务流程如下: 业务流程说明: 1、用户进入在线学习页面,页面请求搜索服务获取课程信息(包括课程计划信息)并且在页面展示。 2、在线学习请求学习服务获取视频播放地址。 3、学习服务校验当前用户是否有权限学习,如果没有权限学习则提示用户。 4、学习服务校验通过,请求搜索服务获取课程媒资信息。 5、搜索服务请求ElasticSearch获取课程媒资信息。 为什么要请求 ElasticSearch 查询课程媒资信息? 出于性能的考虑,公开查询课程信息从搜索服务查询,分摊 mysql 数据库的访问压力。 什么时候将课程媒资信息存储到 ElasticSearch 中? 课程媒资信息是在课程发布的时候存入 ElasticSearch,因为课程发布后课程信息将基本不再修改。 0x02 课程发布:储存媒资信息 需求分析 课程媒资信息是在课程发布的时候存入 ElasticSearch 索引库,因为课程发布后课程信息将基本不再修改,具体的业务流程如下。 1、课程发布,向课程媒资信息表写入数据。 1)根据课程 id 删除 teachplanMediaPub 中的数据 2)根据课程 id 查询 teachplanMedia 数据 3)将查询到的 teachplanMedia 数据插入到 teachplanMediaPub 中 2、Logstash 定时扫描课程媒资信息表,并将课程媒资信息写入索引库。 数据模型 在 xc_course 数据库创建课程计划媒资发布表: CREATE TABLE teachplan_media_pub (teachplan_id varchar(32) NOT NULL COMMENT '课程计划id',media_id varchar(32) NOT NULL COMMENT '媒资文件id',media_fileoriginalname varchar(128) NOT NULL COMMENT '媒资文件的原始名称',media_url varchar(256) NOT NULL COMMENT '媒资文件访问地址',courseid varchar(32) NOT NULL COMMENT '课程Id',timestamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT'logstash使用',PRIMARY KEY (teachplan_id)) ENGINE=InnoDB DEFAULT CHARSET=utf8 数据模型类如下: package com.xuecheng.framework.domain.course;import lombok.Data;import lombok.ToString;import org.hibernate.annotations.GenericGenerator;import javax.persistence.;import java.io.Serializable;import java.util.Date;@Data@ToString@Entity@Table(name="teachplan_media_pub")@GenericGenerator(name = "jpa-assigned", strategy = "assigned")public class TeachplanMediaPub implements Serializable {private static final long serialVersionUID = -916357110051689485L;@Id@GeneratedValue(generator = "jpa-assigned")@Column(name="teachplan_id")private String teachplanId;@Column(name="media_id")private String mediaId;@Column(name="media_fileoriginalname")private String mediaFileOriginalName;@Column(name="media_url")private String mediaUrl;@Column(name="courseid")private String courseId;@Column(name="timestamp")private Date timestamp;//时间戳} Dao 创建 TeachplanMediaPub 表的 Dao,向 TeachplanMediaPub 存储信息采用先删除该课程的媒资信息,再添加该课程的媒资信息,所以这里定义根据课程 id 删除课程计划媒资方法: public interface TeachplanMediaPubRepository extends JpaRepository<TeachplanMediaPub, String> {//根据课程id删除课程计划媒资信息long deleteByCourseId(String courseId);} 从TeachplanMedia查询课程计划媒资信息 //从TeachplanMedia查询课程计划媒资信息public interface TeachplanMediaRepository extends JpaRepository<TeachplanMedia, String> {List<TeachplanMedia> findByCourseId(String courseId);} Service 编写保存课程计划媒资信息方法,并在课程发布时调用此方法。 1、保存课程计划媒资信息方法 本方法采用先删除该课程的媒资信息,再添加该课程的媒资信息,在 CourseService 下定义该方法 //保存课程计划媒资信息private void saveTeachplanMediaPub(String courseId){//查询课程媒资信息List<TeachplanMedia> byCourseId = teachplanMediaRepository.findByCourseId(courseId);if(byCourseId == null) return; //没有查询到媒资数据则直接结束该方法//将课程计划媒资信息储存到待索引表//删除原有的索引信息teachplanMediaPubRepository.deleteByCourseId(courseId);//一个课程可能会有多个媒资信息,遍历并使用list进行储存List<TeachplanMediaPub> teachplanMediaPubList = new ArrayList<>();for (TeachplanMedia teachplanMedia: byCourseId) {TeachplanMediaPub teachplanMediaPub = new TeachplanMediaPub();BeanUtils.copyProperties(teachplanMedia, teachplanMediaPub);teachplanMediaPubList.add(teachplanMediaPub);}//保存所有信息teachplanMediaPubRepository.saveAll(teachplanMediaPubList);} 2、课程发布时调用此方法 修改课程发布的 coursePublish 方法: ....//保存课程计划媒资信息到待索引表saveTeachplanMediaPub(courseId);//页面urlString pageUrl = cmsPostPageResult.getPageUrl();return new CoursePublishResult(CommonCode.SUCCESS,pageUrl);..... 测试 测试课程发布后是否成功将课程媒资信息存储到 teachplan_media_pub 中,测试流程如下: 1、指定一个课程 2、为课程计划添加课程媒资 3、执行课程发布 4、观察课程计划媒资信息是否存储至 teachplan_media_pub 中 注意:由于此测试仅用于测试发布课程计划媒资信息的功能,可暂时将 cms页面发布的功能暂时屏蔽,提高测试效率。 测试结果如下 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vrzs5589-1595567273126)(https://qnoss.codeyee.com/20200704_15/image7)] 0x03 Logstash:扫描课程计划媒资 Logstash 定时扫描课程媒资信息表,并将课程媒资信息写入索引库。 创建索引 1、创建 xc_course_media 索引 2、并向此索引创建如下映射 POST: http://localhost:9200/xc_course_media/doc/_mapping {"properties" : {"courseid" : {"type" : "keyword"},"teachplan_id" : {"type" : "keyword"},"media_id" : {"type" : "keyword"},"media_url" : {"index" : false,"type" : "text"},"media_fileoriginalname" : {"index" : false,"type" : "text"} }} 索引创建成功 创建模板文件 在 logstach 的 config 目录文件 xc_course_media_template.json 文件路径为 %ES_ROOT_DIR%/logstash6.8.8/config/xc_course_media_template.json %ES_ROOT_DIR% 为 ElasticSearch 和 logstash 的安装目录 内容如下: {"mappings" : {"doc" : {"properties" : {"courseid" : {"type" : "keyword"},"teachplan_id" : {"type" : "keyword"},"media_id" : {"type" : "keyword"},"media_url" : {"index" : false,"type" : "text"},"media_fileoriginalname" : {"index" : false,"type" : "text"} }},"template" : "xc_course_media"} } 配置 mysql.conf 在logstash的 config 目录下配置 mysql_course_media.conf 文件供 logstash 使用,logstash 会根据 mysql_course_media.conf 文件的配置的地址从 MySQL 中读取数据向 ES 中写入索引。 参考https://www.elastic.co/guide/en/logstash/current/plugins-inputs-jdbc.html 配置输入数据源和输出数据源。 input {stdin {} jdbc {jdbc_connection_string => "jdbc:mysql://localhost:3306/xc_course?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC" 数据库信息jdbc_user => "root"jdbc_password => "123123" MYSQL 驱动地址,修改为maven仓库对应的位置jdbc_driver_library => "D:/soft/apache-maven-3.5.4/repository/mysql/mysql-connector-java/5.1.40/mysql-connector-java-5.1.40.jar" the name of the driver class for mysqljdbc_driver_class => "com.mysql.jdbc.Driver"jdbc_paging_enabled => "true"jdbc_page_size => "50000"要执行的sql文件statement_filepath => "/conf/course.sql"statement => "select from teachplan_media_pub where timestamp > date_add(:sql_last_value,INTERVAL 8 HOUR)"定时配置schedule => " "record_last_run => truelast_run_metadata_path => "D:/soft/elasticsearch/logstash-6.8.8/config/xc_course_media_metadata"} } output {elasticsearch {ES的ip地址和端口hosts => "localhost:9200"hosts => ["localhost:9200","localhost:9202","localhost:9203"]ES索引库名称index => "xc_course_media"document_id => "%{teachplan_id}"document_type => "doc"template => "D:/soft/elasticsearch/logstash-6.8.8/config/xc_course_media_template.json"template_name =>"xc_course_media"template_overwrite =>"true"} stdout {日志输出codec => json_lines} } 启动 logstash.bat 启动 logstash.bat 采集 teachplan_media_pub 中的数据,向 ES 写入索引。 logstash.bat -f ../config/mysql_course_media.conf 课程发布成功后,Logstash 会自动参加 teachplan_media_pub 表中新增的数据,效果如下 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ILPBxfXi-1595567273134)(https://qnoss.codeyee.com/20200704_15/image10)] Logstash多实例运行 由于之前我们还启动了一个 Logstash 对课程的发布信息进行采集,所以如果想两个 logstash 实例同时运行,因为每个实例都有一个.lock文件,所以不能使用同一个目录来存放数据,所以我们需要使用 --path.data= 为每个实例指定单独的数据目录,具体的代码如下: 该配置是在windows下进行的 课程发布实例 logstash_start_course_pub.bat @title logstash in course_publogstash.bat -f ..\config\mysql.conf --path.data=../data/course_pub 课程计划媒体发布实例 logstash_start_teachplan_media.bat @title logstash i n teachplan_media_publogstash.bat -f ../config/mysql_course_media.conf --path.data=../data/teachplan_media/ 同时运行效果如下 0x04 搜素服务:查询课程媒资接口 需求分析 搜索服务 提供查询课程媒资接口,此接口供学习服务调用。 Api接口定义 @ApiOperation("根据课程计划查询媒资信息")public TeachplanMediaPub getmedia(String teachplanId); Service 1、配置课程计划媒资索引库等信息 在 application.yml 中配置 xuecheng:elasticsearch:hostlist: ${eshostlist:127.0.0.1:9200} 多个结点中间用逗号分隔course:index: xc_coursetype: docsource_field: id,name,grade,mt,st,charge,valid,pic,qq,price,price_old,status,studymodel,teachmode,expires,pub_time,start_time,end_timemedia:index: xc_course_mediatype: docsource_field: courseid,media_id,media_url,teachplan_id,media_fileoriginalname 2、service 方法开发 在 课程搜索服务 中定义课程媒资查询接口,为了适应后续需求,service 参数定义为数组,可一次查询多个课程计划的媒资信息。 / 根据一个或者多个课程计划id查询媒资信息 @param teachplanIds 课程id @return QueryResponseResult/public QueryResponseResult<TeachplanMediaPub> getmedia(String [] teachplanIds){//设置索引SearchRequest searchRequest = new SearchRequest(media_index);//设置类型searchRequest.types(media_type);//创建搜索源对象SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//源字段过滤String[] media_index_arr = media_field.split(",");searchSourceBuilder.fetchSource(media_index_arr, new String[]{});//查询条件,根据课程计划id查询(可以传入多个课程计划id)searchSourceBuilder.query(QueryBuilders.termsQuery("teachplan_id", teachplanIds));searchRequest.source(searchSourceBuilder);SearchResponse searchResponse = null;try {searchResponse = restHighLevelClient.search(searchRequest);} catch (IOException e) {e.printStackTrace();}//获取结果SearchHits hits = searchResponse.getHits();long totalHits = hits.getTotalHits();SearchHit[] searchHits = hits.getHits();//数据列表List<TeachplanMediaPub> teachplanMediaPubList = new ArrayList<>();for(SearchHit hit:searchHits){TeachplanMediaPub teachplanMediaPub =new TeachplanMediaPub();Map<String, Object> sourceAsMap = hit.getSourceAsMap();//取出课程计划媒资信息String courseid = (String) sourceAsMap.get("courseid");String media_id = (String) sourceAsMap.get("media_id");String media_url = (String) sourceAsMap.get("media_url");String teachplan_id = (String) sourceAsMap.get("teachplan_id");String media_fileoriginalname = (String) sourceAsMap.get("media_fileoriginalname");teachplanMediaPub.setCourseId(courseid);teachplanMediaPub.setMediaUrl(media_url);teachplanMediaPub.setMediaFileOriginalName(media_fileoriginalname);teachplanMediaPub.setMediaId(media_id);teachplanMediaPub.setTeachplanId(teachplan_id);//将对象加入到列表中teachplanMediaPubList.add(teachplanMediaPub);}//构建返回课程媒资信息对象QueryResult<TeachplanMediaPub> queryResult = new QueryResult<>();queryResult.setList(teachplanMediaPubList);queryResult.setTotal(totalHits);return new QueryResponseResult<TeachplanMediaPub>(CommonCode.SUCCESS,queryResult);} Controller / 根据课程计划id搜索发布后的媒资信息 @param teachplanId @return/@GetMapping(value="/getmedia/{teachplanId}")@Overridepublic TeachplanMediaPub getmedia(@PathVariable("teachplanId") String teachplanId) {//为了service的拓展性,所以我们service接收的是数组作为参数,以便后续开发查询多个ID的接口String[] teachplanIds = new String[]{teachplanId};//通过service查询ES获取课程媒资信息QueryResponseResult<TeachplanMediaPub> mediaPubQueryResponseResult = esCourseService.getmedia(teachplanIds);QueryResult<TeachplanMediaPub> queryResult = mediaPubQueryResponseResult.getQueryResult();if(queryResult!=null&& queryResult.getList()!=null&& queryResult.getList().size()>0){//返回课程计划对应课程媒资return queryResult.getList().get(0);} return new TeachplanMediaPub();} 测试 使用 swagger-ui 和 postman 测试课程媒资查询接口。 三、在线学习:接口开发 0x01 需求分析 根据下边的业务流程,本章节完成前端学习页面请求学习服务获取课程视频地址,并自动播放视频。 0x02 搭建开发环境 1、创建数据库 创建 xc_learning 数据库,学习数据库将记录学生的选课信息、学习信息。 导入:资料/xc_learning.sql 2、创建学习服务工程 参考课程管理服务工程结构,创建学习服务工程: 导入:资料/xc-service-learning.zip 项目工程结构如下 0x03 Api接口 此 api 接口是课程学习页面请求学习服务获取课程学习地址。 定义返回值类型: package com.xuecheng.framework.domain.learning.response;import com.xuecheng.framework.model.response.ResponseResult;import com.xuecheng.framework.model.response.ResultCode;import lombok.Data;import lombok.NoArgsConstructor;import lombok.ToString;@Data@ToString@NoArgsConstructorpublic class GetMediaResult extends ResponseResult {public GetMediaResult(ResultCode resultCode, String fileUrl) {super(resultCode);this.fileUrl = fileUrl;}//媒资文件播放地址private String fileUrl;} 定义接口,学习服务根据传入课程 ID、章节 Id(课程计划 ID)来取学习地址。 @Api(value = "录播课程学习管理",description = "录播课程学习管理")public interface CourseLearningControllerApi {@ApiOperation("获取课程学习地址")public GetMediaResult getMediaPlayUrl(String courseId,String teachplanId);} 0x04 服务端开发 需求分析 学习服务根据传入课程ID、章节Id(课程计划ID)请求搜索服务获取学习地址。 搜索服务注册Eureka 学习服务要调用搜索服务查询课程媒资信息,所以需要将搜索服务注册到 eureka 中。 1、查看服务名称是否为 xc-service-search 注意修改application.xml中的服务名称:spring:application:name: xc‐service‐search 2、配置搜索服务的配置文件 application.yml,加入 Eureka 配置 如下: eureka:client:registerWithEureka: true 服务注册开关fetchRegistry: true 服务发现开关serviceUrl: Eureka客户端与Eureka服务端进行交互的地址,多个中间用逗号分隔defaultZone: ${EUREKA_SERVER:http://localhost:50101/eureka/,http://localhost:50102/eureka/}instance:prefer-ip-address: true 将自己的ip地址注册到Eureka服务中ip-address: ${IP_ADDRESS:127.0.0.1}instance-id: ${spring.application.name}:${server.port} 指定实例idribbon:MaxAutoRetries: 2 最大重试次数,当Eureka中可以找到服务,但是服务连不上时将会重试,如果eureka中找不到服务则直接走断路器MaxAutoRetriesNextServer: 3 切换实例的重试次数OkToRetryOnAllOperations: false 对所有操作请求都进行重试,如果是get则可以,如果是post,put等操作没有实现幂等的情况下是很危险的,所以设置为falseConnectTimeout: 5000 请求连接的超时时间ReadTimeout: 6000 请求处理的超时时间 3、添加 eureka 依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring‐cloud‐starter‐netflix‐eureka‐client</artifactId></dependency> 4、修改启动类,在class上添加如下注解: @EnableDiscoveryClient 搜索服务客户端 在 学习服务 创建搜索服务的客户端接口,此接口会生成代理对象,调用搜索服务: package com.xuecheng.learning.client;import com.xuecheng.framework.domain.course.TeachplanMediaPub;import org.springframework.cloud.openfeign.FeignClient;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;@FeignClient(value = "xc‐service‐search")public interface CourseSearchClient {@GetMapping(value="/getmedia/{teachplanId}")public TeachplanMediaPub getmedia(@PathVariable("teachplanId") String teachplanId);} 自定义错误代码 我们在 com.xuecheng.framework.domain.learning.response 包下自定义一个错误消息模型 package com.xuecheng.framework.domain.learning.response;import com.xuecheng.framework.model.response.ResultCode;import lombok.ToString;@ToStringpublic enum LearningCode implements ResultCode {LEARNING_GET_MEDIA_ERROR(false,23001,"学习中心获取媒资信息错误!");//操作代码boolean success;//操作代码int code;//提示信息String message;private LearningCode(boolean success, int code, String message){this.success = success;this.code = code;this.message = message;}@Overridepublic boolean success() {return success;}@Overridepublic int code() {return code;}@Overridepublic String message() {return message;} } 该消息模型基于 ResultCode 来实现,代码如下 package com.xuecheng.framework.model.response;/ Created by mrt on 2018/3/5. 10000-- 通用错误代码 22000-- 媒资错误代码 23000-- 用户中心错误代码 24000-- cms错误代码 25000-- 文件系统/public interface ResultCode {//操作是否成功,true为成功,false操作失败boolean success();//操作代码int code();//提示信息String message(); 从 ResultCode 中我们可以看出,我们约定了用户中心的错误代码使用 23000,所以我们定义的一些错误信息的代码就从 23000 开始计数。 Service 在学习服务中定义 service 方法,此方法远程请求课程管理服务、媒资管理服务获取课程学习地址。 package com.xuecheng.learning.service.impl;import com.netflix.discovery.converters.Auto;import com.xuecheng.framework.domain.course.TeachplanMediaPub;import com.xuecheng.framework.domain.learning.response.GetMediaResult;import com.xuecheng.framework.exception.ExceptionCast;import com.xuecheng.framework.model.response.CommonCode;import com.xuecheng.learning.client.CourseSearchClient;import com.xuecheng.learning.service.LearningService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;@Servicepublic class LearningServiceImpl implements LearningService {@AutowiredCourseSearchClient courseSearchClient;/ 远程调用搜索服务获取已发布媒体信息中的url @param courseId 课程id @param teachplanId 媒体信息id @return/@Overridepublic GetMediaResult getMediaPlayUrl(String courseId, String teachplanId) {//校验学生权限,是否已付费等//远程调用搜索服务进行查询媒体信息TeachplanMediaPub mediaPub = courseSearchClient.getmedia(teachplanId);if(mediaPub == null) ExceptionCast.cast(CommonCode.FAIL);return new GetMediaResult(CommonCode.SUCCESS, mediaPub.getMediaUrl());} } Controller 调用 service 根据课程计划 id 查询视频播放地址: @RestController@RequestMapping("/learning/course")public class CourseLearningController implements CourseLearningControllerApi {@AutowiredLearningService learningService;@Override@GetMapping("/getmedia/{courseId}/{teachplanId}")public GetMediaResult getMediaPlayUrl(@PathVariable String courseId, @PathVariable String teachplanId) {//获取课程学习地址return learningService.getMedia(courseId, teachplanId);} } 测试 使用 swagger-ui 或postman 测试学习服务查询课程视频地址接口。 0x05 前端开发 需求分析 需要在学习中心前端页面需要完成如下功能: 1、进入课程学习页面需要带上 课程 Id参数及课程计划Id的参数,其中 课程 Id 参数必带,课程计划 Id 可以为空。 2、进入页面根据 课程 Id 取出该课程的课程计划显示在右侧。 3、进入页面后判断如果请求参数中有课程计划 Id 则播放该章节的视频。 4、进入页面后判断如果 课程计划id 为0则需要取出本课程第一个 课程计划的Id,并播放第一个课程计划的视频。 进入到模块 xc-ui-pc-leanring/src/module/course api方法 let sysConfig = require('@/../config/sysConfig')let apiUrl = sysConfig.xcApiUrlPre;/获取播放地址/export const get_media = (courseId,chapter) => {return http.requestGet(apiUrl+'/api/learning/course/getmedia/'+courseId+'/'+chapter);} 配置代理 在 Nginx 中的 ucenter.xuecheng.com 虚拟主机中配置 /api/learning/ 的路径转发,此url 请转发到学习服务。 学习服务upstream learning_server_pool{server 127.0.0.1:40600 weight=10;}学成网用户中心server {listen 80;server_name ucenter.xuecheng.com;个人中心location / {proxy_pass http://ucenter_server_pool;}后端搜索服务location /openapi/search/ {proxy_pass http://search_server_pool/search/; }学习服务location ^~ /api/learning/ {proxy_pass http://learning_server_pool/learning/;} } 视频播放页面 1、如果传入的课程计划id为0则取出第一个课程计划id 在 created 钩子方法中完成 created(){//当前请求的urlthis.url = window.location//课程idthis.courseId = this.$route.params.courseId//章节idthis.chapter = this.$route.params.chapter//查询课程信息systemApi.course_view(this.courseId).then((view_course)=>{if(!view_course || !view_course[this.courseId]){this.$message.error("获取课程信息失败,请重新进入此页面!")return ;}let courseInfo = view_course[this.courseId]console.log(courseInfo)this.coursename = courseInfo.nameif(courseInfo.teachplan){console.log("准备开始播放视频")let teachplan = JSON.parse(courseInfo.teachplan);this.teachplanList = teachplan.children;//开始学习if(this.chapter == "0" || !this.chapter){//取出第一个教学计划this.chapter = this.getFirstTeachplan();console.log("第一个教学计划id为 ",this.chapter);this.study(this.chapter);}else{this.study(this.chapter);} }})}, 取出第一个章节 id,用户未输入课程计划 id 或者输入为 0 时,播放第一个。 //取出第一个章节getFirstTeachplan(){for(var i=0;i<this.teachplanList.length;i++){let firstTeachplan = this.teachplanList[i];//如果当前children存在,则取出第一个返回if(firstTeachplan.children && firstTeachplan.children.length>0){let secondTeachplan = firstTeachplan.children[0];return secondTeachplan.id;} }return ;}, 开始学习: //开始学习study(chapter){// 获取播放地址courseApi.get_media(this.courseId,chapter).then((res)=>{if(res.success){let fileUrl = sysConfig.videoUrl + res.fileUrl//播放视频this.playvideo(fileUrl)}else if(res.message){this.$message.error(res.message)}else{this.$message.error("播放视频失败,请刷新页面重试")} }).catch(res=>{this.$message.error("播放视频失败,请刷新页面重试")});}, 2、点击右侧课程章节切换播放 在原有代码基础上添加 click 事件,点击调用开始学习方法(study)。 <li v‐if="teachplan_first.children!=null" v‐for="(teachplan_second, index) inteachplan_first.children"><i class="glyphicon glyphicon‐check"></i><a :href="url" @click="study(teachplan_second.id)">{ {teachplan_second.pname} }</a></li> 3、地址栏路由url变更 这里需要注意一个问题,在用户点击课程章节切换播放时,地址栏的 url 也应该同步改变为当前所选择的课程计划 id 4、在线学习按钮 将 learnstatus 默认更改为 1,这样就能显示出马上学习的按钮,方便我们后续的集成测试。 文件路径为 xc-ui-pc-static-portal/include/course_detail_dynamic.html 部分代码块如下 <script>var body= new Vue({ //创建一个Vue的实例el: "body", //挂载点是id="app"的地方data: {editLoading: false,title:'测试',courseId:'',charge:'',//203001免费,203002收费learnstatus: 1 ,//课程状态,1:马上学习,2:立即报名、3:立即购买course:{},companyId:'template',company_stat:[],course_stat:{"s601001":"","s601002":"","s601003":""} }, 简单的测试 访问在线学习页面:http://ucenter.xuecheng.com//learning/课程id/课程计划id 通过 url 传入两个参数:课程id 和 课程计划id 如果没有课程计划则传入0 测试项目如下: 1、传入正确的课程id、课程计划id,自动播放本章节的视频 2、传入正确的课程id、课程计划id传入0,自动播放第一个视频 3、传入错误的课程id 或 课程计划id,提示错误信息。 4、通过右侧章节目录切换章节及播放视频。 访问: http://ucenter.xuecheng.com//learning/4028e58161bcf7f40161bcf8b77c0000/4028e58161bd18ea0161bd1f73190008 传入正确的课程id、课程计划id,自动播放本章节的视频 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ef0xxym7-1595567273153)(https://qnoss.codeyee.com/20200704_15/image17)] 传入正确的课程id、课程计划id传入0,自动播放第一个视频 访问 http://ucenter.xuecheng.com//learning/4028e58161bcf7f40161bcf8b77c0000/0 识别出第一个课程计划的 id 需要注意的是这里的 chapter 参数是我自己在 study 函数里加上去的,可以忽略。 传入错误的课程id或课程计划id,提示错误信息。 通过右侧章节目录切换章节及播放视频。 点击章节即可播放,但是点击制定章节后 url 没有发生改变,这个问题暂时还没有解决,关注笔记后面的内容。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TOGdxwb4-1595567273158)(https://qnoss.codeyee.com/20200704_15/image20)] 完整的测试 准备工作 启动 RabbitMQ,启动 Logstash、ElasticSearch 建议把所有后端服务都开起来 启动 前端静态门户、启动 nginx 、启动课程管理前端 我们整理一下测试的流程 上传两个媒资视频文件,用于测试 进入到课程管理,为课程计划选择媒资信息 发布课程,等待 logstash 将数据采集到 ElasticSearch 的索引库中 进入学成网主页,点击课程,进入到搜索门户页面 搜索课程,进入到课程详情页面 点击开始学习,进入到课程学习页面,选择课程计划中的一个章节进行学习。 1、上传文件 首先我们使用之前开发的媒资管理模块,上传两个视频文件用于测试。 第一个文件上传成功 一些问题 在上传第二个文件时,发生了错误,我们来检查一下问题出在了哪里 在媒体服务的控制台中可以看到,在 mergeChunks 方法在校验文件 md5 时候抛出了异常 我们在 MD5 校验这里打个断点,重新上传文件,分析一下问题所在。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OpEMZGI8-1595567273166)(https://qnoss.codeyee.com/20200704_15/image23)] 单步调试后发现,合并文件后的MD5值与用户上传的源文件值不相等 方案1:删除本地分块文件重新尝试上传 考虑到可能是在用户上传完 视频的分块文件时发生了一些问题,导致合并文件后与源文件的大小不等,导致MD5也不相同,这里我们把这个视频上传到本地的文件全部删除,在媒资上传页面重新上传文件。 对比所有分块文件的字节大小和本地源文件的大小,完全是相等的 删除所有文件后重新上传,md5值还是不等,考虑从调试一下文件合并的代码。 方案2:检查前端提交的MD5值是否正确 在查阅是否有其他的MD5值获取方案时,发现了一个使用 windows 本地命令获取文件MD5值的方法 certutil -hashfile .\19-在线学习接口-集成测试.avi md5 惊奇的发现,TM的原来是前端那边转换的MD5值不正确,后端这边是没有问题的。 从前面的图可以看出,本地和后端转换的都是以一个 f6f0 开头的MD5值 那么问题就出现在前端了,还需要花一些时间去分析一下,这里暂时就先告一段落,因为上传了几个文件测试中只有这一个文件出现了问题。 2、为课程计划选择媒资信息 进入到一个课程的管理页面 http://localhost:12000//course/manage/baseinfo/4028e58161bcf7f40161bcf8b77c0000 将刚才我们上传的媒资文件的信息和课程计划绑定 选择效果如下 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-epKaqzCD-1595567273178)(https://qnoss.codeyee.com/20200704_15/image29)] 2、发布课程,等待 logstash 从 course_pub 以及 teachplan_media_pub 表中采集数据到 ElasticSearch 当中 发布成功后,我们可以从 teachplan_media_pub 表中看到刚才我们发布的媒资信息 再观察 Logstash 的控制台,发现两个 Logstash 的实例都对更新的课程发布信息进行了采集 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hTUve2ik-1595567273183)(https://qnoss.codeyee.com/20200704_15/image32)] 3、前端门户测试 打开我们的门户主站 http://www.xuecheng.com/ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4wZe9R84-1595567273185)(https://qnoss.codeyee.com/20200704_15/image33)] 点击导航栏的课程,进入到我们的搜索门户页面 如果无法进入到搜索门户,请检查你的 xc-ui-pc-portal 前端工程是否已经启动 进入到搜索门户后,可以看到一些初始化时搜索的课程数据,默认是搜索第一页的数据,每页2个课程。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BJ1AKoJb-1595567273187)(https://qnoss.codeyee.com/20200704_15/image34)] 我们可以测试搜索一下前面我们选择媒资信息时所用的课程 点击课程,进入到课程详情页面,然后再点击开始学习。 点击马上学习后,会进入到该课程的在线学习页面,默认自动播放我们第一个课程计划中的视频。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tcuLWnf2-1595567273193)(https://qnoss.codeyee.com/20200704_15/image37)] 我们可以在右侧的目录中选择第二个课程计划,会自动播放所选的课程计划所对应的媒资视频播放地址,该 播放地址正是我们刚才通过 Logstash 自动采集到 ElasticSearch 的索引信息,效果图如下 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cvi9Dr0Y-1595567273195)(https://qnoss.codeyee.com/20200704_15/image38)] 四、待完善的一些功能 课程发布前,校验课程计划里面是否包含二级课程计划 课程发布前,校验课程计划信息里面是否全部包含媒资信息 删除媒资信息,并且同步删除ES中的索引 在获取该课程的播放地址时校验用户的合法、 在线学习页面,点击右侧目录中的课程计划同时改变url中的课程计划地址 视频文件 19-在线学习接口-集成测试.avi 前端上传时提交的MD5值不正确 😁 认识作者 作者:👦 LCyee ,全干型代码🐕 自建博客:https://www.codeyee.com 记录学习以及项目开发过程中的笔记与心得,记录认知迭代的过程,分享想法与观点。 CSDN 博客:https://blog.csdn.net/codeyee 记录和分享一些开发过程中遇到的问题以及解决的思路。 欢迎加入微服务练习生的队伍,一起交流项目学习过程中的一些问题、分享学习心得等,不定期组织一起刷题、刷项目,共同见证成长。 本篇文章为转载内容。原文链接:https://blog.csdn.net/codeyee/article/details/107558901。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-12-16 12:41:01
73
转载
Mongo
...推出后,可视化数据库管理工具领域得到了显著的提升。近期,MongoDB公司进一步宣布了其产品线的重大更新,包括Studio的全新功能增强,以更好地满足现代数据密集型应用的需求。据官方博客透露,MongoDB Studio将集成更多AI驱动的功能,如智能查询建议和自动索引优化,这将帮助开发者更加高效地进行数据库操作与性能调优。 与此同时,MongoDB也在强化其生态系统的建设,鼓励第三方开发者为MongoDB Studio开发插件,以提供更多定制化的解决方案。例如,已经有开发者成功创建了一款插件,用于实现更复杂的数据迁移任务,通过图形化界面即可轻松完成原本需要编写大量脚本的工作。 此外,随着云原生趋势的加强,MongoDB Atlas作为全球领先的完全托管云数据库服务,正逐步与MongoDB Studio深度整合,使得用户能够在云端享受无缝的数据库管理和操作体验,无论是在本地环境还是在公有云环境中,都能灵活运用MongoDB Studio的强大功能。 对于那些希望深入理解MongoDB架构及其实战技巧的专业人士来说,MongoDB大学提供了丰富的在线课程资源和认证计划,结合MongoDB Studio的实际操作练习,让学习者能够系统性地掌握从基础到进阶的MongoDB管理知识,并紧跟技术发展的步伐,提升自身在大数据时代的核心竞争力。 总的来说,MongoDB Studio不仅是一个直观易用的可视化工具,更是MongoDB不断演进、拥抱技术创新的重要体现,它正在引领NoSQL数据库管理工具进入一个全新的智能化、可视化的未来。
2024-02-25 11:28:38
70
幽谷听泉-t
转载文章
...公司开发的一款基于 Vue.js 的前端开发框架,它允许开发者使用一套代码同时构建Web、H5、iOS、Android以及微信小程序等多个平台的应用程序。在本文的语境中,uni-app 被用于构建一个根据用户权限动态更改底部导航栏(tabbar)的小程序项目。 Vuex , Vuex 是 Vue.js 生态系统中的状态管理库,它专为管理复杂的单页应用而设计,能够帮助开发者集中存储和管理组件间的共享状态,并通过可预测化的状态变更方式确保多个组件间的同步和通信。在本文中,Vuex 用于存储和管理当前登录用户的权限角色以及对应的tabbar菜单列表信息,以实现在不同角色间切换时动态更新底部导航栏的内容。 uview-ui , uview-ui 是一款基于 uni-app 的高质量UI框架,提供了丰富的组件库和样式定制能力,使得开发者可以快速搭建美观且功能完善的跨端界面。在本文所述需求场景下,uview-ui 提供了灵活易用的 Tabbar 组件,支持根据 vuex 中的状态数据动态渲染不同的底部导航栏菜单,满足不同用户角色展示不同tabbar的需求。 动态设置tabbar , 在移动应用开发中,动态设置tabbar是指根据特定条件(如用户权限、登录状态等)实时改变应用程序底部导航栏的布局、内容或样式的过程。本文提到的实现方案中,当用户登录并确定其角色后,会根据角色权限动态配置并显示相应的底部导航栏菜单项,这就是动态设置tabbar的具体应用场景。
2023-03-06 15:14:00
135
转载
VUE
在进一步了解Vue.js框架中多人协作时的版本冲突问题及解决方案——vue-cli-plugin-fork之后,我们还可以关注一些与前端开发协作、版本控制和冲突解决相关的最新实践和技术动态。近期,GitHub推出了全新的Copilot工具,它利用人工智能技术实时辅助编程,能在一定程度上预防多人协作过程中的代码冲突。此外,GitLab也发布了更为智能的Merge Request功能升级,强化了自动解决合并冲突的能力,并提供了详尽的可视化界面帮助开发者理解并高效处理冲突。 与此同时,针对Vue.js生态系统的团队协作工具也在不断进化。例如,Vetur是Visual Studio Code的一个知名插件,通过提供对Vue文件的丰富语法高亮、片段以及格式化支持,能够间接提升协同编辑的效率,降低版本冲突发生的可能性。另外,许多项目开始采用组件化和模块化的开发方式,结合Vue的单文件组件特性,从架构层面降低多人同时编辑同一代码块的需求,从而减少版本冲突的发生。 更深入地探讨版本管理理念,可以参考Martin Fowler的“Branch by Abstraction”策略,这是一种提倡通过抽象层来隔离不同开发任务,进而避免直接修改共享代码以引发冲突的方法。这种策略在现代前端工程实践中具有很高的参考价值,尤其对于Vue.js这类鼓励组件化开发的框架而言,更是值得借鉴和实践。 综上所述,在Vue.js及其他前端开发场景中,合理运用版本控制工具、AI辅助编程技术、现代化开发模式以及先进的版本管理策略,都是有效防止和解决多人协作版本冲突的关键手段。持续关注相关领域的最新发展,将有助于提高团队协作效率和软件工程质量。
2023-08-19 09:28:38
64
键盘勇士
VUE
Vue打包后报错404:原因与解决方案深度探索 1. 引言 在我们日常的Vue项目开发中,构建和部署是至关重要的环节。在实际把项目打包上线的过程中,有时候咱们会碰到一些让人头疼的问题。比如说吧,当你辛辛苦苦把Vue应用部署到服务器上后,可能会发现有那么几个页面,或者甚至所有页面,在加载的时候竟然蹦出了404错误,这可真是让人抓狂的情况啊。这个看似棘手的问题背后,实则隐藏着诸多可能的原因,以及相应的解决策略。今天,我们将一起深入探讨这个问题,并通过实例代码来详细解析。 2. 报错404常见原因分析 2.1 路由配置问题 Vue项目使用vue-router进行路由管理时,如果没有正确配置base属性,可能导致静态资源路径不正确,进而引发404错误。例如: javascript // vue.config.js 或 router/index.js 中的配置 const router = new Router({ base: '/your-project-name/', // 必须与实际部署路径一致 routes: [...] }) 2.2 静态资源路径问题 当Vue项目构建生成的静态资源路径与服务器实际部署路径不匹配时,也会导致404错误。比如,你瞧啊,Vue这家伙,默认会把所有的静态资源都塞到static这个文件夹里,这个文件夹呢,就在dist目录的怀抱里。要是服务器小哥没找准方向,没有正确指向这个藏宝地,那可就麻烦咯,保不准会出现点状况滴。 javascript // vue.config.js 文件中修改输出目录和静态资源目录 module.exports = { publicPath: './', // 根据实际情况调整 assetsDir: 'static', ... } 2.3 服务端配置问题 Nginx等服务器配置不当,未正确处理Vue项目的SPA(Single Page Application)特性,也可能是404报错的元凶。对于SPA应用,通常需要配置Nginx将所有非静态资源请求重定向至index.html: nginx location / { try_files $uri $uri/ /index.html; } 2.4 History模式与Hash模式差异 Vue Router支持History和Hash两种路由模式。在实际生产环境中,如果你的应用使用的是History模式,那么可能会因为服务器设置没配好,一不小心就给你来个404错误。这时候,你就得翻回去瞅瞅上文2.3章节,按照那里说的一步步把服务器配置搞定哈。 javascript // router/index.js 中配置路由模式 const router = new Router({ mode: 'history', // 或者 'hash' routes: [...] }) 3. 解决方案及实践 针对上述提到的各种情况,我们需要逐一排查并采取相应措施: - 检查并修正vue.config.js中的publicPath和assetsDir配置,确保与服务器部署路径匹配。 - 根据项目实际需求,合理设置vue-router的base属性。 - 对于服务器配置,尤其是SPA应用,务必按照SPA特性进行正确的路由重定向配置。 - 如果使用History模式,请确保服务器已做相应配置以支持。 在整个过程中,不断尝试、观察、思考并验证是我们解决问题的关键步骤。同时呢,要像侦探一样对技术细节保持敏锐洞察,还要像哲学家那样深入理解问题的本质,这样才能有效防止这类问题再次冒出来,可别让它再给我们捣乱! 4. 结语 面对Vue打包后报错404这类问题,无需恐慌,只需耐心细致地从各个层面寻找线索,一步步排除故障。就像侦探查案那样,我们一步步地捣鼓、琢磨、优化,最后肯定能把那个“404迷宫”的大门钥匙给找出来,让它无所遁形。希望本文能够帮助你在解决类似问题时更加得心应手,让我们的Vue项目运行如丝般顺滑!
2023-10-10 14:51:55
76
青山绿水_
VUE
... , 双向数据绑定是Vue.js框架中的一个重要特性,它允许视图(View)和模型(Model)之间自动同步。在实际应用中,当模型的数据发生变化时,依赖该数据的视图会自动更新;反之,如果用户通过视图界面改变了表单输入或触发了相关操作导致数据变化,模型层的数据也会相应地被更新。这样就极大地简化了开发过程中对数据状态管理和界面更新的操作,使得开发者无需手动编写大量DOM操作代码来保持数据与视图的一致性。 组件化 , 组件化是一种将UI拆分成独立、可复用的代码块(即组件)的设计模式,在Vue.js中得到了广泛应用。每个组件都拥有自身的视图模板和逻辑,可以包含样式、HTML结构和JavaScript代码。组件间可以通过属性(props)进行数据传递,通过自定义事件实现通信。通过组件化,大型复杂的前端项目可以被组织成一系列相互独立、易于理解和维护的小型组件,从而提升开发效率和代码复用率。 SVGA(Scalable Vector Graphics Animation) , SVGA是一种专为移动设备优化的高度矢量化动画格式。不同于基于像素的传统动画格式,SVGA利用SVG(Scalable Vector Graphics)技术,使动画能够在不同分辨率和屏幕尺寸上清晰展示,不会因为放大或缩放而失真。在移动端应用程序开发中,尤其是在游戏、动画场景下,SVGA因其文件体积小、渲染性能高且支持复杂动画效果等特点,成为一种高效实用的动画解决方案。通过SVGA.Parser可以加载并解析SVGA格式的动画文件,然后利用SVGA.Player进行播放控制,为用户提供流畅丰富的视觉体验。
2023-01-11 22:10:45
97
程序媛
VUE
Vue , Vue.js,一种渐进式JavaScript框架,用于构建用户界面。它采用组件化开发模式,允许开发者通过声明式渲染和响应式数据绑定创建交互式的单页面应用程序。Vue可以与现代工具链和服务端平台轻松集成,为前端开发者提供了高效的开发体验。 单页面应用程序(SPA) , 在Web开发领域中,单页面应用程序是一种特殊的网站或网络应用设计模式,用户在浏览过程中仅加载一个HTML页面,内容的更新和交互主要通过JavaScript、Ajax等技术动态替换或修改页面的部分内容实现,无需整页刷新,从而提供更加流畅和接近原生应用的用户体验。 CSS Modules , CSS Modules是CSS模块化的一种解决方案,它在编译时为每个类名生成唯一的局部作用域名称,以防止样式冲突并增强CSS样式的可维护性和复用性。在Vue单文件组件(SFCs)中,通过使用<style>标签的scoped属性,可以实现类似CSS Modules的功能,确保组件内部的样式只影响该组件本身而不影响其他组件。 v-bind指令 , Vue.js中的v-bind指令(简写为:prop)用于将元素属性值与Vue实例的数据动态绑定。例如,在文中提到的:style= backgroundColor: color ,就是将div元素的背景颜色与其所在Vue实例中的color属性值动态关联,当color属性值发生变化时,div元素的背景颜色也会相应地实时更新。 v-for指令 , Vue.js中的v-for指令用于根据数组或者对象遍历生成DOM元素。如文中所示 <p v-for=\ (item, index) in items\ :key=index> item </p>,这段代码会基于items数组中的每一项数据item,循环渲染出多个p标签,并且为每个p标签设置一个基于数组索引的独特key值,以便Vue能够准确跟踪每个节点的身份,优化列表渲染性能和状态保持。
2023-09-02 10:50:23
49
编程狂人
AngularJS
...更强大、灵活的国际化解决方案,其不仅保持了与AngularJS类似的API设计,还引入了更多高级特性,如按需加载语言包和监听语言变化事件。 同时,React社区也有诸如react-intl这样的流行库,它通过格式化JSX消息描述符实现国际化,并结合Intl API提供了丰富的日期、数字及货币格式化功能,让开发者能够更好地处理全球化场景下的各种复杂需求。 另外,Vue.js则在其官方插件vue-i18n中实现了全面的国际化支持,它允许开发者在单文件组件内轻松管理多语言内容,同时也提供了动态切换语言、复用翻译字符串等实用功能。 此外,随着Web Components和Shadow DOM技术的发展,越来越多的前端框架开始关注如何在组件级别实现国际化,这为构建适应全球用户的微前端架构提供了有力支持。因此,持续关注这些技术的最新进展与最佳实践,将有助于我们不断提升Web应用的国际化水平,从而在全球市场中获得竞争优势。
2023-06-23 10:38:49
376
晚秋落叶
Nginx
...能改进,对于正在使用Vue.js等现代前端框架构建应用的开发者来说,深入理解并掌握新版本Nginx的各项特性至关重要。 例如,新版本Nginx强化了HTTP/2协议支持,使得静态资源加载速度进一步提升,这对于Vue项目这类单页面应用尤其重要,能有效降低首次加载时间,提高用户交互体验。同时,新版Nginx增强了缓存策略管理,提供了更细粒度的控制,有助于实现动态内容的合理缓存,减轻后端压力。 此外,针对版本更新时的重定向问题,Nginx的新功能如map模块和return指令的灵活运用,可以更加智能地根据客户端特征(如浏览器版本、地理位置等)进行精细化的URL重写与跳转策略制定,确保用户能够无缝过渡到新版本页面,避免因访问旧版内容引发的兼容性或数据一致性问题。 因此,建议开发团队密切关注Nginx的最新动态和技术文档,并结合自身项目特点,持续优化部署方案,以满足日益增长的用户需求,提供更为流畅、稳定的线上服务。同时,学习和借鉴业界最佳实践,如Netflix开源的 Zuul 项目,以及Google在前端路由与版本控制方面的创新理念,都将为解决此类问题带来新的启示和解决方案。
2023-11-04 10:35:42
124
草原牧歌_t
VUE
《Vue.js与现代前端滚动加载新趋势:WebAssembly与服务端渲染》 随着前端技术的发展,Vue.js在动态加载和滚动加载方面的应用不再局限于传统的JavaScript解决方案。近期,一项前沿技术——WebAssembly(简称Wasm)正在为这一领域带来新的可能性。Wasm是一种低级语言编译后的可执行二进制格式,能在浏览器环境中运行高性能计算任务,包括处理大量数据和复杂的业务逻辑。 一些开发者已经开始探索如何在Vue项目中利用Wasm来加速滚动加载过程。例如,通过预编译计算密集型数据处理,Wasm可以在用户滚动时立即提供结果,而非等待服务器响应。同时,服务端渲染(SSR)与Vue.js的结合也提升了滚动加载的效率,SSR可以在用户初次访问时就渲染出大部分内容,后续的滚动加载只需更新少量数据,从而降低延迟。 然而,尽管Wasm带来了显著的性能提升,但其学习曲线陡峭,且需要对底层原理有深入了解。同时,考虑到兼容性和维护成本,开发者在选择技术路径时仍需谨慎权衡。对于那些追求极致性能和实时体验的项目来说,Wasm与Vue.js的结合无疑是一个值得探索的方向。 此外,现代前端开发者还关注着滚动性能优化的最新研究,比如使用Intersection Observer API的改进版本,以及结合CSS Scroll Snap Points进行更精确的滚动管理。这些技术进步为用户提供更流畅的滚动体验,也为Vue.js开发者提供了更多的创新空间。 总的来说,随着前端技术的不断演进,Vue.js在滚动加载方面的实践将更加多元化和高效,而WebAssembly和服务端渲染等新技术的应用将引领这一领域的未来。开发者们需要紧跟技术潮流,以提供最佳的用户体验。
2024-06-16 10:44:31
97
断桥残雪_
转载文章
《Vue.js与滚动优化实践:迈向现代前端开发的新高度》 在现代前端开发中,Vue.js以其简洁的API和强大的组件化能力逐渐成为主流。然而,随着用户界面复杂度的提升,滚动性能和用户体验的重要性日益凸显。近期,Google推出了一项名为"Intersection Observer API"的新特性,为Vue开发者提供了更智能的滚动管理方式。这一API允许开发者精确地观察元素何时进入或离开视口,从而实现滚动优化,避免不必要的滚动重绘和计算,提高页面性能。 例如,我们可以结合Vue的watch或者v-once指令,以及Intersection Observer API,创建自适应滚动组件,仅当内容实际可见时才渲染或计算。这不仅能减轻服务器压力,还能提升用户的交互体验,特别是在移动设备上,流畅的滚动对于留住用户至关重要。 此外,像LilGiantBug的Better Scroll这样的第三方库,也提供了丰富的滚动优化选项,如防抖、渐进增强等,进一步简化了Vue滚动组件的开发和维护。开发者可以通过引入这些库,快速实现平滑滚动效果,同时保证代码的可维护性和可扩展性。 总之,Vue.js与滚动优化的结合,不仅提升了前端应用的性能,也为开发者提供了更多可能性。随着技术的不断迭代,我们期待看到更多创新的滚动解决方案,推动前端开发向更加高效、人性化的方向发展。
2024-05-06 12:38:02
624
转载
HTML
...pt库如React、Vue.js等广泛应用,使得倒计时功能在用户体验设计中发挥着越来越重要的作用。例如,在电商网站限时抢购、在线考试系统答题时间控制以及各类互动广告等领域,基于HTML5和JavaScript的精准倒计时组件已成为标配。 实际上,现代Web开发者更倾向于采用更高级的编程模式如状态管理(Redux或Vuex)来同步倒计时状态,确保即使在复杂多变的用户交互场景下,倒计时依然能保持准确无误。此外,响应式设计和无障碍访问也是现今优化倒计时功能的重要考量,确保不同设备和用户群体都能顺畅使用。 不仅如此,对于性能优化,许多开发者开始研究如何利用Web Workers进行异步计算,以避免倒计时过程对页面渲染造成阻塞,提升整体用户体验。同时,Service Worker技术也在离线环境下为倒计时提供解决方案,使得即便在网络不稳定的情况下,倒计时也能继续运行并适时更新。 综上所述,从基础的JavaScript倒计时实例出发,我们可进一步探索其在前沿Web开发技术中的演变与应用,包括但不限于框架集成、状态管理、响应式设计、无障碍访问以及性能优化等方面,从而更好地服务于丰富多元的网络应用场景。
2023-09-29 09:10:29
514
算法侠
JQuery
...技术的飞速发展,诸如Vue.js、React和Angular等框架逐渐崭露头角,但jQuery因其易用性与广泛的浏览器兼容性,依然在许多项目中扮演着关键角色。 例如,在最近的一篇博客文章《Why jQuery Still Matters in Modern Web Development》中,作者详细分析了即使在众多新框架涌现的时代背景下,jQuery仍具有简化DOM操作、提供跨浏览器兼容解决方案以及对于初学者友好等显著优势。同时,文中还提到jQuery社区持续维护更新,确保其能够适应现代Web标准,并且能与新兴框架有效结合使用。 此外,jQuery UI等插件库为开发者提供了丰富的交互组件和效果,使得处理如dialog、tabs、滑动效果等功能变得更为便捷。在处理表单元素时,jQuery强大的事件处理机制不仅适用于radio按钮,还可应用于checkboxes、selects等多种控件,实现复杂的表单验证及联动效果。 不仅如此,jQuery还被广泛应用于数据交互领域,配合Ajax请求可以轻松实现实时数据加载与页面无刷新更新,大大提升了用户体验。因此,掌握jQuery在控制radio按钮以及其他DOM元素方面的技巧,对于任何级别的Web开发者来说都是一项不可忽视的基本技能。
2023-02-15 20:20:10
286
软件工程师
转载文章
本篇文章为转载内容。原文链接:https://blog.csdn.net/qq_37235823/article/details/117322317。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。 vue 页面methods自定义函数同步到window的解决方案 在开发vue项目的过程中偶尔需要引入外部js文件或与app oc通信时,外部文件的window是没有我们页面里的methods函数,所以我们需要把methods函数映射到window。 处理方法: data() {return {title: '现在是2021年'} },mounted() {window.demoEvent = this.demoEvent;},methods: {demoEvent(val) {this.title = val},} 完。。。 本篇文章为转载内容。原文链接:https://blog.csdn.net/qq_37235823/article/details/117322317。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-03-31 11:24:02
43
转载
Element-UI
...遇到过这样的场景,在Vue.js项目中使用Element-UI的el-table组件时,需要在点击行任意位置都能实现展开/收起的效果?本文将详细解析如何通过Element-UI的API来实现这个功能。 二、问题分析 首先,我们需要了解el-table的基本结构和API。el-table是一个基于Vue.js的数据表格组件,支持排序、过滤、分页等功能,同时可以通过row-click事件监听行的点击事件。 然后,我们需要明白,要实现行的展开/收起效果,需要两个关键点:一是获取当前被点击的行数据;二是修改该行的状态,使其可以展示子内容。 三、解决方案 1. 获取当前被点击的行数据 通过el-table提供的row-click事件,我们可以轻松地获取到当前被点击的行数据。以下是一个简单的示例: html 2. 修改该行的状态,使其可以展示子内容 对于这个问题,我们需要自己添加一个状态变量,并且在row-click事件触发时更新这个状态变量。下面是一个简单的示例: html 四、总结 通过上述方法,我们成功实现了在Vue.js项目中使用Element-UI的el-table组件时,点击行任意位置都能实现展开/收起的效果。要特别留意的是,这里的“展开/收起”可不只是简单的藏起来露出来那么简单,关键得保证表头、表体这些部分都整整齐齐的,不能让人瞅见有啥突兀的蹦跶情况发生哈。如果对这个问题感兴趣,欢迎留言讨论,一起学习进步!
2023-10-23 16:53:41
404
青山绿水_t
JQuery
...PI的不断丰富,诸如Vue.js、React和Angular等现代化前端框架逐渐崭露头角,并提供了更为强大且高效的组件化解决方案。例如,在Vue.js中,我们可以通过v-if或v-show指令轻松控制input元素的显示与隐藏,结合响应式的数据绑定特性,使得状态管理更为直观简洁。 与此同时,考虑到性能优化和代码可维护性,现代开发者更倾向于采用原生JavaScript或者这些新兴框架来替代部分jQuery的功能。例如,通过addEventListener实现事件监听,利用CSS3的transition或animation实现动画效果,以及DOM API(如document.querySelector和Element.classList)对DOM元素进行操作。 然而,这并不意味着jQuery失去了其价值。对于许多遗留项目或初学者来说,jQuery仍然是快速上手JavaScript交互功能的良好选择,尤其是其简洁易懂的API设计和跨浏览器兼容性的优势不可忽视。 实际上,jQuery团队也在与时俱进,持续更新以适应新的Web标准。在实际项目中,根据具体需求和技术栈选型,灵活运用包括jQuery在内的各种工具和框架,能够更好地提升开发效率并确保项目的稳定性和用户体验。 此外,值得注意的是,近期发布的jQuery 3.6版本中,官方着重强化了对ES6+特性的支持,并继续精简体积,提高性能,体现出jQuery在新时代下依旧保持活力和创新力的一面。因此,在深入学习和掌握现代前端技术的同时,理解并合理运用jQuery,无疑将为前端开发者提供更为广阔的视角和更为全面的技能储备。
2023-08-16 12:28:27
109
键盘勇士
VUE
在深入探讨Vue历史聊天组件的应用之后,我们了解到Vue.js框架为构建交互式Web应用提供了强大且灵活的解决方案。近期,Vue.js社区继续保持活跃并推出了更多创新功能与优化升级。例如,在2022年初,Vue 3.2版本带来了对Composition API的重大改进和性能提升,使得开发者能够更高效地创建和管理复杂组件,如聊天应用中的实时消息推送、搜索过滤等功能。 进一步探究聊天应用开发领域,一项值得关注的实际案例是Slack最近宣布对其Web客户端进行技术栈重构,其中就运用了Vue.js来改善用户体验和提高应用程序性能。Slack团队通过整合Vue的强大功能,成功实现了用户界面的动态渲染和数据驱动更新,提升了聊天记录加载速度以及整体的流畅度。 同时,随着WebRTC等现代技术的发展,Vue.js也在实时通信、音视频通话等方面展现出了巨大潜力。许多开发者正在结合Vue.js和其他前沿技术打造新一代的实时聊天应用,这些应用不仅具备查看历史聊天记录的功能,还能实现一对一或群组的实时音视频对话。 因此,对于想要深入了解Vue.js在实时交互应用中实践应用的开发者来说,持续关注Vue.js官方发布、阅读相关实战教程、研究诸如Slack等大厂的技术博客,以及了解WebRTC等相关技术的发展趋势,都将是非常有益的延伸阅读方向。通过这些渠道,不仅可以洞悉Vue.js的最新进展和最佳实践,也能更好地借鉴并应用于自己的项目开发中,从而打造出更加高效、易用的聊天应用程序。
2023-03-26 23:43:20
156
算法侠
VUE
在深入学习Vue.js的过程中,除了掌握基础的实例创建、数据绑定、计算属性、条件渲染、列表渲染和事件处理等核心功能外,还需要关注Vue.js社区的最新动态以及相关技术的发展趋势。近期,Vue.js 3.2版本已正式发布,引入了Composition API的稳定版、Teleport组件、Suspense支持等新特性,大大提升了开发者的编程体验和应用性能。 此外,随着前端生态的不断演进,Vue.js与现代Web框架如React、Angular间的对比与融合也备受瞩目。例如,在Vue 3中借鉴并实现了类似React Hooks的功能,使得状态管理和逻辑复用更为灵活高效。同时,Vue生态系统中的Vuex状态管理库、Vue Router路由库也在持续更新,为构建大型单页应用提供了强大支撑。 在实际项目开发中,开发者可以参考官方文档和社区最佳实践,结合Webpack、Vite等现代化构建工具,进一步优化项目构建流程及提升应用加载速度。同时,对于无障碍访问(a11y)、SEO友好性等方面的考量也是现代前端开发的重要组成部分,Vue.js也在这些方面提供了相应的解决方案。 不仅如此,Vue.js在移动端领域也有广泛的应用,如配合Weex或Vant UI构建高性能跨平台移动应用。而随着Serverless架构和Jamstack的兴起,VuePress和Nuxt.js等基于Vue的静态站点生成器和SSR框架也成为了热门话题,为开发者提供了全新的内容驱动应用开发模式。 总之,学习Vue.js不仅停留在对基础知识的理解和运用上,更要紧跟技术潮流,了解并掌握最新的框架特性、生态工具以及行业发展趋势,才能更好地应对复杂多变的前端开发需求,创造出更优质的产品和服务。
2023-04-23 13:30:02
69
算法侠
JQuery
...端框架如React、Vue.js等逐渐崭露头角,它们不仅继承了jQuery对DOM操作的便利性,更引入了组件化、虚拟DOM等先进理念,使得构建复杂的交互式应用变得更加高效。 例如,在React中,通过状态(state)管理和JSX语法,开发者可以轻松实现按钮点击事件与图片显隐状态的联动,并且具备更好的性能优化。近期,React 18的发布带来了并发渲染、自动批处理更新等诸多新特性,这些改进无疑将进一步提升用户体验和开发效率。 同时,对于网页交互设计领域,响应式设计和无障碍访问已成为标准实践。根据W3C规范,开发者不仅需关注视觉效果,还要确保所有用户无论使用何种设备或存在何种障碍都能顺畅地与网页进行交互。这要求我们在利用诸如jQuery这类工具的同时,充分考虑其在不同场景下的兼容性和可访问性表现。 综上所述,虽然jQuery在简化JavaScript编程方面做出了巨大贡献,但与时俱进,掌握并运用最新的前端技术和设计理念,是我们构建高质量、高性能、高可用网页应用的关键所在。不断学习和探索新的前端解决方案,可以帮助我们更好地应对瞬息万变的互联网环境,创造出更加丰富多元的用户体验。
2023-11-16 15:49:26
344
算法侠
Java
...分布式系统设计的首选方案,Spring Boot和Spring Cloud等框架提供了完善的微服务解决方案,它们不仅简化了后台服务的构建过程,而且强化了不同服务之间的交互能力,确保前后台之间能够更加灵活地进行数据通信。 同时,前端技术也在快速发展,如React、Vue.js等现代JavaScript框架,它们通过组件化、状态管理等机制,更好地实现了与后台API的数据绑定和实时更新,提升了用户体验,并且有助于前后端团队并行开发,提高项目整体效率。 此外,在数据传输格式上,JSON虽仍为主流,但诸如GraphQL这样的查询语言也开始崭露头角,它允许客户端指定需要获取的具体数据字段,从而减少网络传输量,提高响应速度。 综上所述,无论是在架构设计、开发框架选择,还是在数据交换格式方面,Java Web开发中的前后台交互都在持续演进和完善中,开发者应紧跟技术发展趋势,结合实际业务需求,以实现更高效、更稳定的前后台交互体验。
2023-02-26 08:11:53
309
码农
JQuery
...前沿技术。例如,随着Vue.js、React和Angular等现代JavaScript框架的崛起,它们为开发者提供了更强大的组件化和状态管理能力,使得动态搜索和内容高亮等功能的实现更加简洁且易于维护。 近期,GitHub上开源项目“react-text-highlighter”就引起了广泛关注,它是一个基于React的文本高亮组件,不仅支持动态搜索关键词匹配,还能根据用户输入实时更新高亮显示。开发者可以借助此类现成的解决方案快速集成到自己的应用中,大大提升了开发效率。 此外,针对搜索引擎优化(SEO)场景下的关键词高亮需求,也有专门针对服务器端渲染(SSR)设计的库如"prismjs"和"hightlight.js",这些库不仅可以处理静态页面的代码高亮,也能在生成动态网页时对搜索结果进行精准的关键词标注和样式渲染。 同时,在无障碍性(Accessibility)方面,确保搜索高亮功能对屏幕阅读器等辅助设备友好也是当前前端开发的重要趋势之一。通过遵循WAI-ARIA规范并结合原生HTML元素如mark标签来实施高亮效果,能够提升网站对于视障用户的友好体验。 综上所述,尽管JQuery在简化网页开发方面功不可没,但与时俱进地了解和掌握新的开发工具与最佳实践,无疑将帮助我们在实际项目中更好地实现诸如搜索文字变色这样的交互功能,并兼顾性能、可维护性和用户体验等方面的全面提升。
2023-04-05 13:26:07
90
码农
站内搜索
用于搜索本网站内部文章,支持栏目切换。
知识学习
实践的时候请根据实际情况谨慎操作。
随机学习一条linux命令:
dig domain_name
- 使用DNS查询工具获取域名的详细信息。
推荐内容
推荐本栏目内的其它文章,看看还有哪些文章让你感兴趣。
2023-04-28
2023-08-09
2023-06-18
2023-04-14
2023-02-18
2023-04-17
2024-01-11
2023-10-03
2023-09-09
2023-06-13
2023-08-07
2023-03-11
历史内容
快速导航到对应月份的历史文章列表。
随便看看
拉到页底了吧,随便看看还有哪些文章你可能感兴趣。
时光飞逝
"流光容易把人抛,红了樱桃,绿了芭蕉。"