设计模式系列-简单工厂模式
介绍为了更好的管理创建对象,我们通常使用工厂模式
① new 对象的话,一旦代码有变化或者拓展,就必须改变原来的代码,也就是说你的代码不 “ 对修改关闭 ”
设计原则之一:对扩展开放,对修改关闭
② 解耦,便于更新和维护
栗子项目目录
UML 图
代码Mouse.php
1234567<?phpinterface Mouse{ public function click();}
WinMouse.php
12345678910<?phpclass WinMouse implements Mouse{ public function click() { return 'win mouse click'; }}
MacMouse.php
12345678910<?phpclass MacMouse implements Mouse{ public function click() { return ...
权重系统设计思路
简介权重通常是指某一因素或指标相对于某一事物的重要程度。在电商中我们可以根据用户行为进行数据埋点,进而对其进行权重配分,更专业的叫法就是 用户画像 。不同的角度有不同的叫法,但是权重主要还是为了帮助我们更好的了解使用者的使用轨迹。
模块主要划分为下面三个模块
规则
聚合统计
数据埋点
规则根据数据进行权重配分,因为每个数据的配分都是不同的。比如:用户每天登录一次游戏,那么就加一分这样。然后对于分值大于某个值后可以春节发个积极奖等等。
聚合统计根据埋点获取到的数据进行聚合,比如:将每天的数据聚合成每个月,然后再匹配当前的规则进行权重配分。
数据埋点根据前端对接埋点接口,然后将数据落地,数据的来源基本来自埋点。具体如何设计埋点可以看看那这一篇文章。如何做好数据埋点?
例子权重系统在之前工作当中有实施过,现在大概说一下当时的情况。
定时任务拉取各个微服务系统的埋点数据
定时任务对当天数据根据权重规则进行配分并按天将数据落地
定时任务根据业务对数据进行聚合处理
规则定义12345678910CREATE TABLE `rule_path` ( `id` ...
vue-seo整体流程
序为了增加博客的流量,所以做一个 seo 优化。
工作流程
使用 go 搭建一个 http 服务,并具备缓存功能。(浏览器执行最少 7s 时间)
部署 python 编写的一个 automationFramework 项目,用来执行具体的请求渲染
nginx 对爬虫头信息识别,并对其反向代理到 go 的 http 服务中
HTTP的content-type不同导致数据获取问题
序今天在前后端对接接口的时候,前端使用 POST 请求发送 t[0][0] = 1, t[0][1] = 2 的参数过来,然后我这边获取到的却是字符串的类型。
12345t[0][0] = "1"t[0][1] = "2"t = [["1"], ["2"]];
问题排查首先我要排查是否是我这边将二维数组转字符串时出错导致的,所以我这边直接使用
1234php -r "var_dump(json_encode([[1], [2]]));"t = [[1], [2]];
结果显示是和我转字符串没有关系。然后我直接打印传递过来的参数,确实是 [["1"], ["2"]] 这个字符串。所以可以确定的是前端传过来的确实是字符串。
知识储备因为之前有看过 图解 HTTP 所以我记得 content-type 这个字段不同会导致 HTTP 会用不同的方式传递参数。
application/x-www-form-urlencode ...
博客部署线上环境
准备工作
安装 git 软件,这样子才能够快速从 github 中将代码拉取到服务器。
1yum install -y git
安装成功后,我们可以验证一下
1git version
有如下信息展示,那就是安装成功了。
后端是使用 go 进行开发的,所以要安装 go 软件。首先我们可以在官网中找到源码下载地址 go 源码下载地址
找到相关的版本,这里我直接使用最新版123wget https://golang.google.cn/dl/go1.15.2.linux-amd64.tar.gztar -zxvf go1.15.2.linux-amd64.tar.gz
下载解压完成后,我们就会有一个 go 的目录了。
我们进入到 go 目录中,会发现有一个 bin 目录,在这个目录当中我们就可以直接使用 go version 来查看是否已经解压成功了。
接着我们就需要将 go 命令放到全局命令当中去。1ln -s /path/go/bin/go /usr/local/bin/
这样子我们就可以在命令行中直接使用 go 命令了。
后端会使用到数据库,所以接着就是安装 mysq ...
教程组件设计开发思路
设计初衷编写代码过程中最讨厌的就是重复的事情做的多过 3 次,所以在做项目当中自己不多不少都会有一种写复用代码的冲动。
思路自己看过最多的论坛就是 Laravel 的,里面也有教程这个功能,自己很大一种程度就是想模仿这个功能。
教程有两点:
菜单栏
内容跟着菜单联动
所以这里面我们就明白知道,菜单栏与教程内容是关联关系的。然后看见大部分网上的教程都是采用不同的 url 来对每个菜单进行跳转的。
实践需求分析明白后,在生成菜单这里就遇到坑。如果是采用不同的 url 的话就会要在生成菜单的时候要填写 url , 而这个 url 明显是要英文字母的。这个有打算使用拼音来解决,不过因为时间成本有点高最后就放弃了。要做这个需求那么我就要将这个组件封装的非常复杂,要动态添加路由进去,这个明显是不符合的。
最后决定使用一开始将所有数据全部查询出来,然后点击不同的菜单,然后赋值到 mavon-editor 这个组件中去。
组件目录结构:
12345│ Index.vue│└─Menu Menu.vue SubMenu.vue
Index.vue 文件
123456 ...
Vue动态路由
为什么使用动态路由?因为后台会存在角色,角色中会有不同的菜单数据,这里面就会出现路由不能写死的问题?如何解决,上动态路由。
设计思路
登录的时候对异步请求数据保存到 localstorage 中
在 router.beforeEach 路由守卫中添加 localstorage 菜单数据加载
根据加载的菜单数据,递归加载组件,因为本地只保存 component 路径
最后使用 router.addRoutes 将组装好的数据填充进来就完成了
坑点为什么路由不报错,进入该路由界面无显示任何数据?这是因为思想出问题了,一开始在登录中将 component 直接 import 进来了,然后再保存到 localstorage 。所以理所当然认为本地保存了组件信息,这个和周总(同事)讨论过。他也不知道怎么回事,但是我突然就说没有加载组件进来,果然陷入思维困局需要第二者。
解决方案:component 字段保存组件路径,在需要加载的时候再 import 进来。
123456789101112131415161718192021function BuildRoutes(routes) { ...