Day215.课程详细页面功能完善、Echarts统计分析模块[生成统计数据+生成图表]前后端整合 -谷粒学院
谷粒学院
课程详细页面功能完善
一、修改课程详细接口
1、在service_order模块添加接口
用于判断订单中status值是否为1,为1则为已支付
@RestController
@CrossOrigin
@RequestMapping("/eduorder/t-order")
public class TOrderController {@Autowiredprivate TOrderService tOrderService;.........//根据【用户id、课程id】查询订单表中的状态@GetMapping("/isBuyCourse/{memberId}/{courseId}")public Boolean isBuyCourse(@PathVariable String memberId,@PathVariable String courseId) {QueryWrapper<TOrder> wrapper = new QueryWrapper<>();wrapper.eq("course_id",courseId);wrapper.eq("member_id",memberId);wrapper.eq("status",1);//支付状态 【1】代表已支付int result = tOrderService.count(wrapper);if (result>0){//已支付return true;}else {return false;}}}
2、在service_edu模块课程详情接口远程调用
(1)创建OrderClient接口
- com.achang.eduservice.client.OrderClient
确保加入nacos注册中心
配置文件,且在主配置类标注@EnableFeignClients
@Component
@FeignClient(value = "service-order",fallback = OrderClientImpl.class)
public interface OrderClient {//根据【用户id、课程id】查询订单表中的状态@GetMapping("/eduorder/t-order/isBuyCourse/{memberId}/{courseId}")public Boolean isBuyCourse(@PathVariable("memberId") String memberId, @PathVariable("courseId") String courseId);}
- OrderClientImpl
兜底方法
@Component
public class OrderClientImpl implements OrderClient {@Overridepublic Boolean isBuyCourse(String memberId, String courseId) {return null;}
}
(2)修改之前的课程详情接口调用
- com.achang.eduservice.controller.front.CourseFrontController
@RestController
@CrossOrigin
@RequestMapping("/eduservice/courseFront")
public class CourseFrontController {@Autowiredprivate EduCourseService eduCourseService;@Autowiredprivate EduChapterService eduChapterService;@Autowiredprivate OrderClient orderClient;..........//课程详情的方法@GetMapping("/getFrontCourseInfo/{courseId}")public R getFrontCourseInfo(@PathVariable("courseId") String courseId, HttpServletRequest request){boolean isBuyCourse = false;//根据课程id,编写sql语句查询课程信息CourseWebVo courseWebVo = eduCourseService.getBaseCourseInfo(courseId);//根据课程id,查询章节和小节信息List<ChapterVo> chapterVideoList = eduChapterService.getChapterVideoByCourseId(courseId);//获取用户idString memberId = JwtUtils.getMemberIdByJwtToken(request);if (!StringUtils.isEmpty(memberId)){//根据课程id、用户id,查询课程是否已经购买isBuyCourse = orderClient.isBuyCourse(memberId, courseId);}return R.ok().data("courseWebVo",courseWebVo).data("chapterVideoList",chapterVideoList).data("isBuy",isBuyCourse);}}
二、修改课程详情页面
三、测试
统计分析功能(生成统计数据)
0、需求分析
一、数据库设计
1、数据库
guli_statistics
2、数据表
#
# Structure for table "statistics_daily"
#CREATE TABLE `statistics_daily` (`id` char(19) NOT NULL COMMENT '主键',`date_calculated` varchar(20) NOT NULL COMMENT '统计日期',`register_num` int(11) NOT NULL DEFAULT '0' COMMENT '注册人数',`login_num` int(11) NOT NULL DEFAULT '0' COMMENT '登录人数',`video_view_num` int(11) NOT NULL DEFAULT '0' COMMENT '每日播放视频数',`course_num` int(11) NOT NULL DEFAULT '0' COMMENT '每日新增课程数',`gmt_create` datetime NOT NULL COMMENT '创建时间',`gmt_modified` datetime NOT NULL COMMENT '更新时间',PRIMARY KEY (`id`),KEY `statistics_day` (`date_calculated`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='网站统计日数据';#
# Data for table "statistics_daily"
#
二、创建微服务
1、在service模块下创建子模块
service_statistics
2、application.properties
resources目录下创建文件
# 服务端口
server.port=8008# 服务名
spring.application.name=service-statistics# mysql数据库连接
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/guli?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=00000# 返回json的全局格式
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8# 配置mybatis xml文件的路径
mybatis-plus.mapper-locations=classpath:com.achang.staservice.mapper.xml/*.xml# mybatis日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl# nacos服务地址
spring.cloud.nacos.discovery.server-addr=localhost:8848# 开启熔断机制
feign.hystrix.enabled=true# 设置hystrix超时时间,默认1000ms
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=3000
3、MP代码生成器生成代码
@Test
public void run(){// 1、创建代码生成器AutoGenerator mpg = new AutoGenerator();// 2、全局配置GlobalConfig gc = new GlobalConfig();String projectPath = System.getProperty("user.dir");gc.setOutputDir("D:\\JavaStudy\\gulixueyuan\\guli_parent\\service\\service_statistics" + "/src/main/java"); //输出目录gc.setAuthor("achang"); //作者名gc.setOpen(false); //生成后是否打开资源管理器gc.setFileOverride(false); //重新生成时文件是否覆盖gc.setServiceName("%sService"); //去掉Service接口的首字母Igc.setIdType(IdType.ID_WORKER_STR); //主键策略gc.setDateType(DateType.ONLY_DATE);//定义生成的实体类中日期类型gc.setSwagger2(true);//开启Swagger2模式mpg.setGlobalConfig(gc);// 3、数据源配置DataSourceConfig dsc = new DataSourceConfig();dsc.setUrl("jdbc:mysql://localhost:3306/guli?serverTimezone=GMT%2B8");dsc.setDriverName("com.mysql.cj.jdbc.Driver");dsc.setUsername("root");dsc.setPassword("00000");dsc.setDbType(DbType.MYSQL);mpg.setDataSource(dsc);// 4、包配置PackageConfig pc = new PackageConfig();//生成包:com.achang.eduservicepc.setModuleName("staservice"); //模块名pc.setParent("com.achang");//生成包:com.achang.oss.controllerpc.setController("controller");pc.setEntity("entity");pc.setService("service");pc.setMapper("mapper");mpg.setPackageInfo(pc);// 5、策略配置StrategyConfig strategy = new StrategyConfig();strategy.setInclude("statistics_daily");//根据数据库哪张表生成,有多张表就加逗号继续填写strategy.setNaming(NamingStrategy.underline_to_camel);//数据库表映射到实体的命名策略strategy.setTablePrefix("statistics" + "_"); //生成实体时去掉表前缀strategy.setColumnNaming(NamingStrategy.underline_to_camel);//数据库表字段映射到实体的命名策略strategy.setEntityLombokModel(true); // lombok 模型 @Accessors(chain = true) setter链式操作strategy.setRestControllerStyle(true); //restful api风格控制器strategy.setControllerMappingHyphenStyle(true); //url中驼峰转连字符mpg.setStrategy(strategy);// 6、执行mpg.execute();}
4、创建SpringBoot启动类
@SpringBootApplication
@EnableFeignClients
@MapperScan("com.achang.staservice.mapper")
@EnableDiscoveryClient //开启服务发现
@ComponentScan("com.achang")
public class staserviceMain8008 {public static void main(String[] args) {SpringApplication.run(staserviceMain8008.class,args);}
}
三、实现服务调用
1、在service_ucenter模块创建接口,统计某一天的注册人数
- controller
@RestController
@RequestMapping("/serviceUcenter/ucenter-member")
@CrossOrigin
public class UcenterMemberController {@Autowiredprivate UcenterMemberService ucenterMemberService;........//根据日期,获取那天注册人数@GetMapping("/countRegister/{day}")public R countRegister(@PathVariable String day){Integer count = ucenterMemberService.getCountRegister(day);return R.ok().data("countRegister",count);}}
- service
接口
public interface UcenterMemberService extends IService<UcenterMember> {...........//根据日期,获取那天注册人数Integer getCountRegister(String day);
}
impl
@Service
public class UcenterMemberServiceImpl extends ServiceImpl<UcenterMemberMapper, UcenterMember> implements UcenterMemberService {@Autowiredprivate RedisTemplate<String,String> redisTemplate;...........//根据日期,获取那天注册人数@Overridepublic Integer getCountRegister(String day) {return baseMapper.getCountRegister(day);}}
- mapper
接口
public interface UcenterMemberMapper extends BaseMapper<UcenterMember> {Integer getCountRegister(String day);
}
xml
<select id="getCountRegister" resultType="java.lang.Integer">select count(1)from ucenter_memberwhere date(gmt_create) = #{day}
</select>
2、在service_statistics模块创建远程调用接口
创建client包和UcenterClient接口和impl
- 接口
@Component
@FeignClient(value = "service-ucenter",fallback = UcenterClientImpl.class)
public interface UcenterClient {//根据日期,获取那天注册人数@GetMapping("/serviceUcenter/ucenter-member/countRegister/{day}")public R countRegister(@PathVariable("day") String day);
}
- impl
兜底方法
@Component
public class UcenterClientImpl implements UcenterClient {@Overridepublic R countRegister(String day) {return null;}
}
3、在service_statistics模块调用微服务
- controller
@RestController
@RequestMapping("/staservice/daily")
@CrossOrigin //解决跨域问题
public class DailyController {@Autowiredprivate DailyService dailyService;//统计某一天注册人数@PostMapping("/createStatisticsByDay/{day}")public R createStatisticsByDay(@PathVariable String day){dailyService.createStatisticsByDay(day);return R.ok();}}
- service
impl
@Service
public class DailyServiceImpl extends ServiceImpl<DailyMapper, Daily> implements DailyService {@Autowiredprivate UcenterClient ucenterClient;//统计某一天注册人数@Overridepublic void createStatisticsByDay(String day) {//添加之前先删除表相同的数据QueryWrapper<Daily> wrapper = new QueryWrapper<>();wrapper.eq("date_calculated",day);baseMapper.delete(wrapper);//远程调用得到某一天的注册人数R registerR = ucenterClient.countRegister(day);Integer countRegister = (Integer) registerR.getData().get("countRegister");//其他的数据类似,也是通过远程调用,获取数据返回即可,下面使用随机数模拟//把获取到的数据Daily daily = new Daily();daily.setRegisterNum(countRegister);//注册人数daily.setCourseNum(RandomUtils.nextInt(100,200));daily.setLoginNum(RandomUtils.nextInt(200,300));//登录数daily.setVideoViewNum(RandomUtils.nextInt(200,300));//视频流量数daily.setDateCalculated(day);//统计日期//添加到数据库中baseMapper.insert(daily);}}
接口
public interface DailyService extends IService<Daily> {//统计某一天注册人数void createStatisticsByDay(String day);
}
- 测试,启动两个访问
访问:localhost:8008/swagger-ui.html
- 记住给实体类添加
- 配置nginx
测试成功
四、添加定时任务
在特定的时间,让程序自动执行,闹钟一样
七子表达式,总共有7位,但是springboot整合只整合了前面6位,最后一位的年没有整合,直接默认是每年
1、在启动类上添加注解
@EnableScheduling
开启定时任务
2、创建定时任务类,使用cron表达式
com.achang.staservice.schedule.ScheduledTask
@Component
public class ScheduledTask {//(0/5 * * * * ?):每隔5秒执行一次@Scheduled(cron = "0/5 * * * * ?")//指定cron表达式规则public void task01(){System.out.println("=========我执行了");}
}
- 通过工具类,在每天凌晨1点执行方法,把前一天的数据查询进行添加
@Component
public class ScheduledTask {@Autowiredprivate DailyService dailyService;//在每天凌晨1点执行方法,把前一天的数据查询进行添加@Scheduled(cron = "0 0 1 * * ? ")//指定cron表达式规则public void task02(){dailyService.createStatisticsByDay(DateUtil.formatDate(DateUtil.addDays(new Date(), -1)));}}
3、在线生成cron表达式
网上一大堆,随便找
http://cron.qqe2.com/
统计数据前端整合
一、前端页面实现
1、添加路由
guli-admin\src\router\index.js
//统计分析{path: '/sta',component: Layout,redirect: '/sta/create',name: '统计分析',meta: { title: '统计分析', icon: 'nested' },children: [{path: 'create',name: '生成数据',component: () => import('@/views/sta/create.vue'),meta: { title: '生成数据', icon: 'table' }},{path: 'show',name: '图表显示',component: () => import('@/views/sta/show.vue'),meta: { title: '图表显示', icon: 'nested' }}]},
2、创建api
import request from '@/utils/request' //引入已经封装好的axios 和 拦截器export default{//生成统计数据createStaByDay(day){return request({url:'/staservice/daily/createStatisticsByDay/'+day,method: 'post'})}}
3、创建组件
guli-admin\src\views\sta\create.vue
- create
html页面
<template><div class="app-container"><!--表单--><el-form :inline="true" class="demo-form-inline"><el-form-item label="日期"><el-date-pickerv-model="day"type="date"placeholder="选择要统计的日期"value-format="yyyy-MM-dd"/></el-form-item><el-button :disabled="btnDisabled" type="primary" @click="create()">生成</el-button></el-form></div>
</template>
js脚本
<script>
import staApi from "@/api/sta";
export default {data() {return {day: "",btnDisabled: false,};},created() {},methods: {create() {staApi.createStaByDay(this.day).then((resp) => {//提示this.$message({type: "success",message: "生成成功!",});//跳转页面到showthis.$router.push({path:'/sta/show'})});},},
};
</script>
- 效果
测试成功
统计数据图表显示ECharts
一、ECharts
1、简介
ECharts是百度的一个项目,后来百度把Echart捐给apache,用于图表展示,提供了常规的折线图、柱状图、散点图、饼图、K线图,用于统计的盒形图,用于地理数据可视化的地图、热力图、线图,用于关系数据可视化的关系图、treemap、旭日图,多维数据可视化的平行坐标,还有用于 BI 的漏斗图,仪表盘,并且支持图与图之间的混搭。
官方网站:https://echarts.baidu.com/
2、基本使用
入门参考:官网->文档->教程->5分钟上手ECharts
(1)创建html页面:柱图.html
(2)引入ECharts
<!-- 引入 ECharts 文件 -->
<script src="echarts.min.js"></script>
(3)定义图表区域
<!-- 为ECharts准备一个具备大小(宽高)的Dom -->
<div id="main" style="width: 600px;height:400px;"></div>
(4)渲染图表
<script type="text/javascript">
// 基于准备好的dom,初始化echarts实例
var myChart = echarts.init(document.getElementById("main"));
// 指定图表的配置项和数据
var option = {title: {text: "ECharts 入门示例",},tooltip: {},legend: {data: ["销量"],},xAxis: {data: ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"],},yAxis: {},series: [{name: "销量",type: "bar",data: [5, 20, 36, 10, 10, 20],},],
};
// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
</script>
3、折线图
实例参考:官网->实例->官方实例 https://echarts.baidu.com/examples/
折线图.html
<script>
var myChart = echarts.init(document.getElementById("main"));
var option = {//x轴是类目轴(离散数据),必须通过data设置类目数据xAxis: {type: "category",data: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],},//y轴是数据轴(连续数据)yAxis: {type: "value",},//系列列表。每个系列通过 type 决定自己的图表类型series: [{//系列中的数据内容数组data: [820, 932, 901, 934, 1290, 1330, 1320],//折线图type: "line",},],
};
myChart.setOption(option);
</script>
二、项目中集成ECharts
1、安装ECharts
npm install --save echarts@4.1.0
2、路由
src/router/index.js
在统计分析路由中增加子路由
3、创建组件
guli-admin\src\views\sta\show.vue
- 模板
<template><div class="app-container"><!--表单--><el-form :inline="true" class="demo-form-inline"><el-form-item><el-select v-model="searchObj.type" clearable placeholder="请选择"><el-option label="学员登录数统计" value="login_num" /><el-option label="学员注册数统计" value="register_num" /><el-option label="课程播放数统计" value="video_view_num" /><el-option label="每日课程数统计" value="course_num" /></el-select></el-form-item><el-form-item><el-date-pickerv-model="searchObj.begin"type="date"placeholder="选择开始日期"value-format="yyyy-MM-dd"/></el-form-item><el-form-item><el-date-pickerv-model="searchObj.end"type="date"placeholder="选择截止日期"value-format="yyyy-MM-dd"/></el-form-item><el-button:disabled="btnDisabled"type="primary"icon="el-icon-search"@click="showChart()">查询</el-button></el-form><div class="chart-container"><div id="chart" class="chart" style="height: 500px; width: 100%" /></div></div>
</template>
- js:暂时显示临时数据
<script>
import echarts from "echarts";
export default {data() {return {searchObj: {begin: "",end: "",type: "",},btnDisabled: false,chart: null,title: "",xData: [],yData: [],};},methods: {showChart() {// 基于准备好的dom,初始化echarts实例this.chart = echarts.init(document.getElementById("chart"));// console.log(this.chart)// 指定图表的配置项和数据var option = {// x轴是类目轴(离散数据),必须通过data设置类目数据xAxis: {type: "category",data: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],},// y轴是数据轴(连续数据)yAxis: {type: "value",},// 系列列表。每个系列通过 type 决定自己的图表类型series: [{// 系列中的数据内容数组data: [820, 932, 901, 934, 1290, 1330, 1320],// 折线图type: "line",},],};this.chart.setOption(option);},},created() {},
};
</script>
三、完成后端业务
1、controller
@RestController
@RequestMapping("/staservice/daily")
@CrossOrigin //解决跨域问题
public class DailyController {@Autowiredprivate DailyService dailyService;.............//图表显示,返回两部分数据,日期json数组,数量json数组@GetMapping("/showData/{type}/{begin}/{end}")public R showData(@PathVariable String type,@PathVariable String begin,@PathVariable String end){Map<String,Object> map = dailyService.getShowData(type,begin,end);return R.ok().data(map);}}
2、service
- 接口
public interface DailyService extends IService<Daily> {.........//图表显示,返回两部分数据,日期json数组,数量json数组Map<String, Object> getShowData(String type, String begin, String end);
}
- impl
@Service
public class DailyServiceImpl extends ServiceImpl<DailyMapper, Daily> implements DailyService {@Autowiredprivate UcenterClient ucenterClient;............//图表显示,返回两部分数据,日期json数组,数量json数组@Overridepublic Map<String, Object> getShowData(String type, String begin, String end) {//根据条件查询对应的数据QueryWrapper<Daily> wrapper = new QueryWrapper<>();wrapper.select("date_calculated",type);wrapper.between("date_calculated",begin,end);List<Daily> dailyList = baseMapper.selectList(wrapper);//前端要求数组json结果,对应后端为List集合//创建两个list集合,一个放日期X轴,一个放数量Y轴List<String> xlist = new ArrayList<>();List<Integer> ylist = new ArrayList<>();for (Daily daily : dailyList) {xlist.add(daily.getDateCalculated());//判断查询的哪个字段if ("register_num".equals(type)){ylist.add(daily.getRegisterNum());}if ("login_num".equals(type)){ylist.add(daily.getLoginNum());}if ("video_view_num".equals(type)){ylist.add(daily.getVideoViewNum());}if ("course_num".equals(type)){ylist.add(daily.getCourseNum());}}HashMap<String, Object> map = new HashMap<>();map.put("xlist",xlist);map.put("ylist",ylist);return map;}}
- 测试
四、前后端整合
1、创建api
guli-admin\src\api\sta.js中添加方法
import request from '@/utils/request' //引入已经封装好的axios 和 拦截器export default {.......//图表显示getShowData(searchObj) {return request({url: `/staservice/daily/showData/${searchObj.type}/${searchObj.begin}/${searchObj.end}`,method: 'get'})}}
2、show.vue中引入api模块
import staApi from '@/api/sta.js'
3、js脚本
export default {data() {return {searchObj: {begin: "",end: "",type: "",},btnDisabled: false,chart: null,title: "",xData: [],yData: [],};},methods: {setChart() {// 基于准备好的dom,初始化echarts实例this.chart = echarts.init(document.getElementById("chart"));// console.log(this.chart)// 指定图表的配置项和数据var option = {// xAxis: {type: "category",data:this.xData,//x轴数据},// yAxis: {type: "value",},series: [{// 系列中的数据内容数组data:this.yData,//y轴数据// 折线图type: "line",//type 决定自己的图表类型},],};this.chart.setOption(option);},showChart(){staApi.getShowData(this.searchObj).then(resp=>{//x轴 时间this.xData = resp.data.xlist//y轴 数据this.yData = resp.data.ylist//调用下面生成图表方法,改变值this.setChart();})}},created() {},
};
</script>
- 测试
五、样式调整
参考配置手册: https://echarts.baidu.com/option.html#title
- 写到option里面
1、显示标题
title: {text: this.title
},
2、x坐标轴触发提示
tooltip: {trigger: 'axis'
},
3、区域缩放
dataZoom: [{show: true,height: 30,xAxisIndex: [0],bottom: 30,start: 10,end: 80,handleIcon:"path://M306.1,413c0,2.2-1.8,4-4,4h-59.8c-2.2,0-4-1.8-4-4V200.8c0-2.2, 1.8-4, 4-4h59.8c2.2, 0, 4, 1.8, 4, 4V413z",handleSize: "110%",handleStyle: {color: "#d3dee5",},textStyle: {color: "#fff",},borderColor: "#90979c",},{type: "inside",show: true,height: 15,start: 1,end: 35,},
],
Day215.课程详细页面功能完善、Echarts统计分析模块[生成统计数据+生成图表]前后端整合 -谷粒学院相关推荐
- 尚硅谷谷粒学院学习笔记11-- 微信支付,课程详情页面功能完善
课程支付需求描述 课程支付说明 (1)课程分为免费课程和付费课程,如果是免费课程可以直接观看,如果是付费观看的课程,用户需下单支付后才可以观看 (2)如果是免费课程,在用户选择课程,进入到课程详情页面 ...
- ECharts统计数据以图表显示
ECharts统计数据以图表显示 1:简介 ECharts用于图表展示,提供了常规的折线图.柱状图.散点图.饼图.K线图,用于统计的盒形图,用于地理数据可视化的地图.热力图.线图,用于关系数据可视化的 ...
- SpringBoot+LayUI+MybatisPlus+Echarts图表 前后端分离 实现数据统计功能
前言: 小伙伴们,大家好,我是狂奔の蜗牛rz,当然你们可以叫我蜗牛君,我是一个学习Java快一年时间的小菜鸟,同时还有一个伟大的梦想,那就是有朝一日,成为一个优秀的Java架构师. 首先给各位粉丝朋友 ...
- 【Vue+SpringBoot】超详细!一周开发一个SpringBoot + Vue+MybatisPlus+Shiro+JWT+Redis前后端分离个人博客项目!!!【项目完结】
项目目录 资源准备 前后端分离项目 技术栈 Java后端接口开发 1.前言 2.新建Springboot项目 3.整合mybatis plus 3.统一结果封装 4.整合shiro+jwt,并会话共享 ...
- 谷粒学院(十九)统计分析模块 | 定时任务 | echarts
1.统计分析模块需求分析 一.统计分析功能 - 后端 1.准备数据库 guli_statistics.sql 2.在service模块下创建子模块 service_statistics 3.MP代码生 ...
- Day214.课程评论功能、微信支付实现课程支付模块前后端 -谷粒学院
谷粒学院 课程评论功能 一.数据库设计 数据库 edu_comment 数据表 CREATE TABLE `edu_comment` (`id` char(19) NOT NULL COMMENT ' ...
- 谷粒学院16万字笔记+1600张配图(十八)——统计分析
项目源码与所需资料 链接:https://pan.baidu.com/s/1azwRyyFwXz5elhQL0BhkCA?pwd=8z59 提取码:8z59 文章目录 demo18-统计分析 1.需求 ...
- 京东上千页面搭建基石——CMS前后端分离演进史
声明:本文来自京东张开涛的微信公众号(kaitao-1234567),授权CSDN转载,如需转载请联系作者. 作者:于林坤,2012年加入京东,网站移动研发部频道业务技术负责人,先后多次主导京东商城首 ...
- SpringBoot+LayUI+MybatisPlus 前后端分离 实现排名统计功能
前言: 小伙伴们,大家好,我是狂奔の蜗牛rz,当然你们可以叫我蜗牛君,我是一个学习Java快一年时间的小菜鸟,同时还有一个伟大的梦想,那就是有朝一日,成为一个优秀的Java架构师. 首先给各位粉丝朋友 ...
最新文章
- 2022-2028年中国化妆品OEM行业市场发展规模及前瞻分析报告
- iOS多线程全套:线程生命周期,多线程的四种解决方案,线程安全问题,GCD的使用,NSOperation的使用(下)
- FATFS配置长文件名,为何跟编码转换有关
- Intellij idea generate builder 插件-用于自动生成builder模式代码
- Java程序员周末时间搞锭银行信息管理系统毕业设计(java+springboot+mybatis+mysql+vue+elementui)等实现
- python bootstrap_Python-bootstrap
- Bootstrap-组件-2
- opencart配置United States Postal Service快递
- html代码编辑器jason,JSON 编辑器实现代码
- AERONET 儒略日公历相互转换
- 三维地图3DGIS平台技术指标要求规划
- Diffusion Models专栏文章汇总:入门与实战
- tuts4you 注册_设计和开发完整的网站(Tuts + Mini系列,第3页)
- 微信小程序仿朋友圈,实现点赞和评论功能
- WebRTC H5实现服务器转发的视频聊天
- 小米AX1800开SSH权限
- java舞会配对程序_舞会心动男/女生配对问题
- 用户界面设计应该用那些软件?
- Bochs源码分析 - 11:《X86探索及编程》代码初步解释
- 浅析城市交通现状及问题
热门文章
- 想考阿里云ACP认证,网上买题库靠谱吗?
- GBase 8c基础操作
- 使用powershell Client进行有效dy
- [翻译]Orchard如何工作
- mysql独立开发_TickyCMS: TickyCMS是由罗敏贵独自开发的一款基于PHP+Mysql架构的轻量级开源内容管理系统。...
- Python异步并发机制详解,让你的代码运行效率就像搭上了火箭!!!
- java多线程死锁代码_java多线程死锁 编写高质量代码:改善Java程序的151个建议...
- python 正则表达式整理
- MobileNetV2: Inverted Residuals and Linear Bottlenecks论文解读
- 【全开源+免费更新】doodoo.js快速入门教程