天马学航——智慧教务系统(移动端)开发日志三

天马学航——智慧教务系统(移动端)开发日志三

日志摘要:更新了学生选课模块、我的课程模块以及退课的功能,优化了后端数据库的缓存

1、学生选课模块

学生选课模块主要实现,学生根据需求进行选课操作,通过后端查询到所有教师的课程,展示在前端,然后根据前端进行选择,选择后发给后端,后端再进行判断,将选课信息返回前端

界面效果
image-20240620111914879
前端源码
struct SelectCourse {@State courses:SCourse[] = []aboutToAppear(){this.getCourse()}build() {Column({ space: 5 }) {Text(" ")Row({ space: 10 }) {Text(" ")Image($r('app.media.back')).width(30).height(30).onClick(function () {//返回上一页router.back() //直接返回})Text("学生选课").fontSize(30).fontWeight(FontWeight.Bolder)}.width('100%')Text("----------------------------------------------")Text(" ")List({space:50}){ForEach(this.courses,course=>{ListItem(){Row({space:30}){Text(" ")Column({space:20}){Text(course.cname).fontColor(Color.Green).fontSize(15).fontWeight(FontWeight.Bolder).fontFamily("楷体")Text("课程号:"+course.cid).fontSize(10).fontColor(Color.Red)Text("任课教师:"+course.tname).fontSize(10).fontColor(Color.Green)}.justifyContent(FlexAlign.Start).alignItems(HorizontalAlign.Start)Blank()Button("选择").onClick(()=>{console.log("学生点击了:"+course.cname)StudentAddCourse.STA(course.cid,course.cname,course.tname).then(resp=>{console.log("前端收到消息!"+resp)promptAction.showToast({message: resp,duration: 2000,bottom: 50});})})}.width('95%').height(150)//.padding(20).backgroundColor(Color.White).borderRadius(15).shadow({ radius: 6, color: '#1F000000', offsetX: 2, offsetY: 4 })}})}.width('100%')}.width('100%')}getCourse(){GetCourse.GC().then(resp=>{console.log("请求成功"+resp)if(resp.length === 0){promptAction.showToast({message: '暂无可选课程',duration: 2000,bottom: 50});}this.courses = resp;})}
}
请求源码
请求所有课程部分
class GetCourse {baseURL: string = IP.ipGC(): Promise<SCourse[]> {return new Promise((resolve, reject) => {let Http = http.createHttp()Http.request(`${this.baseURL}/GCourse`,{method: http.RequestMethod.GET,connectTimeout: 10000,readTimeout: 10000}).then(resp=>{if(resp.responseCode === 200){console.log("请求成功"+resp.result)resolve(JSON.parse(resp.result.toString()))}else {console.log("请求发现异常"+resp.responseCode)}}).catch(error=>{console.log("请求失败")})})}
}const gc = new GetCourse()
export default gc as GetCourse
向后端发送选课结果部分
class StudentAddCourse{baseURL: string = IP.ipSTA(cid:string,cname:string,cteacher:string):Promise<string>{const data = {cid:cid,cname:cname,cteacher:cteacher}return new Promise((resolve, reject) => {let httpRequest = http.createHttp()httpRequest.request(`${this.baseURL}/StuSelectcourse`,{method:http.RequestMethod.GET,extraData:data,connectTimeout: 10000,readTimeout:10000},).then(resp=>{if(resp.responseCode === 200){console.log("请求成功:"+resp.result)resolve(resp.result.toString())}else {console.log("请求失败:"+resp.responseCode)}}).catch(error=>{console.log("检查链接!")})})}
}const aa = new StudentAddCourse()
export default aa as StudentAddCourse
后端源码
请求所有课程部分
public class getCourse extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("application/json");resp.setCharacterEncoding("UTF-8");//MybatisSqlSession sql = MybatisUntills.getSqlSession();CourseMapper mapper = sql.getMapper(CourseMapper.class);List<SelectCourse> allCourse = mapper.getAllCourse();//执行并返回数据for (SelectCourse selectCourse : allCourse) {System.out.println(selectCourse.getCid()+selectCourse.getCname()+selectCourse.getTname());}sql.close();//打包Gson gson = new Gson();String JsonData = gson.toJson(allCourse);//发送resp.getWriter().write(JsonData);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}
接收学生选课信息部分
public class StuSelectCourse extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("application/json");resp.setCharacterEncoding("UTF-8");ServletContext c = getServletContext();HttpSession session = req.getSession();String username = (String) session.getAttribute("username");if(username == null){username = (String) c.getAttribute("username");}String cid = req.getParameter("cid");String cname = req.getParameter("cname");String ct = req.getParameter("cteacher");System.out.println("课程号"+cid);//MybatisSqlSession sql = MybatisUntills.getSqlSession();CourseMapper mapper = sql.getMapper(CourseMapper.class);Map<String,Object> map1 = new HashMap<String, Object>();map1.put("cid",cid);map1.put("sid",username);String strings = mapper.showStudentCourse(map1);if(strings!=null){resp.getWriter().write("后端返回信息:该课程已存在!");sql.close();}else {Map<String,Object> map = new HashMap<String, Object>();map.put("cid",cid);map.put("sid",username);int i = mapper.addStudentCourse(map);sql.commit();if(i==1){resp.getWriter().write("后端返回信息:选课成功!");System.out.println("成!");}else {resp.getWriter().write("后端返回信息:选课失败!");}sql.close();}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}

2、我的课程(退课模块)

主要显示该用户选择的所有课程,并提供退课的选项,后端查询,前端显示,前端选择,后端判断,将信息返回前端

界面效果
image-20240620111914879
前端源码
struct MyCourse{@State courses:StudentMyCourse[] = []aboutToAppear(){this.MyCourses()}build() {Column({ space: 5 }) {Text(" ")Row({ space: 10 }) {Text(" ")Image($r('app.media.back')).width(30).height(30).onClick(function () {//返回上一页router.back() //直接返回})Text("我的课程").fontSize(30).fontWeight(FontWeight.Bolder)}.width('100%')Text("----------------------------------------------")Text(" ")List({space:50}){ForEach(this.courses,course=>{ListItem(){Row({space:30}){Text(" ")Column({space:20}){Text(course.cname).fontColor(Color.Green).fontSize(15).fontWeight(FontWeight.Bolder).fontFamily("楷体")Text("课程号:"+course.cid).fontSize(10).fontColor(Color.Red)Text("任课教师:"+course.tname).fontSize(10).fontColor(Color.Green)Text("上课时间:"+course.ctime).fontSize(10).fontColor(Color.Green)}.justifyContent(FlexAlign.Start).alignItems(HorizontalAlign.Start)Blank()Button("退课").backgroundColor(Color.Red).onClick(()=>{console.log("学生点击了:"+course.cname)DeletCourse.STA(course.cname,course.cid,course.tname,course.ctime).then(resp=>{console.log("返回成功"+resp)promptAction.showToast({message: resp,duration: 2000,bottom: 50});})})}.width('95%').height(150)//.padding(20).backgroundColor(Color.White).borderRadius(15).shadow({ radius: 6, color: '#1F000000', offsetX: 2, offsetY: 4 })}})}.width('100%')}}MyCourses(){GetStudentCourse.GC().then(resp=>{console.log("返回信息成功"+resp.toString())if(resp.length === 0){promptAction.showToast({message: '您还没有选课哦~',duration: 2000,bottom: 50});}this.courses = resp})}
}
请求源码
请求所选课程
class GetStudentCourse {baseURL: string = IP.ipGC(): Promise<StudentMyCourse[]> {return new Promise((resolve, reject) => {let Http = http.createHttp()Http.request(`${this.baseURL}/GetMyCourse`,{method: http.RequestMethod.GET,connectTimeout: 10000,readTimeout: 10000}).then(resp => {if (resp.responseCode === 200) {console.log("请求成功" + resp.result)resolve(JSON.parse(resp.result.toString()))}else {console.log("请求成功,但是出现问题" + resp.responseCode)}}).catch(error => {console.log("请求失败" + error)})})}
}const sc = new GetStudentCourse()
export default sc as GetStudentCourse
向后端发送退课信息
class DeletCourse {baseURL: string = IP.ipSTA(cname: string, cid: string, tname: string,ctime: string): Promise<string> {const data = {cname: cname,cid: cid,tname: tname,ctime:ctime}return new Promise((resolve, reject) => {let httpRequest = http.createHttp()httpRequest.request(`${this.baseURL}/DeletMyCourse`,{method: http.RequestMethod.GET,extraData: data,connectTimeout: 10000,readTimeout: 10000},).then(resp=>{if(resp.responseCode===200){console.log("请求成功!"+resp.result)resolve(resp.result.toString())}else {console.log("请求发生错误"+resp.responseCode)}}).catch(err=>{console.log("请求失败"+err)})})}
}const sc = new DeletCourse()
export default sc as DeletCourse

后端代码与选课部分相同,这里不再赘述

3、BUG修复

修复了Mybatis二级缓存溢出导致查询变慢的问题

天马学航——智慧教务系统(移动端)开发日志二

日志摘要:更新了学生选课模块、我的课程模块以及退课的功能,优化了后端数据库的缓存

1、学生选课模块

学生选课模块主要实现,学生根据需求进行选课操作,通过后端查询到所有教师的课程,展示在前端,然后根据前端进行选择,选择后发给后端,后端再进行判断,将选课信息返回前端

界面效果
image-20240620111914879
前端源码
struct SelectCourse {@State courses:SCourse[] = []aboutToAppear(){this.getCourse()}build() {Column({ space: 5 }) {Text(" ")Row({ space: 10 }) {Text(" ")Image($r('app.media.back')).width(30).height(30).onClick(function () {//返回上一页router.back() //直接返回})Text("学生选课").fontSize(30).fontWeight(FontWeight.Bolder)}.width('100%')Text("----------------------------------------------")Text(" ")List({space:50}){ForEach(this.courses,course=>{ListItem(){Row({space:30}){Text(" ")Column({space:20}){Text(course.cname).fontColor(Color.Green).fontSize(15).fontWeight(FontWeight.Bolder).fontFamily("楷体")Text("课程号:"+course.cid).fontSize(10).fontColor(Color.Red)Text("任课教师:"+course.tname).fontSize(10).fontColor(Color.Green)}.justifyContent(FlexAlign.Start).alignItems(HorizontalAlign.Start)Blank()Button("选择").onClick(()=>{console.log("学生点击了:"+course.cname)StudentAddCourse.STA(course.cid,course.cname,course.tname).then(resp=>{console.log("前端收到消息!"+resp)promptAction.showToast({message: resp,duration: 2000,bottom: 50});})})}.width('95%').height(150)//.padding(20).backgroundColor(Color.White).borderRadius(15).shadow({ radius: 6, color: '#1F000000', offsetX: 2, offsetY: 4 })}})}.width('100%')}.width('100%')}getCourse(){GetCourse.GC().then(resp=>{console.log("请求成功"+resp)if(resp.length === 0){promptAction.showToast({message: '暂无可选课程',duration: 2000,bottom: 50});}this.courses = resp;})}
}
请求源码
请求所有课程部分
class GetCourse {baseURL: string = IP.ipGC(): Promise<SCourse[]> {return new Promise((resolve, reject) => {let Http = http.createHttp()Http.request(`${this.baseURL}/GCourse`,{method: http.RequestMethod.GET,connectTimeout: 10000,readTimeout: 10000}).then(resp=>{if(resp.responseCode === 200){console.log("请求成功"+resp.result)resolve(JSON.parse(resp.result.toString()))}else {console.log("请求发现异常"+resp.responseCode)}}).catch(error=>{console.log("请求失败")})})}
}const gc = new GetCourse()
export default gc as GetCourse
向后端发送选课结果部分
class StudentAddCourse{baseURL: string = IP.ipSTA(cid:string,cname:string,cteacher:string):Promise<string>{const data = {cid:cid,cname:cname,cteacher:cteacher}return new Promise((resolve, reject) => {let httpRequest = http.createHttp()httpRequest.request(`${this.baseURL}/StuSelectcourse`,{method:http.RequestMethod.GET,extraData:data,connectTimeout: 10000,readTimeout:10000},).then(resp=>{if(resp.responseCode === 200){console.log("请求成功:"+resp.result)resolve(resp.result.toString())}else {console.log("请求失败:"+resp.responseCode)}}).catch(error=>{console.log("检查链接!")})})}
}const aa = new StudentAddCourse()
export default aa as StudentAddCourse
后端源码
请求所有课程部分
public class getCourse extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("application/json");resp.setCharacterEncoding("UTF-8");//MybatisSqlSession sql = MybatisUntills.getSqlSession();CourseMapper mapper = sql.getMapper(CourseMapper.class);List<SelectCourse> allCourse = mapper.getAllCourse();//执行并返回数据for (SelectCourse selectCourse : allCourse) {System.out.println(selectCourse.getCid()+selectCourse.getCname()+selectCourse.getTname());}sql.close();//打包Gson gson = new Gson();String JsonData = gson.toJson(allCourse);//发送resp.getWriter().write(JsonData);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}
接收学生选课信息部分
public class StuSelectCourse extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("application/json");resp.setCharacterEncoding("UTF-8");ServletContext c = getServletContext();HttpSession session = req.getSession();String username = (String) session.getAttribute("username");if(username == null){username = (String) c.getAttribute("username");}String cid = req.getParameter("cid");String cname = req.getParameter("cname");String ct = req.getParameter("cteacher");System.out.println("课程号"+cid);//MybatisSqlSession sql = MybatisUntills.getSqlSession();CourseMapper mapper = sql.getMapper(CourseMapper.class);Map<String,Object> map1 = new HashMap<String, Object>();map1.put("cid",cid);map1.put("sid",username);String strings = mapper.showStudentCourse(map1);if(strings!=null){resp.getWriter().write("后端返回信息:该课程已存在!");sql.close();}else {Map<String,Object> map = new HashMap<String, Object>();map.put("cid",cid);map.put("sid",username);int i = mapper.addStudentCourse(map);sql.commit();if(i==1){resp.getWriter().write("后端返回信息:选课成功!");System.out.println("成!");}else {resp.getWriter().write("后端返回信息:选课失败!");}sql.close();}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}

2、我的课程(退课模块)

主要显示该用户选择的所有课程,并提供退课的选项,后端查询,前端显示,前端选择,后端判断,将信息返回前端

界面效果
image-20240620111914879
前端源码
struct MyCourse{@State courses:StudentMyCourse[] = []aboutToAppear(){this.MyCourses()}build() {Column({ space: 5 }) {Text(" ")Row({ space: 10 }) {Text(" ")Image($r('app.media.back')).width(30).height(30).onClick(function () {//返回上一页router.back() //直接返回})Text("我的课程").fontSize(30).fontWeight(FontWeight.Bolder)}.width('100%')Text("----------------------------------------------")Text(" ")List({space:50}){ForEach(this.courses,course=>{ListItem(){Row({space:30}){Text(" ")Column({space:20}){Text(course.cname).fontColor(Color.Green).fontSize(15).fontWeight(FontWeight.Bolder).fontFamily("楷体")Text("课程号:"+course.cid).fontSize(10).fontColor(Color.Red)Text("任课教师:"+course.tname).fontSize(10).fontColor(Color.Green)Text("上课时间:"+course.ctime).fontSize(10).fontColor(Color.Green)}.justifyContent(FlexAlign.Start).alignItems(HorizontalAlign.Start)Blank()Button("退课").backgroundColor(Color.Red).onClick(()=>{console.log("学生点击了:"+course.cname)DeletCourse.STA(course.cname,course.cid,course.tname,course.ctime).then(resp=>{console.log("返回成功"+resp)promptAction.showToast({message: resp,duration: 2000,bottom: 50});})})}.width('95%').height(150)//.padding(20).backgroundColor(Color.White).borderRadius(15).shadow({ radius: 6, color: '#1F000000', offsetX: 2, offsetY: 4 })}})}.width('100%')}}MyCourses(){GetStudentCourse.GC().then(resp=>{console.log("返回信息成功"+resp.toString())if(resp.length === 0){promptAction.showToast({message: '您还没有选课哦~',duration: 2000,bottom: 50});}this.courses = resp})}
}
请求源码
请求所选课程
class GetStudentCourse {baseURL: string = IP.ipGC(): Promise<StudentMyCourse[]> {return new Promise((resolve, reject) => {let Http = http.createHttp()Http.request(`${this.baseURL}/GetMyCourse`,{method: http.RequestMethod.GET,connectTimeout: 10000,readTimeout: 10000}).then(resp => {if (resp.responseCode === 200) {console.log("请求成功" + resp.result)resolve(JSON.parse(resp.result.toString()))}else {console.log("请求成功,但是出现问题" + resp.responseCode)}}).catch(error => {console.log("请求失败" + error)})})}
}const sc = new GetStudentCourse()
export default sc as GetStudentCourse
向后端发送退课信息
class DeletCourse {baseURL: string = IP.ipSTA(cname: string, cid: string, tname: string,ctime: string): Promise<string> {const data = {cname: cname,cid: cid,tname: tname,ctime:ctime}return new Promise((resolve, reject) => {let httpRequest = http.createHttp()httpRequest.request(`${this.baseURL}/DeletMyCourse`,{method: http.RequestMethod.GET,extraData: data,connectTimeout: 10000,readTimeout: 10000},).then(resp=>{if(resp.responseCode===200){console.log("请求成功!"+resp.result)resolve(resp.result.toString())}else {console.log("请求发生错误"+resp.responseCode)}}).catch(err=>{console.log("请求失败"+err)})})}
}const sc = new DeletCourse()
export default sc as DeletCourse

后端代码与选课部分相同,这里不再赘述

3、BUG修复

修复了Mybatis二级缓存溢出导致查询变慢的问题

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

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

相关文章

一份简单的海外问卷,改变经济现状

在许多人看来&#xff0c;赚钱似乎总是与资金和技术密切相关。然而&#xff0c;即使没有丰富的资金和高超的技术&#xff0c;仍然有机会赚取可观的收入。 首先&#xff0c;需要明确的是&#xff0c;赚钱并非完全依赖于物质资本和技术能力。在这个充满机遇的时代&#xff0c;选…

深入源码设计!Vue3.js核心API——Computed实现原理

如果您觉得这篇文章有帮助的话&#xff01;给个点赞和评论支持下吧&#xff0c;感谢~ 作者&#xff1a;前端小王hs 阿里云社区博客专家/清华大学出版社签约作者/csdn百万访问前端博主/B站千粉前端up主 此篇文章是博主于2022年学习《Vue.js设计与实现》时的笔记整理而来 书籍&a…

谷歌云(GCP)4门1453元最热门证书限时免费考

谷歌云(GCP)最新活动&#xff0c;完成免费官方课程&#xff0c;送4门最热门考试免费考试券1张(每张价值200刀/1453元)&#xff0c;这4门也包括最近大热的AI/ML考试&#xff0c;非常值得学习和参加&#xff0c;活动7/17截止 谷歌云是全球最火的三大云计算厂商(前两名AWS, Azure…

投票多功能小程序(ThinkPHP+Uniapp+FastAdmin)

&#x1f389;你的决策小助手&#xff01; 支持图文投票、自定义选手报名内容、自定义主题色、礼物功能(高级授权)、弹幕功能(高级授权)、会员发布、支持数据库私有化部署&#xff0c;Uniapp提供全部无加密源码。​ 一、引言&#xff1a;为什么我们需要多功能投票小程序&#…

NSSCTF中的[WUSTCTF 2020]朴实无华、[FSCTF 2023]源码!启动! 、[LitCTF 2023]Flag点击就送! 以及相关知识点

目录 [WUSTCTF 2020]朴实无华 [FSCTF 2023]源码&#xff01;启动! [LitCTF 2023]Flag点击就送&#xff01; 相关知识点 1.intval 绕过 绕过的方式&#xff1a; 2.session伪造攻击 [WUSTCTF 2020]朴实无华 1.进入页面几乎没什么可用的信息&#xff0c;所以想到使用dis…

【c语言】二级指针

1&#xff0c;定义 本质还是从指针的角度去理解&#xff0c;只不过存的指针的值 2&#xff0c;使用方法

Android使用DevRing框架搭建数据库实体类以及使用

一、引用DevRing依赖 //导入DevRing依赖implementation com.ljy.ring:devring:1.1.8创建数据库表的依赖implementation org.greenrobot:greendao:3.2.2 // add libraryimplementation org.greenrobot:greendao-generator:3.0.0 二、修改工程目录下的.idea->gradle.xml文件&…

Golang笔记:使用serial包进行串口通讯

文章目录 目的使用入门总结 目的 串口是非常常用的一种电脑与设备交互的接口。这篇文章将介绍golang中相关功能的使用。 本文使用的包为 &#xff1a;go.bug.st/serial https://pkg.go.dev/go.bug.st/serial https://github.com/bugst/go-serial 另外还有一些常见的包如&…

Springboot民宿信息管理系统-计算机毕业设计源码08818

摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对民宿信息管理系统等问题&#xff0c;对民宿…

大模型应用研发基础环境配置(Miniconda、Python、Jupyter Lab、Ollama等)

老牛同学之前使用的MacBook Pro电脑配置有点旧&#xff08;2015 年生产&#xff09;&#xff0c;跑大模型感觉有点吃力&#xff0c;操作起来有点卡顿&#xff0c;因此不得已捡起了尘封了快两年的MateBook Pro电脑&#xff08;老牛同学其实不太喜欢用 Windows 电脑做研发工作&am…

Ant Design Vue Cascader 级联选择 错位问题

当Cascader 多个的时候 对应的下列会错位 如果滚动 他不会跟着元素 而是会跟着屏幕滚动&#xff0c;如下效果 解决方法 在Cascader 标题添加 getPopupContainer 属性监听对应的位置&#xff0c;返回对应的元素 <a-cascader class"smart-width-100 " v-model:…

Sam Altman:从少儿奇才到OpenAI掌舵人

自2022年底发布了ChatGPT以来&#xff0c;OpenAI及其首席执行官Sam Altman迅速成为科技界的焦点人物。Altman的崛起并非偶然&#xff0c;而是长期以来不断追求权力和创新的结果。本文将回顾Altman的成长历程&#xff0c;探索他如何一步步走向OpenAI的顶峰。 童年与教育背景 S…

亚马逊云科技官方活动:一个月拿下助理架构师SAA+云从业者考试认证(送半价折扣券)

为了帮助大家考取AWS SAA和AWS云从业者认证&#xff0c;小李哥争取到了大量考试半价50%折扣券&#xff0c;使用折扣券考试最多可省75刀(545元人民币)。 领取折扣券需要加入云师兄必过班群&#xff0c;在群中免费领取。目前必过班群招募到了超过200名小伙伴&#xff0c;名额有限…

YOLOv8关键点pose训练自己的数据集

这里写自定义目录标题 YOLOv8关键点pose训练自己的数据集一、项目代码下载二、制作自己的关键点pose数据集2.1 标注(非常重要)2.1.1 标注软件2.1.2 标注注意事项a.多类别检测框b.单类别检测框2.2 格式转换(非常重要)2.3 数据集划分三、YOLOv8-pose训练关键点数据集3.1 训练…

任务3.8.4 利用RDD实现分组排行榜

文章目录 1. 任务说明2. 解决思路3. 准备成绩文件4. 采用交互式实现5. 采用Spark项目实战概述&#xff1a;使用Spark RDD实现分组排行榜任务背景任务目标技术选型实现步骤1. 准备数据2. 数据上传至HDFS3. 启动Spark Shell4. 读取数据生成RDD5. 数据处理6. 计算TopN7. 输出结果8…

Instagram 算法更新?想要吸引更多新用户请打开这些设置!

为什么你发的IG就没人看&#xff1f;没流量&#xff1f;注意了&#xff01;IG算法已更新&#xff0c;了解最新算法、学会这些设置&#xff0c;你的IG自然能吸引到越来越多用户关注&#xff01; Instagram 算法更新 1️⃣ 根据Instagram官方的表述&#xff0c;他们对算法进行了调…

分享一个好用的图幅号计算器

如果在你的工作中会分幅处理地图数据&#xff0c;也许这个好用的图幅号计算器能对你有所帮助。 你只需要在该工具中输入经纬度坐标&#xff0c;就可以为你计算出各个比例尺下的图幅号&#xff0c;你可以在文末查看该工具的领取方法。 一个好用的图幅号计算器 该图幅计算器工…

Redis的持久化方式和注意点

redis持久篇 两种持久化技术&#xff1a; AOF日志和RDB快照 Redis默认会开启RBD快照 AOF:持久化只会记录写操作命令。 是一种日志&#xff0c;写入到文件&#xff0c;有相应的格式文本 就是 Redis 里的AOF(Append Only File)持久化功能&#xff0c;注意只会记录写操作命令…

【C++STL】Vector扩容机制

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

网络安全事件研判

研判&#xff08;入侵检测&#xff09; 研判我理解为人工层面对入侵检测事件进行再分析&#xff0c;即借助已有的设备告警根据经验判断是否为真实攻击 研判工作要充分利用已有安全设备&#xff08;需要提前了解客户的网络拓扑以及部署设备情况&#xff09;&#xff0c;分析其近…