前端技术
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
[HTML无序列表导航栏美化技巧]的搜索结果
这里是文章列表。热门标签的颜色随机变换,标签颜色没有特殊含义。
点击某个标签可搜索标签相关的文章。
点击某个标签可搜索标签相关的文章。
CSS
...osition属性在列表样式设计中的作用也不容忽视。为了创建更加直观且符合语义的网页结构,许多开发者开始关注如何通过自定义列表样式(如使用:before伪元素添加个性化符号)并合理设置list-style-position来增强信息层次。尤其是在新闻网站、博客平台等需要大量呈现有序或无序列表的内容场景中,这一技巧的应用能有效提高用户浏览效率,降低认知负荷。 另外,针对无障碍设计,W3C等组织也提出了相关的最佳实践指南,建议开发者在使用text-indent缩进时,应注意避免过度缩进影响屏幕阅读器用户的体验,同时对于list-style-position属性的设定也要充分考虑其对键盘导航及辅助技术的支持情况。 总之,深入理解和灵活运用CSS中的text-indent与list-style-position属性,不仅有助于打造美观易读的页面布局,更能顺应时代潮流,贴合当下互联网产品设计对用户体验和无障碍性的高标准要求。
2023-02-27 22:17:26
523
逻辑鬼才
JQuery插件下载
...到项目中,并采用标准HTML结构来构建轮播内容,如使用无序列表( )包裹图片( )等元素。通过调用carousel()方法初始化插件,即可轻松实现响应式、可配置的图片轮播功能。此外,该插件支持多种自定义选项,允许用户调整轮播速度、切换动画效果、是否启用无限循环、是否显示导航控件以及是否自动播放等特性,确保满足不同网站和应用程序对于视觉体验和交互需求的多样化要求。同时,它还兼容现代主流浏览器,保证在各种设备和屏幕尺寸上都能呈现出稳定而吸引人的旋转木马轮播效果。 点我下载 文件大小:479.12 KB 您将下载一个JQuery插件资源包,该资源包内部文件的目录结构如下: 本网站提供JQuery插件下载功能,旨在帮助广大用户在工作学习中提升效率、节约时间。 本网站的下载内容来自于互联网。如您发现任何侵犯您权益的内容,请立即告知我们,我们将迅速响应并删除相关内容。 免责声明:站内所有资源仅供个人学习研究及参考之用,严禁将这些资源应用于商业场景。 若擅自商用导致的一切后果,由使用者承担责任。
2023-11-25 11:57:36
45
本站
JQuery插件下载
...s3响应式斑马线表格美化插件”是一款专为提升网页数据展示效果与用户体验而设计的高级交互组件。它采用了业界流行的jQuery库结合CSS3的强大功能,将传统的HTML表格进行彻底革新,以无序列表的形式构建,不仅拥有出色的响应式布局特性,能够自动适应各种屏幕尺寸,包括桌面、平板及手机等移动设备,确保在不同环境下均能提供清晰易读的数据视图。该插件的核心亮点在于其斑马线隔行变色功能,通过巧妙的CSS3样式规则实现交替行背景颜色变化,显著增强了表格内容的可扫描性,使用户能够快速定位和区分不同的行记录。此外,响应式设计使得在窄屏或小屏幕设备上时,表格可以智能地调整列宽和布局,保持最佳的视觉效果和操作便捷性。总之,这款插件是网页开发者优化数据展示、增强网站专业感与用户友好度的理想工具,无论是企业报表、数据分析还是内容管理系统中复杂数据的呈现,都能发挥出色的表现力和实用性。 点我下载 文件大小:54.65 KB 您将下载一个JQuery插件资源包,该资源包内部文件的目录结构如下: 本网站提供JQuery插件下载功能,旨在帮助广大用户在工作学习中提升效率、节约时间。 本网站的下载内容来自于互联网。如您发现任何侵犯您权益的内容,请立即告知我们,我们将迅速响应并删除相关内容。 免责声明:站内所有资源仅供个人学习研究及参考之用,严禁将这些资源应用于商业场景。 若擅自商用导致的一切后果,由使用者承担责任。
2023-06-23 23:25:48
48
本站
JQuery插件下载
...美观且实用的垂直多级导航菜单。这款插件能够将任何嵌套的无序列表(unorderedlist)轻松转化为类似GitHub风格的手风琴式导航菜单。用户可以根据需要自由地添加和组织菜单项,而无需编写复杂的HTML或JavaScript代码。lazeemenu的设计灵感来源于GitHub的界面风格,特别适合用于需要展示多层级结构信息的网站,如文档目录、产品分类或是项目模块等场景。它支持菜单项以普通文本或超链接的形式呈现,使得用户不仅可以查看内容概览,还能直接点击跳转到具体页面或锚点,极大地提升了用户体验。通过简单的配置选项,用户可以自定义菜单的外观,包括颜色、字体大小、背景等视觉元素,使其与网站的整体设计风格保持一致。此外,lazeemenu还具有响应式设计的特点,能够在不同设备和屏幕尺寸下自动调整布局,确保在手机、平板电脑以及桌面设备上均能获得良好的浏览体验。总之,lazeemenu以其简洁易用、高度定制化以及与GitHub风格兼容的特点,成为构建垂直多级导航菜单的理想选择。无论是个人博客、企业官网还是复杂的企业应用系统,lazeemenu都能帮助你快速实现美观且功能强大的导航菜单。 点我下载 文件大小:43.36 KB 您将下载一个JQuery插件资源包,该资源包内部文件的目录结构如下: 本网站提供JQuery插件下载功能,旨在帮助广大用户在工作学习中提升效率、节约时间。 本网站的下载内容来自于互联网。如您发现任何侵犯您权益的内容,请立即告知我们,我们将迅速响应并删除相关内容。 免责声明:站内所有资源仅供个人学习研究及参考之用,严禁将这些资源应用于商业场景。 若擅自商用导致的一切后果,由使用者承担责任。
2024-11-18 21:21:19
88
本站
Bootstrap
...备上的显示: html 姓名 职位 部门 张三 工程师 研发部 2. 使用折叠显示 当表格内容过多时,可以采用折叠显示机制,仅显示部分数据,用户点击后显示完整列表。这可以通过 JavaScript 或 Bootstrap 的插件实现,如 bootstrap-table 提供的滚动功能。 html 3. 优化视觉体验 使用 Bootstrap 的颜色、字体和间距类来增强表格的视觉吸引力。例如,可以为表格添加阴影效果,使其在小屏幕设备上更加突出。 html 4. 自定义分页和排序 对于大型数据集,提供分页和排序选项是必要的。Bootstrap 和其他前端库提供了丰富的插件来实现这一功能,使得用户能够方便地浏览大量数据。 html Total: { { total } } 刷新 排序 结论 优化 Bootstrap 表格在移动设备上的显示是一个综合性的任务,涉及到响应式设计、交互元素的加入以及用户体验的提升。嘿,朋友们!想要让你的网站在手机和平板上也超棒吗?那就得看看我这招啦!通过采用一些聪明的策略和实际的代码实例,你可以让网页在大屏幕和小屏幕上都玩得转!不管是在手机上滑来滑去,还是在平板上轻轻触碰,都能给你带来顺畅、清晰又易用的体验。这样一来,无论用户是用手机还是平板,都能享受到你的网站带来的乐趣!所以,别再犹豫了,快去试试吧!记住,设计的目标始终是让信息清晰、易于访问,无论用户是在哪里查看。随着技术的不断进步,这些优化方法也将不断发展和完善,因此持续学习和实践是保持网站适应性的重要途径。
2024-08-06 15:52:25
39
烟雨江南
JQuery
...它的核心功能就是简化HTML文档遍历、事件处理、动画效果等操作。其实 jQuery 压根儿不是专门搞数组的,但它里面藏着不少好用的小工具,就像随身带了个万能 Swiss Army Knife(瑞士军刀),想干啥都方便,处理数组什么的基本不在话下! 举个例子,如果你有一堆HTML列表项( 标签),你可以用jQuery快速找到它们并对其进行操作。比如给每个列表项添加点击事件,或者修改它们的内容。这不就是数组循环赋值的典型应用场景吗? --- 3. 如何用jQuery循环赋值? 3.1 使用each()方法 先来说说最常用的each()方法吧。each()是jQuery提供的一个非常实用的函数,它可以用来遍历集合中的每一个元素,并执行回调函数。对于数组来说,each()的表现也非常棒! 假设我们有一个数组numbers,里面存放了一些数字。我们想通过jQuery将这些数字显示在一个无序列表( )中。代码可以这样写: html 这里的关键在于$.each()函数的第一个参数是我们要遍历的数组,第二个参数是一个回调函数,其中index表示当前元素的索引,value则是该元素的值。通过这种方式,我们可以轻松地将数组中的每一项添加到页面上。 不过呢,有时候你会发现直接用each()并不能完全满足需求。比如说,你得看看数组里满足不满足某个条件,要是满足了,那就接着往下走;要是不满足,可能就得另想办法,或者干脆就别执行后面那堆事了。这时候就需要稍微动点脑筋了。 --- 3.2 使用for循环结合jQuery 当然啦,如果你觉得each()太过于“黑箱”,不喜欢隐藏内部细节的话,也可以选择传统的for循环。其实呢,jQuery就是JavaScript的一个小帮手啦,说白了,它再厉害,最后还是得靠原生JavaScript去干活儿。 html 这段代码跟前面的例子类似,只不过我们手动控制了循环变量i,并且直接通过colors[i]访问数组中的元素。这样做的好处就是,你可以更随心所欲地摆弄数组里的数据,比如说直接跳过那些你不想管的项目,特别方便! --- 3.3 高级玩法:链式调用 如果你是个追求极致简洁的人,那么jQuery的链式调用绝对会让你爱不释手。简单来说,链式调用就是让你在一整行代码里接连调用好几个方法,这样就能少写好多重复的东西,看着清爽,用起来也方便! 比如,如果你想一次性创建整个无序列表,可以用下面这种方式: html 这段代码看起来是不是特别酷?我们先创建了一个新的 元素,然后利用map()方法生成所有的 标签,最后再将它们拼接成完整的HTML字符串,再插入到指定的容器中。这种写法不仅高效,还非常优雅! --- 4. 小结与感悟 好了,到这里咱们已经讨论了很多关于jQuery数组循环赋值的内容。说实话,最开始接触这些玩意儿的时候,我也是头都大了,心里直犯嘀咕:这是啥呀?这也太复杂了吧?感觉整个人都不好了,差点怀疑自己是不是选错了路子。其实吧,我后来才明白,这东西也没那么难。你只要把最基本的那些道理搞清楚了,再有点儿耐心,多试着练练,慢慢就啥问题都没啦! 在这里,我想分享一个小技巧:多看官方文档!jQuery的官方文档写得非常好,里面不仅有详细的API说明,还有很多生动的例子。每次遇到问题的时候,我都习惯先去看看文档,很多时候都能找到答案。 最后,希望大家都能从这篇文章中学到一些有用的东西。记住,编程不是一蹴而就的事情,它需要不断的尝试和总结。如果你还有其他关于jQuery的问题,欢迎随时交流哦!加油!💪 --- 好了,这就是我关于“jQuery数组怎样循环赋值”的全部内容啦。希望你能喜欢这篇文章,并且从中受益匪浅!如果觉得有用的话,不妨点赞支持一下吧~😊
2025-05-08 16:16:22
61
蝶舞花间
转载文章
...;!DOCTYPE html><html><head> <meta charset="utf-8"> <title>W3Cschool(w3cschool.cn)</title> </head><body><em>强调文本</em><br><strong>加粗文本</strong><br><dfn>定义项目</dfn><br><code>一段电脑代码</code><br><samp>计算机样本</samp><br><kbd>键盘输入</kbd><br><var>变量</var></body></html 2、HTML <audio> 标签 <audio> 标签是 HTML5 提供的用来播放音频文件的。 <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>W3Cschool(w3cschool.cn)</title> </head><body><audio controls><source src="/statics/demosource/horse.ogg" ><source src="/statics/demosource/horse.mp3" >您的浏览器不支持 audio 元素。</audio></body></html> 3、HTML <area> 标签 <area> 标签可以在图像上划分区域,这些区域是可以点击的,并且对应不同的操作。 <!DOCTYPE html><html><head><meta charset="utf-8"><title>W3Cschool(w3cschool.cn)</title></head><body><p>点击太阳或其他行星,注意变化:</p><img src="/statics/images/course/planets.gif" width="145" height="126" alt="Planets" usemap="planetmap"><map name="planetmap"><area shape="rect" coords="0,0,82,126" target="_blank" alt="Sun" href="/statics/images/course/sun.gif"><area shape="circle" coords="90,58,3" target="_blank" alt="Mercury" href="/statics/images/course/merglobe.gif"><area shape="circle" coords="124,58,8" target="_blank" alt="Venus" href="/statics/images/course/venglobe.gif"></map></body></html> 4、HTML <select> 标签定义及使用说明 <select> 元素用来创建下拉列表。 <!DOCTYPE html><html><head><meta charset="utf-8"> <title>W3Cschool(w3cschool.cn)</title> </head><body><select><option value="volvo" style="display:none">Volvo</option><option value="saab">Saab</option><option value="opel">Opel</option><option value="audi">Audi</option></select></body></html> 5、HTML <style> 标签 <style> 标签包含了 HTML 文档的样式详细,在默认情况下,在该元素内写入的样式指令将被认为是CSS。 <!DOCTYPE html><html><head><meta charset="utf-8"> <title>W3Cschool(w3cschool.cn)</title><style type="text/css">h1 {color:red;}p {color:blue;}</style></head><body><h1>这是一个标题</h1><p>这是一个段落。</p></body></html> 7、HTML <sub> 标签 包含在 <sub> 标签和其结束标签 </sub> 中的内容会以正常内容的一半的高度显示在下方,而且通常较小,请参见下述例子: <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>W3Cschool教程(w3cschool.cn)</title> </head><body><p>这个文本包含 <sub>下标</sub>文本。</p><p>这个文本包含 <sup>上标</sup> 文本。</p></body></html> 8、HTML <summary> 标签 <summary> 标签元素作为一个<datails>元素的标题,该标题可以包含详细的信息,但是默认情况下不显示,需要单击才能显示详细信息,请参考下述示 <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>W3Cschool(w3cschool.cn)</title> </head><body><details><summary>Copyright 1999-2011.</summary><p> - by Refsnes Data. All Rights Reserved.</p><p>All content and graphics on this web site are the property of the company Refsnes Data.</p></details><p><b>注意:</b>目前只有 Chrome 和 Safari 6 支持 summary 标签。</p></body></html> 9、HTML <table> 标签 <table> 标签用来定义 HTML 表格,一个简单的 HTML 表格应该包括两行两列,如下述示例所示: <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>W3Cschool教程(w3cschool.cn)</title> </head><body><table border="1"><tr><th>Month</th><th>Savings</th></tr><tr><td>January</td><td>$100</td></tr><tr><td>February</td><td>$80</td></tr></table></body></html> 10、HTML <textarea> 标签 <textarea> 标签表示多行纯文本编辑控件,用户可在其文本区域中写入文本,请参考下述示例: <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>W3Cschool 在线教程(w3cschool.cn)</title> </head><body><textarea rows="10" cols="30">我是一个文本框。</textarea></body></html> 11、HTML <tt> 标签 - HTML5 不支持 <tt> 标签用来改变字体样式,使标签中的文本显示为打字机文本,请参考下述例子: <!DOCTYPE html><html><body><p>This text is normal.</p><p><tt>This text is teletype text.</tt></p></body></html> 12、HTML <u> 标签 <u> 标签可以用来对标签内的文本实现下划线样式,请参考下述示例: <!DOCTYPE html><html><body><p>This is a <u>parragraph</u>.</p></body></html> 13、HTML <ul> 标签 <ul> 标签表示HTML页面中项目的无序列表,一般会以项目符号列表呈现,请参考下述例子: <!DOCTYPE html><html><head><meta charset="utf-8"> <title>W3Cschool(w3cschool.cn)</title> </head><body><h4>无序列表:</h4><ul><li>咖啡</li><li>茶</li><li>牛奶</li></ul></body></html> 14、HTML <video> 标签 <video> 标签可以将视频内容嵌入到HTML文档中,请参考下述示例: <!DOCTYPE html><html><body><video width="320" height="240" controls><source src="/statics/demosource/movie.mp4" type="video/mp4"><source src="/statics/demosource/movie.ogg" type="video/ogg">您的浏览器不支持 HTML5 video 标签。</video></body></html> 15、HTML <ol> 标签 <ol> 标签在 HTML 中表示有序列表,是 ordered lists 的缩写。您可以自定义有序列表的初始序号,请参考下面的实例: <!DOCTYPE html><html><head><meta charset="utf-8"> <title>W3Cschool(w3cschool.cn)</title> </head><body><ol><li>咖啡</li><li>茶</li><li>牛奶</li></ol><ol start="50"><li>咖啡</li><li>茶</li><li>牛奶</li></ol></body></html> 16、HTML <noframes> 标签HTML5不支持该标签 <noframes> 标签用于支持不支持 <frame> 元素的浏览器,请参考下面的示例: <html><head><meta charset="utf-8"> <title>W3Cschool(w3cschool.cn)</title> </head><frameset cols="25%,50%,25%"><frame src="/statics/demosource/frame_a.htm"><frame src="/statics/demosource/frame_b.htm"><frame src="/statics/demosource/frame_c.htm"><noframes>抱歉,您的浏览器不支持 frame 属性!</noframes></frameset></html> 17、HTML <hr> 标签 <hr> 标签表示段落级元素之间的主题划分。例如,在下面的实例中我们对具有主题变化的内容使用了 <hr> 标签: <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>W3Cschool(w3cschool.cn)</title> </head><body><h1>HTML</h1><p>HTML 是用于描述 web 页面的一种语言。</p><hr><h1>CSS</h1><p>CSS 定义如何显示 HTML 元素。</p></body></html> 18、HTML <h1> - <h6> 标签 <h1> - <h6> 标签用来定义 HTML 标题,表示了 HTML 网页中六个级别的标题。您可以通过下面的这个实例来看看每个级别的标题有什么区别: <!DOCTYPE html><html><head><meta charset="utf-8"><title>W3Cschool(w3cschool.cn)</title></head><body><h1>这是标题1</h1><h2>这是标题2</h2><h3>这是标题 3</h3><h4>这是标题 4</h4><h5>这是标题 5</h5><h6>这是标题 6</h6></body></html> 19、HTML <center> 标签 - HTML 5 不支持 <center> 标签控制文本的居中显示,不能在 HTML5 中使用。 <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>W3Cschool(w3cschool.cn)</title> </head><body><p>这是一些文本。</p><center>这个文本居中对齐。</center><p>这是一些文本</p></body></html> 20、HTML <button> 标签 <button> 标签用来设置 HTML 中的按钮。 <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>W3Cschool(w3cschool.cn)</title> </head><body><button type="button" onclick="alert('Hello world!')">Click Me!</button></body></html> 21、HTML <br> 标签 <br> 标签是空标签,可插入一个简单的换行符。 <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>W3Cschool(w3cschool.cn)</title> </head><body><p>使用br元素<br>在文本中<br>换行。</p></body></html> 22、HTML <dt> 标签 <dt> 标签只能够作为 <dl> 标签的一个子元素出现,常常后跟一个 <dd> 标签。 <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>W3Cschool(w3cschool.cn)</title> </head><body><dl><dt>咖啡</dt><dd>黑色的热饮</dd><dt>牛奶</dt><dd>白色的冷饮</dd></dl></body></html> 23、HTML <fieldset> 标签 <fieldset> 标签内的一组表单元素会在 WEB 浏览器中以特殊的方式显示,比如不同样式的边界、3D效果等。 <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>W3Cschool(w3cschool.cn)</title> </head><body><form><fieldset><legend>个人信息:</legend>姓名: <input type="text"><br>邮箱: <input type="text"><br>生日: <input type="text"></fieldset></form></body></html> 24、HTML <embed> 标签 <embed> 标签用来定义在页面中嵌入的内容,比如插件。比如,在下面的实例中我们嵌入了一个 flash 动画: <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>W3Cschool(w3cschool.cn)</title> </head><body><embed src="/statics/demosource/helloworld.swf" tppabs="http://W3Cschool.com/tags/helloworld.swf"></body></html> 25、HTML <font> 标签 - HTML5 不支持 <font> 标签的使用示例如下所示,该标签已经过时,因此我们不建议您使用该标签。 <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>W3Cschool(w3cschool.cn)</title> </head><body><p><font size="3" color="red">这是一些文本!</font></p><p><font size="2" color="blue">这是一些文本!</font></p><p><font face="verdana" color="green">这是一些文本!</font></p></body></html> 26、HTML <label> 标签 <label> 标签是一种常见的表单控件,触发对应表单控件功能,让用户在使用表单的时候能够有更好的体验。参考下述的实例: <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>W3Cschool(w3cschool.cn)</title> </head><body><p>点击其中一个文本标签选中选项:</p><form action="/statics/demosource/demo-form.php"><label for="male">Male</label><input type="radio" name="sex" id="male" value="male"><br><label for="female">Female</label><input type="radio" name="sex" id="female" value="female"><br><br><input type="submit" value="提交"></form></body></html> 记录一些重要标签! 本篇文章为转载内容。原文链接:https://blog.csdn.net/chehec2010/article/details/85060460。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-10-11 23:43:21
296
转载
HTML
...我将讲解如何应用原始HTML代码建立个人博客。 首先,我们需要建立一个html文件,并在头部信息中插入必需的metadata。以下是一个典型的html头部信息: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>我的个人博客</title> </head> <body> </body> </html> 在body标签内,我们可以开始搭建我们的博客。首先,我们需要一个菜单栏,可以帮助读者便捷浏览网站。以下是一个简单的菜单栏代码样例: <nav> <ul> <li><a href="index.html">主页</a></li> <li><a href="about.html">个人简介</a></li> <li><a href="contact.html">联络方式</a></li> </ul> </nav> 接下来我们需要一个文章目录。以下是一个简单的列表代码样例: <h2>我的博客</h2> <ul> <li><a href="post1.html">我的第一篇博客</a></li> <li><a href="post2.html">我的第二篇博客</a></li> </ul> 最后,我们需要插入一个页脚,让我们的博客看起来更加完整。以下是一个简单的页脚代码样例: <footer> <p>版权所有 © 2021 我的个人博客</p> </footer> 到此为止,我们已经成功建立了一个基本的个人博客。应用p标签和pre标签可以使我们的代码更加清晰易懂。当然,这只是一个起点,我们可以根据自己的需求和兴趣不断地对博客进行改进。
2023-04-28 09:03:31
417
电脑达人
转载文章
...puts-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
转载
建站模板下载
资源介绍 该“左侧导航栏摄影爱好者个人网站静态模板”是一款专为摄影爱好者设计的响应式HTML5单页模板,具备自适应特性,完美适配各类设备。模板以左侧导航栏为核心设计,提供清晰便捷的网站导航体验,用户可以展示个人摄影作品、分享摄影心得与技巧。此模板适用于建立个人主页或博客,展现摄影师的专业风采及个人爱好,打造独具特色的摄影爱好者专属网站。 点我下载 文件大小:1.58 MB 您将下载一个资源包,该资源包内部文件的目录结构如下: 本网站提供模板下载功能,旨在帮助广大用户在工作学习中提升效率、节约时间。 本网站的下载内容来自于互联网。如您发现任何侵犯您权益的内容,请立即告知我们,我们将迅速响应并删除相关内容。 免责声明:站内所有资源仅供个人学习研究及参考之用,严禁将这些资源应用于商业场景。 若擅自商用导致的一切后果,由使用者承担责任。
2023-05-20 22:51:23
201
本站
建站模板下载
...音乐在线播放首页网站html5模板”是一款采用先进CSS3技术构建的精美网页模板,专为电台、音乐馆等音乐类平台设计。以清爽的绿色调为主,提供流畅的在线音乐和视频播放功能,并配备有固定导航栏方便用户在浏览时快速切换不同栏目。此模板不仅支持歌曲列表展示与播放控制,还兼顾了用户体验与视觉美学,是打造高品质音乐在线服务平台的理想选择。 点我下载 文件大小:1.06 MB 您将下载一个资源包,该资源包内部文件的目录结构如下: 本网站提供模板下载功能,旨在帮助广大用户在工作学习中提升效率、节约时间。 本网站的下载内容来自于互联网。如您发现任何侵犯您权益的内容,请立即告知我们,我们将迅速响应并删除相关内容。 免责声明:站内所有资源仅供个人学习研究及参考之用,严禁将这些资源应用于商业场景。 若擅自商用导致的一切后果,由使用者承担责任。
2023-12-18 11:17:40
102
本站
JQuery插件下载
...,专为提升网页表单及导航菜单的用户体验而打造。它采用现代化的扁平化设计理念,通过灵活运用HTML5的div标签进行嵌套结构布局,构建出一种新颖且互动性强的下拉列表框特效。当用户与下拉框交互时,该插件将展示其独特的动画性能:在点击或悬停触发后,下拉菜单会以流畅且富有弹性的动态效果展开,呈现出一系列选项供用户选择。而在用户选定某个选项后,插件不仅会快速响应并更新选中状态,还会添加一些酷炫的弹性动画反馈,增强视觉上的吸引力与操作的直观性。凭借jQuery强大的DOM操作能力和CSS3丰富的动画特性,此插件能够在各种现代浏览器上实现高性能、低延迟的交互体验,并且易于集成到现有的Web项目中,为开发者提供了一种便捷的方式来美化和增强传统的HTML下拉框元素,从而提升整体网站的品质感与专业度。 点我下载 文件大小:142.13 KB 您将下载一个JQuery插件资源包,该资源包内部文件的目录结构如下: 本网站提供JQuery插件下载功能,旨在帮助广大用户在工作学习中提升效率、节约时间。 本网站的下载内容来自于互联网。如您发现任何侵犯您权益的内容,请立即告知我们,我们将迅速响应并删除相关内容。 免责声明:站内所有资源仅供个人学习研究及参考之用,严禁将这些资源应用于商业场景。 若擅自商用导致的一切后果,由使用者承担责任。
2023-03-21 13:48:24
91
本站
HTML
网站的导航是用户浏览网站最常用的作用之一。导航栏内的二级导航可以更详细地将网站的各个模块和作用进行归类和维护,为用户提供更加方便快捷的用户界面。 在HTML中,二级导航的代码写法可以运用项目符号列表(<ul>元素)和编号列表(<ol>元素)。通过在列表元素内使用链接(<a>元素)完成跳转链接跳转。 <ul> <li><a href="">主页</a></li> <li><a href="">资讯</a> <ul> <li><a href="">国内新闻</a></li> <li><a href="">国际新闻</a></li> <li><a href="">体育</a></li> </ul> </li> <li><a href="">商品</a> <ul> <li><a href="">移动设备</a></li> <li><a href="">计算机</a></li> <li><a href="">家用电器</a> <ul> <li><a href="">电视</a></li> <li><a href="">冰箱</a></li> <li><a href="">空调</a></li> </ul> </li> </ul> </li> </ul> 在完成二级导航时,需要使用CSS样式设置导航栏的视觉样式,例如字型、背景色、宽度等。为了方便维护和统一样式,可以将二级导航的CSS样式写在单独的CSS文件中。同时,也可以使用JavaScript完成二级导航的动态效果,例如鼠标悬停时的下拉菜单效果。
2023-08-10 21:40:10
451
程序媛
CSS
...互的网页界面。它包括HTML、CSS和JavaScript等技术的运用,实现网页布局、颜色搭配、字体样式、响应式设计等功能,确保用户体验良好且信息易于获取。 CSS (Cascading Style Sheets) , CSS是一种样式表语言,用于描述HTML或XML(包括如SVG、MathML等各种XML方言)文档的呈现。在文章语境中,CSS被用来设置水平导航条中文本的letter-spacing属性,即控制文本字符之间的间距,以达到美化和优化用户界面的目的。 letter-spacing属性 , letter-spacing是CSS中的一个样式属性,允许开发者指定文本中字符之间的额外间距。通过调整这个属性值(例如像素、百分比或em单位),可以增大或减小文本内字母间的距离,从而影响整体排版效果及阅读体验。在文章提到的例子中,使用letter-spacing: 2px; 将会使导航条中的文字每个字母间隔扩大2个像素的距离。
2023-11-07 18:25:18
438
码农
HTML
...它的程序代码一般由 HTML 语言编写。HTML 是一种用于建立网页的标记语言。 以下是冰墩墩程序代码的一个简单例子: <!DOCTYPE html> <html> <head> <title>冰墩墩程序代码</title> </head> <body> <h1>冰墩墩的简介</h1> <p>冰墩墩是一款可爱的教育机器人,它的外观是一只企鹅。冰墩墩有充足的语音交互功能,能够与小孩进行互动,帮助他们研习中文和各种知识。</p> <h2>冰墩墩的特性</h2> <ul> <li>充足的教育资源</li> <li>智慧的语音交互</li> <li>可爱的外观规划</li> </ul> <p>如果你想了解更多关于冰墩墩的信息,请访问我们的官方网站。</p> <a href="https://www.bingdungu.com">访问冰墩墩官网</a> </body> </html> 上面的代码示例中,<!DOCTYPE html> 界定了 HTML 文档类型,<html> 代表 HTML 根元素。<head> 元素包含了网页的头部信息,<body> 元素包含了网页的主要内容。<h1> 和 <h2> 代表标题栏,<p> 代表文本段落,<ul> 和 <li> 代表无序列表。 在 HTML 中,标签和属性都是大小写敏感的。标签一般是成对出现的,即有开始标签和结束标签。属性用于为 HTML 元素提供附加的信息,一般包含在开始标签中,并以键值对的形式出现。 HTML 是一种基本的前端技术,他的能力并不局限于教育机器人,它可以为网页的规划和开发提供重要的支持。
2023-09-24 23:37:14
415
码农
HTML
...线了一种新的应用——HTML首页代码制作器,它可以让用户迅速地制作京东样式的网页页面。这个应用的应用非常便捷,只需要挑选需要增加的页面元素,输入对应的内容,就可以制作网页页面了。 应用HTML首页代码制作器,不仅可以方便地制作网页页面,还可以节省大量的时间。相比于手动编写HTML代码,这个应用可以快速地制作代码,减少错误率。此外,用户还可以根据自己的需求对制作的代码进行修改,更加灵活地制作网页页面。 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>京东HTML首页</title> <style> /这里可以增加自定义的CSS样式/ </style> </head> <body> <!--这里可以增加制作的页面元素,例如导航栏、轮播图、产品展示、热卖推荐等--> </body> </html> 如果你想要快速、方便地制作京东样式的网页页面,不妨尝试一下HTML首页代码制作器。相信它会成为你制作网页页面的得力助手。
2023-07-22 15:59:38
372
数据库专家
CSS
...样式表语言,用于描述HTML或XML(包括如SVG、MathML等 XML方言)文档的呈现。在网页设计中,CSS负责定义用户界面的视觉表现,如字体、颜色、布局等。在本文语境中,CSS是设置横向菜单背景的关键技术手段,通过CSS代码可以实现对导航栏背景颜色、图片、平铺方式等多种样式的控制。 background-color属性 , 在CSS中,background-color属性用来指定一个元素的背景颜色。文章中提到,通过设置background-color: FFF;为导航栏nav元素赋予白色背景,这是构建和定制横向菜单背景风格的基础步骤之一。 background-image属性 , CSS中的background-image属性用于向元素添加背景图像。文中示例展示了如何使用background-image: url( menu-bg.png );引入一个名为 menu-bg.png 的图片作为导航栏的背景,并通过background-repeat: repeat-x;属性让图片在水平方向上重复平铺,从而创建出具有独特视觉效果的横向菜单背景图案。 display: inline-block属性 , 在CSS布局中,display属性决定元素应该以何种方式显示。其中,inline-block值使得元素表现为内联块级元素,既保持了像内联元素一样的水平布局(即在同一行显示),又能像块级元素一样设置宽度、高度和顶部/底部边距。在本文中,这一属性被应用于nav下的li元素,使得菜单项能够水平排列,形成横向菜单布局。
2023-08-01 19:49:41
493
码农
转载文章
...ap是一个流行的开源HTML、CSS和JavaScript工具包,用于快速开发响应式布局以及移动设备优先的网站。它提供了丰富的预定义组件,如导航栏、按钮、表单元素等,帮助开发者轻松构建具有专业外观和交互功能的网页。 缩略图(thumbnail) , 在计算机图形学与Web设计中,缩略图是指原始图片或文档的一种小型版本,保留了大致内容和结构特征,常用于快速浏览大量内容时提供预览效果。在Bootstrap框架下,thumbnail 类专门用来创建图像或其他内容的缩略视图,通常带有链接至完整尺寸或更多详情页面的功能。 响应式布局 , 响应式布局是一种网页设计方法,使网站能够根据访问设备的不同屏幕尺寸和方向自动调整布局、内容大小和功能展现方式。在Bootstrap框架中,响应式布局是其核心特性之一,通过一系列媒体查询和灵活的网格系统,确保网页在桌面、平板和手机等各种设备上都能提供良好的用户体验。
2023-06-08 11:31:22
299
转载
HTML
...!今天我们要来聊一下HTML中的两个非常重要的元素—— 和。这两个元素看似简单,但它们的作用却十分广泛。接下来让我们一起来详细了解一下这两个元素。 二、什么是 和? 首先,我们需要明确这两个元素的基本概念。在HTML中, 是一个用于分组的容器元素,可以用来组织网页内容,而则是一个用于标记文本片段的小型容器元素。 三、 标签的应用 接下来我们来看一下 标签的应用。下面是一个简单的例子: html 我的第一个 div 这是一个段落。 在这个例子中,我们创建了一个名为myDiv的div容器,并将一个标题( )和一个段落( )放入其中。通过这种方式,我们可以轻松地将相关的HTML元素组织在一起。 四、标签的应用 然后我们来看一下标签的应用。下面也是一个简单的例子: html 我喜欢吃苹果 在这个例子中,我们在一个句子中使用了标签,改变了被包围文本的颜色为红色。标签非常适合用于对文本进行样式修改或者定位。 五、 和的区别 那么, 和有什么区别呢?首先, 主要用于结构化内容,而主要用于添加样式或者语义含义。其次, 通常包含整个块级元素,如表格、列表等,而通常只包含行内元素,如文本、链接等。最后,由于 是块级元素,所以它有自己的宽度、高度、边距和填充,而只是行内元素,没有这些属性。 六、 和的使用场景 了解了 和的基本知识后,我们来看看它们在实际开发中的应用场景。一般来说,我们会用 来组织页面布局,例如设置导航栏、侧边栏、主内容区域等。而则常用于添加样式或者调整文本格式,例如改变字体颜色、大小、样式等。 七、总结 总的来说, 和都是HTML中的重要元素,虽然它们的功能有所不同,但在实际开发中经常需要同时使用。了解它们的特点和应用场景,可以帮助我们更好地构建和维护网站。希望这篇文章能对你有所帮助! 八、附录 更多实例 这里再给大家提供一些实例,让大家更深入地理解 和的使用: html 这是页眉 这是主要内容 这是页脚 这是一段文字,蓝色的部分是要加粗的文字。 以上就是今天的全部内容,感谢你的阅读!如果你有任何问题,欢迎随时向我提问。
2023-10-10 08:03:49
503
心灵驿站-t
CSS
建立水平导航栏是网页设计和开发中非常根基和实际的技巧,其中CSS是完成水平导航栏的一个重要工具。下面我们将借助一些示例代码来理解如何运用CSS来建立美观的水平导航栏。 首先,在HTML文件中,我们需要建立一个包含导航链接的ul元素。每个链接作为一个li标签,链接指向与导航链接相关的页面。 <ul class="nav"> <li><a href="">首页</a></li> <li><a href="">公司简介</a></li> <li><a href="">产品介绍</a></li> <li><a href="">联系我们</a></li> </ul> 在CSS中,我们可以运用display属性为ul元素调整为水平显示,将li元素设置为块元素,这样可以拓宽导航链接的宽度。我们还可以为导航链接设置边界和背景颜色。 .nav { display: flex; background-color: 333; padding: 0; list-style: none; } .nav li { flex: 1; text-align: center; border-right: 1px solid fff; } .nav a { display: block; color: fff; padding: 15px 20px; text-decoration: none; } 在上面的示例CSS中,我们运用flex属性来将导航链接放置在一行。我们还运用了flex:1属性,这将在所有导航链接上分派相同的区域。我们还设置了一个边界线,在每个导航链接之间增加空隙。最后,我们为导航链接设置了黑色背景和白色字体颜色。 在下面这个示例中,我们将为当前选择的导航链接增加一个类active,以便让用户知道当前身处于哪个页面。 .nav a.active { background-color: 4CAF50; color: white; } 在上面的示例CSS中,我们运用了.active类选取器来增加绿色背景,同时改动字体颜色。 运用CSS,我们可以建立出美观的水平导航栏,给网页增色不少。借助以上的示例,可以看到CSS对于网页设计和开发至关重要,我们应该强化对于CSS的学习和理解,以制作出更为精致的网页。
2023-12-16 16:09:27
461
电脑达人
JQuery
...假设我们有一个简单的HTML列表: html Item 1 Item 2 Item 3 如果我们想要通过jQuery获取这个列表中的所有 元素,并将它们存入一个数组中,我们可以这样做: javascript var items = $("myList li"); console.log(items); // 输出: [ , , ] 这里,items就是一个jQuery对象,它包含了所有的 元素。但是,如果我们想把它变成一个真正的数组,可以这样做: javascript var itemsArray = $.makeArray(items); console.log(itemsArray); // 输出: [ , , ] 这时候,itemsArray就是我们想要的数组了。是不是感觉挺简单的? 2. 向数组添加元素 现在,咱们来讨论一下如何向这个数组添加新的元素。首先得搞清楚,jQuery对象自己可不会直接去加元素。不过,我们可以利用原生JavaScript的方法来实现这一点。这里有几个方法可以尝试: 方法一:使用push() 如果你已经有一个数组,并且想要向其中添加一个新的jQuery对象,你可以这样做: javascript // 假设我们有一个新的 元素 var newItem = $(" New Item "); // 使用push方法添加到数组中 itemsArray.push(newItem[0]); console.log(itemsArray); // 输出: [ , , , ] 这里的关键在于newItem[0],这是因为push()方法期望接收的是一个DOM元素,而不是jQuery对象。 方法二:使用concat() 如果你想创建一个新的数组,并将原来的数组与新元素合并,可以使用concat()方法: javascript var newItemsArray = itemsArray.concat(newItem[0]); console.log(newItemsArray); // 输出: [ , , , ] 这种方法不会修改原来的数组,而是返回一个新的数组。 方法三:直接操作DOM 当然,如果你只是想在页面上添加新的元素,而不需要将它们加入数组,可以直接操作DOM: javascript $("myList").append(newItem); 这样,新的 元素就会被追加到 列表中。 3. 实战演练 让我们来实际操作一下,看看这些方法的效果如何。假设我们有一个简单的网页,包含一个按钮和一个无序列表: html Add New Item Item 1 Item 2 Item 3 在这个例子中,当我们点击“Add New Item”按钮时,会执行一系列的操作,包括向数组添加新的元素以及更新页面上的内容。每次点击都会在控制台输出当前的状态,让你可以看到数组的变化。 4. 总结 好了,朋友们,今天咱们聊了聊如何在jQuery中向数组添加元素。虽然jQuery自己没带数组操作的功能,但我们可以用原生JavaScript的方法来搞定。不管是用push()方法还是concat()方法,或者是直接摆弄DOM,咱们都能达成目标。 希望这篇文章对你有所帮助,如果你有任何问题或者建议,欢迎在评论区留言交流。编程路上,我们一起前行!
2025-03-10 16:14:39
52
清风徐来
Bootstrap
...件就是Navbar(导航栏)。它为用户提供了一种直观的方式来导航整个网站。在实际做开发的时候,你可能经常会碰到这么个情况:当你滚动页面时,那个Navbar竟然没老老实实固定在顶部,反而跑来跑去的,这就让用户的体验大打折扣了。这篇文章会带你一起把这个问题掰开揉碎,深入地研究探讨,而且我还会手把手地带你,用实际的代码例子一步步揭示这个问题的解决之道,就像咱们平时面对面交流、共同解谜一样。 2. 问题概述 想象一下,你正在浏览一个网页,当向下滚动查找信息时,那个方便的导航菜单突然消失不见,你不得不返回顶部才能继续切换页面。这无疑是一个糟糕的用户体验,而Bootstrap提供的Navbar本应具有“scrollspy”或“affix”功能来实现滚动时固定效果,但为何有时会失效呢? 3. 理解Navbar的滚动固定原理 Bootstrap提供了一个名为"affix"(在v4之后被移除,替换成Scrollspy和 sticky-top 类)的功能,可以让Navbar在页面滚动到特定位置时变为固定定位,始终保持在浏览器视口顶部。在Bootstrap v4及更新的版本中,如果你想达成这个效果,就得耍点小技巧了。咱们需要用到一个叫做.sticky-top的CSS类,再配上Scrollspy这个神奇的小插件,两者联手才能实现这个功能。 html 4. 诊断与排查 如果你发现Navbar未能如预期般在滚动时固定,可能是以下原因造成的: - 缺失CSS样式:确保已正确引入Bootstrap的CSS文件,并且Navbar元素应用了.sticky-top类。 - Scrollspy未启用:虽然Scrollspy主要用于监控滚动并更新导航链接的状态,但在Navbar固定方面也有辅助作用。确保已初始化Scrollspy插件,并正确关联至Navbar下的某个ID容器。 javascript // 初始化 Scrollspy $('body').scrollspy({ target: 'main-navbar' }); // 假设你的Navbar ID为 'main-navbar' - 父级元素高度或overflow设置:如果Navbar的直接父级元素设置了固定高度或者overflow:hidden,可能会影响滚动监听和固定定位的效果。检查并调整这些属性以允许内容自由滚动。 5. 进一步优化与思考 在解决Navbar滚动固定问题后,我们还可以进行一些人性化优化,比如添加过渡动画以增强用户体验: css / 添加过渡动画 / .navbar.sticky-top { transition: all 0.3s ease; } 总的来说,处理Bootstrap Navbar滚动固定的问题需要细致地检查代码、理解Bootstrap组件的工作机制,并灵活运用相关CSS和JS特性。经过以上这些步骤和实例,我相信你现在妥妥地能搞定这类问题啦,这样一来,网站的整体用户体验绝对会蹭蹭上涨!下次再碰上类似的问题,千万要记得追溯这个过程,深入挖掘问题的根源。要知道,编程最迷人的地方,往往就是在解决问题的过程中那些不为人知的魅力所在。
2023-08-15 20:36:47
525
岁月如歌
站内搜索
用于搜索本网站内部文章,支持栏目切换。
知识学习
实践的时候请根据实际情况谨慎操作。
随机学习一条linux命令:
fg %jobnumber
- 将后台作业切换至前台运行。
推荐内容
推荐本栏目内的其它文章,看看还有哪些文章让你感兴趣。
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
历史内容
快速导航到对应月份的历史文章列表。
随便看看
拉到页底了吧,随便看看还有哪些文章你可能感兴趣。
时光飞逝
"流光容易把人抛,红了樱桃,绿了芭蕉。"