feat: 后端全量更新 - 含所有本次需求

- Contract.php: 返回合约账户余额(balance_contract)
- My.php: 地址管理增加BTC/ETH
- AppContract.php: 一键平仓(closeall)
- AppProxy.php: 代理专属注册链接 + 分级权限(L1/L2)
- site.php: 手续费减半(0.018→0.009)
- agent_permission_setup.sql: 代理权限SQL
- crypto_news_crawler.py: 新闻自动采集脚本
This commit is contained in:
li
2026-03-30 20:16:32 +08:00
commit 1b24994e74
6721 changed files with 1308571 additions and 0 deletions
+547
View File
@@ -0,0 +1,547 @@
.CodeMirror {
font-family: monospace;
height: auto;
color: black;
border: #ccc 1px solid
}
.CodeMirror-lines {
padding: 4px 0
}
.CodeMirror pre {
padding: 0 4px
}
.CodeMirror-scrollbar-filler,.CodeMirror-gutter-filler {
background-color: white
}
.CodeMirror-gutters {
border-right: 1px solid #ddd;
background-color: #f7f7f7;
white-space: nowrap
}
.CodeMirror-linenumber {
padding: 0 3px 0 5px;
min-width: 20px;
text-align: right;
color: #999;
white-space: nowrap
}
.CodeMirror-guttermarker {
color: black
}
.CodeMirror-guttermarker-subtle {
color: #999
}
.CodeMirror-cursor {
border-left: 1px solid black;
border-right: 0;
width: 0
}
.CodeMirror div.CodeMirror-secondarycursor {
border-left: 1px solid silver
}
.cm-fat-cursor .CodeMirror-cursor {
width: auto;
border: 0!important;
background: #7e7
}
.cm-fat-cursor div.CodeMirror-cursors {
z-index: 1
}
.cm-animate-fat-cursor {
width: auto;
border: 0;
-webkit-animation: blink 1.06s steps(1) infinite;
-moz-animation: blink 1.06s steps(1) infinite;
animation: blink 1.06s steps(1) infinite;
background-color: #7e7
}
@-moz-keyframes blink {
50% {
background-color: transparent
}
}
@-webkit-keyframes blink {
50% {
background-color: transparent
}
}
@keyframes blink {
50% {
background-color: transparent
}
}
.cm-tab {
display: inline-block;
text-decoration: inherit
}
.CodeMirror-rulers {
position: absolute;
left: 0;
right: 0;
top: -50px;
bottom: -20px;
overflow: hidden
}
.CodeMirror-ruler {
border-left: 1px solid #ccc;
top: 0;
bottom: 0;
position: absolute
}
.cm-s-default .cm-header {
color: blue
}
.cm-s-default .cm-quote {
color: #090
}
.cm-negative {
color: #d44
}
.cm-positive {
color: #292
}
.cm-header,.cm-strong {
font-weight: bold
}
.cm-em {
font-style: italic
}
.cm-link {
text-decoration: underline
}
.cm-strikethrough {
text-decoration: line-through
}
.cm-s-default .cm-keyword {
color: #708
}
.cm-s-default .cm-atom {
color: #219
}
.cm-s-default .cm-number {
color: #164
}
.cm-s-default .cm-def {
color: #00f
}
.cm-s-default .cm-variable-2 {
color: #05a
}
.cm-s-default .cm-variable-3 {
color: #085
}
.cm-s-default .cm-comment {
color: #a50
}
.cm-s-default .cm-string {
color: #a11
}
.cm-s-default .cm-string-2 {
color: #f50
}
.cm-s-default .cm-meta {
color: #555
}
.cm-s-default .cm-qualifier {
color: #555
}
.cm-s-default .cm-builtin {
color: #30a
}
.cm-s-default .cm-bracket {
color: #997
}
.cm-s-default .cm-tag {
color: #170
}
.cm-s-default .cm-attribute {
color: #00c
}
.cm-s-default .cm-hr {
color: #999
}
.cm-s-default .cm-link {
color: #00c
}
.cm-s-default .cm-error {
color: #f00
}
.cm-invalidchar {
color: #f00
}
.CodeMirror-composing {
border-bottom: 2px solid
}
div.CodeMirror span.CodeMirror-matchingbracket {
color: #0f0
}
div.CodeMirror span.CodeMirror-nonmatchingbracket {
color: #f22
}
.CodeMirror-matchingtag {
background: rgba(255,150,0,.3)
}
.CodeMirror-activeline-background {
background: #e8f2ff
}
.CodeMirror {
position: relative;
overflow: hidden;
background: white
}
.CodeMirror-scroll {
overflow: scroll!important;
margin-bottom: -30px;
margin-right: -30px;
padding-bottom: 30px;
height: 100%;
outline: 0;
position: relative
}
.CodeMirror-sizer {
position: relative;
border-right: 30px solid transparent
}
.CodeMirror-vscrollbar,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-gutter-filler {
position: absolute;
z-index: 6;
display: none
}
.CodeMirror-vscrollbar {
right: 0;
top: 0;
overflow-x: hidden;
overflow-y: scroll
}
.CodeMirror-hscrollbar {
bottom: 0;
left: 0;
overflow-y: hidden;
overflow-x: scroll
}
.CodeMirror-scrollbar-filler {
right: 0;
bottom: 0
}
.CodeMirror-gutter-filler {
left: 0;
bottom: 0
}
.CodeMirror-gutters {
position: absolute;
left: 0;
top: 0;
min-height: 100%;
z-index: 3
}
.CodeMirror-gutter {
white-space: normal;
height: 100%;
display: inline-block;
vertical-align: top;
margin-bottom: -30px
}
.CodeMirror-gutter-wrapper {
position: absolute;
z-index: 4;
background: none!important;
border: none!important
}
.CodeMirror-gutter-background {
position: absolute;
top: 0;
bottom: 0;
z-index: 4
}
.CodeMirror-gutter-elt {
position: absolute;
cursor: default;
z-index: 4
}
.CodeMirror-gutter-wrapper {
-webkit-user-select: none;
-moz-user-select: none;
user-select: none
}
.CodeMirror-lines {
cursor: text;
min-height: 1px
}
.CodeMirror pre {
-moz-border-radius: 0;
-webkit-border-radius: 0;
border-radius: 0;
border-width: 0;
background: transparent;
font-family: inherit;
font-size: inherit;
margin: 0;
white-space: pre;
word-wrap: normal;
line-height: inherit;
color: inherit;
z-index: 2;
position: relative;
overflow: visible;
-webkit-tap-highlight-color: transparent;
-webkit-font-variant-ligatures: none;
font-variant-ligatures: none
}
.CodeMirror-wrap pre {
word-wrap: break-word;
white-space: pre-wrap;
word-break: normal
}
.CodeMirror-linebackground {
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
z-index: 0
}
.CodeMirror-linewidget {
position: relative;
z-index: 2;
overflow: auto
}
.CodeMirror-code {
outline: 0
}
.CodeMirror-scroll,.CodeMirror-sizer,.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber {
-moz-box-sizing: content-box;
box-sizing: content-box
}
.CodeMirror-measure {
position: absolute;
width: 100%;
height: 0;
overflow: hidden;
visibility: hidden
}
.CodeMirror-cursor {
position: absolute;
pointer-events: none
}
.CodeMirror-measure pre {
position: static
}
div.CodeMirror-cursors {
visibility: hidden;
position: relative;
z-index: 3
}
div.CodeMirror-dragcursors {
visibility: visible
}
.CodeMirror-focused div.CodeMirror-cursors {
visibility: visible
}
.CodeMirror-selected {
background: #d9d9d9
}
.CodeMirror-focused .CodeMirror-selected {
background: #d7d4f0
}
.CodeMirror-crosshair {
cursor: crosshair
}
.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection {
background: #d7d4f0
}
.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection {
background: #d7d4f0
}
.cm-searching {
background: #ffa;
background: rgba(255,255,0,.4)
}
.cm-force-border {
padding-right: .1px
}
@media print {
.CodeMirror div.CodeMirror-cursors {
visibility: hidden
}
}
.cm-tab-wrap-hack:after {
content: ''
}
span.CodeMirror-selectedtext {
background: 0
}
.CodeMirror-hints {
position: absolute;
z-index: 10;
overflow: hidden;
list-style: none;
margin: 0;
padding: 2px;
-webkit-box-shadow: 2px 3px 5px rgba(0,0,0,.2);
-moz-box-shadow: 2px 3px 5px rgba(0,0,0,.2);
box-shadow: 2px 3px 5px rgba(0,0,0,.2);
border-radius: 3px;
border: 1px solid silver;
background: white;
font-size: 90%;
font-family: monospace;
max-height: 20em;
overflow-y: auto
}
.CodeMirror-hint {
margin: 0;
padding: 0 4px;
border-radius: 2px;
white-space: pre;
color: black;
cursor: pointer
}
li.CodeMirror-hint-active {
background: #08f;
color: white
}
.CodeMirror-dialog {
position: absolute;
left: 0;
right: 0;
background: inherit;
z-index: 15;
padding: .4em .8em;
overflow: hidden;
color: inherit
}
.CodeMirror-dialog-top {
border-bottom: 1px solid #eee;
top: 0
}
.CodeMirror-dialog-bottom {
border-top: 1px solid #eee;
bottom: 0
}
.CodeMirror-dialog input {
border: 0;
outline: 0;
background: transparent;
width: 20em;
color: inherit;
font-family: monospace
}
.CodeMirror-dialog button {
font-size: 70%
}
.Dialog-close {
color: #111;
float: right;
font-family: Arial;
font-size: 16px;
height: 30px;
line-height: 30px;
text-align: center;
width: 30px;
cursor: pointer
}
.CodeMirror-search-match {
background: gold;
border-top: 1px solid orange;
border-bottom: 1px solid orange;
-moz-box-sizing: border-box;
box-sizing: border-box;
opacity: .5
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 771 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 729 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

File diff suppressed because it is too large Load Diff
+611
View File
@@ -0,0 +1,611 @@
/*!jQuery Knob*/
/**
* Downward compatible, touchable dial
*
* Version: 1.2.12
* Requires: jQuery v1.7+
*
* Copyright (c) 2012 Anthony Terrien
* Under MIT License (http://www.opensource.org/licenses/mit-license.php)
*
* Thanks to vor, eskimoblood, spiffistan, FabrizioC
*/
(function(factory) {
if (typeof exports === 'object') {
// CommonJS
module.exports = factory(require('jquery'));
} else if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(['jquery'], factory);
} else {
// Browser globals
factory(jQuery);
}
} (function($) {
/**
* Kontrol library
*/
"use strict";
/**
* Definition of globals and core
*/
var k = {},
// kontrol
max = Math.max,
min = Math.min;
k.c = {};
k.c.d = $(document);
k.c.t = function(e) {
return e.originalEvent.touches.length - 1;
};
/**
* Kontrol Object
*
* Definition of an abstract UI control
*
* Each concrete component must call this one.
* <code>
* k.o.call(this);
* </code>
*/
k.o = function() {
var s = this;
this.o = null; // array of options
this.$ = null; // jQuery wrapped element
this.i = null; // mixed HTMLInputElement or array of HTMLInputElement
this.g = null; // deprecated 2D graphics context for 'pre-rendering'
this.v = null; // value ; mixed array or integer
this.cv = null; // change value ; not commited value
this.x = 0; // canvas x position
this.y = 0; // canvas y position
this.w = 0; // canvas width
this.h = 0; // canvas height
this.$c = null; // jQuery canvas element
this.c = null; // rendered canvas context
this.t = 0; // touches index
this.isInit = false;
this.fgColor = null; // main color
this.pColor = null; // previous color
this.dH = null; // draw hook
this.cH = null; // change hook
this.eH = null; // cancel hook
this.rH = null; // release hook
this.scale = 1; // scale factor
this.relative = false;
this.relativeWidth = false;
this.relativeHeight = false;
this.$div = null; // component div
this.run = function() {
var cf = function(e, conf) {
var k;
for (k in conf) {
s.o[k] = conf[k];
}
s._carve().init();
s._configure()._draw();
};
if (this.$.data('kontroled')) return;
this.$.data('kontroled', true);
this.extend();
this.o = $.extend({
// Config
min: this.$.data('min') !== undefined ? this.$.data('min') : 0,
max: this.$.data('max') !== undefined ? this.$.data('max') : 100,
stopper: true,
readOnly: this.$.data('readonly') || (this.$.attr('readonly') === 'readonly'),
// UI
cursor: this.$.data('cursor') === true && 30 || this.$.data('cursor') || 0,
thickness: this.$.data('thickness') && Math.max(Math.min(this.$.data('thickness'), 1), 0.01) || 0.35,
lineCap: this.$.data('linecap') || 'butt',
width: this.$.data('width') || 200,
height: this.$.data('height') || 200,
displayInput: this.$.data('displayinput') == null || this.$.data('displayinput'),
displayPrevious: this.$.data('displayprevious'),
fgColor: this.$.data('fgcolor') || '#87CEEB',
inputColor: this.$.data('inputcolor'),
font: this.$.data('font') || 'Arial',
fontWeight: this.$.data('font-weight') || 'bold',
inline: false,
step: this.$.data('step') || 1,
rotation: this.$.data('rotation'),
// Hooks
draw: null,
// function () {}
change: null,
// function (value) {}
cancel: null,
// function () {}
release: null,
// function (value) {}
// Output formatting, allows to add unit: %, ms ...
format: function(v) {
return v;
},
parse: function(v) {
return parseFloat(v);
}
},
this.o);
// finalize options
this.o.flip = this.o.rotation === 'anticlockwise' || this.o.rotation === 'acw';
if (!this.o.inputColor) {
this.o.inputColor = this.o.fgColor;
}
// routing value
if (this.$.is('fieldset')) {
// fieldset = array of integer
this.v = {};
this.i = this.$.find('input');
this.i.each(function(k) {
var $this = $(this);
s.i[k] = $this;
s.v[k] = s.o.parse($this.val());
$this.bind('change blur',
function() {
var val = {};
val[k] = $this.val();
s.val(s._validate(val));
});
});
this.$.find('legend').remove();
} else {
// input = integer
this.i = this.$;
this.v = this.o.parse(this.$.val());
this.v === '' && (this.v = this.o.min);
this.$.bind('change blur',
function() {
s.val(s._validate(s.o.parse(s.$.val())));
});
} ! this.o.displayInput && this.$.hide();
// adds needed DOM elements (canvas, div)
this.$c = $(document.createElement('canvas')).attr({
width: this.o.width,
height: this.o.height
});
// wraps all elements in a div
// add to DOM before Canvas init is triggered
this.$div = $('<div style="' + (this.o.inline ? 'display:inline;': '') + 'width:' + this.o.width + 'px;height:' + this.o.height + 'px;' + '"></div>');
this.$.wrap(this.$div).before(this.$c);
this.$div = this.$.parent();
if (typeof G_vmlCanvasManager !== 'undefined') {
G_vmlCanvasManager.initElement(this.$c[0]);
}
this.c = this.$c[0].getContext ? this.$c[0].getContext('2d') : null;
if (!this.c) {
throw {
name: "CanvasNotSupportedException",
message: "Canvas not supported. Please use excanvas on IE8.0.",
toString: function() {
return this.name + ": " + this.message
}
}
}
// hdpi support
this.scale = (window.devicePixelRatio || 1) / (this.c.webkitBackingStorePixelRatio || this.c.mozBackingStorePixelRatio || this.c.msBackingStorePixelRatio || this.c.oBackingStorePixelRatio || this.c.backingStorePixelRatio || 1);
// detects relative width / height
this.relativeWidth = this.o.width % 1 !== 0 && this.o.width.indexOf('%');
this.relativeHeight = this.o.height % 1 !== 0 && this.o.height.indexOf('%');
this.relative = this.relativeWidth || this.relativeHeight;
// computes size and carves the component
this._carve();
// prepares props for transaction
if (this.v instanceof Object) {
this.cv = {};
this.copy(this.v, this.cv);
} else {
this.cv = this.v;
}
// binds configure event
this.$.bind("configure", cf).parent().bind("configure", cf);
// finalize init
this._listen()._configure()._xy().init();
this.isInit = true;
this.$.val(this.o.format(this.v));
this._draw();
return this;
};
this._carve = function() {
if (this.relative) {
var w = this.relativeWidth ? this.$div.parent().width() * parseInt(this.o.width) / 100 : this.$div.parent().width(),
h = this.relativeHeight ? this.$div.parent().height() * parseInt(this.o.height) / 100 : this.$div.parent().height();
// apply relative
this.w = this.h = Math.min(w, h);
} else {
this.w = this.o.width;
this.h = this.o.height;
}
// finalize div
this.$div.css({
'width': this.w + 'px',
'height': this.h + 'px'
});
// finalize canvas with computed width
this.$c.attr({
width: this.w,
height: this.h
});
// scaling
if (this.scale !== 1) {
this.$c[0].width = this.$c[0].width * this.scale;
this.$c[0].height = this.$c[0].height * this.scale;
this.$c.width(this.w);
this.$c.height(this.h);
}
return this;
};
this._draw = function() {
// canvas pre-rendering
var d = true;
s.g = s.c;
s.clear();
s.dH && (d = s.dH());
d !== false && s.draw();
};
this._touch = function(e) {
var touchMove = function(e) {
var v = s.xy2val(e.originalEvent.touches[s.t].pageX, e.originalEvent.touches[s.t].pageY);
if (v == s.cv) return;
if (s.cH && s.cH(v) === false) return;
s.change(s._validate(v));
s._draw();
};
// get touches index
this.t = k.c.t(e);
// First touch
touchMove(e);
// Touch events listeners
k.c.d.bind("touchmove.k", touchMove).bind("touchend.k",
function() {
k.c.d.unbind('touchmove.k touchend.k');
s.val(s.cv);
});
return this;
};
this._mouse = function(e) {
var mouseMove = function(e) {
var v = s.xy2val(e.pageX, e.pageY);
if (v == s.cv) return;
if (s.cH && (s.cH(v) === false)) return;
s.change(s._validate(v));
s._draw();
};
// First click
mouseMove(e);
// Mouse events listeners
k.c.d.bind("mousemove.k", mouseMove).bind(
// Escape key cancel current change
"keyup.k",function(e) {
if (e.keyCode === 27) {
k.c.d.unbind("mouseup.k mousemove.k keyup.k");
if (s.eH && s.eH() === false) return;
s.cancel();
}
}).bind("mouseup.k",function(e) {
k.c.d.unbind('mousemove.k mouseup.k keyup.k');
s.val(s.cv);
});
return this;
};
this._xy = function() {
var o = this.$c.offset();
this.x = o.left;
this.y = o.top;
return this;
};
this._listen = function() {
if (!this.o.readOnly) {
this.$c.bind("mousedown",function(e) {
e.preventDefault();
if (e.stopPropagation) {
e.stopPropagation();
} else {
e.cancelBubble = true;
}
s._xy()._mouse(e);
}).bind("touchstart",function(e) {
e.preventDefault();
s._xy()._touch(e);
});
this.listen();
} else {
this.$.attr('readonly', 'readonly');
}
if (this.relative) {
$(window).resize(function() {
s._carve().init();
s._draw();
});
}
return this;
};
this._configure = function() {
// Hooks
if (this.o.draw) this.dH = this.o.draw;
if (this.o.change) this.cH = this.o.change;
if (this.o.cancel) this.eH = this.o.cancel;
if (this.o.release) this.rH = this.o.release;
if (this.o.displayPrevious) {
this.pColor = this.h2rgba(this.o.fgColor, "0.4");
this.fgColor = this.h2rgba(this.o.fgColor, "0.6");
} else {
this.fgColor = this.o.fgColor;
}
return this;
};
this._clear = function() {
this.$c[0].width = this.$c[0].width;
};
this._validate = function(v) {
var val = (~~ (((v < 0) ? -0.5 : 0.5) + (v / this.o.step))) * this.o.step;
return Math.round(val * 100) / 100;
};
// Abstract methods
this.listen = function() {}; // on start, one time
this.extend = function() {}; // each time configure triggered
this.init = function() {}; // each time configure triggered
this.change = function(v) {}; // on change
this.val = function(v) {}; // on release
this.xy2val = function(x, y) {}; //
this.draw = function() {}; // on change / on release
this.clear = function() {
this._clear();
};
// Utils
this.h2rgba = function(h, a) {
var rgb;
h = h.substring(1, 7);
rgb = [parseInt(h.substring(0, 2), 16), parseInt(h.substring(2, 4), 16), parseInt(h.substring(4, 6), 16)];
return "rgba(" + rgb[0] + "," + rgb[1] + "," + rgb[2] + "," + a + ")";
};
this.copy = function(f, t) {
for (var i in f) {
t[i] = f[i];
}
};
};
/**
* k.Dial
*/
k.Dial = function() {
k.o.call(this);
this.startAngle = null;
this.xy = null;
this.radius = null;
this.lineWidth = null;
this.cursorExt = null;
this.w2 = null;
this.PI2 = 2 * Math.PI;
this.extend = function() {
this.o = $.extend({
bgColor: this.$.data('bgcolor') || '#EEEEEE',
angleOffset: this.$.data('angleoffset') || 0,
angleArc: this.$.data('anglearc') || 360,
inline: true
},
this.o);
};
this.val = function(v, triggerRelease) {
if (null != v) {
// reverse format
v = this.o.parse(v);
if (triggerRelease !== false && v != this.v && this.rH && this.rH(v) === false) {
return;
}
this.cv = this.o.stopper ? max(min(v, this.o.max), this.o.min) : v;
this.v = this.cv;
this.$.val(this.o.format(this.v));
this._draw();
} else {
return this.v;
}
};
this.xy2val = function(x, y) {
var a, ret;
a = Math.atan2(x - (this.x + this.w2), -(y - this.y - this.w2)) - this.angleOffset;
if (this.o.flip) {
a = this.angleArc - a - this.PI2;
}
if (this.angleArc != this.PI2 && (a < 0) && (a > -0.5)) {
// if isset angleArc option, set to min if .5 under min
a = 0;
} else if (a < 0) {
a += this.PI2;
}
ret = (a * (this.o.max - this.o.min) / this.angleArc) + this.o.min;
this.o.stopper && (ret = max(min(ret, this.o.max), this.o.min));
return ret;
};
this.listen = function() {
// bind MouseWheel
var s = this, mwTimerStop, mwTimerRelease, mw = function(e) {
e.preventDefault();
if (e.stopPropagation) {
e.stopPropagation();
} else {
e.cancelBubble = true;
}
var ori = e.originalEvent,
deltaX = ori.detail || ori.wheelDeltaX,
deltaY = ori.detail || ori.wheelDeltaY,
v = s._validate(s.o.parse(s.$.val())) + (deltaX > 0 || deltaY > 0 ? s.o.step: deltaX < 0 || deltaY < 0 ? -s.o.step: 0);
v = max(min(v, s.o.max), s.o.min);
s.val(v, false);
if (s.rH) {
// Handle mousewheel stop
clearTimeout(mwTimerStop);
mwTimerStop = setTimeout(function() {
s.rH(v);
mwTimerStop = null;
},
100);
// Handle mousewheel releases
if (!mwTimerRelease) {
mwTimerRelease = setTimeout(function() {
if (mwTimerStop) s.rH(v);
mwTimerRelease = null;
},
200);
}
}
if (s.cH) {
s.cH(v);
}
},
kval,
to,
m = 1,
kv = {
37 : -s.o.step,
38 : s.o.step,
39 : s.o.step,
40 : -s.o.step
};
this.$.bind("keydown",function(e) {
var kc = e.keyCode;
// numpad support
if (kc >= 96 && kc <= 105) {
kc = e.keyCode = kc - 48;
}
kval = parseInt(String.fromCharCode(kc));
if (isNaN(kval)) { (kc !== 13) // enter
&& kc !== 8 // bs
&& kc !== 9 // tab
&& kc !== 189 // -
&& (kc !== 190 || s.$.val().match(/\./)) // . allowed once
&& e.preventDefault();
// arrows
if ($.inArray(kc, [37, 38, 39, 40]) > -1) {
e.preventDefault();
var v = s.o.parse(s.$.val()) + kv[kc] * m;
s.o.stopper && (v = max(min(v, s.o.max), s.o.min));
s.change(s._validate(v));
s._draw();
// long time keydown speed-up
to = window.setTimeout(function() {
m *= 2;
},
30);
}
}
}).bind("keyup",function(e) {
if (isNaN(kval)) {
if (to) {
window.clearTimeout(to);
to = null;
m = 1;
s.val(s.$.val());
}
} else {
// kval postcond
(s.$.val() > s.o.max && s.$.val(s.o.max)) || (s.$.val() < s.o.min && s.$.val(s.o.min));
}
});
this.$c.bind("mousewheel DOMMouseScroll", mw);
this.$.bind("mousewheel DOMMouseScroll", mw);
};
this.init = function() {
if (this.v < this.o.min || this.v > this.o.max) {
this.v = this.o.min;
}
this.$.val(this.v);
this.w2 = this.w / 2;
this.cursorExt = this.o.cursor / 100;
this.xy = this.w2 * this.scale;
this.lineWidth = this.xy * this.o.thickness;
this.lineCap = this.o.lineCap;
this.radius = this.xy - this.lineWidth / 2;
this.o.angleOffset && (this.o.angleOffset = isNaN(this.o.angleOffset) ? 0 : this.o.angleOffset);
this.o.angleArc && (this.o.angleArc = isNaN(this.o.angleArc) ? this.PI2: this.o.angleArc);
// deg to rad
this.angleOffset = this.o.angleOffset * Math.PI / 180;
this.angleArc = this.o.angleArc * Math.PI / 180;
// compute start and end angles
this.startAngle = 1.5 * Math.PI + this.angleOffset;
this.endAngle = 1.5 * Math.PI + this.angleOffset + this.angleArc;
var s = max(String(Math.abs(this.o.max)).length, String(Math.abs(this.o.min)).length, 2) + 2;
this.o.displayInput && this.i.css({
'width': ((this.w / 2 + 4) >> 0) + 'px',
'height': ((this.w / 3) >> 0) + 'px',
'position': 'absolute',
'vertical-align': 'middle',
'margin-top': ((this.w / 3) >> 0) + 'px',
'margin-left': '-' + ((this.w * 3 / 4 + 2) >> 0) + 'px',
'border': 0,
'background': 'none',
'font': this.o.fontWeight + ' ' + ((this.w / s) >> 0) + 'px ' + this.o.font,
'text-align': 'center',
'color': this.o.inputColor || this.o.fgColor,
'padding': '0px',
'-webkit-appearance': 'none'
}) || this.i.css({
'width': '0px',
'visibility': 'hidden'
});
};
this.change = function(v) {
this.cv = v;
this.$.val(this.o.format(v));
};
this.angle = function(v) {
return (v - this.o.min) * this.angleArc / (this.o.max - this.o.min);
};
this.arc = function(v) {
var sa, ea;
v = this.angle(v);
if (this.o.flip) {
sa = this.endAngle + 0.00001;
ea = sa - v - 0.00001;
} else {
sa = this.startAngle - 0.00001;
ea = sa + v + 0.00001;
}
this.o.cursor && (sa = ea - this.cursorExt) && (ea = ea + this.cursorExt);
return {
s: sa,
e: ea,
d: this.o.flip && !this.o.cursor
};
};
this.draw = function() {
var c = this.g,
// context
a = this.arc(this.cv),
// Arc
pa,
// Previous arc
r = 1;
c.lineWidth = this.lineWidth;
c.lineCap = this.lineCap;
if (this.o.bgColor !== "none") {
c.beginPath();
c.strokeStyle = this.o.bgColor;
c.arc(this.xy, this.xy, this.radius, this.endAngle - 0.00001, this.startAngle + 0.00001, true);
c.stroke();
}
if (this.o.displayPrevious) {
pa = this.arc(this.v);
c.beginPath();
c.strokeStyle = this.pColor;
c.arc(this.xy, this.xy, this.radius, pa.s, pa.e, pa.d);
c.stroke();
r = this.cv == this.v;
}
c.beginPath();
c.strokeStyle = r ? this.o.fgColor: this.fgColor;
c.arc(this.xy, this.xy, this.radius, a.s, a.e, a.d);
c.stroke();
};
this.cancel = function() {
this.val(this.v);
};
};
$.fn.dial = $.fn.knob = function(o) {
return this.each(function() {
var d = new k.Dial();
d.o = o;
d.$ = $(this);
d.run();
}).parent();
};
}));
+504
View File
@@ -0,0 +1,504 @@
/**
* 区域/全局 loading 效果<layui组件,依赖jQuery>
* @version v1.3 最新版
* @author jlx (neusofts#neusofts.com)
* @extends {jQuery.fn.loading}
* @param {String|Object=} arg1 调用方法名<均为空参则默认show,其他方法:toggle,hide,hideAll,destroy,destroyAll>,若为一个Object参数则更新全局配置&show<返回loading>
* @param {Object=} arg2 若arg1为{String}arg2为{Object},则优先私有配置
* @property {String=''} overlayClassName 自定义遮罩层className,可多个,默认空String
* @property {String=''} imgClassName 自定义image的className,可多个,默认空String
* @property {String='#fff'} background 自定义遮罩层背景色,默认#fff
* @property {Number=0.6} opacity 自定义遮罩层的透明度,默认0.6 <为0时无遮罩层>
* @property {String=''} text 自定义loading文本,默认空String<非空时参考offsetTop设置>
* @property {String=''} textCss 自定义loading文本样式,默认空String<高优先级>
* @property {String=''} textClassName 自定义文本的className,可多个,默认空String
* @property {String=''} title 自定义div、img、text的title,默认空String
* @property {Number=0} offsetTop 自定义图片+文本模式的top偏移量<text为空建议不设置offsetTop>
* @property {Number=0|String=''|null} imgSrc 自定义loading图片路径,默认为图片序列的0索引<0-10>,可配索引或图片url路径<为null时无图片>
* @property {Function=} beforeShow 自定义loading显示前的回调,默认空Function,参数1=this,参数2=jQuery
* @property {Function=} afterShow 自定义loading显示后的回调,默认空Function,参数1=this,参数2=jQuery,参数3=$loading
* @property {Number=19999999+1} imgZIndex 自定义图片的z-index值,默认19999999+1
* @property {Number=19999999} overlayZIndex 自定义遮罩层的z-index值,默认19999999
* @property {Function=} afterHide 自定义loading隐藏/销毁后的回调,默认空Function,参数1=this,参数2=jQuery,参数3=$loading(销毁时无参数3)
* @property {Function=} afterHideAll 自定义全部loading隐藏/销毁后的回调,默认空Function,参数1=this,参数2=jQuery,参数3=$loading(销毁时无参数3)
* @property {Number=600} animateTime 自定义loading显示/隐藏的动画时长 <为0时无动画>,默认600
* @property {Boolean=false} clickHide 自定义单击loading遮罩层/图片/文字是否隐藏loading,默认false
* @property {Boolean=false} inheritRadius 自定义遮罩层是否继承父节点的边框效果,默认false
* @event hide,hideAll,destroy,destroyAll 均监听$(obj)的lay-loading(.hide | .hideAll | .destroy | .destroyAll)事件,参数event, loadingObj
* @return {Object|jQuery|Object<Array>} 返回<loading | loadingArr | jQuery | Error>对象
* @example
* $('body').loading(str?: string = 'show'); // 创建/显示loading <body,html,window,document均处理为body>
* $('body|other').loading({...}); // 注:更新全局配置 + show
* $('body|other').loading('show', {...}); // 创建/显示 + 局部配置优先
* var loadingObj = $('body|other').loading('hide').show(); // 隐藏 -> 显示
* var loadingObj = $('body|other').loading('show', {afterHide: function (loadingObj, jQueryObj, $loading) {...}});
*/
+(function (global, factory) {
if (typeof define === 'function' && define.amd) {
// AMD
define(['jquery'], factory);
} else if (typeof module === 'object' && module.exports) {
// Node/CommonJS
module.exports = function (jQuery) {
if (typeof jQuery === 'undefined') {
// require('jQuery')
if (typeof window !== 'undefined') {
jQuery = require('jquery');
} else {
jQuery = require('jquery')(global);
}
}
return factory(jQuery);
};
}else {
// Browser globals
factory(jQuery);
}
} (this, function ($) {
'use strict';
var _ = $.extend
, W = window // BOM/DOM
, fnName = {}
, lang = {Illegal_operation: '非法操作'} // 外部语言包模块
, _toString = Object.prototype.toString
, ds = { // 外部工具模块
getTime: function (arg) {
return arg ? (+ new Date(arg)) : (+ new Date());
},
is: {
string: function (str) {
return _toString.call(str) == '[object String]';
},
number: function (num) {
return _toString.call(num) == '[object Number]';
},
plainObject: function (obj) {
if (obj === undefined) {
return false;
} else {
return _toString.call(obj) === '[object Object]';
}
},
'undefined': function (v) {
return v === undefined || v === null;
},
'function': function (fun) {
return _toString.call(fun) === '[object Function]';
}
},
loadImage: function (url, callback, error) {
if (!url) {
return callback({src: url});
}
var imgObj;
imgObj = new Image();
imgObj.src = url;
if (imgObj.complete && callback) {
return callback(imgObj);
}
imgObj.onload = function () {
imgObj.onload = null;
callback && callback(imgObj);
};
imgObj.onerror = function (e) {
imgObj.onerror = null;
error && error(e);
};
return imgObj;
}
};
_($.fn, {
loading: function () {
var nodeNames = 'BODY,HTML,#document,undefined'
, $that = nodeNames.indexOf(this[0].nodeName) > -1 ? $('body') : this // 多集合仅保留body对象
, isBODY = $that[0].nodeName == 'BODY'
, arg1 = arguments[0], arg2 = arguments[1]
, loadingClassName = 'lay-loading' // 注:hideAll等操作的索引,若冲突请自行改之
, eventNameResize = 'resize.' + loadingClassName
, eventNameClick = 'click.'+ loadingClassName +'.clickHide'
, zIndex = 19999999
, errorFn = function () {
throw new Error(lang.Illegal_operation);
}
, imgUrl = '/assets/addons/btpanel/images/loading/loading'
, imgSrcArr = [
imgUrl + '.gif',
imgUrl + '-bars.gif'
].concat(function () { for (var arr = [], i = 0; i <= 8; i++) { arr.push(imgUrl + '-' + i + '.gif'); }; return arr; }())
, pteMethods = {
resize: function () {
if (!this || !this instanceof $) return;
var offsetTop = this.settings && (this.settings.offsetTop || 0);
var $objs = this.$this.children('.' + loadingClassName + ':visible');
var hasImgSrc = !ds.is['undefined'](this.settings.imgSrc);
var imageH = 0, $parent = {}, parentW = 0, parentH = 0, isFixed, offsetP, safariBug, parentPosition;
var isSafari = /Safari/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent); // !document.documentMode;
$objs.each(function (key, divAndimg) {
$parent = $(divAndimg).parent();
parentPosition = ('fixed,relative').indexOf($parent.css('position'));
isFixed = parentPosition > -1 || $parent[0] === $(this)[0].offsetParent;
safariBug = parentPosition < 0 && $parent[0].offsetParent !== $('body')[0] && isSafari;
// console.log(parentPosition); // -1 -1
// console.log($parent[0]); // YS-in YS-in
// console.log($(this)[0].offsetParent); // body YS-in
// console.log($parent[0].offsetParent); // body YS-out
offsetP = isFixed || safariBug ? { top: 0, left: 0 } : { top: $parent[0].offsetTop, left: $parent[0].offsetLeft };
parentW = $parent.outerWidth();
parentH = $parent.outerHeight();
if ($parent[0].nodeName == 'BODY') {
if ($(divAndimg).is('div')) {
$(divAndimg).css({
width: '100%',
height: '100%',
position: 'fixed'
});
} else if ($(divAndimg).is('img')) {
imageH = $(divAndimg).height();
$(divAndimg).css({
position: 'fixed',
top: $(W).height() / 2 - $(divAndimg).height() / 2 - offsetTop,
left: $(W).width() / 2 - $(divAndimg).width() / 2
});
} else {
$(divAndimg).css({
position: 'fixed',
top: $(W).height() / 2 + (imageH ? 6 : ( - $(divAndimg).height() / 2)) + imageH / 2 - offsetTop,
left: $(W).width() / 2 - $(divAndimg).width() / 2
});
}
} else {
if ($(divAndimg).is('div')) {
$(divAndimg).css({
width: parentW,
height: parentH,
top: offsetP.top,
left: offsetP.left
});
} else if ($(divAndimg).is('img')) {
imageH = $(divAndimg).height();
$(divAndimg).css({
top: parentH / 2 - $(divAndimg).height() / 2 + offsetP.top - offsetTop,
left: parentW / 2 - $(divAndimg).width() / 2 + offsetP.left
});
} else {
imageH = hasImgSrc ? imageH : 0;
$(divAndimg).css({
top: parentH / 2 + imageH / 2 + (imageH ? 6 : ( - $(divAndimg).height() / 2)) + offsetP.top - offsetTop,
left: parentW / 2 - $(divAndimg).width() / 2 + offsetP.left
});
}
}
});
return this;
},
subsequent: function () {
var $loading = arguments[0];
var that = $loading.parent().data('loading') || this;
var time = that.settings.animateTime;
var $this = that.$this;
var fn = that.settings[arguments[1]]
var operate = arguments[2];
var method = arguments[3];
var isAuto = arguments[4];
if (arguments[1] === 'afterHideAll') {
fn = fnName.settings.afterHideAll;
}
$loading.fadeOut(time, function () {
$(this)[operate]();
});
W.setTimeout(function () {
!isAuto && fn && fn(that, $this, operate == 'hide' ? $loading : undefined);
!isAuto && $this.trigger(loadingClassName + '.' + method, that);
}, time);
return that;
}
};
fnName.settings = fnName.settings || {
'overlayClassName': '',
'imgClassName': '',
'background': '#fff',
'opacity': 0.6,
'text': '',
'textCss': '', // {}
'textClassName': '',
'title': '',
'offsetTop': 0, // img&text的top偏移量
'imgSrc': imgSrcArr[0], // 注:默认以图片居中为主,若img&text同时微调可设置offsetTop
'beforeShow': function () {},
'afterShow': function () {},
'imgZIndex': zIndex + 1, // text共用
'overlayZIndex': zIndex,
'afterHide': function () {},
'afterHideAll': function () {},
'animateTime': 600,
'clickHide': !1, //可配置afterHide为reload需求
'inheritRadius': false
}
var initialCss = {
'top': -zIndex,
'left': -zIndex,
'z-index': 0,
'position': 'absolute',
'padding': 'initial',
'margin': 'initial',
'border': 'initial',
'width': 'initial',
'min-width': 'initial',
'max-width': 'initial',
'height': 'initial',
'min-height': 'initial',
'max-height': 'initial',
'opacity': 'initial'
}
, overlayStyle = {
'background': '#fff',
'height': 0, // resize value
'width': 0, // resize value
'top': 0, // resize value <html除外, 子标签在body内>
'left': 0, // resize value <html除外, 子标签在body内>
'z-index': 0,
'opacity': 0,
'position': 'absolute',
'border-radius': 0,
'padding': 'initial',
'margin': 'initial',
'border': 'initial'
}
, imageStyle = _({}, initialCss)
, textStyle = _({}, initialCss, {
'background': 'initial',
'overflow': 'initial',
'white-space': 'nowrap',
'line-height': '120%',
'text-align': 'center',
'vertical-align': 'middle'
});
function Class(options) {
if (options && options.imgSrc !== null && ds.is.number(options.imgSrc)) {
options.imgSrc = imgSrcArr[options.imgSrc]; // undefined时$.extend不覆盖默认配置
}
this.hasNewSetting = ds.is.plainObject(options);
this.$this = options.$this;
this.settings = _({}, fnName.settings, this.hasNewSetting ? options : {});
this.settings.overlayStyle = overlayStyle;
this.settings.imageStyle = imageStyle;
this.settings.textStyle = textStyle;
}
_(Class.prototype, {
show: function () {
var _this = this;
var $this = this.$this;
var settings = this.settings;
var beforeShow = settings.beforeShow;
var overlayStyle = settings.overlayStyle;
var imageStyle = settings.imageStyle;
var textStyle = settings.textStyle;
var textCss = settings.textCss || {};
var $loadingObjSingle = $this.children('.' + loadingClassName);
var hasImgSrc = !ds.is['undefined'](settings.imgSrc);
beforeShow && beforeShow(this, $this);
if (!this.hasNewSetting && $loadingObjSingle.size() > 0) {
pteMethods.subsequent.apply(this, [
$loadingObjSingle,
'afterShow',
'show',
'show'
]);
$(W).trigger(eventNameResize);
} else {
this.destroy('auto'), ds.loadImage(hasImgSrc ? settings.imgSrc : null, function (imgObj) {
// create时不考虑动画
var $overlay = $('<div></div>');
var $image = $('<img />');
var $text = $('<span></span>');
var text = $.trim(settings.text);
var overlayW = isBODY ? window.screen.availWidth : $this.outerWidth();
var overlayH = isBODY ? window.screen.availHeight : $this.outerHeight();
overlayStyle['background'] = settings['background'];
overlayStyle['z-index'] = settings['overlayZIndex'];
overlayStyle['opacity'] = settings['opacity'];
overlayStyle['height'] = overlayH;
overlayStyle['width'] = overlayW;
if (settings.inheritRadius) {
// For IE
overlayStyle['border-top-left-radius'] = $this.css('border-top-left-radius');
overlayStyle['border-top-right-radius'] = $this.css('border-top-right-radius');
overlayStyle['border-bottom-left-radius'] = $this.css('border-bottom-left-radius');
overlayStyle['border-bottom-right-radius'] = $this.css('border-bottom-right-radius');
}
imageStyle['z-index'] = settings['imgZIndex'];
textStyle['z-index'] = settings['imgZIndex'];
$overlay
.addClass(loadingClassName)
.addClass(settings.overlayClassName)
.css(overlayStyle)
.attr('title', settings.title)
.appendTo($this).hide();
imgObj.src && $image
.addClass(loadingClassName)
.addClass(settings.imgClassName)
.css(imageStyle)
.attr('src', imgObj.src)
.attr('title', settings.title)
.appendTo($this).hide();
$text
.addClass(loadingClassName)
.addClass(settings.textClassName)
.css(_({}, textStyle, textCss))
.html(text)
.attr('title', settings.title)
.appendTo($this).hide();
setTimeout(function () {
$overlay[!settings['opacity'] ? 'remove' : 'show']();
$image[!hasImgSrc ? 'remove' : 'show']();
$text[!text.length ? 'remove' : 'show']();
$(W).trigger(eventNameResize);
settings.afterShow && settings.afterShow(_this, $this);
$this.trigger(loadingClassName + '.' + 'show', _this);
}, 0.1e3);
}, function (e) {
throw new Error(e);
});
}
return {
hide: errorFn,
hideAll: errorFn,
destroy: errorFn,
destroyAll: errorFn
};
},
toggle: function () {
if (this.$this.children('.' + loadingClassName + ':visible').size() > 0) {
return this.hide();
} else {
return this.show();
}
},
hide: function () {
return pteMethods.subsequent.apply(this, [
this.$this.children('.' + loadingClassName),
'afterHide',
'hide',
'hide'
]);
},
hideAll: function () {
return pteMethods.subsequent.apply(this, [
$('.' + loadingClassName),
'afterHideAll',
'hide',
'hideAll'
]);
},
// <传入新配置/销毁后> 新建将启用最新全局配置
destroy: function (isAuto) {
return pteMethods.subsequent.apply(this, [
this.$this.children('.' + loadingClassName),
'afterHide',
'remove',
'destroy',
isAuto
]);
},
destroyAll: function () {
return pteMethods.subsequent.apply(this, [
$('.' + loadingClassName),
'afterHideAll',
'remove',
'destroyAll'
]);
}
});
// 一个{}参数:更新全局配置&show <兼容IE8>
if (ds.is.plainObject(arg1)) {
if (arg1.imgSrc) {
arg1.imgSrc = imgSrcArr[arg1.imgSrc];
}
return $that.loading('show', _(fnName.settings, arg1));
}
// arg1为string默认调用方法 & arg2默认为局部配置
if (ds.is.string(arg1) || !arg1) {
var loading = {}, loadingArr = [], rdm;
arg1 = arg1 ? arg1 : 'show';
$that.each(function (index, obj) {
if (arg2) {
arg2.$this = $(obj);
if (arg2.afterHideAll) {
fnName.settings.afterHideAll = arg2.afterHideAll;
}
} else {
arg2 = {$this: $(obj)};
}
rdm = '.rdm' + ds.getTime() + index;
loading = new Class(arg2);
$(obj).data('loading', loading);
ds.is['function'](loading[arg1]) && loading[arg1]();
loadingArr.push(loading);
// 单击div/img/text是否隐藏
$(obj).off(eventNameClick).on(eventNameClick, '.' + loadingClassName, function (e) {
loading.settings.clickHide && $(obj).data('loading').hide();
e.stopPropagation();
return false;
});
// resize监听
$(W).off(eventNameResize + rdm).on(eventNameResize + rdm, function () {
pteMethods.resize.call($(obj).data('loading') || null);
});
});
}
return loadingArr.length > 1 ? loadingArr : loadingArr[0];
}
});
return $;
}));
+106
View File
@@ -0,0 +1,106 @@
html,
body {
height: 100%;
}
body {
padding-top: 50px; /* Required padding for .navbar-fixed-top. Remove if using .navbar-static-top. Change if height of navigation changes. */
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
font-family: 'Source Sans Pro', 'Helvetica Neue', Helvetica, Arial, sans-serif;
}
.img-addon {
margin-bottom: 10px;
width:100%;
}
.img-hover:hover {
opacity: 0.8;
}
.display-1 {
font-size:44px;
}
.display-4 {
font-size:24px;
line-height:32px;
}
/* Home Page Carousel */
header.carousel {
height: 50%;
}
header.carousel .item,
header.carousel .item.active,
header.carousel .carousel-inner {
height: 100%;
}
header.carousel .fill {
width: 100%;
height: 100%;
}
/* 404 Page Styles */
.error-404 {
font-size: 100px;
}
/* Pricing Page Styles */
.price {
display: block;
font-size: 50px;
line-height: 50px;
}
.price sup {
top: -20px;
left: 2px;
font-size: 20px;
}
.period {
display: block;
font-style: italic;
}
/* Footer Styles */
footer {
margin: 50px 0;
}
/* Responsive Styles */
@media(max-width:991px) {
.customer-img,
.img-related {
margin-bottom: 30px;
}
}
@media(max-width:767px) {
.img-addon {
margin-bottom: 15px;
}
header.carousel .carousel {
height: 70%;
}
}
.carousel-body {
position:absolute;
width: 100%;
top:25%;
text-align:center;
color:#fff;
}
.addonlist a > p{
margin-bottom:15px;
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

+44
View File
@@ -0,0 +1,44 @@
/** @license
* RequireJS plugin for async dependency load like JSONP and Google Maps
* Author: Miller Medeiros
* Version: 0.1.2 (2014/02/24)
* Released under the MIT license
*/
define(function(){
var DEFAULT_PARAM_NAME = 'callback',
_uid = 0;
function injectScript(src){
var s, t;
s = document.createElement('script'); s.type = 'text/javascript'; s.async = true; s.src = src;
t = document.getElementsByTagName('script')[0]; t.parentNode.insertBefore(s,t);
}
function formatUrl(name, id){
var paramRegex = /!(.+)/,
url = name.replace(paramRegex, ''),
param = (paramRegex.test(name))? name.replace(/.+!/, '') : DEFAULT_PARAM_NAME;
url += (url.indexOf('?') < 0)? '?' : '&';
return url + param +'='+ id;
}
function uid() {
_uid += 1;
return '__async_req_'+ _uid +'__';
}
return{
load : function(name, req, onLoad, config){
if(config.isBuild){
onLoad(null); //avoid errors on the optimizer
}else{
var id = uid();
//create a global variable that stores onLoad so callback
//function can define new module after async load
window[id] = onLoad;
injectScript(formatUrl(req.toUrl(name), id));
}
}
};
});
Binary file not shown.
File diff suppressed because it is too large Load Diff
+738
View File
@@ -0,0 +1,738 @@
:root {
--white: #fff;
--black: #000;
--bg: #f8f8f8;
--grey1: #999;
--dark: #1a1a1a;
--light: #f4f4f4;
--wrapper: 100%;
--blue: #00b0ff;
--grey2: #d2d2d2;
}
.KeFu .kefu_button {
position: fixed;
top: 80%;
right: 20px;
width: 50px;
height: 50px;
display: block;
z-index: 1000;
animation: pulse 2s infinite;
border-radius: 50%;
cursor: pointer;
}
.KeFu .popover {
position: fixed;
word-break: break-all;
}
.KeFu .modal-content .modal-header .modal-title #csr_status {
font-size: 12px;
}
.KeFu .modal-body {
width: 100%;
display: flex;
height: 665px;
box-sizing: border-box;
background-color: var(--white);
}
.KeFu .modal-body .announcement {
border: none;
margin-bottom: 0;
border-radius: 0;
height: 48px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap; /*不允许换行*/
background-color: #fcf8e3;
border-color: #faf3cd;
color: #c09853;
}
.KeFu .modal-body .announcement i {
padding-right: 4px;
}
.KeFu .modal-body .kefu-left {
flex: 6;
height: 100%;
border: 1px solid var(--light);
word-wrap: break-word;
word-break: break-all;
overflow: hidden;
}
.KeFu .modal-body .kefu-right {
flex: 2;
height: 100%;
border: 1px solid var(--light);
border-left: none;
word-wrap: break-word;
overflow: hidden;
}
#kefu_error {
font-family: 'Source Sans Pro', sans-serif;
margin-left: 10px;
color: #e64340;
}
.KeFu .modal-body .kefu-left .chat .status {
position: relative;
float: right;
width: 100%;
/*margin: 20px 0;*/
margin-bottom: 10px;
text-align: center;
}
.KeFu .modal-body .kefu-left .chat .status span {
font-size: 12px;
display: inline-block;
background: #ccc;
color: #fff;
border-radius: 5px;
padding: 3px 10px;
line-height: 12px;
}
.KeFu .modal-body .kefu-left .chat {
display: flex;
position: relative;
box-sizing: border-box;
overflow: hidden;
padding: 0;
height: calc(100% - 158px);
justify-content: flex-end;
flex-direction: column;
}
.KeFu .modal-body .kefu-left .chat_scroll {
overflow-y: auto;
overflow-x: hidden;
padding: 20px;
box-sizing: border-box;
}
.KeFu .modal-body .kefu-left .chat_scroll::-webkit-scrollbar, .search_users::-webkit-scrollbar, #goods_select_model::-webkit-scrollbar {
width: 4px;
}
.KeFu .modal-body .kefu-left .chat_scroll::-webkit-scrollbar-track, .search_users::-webkit-scrollbar-track, #goods_select_model::-webkit-scrollbar-track {
background-color: #fff;
-webkit-border-radius: 2em;
-moz-border-radius: 2em;
border-radius: 2em;
}
.KeFu .modal-body .kefu-left .chat_scroll::-webkit-scrollbar-thumb, #goods_select_model::-webkit-scrollbar-thumb {
background-color: #e6e6e6;
-webkit-border-radius: 2em;
-moz-border-radius: 2em;
border-radius: 2em;
}
.KeFu .modal-body .kefu-left .chat_scroll .bubble img {
max-width: 300px !important;
height: auto !important;
vertical-align: bottom;
}
.popover .popover-content .emoji {
height: 30px;
width: 30px;
}
.KeFu .modal-body .kefu_emoji {
position: relative;
}
.KeFu .modal-body #kefu_emoji {
position: absolute;
bottom: 0px;
left: 10px;
padding: 8px;
border: 1px solid var(--light);
width: 70%;
background-color: #eceff1;
display: none;
border-radius: 5px;
background: #fff;
z-index: 1070;
-webkit-box-shadow: #666 0px 0px 10px;
-moz-box-shadow: #666 0px 0px 10px;
box-shadow: #666 0px 0px 10px;
cursor: pointer;
}
#kefu_emoji img {
height: 48px;
width: 48px;
padding: 4px;
}
#kefu_emoji img:hover {
border: 1px solid #f2f2f2;
}
/*链接输入框*/
.KeFu .modal-body .kefu_link_form {
position: relative;
}
#kefu_link_form {
position: absolute;
bottom: 0px;
left: 10px;
padding: 8px;
border: 1px solid var(--light);
width: 70%;
background-color: #eceff1;
display: none;
border-radius: 5px;
background: #fff;
z-index: 1070;
-webkit-box-shadow: #666 0px 0px 10px;
-moz-box-shadow: #666 0px 0px 10px;
box-shadow: #666 0px 0px 10px;
cursor: pointer;
}
#kefu_link_form .input-group {
margin-bottom: 8px;
}
#kefu_link_form .input-group:last-child {
margin-bottom: 0;
}
.link_form_buttons {
display: flex;
justify-content: flex-end;
}
.link_form_buttons button {
margin-left: 8px;
}
/*链接输入框end*/
/*商品和订单选择框*/
.KeFu .modal-body .goods_select_model {
position: relative;
}
.KeFu .modal-body #goods_select_model {
position: absolute;
bottom: 0px;
left: 10px;
padding: 8px;
border: 1px solid var(--light);
width: 60%;
height: 240px;
display: none;
border-radius: 5px;
background: #fff;
z-index: 1070;
-webkit-box-shadow: #666 0px 0px 10px;
-moz-box-shadow: #666 0px 0px 10px;
box-shadow: #666 0px 0px 10px;
cursor: pointer;
overflow-y: auto;
overflow-x: hidden;
}
.KeFu .modal-body .record_card {
width: 400px;
border-radius: 10px;
display: flex;
background-color: #f1f4f6;
align-items: center;
padding: 8px 8px 8px 8px;
}
.KeFu .modal-body .record_card img {
width: 90px;
height: 90px;
min-width: 90px;
}
.KeFu .modal-body .record_card .record_card_body {
height: 90px;
width: 100%;
margin: 0 8px;
cursor: pointer;
}
.KeFu .modal-body .record_card .record_card_title {
font-size: 15px;
display: block;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
line-height: 18px;
height: 36px;
color: #0d0d0d;
}
.KeFu .modal-body .record_card .record_card_note {
font-size: 14px;
display: block;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
line-height: 16px;
height: 32px;
color: #999999;
margin-top: 3px;
}
.KeFu .modal-body .record_card .record_card_price span:last-child {
margin-left: 10px;
color: #999999;
font-size: 14px;
}
.KeFu .modal-body .record_card .record_card_price span:first-child {
margin-left: -3px;
font-size: 18px;
color: rgba(231, 76, 60, 1);
}
/*商品和订单选择框end*/
.KeFu .modal-body .input_status {
position: relative;
}
.KeFu .modal-body #kefu_input_status {
position: absolute;
bottom: 0px;
padding: 0 10px;
font-size: 13px;
color: var(--blue);
line-height: 22px;
width: 100%;
}
.KeFu .modal-body .kefu-left .write {
height: 100px;
padding: 8px;
display: block;
margin: 0 auto;
padding-left: 8px;
border-top: 1px solid var(--light);
box-sizing: border-box;
}
.KeFu .modal-body .kefu-left .chat .bubble {
font-size: 16px;
position: relative;
display: inline-block;
clear: both;
margin-bottom: 8px;
padding: 13px 14px;
vertical-align: top;
border-radius: 5px;
max-width: 86%;
}
.KeFu .modal-body .kefu-left .chat .bubble.me .kefu_message_status {
position: absolute;
bottom: 0;
left: -30px;
color: var(--blue);
font-size: 12px;
}
.KeFu .kf-text-grey {
color: var(--grey1) !important;
}
.KeFu .kf-text-red {
color: #e64340 !important;
}
.KeFu .modal-body .kefu-left .chat .bubble:before {
position: absolute;
top: 19px;
display: block;
width: 8px;
height: 6px;
content: '\00a0';
-webkit-transform: rotate(29deg) skew(-35deg);
transform: rotate(29deg) skew(-35deg);
}
.KeFu .modal-body .kefu-left .chat .bubble .emoji {
width: 40px;
height: 40px;
padding: 2px;
}
.KeFu .modal-body .kefu-left .chat .bubble.me {
float: right;
color: var(--white);
background-color: var(--blue);
align-self: flex-end;
}
.KeFu .modal-body .kefu-left .chat .bubble.me:before {
right: -3px;
background-color: var(--blue);
}
.KeFu .modal-body .kefu-left .chat .bubble.you {
float: left;
color: var(--dark);
background-color: #eceff1;
align-self: flex-start;
}
.KeFu .modal-body .kefu-left .chat .bubble.you:before {
left: -3px;
background-color: #eceff1;
}
.KeFu .modal-body .kefu-left .write .write_top {
padding-bottom: 8px;
}
.KeFu .modal-body .kefu-left .write .toolbar_icon {
display: inline-block;
width: 20px;
height: 20px;
content: '';
vertical-align: middle;
cursor: pointer;
margin-right: 6px;
}
.KeFu .modal-body .kefu-left .write .select_file {
display: inline-block;
width: 20px;
height: 20px;
vertical-align: middle;
position: relative;
margin-right: 6px;
cursor: pointer;
}
.KeFu .modal-body .kefu-left .write #chatfile {
filter: alpha(opacity=0);
opacity: 0;
width: 20px;
height: 20px;
display: inline-block;
position: absolute;
z-index: 2;
text-indent: -9999px;
}
.KeFu .modal-body .kefu-left .write .attach {
position: absolute;
z-index: 1;
}
.KeFu .modal-body .kefu-left .write #send_tis {
display: inline-block;
height: 20px;
font-size: 14px;
line-height: 20px;
margin-left: 10px;
vertical-align: middle;
color: #999;
}
.KeFu .modal-body .kefu-left .write pre {
font-size: 16px;
float: left;
width: 100%;
height: 60px;
overflow-y: auto;
overflow-x: hidden;
margin: 0;
padding: 0;
border: 0;
padding-left: 2px;
white-space: pre-wrap;
word-break: normal;
color: var(--dark);
outline: none;
background-color: #fff;
font-family: 'Source Sans Pro', sans-serif;
font-weight: 400;
}
.KeFu .modal-body .kefu-left .write #kefu_message .emoji {
height: 20px;
width: 20px;
}
.KeFu .modal-body .kefu-left .write #kefu_message .record {
max-height: 60px;
}
#kefu_chat_slide_f {
display: none;
margin: 0 auto;
padding: 5px;
}
#kefu_chat_slide .carousel-indicators li {
margin-right: 4px !important;
}
.chat_introduces {
width: 90%;
display: block;
margin: 10px auto;
}
/*邀请框*/
.kefu_invite_box {
width: 400px;
height: 200px;
position: fixed;
top: calc(50% - 100px);
left: calc(50% - 200px);
border-radius: 5px;
z-index: 1200;
box-shadow: 0 0 10px rgba(135, 137, 138, 0.27);
}
.kefu_invite_box .invite_box_close {
color: var(--grey1);
font-size: 30px;
position: absolute;
line-height: 30px;
right: 10px;
cursor: pointer;
}
.kefu_invite_box .invite_box_close:hover {
color: #222;
}
.kefu_invite_box .bottom_button {
position: absolute;
bottom: 13px;
right: 10px;
display: flex;
}
.kefu_invite_box .bottom_button div {
border: 1px solid var(--white);
padding: 3px 10px;
border-radius: 2px;
font-size: 12px;
line-height: 20px;
}
.kefu_invite_box .bottom_button .later {
color: var(--white);
background: var(--blue);
border-color: var(--blue);
margin-right: 10px;
cursor: pointer;
}
.kefu_invite_box .bottom_button .consulting {
color: var(--blue);
background: var(--white);
cursor: pointer;
}
@media screen and (max-width: 1000px) {
.KeFu .modal-body .kefu-left {
flex: 6;
border: 1px solid var(--light);
word-wrap: break-word;
overflow: hidden;
}
.KeFu .modal-body .kefu-right {
display: none;
}
.kefu_invite_box {
width: 300px;
height: 150px;
top: calc(50% - 75px);
left: calc(50% - 150px);
}
}
/*抖动动画-代码来源于:shake.css*/
@keyframes shake-horizontal {
2% {
transform: translate(-6px, 0) rotate(0);
}
4% {
transform: translate(9px, 0) rotate(0);
}
6% {
transform: translate(-6px, 0) rotate(0);
}
8% {
transform: translate(-2px, 0) rotate(0);
}
10% {
transform: translate(8px, 0) rotate(0);
}
12% {
transform: translate(-6px, 0) rotate(0);
}
14% {
transform: translate(0px, 0) rotate(0);
}
16% {
transform: translate(-1px, 0) rotate(0);
}
18% {
transform: translate(9px, 0) rotate(0);
}
20% {
transform: translate(-4px, 0) rotate(0);
}
22% {
transform: translate(-6px, 0) rotate(0);
}
24% {
transform: translate(-5px, 0) rotate(0);
}
26% {
transform: translate(-9px, 0) rotate(0);
}
28% {
transform: translate(-4px, 0) rotate(0);
}
30% {
transform: translate(2px, 0) rotate(0);
}
32% {
transform: translate(0px, 0) rotate(0);
}
34% {
transform: translate(0px, 0) rotate(0);
}
36% {
transform: translate(1px, 0) rotate(0);
}
38% {
transform: translate(-1px, 0) rotate(0);
}
40% {
transform: translate(0px, 0) rotate(0);
}
42% {
transform: translate(1px, 0) rotate(0);
}
44% {
transform: translate(-8px, 0) rotate(0);
}
46% {
transform: translate(-8px, 0) rotate(0);
}
48% {
transform: translate(8px, 0) rotate(0);
}
50% {
transform: translate(3px, 0) rotate(0);
}
52% {
transform: translate(-4px, 0) rotate(0);
}
54% {
transform: translate(3px, 0) rotate(0);
}
56% {
transform: translate(-8px, 0) rotate(0);
}
58% {
transform: translate(0px, 0) rotate(0);
}
60% {
transform: translate(-9px, 0) rotate(0);
}
62% {
transform: translate(-4px, 0) rotate(0);
}
64% {
transform: translate(2px, 0) rotate(0);
}
66% {
transform: translate(1px, 0) rotate(0);
}
68% {
transform: translate(-7px, 0) rotate(0);
}
70% {
transform: translate(-8px, 0) rotate(0);
}
72% {
transform: translate(5px, 0) rotate(0);
}
74% {
transform: translate(-7px, 0) rotate(0);
}
76% {
transform: translate(6px, 0) rotate(0);
}
78% {
transform: translate(-6px, 0) rotate(0);
}
80% {
transform: translate(4px, 0) rotate(0);
}
82% {
transform: translate(-8px, 0) rotate(0);
}
84% {
transform: translate(-3px, 0) rotate(0);
}
86% {
transform: translate(2px, 0) rotate(0);
}
88% {
transform: translate(-1px, 0) rotate(0);
}
90% {
transform: translate(1px, 0) rotate(0);
}
92% {
transform: translate(-5px, 0) rotate(0);
}
94% {
transform: translate(-8px, 0) rotate(0);
}
96% {
transform: translate(0px, 0) rotate(0);
}
98% {
transform: translate(-8px, 0) rotate(0);
}
0%, 100% {
transform: translate(0, 0) rotate(0);
}
}
.kefu-shake-horizontal {
transform-origin: center center;
animation-name: shake-horizontal;
animation-duration: 100ms;
animation-timing-function: ease-in-out;
animation-iteration-count: 4;
}
@-webkit-keyframes pulse {
0% {
-webkit-box-shadow: 0 0 0 0 rgba(13, 130, 255, 0.4);
}
70% {
-webkit-box-shadow: 0 0 0 10px rgba(13, 130, 255, 0);
}
100% {
-webkit-box-shadow: 0 0 0 0 rgba(13, 130, 255, 0);
}
}
@keyframes pulse {
0% {
-moz-box-shadow: 0 0 0 0 rgba(13, 130, 255, 0.4);
box-shadow: 0 0 0 0 rgba(13, 130, 255, 0.4);
}
70% {
-moz-box-shadow: 0 0 0 10px rgba(13, 130, 255, 0);
box-shadow: 0 0 0 10px rgba(13, 130, 255, 0);
}
100% {
-moz-box-shadow: 0 0 0 0 rgba(13, 130, 255, 0);
box-shadow: 0 0 0 0 rgba(13, 130, 255, 0);
}
}
+434
View File
@@ -0,0 +1,434 @@
* {
padding: 0;
margin: 0;
}
html,
body {
height: 100%;
width: 100%;
}
.kefu_container {
position: relative;
height: 100%;
}
.main_header {
position: relative;
display: block;
height: 40px;
width: 100%;
padding: 0 10px;
background: #f5f5f5;
line-height: 40px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
border-bottom: 1px solid #e1e3e9;
}
.back_page {
float: right;
height: 40px;
width: 14px;
line-height: 40px;
}
#header_title {
font-size: 15px;
color: #181818;
}
#kefu_error {
font-family: 'Source Sans Pro', sans-serif;
margin-left: 6px;
color: #e64340;
}
.content_wrapper {
position: absolute;
top: 40px;
left: 0;
right: 0;
bottom: 0;
overflow: hidden;
}
.chat_wrapper {
position: absolute;
top: 0px;
bottom: 52px;
background-color: #f5f5f5;
width: 100%;
border-bottom: 1px solid #e1e3e9;
box-sizing: border-box;
color: #181818;
overflow-x: hidden;
overflow-y: auto;
/*display: flex;
justify-content: flex-end;
flex-direction: column;*/
padding: 10px 14px 0px 14px;
}
.chat_wrapper .status {
position: relative;
float: right;
width: 100%;
/* margin: 20px 0; */
margin-bottom: 10px;
text-align: center;
height: 30px;
line-height: 30px;
}
.chat_wrapper .status span {
font-size: 12px;
display: inline-block;
background: #ccc;
color: #fff;
border-radius: 5px;
padding: 3px 10px;
line-height: 12px;
}
.chat_wrapper .bubble {
font-size: 16px;
position: relative;
display: inline-block;
clear: both;
margin-bottom: 8px;
padding: 13px 14px;
vertical-align: top;
border-radius: 5px;
max-width: 86%;
}
.chat_wrapper .bubble.me .kefu_message_status {
position: absolute;
bottom: 0;
left: -30px;
color: #00b0ff;
font-size: 12px;
}
.record_card_a:hover {
text-decoration: none;
}
.record_card {
width: 100%;
background: #fff;
border-radius: 10px;
display: flex;
align-items: center;
padding: 8px 8px 8px 8px;
}
.card_list {
overflow-y: auto;
overflow-x: hidden;
height: 186px;
}
.card_list .record_card{
border-radius: 0;
margin-bottom: 10px;
}
.record_card input{
height: 22px;
width: 22px;
}
.record_card img {
width: 80px;
height: 80px;
min-width: 80px;
}
.record_card .record_card_body {
height: 90px;
width: 100%;
margin: 0 8px;
cursor: pointer;
}
.record_card .record_card_title {
font-size: 13px;
display: block;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
line-height: 15px;
height: 30px;
color: #0d0d0d;
margin-top: 3px;
}
.record_card .record_card_note {
font-size: 12px;
display: block;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
line-height: 14px;
height: 28px;
color: #999999;
margin-top: 3px;
}
.record_card .record_card_price span:last-child {
margin-left: 10px;
color: #999999;
font-size: 14px;
}
.record_card .record_card_price span:first-child {
margin-left: -3px;
font-size: 18px;
color: rgba(231, 76, 60, 1);
}
.record_card .card_radio{
height: 22px;
width: 22px;
}
.select_model {
background-color: #f2f2f2;
position: fixed;
bottom: 0px;
z-index: 998;
width: 100%;
}
.close_select_model {
box-sizing: border-box;
font-size: 14px;
padding: 8px 11px;
color: #999;
width: 100%;
text-align: right;
}
.chat_wrapper .kf-text-grey {
color: #999 !important;
}
.chat_wrapper .kf-text-red {
color: #e64340 !important;
}
.chat_wrapper .bubble.me {
float: right;
color: #fff;
background-color: #00b0ff;
align-self: flex-end;
word-wrap: break-word;
word-break: break-all;
}
.chat_wrapper .bubble.you {
float: left;
color: #181818;
background-color: #fff;
align-self: flex-start;
word-wrap: break-word;
word-break: break-all;
}
.chat_wrapper .bubble:before {
position: absolute;
top: 19px;
display: block;
width: 8px;
height: 6px;
content: '\00a0';
-webkit-transform: rotate(29deg) skew(-35deg);
transform: rotate(29deg) skew(-35deg);
}
.chat_wrapper .bubble.you:before {
left: -3px;
background-color: #fff;
}
.chat_wrapper .bubble.me:before {
right: -3px;
background-color: #00b0ff;
}
.chat_wrapper .bubble img {
max-width: 200px !important;
height: auto !important;
vertical-align: bottom;
}
.chat_wrapper .bubble .emoji {
display: inline-block;
width: 40px;
height: 40px;
}
.content_wrapper #kefu_input_status {
position: absolute;
z-index: 9;
bottom: 52px;
padding: 0 12px;
font-size: 13px;
color: #00b0ff;
line-height: 22px;
width: 100%;
}
.content_wrapper .write {
position: absolute;
bottom: 0;
height: auto;
box-sizing: border-box;
background-color: #f7f7f7;
box-shadow: 0 -1px 0 #e5e5e5;
width: 100%;
padding: 4px 6px;
display: flex;
align-items: center;
}
.write_right {
flex: 2;
display: flex;
align-items: center;
justify-content: center;
}
.widget_textarea {
flex: 8;
}
.content_wrapper .write_right .smiley {
display: inline-block;
cursor: pointer;
vertical-align: middle;
width: 28px;
height: 28px;
content: '';
}
.content_wrapper .write .more {
display: inline-block;
cursor: pointer;
width: 28px;
height: 28px;
vertical-align: middle;
content: '';
margin-left: 10px;
}
.footer_div {
position: fixed;
bottom: 0px;
background-color: #fff;
box-shadow: 0 4px 5px rgba(0, 0, 0, .1);
width: 100%;
animation: show_footer_div .1s;
animation-fill-mode: forwards;
padding-top: 6px;
box-sizing: border-box;
height: 170px;
overflow-y: auto;
overflow-x: hidden;
}
.footer_div image {
height: 25px;
width: 25px;
padding: 6px;
}
.toolbar {
display: flex;
flex-wrap: wrap;
}
.toolbar_item {
margin-top: 10px;
width: 25%;
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: center;
}
.toolbar_item img {
width: 30px;
height: 30px;
}
.toolbar_item div {
display: block;
width: 100%;
font-size: 13px;
line-height: 17px;
text-align: center;
margin-top: 6px;
}
@keyframes show_footer_div {
from {
height: 0;
}
to {
height: 170px;
}
}
.select_file {
position: relative;
}
.toolbar #chatfile {
filter: alpha(opacity=0);
opacity: 0;
width: 100%;
height: 100%;
display: inline-block;
position: absolute;
z-index: 2;
text-indent: -9999px;
}
#kefu_message {
box-sizing: border-box;
overflow-y: auto;
max-height: 52px;
top: 0;
width: 96%;
outline: none;
border: none;
resize: none;
margin: 4px 0 1px 6px;
border-radius: 4px;
padding: 9px;
overflow-x: hidden;
-webkit-user-select: text !important;
-moz-user-select: text !important;
-ms-user-select: text !important;
user-select: text !important;
line-height: 17px;
font-size: 17px;
color: #181818;
}
#kefu_message::-webkit-scrollbar, .chat_wrapper::-webkit-scrollbar {
width: 4px;
}
#kefu_message::-webkit-scrollbar-track {
background-color: #fff;
-webkit-border-radius: 2em;
-moz-border-radius: 2em;
border-radius: 2em;
}
.chat_wrapper::-webkit-scrollbar-track {
background-color: #f5f5f5;
-webkit-border-radius: 2em;
-moz-border-radius: 2em;
border-radius: 2em;
}
#kefu_message::-webkit-scrollbar-thumb, .chat_wrapper::-webkit-scrollbar-thumb {
background-color: #e6e6e6;
-webkit-border-radius: 2em;
-moz-border-radius: 2em;
border-radius: 2em;
}
#kefu_emoji {
display: none;
position: absolute;
z-index: 10;
bottom: 52px;
background-color: #fff;
border-radius: 4px;
box-shadow: 0 4px 5px rgba(0, 0, 0, .1);
width: 100%;
}
#kefu_emoji .emoji {
height: 40px;
width: 40px;
padding: 6px;
}
.send_btn {
display: none;
margin-left: 14px;
background: #00b0ff;
color: #fff;
border-color: #00b0ff;
outline: none;
}
.send_btn, .send_btn:hover, .send_btn:focus, .send_btn:visited, .send_btn:active.focus, .send_btn:active:hover, .send_btn:active, .send_btn.active, .dropdown-toggle.send_btn {
color: #fff;
outline: none;
background-color: #00b0ff;
border-color: #00b0ff;
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

+160
View File
@@ -0,0 +1,160 @@
// https://github.com/yuezhongxin/paste-upload-image.js
(function ($) {
var isImage, isImageForDrop, getFilename, getMimeType;
isImage = function (data) {
var i, item;
i = 0;
while (i < data.clipboardData.items.length) {
item = data.clipboardData.items[i];
if (item.type.indexOf("image") !== -1) {
return item;
}
i++;
}
return false;
};
isImageForDrop = function (data) {
var i, item;
i = 0;
while (i < data.dataTransfer.files.length) {
item = data.dataTransfer.files[i];
if (item.type.indexOf("image") !== -1) {
return item;
}
i++;
}
return false;
};
getFilename = function (e) {
var value;
if (window.clipboardData && window.clipboardData.getData) {
value = window.clipboardData.getData("Text");
} else if (e.clipboardData && e.clipboardData.getData) {
value = e.clipboardData.getData("text/plain");
}
value = value.split("\r");
return value[0];
};
getMimeType = function (file, filename) {
var mimeType = file.type;
var extendName = filename.substring(filename.lastIndexOf('.') + 1);
if (mimeType != 'image/' + extendName) {
return 'image/' + extendName;
}
return mimeType;
};
$.fn.pasteUploadImage = function (options) {
options = $.extend({}, $.fn.pasteUploadImage.defaults, options);
return this.each(function () {
var that = $(this);
that.on('paste', function (event) {
var filename, image, pasteEvent;
pasteEvent = event.originalEvent;
if (pasteEvent.clipboardData && pasteEvent.clipboardData.items) {
image = isImage(pasteEvent);
if (image) {
event.preventDefault();
filename = getFilename(pasteEvent) || options.defaultImageName;
return that.uploadFile(image.getAsFile(), filename, options);
}
}
});
that.on('drop', function (event) {
var filename, image, pasteEvent;
pasteEvent = event.originalEvent;
if (pasteEvent.dataTransfer && pasteEvent.dataTransfer.files) {
image = isImageForDrop(pasteEvent);
if (image) {
event.preventDefault();
filename = pasteEvent.dataTransfer.files[0].name || options.defaultImageName;
return that.uploadFile(image, filename, options);
}
}
});
});
};
$.fn.insertToTextArea = function (filename, url) {
var options = $(this).data("pu-options") || $.fn.pasteUploadImage.defaults;
return $(this).val(function (index, val) {
return val.replace("{{" + filename + "(" + options.uploadingText + ")}}", "![" + filename + "](" + url + ")" + "\n");
});
};
$.fn.removeLoadingText = function (filename) {
var options = $(this).data("pu-options") || $.fn.pasteUploadImage.defaults;
return $(this).val(function (index, val) {
return val.replace("{{" + filename + "(" + options.uploadingText + ")}}", "\n");
});
};
$.fn.uploadFile = function (file, filename, options) {
var that = $(this);
var options = $.extend(true, $.fn.pasteUploadImage.defaults, options || {});
that.data("pu-options", options);
var text = "{{" + filename + "(" + options.uploadingText + ")}}";
that.pasteText(text);
var formData = new FormData();
formData.append(options.fileName, file);
if (options.appendMimetype) {
formData.append("mimeType", getMimeType(file, filename));
}
var ajaxOptions = {
url: '',
data: formData,
type: 'post',
processData: false,
contentType: false,
dataType: 'json',
success: function (data) {
if (typeof options.success == 'function') {
if (false === options.success.apply(that, [data, filename, file])) {
return;
}
}
if (data.success) {
return that.insertToTextArea(filename, data.message, options);
}
return that.removeLoadingText(filename);
},
error: function (xOptions, textStatus) {
if (typeof options.error == 'function') {
if (false === options.error.apply(that, [{}, filename, file])) {
return;
}
}
that.removeLoadingText("");
console.log(xOptions.responseText);
}
};
if (typeof options.ajaxOptions === 'object') {
ajaxOptions = $.extend(true, ajaxOptions, options.ajaxOptions);
} else {
ajaxOptions.url = options.ajaxOptions;
}
$.ajax(ajaxOptions);
};
$.fn.pasteText = function (text) {
var that = $(this);
var afterSelection, beforeSelection, caretEnd, caretStart, textEnd;
caretStart = that[0].selectionStart;
caretEnd = that[0].selectionEnd;
textEnd = that.val().length;
beforeSelection = that.val().substring(0, caretStart);
afterSelection = that.val().substring(caretEnd, textEnd);
that.val(beforeSelection + text + afterSelection);
that.get(0).setSelectionRange(caretStart + text.length, caretEnd + text.length);
return that.trigger("input");
};
$.fn.pasteUploadImage.defaults = {
success: null,
error: null,
ajaxOptions: '',
fileName: 'imageFile',
appendMimetype: true,
defaultImageName: 'image.png',
uploadingText: 'uploading...',
};
})(jQuery);
+2610
View File
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+734
View File
@@ -0,0 +1,734 @@
(function (factory, $) {
$.fn.SparkMD5 = factory();
}(function (undefined) {
'use strict';
/*
* Fastest md5 implementation around (JKM md5).
* Credits: Joseph Myers
*
* @see http://www.myersdaily.org/joseph/javascript/md5-text.html
* @see http://jsperf.com/md5-shootout/7
*/
/* this function is much faster,
so if possible we use it. Some IEs
are the only ones I know of that
need the idiotic second function,
generated by an if clause. */
var add32 = function (a, b) {
return (a + b) & 0xFFFFFFFF;
},
hex_chr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'];
function cmn(q, a, b, x, s, t) {
a = add32(add32(a, q), add32(x, t));
return add32((a << s) | (a >>> (32 - s)), b);
}
function md5cycle(x, k) {
var a = x[0],
b = x[1],
c = x[2],
d = x[3];
a += (b & c | ~b & d) + k[0] - 680876936 | 0;
a = (a << 7 | a >>> 25) + b | 0;
d += (a & b | ~a & c) + k[1] - 389564586 | 0;
d = (d << 12 | d >>> 20) + a | 0;
c += (d & a | ~d & b) + k[2] + 606105819 | 0;
c = (c << 17 | c >>> 15) + d | 0;
b += (c & d | ~c & a) + k[3] - 1044525330 | 0;
b = (b << 22 | b >>> 10) + c | 0;
a += (b & c | ~b & d) + k[4] - 176418897 | 0;
a = (a << 7 | a >>> 25) + b | 0;
d += (a & b | ~a & c) + k[5] + 1200080426 | 0;
d = (d << 12 | d >>> 20) + a | 0;
c += (d & a | ~d & b) + k[6] - 1473231341 | 0;
c = (c << 17 | c >>> 15) + d | 0;
b += (c & d | ~c & a) + k[7] - 45705983 | 0;
b = (b << 22 | b >>> 10) + c | 0;
a += (b & c | ~b & d) + k[8] + 1770035416 | 0;
a = (a << 7 | a >>> 25) + b | 0;
d += (a & b | ~a & c) + k[9] - 1958414417 | 0;
d = (d << 12 | d >>> 20) + a | 0;
c += (d & a | ~d & b) + k[10] - 42063 | 0;
c = (c << 17 | c >>> 15) + d | 0;
b += (c & d | ~c & a) + k[11] - 1990404162 | 0;
b = (b << 22 | b >>> 10) + c | 0;
a += (b & c | ~b & d) + k[12] + 1804603682 | 0;
a = (a << 7 | a >>> 25) + b | 0;
d += (a & b | ~a & c) + k[13] - 40341101 | 0;
d = (d << 12 | d >>> 20) + a | 0;
c += (d & a | ~d & b) + k[14] - 1502002290 | 0;
c = (c << 17 | c >>> 15) + d | 0;
b += (c & d | ~c & a) + k[15] + 1236535329 | 0;
b = (b << 22 | b >>> 10) + c | 0;
a += (b & d | c & ~d) + k[1] - 165796510 | 0;
a = (a << 5 | a >>> 27) + b | 0;
d += (a & c | b & ~c) + k[6] - 1069501632 | 0;
d = (d << 9 | d >>> 23) + a | 0;
c += (d & b | a & ~b) + k[11] + 643717713 | 0;
c = (c << 14 | c >>> 18) + d | 0;
b += (c & a | d & ~a) + k[0] - 373897302 | 0;
b = (b << 20 | b >>> 12) + c | 0;
a += (b & d | c & ~d) + k[5] - 701558691 | 0;
a = (a << 5 | a >>> 27) + b | 0;
d += (a & c | b & ~c) + k[10] + 38016083 | 0;
d = (d << 9 | d >>> 23) + a | 0;
c += (d & b | a & ~b) + k[15] - 660478335 | 0;
c = (c << 14 | c >>> 18) + d | 0;
b += (c & a | d & ~a) + k[4] - 405537848 | 0;
b = (b << 20 | b >>> 12) + c | 0;
a += (b & d | c & ~d) + k[9] + 568446438 | 0;
a = (a << 5 | a >>> 27) + b | 0;
d += (a & c | b & ~c) + k[14] - 1019803690 | 0;
d = (d << 9 | d >>> 23) + a | 0;
c += (d & b | a & ~b) + k[3] - 187363961 | 0;
c = (c << 14 | c >>> 18) + d | 0;
b += (c & a | d & ~a) + k[8] + 1163531501 | 0;
b = (b << 20 | b >>> 12) + c | 0;
a += (b & d | c & ~d) + k[13] - 1444681467 | 0;
a = (a << 5 | a >>> 27) + b | 0;
d += (a & c | b & ~c) + k[2] - 51403784 | 0;
d = (d << 9 | d >>> 23) + a | 0;
c += (d & b | a & ~b) + k[7] + 1735328473 | 0;
c = (c << 14 | c >>> 18) + d | 0;
b += (c & a | d & ~a) + k[12] - 1926607734 | 0;
b = (b << 20 | b >>> 12) + c | 0;
a += (b ^ c ^ d) + k[5] - 378558 | 0;
a = (a << 4 | a >>> 28) + b | 0;
d += (a ^ b ^ c) + k[8] - 2022574463 | 0;
d = (d << 11 | d >>> 21) + a | 0;
c += (d ^ a ^ b) + k[11] + 1839030562 | 0;
c = (c << 16 | c >>> 16) + d | 0;
b += (c ^ d ^ a) + k[14] - 35309556 | 0;
b = (b << 23 | b >>> 9) + c | 0;
a += (b ^ c ^ d) + k[1] - 1530992060 | 0;
a = (a << 4 | a >>> 28) + b | 0;
d += (a ^ b ^ c) + k[4] + 1272893353 | 0;
d = (d << 11 | d >>> 21) + a | 0;
c += (d ^ a ^ b) + k[7] - 155497632 | 0;
c = (c << 16 | c >>> 16) + d | 0;
b += (c ^ d ^ a) + k[10] - 1094730640 | 0;
b = (b << 23 | b >>> 9) + c | 0;
a += (b ^ c ^ d) + k[13] + 681279174 | 0;
a = (a << 4 | a >>> 28) + b | 0;
d += (a ^ b ^ c) + k[0] - 358537222 | 0;
d = (d << 11 | d >>> 21) + a | 0;
c += (d ^ a ^ b) + k[3] - 722521979 | 0;
c = (c << 16 | c >>> 16) + d | 0;
b += (c ^ d ^ a) + k[6] + 76029189 | 0;
b = (b << 23 | b >>> 9) + c | 0;
a += (b ^ c ^ d) + k[9] - 640364487 | 0;
a = (a << 4 | a >>> 28) + b | 0;
d += (a ^ b ^ c) + k[12] - 421815835 | 0;
d = (d << 11 | d >>> 21) + a | 0;
c += (d ^ a ^ b) + k[15] + 530742520 | 0;
c = (c << 16 | c >>> 16) + d | 0;
b += (c ^ d ^ a) + k[2] - 995338651 | 0;
b = (b << 23 | b >>> 9) + c | 0;
a += (c ^ (b | ~d)) + k[0] - 198630844 | 0;
a = (a << 6 | a >>> 26) + b | 0;
d += (b ^ (a | ~c)) + k[7] + 1126891415 | 0;
d = (d << 10 | d >>> 22) + a | 0;
c += (a ^ (d | ~b)) + k[14] - 1416354905 | 0;
c = (c << 15 | c >>> 17) + d | 0;
b += (d ^ (c | ~a)) + k[5] - 57434055 | 0;
b = (b << 21 |b >>> 11) + c | 0;
a += (c ^ (b | ~d)) + k[12] + 1700485571 | 0;
a = (a << 6 | a >>> 26) + b | 0;
d += (b ^ (a | ~c)) + k[3] - 1894986606 | 0;
d = (d << 10 | d >>> 22) + a | 0;
c += (a ^ (d | ~b)) + k[10] - 1051523 | 0;
c = (c << 15 | c >>> 17) + d | 0;
b += (d ^ (c | ~a)) + k[1] - 2054922799 | 0;
b = (b << 21 |b >>> 11) + c | 0;
a += (c ^ (b | ~d)) + k[8] + 1873313359 | 0;
a = (a << 6 | a >>> 26) + b | 0;
d += (b ^ (a | ~c)) + k[15] - 30611744 | 0;
d = (d << 10 | d >>> 22) + a | 0;
c += (a ^ (d | ~b)) + k[6] - 1560198380 | 0;
c = (c << 15 | c >>> 17) + d | 0;
b += (d ^ (c | ~a)) + k[13] + 1309151649 | 0;
b = (b << 21 |b >>> 11) + c | 0;
a += (c ^ (b | ~d)) + k[4] - 145523070 | 0;
a = (a << 6 | a >>> 26) + b | 0;
d += (b ^ (a | ~c)) + k[11] - 1120210379 | 0;
d = (d << 10 | d >>> 22) + a | 0;
c += (a ^ (d | ~b)) + k[2] + 718787259 | 0;
c = (c << 15 | c >>> 17) + d | 0;
b += (d ^ (c | ~a)) + k[9] - 343485551 | 0;
b = (b << 21 | b >>> 11) + c | 0;
x[0] = a + x[0] | 0;
x[1] = b + x[1] | 0;
x[2] = c + x[2] | 0;
x[3] = d + x[3] | 0;
}
function md5blk(s) {
var md5blks = [],
i; /* Andy King said do it this way. */
for (i = 0; i < 64; i += 4) {
md5blks[i >> 2] = s.charCodeAt(i) + (s.charCodeAt(i + 1) << 8) + (s.charCodeAt(i + 2) << 16) + (s.charCodeAt(i + 3) << 24);
}
return md5blks;
}
function md5blk_array(a) {
var md5blks = [],
i; /* Andy King said do it this way. */
for (i = 0; i < 64; i += 4) {
md5blks[i >> 2] = a[i] + (a[i + 1] << 8) + (a[i + 2] << 16) + (a[i + 3] << 24);
}
return md5blks;
}
function md51(s) {
var n = s.length,
state = [1732584193, -271733879, -1732584194, 271733878],
i,
length,
tail,
tmp,
lo,
hi;
for (i = 64; i <= n; i += 64) {
md5cycle(state, md5blk(s.substring(i - 64, i)));
}
s = s.substring(i - 64);
length = s.length;
tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
for (i = 0; i < length; i += 1) {
tail[i >> 2] |= s.charCodeAt(i) << ((i % 4) << 3);
}
tail[i >> 2] |= 0x80 << ((i % 4) << 3);
if (i > 55) {
md5cycle(state, tail);
for (i = 0; i < 16; i += 1) {
tail[i] = 0;
}
}
// Beware that the final length might not fit in 32 bits so we take care of that
tmp = n * 8;
tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);
lo = parseInt(tmp[2], 16);
hi = parseInt(tmp[1], 16) || 0;
tail[14] = lo;
tail[15] = hi;
md5cycle(state, tail);
return state;
}
function md51_array(a) {
var n = a.length,
state = [1732584193, -271733879, -1732584194, 271733878],
i,
length,
tail,
tmp,
lo,
hi;
for (i = 64; i <= n; i += 64) {
md5cycle(state, md5blk_array(a.subarray(i - 64, i)));
}
// Not sure if it is a bug, however IE10 will always produce a sub array of length 1
// containing the last element of the parent array if the sub array specified starts
// beyond the length of the parent array - weird.
// https://connect.microsoft.com/IE/feedback/details/771452/typed-array-subarray-issue
a = (i - 64) < n ? a.subarray(i - 64) : new Uint8Array(0);
length = a.length;
tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
for (i = 0; i < length; i += 1) {
tail[i >> 2] |= a[i] << ((i % 4) << 3);
}
tail[i >> 2] |= 0x80 << ((i % 4) << 3);
if (i > 55) {
md5cycle(state, tail);
for (i = 0; i < 16; i += 1) {
tail[i] = 0;
}
}
// Beware that the final length might not fit in 32 bits so we take care of that
tmp = n * 8;
tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);
lo = parseInt(tmp[2], 16);
hi = parseInt(tmp[1], 16) || 0;
tail[14] = lo;
tail[15] = hi;
md5cycle(state, tail);
return state;
}
function rhex(n) {
var s = '',
j;
for (j = 0; j < 4; j += 1) {
s += hex_chr[(n >> (j * 8 + 4)) & 0x0F] + hex_chr[(n >> (j * 8)) & 0x0F];
}
return s;
}
function hex(x) {
var i;
for (i = 0; i < x.length; i += 1) {
x[i] = rhex(x[i]);
}
return x.join('');
}
// In some cases the fast add32 function cannot be used..
if (hex(md51('hello')) !== '5d41402abc4b2a76b9719d911017c592') {
add32 = function (x, y) {
var lsw = (x & 0xFFFF) + (y & 0xFFFF),
msw = (x >> 16) + (y >> 16) + (lsw >> 16);
return (msw << 16) | (lsw & 0xFFFF);
};
}
// ---------------------------------------------------
/**
* ArrayBuffer slice polyfill.
*
* @see https://github.com/ttaubert/node-arraybuffer-slice
*/
if (typeof ArrayBuffer !== 'undefined' && !ArrayBuffer.prototype.slice) {
(function () {
function clamp(val, length) {
val = (val | 0) || 0;
if (val < 0) {
return Math.max(val + length, 0);
}
return Math.min(val, length);
}
ArrayBuffer.prototype.slice = function (from, to) {
var length = this.byteLength,
begin = clamp(from, length),
end = length,
num,
target,
targetArray,
sourceArray;
if (to !== undefined) {
end = clamp(to, length);
}
if (begin > end) {
return new ArrayBuffer(0);
}
num = end - begin;
target = new ArrayBuffer(num);
targetArray = new Uint8Array(target);
sourceArray = new Uint8Array(this, begin, num);
targetArray.set(sourceArray);
return target;
};
})();
}
// ---------------------------------------------------
/**
* Helpers.
*/
function toUtf8(str) {
if (/[\u0080-\uFFFF]/.test(str)) {
str = unescape(encodeURIComponent(str));
}
return str;
}
function utf8Str2ArrayBuffer(str, returnUInt8Array) {
var length = str.length,
buff = new ArrayBuffer(length),
arr = new Uint8Array(buff),
i;
for (i = 0; i < length; i += 1) {
arr[i] = str.charCodeAt(i);
}
return returnUInt8Array ? arr : buff;
}
function arrayBuffer2Utf8Str(buff) {
return String.fromCharCode.apply(null, new Uint8Array(buff));
}
function concatenateArrayBuffers(first, second, returnUInt8Array) {
var result = new Uint8Array(first.byteLength + second.byteLength);
result.set(new Uint8Array(first));
result.set(new Uint8Array(second), first.byteLength);
return returnUInt8Array ? result : result.buffer;
}
function hexToBinaryString(hex) {
var bytes = [],
length = hex.length,
x;
for (x = 0; x < length - 1; x += 2) {
bytes.push(parseInt(hex.substr(x, 2), 16));
}
return String.fromCharCode.apply(String, bytes);
}
// ---------------------------------------------------
/**
* SparkMD5 OOP implementation.
*
* Use this class to perform an incremental md5, otherwise use the
* static methods instead.
*/
function SparkMD5() {
// call reset to init the instance
this.reset();
}
/**
* Appends a string.
* A conversion will be applied if an utf8 string is detected.
*
* @param {String} str The string to be appended
*
* @return {SparkMD5} The instance itself
*/
SparkMD5.prototype.append = function (str) {
// Converts the string to utf8 bytes if necessary
// Then append as binary
this.appendBinary(toUtf8(str));
return this;
};
/**
* Appends a binary string.
*
* @param {String} contents The binary string to be appended
*
* @return {SparkMD5} The instance itself
*/
SparkMD5.prototype.appendBinary = function (contents) {
this._buff += contents;
this._length += contents.length;
var length = this._buff.length,
i;
for (i = 64; i <= length; i += 64) {
md5cycle(this._hash, md5blk(this._buff.substring(i - 64, i)));
}
this._buff = this._buff.substring(i - 64);
return this;
};
/**
* Finishes the incremental computation, reseting the internal state and
* returning the result.
*
* @param {Boolean} raw True to get the raw string, false to get the hex string
*
* @return {String} The result
*/
SparkMD5.prototype.end = function (raw) {
var buff = this._buff,
length = buff.length,
i,
tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
ret;
for (i = 0; i < length; i += 1) {
tail[i >> 2] |= buff.charCodeAt(i) << ((i % 4) << 3);
}
this._finish(tail, length);
ret = hex(this._hash);
if (raw) {
ret = hexToBinaryString(ret);
}
this.reset();
return ret;
};
/**
* Resets the internal state of the computation.
*
* @return {SparkMD5} The instance itself
*/
SparkMD5.prototype.reset = function () {
this._buff = '';
this._length = 0;
this._hash = [1732584193, -271733879, -1732584194, 271733878];
return this;
};
/**
* Gets the internal state of the computation.
*
* @return {Object} The state
*/
SparkMD5.prototype.getState = function () {
return {
buff: this._buff,
length: this._length,
hash: this._hash.slice()
};
};
/**
* Gets the internal state of the computation.
*
* @param {Object} state The state
*
* @return {SparkMD5} The instance itself
*/
SparkMD5.prototype.setState = function (state) {
this._buff = state.buff;
this._length = state.length;
this._hash = state.hash;
return this;
};
/**
* Releases memory used by the incremental buffer and other additional
* resources. If you plan to use the instance again, use reset instead.
*/
SparkMD5.prototype.destroy = function () {
delete this._hash;
delete this._buff;
delete this._length;
};
/**
* Finish the final calculation based on the tail.
*
* @param {Array} tail The tail (will be modified)
* @param {Number} length The length of the remaining buffer
*/
SparkMD5.prototype._finish = function (tail, length) {
var i = length,
tmp,
lo,
hi;
tail[i >> 2] |= 0x80 << ((i % 4) << 3);
if (i > 55) {
md5cycle(this._hash, tail);
for (i = 0; i < 16; i += 1) {
tail[i] = 0;
}
}
// Do the final computation based on the tail and length
// Beware that the final length may not fit in 32 bits so we take care of that
tmp = this._length * 8;
tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);
lo = parseInt(tmp[2], 16);
hi = parseInt(tmp[1], 16) || 0;
tail[14] = lo;
tail[15] = hi;
md5cycle(this._hash, tail);
};
/**
* Performs the md5 hash on a string.
* A conversion will be applied if utf8 string is detected.
*
* @param {String} str The string
* @param {Boolean} [raw] True to get the raw string, false to get the hex string
*
* @return {String} The result
*/
SparkMD5.hash = function (str, raw) {
// Converts the string to utf8 bytes if necessary
// Then compute it using the binary function
return SparkMD5.hashBinary(toUtf8(str), raw);
};
/**
* Performs the md5 hash on a binary string.
*
* @param {String} content The binary string
* @param {Boolean} [raw] True to get the raw string, false to get the hex string
*
* @return {String} The result
*/
SparkMD5.hashBinary = function (content, raw) {
var hash = md51(content),
ret = hex(hash);
return raw ? hexToBinaryString(ret) : ret;
};
// ---------------------------------------------------
/**
* SparkMD5 OOP implementation for array buffers.
*
* Use this class to perform an incremental md5 ONLY for array buffers.
*/
SparkMD5.ArrayBuffer = function () {
// call reset to init the instance
this.reset();
};
/**
* Appends an array buffer.
*
* @param {ArrayBuffer} arr The array to be appended
*
* @return {SparkMD5.ArrayBuffer} The instance itself
*/
SparkMD5.ArrayBuffer.prototype.append = function (arr) {
var buff = concatenateArrayBuffers(this._buff.buffer, arr, true),
length = buff.length,
i;
this._length += arr.byteLength;
for (i = 64; i <= length; i += 64) {
md5cycle(this._hash, md5blk_array(buff.subarray(i - 64, i)));
}
this._buff = (i - 64) < length ? new Uint8Array(buff.buffer.slice(i - 64)) : new Uint8Array(0);
return this;
};
/**
* Finishes the incremental computation, reseting the internal state and
* returning the result.
*
* @param {Boolean} raw True to get the raw string, false to get the hex string
*
* @return {String} The result
*/
SparkMD5.ArrayBuffer.prototype.end = function (raw) {
var buff = this._buff,
length = buff.length,
tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
i,
ret;
for (i = 0; i < length; i += 1) {
tail[i >> 2] |= buff[i] << ((i % 4) << 3);
}
this._finish(tail, length);
ret = hex(this._hash);
if (raw) {
ret = hexToBinaryString(ret);
}
this.reset();
return ret;
};
/**
* Resets the internal state of the computation.
*
* @return {SparkMD5.ArrayBuffer} The instance itself
*/
SparkMD5.ArrayBuffer.prototype.reset = function () {
this._buff = new Uint8Array(0);
this._length = 0;
this._hash = [1732584193, -271733879, -1732584194, 271733878];
return this;
};
/**
* Gets the internal state of the computation.
*
* @return {Object} The state
*/
SparkMD5.ArrayBuffer.prototype.getState = function () {
var state = SparkMD5.prototype.getState.call(this);
// Convert buffer to a string
state.buff = arrayBuffer2Utf8Str(state.buff);
return state;
};
/**
* Gets the internal state of the computation.
*
* @param {Object} state The state
*
* @return {SparkMD5.ArrayBuffer} The instance itself
*/
SparkMD5.ArrayBuffer.prototype.setState = function (state) {
// Convert string to buffer
state.buff = utf8Str2ArrayBuffer(state.buff, true);
return SparkMD5.prototype.setState.call(this, state);
};
SparkMD5.ArrayBuffer.prototype.destroy = SparkMD5.prototype.destroy;
SparkMD5.ArrayBuffer.prototype._finish = SparkMD5.prototype._finish;
/**
* Performs the md5 hash on an array buffer.
*
* @param {ArrayBuffer} arr The array buffer
* @param {Boolean} [raw] True to get the raw string, false to get the hex one
*
* @return {String} The result
*/
SparkMD5.ArrayBuffer.hash = function (arr, raw) {
var hash = md51_array(new Uint8Array(arr)),
ret = hex(hash);
return raw ? hexToBinaryString(ret) : ret;
};
return SparkMD5;
}, jQuery));
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
+155
View File
@@ -0,0 +1,155 @@
(function($) {
$.extend($.summernote.lang, {
'zh-CN': {
font: {
bold: '粗体',
italic: '斜体',
underline: '下划线',
clear: '清除格式',
height: '行高',
name: '字体',
strikethrough: '删除线',
subscript: '下标',
superscript: '上标',
size: '字号'
},
image: {
image: '图片',
insert: '插入图片',
resizeFull: '缩放至 100%',
resizeHalf: '缩放至 50%',
resizeQuarter: '缩放至 25%',
floatLeft: '靠左浮动',
floatRight: '靠右浮动',
floatNone: '取消浮动',
shapeRounded: '形状: 圆角',
shapeCircle: '形状: 圆',
shapeThumbnail: '形状: 缩略图',
shapeNone: '形状: 无',
dragImageHere: '将图片拖拽至此处',
dropImage: 'Drop image or Text',
selectFromFiles: '从本地上传',
maximumFileSize: '文件大小最大值',
maximumFileSizeError: '文件大小超出最大值。',
url: '图片地址',
remove: '移除图片',
original: 'Original'
},
video: {
video: '视频',
videoLink: '视频链接',
insert: '插入视频',
url: '视频地址',
providers: '(优酷, 腾讯, Instagram, DailyMotion, Youtube等)'
},
link: {
link: '链接',
insert: '插入链接',
unlink: '去除链接',
edit: '编辑链接',
textToDisplay: '显示文本',
url: '链接地址',
openInNewWindow: '在新窗口打开'
},
table: {
table: '表格',
addRowAbove: 'Add row above',
addRowBelow: 'Add row below',
addColLeft: 'Add column left',
addColRight: 'Add column right',
delRow: 'Delete row',
delCol: 'Delete column',
delTable: 'Delete table'
},
hr: {
insert: '水平线'
},
style: {
style: '样式',
p: '普通',
blockquote: '引用',
pre: '代码',
h1: '标题 1',
h2: '标题 2',
h3: '标题 3',
h4: '标题 4',
h5: '标题 5',
h6: '标题 6'
},
lists: {
unordered: '无序列表',
ordered: '有序列表'
},
options: {
help: '帮助',
fullscreen: '全屏',
codeview: '源代码'
},
paragraph: {
paragraph: '段落',
outdent: '减少缩进',
indent: '增加缩进',
left: '左对齐',
center: '居中对齐',
right: '右对齐',
justify: '两端对齐'
},
color: {
recent: '最近使用',
more: '更多',
background: '背景',
foreground: '前景',
transparent: '透明',
setTransparent: '透明',
reset: '重置',
resetToDefault: '默认'
},
shortcut: {
shortcuts: '快捷键',
close: '关闭',
textFormatting: '文本格式',
action: '动作',
paragraphFormatting: '段落格式',
documentStyle: '文档样式',
extraKeys: '额外按键'
},
help: {
insertParagraph: '插入段落',
undo: '撤销',
redo: '重做',
tab: '增加缩进',
untab: '减少缩进',
bold: '粗体',
italic: '斜体',
underline: '下划线',
strikethrough: '删除线',
removeFormat: '清除格式',
justifyLeft: '左对齐',
justifyCenter: '居中对齐',
justifyRight: '右对齐',
justifyFull: '两端对齐',
insertUnorderedList: '无序列表',
insertOrderedList: '有序列表',
outdent: '减少缩进',
indent: '增加缩进',
formatPara: '设置选中内容样式为 普通',
formatH1: '设置选中内容样式为 标题1',
formatH2: '设置选中内容样式为 标题2',
formatH3: '设置选中内容样式为 标题3',
formatH4: '设置选中内容样式为 标题4',
formatH5: '设置选中内容样式为 标题5',
formatH6: '设置选中内容样式为 标题6',
insertHorizontalRule: '插入水平线',
'linkDialog.show': '显示链接对话框'
},
history: {
undo: '撤销',
redo: '重做'
},
specialChar: {
specialChar: 'SPECIAL CHARACTERS',
select: 'Select Special characters'
}
}
});
})(jQuery);
+3
View File
@@ -0,0 +1,3 @@
/*! Summernote v0.8.10 | (c) 2013- Alan Hong and other contributors | MIT license */
!function(e){e.extend(e.summernote.lang,{"zh-CN":{font:{bold:"粗体",italic:"斜体",underline:"下划线",clear:"清除格式",height:"行高",name:"字体",strikethrough:"删除线",subscript:"下标",superscript:"上标",size:"字号"},image:{image:"图片",insert:"插入图片",resizeFull:"缩放至 100%",resizeHalf:"缩放至 50%",resizeQuarter:"缩放至 25%",floatLeft:"靠左浮动",floatRight:"靠右浮动",floatNone:"取消浮动",shapeRounded:"形状: 圆角",shapeCircle:"形状: 圆",shapeThumbnail:"形状: 缩略图",shapeNone:"形状: 无",dragImageHere:"将图片拖拽至此处",dropImage:"Drop image or Text",selectFromFiles:"从本地上传",maximumFileSize:"文件大小最大值",maximumFileSizeError:"文件大小超出最大值。",url:"图片地址",remove:"移除图片",original:"Original"},video:{video:"视频",videoLink:"视频链接",insert:"插入视频",url:"视频地址",providers:"(优酷, 腾讯, Instagram, DailyMotion, Youtube等)"},link:{link:"链接",insert:"插入链接",unlink:"去除链接",edit:"编辑链接",textToDisplay:"显示文本",url:"链接地址",openInNewWindow:"在新窗口打开"},table:{table:"表格",addRowAbove:"Add row above",addRowBelow:"Add row below",addColLeft:"Add column left",addColRight:"Add column right",delRow:"Delete row",delCol:"Delete column",delTable:"Delete table"},hr:{insert:"水平线"},style:{style:"样式",p:"普通",blockquote:"引用",pre:"代码",h1:"标题 1",h2:"标题 2",h3:"标题 3",h4:"标题 4",h5:"标题 5",h6:"标题 6"},lists:{unordered:"无序列表",ordered:"有序列表"},options:{help:"帮助",fullscreen:"全屏",codeview:"源代码"},paragraph:{paragraph:"段落",outdent:"减少缩进",indent:"增加缩进",left:"左对齐",center:"居中对齐",right:"右对齐",justify:"两端对齐"},color:{recent:"最近使用",more:"更多",background:"背景",foreground:"前景",transparent:"透明",setTransparent:"透明",reset:"重置",resetToDefault:"默认"},shortcut:{shortcuts:"快捷键",close:"关闭",textFormatting:"文本格式",action:"动作",paragraphFormatting:"段落格式",documentStyle:"文档样式",extraKeys:"额外按键"},help:{insertParagraph:"插入段落",undo:"撤销",redo:"重做",tab:"增加缩进",untab:"减少缩进",bold:"粗体",italic:"斜体",underline:"下划线",strikethrough:"删除线",removeFormat:"清除格式",justifyLeft:"左对齐",justifyCenter:"居中对齐",justifyRight:"右对齐",justifyFull:"两端对齐",insertUnorderedList:"无序列表",insertOrderedList:"有序列表",outdent:"减少缩进",indent:"增加缩进",formatPara:"设置选中内容样式为 普通",formatH1:"设置选中内容样式为 标题1",formatH2:"设置选中内容样式为 标题2",formatH3:"设置选中内容样式为 标题3",formatH4:"设置选中内容样式为 标题4",formatH5:"设置选中内容样式为 标题5",formatH6:"设置选中内容样式为 标题6",insertHorizontalRule:"插入水平线","linkDialog.show":"显示链接对话框"},history:{undo:"撤销",redo:"重做"},specialChar:{specialChar:"SPECIAL CHARACTERS",select:"Select Special characters"}}})}(jQuery);
+155
View File
@@ -0,0 +1,155 @@
(function($) {
$.extend($.summernote.lang, {
'zh-TW': {
font: {
bold: '粗體',
italic: '斜體',
underline: '底線',
clear: '清除格式',
height: '行高',
name: '字體',
strikethrough: '刪除線',
subscript: '下標',
superscript: '上標',
size: '字號'
},
image: {
image: '圖片',
insert: '插入圖片',
resizeFull: '縮放至100%',
resizeHalf: '縮放至 50%',
resizeQuarter: '縮放至 25%',
floatLeft: '靠左浮動',
floatRight: '靠右浮動',
floatNone: '取消浮動',
shapeRounded: '形狀: 圓角',
shapeCircle: '形狀: 圓',
shapeThumbnail: '形狀: 縮略圖',
shapeNone: '形狀: 無',
dragImageHere: '將圖片拖曳至此處',
dropImage: 'Drop image or Text',
selectFromFiles: '從本機上傳',
maximumFileSize: '文件大小最大值',
maximumFileSizeError: '文件大小超出最大值。',
url: '圖片網址',
remove: '移除圖片',
original: 'Original'
},
video: {
video: '影片',
videoLink: '影片連結',
insert: '插入影片',
url: '影片網址',
providers: '(優酷, Instagram, DailyMotion, Youtube等)'
},
link: {
link: '連結',
insert: '插入連結',
unlink: '取消連結',
edit: '編輯連結',
textToDisplay: '顯示文字',
url: '連結網址',
openInNewWindow: '在新視窗開啟'
},
table: {
table: '表格',
addRowAbove: 'Add row above',
addRowBelow: 'Add row below',
addColLeft: 'Add column left',
addColRight: 'Add column right',
delRow: 'Delete row',
delCol: 'Delete column',
delTable: 'Delete table'
},
hr: {
insert: '水平線'
},
style: {
style: '樣式',
p: '一般',
blockquote: '引用區塊',
pre: '程式碼區塊',
h1: '標題 1',
h2: '標題 2',
h3: '標題 3',
h4: '標題 4',
h5: '標題 5',
h6: '標題 6'
},
lists: {
unordered: '項目清單',
ordered: '編號清單'
},
options: {
help: '幫助',
fullscreen: '全螢幕',
codeview: '原始碼'
},
paragraph: {
paragraph: '段落',
outdent: '取消縮排',
indent: '增加縮排',
left: '靠右對齊',
center: '靠中對齊',
right: '靠右對齊',
justify: '左右對齊'
},
color: {
recent: '字型顏色',
more: '更多',
background: '背景',
foreground: '前景',
transparent: '透明',
setTransparent: '透明',
reset: '重設',
resetToDefault: '默認'
},
shortcut: {
shortcuts: '快捷鍵',
close: '關閉',
textFormatting: '文字格式',
action: '動作',
paragraphFormatting: '段落格式',
documentStyle: '文件格式',
extraKeys: '額外按鍵'
},
help: {
'insertParagraph': 'Insert Paragraph',
'undo': 'Undoes the last command',
'redo': 'Redoes the last command',
'tab': 'Tab',
'untab': 'Untab',
'bold': 'Set a bold style',
'italic': 'Set a italic style',
'underline': 'Set a underline style',
'strikethrough': 'Set a strikethrough style',
'removeFormat': 'Clean a style',
'justifyLeft': 'Set left align',
'justifyCenter': 'Set center align',
'justifyRight': 'Set right align',
'justifyFull': 'Set full align',
'insertUnorderedList': 'Toggle unordered list',
'insertOrderedList': 'Toggle ordered list',
'outdent': 'Outdent on current paragraph',
'indent': 'Indent on current paragraph',
'formatPara': 'Change current block\'s format as a paragraph(P tag)',
'formatH1': 'Change current block\'s format as H1',
'formatH2': 'Change current block\'s format as H2',
'formatH3': 'Change current block\'s format as H3',
'formatH4': 'Change current block\'s format as H4',
'formatH5': 'Change current block\'s format as H5',
'formatH6': 'Change current block\'s format as H6',
'insertHorizontalRule': 'Insert horizontal rule',
'linkDialog.show': 'Show Link Dialog'
},
history: {
undo: '復原',
redo: '取消復原'
},
specialChar: {
specialChar: 'SPECIAL CHARACTERS',
select: 'Select Special characters'
}
}
});
})(jQuery);
+3
View File
@@ -0,0 +1,3 @@
/*! Summernote v0.8.10 | (c) 2013- Alan Hong and other contributors | MIT license */
!function(e){e.extend(e.summernote.lang,{"zh-TW":{font:{bold:"粗體",italic:"斜體",underline:"底線",clear:"清除格式",height:"行高",name:"字體",strikethrough:"刪除線",subscript:"下標",superscript:"上標",size:"字號"},image:{image:"圖片",insert:"插入圖片",resizeFull:"縮放至100%",resizeHalf:"縮放至 50%",resizeQuarter:"縮放至 25%",floatLeft:"靠左浮動",floatRight:"靠右浮動",floatNone:"取消浮動",shapeRounded:"形狀: 圓角",shapeCircle:"形狀: 圓",shapeThumbnail:"形狀: 縮略圖",shapeNone:"形狀: 無",dragImageHere:"將圖片拖曳至此處",dropImage:"Drop image or Text",selectFromFiles:"從本機上傳",maximumFileSize:"文件大小最大值",maximumFileSizeError:"文件大小超出最大值。",url:"圖片網址",remove:"移除圖片",original:"Original"},video:{video:"影片",videoLink:"影片連結",insert:"插入影片",url:"影片網址",providers:"(優酷, Instagram, DailyMotion, Youtube等)"},link:{link:"連結",insert:"插入連結",unlink:"取消連結",edit:"編輯連結",textToDisplay:"顯示文字",url:"連結網址",openInNewWindow:"在新視窗開啟"},table:{table:"表格",addRowAbove:"Add row above",addRowBelow:"Add row below",addColLeft:"Add column left",addColRight:"Add column right",delRow:"Delete row",delCol:"Delete column",delTable:"Delete table"},hr:{insert:"水平線"},style:{style:"樣式",p:"一般",blockquote:"引用區塊",pre:"程式碼區塊",h1:"標題 1",h2:"標題 2",h3:"標題 3",h4:"標題 4",h5:"標題 5",h6:"標題 6"},lists:{unordered:"項目清單",ordered:"編號清單"},options:{help:"幫助",fullscreen:"全螢幕",codeview:"原始碼"},paragraph:{paragraph:"段落",outdent:"取消縮排",indent:"增加縮排",left:"靠右對齊",center:"靠中對齊",right:"靠右對齊",justify:"左右對齊"},color:{recent:"字型顏色",more:"更多",background:"背景",foreground:"前景",transparent:"透明",setTransparent:"透明",reset:"重設",resetToDefault:"默認"},shortcut:{shortcuts:"快捷鍵",close:"關閉",textFormatting:"文字格式",action:"動作",paragraphFormatting:"段落格式",documentStyle:"文件格式",extraKeys:"額外按鍵"},help:{insertParagraph:"Insert Paragraph",undo:"Undoes the last command",redo:"Redoes the last command",tab:"Tab",untab:"Untab",bold:"Set a bold style",italic:"Set a italic style",underline:"Set a underline style",strikethrough:"Set a strikethrough style",removeFormat:"Clean a style",justifyLeft:"Set left align",justifyCenter:"Set center align",justifyRight:"Set right align",justifyFull:"Set full align",insertUnorderedList:"Toggle unordered list",insertOrderedList:"Toggle ordered list",outdent:"Outdent on current paragraph",indent:"Indent on current paragraph",formatPara:"Change current block's format as a paragraph(P tag)",formatH1:"Change current block's format as H1",formatH2:"Change current block's format as H2",formatH3:"Change current block's format as H3",formatH4:"Change current block's format as H4",formatH5:"Change current block's format as H5",formatH6:"Change current block's format as H6",insertHorizontalRule:"Insert horizontal rule","linkDialog.show":"Show Link Dialog"},history:{undo:"復原",redo:"取消復原"},specialChar:{specialChar:"SPECIAL CHARACTERS",select:"Select Special characters"}}})}(jQuery);