显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

@fc_lamp

关注Web应用解决方案MySql/PHP/Python一盏名为"飞川"的灯~

 
 
 
 
 
 

HTML5 网页保存为图片下载【转】

2018-1-24 10:13:19 阅读202 评论0 242018/01 Jan24

来源:https://juejin.im/post/5a17c5e26fb9a04527254689

1. 需求

最近丁香医生的产品大佬又双叒叕搞事情,想要在 H5 中做一个医生邀请提问的功能,可以将医生的二维码名片分享出去,支持移动、PC 和微信。之前的图片是由后端生成的,并且会缓存三天,导致信息更新不及时。由前端来做就能避免这些问题。

我一听,这好说,不就是个保存图片的功能么,简单看看需求:

完善卡片信息,分享出去时候信息更加立体 编辑个人资料入口 保存图片入口 可解决医生名片缓存时间问题 长下面这样 ?

分析下来就两点

html展示实时用户信息点击保存将当前页面保存成图片至本地,并且不包含功能按钮

2. 方案

因为之前已经听说过有个库能将 HTML 转为 canvas,然后又听说 canvas 能转为图片,然后又听说图片能下载....(开发基本靠听说(搜索),这是废话)

那我的基本方案就是:

html -> canvas -> image -> a[download]

html2canvas.js:可将 htmldom 转为 canvas 元素。传送门 canvasAPI:toDataUrl()

作者  | 2018-1-24 10:13:19 | 阅读(202) |评论(0) | 阅读全文>>

在电商系统中,到底要怎么扣减库存?

2017-6-14 23:30:28 阅读242 评论0 142017/06 June14

来源:58沈剑

业务复杂、数据量大、并发量大的业务场景下,典型的互联网架构,一般会分为这么几层:

调用层,一般是处于端上的browser或者APP

站点层,一般是拼装html或者json返回的web-server层

服务层,一般是提供RPC调用接口的service层

数据层,提供固化数据存储的db

对于库存业务,一般有个库存服务,提供库存的查询、扣减、设置等RPC接口:

库存查询,stock-service本质上执行的是

select num from stock where sid=$sid

库存扣减,stock-service本质上执行的是

update stock set num=num-$reduce where sid=$sid

库存设置,stock-service本质上执行的是

update stock set num=$num_new where sid=$sid

用户下单前,一般会对库存进行查询,有足够的存量才允许扣减:

如上图所示,通过查询接口,得到库存是5。

用户下单时,接着会对库存进行扣减:

如上图所示,购买3单位的商品,通过扣减接口,最终得到库存是2。

希望设计往往有容错机制,例如“重试”,如果通过扣减接口来修改库存,在重试时,可能会得到错误的数据,导致重复扣减:

如上图所示,如果数据库层面有重试容错机制,可能导致一次扣减执行两次,最终得到一个负数的错误库存。

作者  | 2017-6-14 23:30:28 | 阅读(242) |评论(0) | 阅读全文>>

客户端(浏览器端)数据存储技术概览

2017-3-15 14:37:25 阅读218 评论0 152017/03 Mar15

在客户端(浏览器端)存储数据有诸多益处,最主要的一点是能快速访问(网页)数据。(以往)在客户端有五种数据存储方法,而目前就只有四种常用方法了(其中一种被废弃了):

CookiesLocal StorageSession StorageIndexedDBWebSQL (被废弃)[fc_lamp: 在基于WebKit 的浏览器是支持 sqllite操作]Cookies

Cookies 是一种在文档内存储字符串数据最典型的方式。一般而言,cookies 会由服务端发送给客户端,客户端存储下来,然后在随后让请求中再发回给服务端。这可以用于诸如管理用户会话,追踪用户信息等事情。

此外,客户端也用使用 cookies 存储数据。因而,cookies 常被用于存储一些通用的数据,如用户的首选项设置。

Cookies 的 基本CRUD 操作

通过下面的语法,我们可以创建,读取,更新和删除 cookies:

// Create

document.cookie = "user_name=Ire Aderinokun";

document.cookie = "user_age=25;max-age=31536000;secure";

// Read (All)

console.log( document.cookie );

// Update

document.cookie = "user_age=24;max-age=31536000;secure";

作者  | 2017-3-15 14:37:25 | 阅读(218) |评论(0) | 阅读全文>>

正则表达试分组语法(?xxx)

2017-1-4 10:32:57 阅读56 评论0 42017/01 Jan4

常用分组语法分类代码/语法说明捕获(exp)匹配exp,并捕获文本到自动命名的组里(?<name>exp)匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)(?:exp)匹配exp,不捕获匹配的文本,也不给此分组分配组号零宽断言(?=exp)匹配exp前面的位置(?<=exp)匹配exp后面的位置(?!exp)匹配后面跟的不是exp的位置(?<!exp)匹配前面不是exp的位置注释(?#comment)这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读

来源:

作者  | 2017-1-4 10:32:57 | 阅读(56) |评论(0) | 阅读全文>>

在Windows下编译PHP和PHP扩展

2016-8-15 11:49:38 阅读147 评论0 152016/08 Aug15

提醒:在Windows下编译PHP和扩展比linux下麻烦很多,你需要找对编译器,找对PHP源码版本、找对系统架构(X64还是X86)......反正各种匹对。以下为,参考文章,本人亲自测试,是可行,但是过程很繁琐。

官网参考:https://wiki.php.net/internals/windows/stepbystepbuild

本文源:  http://www.zhaoyuanma.com/article/12.html

需要的文件编译器。这里以VC++ 11(Visual Studio 2012)为例,它可以编译PHP 5.5(官方支持)和5.4(可用)。对应地,VC++ 9(Visual Studio 2008 SP1,需要Windows SDK 6.1)可以编译PHP 5.4(官方支持)和5.3(官方支持)。PHP的官方Wiki上有详细的编译器支持列表(英文)。

PHP源代码。推荐从官网下载。

PHP SDK。需要从这里下载两个压缩包:

作者  | 2016-8-15 11:49:38 | 阅读(147) |评论(0) | 阅读全文>>

GIT 常用命令集

2016-8-11 11:48:11 阅读101 评论0 112016/08 Aug11

源:http://foofish.net/blog/104/git-command

新建/克隆代码库$ git init #当前目录新建一个Git代码库 $ git init [project-name] #新建一个目录,将其初始化为Git代码库 $ git clone [url] #下载一个项目和它的整个代码历史 $ git fetch [url] #下载/同步项目到 添加/删除文件$ git add [file1] [file2] ... # 添加指定文件到暂存区 $ git add [dir] # 添加指定目录到暂存区,包括子目录 $ git add . # 添加当前目录的所有文件到暂存区 $ git rm [file1] [file2] ... # 删除工作区文件,并且将这次删除放入暂存区 $ git rm --cached [file] # 停止追踪指定文件,但该文件会保留在工作区 $

作者  | 2016-8-11 11:48:11 | 阅读(101) |评论(0) | 阅读全文>>

关于Python中的下划线

2016-8-11 11:43:04 阅读124 评论0 112016/08 Aug11

一 关于下划线:

    单下划线开头的变量,Pyhthon规定为内部变量(私有变量),from M import * 时,这种变量并不会导入进来,例如:

foo.py

#foo.py

bar = 10

bar2 = 11

_bar = 20

__bar = 30

foo2.py

#foo2.py

from foo import *

if __name__ == '__main__':

print locals()

执行 python foo2.py,输出:

{'bar2': 11, 'bar': 10, '...省略'}

输入结果中并没有 _bar和__bar,因为它们都是以下划线开头的变量,所以没有导入进来,但是如果你非要把这些变量导入进来也是可以的,使用import时,明确导入具体的变量时就行了。如:

#foo2.py

from foo import *

from foo import _bar

from foo import __bar

if __name__ == '__main__':

print locals()

输出:

{'_bar': 20, 'bar2': 11, 'bar': 10, '__bar': 30, ‘...省略'}

作者  | 2016-8-11 11:43:04 | 阅读(124) |评论(0) | 阅读全文>>

MYSQL 数据库开发规范

2016-8-4 0:20:41 阅读127 评论0 42016/08 Aug4

基本命名和约束规范

表字符集选择UTF8 ,如果需要存储emoj表情,需要使用UTF8mb4(MySQL 5.5.3以后支持)

存储引擎使用InnoDB

变长字符串尽量使用varchar varbinary

不在数据库中存储图片、文件等

单表数据量控制在1亿以下

库名、表名、字段名不使用保留字

库名、表名、字段名、索引名使用小写字母,以下划线分割 ,需要见名知意

库表名不要设计过长,尽可能用最少的字符表达出表的用途

字段规范

所有字段均定义为NOT NULL ,除非你真的想存Null

字段类型在满足需求条件下越小越好,使用UNSIGNED存储非负整数 ,实际使用时候存储负数场景不多

使用TIMESTAMP存储时间

使用varchar存储变长字符串 ,当然要注意varchar(M)里的M指的是字符数不是字节数;使用UNSIGNED INT存储IPv4 地址而不是CHAR(15) ,这种方式只能存储IPv4,存储不了IPv6

使用DECIMAL存储精确浮点数,用float有的时候会有问题

少用blob text

关于为什么定义不使用Null的原因

* 1.浪费存储空间,因为InnoDB需要有额外一个字节存储

* 2.表内默认值Null过多会影响优化器选择执行计划

索引规范

单个索引字段数不超过5,单表索引数量不超过5,索引设计遵循B+ Tree索引最左前缀匹配原则

作者  | 2016-8-4 0:20:41 | 阅读(127) |评论(0) | 阅读全文>>

MySQL TIPS(一次性批量更新不同值)

2016-7-13 10:52:20 阅读86 评论0 132016/07 July13

一 case when.... 计算条件列表并返回多个可能结果表达式

SELECT <myColumnSpec> = 

CASE 

WHEN <A> THEN <somethingA> 

WHEN <B> THEN <somethingB> 

ELSE <somethingE> 

END

例如用于查询:

SELECT 

    Title, 

    'Price Range' = 

    CASE 

        WHEN price IS NULL THEN 'Unpriced' 

        WHEN price < 10 THEN 'Bargain' 

        WHEN price BETWEEN 10 and 20 THEN 'Average' 

        ELSE 'Gift to impress relatives' 

    END 

FROM titles 

ORDER BY price

用于数据批理更新:

UPDATE tbl_test SET val = CASE id WHEN 1 THEN 2 WHEN 2 THEN 3 END WHERE id IN(1, 2);

update test set varchar_= case char_ when 1 then 'a' when 2 then 'b' when 3 then 'c' end where char_ in(1,2)

作者  | 2016-7-13 10:52:20 | 阅读(86) |评论(0) | 阅读全文>>

再次深入理解python import 机制

2016-7-6 0:59:39 阅读241 评论0 62016/07 July6

之前写过一个python import的基础篇,点击这里查看》。

今天来看看更深入的理解:

Python 类库引入机制

首先,看一个简单的例子:

"""

目录结构如下:

├── __init__.py

├── main.py

└── string.py

"""

# main.py 内容如下

import string

print string.a

# string.py 内容如下

a = 2

现在,考虑一下:

当我们执行main.py的时候,会发生什么事情?在main.py文件执行到import string的时候,解释器导入的string类库是当前文件夹下的string.py还是系统标准库的string.py呢?如果明确的指明?己要引?的类库?

为了搞清楚上面的问题,我们需要了解关于Python类库引入的机制。

Python的两种引入机制

Python 提供了二种引入机制:

relative importabsolute importrelative import

relative import 也叫作相对引入,在Python2.5及之前是默认的引入方法。它的使用方法如下:

作者  | 2016-7-6 0:59:39 | 阅读(241) |评论(0) | 阅读全文>>

查看所有日志>>

 
 
 
 
 
 

有道博客搜索

 
 
 
 
 
 
 

四川省 成都市

 发消息  写留言

 
博客等级加载中...
今日访问加载中...
总访问量加载中...
最后登录加载中...
 
 
 
 
 

日志分类

 
 
日志分类列表加载中...
 
 
 
 
 
 
 
模块内容加载中...
 
 
 
 
 
 我要留言
 
 
 
留言列表加载中...
 
 
 
 
 
 
 
博友列表加载中...
 
 
 
 
 

小工具

 
 
模块内容加载中...
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018

注册 登录  
 加关注