00:00
好,那我们写完用户权限管理模块的话呢,实际上大家对这个,呃,就是说。后端如何去对数据库进行测删查改,然后将查出来的数据返回给前端对吧?以及前端和后端的这样的一个交互过程呢,大概已经是比较了解了,呃,那么实际上呢,呃写后端呢,基本上都是这样子的,无非就是说你往后端接入什么样的服务而已,对吧?嗯,当然我们那个是简单的增删查改,可能你还可以去接入一些,呃,比方说机器学习啊等等等等,或者说其他的一些模块对吧?呃,使得整个后端呢越来越复杂对吧?啊包括说呃,如果说并发量很大对吧,你可能需要考虑处理一下高并发对吧,可能会使用类似于像呃缓存这样的一些策略,比方说red,对吧?呃,那么还有可能需要使用类似于像卡夫卡这样的持久化的消息队列等等等等,呃,所以说呢,它后端就会越来越复杂,呃,当然前端的话呢,比方说数据大。
01:08
盘呀,呃,各种各样的动画,各种各样的可视化效果等等等等,各种各样的交互逻辑,对吧?那么前端呢,它也会随之相应的,呃,变得越来越复杂,呃,所以说实际上这个前端和后端它从复杂度和难度来讲,实际上是没有上限的,也就是说你可以写的非常非常的难,对吧?你可以写的非常非常难,好呃,那接下来的话呢,我们就可以开始写这个数据统计的管理模块,对吧?当然就是在这儿实时统计的话呢,你会发现,诶,他报了一堆404,呃,也就是说我实时统计什么交易总额呀,什么品类销售占比呀,品牌排行呀,包括热词图这些东西呢,我并没有。写对应的API对吧?我后端spring BOO并没有写对应的API,所以说它自然的话呢,呃,就会一堆404,因为我们要请求的这个URL它目前是不存在的,对吧?呃,所以说接下来的话呢,我们就开始来写代码,当然就是说呃实时统计这张消这张大盘,它所依赖的数据呢,都存在clickle house里边,所以说我们在这儿的话呢,我们需要呃来看一下对吧?呃,Clickhouse里面的几张表对吧?当然click house呢,我相信大家已经都会安装了,对吧?所以说我们在这里面的话呢,呃,我们就来看一下house对吧?呃,那么在这的话呢,首先你要在clickhouse呢创建一张表,叫做keyword statistics,那么这张表呢,有比方说开始时间,结束时间,然后关键词,然后它的访问来源,以及关键词的一个。
02:46
呃,统计对吧,包括时间戳,然后呢,我们使用的呃,这个就是说引擎呢,是一个合并数,也就是merger tree这样的一个引擎,呃,当然你要注意的话呢,就是我的数据呢,是按照star time来进行排序的,对吧?然后你是执行下面的这个隐测试语句呢,就把我们的测试数据给呃插入进去了,而这张表呢,它主要就是呃。
03:10
我们渲染到前端是什么呢?实际上就是这个热词图对吧?呃,当然还有一些其他的表,比方说,呃,Province statistics。那这个就是每一个省的,呃,这样的一个销售额的统计对吧?那这张表的数据主要显示在我们前端哪里呢?显示在前端这里,那这里边的话呢,今日销售总额下面会出现一幅地图啊,对吧?那么这个地图上的话呢,就会标出各省的,呃,就是说会可视化出每一个省的它的交易额,好呃,当然还有类似于像呃,就是说product statistics这张表对吧?那么这个是我们的,呃,就是说产品方面的一些统计信息对吧?产品方面的一些统计信息,当然它可能字段会比较多一点,呃,什么SKU啊,什么s puu,对不对,包括它的TM对吧,它的品牌以及categy它的分类,或者说它的品类以及什么总额啊等等等等,呃,这应该都是大家在学习数仓的时候所见过的一些数据,对吧?呃,那么。
04:16
通过这样的一张表里面,我们插入的测试数据呢,呃,会反映到前端呢,那它其实就是一个。呃,品类销售额占比啊,或者说品牌,呃销售排行对吧,品牌销售排行当然呃我们来看一下还有其他表吗?好,那这个的数据量呢,相对来说会比较多一点,方便我们,呃可视化相对来说好看一点,对吧?那这样的话,其实我们这三张表呢,呃就会支撑出我们前面的这个实时统计的,呃大盘的一个显示,好那接下来的话呢,我们就开始针对。这几张表呢,来编写后端的API对吧?来编写后端的API,呃,当然在这儿的话呢,我们首先还是要编写它的一个病这样的一个类对吧?呃,好,我们现在我们先新添加一个模块,这个模块叫做什么呢?这个模块就叫做statistics吧。
05:12
呃,或者statistic OK,我们新添加了这样的一个软件包,然后在这里面呢,我们还是新建一个B这样的一个文件夹,还是新建B这样的一个文件夹,然后呢,在这个B里边的话呢,我们首先第一个,诶,我们要新建的Java类呢,叫做general statistic,对吧?也就是说一个一般统计类对吧?也就是说我们这个是一个般统计类,好,然后呢,我们有几个字段呢?当然第一个字段就是名字对吧,Private string,那第二个字段呢,就是指,呃,然后呢是private。
06:02
String value,也就是这个名字和值啊,实际上它你可以认为它是个KV键值,对,或者说也可以认为它,比方说这个名字它是X轴上的一个坐标对吧,X轴坐标,那么下边这个值呢,它可以是一个什么呀?是Y轴坐标对吧。也就是说我实际上这个就是一个。当然就看你,呃,想把什么放成X轴,什么放成Y轴对不对,比方这个name的话,它有可能是比方说1月1号,1月2号,1月3号,而这个value的话呢,它可能是一个比方说1月1号的销量,1月2号的销量,1月3号的销量,对吧?那么我们的每一个general statistic这样的一个实例,它就对应了XY这样的一个二维图像上的一个表,对吧,一个表,比方说在这的话呢,呃,我就是一个。比如说我的这个name。
07:02
对吧?比方我们使用E叉T来进行可视化的话,那可能我这个就是一个,比方说name轴对吧?呃,那么纵轴的话呢,可以是一个value这样的一个轴啊,当然你可以把这两个轴呢给它反过来对吧?比方说我想纵轴显示名字对吧,或者说显示日期之类的,横轴显示值,这也没有问题,呃,那么在这的话呢,诶,这个就是一个。呃,Stat这样的一个实例对吧?呃,就是一个点,我们就可以把它可视化出来,我们就可以把它可视化出来好。OK,那我们定义了这样的一个病类以后呢,当然你不要忘记给它呃生成一些get set对吧?所以说在这的话,我们就给它生成一些呃,Get set,好,当然你想把toth string重写一下,呃也是可以的,一般来讲,我们在呃编写Java编程的时候呢,还是推荐大家把twoth string呢呃给重写对吧?呃这样的话,它打印出来呢,就不是一个对象的地址,而是一个有意义的字符串,好,这是我们的第一个病类。
08:11
呃,那么我们的第二个病例是什么呢?由于我们这里面实际上涉及到一个,嗯,就是说分页的操作对吧?所以我们在这的话呢,我们再来一个用来分页的这样的一个配置这样的一个类,对吧?呃,当然就是说配置这样的一个类的话呢,那么它有哪些字段呢?对吧?用于分页,用于分页对吧?也就是说每个配置实例保存一个分页数据对吧?保存一组分页的数据吧,或者说一页数据都是可以的,Public in total。数据总量。
09:00
对吧,这个是数据总量public inter size对吧?那么这个应该什么呢?总页数对吧?那么还有呢,Public in current对吧,那就是当前。页的页码对吧?那么还有什么呢?那就是还有就是我们要返回的数据对吧?那么要返回的数据呢,就是一个,呃,当然我们要返回的是一个列表数据,这个列表里边呢,是一个泛型,因为你一页里面有很多很多条数据啊,所以说我们这里边的话呢,我们就有一个,呃,这个public,呃,就是说就有一个record对吧,这个应该叫做分页中的数据列表,对吧?因为你一页的话,一般来说有多条数据嘛。对吧,所以我们把它放到record里面,当然你在这儿的话,你就会发现,诶我这个T呢是标红的,是因为我们在这类的这里边呢,我们也需要给他一个泛型,诶这样就没有问题了,好呃,那这个是一个分页数据的,呃,这样的一个并类对吧?这样的一个并类,然后呢,我们还有一个呢,就是呃什么呢?还有一个就是流量统计的一个病类,对吧?流量统计的一个病类,那我们这个起名为traffic statistics吧,Statistic,好,那这个就是traffic statistic,那么它有哪些字段呢?这个流量统计我们可以看到它实际上是呃在这个对吧,访问流量统计,当然你在这边你也看到它是404,呃,因为我们并没有编写它的这个,呃。
10:43
对应的URL对吧,它的控制器的逻辑好,所以在这的话,我们是traffic statistic,它的字段相对来说多一点,那这个第一个的话呢,就是string dt,那这个就是日期对吧,Private integer recent。
11:02
Days,那这个就是最近多少天的数据对吧?那么还有就是private channel渠道对吧?你这个流量数据来源于哪个渠道,是是哪一个品牌的手机对吧?是苹果手机还是小米手机还是之类的,对不对?Integer UV count,那这个是独立访客统计值,Private integer对吧,Avg Du s对吧?那这个就是我们的平均量数量对吧,它是个平均数量,好,然后呢,还有一个就是private in t avg配置count对吧,每一个页面的平均访问次数,然后呢,还有就是private in SV count啊还有呢,就是private。
12:03
Double bounce rate对吧?那么这个double bounce rate这个表是什么呢?这个表是跳出率对吧?也就是说你访问一个页面可能没多长时间就直接跳出去了,呃,那这个叫做跳出率对吧?当然你要是在这个页面上停留时间比较长呢,它就不算跳出对吧?那这个也是我们数据库里边呃,有的一个字段对吧?好,那接下来的话呢,我们有了这些字段之后呢,我们就可以呃构建什么呢?我们就会构建它的get了。对吧,构建大盖好生成这么一大堆的样板代码对吧?好,我们现在有这些样板代码以后啊,那我们的流量统计的,呃,流量统计并类对吧,就编写完了,它有这么一些字段,其实你不需要特别管啊,因为这个实际上就是呃,一个数据库的字段而已,对吧,一个数据库字段而已,好。
13:01
呃,当然还除了这个以外呢,那么还有一个就是配置pass,那么这个就是我们的访问路径对吧?呃,这个也是我们要统计的一个指标,就是下面的这个,这幅图里边会标出我们用户他的一个访问路径,然后可视化出来对吧?呃,所以说在这里面的话,我们还是诶先把这个代码写一下。啊,也就是我们先写这个叫做page pass的这样的一个并类,然后呢,我们再去看,哎,它里边有些什么字段,那当然这个字段的就相对来说比较简单了,Private string source对吧,访问路径的,或者说他访问这个路径它是从哪来的对吧,源头,然后呢,还有一个就是target。对吧,他要访问的页面是什么好,然后呢,Private integer value,哎,访问的值,然后呢,我们在这的话呢,我们给它一个呃,实例化的这样的一个空参构造器,对吧,然后我们再来一些get center。
14:10
好。OK。因为我们写后端的话呢,其实它是跟我们的数据库里面编的表呢,呃,进行对应的对吧?就是这些Java并类,我们后面我们在写这个增山查海服务的时候呢,我们就会明白,诶这些病类它到底对应到了哪些表,呃,那么一般情况下来讲的话呢,就是说如果我们负责后端开发,然后有前端的同事来负责前端开发的话呢,呃,那你可能需要跟他沟通一下,就是说你的返回数据的类型对吧,应该是,或者说返回数据的格式应该是怎么样子,这个实际上都是,呃,都是提前会做一个开会啊,进行讨论这样的一个东西,好,我们现在写完并类以后呢,我们就开始写service这样的一个类。对吧,同时来看一下这些病,它到底是呃,如何和数据库里面表对应起来的,好,当然我在这里面再建一个软件包呢,就是stat点。
15:10
什么呢?啊,当然就是service对吧,好,我们就又新建了一个啊,当然你就会发,你就会呃,联想到对吧,我们除了这个service以外呢,可能我们还需要一个controller对吧,我们还需要一个controller。好,那么我们先来看service,当然在service里面呢,我们还是先把数据库的呃,一些信息呢,给它保存在data呃这样的一个类里边,对吧,保存在database这样一个类里边,呃,那么这里边的话呢。我们来看一下数据统计模块呢,我们有两个页面需要提供API,对吧?有两个页面需要提供API,那么第一个页面呢,是实时统计,它的数据都是来自于click house,第二个页面的访问流量统计,它的数据呢,都是来自于哪里呢?都来自于MYCQL里边的,对吧?所以说我们需要从click house和MYCQL呢都会取数据,所以我们在呃,Data with这个类里边的话呢,我们就需要呃,就是说写一些买CQ的信息以及c house的信息,好,那么买CQ的话呢,是在这里面的话是买CQUR对吧?那么它的URL是什么呢?JDBC冒号双买CQ冒号双斜杠,Local host冒号3306。
16:33
对吧,斜杠J帽report,然后问号柚子SSL等于false,好,当然这个j Mo report这样的一个数据库,以及里边的表呢,在我们的文档里边。我们已经告诉大家对吧,如何去创建这样的一个数据库,然后把这个表呢给它建出来对不对?呃,实际上就是在这里边你可以看到诶,我们首先创建一个jama下report这样的一个数据库,然后呢,我们创建一个ADS,什么traffic stas by channel这样的一张表,然后呢,创呃创建了一张表以后呢,把数据插入进去,对吧?把数据插入进去好,然后下面这个呢,我们再创建一张表,在同样数据库jma report里面再插,创建一个ADS配置pass,然后把测试数据给它插进去,对吧?创建这张表以后呢,然后把测试数据给它插进去,所以说我们在这的话呢,我们的MYQ的数据库,我们主要是从贸report来进行呃读取的,然后呢,Public static string myql username等于什么呢?当然我的MYQL呢,肯定是一个root,然后呢。
17:49
买q password等于什么呢?也是等于root对吧,我们之前实际上已经知道了。然后呢,Public static string myq driver等于com点买Cq.CG.jdbc.driver对吧,那这个就是我们的驱动,那是click house相关配置对吧?那上面这个呢,是买CQ相关配置。
18:30
然后我们house的相关配置是什么呢?当然就是public static string。Click house URL对吧?Click house是哪个数据库呢?我们的数据库呢,实际上我是把数据默认的插入到了default这个数据库里边,对吧?Default这个数据库里边local host,因为click house它本身就自带一个default这样的一个数据库啊,那么JDBC冒号click house冒号双斜杠local host,然后它监听的地址是8123,就是我的c house监听地,监听的端口呢是8123对吧?然后数据库是defat,好然后呢,当然我还需要一个颗粒可house的驱动对吧,驱动类,呃,那么这个驱动类是什么呢?这个驱动类就是抗点click click house.gdbc.click click house driver对吧?好,那。
19:38
这样的话呢,我们买CQ和c house的,呃,相关配置呢,就都已经写好了,那么写好以后呢,我们就可以开始写服务了啊,这个服务的话呢,我会把它放在。同一个类里边对吧,那叫做什么类呢,叫做。我们来新建一个Java类,那么这个Java类呢,就叫做static service。
20:04
好。这个是数据统计模块的服务类,对吧,数据统计模块的对吧,什么增删查改操作好。当然我们第一个的话呢,就是获取一天的总交易额,对不对。呃,实际上就是显示在哪里呢?其实就是显示在实施统计的这个今日总交易额这里,对吧?好,我们来编写获取一天的总交易额这样的一个API,呃,这样的一个方法,那就是public static big decim,也就是说我们的总交易额呢,用一个big DA这样的一个长,呃,大整数类型对吧?大整数类型get g MV,那么这个GMV的意思就是总交易额,然后呢,我们的接收的参数呢,是日期对吧?当然我这里面我还是一个串,然后catch CQ exception,然后呢,还是class not found exception,然后呢,我们在这里面别忘了把这个呃,就是说错误站给它打出来,然后return new,一个big DEC对吧?呃,默认的话呢,我们就返回零,然后我们现在就开始从click house里边去查找。
21:29
对吧?呃,既然要从c house这个数据库里面查找的话呢,那么我们使用的这个驱动类,那自然就是。Click house这样的一个driver,好,然后接下来的话呢,我们创建一个和click click house的这样的一个连接,对吧?那么这个连接的话呢,就是data.click click house ul对吧?呃,我们不需要输入用户名和密码,因为我并没有设置用户名和密码,然后我们就可以开始构建查询语句了,那就是哇,Select statement等于connection.prepare statement。
22:18
Select some对吧,Order_amount然后给它起一个别名叫做order_amount,所以说你可以看到这个some order下划amount,实际上就是计算了一个呃,交易总额对吧?然后呢,我们接下来的话呢,呃,我们是从哪个数据库里面进行查找呢?那当然我们就是从product statistics下滑statistics对吧?这个click里的表呢进行查找,然后。然后将我们two yyyy mm DD,对吧,什么意思呢?将我们的start time这个字段。
23:07
对不对,给它转化成年月日,如果等于我们传入的这个日期的话呢,我们就把它的这个数据给它取出来,所以在这的话呢,我们就呃可以。把这个什么呢,占位符给它填上好。填上占位符以后呢,我们就可以开始进行查询了,Wow set等于select statement点。对吧,点execute query,哎,那这个就是我们查询一个呃,数据库的操作,然后呢,Result这个是我们要返回的结果,New big0,我们先执行一个初始化,然后如果result set.next为true,说明我们查到了这个数据,然后你们result等于什么呢?Result set.get big单然后呢,我们要获取的字段当然就是order amount这个字,好,那这样的话呢,我们就获取了一天的总交易额这样的一个数据,对吧,这样的一个数据,然后接下来的话呢,我们把查询语句关闭掉,把这个。
24:25
连接给它关闭掉,然后呢,Return result,把这个结果返回,哎,那这样的一个查询一天的总交易额的,呃,我们的这样的一个就是说方法呢,就已经写完了。
我来说两句