fmui-base 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/button/button.js +109 -0
- package/lib/button/index.js +16 -0
- package/lib/care/care.js +55 -0
- package/lib/care/index.js +16 -0
- package/lib/comment_list/List.js +101 -0
- package/lib/comment_list/List.less +3 -0
- package/lib/comment_list/index.js +16 -0
- package/lib/db/db.js +789 -0
- package/lib/db/variables.js +110 -0
- package/lib/form/answer.less +3 -0
- package/lib/form/form.js +2048 -0
- package/lib/form/index.js +16 -0
- package/lib/form/subForm.js +724 -0
- package/lib/form/table.js +1071 -0
- package/lib/index.js +43 -0
- package/lib/loading/index.js +16 -0
- package/lib/loading/loading.js +56 -0
- package/lib/no_data/index.js +16 -0
- package/lib/no_data/no_data.js +72 -0
- package/lib/poppage/check.js +572 -0
- package/lib/poppage/check.less +0 -0
- package/lib/poppage/index.js +16 -0
- package/lib/poppage/table/index.js +16 -0
- package/lib/poppage/table/table.js +776 -0
- package/lib/poppage/table/table.less +35 -0
- package/lib/poppage/tree/index.js +16 -0
- package/lib/poppage/tree/tree.js +705 -0
- package/lib/poppage/tree/tree.less +9 -0
- package/lib/poppage/treetable/index.js +16 -0
- package/lib/poppage/treetable/treetable.js +445 -0
- package/lib/poppage/treetable/treetable.less +9 -0
- package/lib/poppage/utils.js +40 -0
- package/lib/positioning/index.js +16 -0
- package/lib/positioning/positioning.js +136 -0
- package/lib/process_batch/index.js +16 -0
- package/lib/process_batch/pageHome.less +3 -0
- package/lib/process_batch/processBatch.js +1669 -0
- package/lib/process_info/FlowChart.js +231 -0
- package/lib/process_info/RelationProcess.js +173 -0
- package/lib/process_info/index.js +16 -0
- package/lib/process_info/processInfo.js +6090 -0
- package/lib/process_list/index.js +16 -0
- package/lib/process_list/processList.js +1378 -0
- package/lib/process_list/processList.less +5 -0
- package/lib/select-fileno/index.js +16 -0
- package/lib/select-fileno/pageHome.js +722 -0
- package/lib/select-fileno/pageHome.less +0 -0
- package/lib/select-fileno/utils.js +40 -0
- package/lib/select-serialnumber/index.js +16 -0
- package/lib/select-serialnumber/pageHome.js +651 -0
- package/lib/select-serialnumber/pageHome.less +0 -0
- package/lib/select-serialnumber/pageHome1.js +649 -0
- package/lib/select-serialnumber/utils.js +40 -0
- package/lib/selectMember/index.js +16 -0
- package/lib/selectMember/select.js +7061 -0
- package/lib/selectMember/select.less +25 -0
- package/lib/selectMember/utils.js +40 -0
- package/lib/selectMember//347/247/273/345/212/250/347/253/257/351/200/211/344/272/272/347/273/204/344/273/266/350/257/264/346/230/216/346/226/207/346/241/243.md +145 -0
- package/lib/signature/draw.js +268 -0
- package/lib/signature/index.js +16 -0
- package/lib/signature/sign.js +359 -0
- package/lib/signature/sign.less +73 -0
- package/lib/signature//346/211/213/345/206/231/347/255/276/345/220/215/344/275/277/347/224/250/346/226/207/346/241/243.md +12 -0
- package/lib/upload/index.js +16 -0
- package/lib/upload/upload.js +566 -0
- package/package.json +72 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
.t-crumb-scroll{
|
|
2
|
+
width:100% !important;
|
|
3
|
+
|
|
4
|
+
}
|
|
5
|
+
.t-crumb{
|
|
6
|
+
height: 34px;
|
|
7
|
+
padding:5px 16px;
|
|
8
|
+
}
|
|
9
|
+
.t-disable-mask{
|
|
10
|
+
position: absolute;
|
|
11
|
+
left: 0;
|
|
12
|
+
right: 0;
|
|
13
|
+
top: 0;
|
|
14
|
+
bottom: 0;
|
|
15
|
+
background-color: rgba(255,255,255,.4);
|
|
16
|
+
}
|
|
17
|
+
.t-checkbox-field-icon-list.disabled {
|
|
18
|
+
background-color: rgba(31,56,88,.1);
|
|
19
|
+
}
|
|
20
|
+
.dd-app-avatar{
|
|
21
|
+
height: 101px !important;
|
|
22
|
+
}
|
|
23
|
+
.t-checkbox-field-icon-list {
|
|
24
|
+
background: #38adff;
|
|
25
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
var toString = Object.prototype.toString;
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
var isArray = function isArray(arg) {
|
|
10
|
+
return toString.call(arg) === '[object Array]';
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
var addUrlParam = function addUrlParam(name, value) {
|
|
14
|
+
var currentUrl = window.location.href;
|
|
15
|
+
var reg = void 0;
|
|
16
|
+
if (/\?/g.test(currentUrl)) {
|
|
17
|
+
reg = new RegExp(name + '=[-\\w]{4,25}', 'g');
|
|
18
|
+
if (reg.test(currentUrl)) {
|
|
19
|
+
currentUrl = currentUrl.replace(reg, name + '=' + value);
|
|
20
|
+
} else {
|
|
21
|
+
currentUrl += '&' + name + '=' + value;
|
|
22
|
+
}
|
|
23
|
+
} else {
|
|
24
|
+
currentUrl += '?' + name + '=' + value;
|
|
25
|
+
}
|
|
26
|
+
return currentUrl;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
// 格式化方法类型
|
|
30
|
+
var FORMATTER_TYPES = {
|
|
31
|
+
LABEL_FORMATTER: 'label', // 回填值显示
|
|
32
|
+
OPTION_FORMATTER: 'option' // panel选项显示
|
|
33
|
+
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
exports.default = {
|
|
37
|
+
isArray: isArray,
|
|
38
|
+
addUrlParam: addUrlParam,
|
|
39
|
+
FORMATTER_TYPES: FORMATTER_TYPES
|
|
40
|
+
};
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
移动端选人组件说明
|
|
2
|
+
=====================
|
|
3
|
+
|
|
4
|
+
## 概述
|
|
5
|
+
|
|
6
|
+
- 移动端选择平台用户、组织、岗位、群组、角色
|
|
7
|
+
|
|
8
|
+
## 使用前
|
|
9
|
+
|
|
10
|
+
- 需要在index.html中加入以下隐藏域
|
|
11
|
+
```
|
|
12
|
+
<input type="hidden" id="token" value=""/>
|
|
13
|
+
<input type="hidden" id="baseContext" value=""/>
|
|
14
|
+
```
|
|
15
|
+
- index.html的getUser方法中获取token和baseContext,并放入隐藏域
|
|
16
|
+
```
|
|
17
|
+
$("#token").val(result.token);
|
|
18
|
+
$('#baseContext').val(result.baseContext);
|
|
19
|
+
if(result.dingdingType == "corp"){
|
|
20
|
+
realCorpId = "0";
|
|
21
|
+
}
|
|
22
|
+
```
|
|
23
|
+
## 页面用法
|
|
24
|
+
|
|
25
|
+
- 示例
|
|
26
|
+
```
|
|
27
|
+
<SelectMember
|
|
28
|
+
required
|
|
29
|
+
readOnly={false}
|
|
30
|
+
placeholder="请选择"
|
|
31
|
+
label="选人组件"
|
|
32
|
+
checkType="checkbox"
|
|
33
|
+
code="common,user,org,station,group"
|
|
34
|
+
commonUsedData={this.state.commonUsedData}
|
|
35
|
+
chooseType="userAndOrg,userAndGroup"
|
|
36
|
+
fieldDataValue={this.state.fieldDataValue}
|
|
37
|
+
scopeTable={this.state.scopeTable}
|
|
38
|
+
fieldTable={this.state.fieldTable}
|
|
39
|
+
fieldData={this.state.fieldData}
|
|
40
|
+
ref="SelectMember"
|
|
41
|
+
showType="list"
|
|
42
|
+
isDelete={true}
|
|
43
|
+
includeDel="0"
|
|
44
|
+
onChange={(value)=>{t.setState({selectValue: value});}}
|
|
45
|
+
/>
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### 属性
|
|
49
|
+
|名称|类型|描述|默认值|是否必填|
|
|
50
|
+
|-----|-------|-------|-----|-----|------|
|
|
51
|
+
|required|boolean|是否有必填标志|false|否|
|
|
52
|
+
|readOnly|boolean|是否是只读形式|false|否|
|
|
53
|
+
|placeholder|string|输入框提示语||否|
|
|
54
|
+
|label|String|输入框字段名||否|
|
|
55
|
+
|checkType|String|单选或多选(值为checkbox/radio)||是|
|
|
56
|
+
|code|String|场景code码(common-常用、user-用户、org-组织、station-岗位、group-群组,以","分隔)||是|
|
|
57
|
+
|chooseType|String|userAndOrg-组织用户都可选择、userNotOrg-只可选择用户不可选择组织、org-只可选择组织不可选择用户(userAndOrg、userNotOrg、org三种type选择其一);userAndGroup-群组tab页群组和用户都可选择、userNotGroup-群组tab页只可选择用户、group-群组tab页只可选择群组(userAndGroup、userNotGroup、group三种type选择其一),以","分隔||是|
|
|
58
|
+
|commonUsedData|json格式|常用tab页显示的可选数据||否|
|
|
59
|
+
|scopeTable|String|scope储存表表名,编辑查看场景下显示已选数据|cmp_scope|否(在编辑场景下且不使用defaultValue时必填)|
|
|
60
|
+
|fieldTable|String|对应业务表表名,编辑查看场景下显示已选数据||否(在编辑查看场景下且不使用defaultValue时必填)|
|
|
61
|
+
|fieldData|String|对应业务表字段,编辑查看场景下显示已选数据||否(在编辑查看场景下且不使用defaultValue时必填)|
|
|
62
|
+
|fieldDataValue|String|对应业务表字段值,编辑查看场景下显示已选数据||否(在编辑查看场景下且不使用defaultValue时必填)|
|
|
63
|
+
|showType|String|展示方法(button-按钮,text-已选用户组织岗位群组名称,list-标签形式展示)||是|
|
|
64
|
+
|isDelete|boolean|showType值为list时,展示标签是否需要删除按钮||在showType值为list时为必填项|
|
|
65
|
+
|defaultValue|json格式|在编辑查看场景下,未使用到scope表,用自定义格式保存已选数据时,不能用scopeTable、fieldTable、fieldData、fieldDataValue初始化数据,可用defaultValue拼接数据传入,同样用ref调用初始化||否(在编辑查看场景下且不使用scopeTable、fieldTable、fieldData、fieldDataValue四个字段时必填)|
|
|
66
|
+
|queryLimit|String|1-限制传入数据自身和下级;2-限制传入数据;3-查询传入数据;4-查询传入数据自身和直接下级;5-查询传入数据自身和所有下级||否|
|
|
67
|
+
|limitData|String|与queryLimit相对应,格式为以“,”分隔的id串||否(当queryLimit传值是为必填)|
|
|
68
|
+
|includeDel|String|是否回显已删除的用户,0否/1是| |否()|
|
|
69
|
+
|
|
70
|
+
- defaultValue数据格式示例
|
|
71
|
+
```
|
|
72
|
+
[{"scopeType":"user",
|
|
73
|
+
"scopeValue":"d5ced277574011e780b3000c29ee419e",
|
|
74
|
+
"scopeName":"测试用户",
|
|
75
|
+
"imageId":""//钉钉中使用,用户需要返回用户钉钉头像
|
|
76
|
+
},
|
|
77
|
+
{"scopeType":"org",
|
|
78
|
+
"scopeValue":"d5ced277574011e780b3000c29ee412e",
|
|
79
|
+
"scopeName":"测试部门"
|
|
80
|
+
},
|
|
81
|
+
{"scopeType":"station",
|
|
82
|
+
"scopeValue":"d5ced277574011e780b3001c29ee412e",
|
|
83
|
+
"scopeName":"测试岗位"
|
|
84
|
+
},
|
|
85
|
+
{"scopeType":"group",
|
|
86
|
+
"scopeValue":"d5ced277534011e780b3001c29ee412e",
|
|
87
|
+
"scopeName":"测试群组"
|
|
88
|
+
}];
|
|
89
|
+
```
|
|
90
|
+
- commonUsedData数据格式示例(常用只支持用户选择)
|
|
91
|
+
```
|
|
92
|
+
[{"scopeType":"user",
|
|
93
|
+
"scopeValue":"d5ced277574011e780b3000c29ee419e",
|
|
94
|
+
"scopeName":"测试用户",
|
|
95
|
+
"imageId":""//钉钉中使用,用户需要返回用户钉钉头像
|
|
96
|
+
}];
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### 事件
|
|
100
|
+
|名称|参数|描述|
|
|
101
|
+
|-----|-------|-------|
|
|
102
|
+
|onChange|value|处理选择之后的返回值|
|
|
103
|
+
|
|
104
|
+
- 返回值示例
|
|
105
|
+
```
|
|
106
|
+
[{"scopeType":"user",
|
|
107
|
+
"scopeValue":"d5ced277574011e780b3000c29ee419e",
|
|
108
|
+
"scopeName":"测试用户",
|
|
109
|
+
"imageId":""//用户钉钉头像
|
|
110
|
+
},
|
|
111
|
+
{"scopeType":"org",
|
|
112
|
+
"scopeValue":"d5ced277574011e780b3000c29ee412e",
|
|
113
|
+
"scopeName":"测试部门"
|
|
114
|
+
},
|
|
115
|
+
{"scopeType":"station",
|
|
116
|
+
"scopeValue":"d5ced277574011e780b3001c29ee412e",
|
|
117
|
+
"scopeName":"测试岗位"
|
|
118
|
+
},
|
|
119
|
+
{"scopeType":"group",
|
|
120
|
+
"scopeValue":"d5ced277534011e780b3001c29ee412e",
|
|
121
|
+
"scopeName":"测试群组"
|
|
122
|
+
}];
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### 方法
|
|
126
|
+
|名称|参数|参数类型|描述|
|
|
127
|
+
|-----|-------|-------|-------|
|
|
128
|
+
|initSelectData|||初始化数据,与scopeTable、fieldTable、fieldData、fieldDataValue一起使用,用于编辑查看有已选数据的场景|
|
|
129
|
+
|dialogClearItem|isShowDialog|boolean|清空已选数据,参数为是否需要弹出框提醒|
|
|
130
|
+
|
|
131
|
+
- 方法使用示例(使用ref调用选人组件中的方法)
|
|
132
|
+
```
|
|
133
|
+
this.setState({
|
|
134
|
+
fieldDataValue: "5381b1a3cf41410194d385132cdc8442",
|
|
135
|
+
scopeTable: "oa_meeting_scope",
|
|
136
|
+
fieldTable: "oa_meeting_apply_record",
|
|
137
|
+
fieldData: "attend_user"
|
|
138
|
+
},()=>{t.refs.SelectMember.initSelectData()});
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## 注意事项
|
|
142
|
+
- scopeTable、fieldTable、fieldData、fieldDataValue需要配套使用
|
|
143
|
+
- defaultValue与上述4个参数都是用于编辑查看有已选数据的场景初始化,都是用ref方法调用,二选一即可
|
|
144
|
+
- 用户和组织合并,用户组织都可选择时tab页显示为组织
|
|
145
|
+
- 群组中希望可选择到群组下的用户时,chooseType传入userAndGroup或userNotGroup
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
/**
|
|
7
|
+
* Created by louizhai on 17/6/30.
|
|
8
|
+
* description: Use canvas to draw.
|
|
9
|
+
*/
|
|
10
|
+
function Draw(canvas, degree) {
|
|
11
|
+
var config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
12
|
+
|
|
13
|
+
if (!(this instanceof Draw)) {
|
|
14
|
+
return new Draw(canvas, config);
|
|
15
|
+
}
|
|
16
|
+
if (!canvas) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
var _window$getComputedSt = window.getComputedStyle(canvas, null),
|
|
21
|
+
width = _window$getComputedSt.width,
|
|
22
|
+
height = _window$getComputedSt.height;
|
|
23
|
+
|
|
24
|
+
width = width.replace('px', '');
|
|
25
|
+
height = height.replace('px', '');
|
|
26
|
+
|
|
27
|
+
width = parseFloat(width);
|
|
28
|
+
// height = parseFloat(height);
|
|
29
|
+
height = width / 2;
|
|
30
|
+
|
|
31
|
+
// debugger;
|
|
32
|
+
this.canvas = canvas;
|
|
33
|
+
this.context = canvas.getContext('2d');
|
|
34
|
+
this.width = width;
|
|
35
|
+
this.height = height;
|
|
36
|
+
var context = this.context;
|
|
37
|
+
|
|
38
|
+
// 根据设备像素比优化canvas绘图
|
|
39
|
+
var devicePixelRatio = window.devicePixelRatio;
|
|
40
|
+
if (devicePixelRatio) {
|
|
41
|
+
canvas.style.width = width + 'px';
|
|
42
|
+
canvas.style.height = height + 'px';
|
|
43
|
+
canvas.height = height * devicePixelRatio;
|
|
44
|
+
canvas.width = width * devicePixelRatio;
|
|
45
|
+
context.scale(devicePixelRatio, devicePixelRatio);
|
|
46
|
+
} else {
|
|
47
|
+
canvas.width = width;
|
|
48
|
+
canvas.height = height;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
context.lineWidth = 6;
|
|
52
|
+
context.strokeStyle = 'black';
|
|
53
|
+
context.lineCap = 'round';
|
|
54
|
+
context.lineJoin = 'round';
|
|
55
|
+
Object.assign(context, config);
|
|
56
|
+
|
|
57
|
+
var _canvas$getBoundingCl = canvas.getBoundingClientRect(),
|
|
58
|
+
left = _canvas$getBoundingCl.left,
|
|
59
|
+
top = _canvas$getBoundingCl.top;
|
|
60
|
+
|
|
61
|
+
var point = {};
|
|
62
|
+
var isMobile = /phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone/i.test(navigator.userAgent);
|
|
63
|
+
// 移动端性能太弱, 去掉模糊以提高手写渲染速度
|
|
64
|
+
if (!isMobile) {
|
|
65
|
+
context.shadowBlur = 1;
|
|
66
|
+
context.shadowColor = 'black';
|
|
67
|
+
}
|
|
68
|
+
var pressed = false;
|
|
69
|
+
|
|
70
|
+
var paint = function paint(signal) {
|
|
71
|
+
switch (signal) {
|
|
72
|
+
case 1:
|
|
73
|
+
context.beginPath();
|
|
74
|
+
context.moveTo(point.x, point.y);
|
|
75
|
+
case 2:
|
|
76
|
+
context.lineTo(point.x, point.y);
|
|
77
|
+
context.stroke();
|
|
78
|
+
break;
|
|
79
|
+
default:
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
var create = function create(signal) {
|
|
83
|
+
return function (e) {
|
|
84
|
+
e.preventDefault();
|
|
85
|
+
if (signal === 1) {
|
|
86
|
+
pressed = true;
|
|
87
|
+
}
|
|
88
|
+
if (signal === 1 || pressed) {
|
|
89
|
+
e = isMobile ? e.touches[0] : e;
|
|
90
|
+
point.x = e.clientX - left;
|
|
91
|
+
point.y = e.clientY - top;
|
|
92
|
+
paint(signal);
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
};
|
|
96
|
+
var start = create(1);
|
|
97
|
+
var move = create(2);
|
|
98
|
+
var requestAnimationFrame = window.requestAnimationFrame;
|
|
99
|
+
var optimizedMove = requestAnimationFrame ? function (e) {
|
|
100
|
+
requestAnimationFrame(function () {
|
|
101
|
+
move(e);
|
|
102
|
+
});
|
|
103
|
+
} : move;
|
|
104
|
+
|
|
105
|
+
if (isMobile) {
|
|
106
|
+
canvas.addEventListener('touchstart', start);
|
|
107
|
+
canvas.addEventListener('touchmove', optimizedMove);
|
|
108
|
+
} else {
|
|
109
|
+
canvas.addEventListener('mousedown', start);
|
|
110
|
+
canvas.addEventListener('mousemove', optimizedMove);
|
|
111
|
+
['mouseup', 'mouseleave'].forEach(function (event) {
|
|
112
|
+
canvas.addEventListener(event, function () {
|
|
113
|
+
pressed = false;
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// 重置画布坐标系
|
|
119
|
+
if (typeof degree === 'number') {
|
|
120
|
+
this.degree = degree;
|
|
121
|
+
context.rotate(degree * Math.PI / 180);
|
|
122
|
+
switch (degree) {
|
|
123
|
+
case -90:
|
|
124
|
+
context.translate(-height, 0);
|
|
125
|
+
break;
|
|
126
|
+
case 90:
|
|
127
|
+
context.translate(0, -width);
|
|
128
|
+
break;
|
|
129
|
+
case -180:
|
|
130
|
+
case 180:
|
|
131
|
+
context.translate(-width, -height);
|
|
132
|
+
break;
|
|
133
|
+
default:
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
Draw.prototype = {
|
|
138
|
+
scale: function scale(width, height) {
|
|
139
|
+
var canvas = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.canvas;
|
|
140
|
+
|
|
141
|
+
var w = canvas.width;
|
|
142
|
+
var h = canvas.height;
|
|
143
|
+
width = width || w;
|
|
144
|
+
height = width / 2;
|
|
145
|
+
if (width !== w || height !== h) {
|
|
146
|
+
var tmpCanvas = document.createElement('canvas');
|
|
147
|
+
var tmpContext = tmpCanvas.getContext('2d');
|
|
148
|
+
tmpCanvas.width = width;
|
|
149
|
+
tmpCanvas.height = height;
|
|
150
|
+
tmpContext.drawImage(canvas, 0, 0, w, h, 0, 0, width, height);
|
|
151
|
+
canvas = tmpCanvas;
|
|
152
|
+
}
|
|
153
|
+
return canvas;
|
|
154
|
+
},
|
|
155
|
+
rotate: function rotate(degree) {
|
|
156
|
+
var image = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.canvas;
|
|
157
|
+
|
|
158
|
+
degree = ~~degree;
|
|
159
|
+
if (degree !== 0) {
|
|
160
|
+
var maxDegree = 180;
|
|
161
|
+
var minDegree = -90;
|
|
162
|
+
if (degree > maxDegree) {
|
|
163
|
+
degree = maxDegree;
|
|
164
|
+
} else if (degree < minDegree) {
|
|
165
|
+
degree = minDegree;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
var canvas = document.createElement('canvas');
|
|
169
|
+
var context = canvas.getContext('2d');
|
|
170
|
+
var width = image.width;
|
|
171
|
+
var height = width / 2;
|
|
172
|
+
var degreePI = degree * Math.PI / 180;
|
|
173
|
+
|
|
174
|
+
switch (degree) {
|
|
175
|
+
// 逆时针旋转90°
|
|
176
|
+
case -90:
|
|
177
|
+
canvas.width = height;
|
|
178
|
+
canvas.height = width;
|
|
179
|
+
context.rotate(degreePI);
|
|
180
|
+
context.drawImage(image, -width, 0);
|
|
181
|
+
break;
|
|
182
|
+
// 顺时针旋转90°
|
|
183
|
+
case 90:
|
|
184
|
+
canvas.width = height;
|
|
185
|
+
canvas.height = width;
|
|
186
|
+
context.rotate(degreePI);
|
|
187
|
+
context.drawImage(image, 0, -height);
|
|
188
|
+
break;
|
|
189
|
+
// 顺时针旋转180°
|
|
190
|
+
case 180:
|
|
191
|
+
canvas.width = width;
|
|
192
|
+
canvas.height = height;
|
|
193
|
+
context.rotate(degreePI);
|
|
194
|
+
context.drawImage(image, -width, -height);
|
|
195
|
+
break;
|
|
196
|
+
default:
|
|
197
|
+
}
|
|
198
|
+
image = canvas;
|
|
199
|
+
}
|
|
200
|
+
return image;
|
|
201
|
+
},
|
|
202
|
+
getPNGImage: function getPNGImage() {
|
|
203
|
+
var canvas = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.canvas;
|
|
204
|
+
|
|
205
|
+
return canvas.toDataURL('image/png');
|
|
206
|
+
},
|
|
207
|
+
getJPGImage: function getJPGImage() {
|
|
208
|
+
var canvas = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.canvas;
|
|
209
|
+
|
|
210
|
+
return canvas.toDataURL('image/jpeg', 0.5);
|
|
211
|
+
},
|
|
212
|
+
downloadPNGImage: function downloadPNGImage(image) {
|
|
213
|
+
var url = image.replace('image/png', 'image/octet-stream;Content-Disposition:attachment;filename=test.png');
|
|
214
|
+
// "/dingisv/api/common/createFile"
|
|
215
|
+
debugger;
|
|
216
|
+
window.location.href = url;
|
|
217
|
+
},
|
|
218
|
+
dataURLtoBlob: function dataURLtoBlob(dataURL) {
|
|
219
|
+
var arr = dataURL.split(',');
|
|
220
|
+
var mime = arr[0].match(/:(.*?);/)[1];
|
|
221
|
+
var bStr = atob(arr[1]);
|
|
222
|
+
var n = bStr.length;
|
|
223
|
+
var u8arr = new Uint8Array(n);
|
|
224
|
+
while (n--) {
|
|
225
|
+
u8arr[n] = bStr.charCodeAt(n);
|
|
226
|
+
}
|
|
227
|
+
return new Blob([u8arr], { type: mime });
|
|
228
|
+
},
|
|
229
|
+
clear: function clear() {
|
|
230
|
+
var width = void 0;
|
|
231
|
+
var height = void 0;
|
|
232
|
+
switch (this.degree) {
|
|
233
|
+
case -90:
|
|
234
|
+
case 90:
|
|
235
|
+
width = this.height;
|
|
236
|
+
height = this.width;
|
|
237
|
+
break;
|
|
238
|
+
default:
|
|
239
|
+
height = this.height;
|
|
240
|
+
width = this.width;
|
|
241
|
+
}
|
|
242
|
+
this.context.clearRect(0, 0, width, height);
|
|
243
|
+
},
|
|
244
|
+
upload: function upload(blob, url, success, failure) {
|
|
245
|
+
var formData = new FormData();
|
|
246
|
+
var xhr = new XMLHttpRequest();
|
|
247
|
+
xhr.withCredentials = true;
|
|
248
|
+
formData.append('image', blob, 'sign');
|
|
249
|
+
|
|
250
|
+
xhr.open('POST', url, true);
|
|
251
|
+
xhr.onload = function () {
|
|
252
|
+
if (xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) {
|
|
253
|
+
success(xhr.responseText);
|
|
254
|
+
} else {
|
|
255
|
+
failure();
|
|
256
|
+
}
|
|
257
|
+
};
|
|
258
|
+
xhr.onerror = function (e) {
|
|
259
|
+
if (typeof failure === 'function') {
|
|
260
|
+
failure(e);
|
|
261
|
+
} else {
|
|
262
|
+
console.log('upload img error: ' + e);
|
|
263
|
+
}
|
|
264
|
+
};
|
|
265
|
+
xhr.send(formData);
|
|
266
|
+
}
|
|
267
|
+
};
|
|
268
|
+
exports.default = Draw;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
|
|
7
|
+
var _sign = require('./sign');
|
|
8
|
+
|
|
9
|
+
Object.defineProperty(exports, 'default', {
|
|
10
|
+
enumerable: true,
|
|
11
|
+
get: function get() {
|
|
12
|
+
return _interopRequireDefault(_sign).default;
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|