Comparing version 0.4.1 to 0.5.1
febs 库是一些常用的工具的合集; | ||
`febs是在citong@2.0.8基础上进行开发, citong库已停止更新` | ||
# Install | ||
@@ -12,6 +10,45 @@ | ||
``` | ||
copy directory `node_modules/febs/dist/febs` to client | ||
![](doc/framework.jpg) | ||
# nodejs | ||
以下列方式使用 | ||
```js | ||
var febs = require('febs'); | ||
// | ||
febs.string.replace(); | ||
``` | ||
# browser | ||
以下列方式使用 | ||
> copy directory `node_modules/febs/dist/febs` to client | ||
```html | ||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> <!-- 如ie9等早期浏览器提示使用最新渲染器 --> | ||
<link rel="stylesheet" type="text/css" href="path/febs/febs.css" /> | ||
<script charset='UTF-8' type="text/javascript" src="path/febs/febs.min.js"></script> | ||
<script> | ||
febs.string.replace(); | ||
</script> | ||
``` | ||
# babel | ||
以下列方式使用 | ||
```js | ||
import febs from 'febs/client'; // 使用febs的客户端部分代码. | ||
// | ||
febs.string.replace(); | ||
``` | ||
# framework | ||
![](doc/framework.png) | ||
febs web库分为客户端与服务器端; | ||
@@ -23,6 +60,5 @@ | ||
- [crypt](#crypt) | ||
- [controls](#controls) | ||
- 客户端独有库 | ||
- [nav](#nav) | ||
- [animationFrame](#animationFrame) | ||
- [net](#net) | ||
@@ -33,19 +69,11 @@ | ||
- [file](#file) | ||
- [upload](#upload) | ||
# 说明 | ||
> 客户端 | ||
客户端中已将旧版本中的jquery依赖的相关内容抽出到 [febs-ui](https://www.npmjs.com/package/febs-ui) 库中, `febs`将不再依赖 `jquery`. (ie9以下浏览器需要jquery/zepto). | ||
使用时需依赖 `jquery`, `jquery.form` 这个两个库. | ||
```js | ||
<script src="jquery.min.js"></script> | ||
<script src="jquery.form.min.js"></script> | ||
<script src="febs.min.js" charset="UTF-8"></script> | ||
``` | ||
* 定义了`window.requestAnimationFrame`和`window.cancelAnimationFrame`方法,可进行动画帧操作. | ||
* 对浏览器添加了`Promise`支持. | ||
> 服务端 | ||
* 定义了如下一些全局变量 | ||
服务端定义了如下一些全局变量 | ||
| name | description | | ||
@@ -59,4 +87,6 @@ |----------------|-------------| | ||
* 函数调用使用 `类名.xxx` 的方式调用, 例如: `febs.utils.browserIsMobile()` | ||
* 实现了部分控件, 网页模板在 `febs/client/partials` 路径下, 使用`handlebar`实现 | ||
* 对早期的浏览器定义了`window.requestAnimationFrame`和`window.cancelAnimationFrame`方法,可进行动画帧操作. | ||
* 对早期的浏览器添加了`Promise`支持. | ||
# utils | ||
@@ -100,2 +130,11 @@ | ||
/** | ||
* @desc: 判断是否是ie. | ||
*/ | ||
febs.utils.browserIsIE() | ||
/** | ||
* @desc: 判断ie版本号. | ||
* @return number. 非ie返回Number.MAX_SAFE_INTEGER. | ||
*/ | ||
febs.utils.browserIEVer() | ||
/** | ||
* @desc: the browser is support html5. | ||
@@ -229,41 +268,37 @@ */ | ||
目前提供了uuid,crc32,base64. | ||
服务端独有. | ||
```js | ||
/** | ||
* @return 生成一个uuid字符串. | ||
*/ | ||
febs.crypt.uuid() | ||
* @desc: 计算md5. | ||
* @return: string | ||
*/ | ||
febs.crypt.md5( strOrBuffer ) | ||
/** | ||
* @desc: 计算字符串的crc32值 | ||
* @param crc 可以在这个值得基础上继续计算 | ||
* @return: number. | ||
* @desc: 直接对文件进行计算. | ||
* @param filename: 文件路径 | ||
* @return: string | ||
*/ | ||
febs.crypt.crc32( str, crc ) | ||
febs.crypt.md5_file(filename) | ||
/** | ||
* @desc: 通过文件表单控件进行文件的crc32计算. | ||
* @param fileObj: 表单文件对象, 例如表单为: | ||
* <form enctype="multipart/form-data"> | ||
* <input id="file" type="file" name="file" multiple> | ||
* </form> | ||
* $('#file')[0].files[0] 即为第一个文件对象. | ||
* @param cb: function(crc32) {}; 计算出来的crc32通过回调函数返回 | ||
* @desc: 计算sh1. | ||
* @return: string | ||
*/ | ||
febs.crypt.crc32_file(fileObj, cb) `客户端` | ||
febs.crypt.sha1( strOrBuffer ) | ||
/** | ||
* @desc: 直接对文件进行计算. | ||
* @param filename: 文件路径 | ||
* @return: number | ||
* @return: string | ||
*/ | ||
febs.crypt.crc32_file(filename) `服务端` | ||
febs.crypt.sha1_file(filename) | ||
/** | ||
* @desc: base64编码. | ||
* @param arrByte: 字节数组. | ||
* @return: string. | ||
* @return 生成一个uuid字符串. (uuid v1) | ||
*/ | ||
febs.crypt.base64_encode(arrByte) `客户端` | ||
febs.crypt.uuid() | ||
/** | ||
* @desc: base64解码. | ||
* @return: 字节数组. | ||
*/ | ||
febs.crypt.base64_decode(strBase64) `客户端` | ||
* @desc: 直接对文件进行计算. | ||
* @param filename: 文件路径 | ||
* @return: number | ||
*/ | ||
febs.crypt.crc32_file(filename) | ||
/** | ||
@@ -280,65 +315,69 @@ * @desc: 使用上次的解码的数据继续进行base64解码. | ||
*/ | ||
febs.crypt.base64_decode(strBase64, c2 = 0, c3 = 0, c4 = 0) `服务端` | ||
febs.crypt.base64_decode(strBase64, c2 = 0, c3 = 0, c4 = 0) | ||
``` | ||
# nav | ||
导航是以ajax的方式进行页面切换 | ||
客户端独有. | ||
```js | ||
/** | ||
* @desc: 使用跳转函数初始化. | ||
* @param navCallback: function(object); 触发页面切换时的回调. | ||
* @param urlObjEquelCallback: function(obj1, obj2) : bool; 判断两个页面是否相等. | ||
* @param options: { | ||
defaultTimeout: 10000, | ||
} | ||
* @return: | ||
* @desc: 通过文件表单控件进行文件的crc32计算. | ||
* @param fileObj: 表单文件对象, 例如表单为: | ||
* <form enctype="multipart/form-data"> | ||
* <input id="file" type="file" name="file" multiple> | ||
* </form> | ||
* $('#file')[0].files[0] 即为第一个文件对象. | ||
* @param cb: function(crc32) {}; 计算出来的crc32通过回调函数返回 | ||
*/ | ||
febs.nav.init(navCallback, urlObjEquelCallback, options) | ||
febs.crypt.crc32_file(fileObj, cb) | ||
/** | ||
* @desc: 跳转至指定位置. | ||
* @param urlObject: null则当前页面刷新. | ||
* @return: | ||
*/ | ||
febs.nav.go(urlObject) | ||
* @desc: base64解码. | ||
* @return: 字节数组. | ||
*/ | ||
febs.crypt.base64_decode(strBase64) | ||
``` | ||
通用. | ||
```js | ||
/** | ||
* @desc: 记录一个新页面. | ||
* @param urlObject: 包含参数等链接的信息. | ||
* @return: 浏览器锚点url. | ||
* @desc: 计算字符串的crc32值 | ||
* @param crc 可以在这个值得基础上继续计算 | ||
* @return: number. | ||
*/ | ||
febs.nav.push(urlObject) | ||
febs.crypt.crc32( str, crc ) | ||
/** | ||
* @desc: 刷新页面. | ||
*/ | ||
febs.nav.refresh() | ||
/** | ||
* @desc 刷新指定元素. | ||
* @param elem: jquery对象. | ||
*/ | ||
febs.nav.refresh_elem(elem, url); | ||
/** | ||
* @desc: ajax 跳转. | ||
* @param option:例如: (详见jquery.ajax) | ||
{ | ||
type: "GET", | ||
url: url, | ||
data: null, | ||
success: cb | ||
} | ||
* @return: | ||
*/ | ||
febs.nav.ajax( option ) | ||
/** | ||
* @desc: 寻找指定的url | ||
* @return: url. | ||
*/ | ||
febs.nav.url(anchor) | ||
* @desc: base64编码. | ||
* @param arrByte: 字节数组. | ||
* @return: string. | ||
*/ | ||
febs.crypt.base64_encode(arrByte) | ||
``` | ||
# animationFrame | ||
各浏览器兼容的 `requestAnimationFrame`, `cancelAnimationFrame` 动画方法. | ||
```js | ||
var total = 0; | ||
var timer; | ||
var now = Date.now(); | ||
function foo(tm) { | ||
var now2 = Date.now(); | ||
total += now2-now; | ||
now = now2; | ||
if (total > 10000) { | ||
cancelAnimationFrame(timer); | ||
} else { | ||
timer = requestAnimationFrame(foo); | ||
} | ||
} | ||
timer = requestAnimationFrame(foo); | ||
``` | ||
# net | ||
net封装了浏览器通信方法: ajax, fetch, jsonp | ||
net封装了浏览器通信方法: fetch, jsonp | ||
```js | ||
/** | ||
* @desc: 进行ajax请求, 同 febs.nav.ajax. | ||
*/ | ||
febs.net.ajax(option) | ||
/** | ||
* @desc: 使用fetch方式进行数据请求. | ||
@@ -364,3 +403,3 @@ * 如果超時, 可以catch到 'timeout' | ||
.then(data=>{}) | ||
.catch(err=>{ | ||
['catch'](err=>{ | ||
if (err === 'timeout) // 超时. | ||
@@ -383,3 +422,3 @@ }); | ||
.then(data=>{}) | ||
.catch(err=>{ | ||
['catch'](err=>{ | ||
if (err === 'timeout) // 超时. | ||
@@ -491,60 +530,66 @@ }); | ||
# controls | ||
# upload | ||
### loading | ||
## multipart/form-data方式上传. | ||
![](doc/ui/control-loadding.jpg) | ||
```js | ||
/** | ||
* @desc: 当前是否显示. | ||
* @return boolean. | ||
*/ | ||
febs.controls.loading_isVisiable() | ||
* 接收上传文件内容. 接收客户端 multipart/form-data方式上传的数据. | ||
* @param conditionCB: async function(data, filesize, filename, filemimeType):string. | ||
* - data: 用户上传的数据. | ||
* - filesize: 将要存储的文件大小. | ||
* - filename: 上传的文件名. | ||
* - filemimeType: 文件类型, 例如: 'image/jpeg'. | ||
* - return: 存储的文件路径, 返回null表示不存储. | ||
* @return Promise. | ||
* @resolve | ||
* - bool. 指明是否存储成功. | ||
*/ | ||
febs.upload.accept(ctx, conditionCB) | ||
``` | ||
## base64数据流分段方式上传. | ||
```js | ||
/** | ||
* @desc: 使用延时显示加载框. | ||
* @param text: 提示文本. | ||
* @param timeout: 延时显示, 默认为0. | ||
* @return: | ||
*/ | ||
febs.controls.loading_show(text, timeout) | ||
* 准备接收上传文件. | ||
* @param conditionCB: async function(data, filesize):string. | ||
* - filesize: 将要存储的文件大小(base64大小) | ||
* - data: 用户上传的数据. | ||
* - return: 本地存储的文件路径, 返回null表示不存储. 存储的文件必须不存在. | ||
* @param sessionSet: function(data){} 用于设置存储在session中的临时文件信息; | ||
* @return Promise. | ||
* @resolve | ||
* - bool. 指明是否开始接收文件流. | ||
*/ | ||
febs.upload.base64_acceptHeader(ctx, conditionCB, sessionSet) | ||
``` | ||
```js | ||
/** | ||
* @desc: 通过每500ms改变文本的方式显示加载框; 例如显示 3,2,1,3,2,1循环显示. | ||
* @param textArray: 变化的文本数组. | ||
* @param changeTextCB: 当前显示文本的回调. function(text). | ||
* @param hideCB: 隐藏加载框时的设置文本的函数. function(). | ||
* @return: | ||
*/ | ||
febs.controls.loading_show_text(textArray, changeTextCB, hideCB) | ||
/** | ||
* @desc: 隐藏加载对话框 | ||
* @return: | ||
*/ | ||
febs.controls.loading_hide() | ||
* 上传文件内容. | ||
* 发生错误会自动调用 cleanup | ||
* @param finishCB: async function(filename):object. | ||
* - filename: 本地存储的文件名. | ||
* - return: 返回给客户端的数据. 不能包含err数据. | ||
* | ||
* @param sessionGet: function() {} 用于获取存储在session中的临时文件信息; | ||
* @param sessionSet: function(data){} 用于设置存储在session中的临时文件信息; | ||
* @param sessionClear: function() {} 用于清除存储在session中的临时信息 | ||
* @return Promise | ||
* @resolve | ||
*/ | ||
febs.upload.base64_accept(ctx, finishCB, sessionGet, sessionSet, sessionClear) | ||
``` | ||
### page | ||
![](doc/ui/control-page.jpg) | ||
```js | ||
/** | ||
* @desc: 初始化page控件. | ||
* @param elem: 将控件插入到elem中, elem是一个jquery的对象. | ||
* @param curPage: 当前页 | ||
* @param pageCount: 总页数 | ||
* @param totalCount: 总条数 | ||
* @param pageCallback: 页面跳转函数, function(page) {} | ||
* @desc: 在用户登出或其他中断传输中清除上传的数据. | ||
* @param sessionGet: function() {} 用于获取存储在session中的临时文件信息; | ||
* @param sessionClear: function() {} 用于清除存储在session中的临时信息 | ||
* @return: | ||
*/ | ||
febs.controls.page_init(elem, curPage, pageCount, totalCount, pageCallback) | ||
febs.upload.base64_cleanup(sessionGet, sessionClear, cleanFile = true) | ||
``` | ||
### upload | ||
#### multipart/form-data方式上传. | ||
## multipart/form-data方式实例 | ||
@@ -563,52 +608,24 @@ ```js | ||
* 后台: | ||
* 1. 在uploadUrl中调用 await require('febs').controls.upload.accept(app, conditionCB); 当满足条件时将存储, 并返回true表示成功. | ||
* 1. 在uploadUrl中调用 await require('febs').upload.accept(ctx, conditionCB); 当满足条件时将存储, 并返回true表示成功. | ||
*/ | ||
``` | ||
客户端调用如下接口上传文件. | ||
/** 需要 jquery,jquery.form 库支持. | ||
* 并且 <input type="file" name="file"... 中, 必须存在name属性. | ||
* 使用post方式上传文件. | ||
* @param cfg: object, 其中 | ||
* { | ||
* data: , // 上传到服务器的任意字符串数据. | ||
* formObj: , // 含有enctype="multipart/form-data"的form | ||
* fileObj: , // form中的file对象 | ||
* uploadUrl: , // 上传文件内容的url. 系统将自动使用 uploadUrl?crc32=&size=的方式来上传. | ||
* maxFileSize: , // 允许上传的最大文件.0表示无限制.默认为0 | ||
* fileType: , // 允许的文件类型. 如: image/gif,image/jpeg,image/x-png | ||
* finishCB: , // 上传完成后的回调. function(err, fileObj, serverData) | ||
* // err: - 'no file' 未选择文件. | ||
* // - 'size too big' 文件太大. | ||
* // - 'check crc32 err' 计算本地文件hash值时错误. | ||
* // - 'ajax err' ajax上传时出错. | ||
* // serverData: 服务器返回的数据. | ||
* progressCB: , // 上传进度的回调. function(fileObj, percent), | ||
* headers: { // 设置request headers | ||
* 'customHeader': 'value' | ||
* }, | ||
* crossDomain: true, // 跨域, 默认为true | ||
* withCredentials: true, // 是否附带cookie, 默认为true | ||
* } | ||
* function control_upload(cfg) | ||
*/ | ||
客户端使用multipart/form-data方式上传文件时, 需使用url参数上传如下参数: | ||
| name | description | | ||
|----------------|-------------| | ||
| crc32 | 文件内容的crc32计算值 | | ||
| size | 文件字节大小 | | ||
| data | (可选) 自定义数据; 自定义数据会在字节流上传完成后, 通过回调传递. | | ||
> 例如: 上传url为 `/upload?crc32=2134141&size=11231` | ||
也可以在浏览器端直接使用 `febs-ui` 中的上传方法. | ||
服务端调用如下接口接收文件. | ||
/** | ||
* 接收上传文件内容. | ||
* @param conditionCB: async function(filesize, filename, filemimeType):string. | ||
* - filesize: 将要存储的文件大小. | ||
* - filename: 上传的文件名. | ||
* - filemimeType: 文件类型, 例如: 'image/jpeg'. | ||
* - return: 存储的文件路径, 返回null表示不存储. | ||
* @return Promise. | ||
* @resolve | ||
* - bool. 指明是否存储成功. | ||
*/ | ||
async function accept(ctx, conditionCB) | ||
``` | ||
例子 | ||
后台: | ||
```js | ||
exports.upload = async function(ctx, next) | ||
{ | ||
var r = await require('febs').controls.upload.accept(ctx, async function(data, filesize, filename, filemimeType){ | ||
var r = await require('febs').upload.accept(ctx, async function(data, filesize, filename, filemimeType){ | ||
console.log(filesize); | ||
@@ -618,7 +635,7 @@ console.log(filename); | ||
return 'tempPath/temp.filename'; | ||
return 'tempPath/temp.filename'; // 返回空, 则表明不存在文件. | ||
}); | ||
}; | ||
``` | ||
``` | ||
前台: | ||
@@ -632,3 +649,3 @@ ```js | ||
function upload() { | ||
febs.controls.upload({ | ||
febs.ui.upload({ // 引入febs-ui库. | ||
formObj: $('#fileForm'), | ||
@@ -653,75 +670,13 @@ fileObj: $("#filec"), | ||
#### base64方式上传. | ||
## base64方式上传. | ||
客户端调用如下接口上传文件. | ||
```js | ||
/** | ||
* post方式上传文件. | ||
* 使用文件流片段的方式. 每个片段进行验证.速度稍慢 | ||
* @param cfg: object, 其中 | ||
* { | ||
* data: , // 上传到服务器的任意字符串数据,将在发送请求时发送. | ||
* fileBase64Str: , // 文件的base64格式字符串 | ||
* headerUrl: , // 上传开始前的header请求地址. | ||
* uploadUrl: , // 上传文件内容的url. | ||
* chunkSize: 1024*20, // 每次上传的块大小.默认20kb | ||
* finishCB: , // 上传完成后的回调. function(err, serverData) | ||
* // err: - 'no file' 未选择文件. | ||
* // - 'size too big' 文件太大. | ||
* // - 'check crc32 err' 计算本地文件hash值时错误. | ||
* // - 'ajax err' ajax上传时出错. | ||
* // serverData: 服务器返回的数据. 至少包含一个filename | ||
* progressCB: , // 上传进度的回调. function(percent) | ||
* } | ||
*/ | ||
febs.controls.uploadBase64(cfg); | ||
``` | ||
base64方式上传, 浏览器端将数据编码为base64后, 分段上传给服务端; 服务端对数据进行分段解码后存储至文件中. | ||
服务端调用如下接口接收文件. | ||
```js | ||
/** | ||
* 准备接收上传文件. | ||
* @param conditionCB: async function(data, filesize):string. | ||
* - filesize: 将要存储的文件大小(base64大小) | ||
* - data: 用户上传的数据. | ||
* - return: 本地存储的文件路径, 返回null表示不存储. 存储的文件必须不存在. | ||
* @param sessionSet: function(data){} 用于设置存储在session中的临时文件信息; | ||
* @return Promise. | ||
* @resolve | ||
* - bool. 指明是否开始接收文件流. | ||
*/ | ||
febs.controls.uploadBase64.acceptHeader(app, conditionCB, sessionSet) | ||
``` | ||
```js | ||
/** | ||
* 上传文件内容. | ||
* 发生错误会自动调用 cleanup | ||
* @param finishCB: async function(filename):object. | ||
* - filename: 本地存储的文件名. | ||
* - return: 返回给客户端的数据. 不能包含err数据. | ||
* | ||
* @param sessionGet: function() {} 用于获取存储在session中的临时文件信息; | ||
* @param sessionSet: function(data){} 用于设置存储在session中的临时文件信息; | ||
* @param sessionClear: function() {} 用于清除存储在session中的临时信息 | ||
* @return Promise | ||
* @resolve | ||
*/ | ||
febs.controls.uploadBase64.accept(app, finishCB, sessionGet, sessionSet, sessionClear) | ||
``` | ||
```js | ||
/** | ||
* @desc: 在用户登出或其他中断传输中清除上传的数据. | ||
* @param sessionGet: function() {} 用于获取存储在session中的临时文件信息; | ||
* @param sessionClear: function() {} 用于清除存储在session中的临时信息 | ||
* @return: | ||
*/ | ||
febs.controls.uploadBase64.cleanup(sessionGet, sessionClear, cleanFile = true) | ||
``` | ||
例子 | ||
后台: | ||
```js | ||
// 处理上传请求. | ||
exports.uploadByBase64Header = async function (ctx) { | ||
await febs.controls.uploadBase64.acceptHeader(ctx, | ||
await febs.upload.base64_acceptHeader(ctx, | ||
async function(data, filesize){ | ||
@@ -736,3 +691,3 @@ return "/tmp/filename.jpg"; | ||
exports.uploadByBase64 = async function (ctx) { | ||
await febs.controls.uploadBase64.accept(ctx, | ||
await febs.upload.base64_accept(ctx, | ||
async function(filename){ | ||
@@ -751,2 +706,3 @@ let img = sharp(filename); | ||
``` | ||
前台: | ||
@@ -758,3 +714,3 @@ ```js | ||
<script type="text/javascript"> | ||
febs.controls.uploadBase64({ | ||
febs.ui.uploadBase64({ // 引入febs-ui库. | ||
data: {msg :'这是一个用户数据'}, | ||
@@ -780,2 +736,2 @@ fileBase64Str: base64Imagestr, | ||
</script> | ||
``` | ||
``` |
@@ -66,2 +66,7 @@ | ||
================== | ||
- [feature] add febs.utils.getDate2 | ||
- [feature] add febs.utils.getDate2 | ||
0.4.0 | ||
================== | ||
- [feature] remove all controls code in client. | ||
- [feature] add sha1, md5 in crypt. use uuid module for crypt.uuid |
@@ -11,7 +11,30 @@ { | ||
"raw-body": "^2.2.0", | ||
"url": "0.10.3" | ||
"url": "0.10.3", | ||
"uuid": "^3.2.1" | ||
}, | ||
"devDependencies": { | ||
"babel-core": "^6.26.0", | ||
"babel-loader": "^6.4.1", | ||
"babel-plugin-istanbul": "^4.1.6", | ||
"babel-plugin-transform-es2015-modules-simple-commonjs": "^0.3.0", | ||
"babel-plugin-transform-es3-member-expression-literals": "^6.22.0", | ||
"babel-plugin-transform-es3-property-literals": "^6.22.0", | ||
"babel-plugin-transform-runtime": "^6.23.0", | ||
"babel-polyfill": "^6.26.0", | ||
"babel-preset-env": "^1.6.1", | ||
"babel-preset-es2015": "^6.24.1", | ||
"babel-preset-es2015-loose": "^8.0.0", | ||
"babel-preset-stage-0": "^6.24.1", | ||
"babel-preset-stage-1": "^6.24.1", | ||
"babel-preset-stage-2": "^6.24.1", | ||
"babel-runtime": "^6.26.0", | ||
"console-polyfill": "^0.3.0", | ||
"es3ify-loader": "^0.2.0", | ||
"es3ify-webpack-plugin": "0.0.1", | ||
"es5-shim": "^4.5.10", | ||
"es6-promise": "^4.2.4", | ||
"ora": "^2.0.0", | ||
"tap": "^10.1.0", | ||
"uglify-js": "^3.2.1" | ||
"uglify-js": "^3.2.1", | ||
"webpack": "^2.6.1" | ||
}, | ||
@@ -25,3 +48,3 @@ "directories": {}, | ||
"engines": { | ||
"node": ">=6" | ||
"node": ">=7" | ||
}, | ||
@@ -46,6 +69,6 @@ "files": [ | ||
"test": "tap test/*.js", | ||
"prepare": "node scripts/prepublish.js" | ||
"prepublish": "node scripts/webpack.build.js" | ||
}, | ||
"name": "febs", | ||
"version": "0.4.1" | ||
"version": "0.5.1" | ||
} |
449
README.md
febs 库是一些常用的工具的合集; | ||
`febs是在citong@2.0.8基础上进行开发, citong库已停止更新` | ||
# Install | ||
@@ -12,6 +10,45 @@ | ||
``` | ||
copy directory `node_modules/febs/dist/febs` to client | ||
![](doc/framework.jpg) | ||
# nodejs | ||
以下列方式使用 | ||
```js | ||
var febs = require('febs'); | ||
// | ||
febs.string.replace(); | ||
``` | ||
# browser | ||
以下列方式使用 | ||
> copy directory `node_modules/febs/dist/febs` to client | ||
```html | ||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> <!-- 如ie9等早期浏览器提示使用最新渲染器 --> | ||
<link rel="stylesheet" type="text/css" href="path/febs/febs.css" /> | ||
<script charset='UTF-8' type="text/javascript" src="path/febs/febs.min.js"></script> | ||
<script> | ||
febs.string.replace(); | ||
</script> | ||
``` | ||
# babel | ||
以下列方式使用 | ||
```js | ||
import febs from 'febs/client'; // 使用febs的客户端部分代码. | ||
// | ||
febs.string.replace(); | ||
``` | ||
# framework | ||
![](doc/framework.png) | ||
febs web库分为客户端与服务器端; | ||
@@ -23,6 +60,5 @@ | ||
- [crypt](#crypt) | ||
- [controls](#controls) | ||
- 客户端独有库 | ||
- [nav](#nav) | ||
- [animationFrame](#animationFrame) | ||
- [net](#net) | ||
@@ -33,19 +69,11 @@ | ||
- [file](#file) | ||
- [upload](#upload) | ||
# 说明 | ||
> 客户端 | ||
客户端中已将旧版本中的jquery依赖的相关内容抽出到 [febs-ui](https://www.npmjs.com/package/febs-ui) 库中, `febs`将不再依赖 `jquery`. (ie9以下浏览器需要jquery/zepto). | ||
使用时需依赖 `jquery`, `jquery.form` 这个两个库. | ||
```js | ||
<script src="jquery.min.js"></script> | ||
<script src="jquery.form.min.js"></script> | ||
<script src="febs.min.js" charset="UTF-8"></script> | ||
``` | ||
* 定义了`window.requestAnimationFrame`和`window.cancelAnimationFrame`方法,可进行动画帧操作. | ||
* 对浏览器添加了`Promise`支持. | ||
> 服务端 | ||
* 定义了如下一些全局变量 | ||
服务端定义了如下一些全局变量 | ||
| name | description | | ||
@@ -59,4 +87,6 @@ |----------------|-------------| | ||
* 函数调用使用 `类名.xxx` 的方式调用, 例如: `febs.utils.browserIsMobile()` | ||
* 实现了部分控件, 网页模板在 `febs/client/partials` 路径下, 使用`handlebar`实现 | ||
* 对早期的浏览器定义了`window.requestAnimationFrame`和`window.cancelAnimationFrame`方法,可进行动画帧操作. | ||
* 对早期的浏览器添加了`Promise`支持. | ||
# utils | ||
@@ -237,41 +267,37 @@ | ||
目前提供了uuid,crc32,base64. | ||
服务端独有. | ||
```js | ||
/** | ||
* @return 生成一个uuid字符串. | ||
*/ | ||
febs.crypt.uuid() | ||
* @desc: 计算md5. | ||
* @return: string | ||
*/ | ||
febs.crypt.md5( strOrBuffer ) | ||
/** | ||
* @desc: 计算字符串的crc32值 | ||
* @param crc 可以在这个值得基础上继续计算 | ||
* @return: number. | ||
* @desc: 直接对文件进行计算. | ||
* @param filename: 文件路径 | ||
* @return: string | ||
*/ | ||
febs.crypt.crc32( str, crc ) | ||
febs.crypt.md5_file(filename) | ||
/** | ||
* @desc: 通过文件表单控件进行文件的crc32计算. | ||
* @param fileObj: 表单文件对象, 例如表单为: | ||
* <form enctype="multipart/form-data"> | ||
* <input id="file" type="file" name="file" multiple> | ||
* </form> | ||
* $('#file')[0].files[0] 即为第一个文件对象. | ||
* @param cb: function(crc32) {}; 计算出来的crc32通过回调函数返回 | ||
* @desc: 计算sh1. | ||
* @return: string | ||
*/ | ||
febs.crypt.crc32_file(fileObj, cb) `客户端` | ||
febs.crypt.sha1( strOrBuffer ) | ||
/** | ||
* @desc: 直接对文件进行计算. | ||
* @param filename: 文件路径 | ||
* @return: number | ||
* @return: string | ||
*/ | ||
febs.crypt.crc32_file(filename) `服务端` | ||
febs.crypt.sha1_file(filename) | ||
/** | ||
* @desc: base64编码. | ||
* @param arrByte: 字节数组. | ||
* @return: string. | ||
* @return 生成一个uuid字符串. (uuid v1) | ||
*/ | ||
febs.crypt.base64_encode(arrByte) `客户端` | ||
febs.crypt.uuid() | ||
/** | ||
* @desc: base64解码. | ||
* @return: 字节数组. | ||
*/ | ||
febs.crypt.base64_decode(strBase64) `客户端` | ||
* @desc: 直接对文件进行计算. | ||
* @param filename: 文件路径 | ||
* @return: number | ||
*/ | ||
febs.crypt.crc32_file(filename) | ||
/** | ||
@@ -288,65 +314,69 @@ * @desc: 使用上次的解码的数据继续进行base64解码. | ||
*/ | ||
febs.crypt.base64_decode(strBase64, c2 = 0, c3 = 0, c4 = 0) `服务端` | ||
febs.crypt.base64_decode(strBase64, c2 = 0, c3 = 0, c4 = 0) | ||
``` | ||
# nav | ||
导航是以ajax的方式进行页面切换 | ||
客户端独有. | ||
```js | ||
/** | ||
* @desc: 使用跳转函数初始化. | ||
* @param navCallback: function(object); 触发页面切换时的回调. | ||
* @param urlObjEquelCallback: function(obj1, obj2) : bool; 判断两个页面是否相等. | ||
* @param options: { | ||
defaultTimeout: 10000, | ||
} | ||
* @return: | ||
* @desc: 通过文件表单控件进行文件的crc32计算. | ||
* @param fileObj: 表单文件对象, 例如表单为: | ||
* <form enctype="multipart/form-data"> | ||
* <input id="file" type="file" name="file" multiple> | ||
* </form> | ||
* $('#file')[0].files[0] 即为第一个文件对象. | ||
* @param cb: function(crc32) {}; 计算出来的crc32通过回调函数返回 | ||
*/ | ||
febs.nav.init(navCallback, urlObjEquelCallback, options) | ||
febs.crypt.crc32_file(fileObj, cb) | ||
/** | ||
* @desc: 跳转至指定位置. | ||
* @param urlObject: null则当前页面刷新. | ||
* @return: | ||
*/ | ||
febs.nav.go(urlObject) | ||
* @desc: base64解码. | ||
* @return: 字节数组. | ||
*/ | ||
febs.crypt.base64_decode(strBase64) | ||
``` | ||
通用. | ||
```js | ||
/** | ||
* @desc: 记录一个新页面. | ||
* @param urlObject: 包含参数等链接的信息. | ||
* @return: 浏览器锚点url. | ||
* @desc: 计算字符串的crc32值 | ||
* @param crc 可以在这个值得基础上继续计算 | ||
* @return: number. | ||
*/ | ||
febs.nav.push(urlObject) | ||
febs.crypt.crc32( str, crc ) | ||
/** | ||
* @desc: 刷新页面. | ||
*/ | ||
febs.nav.refresh() | ||
/** | ||
* @desc 刷新指定元素. | ||
* @param elem: jquery对象. | ||
*/ | ||
febs.nav.refresh_elem(elem, url); | ||
/** | ||
* @desc: ajax 跳转. | ||
* @param option:例如: (详见jquery.ajax) | ||
{ | ||
type: "GET", | ||
url: url, | ||
data: null, | ||
success: cb | ||
} | ||
* @return: | ||
*/ | ||
febs.nav.ajax( option ) | ||
/** | ||
* @desc: 寻找指定的url | ||
* @return: url. | ||
*/ | ||
febs.nav.url(anchor) | ||
* @desc: base64编码. | ||
* @param arrByte: 字节数组. | ||
* @return: string. | ||
*/ | ||
febs.crypt.base64_encode(arrByte) | ||
``` | ||
# animationFrame | ||
各浏览器兼容的 `requestAnimationFrame`, `cancelAnimationFrame` 动画方法. | ||
```js | ||
var total = 0; | ||
var timer; | ||
var now = Date.now(); | ||
function foo(tm) { | ||
var now2 = Date.now(); | ||
total += now2-now; | ||
now = now2; | ||
if (total > 10000) { | ||
cancelAnimationFrame(timer); | ||
} else { | ||
timer = requestAnimationFrame(foo); | ||
} | ||
} | ||
timer = requestAnimationFrame(foo); | ||
``` | ||
# net | ||
net封装了浏览器通信方法: ajax, fetch, jsonp | ||
net封装了浏览器通信方法: fetch, jsonp | ||
```js | ||
/** | ||
* @desc: 进行ajax请求, 同 febs.nav.ajax. | ||
*/ | ||
febs.net.ajax(option) | ||
/** | ||
* @desc: 使用fetch方式进行数据请求. | ||
@@ -497,60 +527,66 @@ * 如果超時, 可以catch到 'timeout' | ||
# controls | ||
# upload | ||
### loading | ||
## multipart/form-data方式上传. | ||
![](doc/ui/control-loadding.jpg) | ||
```js | ||
/** | ||
* @desc: 当前是否显示. | ||
* @return boolean. | ||
*/ | ||
febs.controls.loading_isVisiable() | ||
* 接收上传文件内容. 接收客户端 multipart/form-data方式上传的数据. | ||
* @param conditionCB: async function(data, filesize, filename, filemimeType):string. | ||
* - data: 用户上传的数据. | ||
* - filesize: 将要存储的文件大小. | ||
* - filename: 上传的文件名. | ||
* - filemimeType: 文件类型, 例如: 'image/jpeg'. | ||
* - return: 存储的文件路径, 返回null表示不存储. | ||
* @return Promise. | ||
* @resolve | ||
* - bool. 指明是否存储成功. | ||
*/ | ||
febs.upload.accept(ctx, conditionCB) | ||
``` | ||
## base64数据流分段方式上传. | ||
```js | ||
/** | ||
* @desc: 使用延时显示加载框. | ||
* @param text: 提示文本. | ||
* @param timeout: 延时显示, 默认为0. | ||
* @return: | ||
*/ | ||
febs.controls.loading_show(text, timeout) | ||
* 准备接收上传文件. | ||
* @param conditionCB: async function(data, filesize):string. | ||
* - filesize: 将要存储的文件大小(base64大小) | ||
* - data: 用户上传的数据. | ||
* - return: 本地存储的文件路径, 返回null表示不存储. 存储的文件必须不存在. | ||
* @param sessionSet: function(data){} 用于设置存储在session中的临时文件信息; | ||
* @return Promise. | ||
* @resolve | ||
* - bool. 指明是否开始接收文件流. | ||
*/ | ||
febs.upload.base64_acceptHeader(ctx, conditionCB, sessionSet) | ||
``` | ||
```js | ||
/** | ||
* @desc: 通过每500ms改变文本的方式显示加载框; 例如显示 3,2,1,3,2,1循环显示. | ||
* @param textArray: 变化的文本数组. | ||
* @param changeTextCB: 当前显示文本的回调. function(text). | ||
* @param hideCB: 隐藏加载框时的设置文本的函数. function(). | ||
* @return: | ||
*/ | ||
febs.controls.loading_show_text(textArray, changeTextCB, hideCB) | ||
/** | ||
* @desc: 隐藏加载对话框 | ||
* @return: | ||
*/ | ||
febs.controls.loading_hide() | ||
* 上传文件内容. | ||
* 发生错误会自动调用 cleanup | ||
* @param finishCB: async function(filename):object. | ||
* - filename: 本地存储的文件名. | ||
* - return: 返回给客户端的数据. 不能包含err数据. | ||
* | ||
* @param sessionGet: function() {} 用于获取存储在session中的临时文件信息; | ||
* @param sessionSet: function(data){} 用于设置存储在session中的临时文件信息; | ||
* @param sessionClear: function() {} 用于清除存储在session中的临时信息 | ||
* @return Promise | ||
* @resolve | ||
*/ | ||
febs.upload.base64_accept(ctx, finishCB, sessionGet, sessionSet, sessionClear) | ||
``` | ||
### page | ||
![](doc/ui/control-page.jpg) | ||
```js | ||
/** | ||
* @desc: 初始化page控件. | ||
* @param elem: 将控件插入到elem中, elem是一个jquery的对象. | ||
* @param curPage: 当前页 | ||
* @param pageCount: 总页数 | ||
* @param totalCount: 总条数 | ||
* @param pageCallback: 页面跳转函数, function(page) {} | ||
* @desc: 在用户登出或其他中断传输中清除上传的数据. | ||
* @param sessionGet: function() {} 用于获取存储在session中的临时文件信息; | ||
* @param sessionClear: function() {} 用于清除存储在session中的临时信息 | ||
* @return: | ||
*/ | ||
febs.controls.page_init(elem, curPage, pageCount, totalCount, pageCallback) | ||
febs.upload.base64_cleanup(sessionGet, sessionClear, cleanFile = true) | ||
``` | ||
### upload | ||
#### multipart/form-data方式上传. | ||
## multipart/form-data方式实例 | ||
@@ -569,52 +605,24 @@ ```js | ||
* 后台: | ||
* 1. 在uploadUrl中调用 await require('febs').controls.upload.accept(app, conditionCB); 当满足条件时将存储, 并返回true表示成功. | ||
* 1. 在uploadUrl中调用 await require('febs').upload.accept(ctx, conditionCB); 当满足条件时将存储, 并返回true表示成功. | ||
*/ | ||
``` | ||
客户端调用如下接口上传文件. | ||
/** 需要 jquery,jquery.form 库支持. | ||
* 并且 <input type="file" name="file"... 中, 必须存在name属性. | ||
* 使用post方式上传文件. | ||
* @param cfg: object, 其中 | ||
* { | ||
* data: , // 上传到服务器的任意字符串数据. | ||
* formObj: , // 含有enctype="multipart/form-data"的form | ||
* fileObj: , // form中的file对象 | ||
* uploadUrl: , // 上传文件内容的url. 系统将自动使用 uploadUrl?crc32=&size=的方式来上传. | ||
* maxFileSize: , // 允许上传的最大文件.0表示无限制.默认为0 | ||
* fileType: , // 允许的文件类型. 如: image/gif,image/jpeg,image/x-png | ||
* finishCB: , // 上传完成后的回调. function(err, fileObj, serverData) | ||
* // err: - 'no file' 未选择文件. | ||
* // - 'size too big' 文件太大. | ||
* // - 'check crc32 err' 计算本地文件hash值时错误. | ||
* // - 'ajax err' ajax上传时出错. | ||
* // serverData: 服务器返回的数据. | ||
* progressCB: , // 上传进度的回调. function(fileObj, percent), | ||
* headers: { // 设置request headers | ||
* 'customHeader': 'value' | ||
* }, | ||
* crossDomain: true, // 跨域, 默认为true | ||
* withCredentials: true, // 是否附带cookie, 默认为true | ||
* } | ||
* function control_upload(cfg) | ||
*/ | ||
客户端使用multipart/form-data方式上传文件时, 需使用url参数上传如下参数: | ||
| name | description | | ||
|----------------|-------------| | ||
| crc32 | 文件内容的crc32计算值 | | ||
| size | 文件字节大小 | | ||
| data | (可选) 自定义数据; 自定义数据会在字节流上传完成后, 通过回调传递. | | ||
> 例如: 上传url为 `/upload?crc32=2134141&size=11231` | ||
也可以在浏览器端直接使用 `febs-ui` 中的上传方法. | ||
服务端调用如下接口接收文件. | ||
/** | ||
* 接收上传文件内容. | ||
* @param conditionCB: async function(filesize, filename, filemimeType):string. | ||
* - filesize: 将要存储的文件大小. | ||
* - filename: 上传的文件名. | ||
* - filemimeType: 文件类型, 例如: 'image/jpeg'. | ||
* - return: 存储的文件路径, 返回null表示不存储. | ||
* @return Promise. | ||
* @resolve | ||
* - bool. 指明是否存储成功. | ||
*/ | ||
async function accept(ctx, conditionCB) | ||
``` | ||
例子 | ||
后台: | ||
```js | ||
exports.upload = async function(ctx, next) | ||
{ | ||
var r = await require('febs').controls.upload.accept(ctx, async function(data, filesize, filename, filemimeType){ | ||
var r = await require('febs').upload.accept(ctx, async function(data, filesize, filename, filemimeType){ | ||
console.log(filesize); | ||
@@ -624,7 +632,7 @@ console.log(filename); | ||
return 'tempPath/temp.filename'; | ||
return 'tempPath/temp.filename'; // 返回空, 则表明不存在文件. | ||
}); | ||
}; | ||
``` | ||
``` | ||
前台: | ||
@@ -638,3 +646,3 @@ ```js | ||
function upload() { | ||
febs.controls.upload({ | ||
febs.ui.upload({ // 引入febs-ui库. | ||
formObj: $('#fileForm'), | ||
@@ -659,75 +667,13 @@ fileObj: $("#filec"), | ||
#### base64方式上传. | ||
## base64方式上传. | ||
客户端调用如下接口上传文件. | ||
```js | ||
/** | ||
* post方式上传文件. | ||
* 使用文件流片段的方式. 每个片段进行验证.速度稍慢 | ||
* @param cfg: object, 其中 | ||
* { | ||
* data: , // 上传到服务器的任意字符串数据,将在发送请求时发送. | ||
* fileBase64Str: , // 文件的base64格式字符串 | ||
* headerUrl: , // 上传开始前的header请求地址. | ||
* uploadUrl: , // 上传文件内容的url. | ||
* chunkSize: 1024*20, // 每次上传的块大小.默认20kb | ||
* finishCB: , // 上传完成后的回调. function(err, serverData) | ||
* // err: - 'no file' 未选择文件. | ||
* // - 'size too big' 文件太大. | ||
* // - 'check crc32 err' 计算本地文件hash值时错误. | ||
* // - 'ajax err' ajax上传时出错. | ||
* // serverData: 服务器返回的数据. 至少包含一个filename | ||
* progressCB: , // 上传进度的回调. function(percent) | ||
* } | ||
*/ | ||
febs.controls.uploadBase64(cfg); | ||
``` | ||
base64方式上传, 浏览器端将数据编码为base64后, 分段上传给服务端; 服务端对数据进行分段解码后存储至文件中. | ||
服务端调用如下接口接收文件. | ||
```js | ||
/** | ||
* 准备接收上传文件. | ||
* @param conditionCB: async function(data, filesize):string. | ||
* - filesize: 将要存储的文件大小(base64大小) | ||
* - data: 用户上传的数据. | ||
* - return: 本地存储的文件路径, 返回null表示不存储. 存储的文件必须不存在. | ||
* @param sessionSet: function(data){} 用于设置存储在session中的临时文件信息; | ||
* @return Promise. | ||
* @resolve | ||
* - bool. 指明是否开始接收文件流. | ||
*/ | ||
febs.controls.uploadBase64.acceptHeader(app, conditionCB, sessionSet) | ||
``` | ||
```js | ||
/** | ||
* 上传文件内容. | ||
* 发生错误会自动调用 cleanup | ||
* @param finishCB: async function(filename):object. | ||
* - filename: 本地存储的文件名. | ||
* - return: 返回给客户端的数据. 不能包含err数据. | ||
* | ||
* @param sessionGet: function() {} 用于获取存储在session中的临时文件信息; | ||
* @param sessionSet: function(data){} 用于设置存储在session中的临时文件信息; | ||
* @param sessionClear: function() {} 用于清除存储在session中的临时信息 | ||
* @return Promise | ||
* @resolve | ||
*/ | ||
febs.controls.uploadBase64.accept(app, finishCB, sessionGet, sessionSet, sessionClear) | ||
``` | ||
```js | ||
/** | ||
* @desc: 在用户登出或其他中断传输中清除上传的数据. | ||
* @param sessionGet: function() {} 用于获取存储在session中的临时文件信息; | ||
* @param sessionClear: function() {} 用于清除存储在session中的临时信息 | ||
* @return: | ||
*/ | ||
febs.controls.uploadBase64.cleanup(sessionGet, sessionClear, cleanFile = true) | ||
``` | ||
例子 | ||
后台: | ||
```js | ||
// 处理上传请求. | ||
exports.uploadByBase64Header = async function (ctx) { | ||
await febs.controls.uploadBase64.acceptHeader(ctx, | ||
await febs.upload.base64_acceptHeader(ctx, | ||
async function(data, filesize){ | ||
@@ -742,3 +688,3 @@ return "/tmp/filename.jpg"; | ||
exports.uploadByBase64 = async function (ctx) { | ||
await febs.controls.uploadBase64.accept(ctx, | ||
await febs.upload.base64_accept(ctx, | ||
async function(filename){ | ||
@@ -757,2 +703,3 @@ let img = sharp(filename); | ||
``` | ||
前台: | ||
@@ -764,3 +711,3 @@ ```js | ||
<script type="text/javascript"> | ||
febs.controls.uploadBase64({ | ||
febs.ui.uploadBase64({ // 引入febs-ui库. | ||
data: {msg :'这是一个用户数据'}, | ||
@@ -786,2 +733,2 @@ fileBase64Str: base64Imagestr, | ||
</script> | ||
``` | ||
``` |
@@ -10,2 +10,4 @@ 'use strict'; | ||
var fs = require('fs'); | ||
var crypto = require('crypto'); | ||
var uuidv1 = require('uuid/v1'); | ||
@@ -85,3 +87,127 @@ | ||
/** | ||
* @desc: 生成一个uuid字符串 | ||
* @desc: 计算字符串的md5值 | ||
* @return: string. | ||
*/ | ||
exports.md5 = | ||
function ( /* String */ str ) { | ||
var md5 = crypto.createHash('md5'); | ||
md5.update(str); | ||
return md5.digest('hex'); | ||
} | ||
/** | ||
* @desc: | ||
* @return:string;错误返回null. | ||
*/ | ||
exports.md5_file = function( filename ) { | ||
var stat = fs.statSync(filename); | ||
if (stat && stat.isFile() && stat.size > 0) | ||
{ | ||
var fd = null; | ||
try { | ||
fd = fs.openSync(filename, 'r'); | ||
if (!fd) | ||
return 0; | ||
var buf = new Buffer(1024*10); | ||
var size; | ||
var md5 = crypto.createHash('md5'); | ||
for (var i = 0, len = stat.size; i < len; i+=buf.length) { | ||
size = buf.length > len-i ? len-i : buf.length; | ||
if (fs.readSync(fd, buf, 0, size, null) != size) | ||
{ | ||
break; | ||
} | ||
md5.update(buf.slice(0, size)); | ||
} | ||
fs.closeSync(fd); | ||
fd = 0; | ||
if (i< len) { | ||
return null; | ||
} | ||
return md5.digest('hex'); | ||
}catch(e) | ||
{ | ||
if (fd) { | ||
fs.closeSync(fd); | ||
} | ||
return null; | ||
} | ||
} | ||
else | ||
{ | ||
return null; | ||
} | ||
}; | ||
/** | ||
* @desc: 计算字符串的sha1值 | ||
* @return: string. | ||
*/ | ||
exports.sha1 = | ||
function ( /* String */ str ) { | ||
var sha1 = crypto.createHash('sha1'); | ||
sha1.update(str); | ||
return sha1.digest('hex'); | ||
} | ||
/** | ||
* @desc: | ||
* @return:string;错误返回null. | ||
*/ | ||
exports.sha1_file = function( filename ) { | ||
var stat = fs.statSync(filename); | ||
if (stat && stat.isFile() && stat.size > 0) | ||
{ | ||
var fd = null; | ||
try { | ||
fd = fs.openSync(filename, 'r'); | ||
if (!fd) | ||
return 0; | ||
var buf = new Buffer(1024*10); | ||
var size; | ||
var sha1 = crypto.createHash('sha1'); | ||
for (var i = 0, len = stat.size; i < len; i+=buf.length) { | ||
size = buf.length > len-i ? len-i : buf.length; | ||
if (fs.readSync(fd, buf, 0, size, null) != size) | ||
{ | ||
break; | ||
} | ||
sha1.update(buf.slice(0, size)); | ||
} | ||
fs.closeSync(fd); | ||
fd = 0; | ||
if (i< len) { | ||
return null; | ||
} | ||
return sha1.digest('hex'); | ||
}catch(e) | ||
{ | ||
if (fd) { | ||
fs.closeSync(fd); | ||
} | ||
return null; | ||
} | ||
} | ||
else | ||
{ | ||
return null; | ||
} | ||
}; | ||
/** | ||
* @desc: 生成一个uuid字符串 (uuid v1) | ||
* @return: | ||
@@ -91,13 +217,3 @@ */ | ||
function () { | ||
var s = []; | ||
var hexDigits = "0123456789abcdef"; | ||
for (var i = 0; i < 36; i++) { | ||
s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1); | ||
} | ||
s[14] = "4"; // bits 12-15 of the time_hi_and_version field to 0010 | ||
s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01 | ||
s[8] = s[13] = s[18] = s[23] = "-"; | ||
var uuid = s.join(""); | ||
return uuid; | ||
return uuidv1(); | ||
} | ||
@@ -104,0 +220,0 @@ |
exports.controls = require('./controls'); | ||
exports.upload = require('./upload'); | ||
exports.exception = require('./exception'); | ||
@@ -4,0 +4,0 @@ exports.file = require('./file'); |
@@ -11,2 +11,6 @@ // Type definitions for febs | ||
export function requestAnimationFrame(cb:(tm:number)=>void):any; | ||
export function cancelAnimationFrame(timer:any):void; | ||
export interface WeekFmt { | ||
@@ -198,3 +202,3 @@ '0'?: string; | ||
/** | ||
* @return 生成一个uuid字符串. | ||
* @return 生成一个uuid字符串. (uuid v1) | ||
*/ | ||
@@ -224,3 +228,26 @@ function uuid(): string; | ||
function crc32_file(filename: string): number; | ||
/** | ||
* @desc: 计算字符串的md5值 | ||
* @return: string. | ||
*/ | ||
function md5(str: string|Buffer): string; | ||
/** | ||
* @desc: [服务端调用] 直接对文件进行计算. | ||
* @param filename: 文件路径 | ||
* @return: string | ||
*/ | ||
function md5_file(filename: string): string; | ||
/** | ||
* @desc: 计算字符串的sha1值 | ||
* @return: string. | ||
*/ | ||
function sha1(str: string|Buffer): string; | ||
/** | ||
* @desc: [服务端调用] 直接对文件进行计算. | ||
* @param filename: 文件路径 | ||
* @return: string | ||
*/ | ||
function sha1_file(filename: string): string; | ||
/** | ||
* @desc: base64编码. | ||
@@ -255,54 +282,6 @@ * @return: string. | ||
export interface NavOptions { | ||
defaultTimeout?: number; | ||
} | ||
// | ||
// nav. | ||
export namespace nav { | ||
/** | ||
* @desc: 使用跳转函数初始化. | ||
* @param navCallback: function(object); 触发页面切换时的回调. | ||
* @param urlObjEquelCallback: function(obj1, obj2) : bool; 判断两个页面是否相等. | ||
* @param options: { | ||
defaultTimeout: 10000, | ||
} | ||
* @return: | ||
*/ | ||
function init(navCallback: (object: any) => void, urlObjEquelCallback: (obj1: any, obj2: any) => boolean, options?: NavOptions): void; | ||
/** | ||
* @desc: 跳转至指定位置. | ||
* @param urlObject: null则当前页面刷新. | ||
* @return: | ||
*/ | ||
function go(urlObject: any): void; | ||
/** | ||
* @desc: 记录一个新页面. | ||
* @param urlObject: 包含参数等链接的信息. | ||
* @return: 浏览器锚点url. | ||
*/ | ||
function push(urlObject: any): void; | ||
/** | ||
* @desc: 刷新页面. | ||
*/ | ||
function refresh(): void; | ||
/** | ||
* @desc 刷新指定元素. | ||
* @param elem: jquery对象. | ||
*/ | ||
function refresh_elem(elem: object, url: string): void; | ||
/** | ||
* @desc: 寻找指定的url | ||
* @return: url. | ||
*/ | ||
function url(anchor: string): string; | ||
} | ||
// | ||
// net. | ||
export namespace net { | ||
/** | ||
* @desc: 进行ajax请求, 同 febs.nav.ajax. | ||
*/ | ||
function ajax(option: object): void; | ||
/** | ||
* @desc: 使用fetch方式进行数据请求. | ||
@@ -444,142 +423,53 @@ * 如果超時, 可以catch到 'timeout' | ||
// | ||
// controls | ||
export namespace controls { | ||
/** | ||
* @desc: 使用延时显示加载框. | ||
* @param text: 提示文本. | ||
* @param timeout: 延时显示, 默认为0. | ||
* @return: | ||
*/ | ||
function loading_show(text: string, timeout?: number): any; | ||
export namespace upload { | ||
/** | ||
* @desc: 通过每500ms改变文本的方式显示加载框; 例如显示 3,2,1,3,2,1循环显示. | ||
* @param textArray: 变化的文本数组. | ||
* @param changeTextCB: 当前显示文本的回调. function(text). | ||
* @param hideCB: 隐藏加载框时的设置文本的函数. function(). | ||
* @return: | ||
*/ | ||
function loading_show_text(textArray: Array<string>, changeTextCB: (text: string) => void, hideCB: () => void): void; | ||
* [服务端调用] 接收上传文件内容. | ||
* @param conditionCB: async function(data, filesize, filename, filemimeType):string. | ||
* - data: 用户上传的数据. | ||
* - filesize: 将要存储的文件大小. | ||
* - filename: 上传的文件名. | ||
* - filemimeType: 文件类型, 例如: 'image/jpeg'. | ||
* - return: 存储的文件路径, 返回null表示不存储. | ||
* @return Promise. | ||
* @resolve | ||
* - bool. 指明是否存储成功. | ||
*/ | ||
function accept(app: any, conditionCB: (data: any, filesize: number, filename: string, filemimeType: string) => Promise<string>): Promise<boolean>; | ||
/** | ||
* @desc: 隐藏加载对话框 | ||
* @return: | ||
*/ | ||
function loading_hide(): void; | ||
* 准备接收上传文件. | ||
* @param conditionCB: async function(data, filesize):string. | ||
* - filesize: 将要存储的文件大小(base64大小) | ||
* - data: 用户上传的数据. | ||
* - return: 本地存储的文件路径, 返回null表示不存储. 存储的文件必须不存在. | ||
* @param sessionSet: function(data){} 用于设置存储在session中的临时文件信息; | ||
* @return Promise. | ||
* @resolve | ||
* - bool. 指明是否开始接收文件流. | ||
*/ | ||
function base64_acceptHeader(app: any, conditionCB: (data: any, filesize: number) => Promise<string>, sessionSet: (data: any) => void): Promise<boolean>; | ||
/** | ||
* @desc: 初始化page控件. | ||
* @param elem: 将控件插入到elem中, elem是一个jquery的对象. | ||
* @param curPage: 当前页 | ||
* @param pageCount: 总页数 | ||
* @param totalCount: 总条数 | ||
* @param pageCallback: 页面跳转函数, function(page) {} | ||
* 上传文件内容. | ||
* 发生错误会自动调用 cleanup | ||
* @param finishCB: async function(filename):object. | ||
* - filename: 本地存储的文件名. | ||
* - return: 返回给客户端的数据. 不能包含err数据. | ||
* | ||
* @param sessionGet: function() {} 用于获取存储在session中的临时文件信息; | ||
* @param sessionSet: function(data){} 用于设置存储在session中的临时文件信息; | ||
* @param sessionClear: function() {} 用于清除存储在session中的临时信息 | ||
* @return Promise | ||
* @resolve | ||
*/ | ||
function base64_accept(app: any, finishCB: (filename: string) => Promise<any>, sessionGet: () => any, sessionSet: (data: any) => void, sessionClear: () => void): Promise<any>; | ||
/** | ||
* @desc: 在用户登出或其他中断传输中清除上传的数据. | ||
* @param sessionGet: function() {} 用于获取存储在session中的临时文件信息; | ||
* @param sessionClear: function() {} 用于清除存储在session中的临时信息 | ||
* @return: | ||
*/ | ||
function page_init(elem: any, curPage: number, pageCount: number, totalCount: number, pageCallback: (page: any) => void): void; | ||
/** [客户端调用] 需要 jquery,jquery.form 库支持. | ||
* 并且 <input type="file" name="file"... 中, 必须存在name属性. | ||
* 使用post方式上传文件. | ||
* @param cfg: object, 其中 | ||
* { | ||
* data: , // 上传到服务器的任意字符串数据. | ||
* formObj: , // 含有enctype="multipart/form-data"的form | ||
* fileObj: , // form中的file对象 | ||
* uploadUrl: , // 上传文件内容的url. 系统将自动使用 uploadUrl?crc32=&size=的方式来上传. | ||
* maxFileSize: , // 允许上传的最大文件.0表示无限制.默认为0 | ||
* fileType: , // 允许的文件类型. 如: image/gif,image/jpeg,image/x-png | ||
* finishCB: , // 上传完成后的回调. function(err, fileObj, serverData) | ||
* // err: - 'no file' 未选择文件. | ||
* // - 'size too big' 文件太大. | ||
* // - 'check crc32 err' 计算本地文件hash值时错误. | ||
* // - 'ajax err' ajax上传时出错. | ||
* // serverData: 服务器返回的数据. | ||
* progressCB: , // 上传进度的回调. function(fileObj, percent) | ||
* } | ||
*/ | ||
function upload(cfg: any): void; | ||
/** | ||
* [客户端调用] post方式上传文件. | ||
* 使用文件流片段的方式. 每个片段进行验证.速度稍慢 | ||
* @param cfg: object, 其中 | ||
* { | ||
* data: , // 上传到服务器的任意字符串数据,将在发送请求时发送. | ||
* fileBase64Str: , // 文件的base64格式字符串 | ||
* headerUrl: , // 上传开始前的header请求地址. | ||
* uploadUrl: , // 上传文件内容的url. | ||
* chunkSize: 1024*20, // 每次上传的块大小.默认20kb | ||
* finishCB: , // 上传完成后的回调. function(err, serverData) | ||
* // err: - 'no file' 未选择文件. | ||
* // - 'size too big' 文件太大. | ||
* // - 'check crc32 err' 计算本地文件hash值时错误. | ||
* // - 'ajax err' ajax上传时出错. | ||
* // serverData: 服务器返回的数据. 至少包含一个filename | ||
* progressCB: , // 上传进度的回调. function(percent), | ||
* headers: { // 设置request headers | ||
* 'customHeader': 'value' | ||
* }, | ||
* crossDomain: true, // 跨域, 默认为true | ||
* withCredentials: true, // 是否附带cookie, 默认为true | ||
* } | ||
*/ | ||
function uploadBase64(cfg: any): void; | ||
function base64_cleanup(sessionGet: () => any, sessionClear: () => void, cleanFile?: boolean): void; | ||
} | ||
export namespace controls { | ||
namespace upload { | ||
/** | ||
* [服务端调用] 接收上传文件内容. | ||
* @param conditionCB: async function(data, filesize, filename, filemimeType):string. | ||
* - data: 用户上传的数据. | ||
* - filesize: 将要存储的文件大小. | ||
* - filename: 上传的文件名. | ||
* - filemimeType: 文件类型, 例如: 'image/jpeg'. | ||
* - return: 存储的文件路径, 返回null表示不存储. | ||
* @return Promise. | ||
* @resolve | ||
* - bool. 指明是否存储成功. | ||
*/ | ||
function accept(app: any, conditionCB: (data: any, filesize: number, filename: string, filemimeType: string) => Promise<string>): Promise<boolean>; | ||
} | ||
namespace uploadBase64 { | ||
/** | ||
* 准备接收上传文件. | ||
* @param conditionCB: async function(data, filesize):string. | ||
* - filesize: 将要存储的文件大小(base64大小) | ||
* - data: 用户上传的数据. | ||
* - return: 本地存储的文件路径, 返回null表示不存储. 存储的文件必须不存在. | ||
* @param sessionSet: function(data){} 用于设置存储在session中的临时文件信息; | ||
* @return Promise. | ||
* @resolve | ||
* - bool. 指明是否开始接收文件流. | ||
*/ | ||
function acceptHeader(app: any, conditionCB: (data: any, filesize: number) => Promise<string>, sessionSet: (data: any) => void): Promise<boolean>; | ||
/** | ||
* 上传文件内容. | ||
* 发生错误会自动调用 cleanup | ||
* @param finishCB: async function(filename):object. | ||
* - filename: 本地存储的文件名. | ||
* - return: 返回给客户端的数据. 不能包含err数据. | ||
* | ||
* @param sessionGet: function() {} 用于获取存储在session中的临时文件信息; | ||
* @param sessionSet: function(data){} 用于设置存储在session中的临时文件信息; | ||
* @param sessionClear: function() {} 用于清除存储在session中的临时信息 | ||
* @return Promise | ||
* @resolve | ||
*/ | ||
function accept(app: any, finishCB: (filename: string) => Promise<any>, sessionGet: () => any, sessionSet: (data: any) => void, sessionClear: () => void): Promise<any>; | ||
/** | ||
* @desc: 在用户登出或其他中断传输中清除上传的数据. | ||
* @param sessionGet: function() {} 用于获取存储在session中的临时文件信息; | ||
* @param sessionClear: function() {} 用于清除存储在session中的临时信息 | ||
* @return: | ||
*/ | ||
function cleanup(sessionGet: () => any, sessionClear: () => void, cleanFile?: boolean): void; | ||
} | ||
} | ||
export namespace exception { | ||
@@ -586,0 +476,0 @@ |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Native code
Supply chain riskContains native code (e.g., compiled binaries or shared libraries). Including native code can obscure malicious behavior.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Uses eval
Supply chain riskPackage uses dynamic code execution (e.g., eval()), which is a dangerous practice. This can prevent the code from running in certain environments and increases the risk that the code may contain exploits or malicious behavior.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 3 instances in 1 package
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 2 instances in 1 package
1271568
10601
1
6
3
9
24
24
720
+ Addeduuid@^3.2.1
+ Addeduuid@3.4.0(transitive)