1,为什么要画流程图很多人拿到需求就火急火燎的开始画原型,然后画着画着觉得有些地方没有考虑到,又回头去改,如果在画原型之前,你能将自己的业务流程想好,用户的操作流程想好,页面跳转想清楚,你就能少做很多无用功,达到事半功倍的效果。2,什么是流程图流程图是表示算法、工作流或流程的一种框图表示,它以不同类型的框代表不同种类的步骤,每两个步骤之间则以箭头连接。这种表示方法便于说明解决已知问题的方法。流程图在分析、设计、记录及操控许多领域的流程或程序都有广泛应用。3,流程图常用元素定义4,一般流程图有三种结构:顺序结构、选择结构、循环结构5,常用的三种流程图产品中设计的流程图主要有三种,业务路程图(泳道
写好代码,阿里专家沉淀了一套“如何写复杂业务代码”的方法论,在此分享给大家,相信同样的方法论可以复制到大部分复杂业务场景。一文教会你如何写复杂业务代码了解我的人都知道,我一直在致力于应用架构和代码复杂度的治理。这两天在看零售通商品域的代码。面对零售通如此复杂的业务场景,如何在架构和代码层面进行应对,是一个新课题。针对该命题,我进行了比较细致的思考和研究。结合实际的业务场景,我沉淀了一套“如何写复杂业务代码”的方法论,在此分享给大家。我相信,同样的方法论可以复制到大部分复杂业务场景。一个复杂业务的处理过程业务背景简单的介绍下业务背景,零售通是给线下小店供货的B2B模式,我们希望通过数字化重构传统
安装 node-sasssudo npm i -g node-sassnode-sass 安装失败:gyp ERR! stack Error: EACCES: permission denied, mkdir '.../node-sass/build'或gyp ERR! configure error gyp ERR! stack Error: EACCES: permission denied, mkdir '/usr/local/lib/node_modules/node-sass/.node-gyp'gyp ERR! System Darwin 18.7.0使用 --unsafe-per
本方法不易维护,建议取出数据,在程序中递归,例如 https://javascript.net.cn/article?id=654代码如下:delimiter /
DROP FUNCTION IF EXISTS `getChild` /
CREATE FUNCTION `getChild`(rootId INT)
RETURNS VARCHAR(1000)
BEGIN
DECLARE ptemp varchar(1000);
DECLARE ctemp varchar(1000);
SET ptemp = '#';
SET ctemp =ca
后端篇地址:https://javascript.net.cn/article?id=649相关文档:https://restfulapi.cn/d/271前端代码主要功能是,连接服务器,发送心跳,断开服务器后自动连接。/**
* JSSDK 对象
*/
var PigIM = {
config: {}, // 配置
fromId: {}, // 发送者 ID
ws: {}, // Websocket 对象
connection: {},
listen: {},
heartbeatTimer: {},
物理像素: 顾名思义,就是设备屏幕上的实际像素。也就是说这个手机被出厂造出来的时候,这个屏幕上有多少个像素点,他的物理像素就是多少; 设备独立像素: 也叫做逻辑像素(对于前端来说,和我们的css像素是一样的),这个不同的设备是不一样的。在viewport为ideal-viewport模式时, 如iphone6此时的viewport为375px,代表着我们在css中写375px就可以达到全屏的效果;在移动端中会使用rem方案,来做不同设备间的适配:(function () {
function changeRootFont() {
var designWidth = 750, rem2p
作用:将一个数组转为用逗号分隔的参数序列。//该运算符主要用于函数调用。function push(array, ...items) { array.push(...items);} function add(x, y) { return x + y;} var numbers = [4, 38];add(...numbers) // 42//扩展运算符取代apply方法的一个实际的例子,应用Math.max方法,简化求出一个数组最大元素的写法。// ES5 的写法Math.max.apply(null, [14, 3, 77]) // ES6 的写法Math.max(...[14, 3, 7
body
canvas id="canvas" width="120" height="30" style="cursor: pointer" /canvas
input type="text" id="code" placeholder="不区分大小写"
input type="button" value="验证" onclick="clickEvent()"
/body
/html
script
var numArr = []
var canvas = document.querySelector('#canvas');
css :not()排除函数css:not()函数用来排除选择,not(x),其中的x为css选择器,但是x不能是not选择器,也就是说:not()排除选择器不能嵌套使用。css:not()排除选择器使用.sibcont{
background:#f1f1f1;
border:1px solid #bababa;
margin:20px;
padding:20px;
}
.sibcont ul{
margin:0;
padding:0;
list-style:none;
}
.sibcont ul li{
color:#C91010;
最近探究js原理的过程中遇到了这个挺有趣的问题。先贴代码:var a = {n:1}a.x = a = {n:2}alert(a.x) //undefined在弄懂这个之前,我们先普及一个知识点,就是在javascript运算符中,属性运算符的优先级高于赋值运算符的优先级。因此,a.x是先于赋值之前就进行的。就是说,a.x刚开始是undefined的,这是没错的。接下来我们探究一下连等赋值的赋值顺序:1、从左往右a.x赋值为{n:2};然后a赋值为{n:2};a的重新指向重写了a.x,即.x属性不存在,因此a.x输出为undefined。2、从右往左a赋值为{n:2};直接限制了a.x的赋值,
在文件上传的时候我们我们选择监控change事件来获取文件,如果第一次如果选择了A文件,当再次点开选择A 文件时,change事件没有触发,这时可以用如下方式处理.1. vue项目处理方式:this.$refs.uploadExcelId.value=null;复制该代码到项目中,并且把uploadExcelId换成自己input的ref即可。2. 普通js处理方式:event.target.value=”;尽量不要用删除dom元素,再添加这种操作方式,因为还需要在做事件绑定比较麻烦。
Scss 和 Sass 的区别scss 是 sass的一个升级版本,完全兼容sass之前的功能,又有了些新增能力。语法形式上有些许不同,最主要的就是sass是靠缩进表示嵌套关系,scss是花括号。比如:/*** sass 代码 ***/
.main
width:100px;
.top
width:100px
/*** scss 代码 ***/
.main{
width:100px;
.top{
width:100px;
}
}
编码规则SASS首先会检查代码文件的Unicode BOM(byte order mark),然后是@ch
for和forEach的差别是后者不能正常的跳出循环(return、break等),其它的差别不大,把forEach转成for的写法就知道为什么你的for写法可以顺序执行而forEach不能:for:const report = async () = {
for (let i = 0, len = arr.length; i len; i++) {
await asyncFn(arr[i]);
}
};
forEach:const report = async () = {
arr.forEach(async (item) = {
一、简介在HTTP中,基本认证(Basic access authentication)是一种用来允许网页浏览器或其他客户端程序在请求时提供用户名和口令形式的身份凭证的一种登录验证方式。最明显的特征是,Basic Auth 就是在请求的时候在headers中设置 Authorization: "Basic 用户名和密码的base64加密字符串"。JWT Token 认证,建议把 Token 保存在 Authorization Bearer中。二、访问形式1、使用浏览器在使用浏览器访问设置了 HTTP Basic Auth 的服务器时,会弹出对话框,输入用户名和密码即可。2、使用 HTTP Cl
axios API可以通过向 axios 传递相关配置来创建请求axios(config)// 发送 POST 请求
axios({
method: 'post',
url: '/user/12345',
data: {
firstName: 'Fred',
lastName: 'Flintstone'
}
});
// 获取远端图片
axios({
method:'get',
url:'http://bit.ly/2mTM3nY',
responseType:'stream'
})
.then(function(response) {
1,令牌桶算法(Token Bucket)令牌桶算法(Token Bucket) 随着时间流逝,系统会按恒定1/QPS时间间隔(如果QPS=100,则间隔是10ms)往桶里加入Token,如果桶已经满了就不再加了。新请求来临时,会各自拿走一个Token,如果没有Token可拿了就阻塞或者拒绝服务。令牌桶的另外一个好处是可以方便的改变速度。 一旦需要提高速率,则按需提高放入桶中的令牌的速率。 一般会定时(比如100毫秒)往桶中增加一定数量的令牌, 有些变种算法则实时的计算应该增加的令牌的数量。2,算法实现对于每个 Bucket 设置一个定时器,而一个定时器就是一条线程。那么在你的服务器上,光是分
General 通用信息Request URL:详细地址 如域名,参数传值等信息。Request Method: 请求方式 如:get,post,head,put,delete optionsStatus Code : 返回的状态码 如:200,400,403,500等等Remote Address 请求远程ip 地址Referrer Policy:1、no-referrer-when-downgrade(默认值) 在没有指定任何策略的情况下用户代理的默认行为,在同等安全级别的情况下,引用页面的地址会被发送(HTTPS->HTTPS),但是在降级的情况下不会被发送(HTTPS->HTTP)
一,推荐方法下单渠道1位+支付渠道1位+业务类型1位+时间信息4位+下单时间的Unix时间戳后8位(加上随机码随机后的数字)+用户user id后4位。然后你会说,这样算下来就订单号就19位了啊,一点都不精简啊,不好记不好念不好输的。但我说的上面的这些业务标记,你不一定要全部加上啊。你看淘宝/天猫那么大的订单量,16位订单号就搞定了。细心的网友已经发现了,订单号的后4位是取自用户user id的后四位,前12位中有10位可能是由Unix时间戳加随机规则生成的。二,从用户体验和数据库优化的角度来看1.利用数据库主键值产生一个自增长的订单号(订单号即数据表的主键)2.日期+自增长数字的订单号(比如
1, 指定了AUTO_INCREMENT的列必须要建索引,不然会报错,索引可以为主键索引,当然也可以为非主键索引。(不一定要做主键)2, 指定了auto_increment的列,在插入时:如果把一个NULL插入到一个AUTO_INCREMENT数据列里去,MySQL将自动生成下一个序列编号。编号从1开始,并1为基数递增。3,当插入记录时,没有为AUTO_INCREMENT明确指定值,则等同插入NULL值。4,如果插入的值大于已编号的值,则会把该插入到数据列中,并使在下一个编号将从这个新值开始递增。5,对于MyISAM表,如果用UPDATE命令更新自增列,如果列值与已有的值重复,则会出错。如果
Transaction是Sequelize中用于实现事务功能的子类,通过调用Sequelize.transaction()方法可以创建一个该类的实例。在Sequelize中,支持自动提交/回滚,也可以支持用户手动提交/回滚。1. 事务的使用Sequelize有两种使用事务的方式:基于Promise结果链的自动提交/回滚另一种是不自动提交和回滚,而由用户控制事务 1.1 受管理的事务(auto-callback)受管理的事务会自动提交或回滚,你可以向sequelize.transaction方法传递一个回调函数来启动一个事务。需要注意,在这种方式下传递给回调函数的transaction会返回一个
所有标签