学成在线day08

部署静态页面

相关操作:https://mx67xggunk5.feishu.cn/wiki/FLozwxrrxihTJbkyTHgchDt4nUc

nginx的最终配置文件:

worker_processes  1;
events {worker_connections  1024;
}
http {include       mime.types;default_type  application/octet-stream;sendfile        on;keepalive_timeout  65;upstream fileserver{server 192.168.101.65:9000 weight=10;}server {listen       80;server_name  file.51xuecheng.cn;ssi on;ssi_silent_errors on;location /video {proxy_pass   http://fileserver;}location /mediafiles {proxy_pass   http://fileserver;}}server {listen       80;server_name  www.51xuecheng.cn localhost;ssi on;ssi_silent_errors on;location / { alias   D:/Javanode/newxczx/xc-ui-pc-static-portal/;index  index.html index.htm;}location /static/img/ {  alias  D:/Javanode/newxczx/xc-ui-pc-static-portal/img/;} location /static/css/ {  alias   D:/Javanode/newxczx/xc-ui-pc-static-portal/css/;} location /static/js/ {  alias   D:/Javanode/newxczx/xc-ui-pc-static-portal/js/;} location /static/plugins/ {  alias   D:/Javanode/newxczx/xc-ui-pc-static-portal/plugins/;add_header Access-Control-Allow-Origin http://ucenter.51xuecheng.cn;  add_header Access-Control-Allow-Credentials true;  add_header Access-Control-Allow-Methods GET;} location /plugins/ {  alias   D:/Javanode/newxczx/xc-ui-pc-static-portal/plugins/;}location /course/preview/learning.html {alias D:/Javanode/newxczx/xc-ui-pc-static-portal/course/learning.html;} location /course/search.html {  root   D:/Javanode/newxczx/xc-ui-pc-static-portal;} location /course/learning.html {  root   D:/Javanode/newxczx/xc-ui-pc-static-portal;} }
}

课程预览

接口开发

课程预览接口层:

由于要向模版中插入数据因此创建提个DTO进行存储:
 

@Data
public class CoursePreviewDto {//课程基本信息和课程营销信息CourseBaseInfoDto courseBase;//课程计划List<TeachplanDto> teachplans;//TODO 课程师资信息
}
    /*** 课程预览* @param courseId* @return*/@GetMapping("/coursepreview/{courseId}")public ModelAndView preview(@PathVariable("courseId") Long courseId){CoursePreviewDto coursePreviewInfo = coursePublishService.getCoursePreviewInfo(courseId);ModelAndView modelAndView = new ModelAndView();modelAndView.addObject("model",coursePreviewInfo);modelAndView.setViewName("course_template");return modelAndView;}

service层:

    /*** @description 获取课程预览信息* @param courseId 课程id* @return com.xuecheng.content.model.dto.CoursePreviewDto* @author Mr.M* @date 2022/9/16 15:36*/public CoursePreviewDto getCoursePreviewInfo(Long courseId);
    @Overridepublic CoursePreviewDto getCoursePreviewInfo(Long courseId) {//查询数据库CoursePreviewDto coursePreviewInfo = new CoursePreviewDto();//查询课程详细信息CourseBaseInfoDto courseBaseInfo = courseBaseInfoService.getCourseBaseInfo(courseId);coursePreviewInfo.setCourseBase(courseBaseInfo);//查询课程计划List<TeachplanDto> teachplanTree = teachplanService.findTeachplanTree(courseId);coursePreviewInfo.setTeachplans(teachplanTree);return coursePreviewInfo;}

获取课程相关信息

课程预览界面的模版插槽(使用了freemark的模版插槽技术):将查询到的数据填充到代码中返回给前端,由于需要调用css等静态资源所以使用nginx服务器进行代理,将html代码进行结合,得到预览界面。

<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! --><meta name="description" content=""><meta name="author" content=""><link rel="icon" href="/static/img/asset-favicon.ico"><title>学成在线-${model.courseBase.name}</title><link rel="stylesheet" href="/static/plugins/normalize-css/normalize.css" /><link rel="stylesheet" href="/static/plugins/bootstrap/dist/css/bootstrap.css" /><link rel="stylesheet" href="/static/css/page-learing-article.css" />
</head><body data-spy="scroll" data-target="#articleNavbar" data-offset="150">
<!-- 页面头部 -->
<!--#include virtual="/include/header.html"-->
<!--页面头部结束sss-->
<div id="learningArea">
<div class="article-banner"><div class="banner-bg"></div><div class="banner-info"><div class="banner-left"><p>${model.courseBase.mtName}<span>\ ${model.courseBase.stName}</span></p><p class="tit">${model.courseBase.name}</p><p class="pic"><#if model.courseBase.charge=='201000'><span class="new-pic">免费</span><#else><span class="new-pic">特惠价格¥${model.courseBase.price!''}</span><span class="old-pic">原价¥${model.courseBase.originalPrice!''}</span></#if></p><p class="info"><a href="#" @click.prevent="startLearning()">马上学习</a><span><em>难度等级</em><#if model.courseBase.grade=='204001'>初级<#elseif model.courseBase.grade=='204002'>中级<#elseif model.courseBase.grade=='204003'>高级</#if></span><span><em>课程时长</em>2小时27分</span><span><em>评分</em>4.7分</span><span><em>授课模式</em><#if model.courseBase.teachmode=='200002'>录播<#elseif model.courseBase.teachmode=='200003'>直播</#if></span></p></div><div class="banner-rit"><p><a href="http://www.51xuecheng.cn/course/preview/learning.html?id=${model.courseBase.id}" target="_blank"><#if model.courseBase.pic??><img src="http://file.51xuecheng.cn${model.courseBase.pic}" alt="" width="270" height="156"><#else><img src="/static/img/widget-video.png" alt="" width="270" height="156"></#if></a></p><p class="vid-act"><span> <i class="i-heart"></i>收藏 23 </span> <span>分享 <i class="i-weixin"></i><i class="i-qq"></i></span></p></div></div>
</div>
<div class="article-cont"><div class="tit-list"><a href="javascript:;" id="articleClass" class="active">课程介绍</a><a href="javascript:;" id="articleItem">目录</a><a href="javascript:;" id="artcleAsk">问答</a><a href="javascript:;" id="artcleNot">笔记</a><a href="javascript:;" id="artcleCod">评价</a><!--<div class="down-fill"><span>资料下载</span><ul><li>java视频资料</li><li>java视频资料</li><li>java视频资料</li></ul></div>--></div><div class="article-box"><div class="articleClass" style="display: block"><!--<div class="rit-title">评价</div>--><div class="article-cont"><div class="article-left-box"><div class="content"><div class="content-com suit"><div class="title"><span>适用人群</span></div><div class="cont cktop"><div ><p>${model.courseBase.users!""}</p></div><!--<span class="on-off">更多 <i class="i-chevron-bot"></i></span>--></div></div><div class="content-com course"><div class="title"><span>课程制作</span></div><div class="cont"><div class="img-box"><img src="/static/img/widget-myImg.jpg" alt=""></div><div class="info-box"><p class="name">教学方:<em>XX老师</em></p><!-- <p class="lab">高级前端开发工程师 10年开发经验</p>--><p class="info">JavaEE开发与教学多年,精通JavaEE技术体系,对流行框架JQuery、DWR、Struts1/2,Hibernate,Spring,MyBatis、JBPM、Lucene等有深入研究。授课逻辑严谨,条理清晰,注重学生独立解决问题的能力。</p><!-- <p><span>难度等级</span>中级</p><p><span>课程时长</span>8-16小时/周,共4周</p><p><span>如何通过</span>通过所有的作业及考核,作业共4份,考核为一次终极考核</p><p><span>用户评分</span>平均用户评分 <em>4.9</em> <a href="#">查看全部评价</a></p><p><span>课程价格</span>特惠价格<em>¥999</em> <i> 原价1999 </i></p>--></div></div></div><div class="content-com about"><div class="title"><span>课程介绍</span></div><div class="cont cktop"><div ><p>${model.courseBase.description!""}</p></div><!--<span class="on-off">更多 <i class="i-chevron-bot"></i></span>--></div></div><div class="content-com prob"><div class="title"><span>常见问题</span></div><div class="cont"><ul><li class="item"><span class="on-off"><i class="i-chevron-bot"></i> 我什么时候能够访问课程视频与作业?</span><div class="drop-down"><p>课程安排灵活,课程费用支付提供180天全程准入和资格证书。自定进度课程建议的最后期限,但你不会受到惩罚错过期限,只要你赚你的证书在180天内。以会话为基础的课程可能要求你在截止日期前保持正轨,但如果你落后了,你可以切换到以后的会议,你完成的任何工作将与你转移。</p></div></li><li class="item"><span class="on-off"><i class="i-chevron-bot"></i> 如何需要额外的时间来完成课程会怎么样?</span><div class="drop-down"><p>课程安排灵活,课程费用支付提供180天全程准入和资格证书。自定进度课程建议的最后期限,但你不会受到惩罚错过期限,只要你赚你的证书在180天内。以会话为基础的课程可能要求你在截止日期前保持正轨,但如果你落后了,你可以切换到以后的会议,你完成的任何工作将与你转移。</p></div></li><li class="item"><span class="on-off"><i class="i-chevron-bot"></i> 我支付次课程之后会得到什么?</span><div class="drop-down"><p>课程安排灵活,课程费用支付提供180天全程准入和资格证书。自定进度课程建议的最后期限,但你不会受到惩罚错过期限,只要你赚你的证书在180天内。以会话为基础的课程可能要求你在截止日期前保持正轨,但如果你落后了,你可以切换到以后的会议,你完成的任何工作将与你转移。</p></div></li><li class="item"><span class="on-off"><i class="i-chevron-bot"></i> 退款条例是如何规定的?</span><div class="drop-down"><p>课程安排灵活,课程费用支付提供180天全程准入和资格证书。自定进度课程建议的最后期限,但你不会受到惩罚错过期限,只要你赚你的证书在180天内。以会话为基础的课程可能要求你在截止日期前保持正轨,但如果你落后了,你可以切换到以后的会议,你完成的任何工作将与你转移。</p></div></li><li class="item"><span class="on-off"><i class="i-chevron-bot"></i> 有助学金?</span><div class="drop-down"><p>课程安排灵活,课程费用支付提供180天全程准入和资格证书。自定进度课程建议的最后期限,但你不会受到惩罚错过期限,只要你赚你的证书在180天内。以会话为基础的课程可能要求你在截止日期前保持正轨,但如果你落后了,你可以切换到以后的会议,你完成的任何工作将与你转移。</p></div></li></ul></div></div></div></div><!--侧边栏--><!--#include virtual="/include/course_detail_side.html"--><!--侧边栏--></div></div><div class="articleItem" style="display: none"><div class="article-cont-catalog"><div class="article-left-box"><div class="content"><#list model.teachplans as firstNode><div class="item"><div class="title act"><i class="i-chevron-top"></i>${firstNode.pname}<span class="time">x小时</span></div><div class="drop-down" style="height: 260px;"><ul class="list-box"><#list firstNode.teachPlanTreeNodes as secondNode><li><a href="http://www.51xuecheng.cn/course/preview/learning.html?id=${model.courseBase.id}&chapter=${secondNode.teachplanMedia.teachplanId!''}" target="_blank">${secondNode.pname}</a></li></#list></ul></div></div></#list><#-- <div class="item"><div class="title act"><i class="i-chevron-top"></i>第一阶段 HTTP协议基础详解<span class="time">8小时</span></div><div class="about">使用Java消息中间件处理异步消息成为了分布式系统中的必修课,通过本门课程可以深入浅出的学习如何在Java中使用消息中间件并且一步一步打造更优雅的最佳实践方案。</div><div class="drop-down" style="height: 260px;"><ul class="list-box"><li class="active">1.1 阅读:分级政策细节 <span>97’33”</span></li><li>1.2 视频:为什么分为 A 部分、B 部分、C 部分 <span>66’15”</span></li><li>1.3 视频:软件安装介绍 <span>86’42”</span></li><li>1.4 阅读:Emacs安装 <span>59’00”</span></li><li>1.5 作业1:Emacs安装 <span>93’29”</span></li><li>阶段测试</li></ul></div></div>--></div></div><!--侧边栏--><!--#include virtual="/include/course_detail_side.html"--><!--侧边栏--></div></div><#--<div class="articleItem" style="display: none"><div class="article-cont-catalog"><div class="article-left-box"><div class="content"><div class="item"><div class="title act"><i class="i-chevron-top"></i>第一阶段 HTTP协议基础详解<span class="time">8小时</span></div><div class="about">使用Java消息中间件处理异步消息成为了分布式系统中的必修课,通过本门课程可以深入浅出的学习如何在Java中使用消息中间件并且一步一步打造更优雅的最佳实践方案。</div><div class="drop-down" style="height: 260px;"><ul class="list-box"><li class="active">1.1 阅读:分级政策细节 <span>97’33”</span></li><li>1.2 视频:为什么分为 A 部分、B 部分、C 部分 <span>66’15”</span></li><li>1.3 视频:软件安装介绍 <span>86’42”</span></li><li>1.4 阅读:Emacs安装 <span>59’00”</span></li><li>1.5 作业1:Emacs安装 <span>93’29”</span></li><li>阶段测试</li></ul></div></div><div class="item"><div class="title"><i class="i-chevron-bot"></i>第二阶段 HTTP协议基础详解<span class="time">8小时</span></div><div class="about">使用Java消息中间件处理异步消息成为了分布式系统中的必修课,通过本门课程可以深入浅出的学习如何在Java中使用消息中间件并且一步一步打造更优雅的最佳实践方案。</div><div class="drop-down"><ul class="list-box"><li class="active">1.1 阅读:分级政策细节 <span>97’33”</span></li><li>1.2 视频:为什么分为 A 部分、B 部分、C 部分 <span>66’15”</span></li><li>1.3 视频:软件安装介绍 <span>86’42”</span></li><li>1.4 阅读:Emacs安装 <span>59’00”</span></li><li>1.5 作业1:Emacs安装 <span>93’29”</span></li><li>阶段测试</li></ul></div></div><div class="item"><div class="title"><i class="i-chevron-bot"></i>第三阶段 HTTP协议基础详解<span class="time">3小时</span></div><div class="about">使用Java消息中间件处理异步消息成为了分布式系统中的必修课,通过本门课程可以深入浅出的学习如何在Java中使用消息中间件并且一步一步打造更优雅的最佳实践方案。</div><div class="drop-down"><ul class="list-box"><li class="active">1.1 阅读:分级政策细节 <span>97’33”</span></li><li>1.2 视频:为什么分为 A 部分、B 部分、C 部分 <span>66’15”</span></li><li>1.3 视频:软件安装介绍 <span>86’42”</span></li><li>1.4 阅读:Emacs安装 <span>59’00”</span></li><li>1.5 作业1:Emacs安装 <span>93’29”</span></li><li>阶段测试</li></ul></div></div><div class="item"><div class="title"><i class="i-chevron-bot"></i>第四阶段 HTTP协议基础详解<span class="time">3小时</span></div><div class="about">使用Java消息中间件处理异步消息成为了分布式系统中的必修课,通过本门课程可以深入浅出的学习如何在Java中使用消息中间件并且一步一步打造更优雅的最佳实践方案。</div><div class="drop-down"><ul class="list-box"><li class="active">1.1 阅读:分级政策细节 <span>97’33”</span></li><li>1.2 视频:为什么分为 A 部分、B 部分、C 部分 <span>66’15”</span></li><li>1.3 视频:软件安装介绍 <span>86’42”</span></li><li>1.4 阅读:Emacs安装 <span>59’00”</span></li><li>1.5 作业1:Emacs安装 <span>93’29”</span></li><li>阶段测试</li></ul></div></div><div class="item"><div class="title"><i class="i-chevron-bot"></i>第五阶段 HTTP协议基础详解<span class="time">3小时</span></div><div class="about">使用Java消息中间件处理异步消息成为了分布式系统中的必修课,通过本门课程可以深入浅出的学习如何在Java中使用消息中间件并且一步一步打造更优雅的最佳实践方案。</div><div class="drop-down"><ul class="list-box"><li class="active">1.1 阅读:分级政策细节 <span>97’33”</span></li><li>1.2 视频:为什么分为 A 部分、B 部分、C 部分 <span>66’15”</span></li><li>1.3 视频:软件安装介绍 <span>86’42”</span></li><li>1.4 阅读:Emacs安装 <span>59’00”</span></li><li>1.5 作业1:Emacs安装 <span>93’29”</span></li><li>阶段测试</li></ul></div></div><div class="item"><a href="#" class="overwrite">毕业考核</a></div></div></div><!--侧边栏&ndash;&gt;<!--#include virtual="/include/course_detail_side.html"&ndash;&gt;<!--侧边栏&ndash;&gt;</div></div>--><div class="artcleAsk" style="display: none"><div class="article-cont-ask"><div class="article-left-box"><div class="content"><div class="content-title"><p><a class="all">全部</a><a>精选</a><a>我的</a></p><p><a class="all">全部</a><span><a>1.1</a><a>1.2</a><a>1.3</a><a>1.4</a><a>1.5</a></span><a href="$" class="more">更多 <i class="i-chevron-bot"></i></a></p></div><div class="item"><div class="item-left"><p><img src="/static/img/widget-myImg.jpg" width="60px" alt=""></p><p>毛老师</p></div><div class="item-right"><p class="title">如何用微服务重构应用程序?</p><p><span>我来回答</span></p><p>2017-3-20 <span><i></i>回答2</span><span><i></i>浏览2</span></p></div></div><div class="item"><div class="item-left"><p><img src="/static/img/widget-myImg.jpg" width="60px" alt=""></p><p>毛老师</p></div><div class="item-right"><p class="title">如何用微服务重构应用程序?</p><p>在讨论如何将重构转化为微服务之前,退后一步,仔细观察微服务的内容和时间是很重要的。以下两个要点将会对任何微服务重构策略产生重大影响。 【最新 <i class="new">心跳347890</i> 的回答】</p><p>2017-3-20 <span class="action-box"><span><i class="i-answer"></i>回答 2</span><span><i class="i-browse"></i>浏览 12</span></span></p></div></div><div class="item"><div class="item-left"><p><img src="/static/img/widget-myImg.jpg" width="60px" alt=""></p><p>毛老师</p></div><div class="item-right"><p class="title">如何用微服务重构应用程序?</p><p>在讨论如何将重构转化为微服务之前,退后一步,仔细观察微服务的内容和时间是很重要的。以下两个要点将会对任何微服务重构策略产生重大影响。 【最新 <i class="new">心跳347890</i> 的回答】</p><p>2017-3-20 <span class="action-box"><span><i class="i-answer"></i>回答 2</span><span><i class="i-browse"></i>浏览 12</span></span></p></div></div><div class="item"><div class="item-left"><p><img src="/static/img/widget-myImg.jpg" width="60px" alt=""></p><p>毛老师</p></div><div class="item-right"><p class="title">如何用微服务重构应用程序?</p><p>在讨论如何将重构转化为微服务之前,退后一步,仔细观察微服务的内容和时间是很重要的。以下两个要点将会对任何微服务重构策略产生重大影响。 【最新 <i class="new">心跳347890</i> 的回答】</p><p>2017-3-20 <span class="action-box"><span><i class="i-answer"></i>回答 2</span><span><i class="i-browse"></i>浏览 12</span></span></p></div></div><div class="item"><div class="item-left"><p><img src="/static/img/widget-myImg.jpg" width="60px" alt=""></p><p>毛老师</p></div><div class="item-right"><p class="title">如何用微服务重构应用程序?</p><p>在讨论如何将重构转化为微服务之前,退后一步,仔细观察微服务的内容和时间是很重要的。以下两个要点将会对任何微服务重构策略产生重大影响。 【最新 <i class="new">心跳347890</i> 的回答】</p><p>2017-3-20 <span class="action-box"><span><i class="i-answer"></i>回答 2</span><span><i class="i-browse"></i>浏览 12</span></span></p></div></div><div class="item"><div class="item-left"><p><img src="/static/img/widget-myImg.jpg" width="60px" alt=""></p><p>毛老师</p></div><div class="item-right"><p class="title">如何用微服务重构应用程序?</p><p>在讨论如何将重构转化为微服务之前,退后一步,仔细观察微服务的内容和时间是很重要的。以下两个要点将会对任何微服务重构策略产生重大影响。 【最新 <i class="new">心跳347890</i> 的回答】</p><p>2017-3-20 <span class="action-box"><span><i class="i-answer"></i>回答 2</span><span><i class="i-browse"></i>浏览 12</span></span></p></div></div><div class="itemlast"><a href="#" class="overwrite">显示更多问题</a></div></div></div><!--侧边栏--><!--#include virtual="/include/course_detail_side.html"--><!--侧边栏--></div></div><div class="artcleNot" style="display: none;"><div class="article-cont-note"><div class="article-left-box"><div class="content"><div class="content-title"><p><a class="all">全部</a><a>精选</a><a>我的</a></p><p><a class="all">全部</a><span><a>1.1</a><a>1.2</a><a>1.3</a><a>1.4</a><a>1.5</a></span><a href="$" class="more">更多 <i class="i-chevron-bot"></i></a></p></div><div class="item"><div class="item-left"><p><img src="/static/img/widget-myImg.jpg" width="60px" alt=""></p><p>毛老师</p></div><div class="item-right"><span class="video-time"><i class="i-play"></i>2`10`</span><p><img src="/static/img/widget-demo.png" width="221" alt=""></p><p class="action-box">4小时前 <span class="active-box"><span><i class="i-coll"></i>采集</span><span><i class="i-laud"></i>赞</span></span></p></div></div><div class="item"><div class="item-left"><p><img src="/static/img/widget-myImg.jpg" width="60px" alt=""></p><p>毛老师</p></div><div class="item-right"><p>在讨论如何将重构转化为微服务之前,退后一步,<br>仔细观察微服务的内容和时间是很重要的。<br>以下两个要点将会对任何微服务重构策略产生重大影响。 </p><p class="action-box">4小时前 <span class="active-box"><span><i class="i-edt"></i>编辑</span><span><i class="i-del"></i>删除</span><span><i class="i-laud"></i>赞</span></span></p></div></div><div class="item"><div class="item-left"><p><img src="/static/img/widget-myImg.jpg" width="60px" alt=""></p><p>毛老师</p></div><div class="item-right"><p>在讨论如何将重构转化为微服务之前,退后一步,<br>仔细观察微服务的内容和时间是很重要的。<br>以下两个要点将会对任何微服务重构策略产生重大影响。 </p><p class="action-box">4小时前 <span class="active-box"><span><i class="i-edt"></i>编辑</span><span><i class="i-del"></i>删除</span><span><i class="i-laud"></i>赞</span></span></p></div></div><div class="item"><div class="item-left"><p><img src="/static/img/widget-myImg.jpg" width="60px" alt=""></p><p>毛老师</p></div><div class="item-right"><p>在讨论如何将重构转化为微服务之前,退后一步,<br>仔细观察微服务的内容和时间是很重要的。<br>以下两个要点将会对任何微服务重构策略产生重大影响。 </p><p class="action-box">4小时前 <span class="active-box"><span><i class="i-edt"></i>编辑</span><span><i class="i-del"></i>删除</span><span><i class="i-laud"></i>赞</span></span></p></div></div></div></div><!--侧边栏--><!--#include virtual="/include/course_detail_side.html"--><!--侧边栏--></div></div><div class="artcleCod" style="display: none;"><div class="article-cont"><div class="article-left-box"><div class="comment-box"><div class="evaluate"><div class="eva-top"><div class="tit">课程评分 </div><div class="star"><div class="score"><i>5</i></div></div><span class="star-score"> <i>5</i> 分</span></div><div class="eva-cont"><div class="tit">学员评语 </div><div class="text-box"><textarea class="form-control" rows="5" placeholder="扯淡、吐槽、表扬、鼓励......想说啥说啥!"></textarea><div class="text-right"><span>发表评论</span></div></div></div></div><div class="course-evaluate"><div class="top-tit">评论<span><label><input name="eval" type="radio" value="" checked /> 所有学生 </label><label><input name="eval" type="radio" value="" /> 完成者 </label></span></div><div class="top-cont"><div class="cont-top-left"><div class="star-scor"><div class="star-show"><div class="score"><i>5</i></div></div><div class="scor">4.9分</div></div><div class="all-scor">总评分:12343</div></div><div class="cont-top-right"><div class="star-grade">五星<div class="grade"><div class="grade-percent"><span></span></div><div class="percent-num"><i>95</i>%</div></div></div><div class="star-grade">四星<div class="grade"><div class="grade-percent"><span></span></div><div class="percent-num"><i>5</i>%</div></div></div><div class="star-grade">三星<div class="grade"><div class="grade-percent"><span></span></div><div class="percent-num"><i>0</i>%</div></div></div><div class="star-grade">二星<div class="grade"><div class="grade-percent"><span></span></div><div class="percent-num"><i>2</i>%</div></div></div><div class="star-grade">一星<div class="grade"><div class="grade-percent"><span></span></div><div class="percent-num"><i>1</i>%</div></div></div></div></div><div class="comment-item-box"><div class="title">评论 <span>12453条评论</span></div><div class="item"><div class="item-left"><p><img src="/static/img/widget-pic.png" width="60px" alt=""></p><p>毛老师</p></div><div class="item-cent"><p>很受用,如果再深入下就更好了。虽然都是入门级别的,但是也很使用,后续就需要自己发挥了!虽然都是入门级别的,但是也很使用,后续就需要自己发挥了!虽然都是入门级别的,但是也很使用,后续就需要自己发挥了!虽然都是入门级别的,但是也很使用,后续就需要自己发挥了!</p><p class="time">2017-2-43</p></div><div class="item-rit"><p><div class="star-show"><div class="score"><i>4</i></div></div></p><p>评分 <span>5星</span></p></div></div><div class="item"><div class="item-left"><p><img src="/static/img/widget-pic.png" width="60px" alt=""></p><p>毛老师</p></div><div class="item-cent"><p>很受用,如果再深入下就更好了。虽然都是入门级别的,但是也很使用,后续就需要自己发挥了!虽然都是入门级别的,但是也很使用,后续就需要自己发挥了!虽然都是入门级别的,但是也很使用,后续就需要自己发挥了!虽然都是入门级别的,但是也很使用,后续就需要自己发挥了!</p><p class="time">2017-2-43</p></div><div class="item-rit"><p><div class="star-show"><div class="score"><i>5</i></div></div></p><p>评分 <span>5星</span></p></div></div><div class="item"><div class="item-left"><p><img src="/static/img/widget-pic.png" width="60px" alt=""></p><p>毛老师</p></div><div class="item-cent"><p>很受用,如果再深入下就更好了。虽然都是入门级别的,但是也很使用,后续就需要自己发挥了!虽然都是入门级别的,但是也很使用,后续就需要自己发挥了!虽然都是入门级别的,但是也很使用,后续就需要自己发挥了!虽然都是入门级别的,但是也很使用,后续就需要自己发挥了!</p><p class="time">2017-2-43</p></div><div class="item-rit"><p><div class="star-show"><div class="score"><i>5</i></div></div></p><p>评分 <span>5星</span></p></div></div><div class="item"><div class="item-left"><p><img src="/static/img/widget-pic.png" width="60px" alt=""></p><p>毛老师</p></div><div class="item-cent"><p>很受用,如果再深入下就更好了。虽然都是入门级别的,但是也很使用,后续就需要自己发挥了!虽然都是入门级别的,但是也很使用,后续就需要自己发挥了!虽然都是入门级别的,但是也很使用,后续就需要自己发挥了!虽然都是入门级别的,但是也很使用,后续就需要自己发挥了!</p><p class="time">2017-2-43</p></div><div class="item-rit"><p><div class="star-show"><div class="score"><i>5</i></div></div></p><p>评分 <span>5星</span></p></div></div><div class="get-more">页面加载中...</div></div></div></div></div><!--侧边栏--><!--#include virtual="/include/course_detail_side.html"--><!--侧边栏--></div></div></div>
</div><div class="popup-course"><div class="mask"></div><!--欢迎访问课程弹窗- start --><div class="popup-course-box"><div class="title">${model.courseBase.name} <span class="close-popup-course-box">×</span></div><div class="content"><p>欢迎学习本课程,本课程免费您可以立即学习,也可加入我的课程表享受更优质的服务。</p><p><a href="#" @click.prevent="addCourseTable()">加入我的课程表</a>  <a href="#" @click.prevent="startLearngin()">立即学习</a></p></div></div></div><div class="popup-box"><div class="mask"></div><!--支付弹窗- start --><div class="popup-pay-box"><div class="title">${model.courseBase.name} <span class="close-popup-pay-box">×</span></div><div class="content"><img :src="qrcode" width="200" height="200" alt="请点击支付宝支付按钮,并完成扫码支付。"/><div class="info"><p class="info-tit">${model.courseBase.name}<span>课程有效期:${model.courseBase.validDays}天</span></p><p class="info-pic">课程价格 : <span>¥${model.courseBase.originalPrice!''}元</span></p><p class="info-new-pic">优惠价格 : <span>¥${model.courseBase.price!''}元</span></p></div></div><div class="fact-pic">实际支付: <span>¥${model.courseBase.price!''}元</span></div><div class="go-pay"><a href="#" @click.prevent="wxPay()">微信支付</a><a href="#" @click.prevent="aliPay()">支付宝支付</a><a href="#" @click.prevent="querypayresult()">支付完成</a><a href="#" @click.prevent="startLearngin()">试学</a></div></div><!--支付弹窗- end --><div class="popup-comment-box"></div></div><!-- 页面底部 --><!--底部版权--><!--#include virtual="/include/footer.html"--><!--底部版权-->
</div>
<script>var courseId = "${model.courseBase.id}";var courseCharge = "${model.courseBase.charge}"</script>
<!--#include virtual="/include/course_detail_dynamic.html"-->
</body>

nginx的配置文件:

worker_processes  1;
events {worker_connections  1024;
}
http {include       mime.types;default_type  application/octet-stream;sendfile        on;keepalive_timeout  65;upstream fileserver{server 192.168.101.65:9000 weight=10;}#后台网关upstream gatewayserver{server 127.0.0.1:63010 weight=10;} server {listen       80;server_name  file.51xuecheng.cn;ssi on;ssi_silent_errors on;location /video {proxy_pass   http://fileserver;}location /mediafiles {proxy_pass   http://fileserver;}}server {listen       80;server_name  www.51xuecheng.cn localhost;ssi on;ssi_silent_errors on;location / { alias   D:/Javanode/newxczx/xc-ui-pc-static-portal/;index  index.html index.htm;}location /static/img/ {  alias  D:/Javanode/newxczx/xc-ui-pc-static-portal/img/;} location /static/css/ {  alias   D:/Javanode/newxczx/xc-ui-pc-static-portal/css/;} location /static/js/ {  alias   D:/Javanode/newxczx/xc-ui-pc-static-portal/js/;} location /static/plugins/ {  alias   D:/Javanode/newxczx/xc-ui-pc-static-portal/plugins/;add_header Access-Control-Allow-Origin http://ucenter.51xuecheng.cn;  add_header Access-Control-Allow-Credentials true;  add_header Access-Control-Allow-Methods GET;} location /plugins/ {  alias   D:/Javanode/newxczx/xc-ui-pc-static-portal/plugins/;}location /course/preview/learning.html {alias D:/Javanode/newxczx/xc-ui-pc-static-portal/course/learning.html;} location /course/search.html {  root   D:/Javanode/newxczx/xc-ui-pc-static-portal;} location /course/learning.html {  root   D:/Javanode/newxczx/xc-ui-pc-static-portal;} location /open/content/ {proxy_pass http://gatewayserver/content/open/;} location /open/media/ {proxy_pass http://gatewayserver/media/open/;} #apilocation /api/ {proxy_pass http://gatewayserver/;} }
}

同时该配置文件中还配置了网关,所有的请求都要通过网关服务进行转发。

视屏播放和获取课程计划信息

由于课程预览界面要播放视屏和获取课程分章节信息

课程视屏接口:

package com.xuecheng.media.api;import com.xuecheng.base.exception.XueChengPlusException;
import com.xuecheng.base.model.RestResponse;
import com.xuecheng.media.model.po.MediaFiles;
import com.xuecheng.media.service.MediaFileService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@Api(value = "媒资文件管理接口",tags = "媒资文件管理接口")@RestController@RequestMapping("/open")
public class MediaOpenController {@AutowiredMediaFileService mediaFileService;@ApiOperation("预览文件")@GetMapping("/preview/{mediaId}")public RestResponse<String> getPlayUrlByMediaId(@PathVariable String mediaId){MediaFiles mediaFiles = mediaFileService.getFileById(mediaId);if(mediaFiles == null || StringUtils.isEmpty(mediaFiles.getUrl())){XueChengPlusException.cast("视频还没有转码处理");}return RestResponse.success(mediaFiles.getUrl());}}
 /*** 根据文件id查询文件信息* @param mediaId* @return*/MediaFiles getFileById(String mediaId);
    /*** 根据文件id得到文件信息* @param mediaId* @return*/@Overridepublic MediaFiles getFileById(String mediaId) {MediaFiles mediaFiles = mediaFilesMapper.selectById(mediaId);return mediaFiles;}

获取课程计划信息:

package com.xuecheng.content.api;import com.xuecheng.content.model.dto.CoursePreviewDto;
import com.xuecheng.content.service.CourseBaseInfoService;
import com.xuecheng.content.service.CoursePublishService;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@Api(value = "课程公开查询接口",tags = "课程公开查询接口")@RestController@RequestMapping("/open")
public class CourseOpenController {@Autowiredprivate CourseBaseInfoService courseBaseInfoService;@Autowiredprivate CoursePublishService coursePublishService;@GetMapping("/course/whole/{courseId}")
public CoursePreviewDto getPreviewInfo(@PathVariable("courseId") Long courseId) {//获取课程预览信息CoursePreviewDto coursePreviewInfo = coursePublishService.getCoursePreviewInfo(courseId);return coursePreviewInfo;
}}
    /*** @description 获取课程预览信息* @param courseId 课程id* @return com.xuecheng.content.model.dto.CoursePreviewDto* @author Mr.M* @date 2022/9/16 15:36*/public CoursePreviewDto getCoursePreviewInfo(Long courseId);
package com.xuecheng.content.service.impl;import com.xuecheng.content.model.dto.CourseBaseInfoDto;
import com.xuecheng.content.model.dto.CoursePreviewDto;
import com.xuecheng.content.model.dto.TeachplanDto;
import com.xuecheng.content.service.CourseBaseInfoService;
import com.xuecheng.content.service.CoursePublishService;
import com.xuecheng.content.service.TeachplanService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class CoursePublishServiceImpl implements CoursePublishService {@Autowiredprivate CourseBaseInfoService courseBaseInfoService;@Autowiredprivate TeachplanService teachplanService;@Overridepublic CoursePreviewDto getCoursePreviewInfo(Long courseId) {//查询数据库CoursePreviewDto coursePreviewInfo = new CoursePreviewDto();//查询课程详细信息CourseBaseInfoDto courseBaseInfo = courseBaseInfoService.getCourseBaseInfo(courseId);coursePreviewInfo.setCourseBase(courseBaseInfo);//查询课程计划List<TeachplanDto> teachplanTree = teachplanService.findTeachplanTree(courseId);coursePreviewInfo.setTeachplans(teachplanTree);return coursePreviewInfo;}
}

由于添加了这两个接口需要修改nginx的配置文件

配置这两个接口的跳转信息。

        location /open/content/ {proxy_pass http://gatewayserver/content/open/;} location /open/media/ {proxy_pass http://gatewayserver/media/open/;} 

上面的全部配置文件已经包括这个依赖。

提交课程审核

CoursePublishController:
      /*** 课程审核* @param courseId* @return*/@ResponseBody@PostMapping("/courseaudit/commit/{courseId}")public void commitAudit(@PathVariable("courseId") Long courseId){//TODO 获取机构idLong companyId = 1232141425L;coursePublishService.commitAudit(courseId,companyId);}

    //课程预发布表@Autowiredprivate CoursePublishPreMapper coursePublishPreMapper;//课程基本信息复杂查询@Autowiredprivate CourseBaseInfoService courseBaseInfoService;//课程计划@Autowiredprivate TeachplanService teachplanService;//课程营销信息@Autowiredprivate CourseMarketMapper courseMarketMapper;//课程基本信息@Autowiredprivate CourseBaseMapper courseBaseMapper;   /*** 提交审核* @param courseId 课程id* @param companyId 机构id*/@Override@Transactionalpublic void commitAudit(Long courseId, Long companyId) {//根据课程id查询课程信息CourseBaseInfoDto courseBaseInfo = courseBaseInfoService.getCourseBaseInfo(courseId);//根据课程信息进行校验if(courseBaseInfo == null){XueChengPlusException.cast("课程不存在");}if(!courseBaseInfo.getCompanyId().equals(companyId)){XueChengPlusException.cast("不允许提交其它机构的课程");}if(courseBaseInfo.getAuditStatus().equals("202003")){XueChengPlusException.cast("课程已提交审核,请等待审核结果");}//课程图片是否填写if(StringUtils.isEmpty(courseBaseInfo.getPic())){XueChengPlusException.cast("提交失败,请上传课程图片");}//查询课程的营销信息CourseMarket courseMarket = courseMarketMapper.selectById(courseId);if(courseMarket == null){XueChengPlusException.cast("营销信息不存在");}//将课程营销信息转为JSONString courseMarketJson = JSON.toJSONString(courseMarket);//查询课程计划信息List<TeachplanDto> teachplanTree = teachplanService.findTeachplanTree(courseId);if(teachplanTree == null || teachplanTree.size() == 0){XueChengPlusException.cast("课程计划为空");}//将课程计划信息转为JSONString teachplanTreeJson = JSON.toJSONString(teachplanTree);//封装数据CoursePublishPre coursePublishPre = new CoursePublishPre();BeanUtils.copyProperties(courseBaseInfo,coursePublishPre);//设置预发布记录状态,已提交coursePublishPre.setStatus("202003");//将课程营销信息json数据放入课程预发布表coursePublishPre.setMarket(courseMarketJson);//将课程计划信息json数据放入课程预发布表coursePublishPre.setTeachplan(teachplanTreeJson);//教学机构idcoursePublishPre.setCompanyId(companyId);//提交时间coursePublishPre.setCreateDate(LocalDateTime.now());//判断是否添加过CoursePublishPre coursePublishPreUpdate = coursePublishPreMapper.selectById(courseId);if(coursePublishPreUpdate == null){//添加课程预发布记录coursePublishPreMapper.insert(coursePublishPre);}else{coursePublishPreMapper.updateById(coursePublishPre);}//修改课程基本信息表中课程状态为202003-提交审核CourseBase courseBase = courseBaseMapper.selectById(courseId);courseBase.setAuditStatus("202003");int update = courseBaseMapper.updateById(courseBase);if(update <= 0){XueChengPlusException.cast("修改课程状态失败");}}

课程发布

教学机构人员在课程审核通过后即可发布课程,课程发布后会公开展示在网站上供学生查看、选课和学习。

在网站上展示课程信息需要解决课程信息显示的性能问题,如果速度慢(排除网速)会影响用户的体验性。

如何去快速搜索课程?

打开课程详情页面仍然去查询数据库可行吗?

为了提高网站的速度需要将课程信息进行缓存,并且要将课程信息加入索引库方便搜索,下图显示了课程发布后课程信息的流转情况

1、向内容管理数据库的课程发布表存储课程发布信息,更新课程基本信息表中发布状态为已发布。

2、向Redis存储课程缓存信息。

3、向Elasticsearch存储课程索引信息。

4、请求分布文件系统存储课程静态化页面(即html页面),实现快速浏览课程详情页面。

课程发布表的数据来源于课程预发布表,它们的结构基本一样,只是课程发布表中的状态是课程发布状态,如下图:

redis中的课程缓存信息是将课程发布表中的数据转为json进行存储。

elasticsearch中的课程索引信息是根据搜索需要将课程名称、课程介绍等信息进行索引存储。

MinIO中存储了课程的静态化页面文件(html网页),查看课程详情是通过文件系统去浏览课程详情页面。

课程发布接口

    /*** 课程发布* @param courseId*/@ApiOperation("课程发布")@ResponseBody@PostMapping ("/coursepublish/{courseId}")public void coursepublish(@PathVariable("courseId") Long courseId){Long companyId = 1232141425L;coursePublishService.publish(companyId,courseId);}
    /*** 课程发布* @param companyId* @param courseId*/@Overridepublic void publish(Long companyId, Long courseId) {//约束校验//查询课程预发布表CoursePublishPre coursePublishPre = coursePublishPreMapper.selectById(courseId);if(coursePublishPre == null){XueChengPlusException.cast("请先提交课程审核,审核通过才可以发布");}//本机构只允许提交本机构的课程if(!coursePublishPre.getCompanyId().equals(companyId)){XueChengPlusException.cast("不允许提交其它机构的课程。");}//课程审核状态String auditStatus = coursePublishPre.getStatus();//审核通过方可发布if(!"202004".equals(auditStatus)){XueChengPlusException.cast("操作失败,课程审核通过方可发布。");}//保存课程发布信息saveCoursePublish(courseId);//保存消息表saveCoursePublishMessage(courseId);//删除课程预发布表对应记录coursePublishPreMapper.deleteById(courseId);}/*** @description 保存课程发布信息* @param courseId  课程id* @return void* @author Mr.M* @date 2022/9/20 16:32*/private void saveCoursePublish(Long courseId){//整合课程发布信息//查询课程预发布表CoursePublishPre coursePublishPre = coursePublishPreMapper.selectById(courseId);if(coursePublishPre == null){XueChengPlusException.cast("课程预发布数据为空");}CoursePublish coursePublish = new CoursePublish();//拷贝到课程发布对象BeanUtils.copyProperties(coursePublishPre,coursePublish);coursePublish.setStatus("203002");CoursePublish coursePublishUpdate = coursePublishMapper.selectById(courseId);if(coursePublishUpdate == null){coursePublishMapper.insert(coursePublish);}else{coursePublishMapper.updateById(coursePublish);}//更新课程基本表的发布状态CourseBase courseBase = courseBaseMapper.selectById(courseId);courseBase.setStatus("203002");courseBaseMapper.updateById(courseBase);}/*** @description 保存消息表记录,稍后实现* @param courseId  课程id* @return void* @author Mr.M* @date 2022/9/20 16:32*/private void saveCoursePublishMessage(Long courseId){}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle数据恢复—Oracle数据库sysaux文件损坏的数据恢复案例

Oracle数据库故障&分析&#xff1a; 一台Oracle数据库打开报错&#xff0c;报错信息&#xff1a; “system01.dbf需要更多的恢复来保持一致性&#xff0c;数据库无法打开”。管理员联系我们数据恢复中心寻求帮助&#xff0c;并提供了Oracle_Home目录的所有文件。用户方要求…

ArraList和LinkedList区别

文章目录 一、结构不同二、访问速度三、插入和删除操作的不同1、决定效率有两个因素&#xff1a;数据量和位置。2、普遍说法是“LinkedList添加删除快”&#xff0c;这里是有前提条件的 四、内存占用情况五、使用场景六、总结 一、结构不同 LinkedList&#xff1a;它基于双向链…

B站狂神说Mybatis+Spring+SpringMVC整合理解(ssm框架整合)

文章目录 0.写在前面(对mybatis,spring的理解)&#xff08;不看可跳过&#xff09;0.1 为什么需要mybatis0.2 为什么需要spring0.3为什么需要springmvc 1.新建ssmbuild数据库2.新建Maven项目3.初始化步骤3.1 配置下载maven依赖&#xff0c;构建资源导出3.2 连接数据库3.3建包&a…

Java抛出自定义运行运行

1.重新生成异常的.java文件 Empty&#xff1a;空 Exception&#xff1a;异常 加起来就是 空指针异常的文件 2.打上extends 运行的异常&#xff08;异常的类型&#xff09; 3.点击ctrlo&#xff0c;选着这两个快捷重写 4.在需要抛出异常的地方写上&#xff1a;th…

项目二技巧一

目录 nginx实现根据域名来访问不同的ip端口 配置Maven私服 快照版和发布版的区别 快照版本&#xff08;Snapshot&#xff09; 发布版本&#xff08;Release&#xff09; 导入发布版的父工程 理清楚授权规则 一.首先浏览器发送/manager/**路径请求 第二步&#xff1a;构造…

简单获取json预览

data: JSON 数据。 collapsedNodeLength: 对象或数组的长度超过此阈值时会折叠 deep: json路径深度超过此值时会折叠 showLineNumber: 显示左侧行号 showIcon: 显示图标。 virtual: 使用虚拟滚动 height: 使用虚拟滚动时列表的高度 itemHeight: 使用虚拟滚动时节点的高…

使用zabbix监控k8s

一、 参考文献 小阿轩yx-案例&#xff1a;Zabbix监控kubernetes云原生环境 手把手教你实现zabbix对Kubernetes的监控 二、部署经验 关于zabbix监控k8s&#xff0c;总体来说是分为两块内容&#xff0c;一是在k8s集群部署zabbix-agent和zabbix- proxy。二是在zabbix进行配置。…

第三方Express 路由和路由中间件

文章目录 1、Express 应用使用回调函数的参数&#xff1a; request 和 response 对象来处理请求和响应的数据。2、Express路由1.路由方法2.路由路径3.路由处理程序 3. 模块化路由4. Express中间件1.中间件简介2.中间件分类3.自定义中间件 1、Express 应用使用回调函数的参数&am…

港科夜闻 |香港科大推出 InvestLM生成式人工智能平台,支持金融中小企应用AI技术潜力...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大推出 InvestLM生成式人工智能平台&#xff0c;支持金融中小企应用AI技术潜力。香港科大商学院继去年研究团队成功开发本港首个专为金融界而设、应用于生成式人工智能(生成式AI)的开源大语言模型InvestLM后&#…

[OpenHarmony5.0][Docker][环境]OpenHarmony5.0 Docker pull线上镜像方式构建编译环境

T. 已测试目录 主机类型主机版本Docker镜像版本结果WSL2Ubuntu22.04Ubuntu20.04PASSWSL2Ubuntu22.04Ubuntu18.04PASS R. 软硬件要求&#xff1a; 硬件&#xff1a; 设备容量备注硬盘>500G多版本系统测试&#xff0c;必须固态&#xff0c;否则编译卡死硬盘>300G单系统…

Git 快速入门:全面了解与安装步骤

Git 快速入门&#xff1a;全面了解与安装步骤 一、关于Git 1.1 简介 Git 是一个开源的分布式版本控制系统&#xff0c;由 Linus Torvalds 于 2005 年创建&#xff0c;最初是为了更好地管理 Linux 内核开发而设计。 Git用于跟踪计算机文件的变化&#xff0c;特别是源代码文件…

基于Java Springboot奶茶点餐微信小程序

一、作品包含 源码数据库万字文档全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA,微信开发者工具 数据…

vulnhub靶场【哈利波特】三部曲之Fawkes

前言 这次的靶机与前面不同&#xff0c;这里涉及到缓冲区溢出等 这个靶机也让我知道薄弱点了&#xff0c;缓冲溢出这方面之前接触少&#xff0c;所以刚拿到这个靶机打开后&#xff0c;人蒙了&#xff0c;在网上查阅好多资料&#xff0c;也只是浅学一下&#xff0c;这里主要也是…

神经网络中常见的激活函数Sigmoid、Tanh和ReLU

激活函数在神经网络中起着至关重要的作用&#xff0c;它们决定了神经元的输出是否应该被激活以及如何非线性地转换输入信号。不同的激活函数适用于不同的场景&#xff0c;选择合适的激活函数可以显著影响模型的性能和训练效率。以下是三种常见的激活函数&#xff1a;Sigmoid、T…

基于Java Springboot蛋糕订购小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 微信…

<项目代码>YOLOv8 红绿灯识别<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…

ProtonBase 教育行业解决方案

01/方案概述 当前&#xff0c;大数据、云计算等技术正加速教育行业的数字化转型&#xff0c;教学模式从线下转向线上&#xff0c;传统教育企业向具有互联网性质的新型教育企业转变。在此背景下&#xff0c;教育企业亟需探索多源数据的融合扩展&#xff0c;以应对复杂的业务场景…

Mybatis:CRUD数据操作之删除一行数据

Mybatis基础环境准备请看&#xff1a;Mybatis基础环境准备 本篇讲解Mybati数据CRUD数据操作之单条删除数据 当用户点击了该按钮&#xff0c;就会将改行数据删除掉。那我们就需要思考&#xff0c;这种删除是根据什么进行删除呢&#xff1f;是通过主键id删除&#xff0c;因为id是…

力扣1382:将二叉搜索树便平衡

给你一棵二叉搜索树&#xff0c;请你返回一棵 平衡后 的二叉搜索树&#xff0c;新生成的树应该与原来的树有着相同的节点值。如果有多种构造方法&#xff0c;请你返回任意一种。 如果一棵二叉搜索树中&#xff0c;每个节点的两棵子树高度差不超过 1 &#xff0c;我们就称这棵二…

架构01-演进中的架构

零、文章目录 架构01-演进中的架构 1、原始分布式时代&#xff1a;Unix设计哲学下的服务探索 &#xff08;1&#xff09;背景 时间&#xff1a;20世纪70年代末到80年代初计算机硬件&#xff1a;16位寻址能力、不足5MHz时钟频率的处理器、128KB左右的内存转型&#xff1a;从…