master
zorlan 2022-12-08 10:47:39 +08:00
parent 7a3fb71615
commit 441f6ce7bd
147 changed files with 17031 additions and 1998 deletions

View File

@ -1,5 +0,0 @@
#注意:如果蓝天采集器安装在子目录中,请将“子目录”替换为相应目录的名称,否则删除文字“/子目录”
if (!-e $request_filename) {
rewrite ^/子目录/app/(\w+)/(.*)$ /子目录/app/$1/index.php?s=/$2 last;
rewrite ^/子目录/(.*)$ /子目录/index.php?s=/$1 last;
}

View File

@ -64,18 +64,27 @@ class skycaiji{
* 请求网址
* @param string $url 网址
* @param mixed $post (bool)post模式 或者 (array)post数据
* @param string $pageCharset 页面编码,不填可自动识别
* @param string $charset 网页编码,默认自动识别
* @param array $headers 头信息
* @return array 返回数组:(bool)success是否成功(string)header头信息(string)content页面内容
* @param array $options 选项timeout超时秒数curlopts附加curl的选项值
* @return array 返回数组:(bool)success抓取成功(int)code页面状态码(string)header头信息(string)content页面内容(array)error错误(array)info资源信息
*/
public static function curl($url,$post=null,$pageCharset=null,$headers=array()){
$pageCharset=isset($pageCharset)?$pageCharset:'auto';//默认自动识别
$data=get_html($url,$headers,array('timeout'=>60),$pageCharset,$post,true);
public static function curl($url,$post=null,$charset=null,$headers=array(),$options=array()){
$charset=$charset?$charset:'auto';//默认auto自动识别
$options=is_array($options)?$options:array();
$options['timeout']=$options['timeout']?:30;//超时时间(秒)
$options['return_info']=$options['return_info']?:1;//返回curl句柄信息
$options['return_body']=$options['return_body']?:1;//返回非成功状态的页面内容
$options['curlopts']=is_array($options['curlopts'])?$options['curlopts']:array();//curl的选项值列表以CURLOPT_XXX为键名
$data=get_html($url,$headers,$options,$charset,$post,true);
$data=is_array($data)?$data:array();
$data=array(
'success'=>$data['ok']?true:false,
'header'=>$data['header']?$data['header']:'',
'content'=>$data['html']?$data['html']:''
'code'=>intval($data['code']),
'header'=>$data['header']?:'',
'content'=>$data['html']?:'',
'error'=>$data['error']?:array(),
'info'=>$data['info']?:array(),
);
return $data;
}

View File

@ -0,0 +1,211 @@
// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/5/LICENSE
(function(mod) {
if (typeof exports == "object" && typeof module == "object") // CommonJS
mod(require("../../lib/codemirror"));
else if (typeof define == "function" && define.amd) // AMD
define(["../../lib/codemirror"], mod);
else // Plain browser env
mod(CodeMirror);
})(function(CodeMirror) {
"use strict";
var noOptions = {};
var nonWS = /[^\s\u00a0]/;
var Pos = CodeMirror.Pos, cmp = CodeMirror.cmpPos;
function firstNonWS(str) {
var found = str.search(nonWS);
return found == -1 ? 0 : found;
}
CodeMirror.commands.toggleComment = function(cm) {
cm.toggleComment();
};
CodeMirror.defineExtension("toggleComment", function(options) {
if (!options) options = noOptions;
var cm = this;
var minLine = Infinity, ranges = this.listSelections(), mode = null;
for (var i = ranges.length - 1; i >= 0; i--) {
var from = ranges[i].from(), to = ranges[i].to();
if (from.line >= minLine) continue;
if (to.line >= minLine) to = Pos(minLine, 0);
minLine = from.line;
if (mode == null) {
if (cm.uncomment(from, to, options)) mode = "un";
else { cm.lineComment(from, to, options); mode = "line"; }
} else if (mode == "un") {
cm.uncomment(from, to, options);
} else {
cm.lineComment(from, to, options);
}
}
});
// Rough heuristic to try and detect lines that are part of multi-line string
function probablyInsideString(cm, pos, line) {
return /\bstring\b/.test(cm.getTokenTypeAt(Pos(pos.line, 0))) && !/^[\'\"\`]/.test(line)
}
function getMode(cm, pos) {
var mode = cm.getMode()
return mode.useInnerComments === false || !mode.innerMode ? mode : cm.getModeAt(pos)
}
CodeMirror.defineExtension("lineComment", function(from, to, options) {
if (!options) options = noOptions;
var self = this, mode = getMode(self, from);
var firstLine = self.getLine(from.line);
if (firstLine == null || probablyInsideString(self, from, firstLine)) return;
var commentString = options.lineComment || mode.lineComment;
if (!commentString) {
if (options.blockCommentStart || mode.blockCommentStart) {
options.fullLines = true;
self.blockComment(from, to, options);
}
return;
}
var end = Math.min(to.ch != 0 || to.line == from.line ? to.line + 1 : to.line, self.lastLine() + 1);
var pad = options.padding == null ? " " : options.padding;
var blankLines = options.commentBlankLines || from.line == to.line;
self.operation(function() {
if (options.indent) {
var baseString = null;
for (var i = from.line; i < end; ++i) {
var line = self.getLine(i);
var whitespace = line.search(nonWS) === -1 ? line : line.slice(0, firstNonWS(line));
if (baseString == null || baseString.length > whitespace.length) {
baseString = whitespace;
}
}
for (var i = from.line; i < end; ++i) {
var line = self.getLine(i), cut = baseString.length;
if (!blankLines && !nonWS.test(line)) continue;
if (line.slice(0, cut) != baseString) cut = firstNonWS(line);
self.replaceRange(baseString + commentString + pad, Pos(i, 0), Pos(i, cut));
}
} else {
for (var i = from.line; i < end; ++i) {
if (blankLines || nonWS.test(self.getLine(i)))
self.replaceRange(commentString + pad, Pos(i, 0));
}
}
});
});
CodeMirror.defineExtension("blockComment", function(from, to, options) {
if (!options) options = noOptions;
var self = this, mode = getMode(self, from);
var startString = options.blockCommentStart || mode.blockCommentStart;
var endString = options.blockCommentEnd || mode.blockCommentEnd;
if (!startString || !endString) {
if ((options.lineComment || mode.lineComment) && options.fullLines != false)
self.lineComment(from, to, options);
return;
}
if (/\bcomment\b/.test(self.getTokenTypeAt(Pos(from.line, 0)))) return
var end = Math.min(to.line, self.lastLine());
if (end != from.line && to.ch == 0 && nonWS.test(self.getLine(end))) --end;
var pad = options.padding == null ? " " : options.padding;
if (from.line > end) return;
self.operation(function() {
if (options.fullLines != false) {
var lastLineHasText = nonWS.test(self.getLine(end));
self.replaceRange(pad + endString, Pos(end));
self.replaceRange(startString + pad, Pos(from.line, 0));
var lead = options.blockCommentLead || mode.blockCommentLead;
if (lead != null) for (var i = from.line + 1; i <= end; ++i)
if (i != end || lastLineHasText)
self.replaceRange(lead + pad, Pos(i, 0));
} else {
var atCursor = cmp(self.getCursor("to"), to) == 0, empty = !self.somethingSelected()
self.replaceRange(endString, to);
if (atCursor) self.setSelection(empty ? to : self.getCursor("from"), to)
self.replaceRange(startString, from);
}
});
});
CodeMirror.defineExtension("uncomment", function(from, to, options) {
if (!options) options = noOptions;
var self = this, mode = getMode(self, from);
var end = Math.min(to.ch != 0 || to.line == from.line ? to.line : to.line - 1, self.lastLine()), start = Math.min(from.line, end);
// Try finding line comments
var lineString = options.lineComment || mode.lineComment, lines = [];
var pad = options.padding == null ? " " : options.padding, didSomething;
lineComment: {
if (!lineString) break lineComment;
for (var i = start; i <= end; ++i) {
var line = self.getLine(i);
var found = line.indexOf(lineString);
if (found > -1 && !/comment/.test(self.getTokenTypeAt(Pos(i, found + 1)))) found = -1;
if (found == -1 && nonWS.test(line)) break lineComment;
if (found > -1 && nonWS.test(line.slice(0, found))) break lineComment;
lines.push(line);
}
self.operation(function() {
for (var i = start; i <= end; ++i) {
var line = lines[i - start];
var pos = line.indexOf(lineString), endPos = pos + lineString.length;
if (pos < 0) continue;
if (line.slice(endPos, endPos + pad.length) == pad) endPos += pad.length;
didSomething = true;
self.replaceRange("", Pos(i, pos), Pos(i, endPos));
}
});
if (didSomething) return true;
}
// Try block comments
var startString = options.blockCommentStart || mode.blockCommentStart;
var endString = options.blockCommentEnd || mode.blockCommentEnd;
if (!startString || !endString) return false;
var lead = options.blockCommentLead || mode.blockCommentLead;
var startLine = self.getLine(start), open = startLine.indexOf(startString)
if (open == -1) return false
var endLine = end == start ? startLine : self.getLine(end)
var close = endLine.indexOf(endString, end == start ? open + startString.length : 0);
var insideStart = Pos(start, open + 1), insideEnd = Pos(end, close + 1)
if (close == -1 ||
!/comment/.test(self.getTokenTypeAt(insideStart)) ||
!/comment/.test(self.getTokenTypeAt(insideEnd)) ||
self.getRange(insideStart, insideEnd, "\n").indexOf(endString) > -1)
return false;
// Avoid killing block comments completely outside the selection.
// Positions of the last startString before the start of the selection, and the first endString after it.
var lastStart = startLine.lastIndexOf(startString, from.ch);
var firstEnd = lastStart == -1 ? -1 : startLine.slice(0, from.ch).indexOf(endString, lastStart + startString.length);
if (lastStart != -1 && firstEnd != -1 && firstEnd + endString.length != from.ch) return false;
// Positions of the first endString after the end of the selection, and the last startString before it.
firstEnd = endLine.indexOf(endString, to.ch);
var almostLastStart = endLine.slice(to.ch).lastIndexOf(startString, firstEnd - to.ch);
lastStart = (firstEnd == -1 || almostLastStart == -1) ? -1 : to.ch + almostLastStart;
if (firstEnd != -1 && lastStart != -1 && lastStart != to.ch) return false;
self.operation(function() {
self.replaceRange("", Pos(end, close - (pad && endLine.slice(close - pad.length, close) == pad ? pad.length : 0)),
Pos(end, close + endString.length));
var openEnd = open + startString.length;
if (pad && startLine.slice(openEnd, openEnd + pad.length) == pad) openEnd += pad.length;
self.replaceRange("", Pos(start, open), Pos(start, openEnd));
if (lead) for (var i = start + 1; i <= end; ++i) {
var line = self.getLine(i), found = line.indexOf(lead);
if (found == -1 || nonWS.test(line.slice(0, found))) continue;
var foundEnd = found + lead.length;
if (pad && line.slice(foundEnd, foundEnd + pad.length) == pad) foundEnd += pad.length;
self.replaceRange("", Pos(i, found), Pos(i, foundEnd));
}
});
return true;
});
});

View File

@ -0,0 +1,114 @@
// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/5/LICENSE
(function(mod) {
if (typeof exports == "object" && typeof module == "object") // CommonJS
mod(require("../../lib/codemirror"));
else if (typeof define == "function" && define.amd) // AMD
define(["../../lib/codemirror"], mod);
else // Plain browser env
mod(CodeMirror);
})(function(CodeMirror) {
var nonspace = /\S/g;
var repeat = String.prototype.repeat || function (n) { return Array(n + 1).join(this); };
function continueComment(cm) {
if (cm.getOption("disableInput")) return CodeMirror.Pass;
var ranges = cm.listSelections(), mode, inserts = [];
for (var i = 0; i < ranges.length; i++) {
var pos = ranges[i].head
if (!/\bcomment\b/.test(cm.getTokenTypeAt(pos))) return CodeMirror.Pass;
var modeHere = cm.getModeAt(pos)
if (!mode) mode = modeHere;
else if (mode != modeHere) return CodeMirror.Pass;
var insert = null, line, found;
var blockStart = mode.blockCommentStart, lineCmt = mode.lineComment;
if (blockStart && mode.blockCommentContinue) {
line = cm.getLine(pos.line);
var end = line.lastIndexOf(mode.blockCommentEnd, pos.ch - mode.blockCommentEnd.length);
// 1. if this block comment ended
// 2. if this is actually inside a line comment
if (end != -1 && end == pos.ch - mode.blockCommentEnd.length ||
lineCmt && (found = line.lastIndexOf(lineCmt, pos.ch - 1)) > -1 &&
/\bcomment\b/.test(cm.getTokenTypeAt({line: pos.line, ch: found + 1}))) {
// ...then don't continue it
} else if (pos.ch >= blockStart.length &&
(found = line.lastIndexOf(blockStart, pos.ch - blockStart.length)) > -1 &&
found > end) {
// reuse the existing leading spaces/tabs/mixed
// or build the correct indent using CM's tab/indent options
if (nonspaceAfter(0, line) >= found) {
insert = line.slice(0, found);
} else {
var tabSize = cm.options.tabSize, numTabs;
found = CodeMirror.countColumn(line, found, tabSize);
insert = !cm.options.indentWithTabs ? repeat.call(" ", found) :
repeat.call("\t", (numTabs = Math.floor(found / tabSize))) +
repeat.call(" ", found - tabSize * numTabs);
}
} else if ((found = line.indexOf(mode.blockCommentContinue)) > -1 &&
found <= pos.ch &&
found <= nonspaceAfter(0, line)) {
insert = line.slice(0, found);
}
if (insert != null) insert += mode.blockCommentContinue
}
if (insert == null && lineCmt && continueLineCommentEnabled(cm)) {
if (line == null) line = cm.getLine(pos.line);
found = line.indexOf(lineCmt);
// cursor at pos 0, line comment also at pos 0 => shift it down, don't continue
if (!pos.ch && !found) insert = "";
// continue only if the line starts with an optional space + line comment
else if (found > -1 && nonspaceAfter(0, line) >= found) {
// don't continue if there's only space(s) after cursor or the end of the line
insert = nonspaceAfter(pos.ch, line) > -1;
// but always continue if the next line starts with a line comment too
if (!insert) {
var next = cm.getLine(pos.line + 1) || '',
nextFound = next.indexOf(lineCmt);
insert = nextFound > -1 && nonspaceAfter(0, next) >= nextFound || null;
}
if (insert) {
insert = line.slice(0, found) + lineCmt +
line.slice(found + lineCmt.length).match(/^\s*/)[0];
}
}
}
if (insert == null) return CodeMirror.Pass;
inserts[i] = "\n" + insert;
}
cm.operation(function() {
for (var i = ranges.length - 1; i >= 0; i--)
cm.replaceRange(inserts[i], ranges[i].from(), ranges[i].to(), "+insert");
});
}
function nonspaceAfter(ch, str) {
nonspace.lastIndex = ch;
var m = nonspace.exec(str);
return m ? m.index : -1;
}
function continueLineCommentEnabled(cm) {
var opt = cm.getOption("continueComments");
if (opt && typeof opt == "object")
return opt.continueLineComment !== false;
return true;
}
CodeMirror.defineOption("continueComments", null, function(cm, val, prev) {
if (prev && prev != CodeMirror.Init)
cm.removeKeyMap("continueComment");
if (val) {
var key = "Enter";
if (typeof val == "string")
key = val;
else if (typeof val == "object" && val.key)
key = val.key;
var map = {name: "continueComment"};
map[key] = continueComment;
cm.addKeyMap(map);
}
});
});

View File

@ -0,0 +1,32 @@
.CodeMirror-dialog {
position: absolute;
left: 0; right: 0;
background: inherit;
z-index: 15;
padding: .1em .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: none;
outline: none;
background: transparent;
width: 20em;
color: inherit;
font-family: monospace;
}
.CodeMirror-dialog button {
font-size: 70%;
}

163
public/codemirror/addon/dialog/dialog.js vendored Normal file
View File

@ -0,0 +1,163 @@
// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/5/LICENSE
// Open simple dialogs on top of an editor. Relies on dialog.css.
(function(mod) {
if (typeof exports == "object" && typeof module == "object") // CommonJS
mod(require("../../lib/codemirror"));
else if (typeof define == "function" && define.amd) // AMD
define(["../../lib/codemirror"], mod);
else // Plain browser env
mod(CodeMirror);
})(function(CodeMirror) {
function dialogDiv(cm, template, bottom) {
var wrap = cm.getWrapperElement();
var dialog;
dialog = wrap.appendChild(document.createElement("div"));
if (bottom)
dialog.className = "CodeMirror-dialog CodeMirror-dialog-bottom";
else
dialog.className = "CodeMirror-dialog CodeMirror-dialog-top";
if (typeof template == "string") {
dialog.innerHTML = template;
} else { // Assuming it's a detached DOM element.
dialog.appendChild(template);
}
CodeMirror.addClass(wrap, 'dialog-opened');
return dialog;
}
function closeNotification(cm, newVal) {
if (cm.state.currentNotificationClose)
cm.state.currentNotificationClose();
cm.state.currentNotificationClose = newVal;
}
CodeMirror.defineExtension("openDialog", function(template, callback, options) {
if (!options) options = {};
closeNotification(this, null);
var dialog = dialogDiv(this, template, options.bottom);
var closed = false, me = this;
function close(newVal) {
if (typeof newVal == 'string') {
inp.value = newVal;
} else {
if (closed) return;
closed = true;
CodeMirror.rmClass(dialog.parentNode, 'dialog-opened');
dialog.parentNode.removeChild(dialog);
me.focus();
if (options.onClose) options.onClose(dialog);
}
}
var inp = dialog.getElementsByTagName("input")[0], button;
if (inp) {
inp.focus();
if (options.value) {
inp.value = options.value;
if (options.selectValueOnOpen !== false) {
inp.select();
}
}
if (options.onInput)
CodeMirror.on(inp, "input", function(e) { options.onInput(e, inp.value, close);});
if (options.onKeyUp)
CodeMirror.on(inp, "keyup", function(e) {options.onKeyUp(e, inp.value, close);});
CodeMirror.on(inp, "keydown", function(e) {
if (options && options.onKeyDown && options.onKeyDown(e, inp.value, close)) { return; }
if (e.keyCode == 27 || (options.closeOnEnter !== false && e.keyCode == 13)) {
inp.blur();
CodeMirror.e_stop(e);
close();
}
if (e.keyCode == 13) callback(inp.value, e);
});
if (options.closeOnBlur !== false) CodeMirror.on(dialog, "focusout", function (evt) {
if (evt.relatedTarget !== null) close();
});
} else if (button = dialog.getElementsByTagName("button")[0]) {
CodeMirror.on(button, "click", function() {
close();
me.focus();
});
if (options.closeOnBlur !== false) CodeMirror.on(button, "blur", close);
button.focus();
}
return close;
});
CodeMirror.defineExtension("openConfirm", function(template, callbacks, options) {
closeNotification(this, null);
var dialog = dialogDiv(this, template, options && options.bottom);
var buttons = dialog.getElementsByTagName("button");
var closed = false, me = this, blurring = 1;
function close() {
if (closed) return;
closed = true;
CodeMirror.rmClass(dialog.parentNode, 'dialog-opened');
dialog.parentNode.removeChild(dialog);
me.focus();
}
buttons[0].focus();
for (var i = 0; i < buttons.length; ++i) {
var b = buttons[i];
(function(callback) {
CodeMirror.on(b, "click", function(e) {
CodeMirror.e_preventDefault(e);
close();
if (callback) callback(me);
});
})(callbacks[i]);
CodeMirror.on(b, "blur", function() {
--blurring;
setTimeout(function() { if (blurring <= 0) close(); }, 200);
});
CodeMirror.on(b, "focus", function() { ++blurring; });
}
});
/*
* openNotification
* Opens a notification, that can be closed with an optional timer
* (default 5000ms timer) and always closes on click.
*
* If a notification is opened while another is opened, it will close the
* currently opened one and open the new one immediately.
*/
CodeMirror.defineExtension("openNotification", function(template, options) {
closeNotification(this, close);
var dialog = dialogDiv(this, template, options && options.bottom);
var closed = false, doneTimer;
var duration = options && typeof options.duration !== "undefined" ? options.duration : 5000;
function close() {
if (closed) return;
closed = true;
clearTimeout(doneTimer);
CodeMirror.rmClass(dialog.parentNode, 'dialog-opened');
dialog.parentNode.removeChild(dialog);
}
CodeMirror.on(dialog, 'click', function(e) {
CodeMirror.e_preventDefault(e);
close();
});
if (duration)
doneTimer = setTimeout(close, duration);
return close;
});
});

View File

@ -0,0 +1,160 @@
// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/5/LICENSE
(function(mod) {
if (typeof exports == "object" && typeof module == "object") // CommonJS
mod(require("../../lib/codemirror"));
else if (typeof define == "function" && define.amd) // AMD
define(["../../lib/codemirror"], mod);
else // Plain browser env
mod(CodeMirror);
})(function(CodeMirror) {
var ie_lt8 = /MSIE \d/.test(navigator.userAgent) &&
(document.documentMode == null || document.documentMode < 8);
var Pos = CodeMirror.Pos;
var matching = {"(": ")>", ")": "(<", "[": "]>", "]": "[<", "{": "}>", "}": "{<", "<": ">>", ">": "<<"};
function bracketRegex(config) {
return config && config.bracketRegex || /[(){}[\]]/
}
function findMatchingBracket(cm, where, config) {
var line = cm.getLineHandle(where.line), pos = where.ch - 1;
var afterCursor = config && config.afterCursor
if (afterCursor == null)
afterCursor = /(^| )cm-fat-cursor($| )/.test(cm.getWrapperElement().className)
var re = bracketRegex(config)
// A cursor is defined as between two characters, but in in vim command mode
// (i.e. not insert mode), the cursor is visually represented as a
// highlighted box on top of the 2nd character. Otherwise, we allow matches
// from before or after the cursor.
var match = (!afterCursor && pos >= 0 && re.test(line.text.charAt(pos)) && matching[line.text.charAt(pos)]) ||
re.test(line.text.charAt(pos + 1)) && matching[line.text.charAt(++pos)];
if (!match) return null;
var dir = match.charAt(1) == ">" ? 1 : -1;
if (config && config.strict && (dir > 0) != (pos == where.ch)) return null;
var style = cm.getTokenTypeAt(Pos(where.line, pos + 1));
var found = scanForBracket(cm, Pos(where.line, pos + (dir > 0 ? 1 : 0)), dir, style, config);
if (found == null) return null;
return {from: Pos(where.line, pos), to: found && found.pos,
match: found && found.ch == match.charAt(0), forward: dir > 0};
}
// bracketRegex is used to specify which type of bracket to scan
// should be a regexp, e.g. /[[\]]/
//
// Note: If "where" is on an open bracket, then this bracket is ignored.
//
// Returns false when no bracket was found, null when it reached
// maxScanLines and gave up
function scanForBracket(cm, where, dir, style, config) {
var maxScanLen = (config && config.maxScanLineLength) || 10000;
var maxScanLines = (config && config.maxScanLines) || 1000;
var stack = [];
var re = bracketRegex(config)
var lineEnd = dir > 0 ? Math.min(where.line + maxScanLines, cm.lastLine() + 1)
: Math.max(cm.firstLine() - 1, where.line - maxScanLines);
for (var lineNo = where.line; lineNo != lineEnd; lineNo += dir) {
var line = cm.getLine(lineNo);
if (!line) continue;
var pos = dir > 0 ? 0 : line.length - 1, end = dir > 0 ? line.length : -1;
if (line.length > maxScanLen) continue;
if (lineNo == where.line) pos = where.ch - (dir < 0 ? 1 : 0);
for (; pos != end; pos += dir) {
var ch = line.charAt(pos);
if (re.test(ch) && (style === undefined ||
(cm.getTokenTypeAt(Pos(lineNo, pos + 1)) || "") == (style || ""))) {
var match = matching[ch];
if (match && (match.charAt(1) == ">") == (dir > 0)) stack.push(ch);
else if (!stack.length) return {pos: Pos(lineNo, pos), ch: ch};
else stack.pop();
}
}
}
return lineNo - dir == (dir > 0 ? cm.lastLine() : cm.firstLine()) ? false : null;
}
function matchBrackets(cm, autoclear, config) {
// Disable brace matching in long lines, since it'll cause hugely slow updates
var maxHighlightLen = cm.state.matchBrackets.maxHighlightLineLength || 1000,
highlightNonMatching = config && config.highlightNonMatching;
var marks = [], ranges = cm.listSelections();
for (var i = 0; i < ranges.length; i++) {
var match = ranges[i].empty() && findMatchingBracket(cm, ranges[i].head, config);
if (match && (match.match || highlightNonMatching !== false) && cm.getLine(match.from.line).length <= maxHighlightLen) {
var style = match.match ? "CodeMirror-matchingbracket" : "CodeMirror-nonmatchingbracket";
marks.push(cm.markText(match.from, Pos(match.from.line, match.from.ch + 1), {className: style}));
if (match.to && cm.getLine(match.to.line).length <= maxHighlightLen)
marks.push(cm.markText(match.to, Pos(match.to.line, match.to.ch + 1), {className: style}));
}
}
if (marks.length) {
// Kludge to work around the IE bug from issue #1193, where text
// input stops going to the textarea whenever this fires.
if (ie_lt8 && cm.state.focused) cm.focus();
var clear = function() {
cm.operation(function() {
for (var i = 0; i < marks.length; i++) marks[i].clear();
});
};
if (autoclear) setTimeout(clear, 800);
else return clear;
}
}
function doMatchBrackets(cm) {
cm.operation(function() {
if (cm.state.matchBrackets.currentlyHighlighted) {
cm.state.matchBrackets.currentlyHighlighted();
cm.state.matchBrackets.currentlyHighlighted = null;
}
cm.state.matchBrackets.currentlyHighlighted = matchBrackets(cm, false, cm.state.matchBrackets);
});
}
function clearHighlighted(cm) {
if (cm.state.matchBrackets && cm.state.matchBrackets.currentlyHighlighted) {
cm.state.matchBrackets.currentlyHighlighted();
cm.state.matchBrackets.currentlyHighlighted = null;
}
}
CodeMirror.defineOption("matchBrackets", false, function(cm, val, old) {
if (old && old != CodeMirror.Init) {
cm.off("cursorActivity", doMatchBrackets);
cm.off("focus", doMatchBrackets)
cm.off("blur", clearHighlighted)
clearHighlighted(cm);
}
if (val) {
cm.state.matchBrackets = typeof val == "object" ? val : {};
cm.on("cursorActivity", doMatchBrackets);
cm.on("focus", doMatchBrackets)
cm.on("blur", clearHighlighted)
}
});
CodeMirror.defineExtension("matchBrackets", function() {matchBrackets(this, true);});
CodeMirror.defineExtension("findMatchingBracket", function(pos, config, oldConfig){
// Backwards-compatibility kludge
if (oldConfig || typeof config == "boolean") {
if (!oldConfig) {
config = config ? {strict: true} : null
} else {
oldConfig.strict = config
config = oldConfig
}
}
return findMatchingBracket(this, pos, config)
});
CodeMirror.defineExtension("scanForBracket", function(pos, dir, style, config){
return scanForBracket(this, pos, dir, style, config);
});
});

View File

@ -0,0 +1,119 @@
// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/5/LICENSE
(function(mod) {
if (typeof exports == "object" && typeof module == "object") // CommonJS
mod(require("../../lib/codemirror"));
else if (typeof define == "function" && define.amd) // AMD
define(["../../lib/codemirror"], mod);
else // Plain browser env
mod(CodeMirror);
})(function(CodeMirror) {
"use strict";
function bracketFolding(pairs) {
return function(cm, start) {
var line = start.line, lineText = cm.getLine(line);
function findOpening(pair) {
var tokenType;
for (var at = start.ch, pass = 0;;) {
var found = at <= 0 ? -1 : lineText.lastIndexOf(pair[0], at - 1);
if (found == -1) {
if (pass == 1) break;
pass = 1;
at = lineText.length;
continue;
}
if (pass == 1 && found < start.ch) break;
tokenType = cm.getTokenTypeAt(CodeMirror.Pos(line, found + 1));
if (!/^(comment|string)/.test(tokenType)) return {ch: found + 1, tokenType: tokenType, pair: pair};
at = found - 1;
}
}
function findRange(found) {
var count = 1, lastLine = cm.lastLine(), end, startCh = found.ch, endCh
outer: for (var i = line; i <= lastLine; ++i) {
var text = cm.getLine(i), pos = i == line ? startCh : 0;
for (;;) {
var nextOpen = text.indexOf(found.pair[0], pos), nextClose = text.indexOf(found.pair[1], pos);
if (nextOpen < 0) nextOpen = text.length;
if (nextClose < 0) nextClose = text.length;
pos = Math.min(nextOpen, nextClose);
if (pos == text.length) break;
if (cm.getTokenTypeAt(CodeMirror.Pos(i, pos + 1)) == found.tokenType) {
if (pos == nextOpen) ++count;
else if (!--count) { end = i; endCh = pos; break outer; }
}
++pos;
}
}
if (end == null || line == end) return null
return {from: CodeMirror.Pos(line, startCh),
to: CodeMirror.Pos(end, endCh)};
}
var found = []
for (var i = 0; i < pairs.length; i++) {
var open = findOpening(pairs[i])
if (open) found.push(open)
}
found.sort(function(a, b) { return a.ch - b.ch })
for (var i = 0; i < found.length; i++) {
var range = findRange(found[i])
if (range) return range
}
return null
}
}
CodeMirror.registerHelper("fold", "brace", bracketFolding([["{", "}"], ["[", "]"]]));
CodeMirror.registerHelper("fold", "brace-paren", bracketFolding([["{", "}"], ["[", "]"], ["(", ")"]]));
CodeMirror.registerHelper("fold", "import", function(cm, start) {
function hasImport(line) {
if (line < cm.firstLine() || line > cm.lastLine()) return null;
var start = cm.getTokenAt(CodeMirror.Pos(line, 1));
if (!/\S/.test(start.string)) start = cm.getTokenAt(CodeMirror.Pos(line, start.end + 1));
if (start.type != "keyword" || start.string != "import") return null;
// Now find closing semicolon, return its position
for (var i = line, e = Math.min(cm.lastLine(), line + 10); i <= e; ++i) {
var text = cm.getLine(i), semi = text.indexOf(";");
if (semi != -1) return {startCh: start.end, end: CodeMirror.Pos(i, semi)};
}
}
var startLine = start.line, has = hasImport(startLine), prev;
if (!has || hasImport(startLine - 1) || ((prev = hasImport(startLine - 2)) && prev.end.line == startLine - 1))
return null;
for (var end = has.end;;) {
var next = hasImport(end.line + 1);
if (next == null) break;
end = next.end;
}
return {from: cm.clipPos(CodeMirror.Pos(startLine, has.startCh + 1)), to: end};
});
CodeMirror.registerHelper("fold", "include", function(cm, start) {
function hasInclude(line) {
if (line < cm.firstLine() || line > cm.lastLine()) return null;
var start = cm.getTokenAt(CodeMirror.Pos(line, 1));
if (!/\S/.test(start.string)) start = cm.getTokenAt(CodeMirror.Pos(line, start.end + 1));
if (start.type == "meta" && start.string.slice(0, 8) == "#include") return start.start + 8;
}
var startLine = start.line, has = hasInclude(startLine);
if (has == null || hasInclude(startLine - 1) != null) return null;
for (var end = startLine;;) {
var next = hasInclude(end + 1);
if (next == null) break;
++end;
}
return {from: CodeMirror.Pos(startLine, has + 1),
to: cm.clipPos(CodeMirror.Pos(end))};
});
});

View File

@ -0,0 +1,59 @@
// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/5/LICENSE
(function(mod) {
if (typeof exports == "object" && typeof module == "object") // CommonJS
mod(require("../../lib/codemirror"));
else if (typeof define == "function" && define.amd) // AMD
define(["../../lib/codemirror"], mod);
else // Plain browser env
mod(CodeMirror);
})(function(CodeMirror) {
"use strict";
CodeMirror.registerGlobalHelper("fold", "comment", function(mode) {
return mode.blockCommentStart && mode.blockCommentEnd;
}, function(cm, start) {
var mode = cm.getModeAt(start), startToken = mode.blockCommentStart, endToken = mode.blockCommentEnd;
if (!startToken || !endToken) return;
var line = start.line, lineText = cm.getLine(line);
var startCh;
for (var at = start.ch, pass = 0;;) {
var found = at <= 0 ? -1 : lineText.lastIndexOf(startToken, at - 1);
if (found == -1) {
if (pass == 1) return;
pass = 1;
at = lineText.length;
continue;
}
if (pass == 1 && found < start.ch) return;
if (/comment/.test(cm.getTokenTypeAt(CodeMirror.Pos(line, found + 1))) &&
(found == 0 || lineText.slice(found - endToken.length, found) == endToken ||
!/comment/.test(cm.getTokenTypeAt(CodeMirror.Pos(line, found))))) {
startCh = found + startToken.length;
break;
}
at = found - 1;
}
var depth = 1, lastLine = cm.lastLine(), end, endCh;
outer: for (var i = line; i <= lastLine; ++i) {
var text = cm.getLine(i), pos = i == line ? startCh : 0;
for (;;) {
var nextOpen = text.indexOf(startToken, pos), nextClose = text.indexOf(endToken, pos);
if (nextOpen < 0) nextOpen = text.length;
if (nextClose < 0) nextClose = text.length;
pos = Math.min(nextOpen, nextClose);
if (pos == text.length) break;
if (pos == nextOpen) ++depth;
else if (!--depth) { end = i; endCh = pos; break outer; }
++pos;
}
}
if (end == null || line == end && endCh == startCh) return;
return {from: CodeMirror.Pos(line, startCh),
to: CodeMirror.Pos(end, endCh)};
});
});

159
public/codemirror/addon/fold/foldcode.js vendored Normal file
View File

@ -0,0 +1,159 @@
// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/5/LICENSE
(function(mod) {
if (typeof exports == "object" && typeof module == "object") // CommonJS
mod(require("../../lib/codemirror"));
else if (typeof define == "function" && define.amd) // AMD
define(["../../lib/codemirror"], mod);
else // Plain browser env
mod(CodeMirror);
})(function(CodeMirror) {
"use strict";
function doFold(cm, pos, options, force) {
if (options && options.call) {
var finder = options;
options = null;
} else {
var finder = getOption(cm, options, "rangeFinder");
}
if (typeof pos == "number") pos = CodeMirror.Pos(pos, 0);
var minSize = getOption(cm, options, "minFoldSize");
function getRange(allowFolded) {
var range = finder(cm, pos);
if (!range || range.to.line - range.from.line < minSize) return null;
if (force === "fold") return range;
var marks = cm.findMarksAt(range.from);
for (var i = 0; i < marks.length; ++i) {
if (marks[i].__isFold) {
if (!allowFolded) return null;
range.cleared = true;
marks[i].clear();
}
}
return range;
}
var range = getRange(true);
if (getOption(cm, options, "scanUp")) while (!range && pos.line > cm.firstLine()) {
pos = CodeMirror.Pos(pos.line - 1, 0);
range = getRange(false);
}
if (!range || range.cleared || force === "unfold") return;
var myWidget = makeWidget(cm, options, range);
CodeMirror.on(myWidget, "mousedown", function(e) {
myRange.clear();
CodeMirror.e_preventDefault(e);
});
var myRange = cm.markText(range.from, range.to, {
replacedWith: myWidget,
clearOnEnter: getOption(cm, options, "clearOnEnter"),
__isFold: true
});
myRange.on("clear", function(from, to) {
CodeMirror.signal(cm, "unfold", cm, from, to);
});
CodeMirror.signal(cm, "fold", cm, range.from, range.to);
}
function makeWidget(cm, options, range) {
var widget = getOption(cm, options, "widget");
if (typeof widget == "function") {
widget = widget(range.from, range.to);
}
if (typeof widget == "string") {
var text = document.createTextNode(widget);
widget = document.createElement("span");
widget.appendChild(text);
widget.className = "CodeMirror-foldmarker";
} else if (widget) {
widget = widget.cloneNode(true)
}
return widget;
}
// Clumsy backwards-compatible interface
CodeMirror.newFoldFunction = function(rangeFinder, widget) {
return function(cm, pos) { doFold(cm, pos, {rangeFinder: rangeFinder, widget: widget}); };
};
// New-style interface
CodeMirror.defineExtension("foldCode", function(pos, options, force) {
doFold(this, pos, options, force);
});
CodeMirror.defineExtension("isFolded", function(pos) {
var marks = this.findMarksAt(pos);
for (var i = 0; i < marks.length; ++i)
if (marks[i].__isFold) return true;
});
CodeMirror.commands.toggleFold = function(cm) {
cm.foldCode(cm.getCursor());
};
CodeMirror.commands.fold = function(cm) {
cm.foldCode(cm.getCursor(), null, "fold");
};
CodeMirror.commands.unfold = function(cm) {
cm.foldCode(cm.getCursor(), { scanUp: false }, "unfold");
};
CodeMirror.commands.foldAll = function(cm) {
cm.operation(function() {
for (var i = cm.firstLine(), e = cm.lastLine(); i <= e; i++)
cm.foldCode(CodeMirror.Pos(i, 0), { scanUp: false }, "fold");
});
};
CodeMirror.commands.unfoldAll = function(cm) {
cm.operation(function() {
for (var i = cm.firstLine(), e = cm.lastLine(); i <= e; i++)
cm.foldCode(CodeMirror.Pos(i, 0), { scanUp: false }, "unfold");
});
};
CodeMirror.registerHelper("fold", "combine", function() {
var funcs = Array.prototype.slice.call(arguments, 0);
return function(cm, start) {
for (var i = 0; i < funcs.length; ++i) {
var found = funcs[i](cm, start);
if (found) return found;
}
};
});
CodeMirror.registerHelper("fold", "auto", function(cm, start) {
var helpers = cm.getHelpers(start, "fold");
for (var i = 0; i < helpers.length; i++) {
var cur = helpers[i](cm, start);
if (cur) return cur;
}
});
var defaultOptions = {
rangeFinder: CodeMirror.fold.auto,
widget: "\u2194",
minFoldSize: 0,
scanUp: false,
clearOnEnter: true
};
CodeMirror.defineOption("foldOptions", null);
function getOption(cm, options, name) {
if (options && options[name] !== undefined)
return options[name];
var editorOptions = cm.options.foldOptions;
if (editorOptions && editorOptions[name] !== undefined)
return editorOptions[name];
return defaultOptions[name];
}
CodeMirror.defineExtension("foldOption", function(options, name) {
return getOption(this, options, name);
});
});

View File

@ -0,0 +1,20 @@
.CodeMirror-foldmarker {
color: blue;
text-shadow: #b9f 1px 1px 2px, #b9f -1px -1px 2px, #b9f 1px -1px 2px, #b9f -1px 1px 2px;
font-family: arial;
line-height: .3;
cursor: pointer;
}
.CodeMirror-foldgutter {
width: .7em;
}
.CodeMirror-foldgutter-open,
.CodeMirror-foldgutter-folded {
cursor: pointer;
}
.CodeMirror-foldgutter-open:after {
content: "\25BE";
}
.CodeMirror-foldgutter-folded:after {
content: "\25B8";
}

View File

@ -0,0 +1,169 @@
// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/5/LICENSE
(function(mod) {
if (typeof exports == "object" && typeof module == "object") // CommonJS
mod(require("../../lib/codemirror"), require("./foldcode"));
else if (typeof define == "function" && define.amd) // AMD
define(["../../lib/codemirror", "./foldcode"], mod);
else // Plain browser env
mod(CodeMirror);
})(function(CodeMirror) {
"use strict";
CodeMirror.defineOption("foldGutter", false, function(cm, val, old) {
if (old && old != CodeMirror.Init) {
cm.clearGutter(cm.state.foldGutter.options.gutter);
cm.state.foldGutter = null;
cm.off("gutterClick", onGutterClick);
cm.off("changes", onChange);
cm.off("viewportChange", onViewportChange);
cm.off("fold", onFold);
cm.off("unfold", onFold);
cm.off("swapDoc", onChange);
cm.off("optionChange", optionChange);
}
if (val) {
cm.state.foldGutter = new State(parseOptions(val));
updateInViewport(cm);
cm.on("gutterClick", onGutterClick);
cm.on("changes", onChange);
cm.on("viewportChange", onViewportChange);
cm.on("fold", onFold);
cm.on("unfold", onFold);
cm.on("swapDoc", onChange);
cm.on("optionChange", optionChange);
}
});
var Pos = CodeMirror.Pos;
function State(options) {
this.options = options;
this.from = this.to = 0;
}
function parseOptions(opts) {
if (opts === true) opts = {};
if (opts.gutter == null) opts.gutter = "CodeMirror-foldgutter";
if (opts.indicatorOpen == null) opts.indicatorOpen = "CodeMirror-foldgutter-open";
if (opts.indicatorFolded == null) opts.indicatorFolded = "CodeMirror-foldgutter-folded";
return opts;
}
function isFolded(cm, line) {
var marks = cm.findMarks(Pos(line, 0), Pos(line + 1, 0));
for (var i = 0; i < marks.length; ++i) {
if (marks[i].__isFold) {
var fromPos = marks[i].find(-1);
if (fromPos && fromPos.line === line)
return marks[i];
}
}
}
function marker(spec) {
if (typeof spec == "string") {
var elt = document.createElement("div");
elt.className = spec + " CodeMirror-guttermarker-subtle";
return elt;
} else {
return spec.cloneNode(true);
}
}
function updateFoldInfo(cm, from, to) {
var opts = cm.state.foldGutter.options, cur = from - 1;
var minSize = cm.foldOption(opts, "minFoldSize");
var func = cm.foldOption(opts, "rangeFinder");
// we can reuse the built-in indicator element if its className matches the new state
var clsFolded = typeof opts.indicatorFolded == "string" && classTest(opts.indicatorFolded);
var clsOpen = typeof opts.indicatorOpen == "string" && classTest(opts.indicatorOpen);
cm.eachLine(from, to, function(line) {
++cur;
var mark = null;
var old = line.gutterMarkers;
if (old) old = old[opts.gutter];
if (isFolded(cm, cur)) {
if (clsFolded && old && clsFolded.test(old.className)) return;
mark = marker(opts.indicatorFolded);
} else {
var pos = Pos(cur, 0);
var range = func && func(cm, pos);
if (range && range.to.line - range.from.line >= minSize) {
if (clsOpen && old && clsOpen.test(old.className)) return;
mark = marker(opts.indicatorOpen);
}
}
if (!mark && !old) return;
cm.setGutterMarker(line, opts.gutter, mark);
});
}
// copied from CodeMirror/src/util/dom.js
function classTest(cls) { return new RegExp("(^|\\s)" + cls + "(?:$|\\s)\\s*") }
function updateInViewport(cm) {
var vp = cm.getViewport(), state = cm.state.foldGutter;
if (!state) return;
cm.operation(function() {
updateFoldInfo(cm, vp.from, vp.to);
});
state.from = vp.from; state.to = vp.to;
}
function onGutterClick(cm, line, gutter) {
var state = cm.state.foldGutter;
if (!state) return;
var opts = state.options;
if (gutter != opts.gutter) return;
var folded = isFolded(cm, line);
if (folded) folded.clear();
else cm.foldCode(Pos(line, 0), opts);
}
function optionChange(cm, option) {
if (option == "mode") onChange(cm)
}
function onChange(cm) {
var state = cm.state.foldGutter;
if (!state) return;
var opts = state.options;
state.from = state.to = 0;
clearTimeout(state.changeUpdate);
state.changeUpdate = setTimeout(function() { updateInViewport(cm); }, opts.foldOnChangeTimeSpan || 600);
}
function onViewportChange(cm) {
var state = cm.state.foldGutter;
if (!state) return;
var opts = state.options;
clearTimeout(state.changeUpdate);
state.changeUpdate = setTimeout(function() {
var vp = cm.getViewport();
if (state.from == state.to || vp.from - state.to > 20 || state.from - vp.to > 20) {
updateInViewport(cm);
} else {
cm.operation(function() {
if (vp.from < state.from) {
updateFoldInfo(cm, vp.from, state.from);
state.from = vp.from;
}
if (vp.to > state.to) {
updateFoldInfo(cm, state.to, vp.to);
state.to = vp.to;
}
});
}
}, opts.updateViewportTimeSpan || 400);
}
function onFold(cm, from) {
var state = cm.state.foldGutter;
if (!state) return;
var line = from.line;
if (line >= state.from && line < state.to)
updateFoldInfo(cm, line, line + 1);
}
});

View File

@ -0,0 +1,48 @@
// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/5/LICENSE
(function(mod) {
if (typeof exports == "object" && typeof module == "object") // CommonJS
mod(require("../../lib/codemirror"));
else if (typeof define == "function" && define.amd) // AMD
define(["../../lib/codemirror"], mod);
else // Plain browser env
mod(CodeMirror);
})(function(CodeMirror) {
"use strict";
function lineIndent(cm, lineNo) {
var text = cm.getLine(lineNo)
var spaceTo = text.search(/\S/)
if (spaceTo == -1 || /\bcomment\b/.test(cm.getTokenTypeAt(CodeMirror.Pos(lineNo, spaceTo + 1))))
return -1
return CodeMirror.countColumn(text, null, cm.getOption("tabSize"))
}
CodeMirror.registerHelper("fold", "indent", function(cm, start) {
var myIndent = lineIndent(cm, start.line)
if (myIndent < 0) return
var lastLineInFold = null
// Go through lines until we find a line that definitely doesn't belong in
// the block we're folding, or to the end.
for (var i = start.line + 1, end = cm.lastLine(); i <= end; ++i) {
var indent = lineIndent(cm, i)
if (indent == -1) {
} else if (indent > myIndent) {
// Lines with a greater indent are considered part of the block.
lastLineInFold = i;
} else {
// If this line has non-space, non-comment content, and is
// indented less or equal to the start line, it is the start of
// another block.
break;
}
}
if (lastLineInFold) return {
from: CodeMirror.Pos(start.line, cm.getLine(start.line).length),
to: CodeMirror.Pos(lastLineInFold, cm.getLine(lastLineInFold).length)
};
});
});

View File

@ -0,0 +1,72 @@
// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/5/LICENSE
(function(mod) {
if (typeof exports == "object" && typeof module == "object") // CommonJS
mod(require("../../lib/codemirror"));
else if (typeof define == "function" && define.amd) // AMD
define(["../../lib/codemirror"], mod);
else // Plain browser env
mod(CodeMirror);
})(function(CodeMirror) {
"use strict";
var WRAP_CLASS = "CodeMirror-activeline";
var BACK_CLASS = "CodeMirror-activeline-background";
var GUTT_CLASS = "CodeMirror-activeline-gutter";
CodeMirror.defineOption("styleActiveLine", false, function(cm, val, old) {
var prev = old == CodeMirror.Init ? false : old;
if (val == prev) return
if (prev) {
cm.off("beforeSelectionChange", selectionChange);
clearActiveLines(cm);
delete cm.state.activeLines;
}
if (val) {
cm.state.activeLines = [];
updateActiveLines(cm, cm.listSelections());
cm.on("beforeSelectionChange", selectionChange);
}
});
function clearActiveLines(cm) {
for (var i = 0; i < cm.state.activeLines.length; i++) {
cm.removeLineClass(cm.state.activeLines[i], "wrap", WRAP_CLASS);
cm.removeLineClass(cm.state.activeLines[i], "background", BACK_CLASS);
cm.removeLineClass(cm.state.activeLines[i], "gutter", GUTT_CLASS);
}
}
function sameArray(a, b) {
if (a.length != b.length) return false;
for (var i = 0; i < a.length; i++)
if (a[i] != b[i]) return false;
return true;
}
function updateActiveLines(cm, ranges) {
var active = [];
for (var i = 0; i < ranges.length; i++) {
var range = ranges[i];
var option = cm.getOption("styleActiveLine");
if (typeof option == "object" && option.nonEmpty ? range.anchor.line != range.head.line : !range.empty())
continue
var line = cm.getLineHandleVisualStart(range.head.line);
if (active[active.length - 1] != line) active.push(line);
}
if (sameArray(cm.state.activeLines, active)) return;
cm.operation(function() {
clearActiveLines(cm);
for (var i = 0; i < active.length; i++) {
cm.addLineClass(active[i], "wrap", WRAP_CLASS);
cm.addLineClass(active[i], "background", BACK_CLASS);
cm.addLineClass(active[i], "gutter", GUTT_CLASS);
}
cm.state.activeLines = active;
});
}
function selectionChange(cm, sel) {
updateActiveLines(cm, sel.ranges);
}
});

View File

@ -0,0 +1,98 @@
// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/5/LICENSE
(function(mod) {
if (typeof exports == "object" && typeof module == "object") // CommonJS
mod(require("../../lib/codemirror"));
else if (typeof define == "function" && define.amd) // AMD
define(["../../lib/codemirror"], mod);
else // Plain browser env
mod(CodeMirror);
})(function(CodeMirror) {
"use strict";
CodeMirror.defineOption("selectionPointer", false, function(cm, val) {
var data = cm.state.selectionPointer;
if (data) {
CodeMirror.off(cm.getWrapperElement(), "mousemove", data.mousemove);
CodeMirror.off(cm.getWrapperElement(), "mouseout", data.mouseout);
CodeMirror.off(window, "scroll", data.windowScroll);
cm.off("cursorActivity", reset);
cm.off("scroll", reset);
cm.state.selectionPointer = null;
cm.display.lineDiv.style.cursor = "";
}
if (val) {
data = cm.state.selectionPointer = {
value: typeof val == "string" ? val : "default",
mousemove: function(event) { mousemove(cm, event); },
mouseout: function(event) { mouseout(cm, event); },
windowScroll: function() { reset(cm); },
rects: null,
mouseX: null, mouseY: null,
willUpdate: false
};
CodeMirror.on(cm.getWrapperElement(), "mousemove", data.mousemove);
CodeMirror.on(cm.getWrapperElement(), "mouseout", data.mouseout);
CodeMirror.on(window, "scroll", data.windowScroll);
cm.on("cursorActivity", reset);
cm.on("scroll", reset);
}
});
function mousemove(cm, event) {
var data = cm.state.selectionPointer;
if (event.buttons == null ? event.which : event.buttons) {
data.mouseX = data.mouseY = null;
} else {
data.mouseX = event.clientX;
data.mouseY = event.clientY;
}
scheduleUpdate(cm);
}
function mouseout(cm, event) {
if (!cm.getWrapperElement().contains(event.relatedTarget)) {
var data = cm.state.selectionPointer;
data.mouseX = data.mouseY = null;
scheduleUpdate(cm);
}
}
function reset(cm) {
cm.state.selectionPointer.rects = null;
scheduleUpdate(cm);
}
function scheduleUpdate(cm) {
if (!cm.state.selectionPointer.willUpdate) {
cm.state.selectionPointer.willUpdate = true;
setTimeout(function() {
update(cm);
cm.state.selectionPointer.willUpdate = false;
}, 50);
}
}
function update(cm) {
var data = cm.state.selectionPointer;
if (!data) return;
if (data.rects == null && data.mouseX != null) {
data.rects = [];
if (cm.somethingSelected()) {
for (var sel = cm.display.selectionDiv.firstChild; sel; sel = sel.nextSibling)
data.rects.push(sel.getBoundingClientRect());
}
}
var inside = false;
if (data.mouseX != null) for (var i = 0; i < data.rects.length; i++) {
var rect = data.rects[i];
if (rect.left <= data.mouseX && rect.right >= data.mouseX &&
rect.top <= data.mouseY && rect.bottom >= data.mouseY)
inside = true;
}
var cursor = inside ? data.value : "";
if (cm.display.lineDiv.style.cursor != cursor)
cm.display.lineDiv.style.cursor = cursor;
}
});

344
public/codemirror/lib/codemirror.css vendored Normal file
View File

@ -0,0 +1,344 @@
/* BASICS */
.CodeMirror {
/* Set height, width, borders, and global font properties here */
font-family: monospace;
height: 300px;
color: black;
direction: ltr;
}
/* PADDING */
.CodeMirror-lines {
padding: 4px 0; /* Vertical padding around content */
}
.CodeMirror pre.CodeMirror-line,
.CodeMirror pre.CodeMirror-line-like {
padding: 0 4px; /* Horizontal padding of content */
}
.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
background-color: white; /* The little square between H and V scrollbars */
}
/* GUTTER */
.CodeMirror-gutters {
border-right: 1px solid #ddd;
background-color: #f7f7f7;
white-space: nowrap;
}
.CodeMirror-linenumbers {}
.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; }
/* CURSOR */
.CodeMirror-cursor {
border-left: 1px solid black;
border-right: none;
width: 0;
}
/* Shown when moving in bi-directional text */
.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-fat-cursor .CodeMirror-line::selection,
.cm-fat-cursor .CodeMirror-line > span::selection,
.cm-fat-cursor .CodeMirror-line > span > span::selection { background: transparent; }
.cm-fat-cursor .CodeMirror-line::-moz-selection,
.cm-fat-cursor .CodeMirror-line > span::-moz-selection,
.cm-fat-cursor .CodeMirror-line > span > span::-moz-selection { background: transparent; }
.cm-fat-cursor { caret-color: transparent; }
@-moz-keyframes blink {
0% {}
50% { background-color: transparent; }
100% {}
}
@-webkit-keyframes blink {
0% {}
50% { background-color: transparent; }
100% {}
}
@keyframes blink {
0% {}
50% { background-color: transparent; }
100% {}
}
/* Can style cursor different in overwrite (non-insert) mode */
.CodeMirror-overwrite .CodeMirror-cursor {}
.cm-tab { display: inline-block; text-decoration: inherit; }
.CodeMirror-rulers {
position: absolute;
left: 0; right: 0; top: -50px; bottom: 0;
overflow: hidden;
}
.CodeMirror-ruler {
border-left: 1px solid #ccc;
top: 0; bottom: 0;
position: absolute;
}
/* DEFAULT THEME */
.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,
.cm-s-default .cm-punctuation,
.cm-s-default .cm-property,
.cm-s-default .cm-operator {}
.cm-s-default .cm-variable-2 {color: #05a;}
.cm-s-default .cm-variable-3, .cm-s-default .cm-type {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; }
/* Default styles for common addons */
div.CodeMirror span.CodeMirror-matchingbracket {color: #0b0;}
div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #a22;}
.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); }
.CodeMirror-activeline-background {background: #e8f2ff;}
/* STOP */
/* The rest of this file contains styles related to the mechanics of
the editor. You probably shouldn't touch them. */
.CodeMirror {
position: relative;
overflow: hidden;
background: white;
}
.CodeMirror-scroll {
overflow: scroll !important; /* Things will break if this is overridden */
/* 50px is the magic margin used to hide the element's real scrollbars */
/* See overflow: hidden in .CodeMirror */
margin-bottom: -50px; margin-right: -50px;
padding-bottom: 50px;
height: 100%;
outline: none; /* Prevent dragging from highlighting the element */
position: relative;
z-index: 0;
}
.CodeMirror-sizer {
position: relative;
border-right: 50px solid transparent;
}
/* The fake, visible scrollbars. Used to force redraw during scrolling
before actual scrolling happens, thus preventing shaking and
flickering artifacts. */
.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
position: absolute;
z-index: 6;
display: none;
outline: 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: -50px;
}
.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 ::selection { background-color: transparent }
.CodeMirror-gutter-wrapper ::-moz-selection { background-color: transparent }
.CodeMirror-lines {
cursor: text;
min-height: 1px; /* prevents collapsing before first draw */
}
.CodeMirror pre.CodeMirror-line,
.CodeMirror pre.CodeMirror-line-like {
/* Reset some styles that the rest of the page might have set */
-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: contextual;
font-variant-ligatures: contextual;
}
.CodeMirror-wrap pre.CodeMirror-line,
.CodeMirror-wrap pre.CodeMirror-line-like {
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;
padding: 0.1px; /* Force widget margins to stay inside of the container */
}
.CodeMirror-widget {}
.CodeMirror-rtl pre { direction: rtl; }
.CodeMirror-code {
outline: none;
}
/* Force content-box sizing for the elements where we expect it */
.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-color: #ffa;
background-color: rgba(255, 255, 0, .4);
}
/* Used to force a border model for a node */
.cm-force-border { padding-right: .1px; }
@media print {
/* Hide the cursor when printing */
.CodeMirror div.CodeMirror-cursors {
visibility: hidden;
}
}
/* See issue #2901 */
.cm-tab-wrap-hack:after { content: ''; }
/* Help users use markselection to safely style text background */
span.CodeMirror-selectedtext { background: none; }

9872
public/codemirror/lib/codemirror.js vendored Normal file

File diff suppressed because it is too large Load Diff

940
public/codemirror/mode/clike/clike.js vendored Normal file
View File

@ -0,0 +1,940 @@
// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/5/LICENSE
(function(mod) {
if (typeof exports == "object" && typeof module == "object") // CommonJS
mod(require("../../lib/codemirror"));
else if (typeof define == "function" && define.amd) // AMD
define(["../../lib/codemirror"], mod);
else // Plain browser env
mod(CodeMirror);
})(function(CodeMirror) {
"use strict";
function Context(indented, column, type, info, align, prev) {
this.indented = indented;
this.column = column;
this.type = type;
this.info = info;
this.align = align;
this.prev = prev;
}
function pushContext(state, col, type, info) {
var indent = state.indented;
if (state.context && state.context.type == "statement" && type != "statement")
indent = state.context.indented;
return state.context = new Context(indent, col, type, info, null, state.context);
}
function popContext(state) {
var t = state.context.type;
if (t == ")" || t == "]" || t == "}")
state.indented = state.context.indented;
return state.context = state.context.prev;
}
function typeBefore(stream, state, pos) {
if (state.prevToken == "variable" || state.prevToken == "type") return true;
if (/\S(?:[^- ]>|[*\]])\s*$|\*$/.test(stream.string.slice(0, pos))) return true;
if (state.typeAtEndOfLine && stream.column() == stream.indentation()) return true;
}
function isTopScope(context) {
for (;;) {
if (!context || context.type == "top") return true;
if (context.type == "}" && context.prev.info != "namespace") return false;
context = context.prev;
}
}
CodeMirror.defineMode("clike", function(config, parserConfig) {
var indentUnit = config.indentUnit,
statementIndentUnit = parserConfig.statementIndentUnit || indentUnit,
dontAlignCalls = parserConfig.dontAlignCalls,
keywords = parserConfig.keywords || {},
types = parserConfig.types || {},
builtin = parserConfig.builtin || {},
blockKeywords = parserConfig.blockKeywords || {},
defKeywords = parserConfig.defKeywords || {},
atoms = parserConfig.atoms || {},
hooks = parserConfig.hooks || {},
multiLineStrings = parserConfig.multiLineStrings,
indentStatements = parserConfig.indentStatements !== false,
indentSwitch = parserConfig.indentSwitch !== false,
namespaceSeparator = parserConfig.namespaceSeparator,
isPunctuationChar = parserConfig.isPunctuationChar || /[\[\]{}\(\),;\:\.]/,
numberStart = parserConfig.numberStart || /[\d\.]/,
number = parserConfig.number || /^(?:0x[a-f\d]+|0b[01]+|(?:\d+\.?\d*|\.\d+)(?:e[-+]?\d+)?)(u|ll?|l|f)?/i,
isOperatorChar = parserConfig.isOperatorChar || /[+\-*&%=<>!?|\/]/,
isIdentifierChar = parserConfig.isIdentifierChar || /[\w\$_\xa1-\uffff]/,
// An optional function that takes a {string} token and returns true if it
// should be treated as a builtin.
isReservedIdentifier = parserConfig.isReservedIdentifier || false;
var curPunc, isDefKeyword;
function tokenBase(stream, state) {
var ch = stream.next();
if (hooks[ch]) {
var result = hooks[ch](stream, state);
if (result !== false) return result;
}
if (ch == '"' || ch == "'") {
state.tokenize = tokenString(ch);
return state.tokenize(stream, state);
}
if (numberStart.test(ch)) {
stream.backUp(1)
if (stream.match(number)) return "number"
stream.next()
}
if (isPunctuationChar.test(ch)) {
curPunc = ch;
return null;
}
if (ch == "/") {
if (stream.eat("*")) {
state.tokenize = tokenComment;
return tokenComment(stream, state);
}
if (stream.eat("/")) {
stream.skipToEnd();
return "comment";
}
}
if (isOperatorChar.test(ch)) {
while (!stream.match(/^\/[\/*]/, false) && stream.eat(isOperatorChar)) {}
return "operator";
}
stream.eatWhile(isIdentifierChar);
if (namespaceSeparator) while (stream.match(namespaceSeparator))
stream.eatWhile(isIdentifierChar);
var cur = stream.current();
if (contains(keywords, cur)) {
if (contains(blockKeywords, cur)) curPunc = "newstatement";
if (contains(defKeywords, cur)) isDefKeyword = true;
return "keyword";
}
if (contains(types, cur)) return "type";
if (contains(builtin, cur)
|| (isReservedIdentifier && isReservedIdentifier(cur))) {
if (contains(blockKeywords, cur)) curPunc = "newstatement";
return "builtin";
}
if (contains(atoms, cur)) return "atom";
return "variable";
}
function tokenString(quote) {
return function(stream, state) {
var escaped = false, next, end = false;
while ((next = stream.next()) != null) {
if (next == quote && !escaped) {end = true; break;}
escaped = !escaped && next == "\\";
}
if (end || !(escaped || multiLineStrings))
state.tokenize = null;
return "string";
};
}
function tokenComment(stream, state) {
var maybeEnd = false, ch;
while (ch = stream.next()) {
if (ch == "/" && maybeEnd) {
state.tokenize = null;
break;
}
maybeEnd = (ch == "*");
}
return "comment";
}
function maybeEOL(stream, state) {
if (parserConfig.typeFirstDefinitions && stream.eol() && isTopScope(state.context))
state.typeAtEndOfLine = typeBefore(stream, state, stream.pos)
}
// Interface
return {
startState: function(basecolumn) {
return {
tokenize: null,
context: new Context((basecolumn || 0) - indentUnit, 0, "top", null, false),
indented: 0,
startOfLine: true,
prevToken: null
};
},
token: function(stream, state) {
var ctx = state.context;
if (stream.sol()) {
if (ctx.align == null) ctx.align = false;
state.indented = stream.indentation();
state.startOfLine = true;
}
if (stream.eatSpace()) { maybeEOL(stream, state); return null; }
curPunc = isDefKeyword = null;
var style = (state.tokenize || tokenBase)(stream, state);
if (style == "comment" || style == "meta") return style;
if (ctx.align == null) ctx.align = true;
if (curPunc == ";" || curPunc == ":" || (curPunc == "," && stream.match(/^\s*(?:\/\/.*)?$/, false)))
while (state.context.type == "statement") popContext(state);
else if (curPunc == "{") pushContext(state, stream.column(), "}");
else if (curPunc == "[") pushContext(state, stream.column(), "]");
else if (curPunc == "(") pushContext(state, stream.column(), ")");
else if (curPunc == "}") {
while (ctx.type == "statement") ctx = popContext(state);
if (ctx.type == "}") ctx = popContext(state);
while (ctx.type == "statement") ctx = popContext(state);
}
else if (curPunc == ctx.type) popContext(state);
else if (indentStatements &&
(((ctx.type == "}" || ctx.type == "top") && curPunc != ";") ||
(ctx.type == "statement" && curPunc == "newstatement"))) {
pushContext(state, stream.column(), "statement", stream.current());
}
if (style == "variable" &&
((state.prevToken == "def" ||
(parserConfig.typeFirstDefinitions && typeBefore(stream, state, stream.start) &&
isTopScope(state.context) && stream.match(/^\s*\(/, false)))))
style = "def";
if (hooks.token) {
var result = hooks.token(stream, state, style);
if (result !== undefined) style = result;
}
if (style == "def" && parserConfig.styleDefs === false) style = "variable";
state.startOfLine = false;
state.prevToken = isDefKeyword ? "def" : style || curPunc;
maybeEOL(stream, state);
return style;
},
indent: function(state, textAfter) {
if (state.tokenize != tokenBase && state.tokenize != null || state.typeAtEndOfLine) return CodeMirror.Pass;
var ctx = state.context, firstChar = textAfter && textAfter.charAt(0);
var closing = firstChar == ctx.type;
if (ctx.type == "statement" && firstChar == "}") ctx = ctx.prev;
if (parserConfig.dontIndentStatements)
while (ctx.type == "statement" && parserConfig.dontIndentStatements.test(ctx.info))
ctx = ctx.prev
if (hooks.indent) {
var hook = hooks.indent(state, ctx, textAfter, indentUnit);
if (typeof hook == "number") return hook
}
var switchBlock = ctx.prev && ctx.prev.info == "switch";
if (parserConfig.allmanIndentation && /[{(]/.test(firstChar)) {
while (ctx.type != "top" && ctx.type != "}") ctx = ctx.prev
return ctx.indented
}
if (ctx.type == "statement")
return ctx.indented + (firstChar == "{" ? 0 : statementIndentUnit);
if (ctx.align && (!dontAlignCalls || ctx.type != ")"))
return ctx.column + (closing ? 0 : 1);
if (ctx.type == ")" && !closing)
return ctx.indented + statementIndentUnit;
return ctx.indented + (closing ? 0 : indentUnit) +
(!closing && switchBlock && !/^(?:case|default)\b/.test(textAfter) ? indentUnit : 0);
},
electricInput: indentSwitch ? /^\s*(?:case .*?:|default:|\{\}?|\})$/ : /^\s*[{}]$/,
blockCommentStart: "/*",
blockCommentEnd: "*/",
blockCommentContinue: " * ",
lineComment: "//",
fold: "brace"
};
});
function words(str) {
var obj = {}, words = str.split(" ");
for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
return obj;
}
function contains(words, word) {
if (typeof words === "function") {
return words(word);
} else {
return words.propertyIsEnumerable(word);
}
}
var cKeywords = "auto if break case register continue return default do sizeof " +
"static else struct switch extern typedef union for goto while enum const " +
"volatile inline restrict asm fortran";
// Keywords from https://en.cppreference.com/w/cpp/keyword includes C++20.
var cppKeywords = "alignas alignof and and_eq audit axiom bitand bitor catch " +
"class compl concept constexpr const_cast decltype delete dynamic_cast " +
"explicit export final friend import module mutable namespace new noexcept " +
"not not_eq operator or or_eq override private protected public " +
"reinterpret_cast requires static_assert static_cast template this " +
"thread_local throw try typeid typename using virtual xor xor_eq";
var objCKeywords = "bycopy byref in inout oneway out self super atomic nonatomic retain copy " +
"readwrite readonly strong weak assign typeof nullable nonnull null_resettable _cmd " +
"@interface @implementation @end @protocol @encode @property @synthesize @dynamic @class " +
"@public @package @private @protected @required @optional @try @catch @finally @import " +
"@selector @encode @defs @synchronized @autoreleasepool @compatibility_alias @available";
var objCBuiltins = "FOUNDATION_EXPORT FOUNDATION_EXTERN NS_INLINE NS_FORMAT_FUNCTION " +
" NS_RETURNS_RETAINEDNS_ERROR_ENUM NS_RETURNS_NOT_RETAINED NS_RETURNS_INNER_POINTER " +
"NS_DESIGNATED_INITIALIZER NS_ENUM NS_OPTIONS NS_REQUIRES_NIL_TERMINATION " +
"NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_SWIFT_NAME NS_REFINED_FOR_SWIFT"
// Do not use this. Use the cTypes function below. This is global just to avoid
// excessive calls when cTypes is being called multiple times during a parse.
var basicCTypes = words("int long char short double float unsigned signed " +
"void bool");
// Do not use this. Use the objCTypes function below. This is global just to avoid
// excessive calls when objCTypes is being called multiple times during a parse.
var basicObjCTypes = words("SEL instancetype id Class Protocol BOOL");
// Returns true if identifier is a "C" type.
// C type is defined as those that are reserved by the compiler (basicTypes),
// and those that end in _t (Reserved by POSIX for types)
// http://www.gnu.org/software/libc/manual/html_node/Reserved-Names.html
function cTypes(identifier) {
return contains(basicCTypes, identifier) || /.+_t$/.test(identifier);
}
// Returns true if identifier is a "Objective C" type.
function objCTypes(identifier) {
return cTypes(identifier) || contains(basicObjCTypes, identifier);
}
var cBlockKeywords = "case do else for if switch while struct enum union";
var cDefKeywords = "struct enum union";
function cppHook(stream, state) {
if (!state.startOfLine) return false
for (var ch, next = null; ch = stream.peek();) {
if (ch == "\\" && stream.match(/^.$/)) {
next = cppHook
break
} else if (ch == "/" && stream.match(/^\/[\/\*]/, false)) {
break
}
stream.next()
}
state.tokenize = next
return "meta"
}
function pointerHook(_stream, state) {
if (state.prevToken == "type") return "type";
return false;
}
// For C and C++ (and ObjC): identifiers starting with __
// or _ followed by a capital letter are reserved for the compiler.
function cIsReservedIdentifier(token) {
if (!token || token.length < 2) return false;
if (token[0] != '_') return false;
return (token[1] == '_') || (token[1] !== token[1].toLowerCase());
}
function cpp14Literal(stream) {
stream.eatWhile(/[\w\.']/);
return "number";
}
function cpp11StringHook(stream, state) {
stream.backUp(1);
// Raw strings.
if (stream.match(/^(?:R|u8R|uR|UR|LR)/)) {
var match = stream.match(/^"([^\s\\()]{0,16})\(/);
if (!match) {
return false;
}
state.cpp11RawStringDelim = match[1];
state.tokenize = tokenRawString;
return tokenRawString(stream, state);
}
// Unicode strings/chars.
if (stream.match(/^(?:u8|u|U|L)/)) {
if (stream.match(/^["']/, /* eat */ false)) {
return "string";
}
return false;
}
// Ignore this hook.
stream.next();
return false;
}
function cppLooksLikeConstructor(word) {
var lastTwo = /(\w+)::~?(\w+)$/.exec(word);
return lastTwo && lastTwo[1] == lastTwo[2];
}
// C#-style strings where "" escapes a quote.
function tokenAtString(stream, state) {
var next;
while ((next = stream.next()) != null) {
if (next == '"' && !stream.eat('"')) {
state.tokenize = null;
break;
}
}
return "string";
}
// C++11 raw string literal is <prefix>"<delim>( anything )<delim>", where
// <delim> can be a string up to 16 characters long.
function tokenRawString(stream, state) {
// Escape characters that have special regex meanings.
var delim = state.cpp11RawStringDelim.replace(/[^\w\s]/g, '\\$&');
var match = stream.match(new RegExp(".*?\\)" + delim + '"'));
if (match)
state.tokenize = null;
else
stream.skipToEnd();
return "string";
}
function def(mimes, mode) {
if (typeof mimes == "string") mimes = [mimes];
var words = [];
function add(obj) {
if (obj) for (var prop in obj) if (obj.hasOwnProperty(prop))
words.push(prop);
}
add(mode.keywords);
add(mode.types);
add(mode.builtin);
add(mode.atoms);
if (words.length) {
mode.helperType = mimes[0];
CodeMirror.registerHelper("hintWords", mimes[0], words);
}
for (var i = 0; i < mimes.length; ++i)
CodeMirror.defineMIME(mimes[i], mode);
}
def(["text/x-csrc", "text/x-c", "text/x-chdr"], {
name: "clike",
keywords: words(cKeywords),
types: cTypes,
blockKeywords: words(cBlockKeywords),
defKeywords: words(cDefKeywords),
typeFirstDefinitions: true,
atoms: words("NULL true false"),
isReservedIdentifier: cIsReservedIdentifier,
hooks: {
"#": cppHook,
"*": pointerHook,
},
modeProps: {fold: ["brace", "include"]}
});
def(["text/x-c++src", "text/x-c++hdr"], {
name: "clike",
keywords: words(cKeywords + " " + cppKeywords),
types: cTypes,
blockKeywords: words(cBlockKeywords + " class try catch"),
defKeywords: words(cDefKeywords + " class namespace"),
typeFirstDefinitions: true,
atoms: words("true false NULL nullptr"),
dontIndentStatements: /^template$/,
isIdentifierChar: /[\w\$_~\xa1-\uffff]/,
isReservedIdentifier: cIsReservedIdentifier,
hooks: {
"#": cppHook,
"*": pointerHook,
"u": cpp11StringHook,
"U": cpp11StringHook,
"L": cpp11StringHook,
"R": cpp11StringHook,
"0": cpp14Literal,
"1": cpp14Literal,
"2": cpp14Literal,
"3": cpp14Literal,
"4": cpp14Literal,
"5": cpp14Literal,
"6": cpp14Literal,
"7": cpp14Literal,
"8": cpp14Literal,
"9": cpp14Literal,
token: function(stream, state, style) {
if (style == "variable" && stream.peek() == "(" &&
(state.prevToken == ";" || state.prevToken == null ||
state.prevToken == "}") &&
cppLooksLikeConstructor(stream.current()))
return "def";
}
},
namespaceSeparator: "::",
modeProps: {fold: ["brace", "include"]}
});
def("text/x-java", {
name: "clike",
keywords: words("abstract assert break case catch class const continue default " +
"do else enum extends final finally for goto if implements import " +
"instanceof interface native new package private protected public " +
"return static strictfp super switch synchronized this throw throws transient " +
"try volatile while @interface"),
types: words("var byte short int long float double boolean char void Boolean Byte Character Double Float " +
"Integer Long Number Object Short String StringBuffer StringBuilder Void"),
blockKeywords: words("catch class do else finally for if switch try while"),
defKeywords: words("class interface enum @interface"),
typeFirstDefinitions: true,
atoms: words("true false null"),
number: /^(?:0x[a-f\d_]+|0b[01_]+|(?:[\d_]+\.?\d*|\.\d+)(?:e[-+]?[\d_]+)?)(u|ll?|l|f)?/i,
hooks: {
"@": function(stream) {
// Don't match the @interface keyword.
if (stream.match('interface', false)) return false;
stream.eatWhile(/[\w\$_]/);
return "meta";
},
'"': function(stream, state) {
if (!stream.match(/""$/)) return false;
state.tokenize = tokenTripleString;
return state.tokenize(stream, state);
}
},
modeProps: {fold: ["brace", "import"]}
});
def("text/x-csharp", {
name: "clike",
keywords: words("abstract as async await base break case catch checked class const continue" +
" default delegate do else enum event explicit extern finally fixed for" +
" foreach goto if implicit in interface internal is lock namespace new" +
" operator out override params private protected public readonly ref return sealed" +
" sizeof stackalloc static struct switch this throw try typeof unchecked" +
" unsafe using virtual void volatile while add alias ascending descending dynamic from get" +
" global group into join let orderby partial remove select set value var yield"),
types: words("Action Boolean Byte Char DateTime DateTimeOffset Decimal Double Func" +
" Guid Int16 Int32 Int64 Object SByte Single String Task TimeSpan UInt16 UInt32" +
" UInt64 bool byte char decimal double short int long object" +
" sbyte float string ushort uint ulong"),
blockKeywords: words("catch class do else finally for foreach if struct switch try while"),
defKeywords: words("class interface namespace struct var"),
typeFirstDefinitions: true,
atoms: words("true false null"),
hooks: {
"@": function(stream, state) {
if (stream.eat('"')) {
state.tokenize = tokenAtString;
return tokenAtString(stream, state);
}
stream.eatWhile(/[\w\$_]/);
return "meta";
}
}
});
function tokenTripleString(stream, state) {
var escaped = false;
while (!stream.eol()) {
if (!escaped && stream.match('"""')) {
state.tokenize = null;
break;
}
escaped = stream.next() == "\\" && !escaped;
}
return "string";
}
function tokenNestedComment(depth) {
return function (stream, state) {
var ch
while (ch = stream.next()) {
if (ch == "*" && stream.eat("/")) {
if (depth == 1) {
state.tokenize = null
break
} else {
state.tokenize = tokenNestedComment(depth - 1)
return state.tokenize(stream, state)
}
} else if (ch == "/" && stream.eat("*")) {
state.tokenize = tokenNestedComment(depth + 1)
return state.tokenize(stream, state)
}
}
return "comment"
}
}
def("text/x-scala", {
name: "clike",
keywords: words(
/* scala */
"abstract case catch class def do else extends final finally for forSome if " +
"implicit import lazy match new null object override package private protected return " +
"sealed super this throw trait try type val var while with yield _ " +
/* package scala */
"assert assume require print println printf readLine readBoolean readByte readShort " +
"readChar readInt readLong readFloat readDouble"
),
types: words(
"AnyVal App Application Array BufferedIterator BigDecimal BigInt Char Console Either " +
"Enumeration Equiv Error Exception Fractional Function IndexedSeq Int Integral Iterable " +
"Iterator List Map Numeric Nil NotNull Option Ordered Ordering PartialFunction PartialOrdering " +
"Product Proxy Range Responder Seq Serializable Set Specializable Stream StringBuilder " +
"StringContext Symbol Throwable Traversable TraversableOnce Tuple Unit Vector " +
/* package java.lang */
"Boolean Byte Character CharSequence Class ClassLoader Cloneable Comparable " +
"Compiler Double Exception Float Integer Long Math Number Object Package Pair Process " +
"Runtime Runnable SecurityManager Short StackTraceElement StrictMath String " +
"StringBuffer System Thread ThreadGroup ThreadLocal Throwable Triple Void"
),
multiLineStrings: true,
blockKeywords: words("catch class enum do else finally for forSome if match switch try while"),
defKeywords: words("class enum def object package trait type val var"),
atoms: words("true false null"),
indentStatements: false,
indentSwitch: false,
isOperatorChar: /[+\-*&%=<>!?|\/#:@]/,
hooks: {
"@": function(stream) {
stream.eatWhile(/[\w\$_]/);
return "meta";
},
'"': function(stream, state) {
if (!stream.match('""')) return false;
state.tokenize = tokenTripleString;
return state.tokenize(stream, state);
},
"'": function(stream) {
stream.eatWhile(/[\w\$_\xa1-\uffff]/);
return "atom";
},
"=": function(stream, state) {
var cx = state.context
if (cx.type == "}" && cx.align && stream.eat(">")) {
state.context = new Context(cx.indented, cx.column, cx.type, cx.info, null, cx.prev)
return "operator"
} else {
return false
}
},
"/": function(stream, state) {
if (!stream.eat("*")) return false
state.tokenize = tokenNestedComment(1)
return state.tokenize(stream, state)
}
},
modeProps: {closeBrackets: {pairs: '()[]{}""', triples: '"'}}
});
function tokenKotlinString(tripleString){
return function (stream, state) {
var escaped = false, next, end = false;
while (!stream.eol()) {
if (!tripleString && !escaped && stream.match('"') ) {end = true; break;}
if (tripleString && stream.match('"""')) {end = true; break;}
next = stream.next();
if(!escaped && next == "$" && stream.match('{'))
stream.skipTo("}");
escaped = !escaped && next == "\\" && !tripleString;
}
if (end || !tripleString)
state.tokenize = null;
return "string";
}
}
def("text/x-kotlin", {
name: "clike",
keywords: words(
/*keywords*/
"package as typealias class interface this super val operator " +
"var fun for is in This throw return annotation " +
"break continue object if else while do try when !in !is as? " +
/*soft keywords*/
"file import where by get set abstract enum open inner override private public internal " +
"protected catch finally out final vararg reified dynamic companion constructor init " +
"sealed field property receiver param sparam lateinit data inline noinline tailrec " +
"external annotation crossinline const operator infix suspend actual expect setparam value"
),
types: words(
/* package java.lang */
"Boolean Byte Character CharSequence Class ClassLoader Cloneable Comparable " +
"Compiler Double Exception Float Integer Long Math Number Object Package Pair Process " +
"Runtime Runnable SecurityManager Short StackTraceElement StrictMath String " +
"StringBuffer System Thread ThreadGroup ThreadLocal Throwable Triple Void Annotation Any BooleanArray " +
"ByteArray Char CharArray DeprecationLevel DoubleArray Enum FloatArray Function Int IntArray Lazy " +
"LazyThreadSafetyMode LongArray Nothing ShortArray Unit"
),
intendSwitch: false,
indentStatements: false,
multiLineStrings: true,
number: /^(?:0x[a-f\d_]+|0b[01_]+|(?:[\d_]+(\.\d+)?|\.\d+)(?:e[-+]?[\d_]+)?)(u|ll?|l|f)?/i,
blockKeywords: words("catch class do else finally for if where try while enum"),
defKeywords: words("class val var object interface fun"),
atoms: words("true false null this"),
hooks: {
"@": function(stream) {
stream.eatWhile(/[\w\$_]/);
return "meta";
},
'*': function(_stream, state) {
return state.prevToken == '.' ? 'variable' : 'operator';
},
'"': function(stream, state) {
state.tokenize = tokenKotlinString(stream.match('""'));
return state.tokenize(stream, state);
},
"/": function(stream, state) {
if (!stream.eat("*")) return false;
state.tokenize = tokenNestedComment(1);
return state.tokenize(stream, state)
},
indent: function(state, ctx, textAfter, indentUnit) {
var firstChar = textAfter && textAfter.charAt(0);
if ((state.prevToken == "}" || state.prevToken == ")") && textAfter == "")
return state.indented;
if ((state.prevToken == "operator" && textAfter != "}" && state.context.type != "}") ||
state.prevToken == "variable" && firstChar == "." ||
(state.prevToken == "}" || state.prevToken == ")") && firstChar == ".")
return indentUnit * 2 + ctx.indented;
if (ctx.align && ctx.type == "}")
return ctx.indented + (state.context.type == (textAfter || "").charAt(0) ? 0 : indentUnit);
}
},
modeProps: {closeBrackets: {triples: '"'}}
});
def(["x-shader/x-vertex", "x-shader/x-fragment"], {
name: "clike",
keywords: words("sampler1D sampler2D sampler3D samplerCube " +
"sampler1DShadow sampler2DShadow " +
"const attribute uniform varying " +
"break continue discard return " +
"for while do if else struct " +
"in out inout"),
types: words("float int bool void " +
"vec2 vec3 vec4 ivec2 ivec3 ivec4 bvec2 bvec3 bvec4 " +
"mat2 mat3 mat4"),
blockKeywords: words("for while do if else struct"),
builtin: words("radians degrees sin cos tan asin acos atan " +
"pow exp log exp2 sqrt inversesqrt " +
"abs sign floor ceil fract mod min max clamp mix step smoothstep " +
"length distance dot cross normalize ftransform faceforward " +
"reflect refract matrixCompMult " +
"lessThan lessThanEqual greaterThan greaterThanEqual " +
"equal notEqual any all not " +
"texture1D texture1DProj texture1DLod texture1DProjLod " +
"texture2D texture2DProj texture2DLod texture2DProjLod " +
"texture3D texture3DProj texture3DLod texture3DProjLod " +
"textureCube textureCubeLod " +
"shadow1D shadow2D shadow1DProj shadow2DProj " +
"shadow1DLod shadow2DLod shadow1DProjLod shadow2DProjLod " +
"dFdx dFdy fwidth " +
"noise1 noise2 noise3 noise4"),
atoms: words("true false " +
"gl_FragColor gl_SecondaryColor gl_Normal gl_Vertex " +
"gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2 gl_MultiTexCoord3 " +
"gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 " +
"gl_FogCoord gl_PointCoord " +
"gl_Position gl_PointSize gl_ClipVertex " +
"gl_FrontColor gl_BackColor gl_FrontSecondaryColor gl_BackSecondaryColor " +
"gl_TexCoord gl_FogFragCoord " +
"gl_FragCoord gl_FrontFacing " +
"gl_FragData gl_FragDepth " +
"gl_ModelViewMatrix gl_ProjectionMatrix gl_ModelViewProjectionMatrix " +
"gl_TextureMatrix gl_NormalMatrix gl_ModelViewMatrixInverse " +
"gl_ProjectionMatrixInverse gl_ModelViewProjectionMatrixInverse " +
"gl_TextureMatrixTranspose gl_ModelViewMatrixInverseTranspose " +
"gl_ProjectionMatrixInverseTranspose " +
"gl_ModelViewProjectionMatrixInverseTranspose " +
"gl_TextureMatrixInverseTranspose " +
"gl_NormalScale gl_DepthRange gl_ClipPlane " +
"gl_Point gl_FrontMaterial gl_BackMaterial gl_LightSource gl_LightModel " +
"gl_FrontLightModelProduct gl_BackLightModelProduct " +
"gl_TextureColor gl_EyePlaneS gl_EyePlaneT gl_EyePlaneR gl_EyePlaneQ " +
"gl_FogParameters " +
"gl_MaxLights gl_MaxClipPlanes gl_MaxTextureUnits gl_MaxTextureCoords " +
"gl_MaxVertexAttribs gl_MaxVertexUniformComponents gl_MaxVaryingFloats " +
"gl_MaxVertexTextureImageUnits gl_MaxTextureImageUnits " +
"gl_MaxFragmentUniformComponents gl_MaxCombineTextureImageUnits " +
"gl_MaxDrawBuffers"),
indentSwitch: false,
hooks: {"#": cppHook},
modeProps: {fold: ["brace", "include"]}
});
def("text/x-nesc", {
name: "clike",
keywords: words(cKeywords + " as atomic async call command component components configuration event generic " +
"implementation includes interface module new norace nx_struct nx_union post provides " +
"signal task uses abstract extends"),
types: cTypes,
blockKeywords: words(cBlockKeywords),
atoms: words("null true false"),
hooks: {"#": cppHook},
modeProps: {fold: ["brace", "include"]}
});
def("text/x-objectivec", {
name: "clike",
keywords: words(cKeywords + " " + objCKeywords),
types: objCTypes,
builtin: words(objCBuiltins),
blockKeywords: words(cBlockKeywords + " @synthesize @try @catch @finally @autoreleasepool @synchronized"),
defKeywords: words(cDefKeywords + " @interface @implementation @protocol @class"),
dontIndentStatements: /^@.*$/,
typeFirstDefinitions: true,
atoms: words("YES NO NULL Nil nil true false nullptr"),
isReservedIdentifier: cIsReservedIdentifier,
hooks: {
"#": cppHook,
"*": pointerHook,
},
modeProps: {fold: ["brace", "include"]}
});
def("text/x-objectivec++", {
name: "clike",
keywords: words(cKeywords + " " + objCKeywords + " " + cppKeywords),
types: objCTypes,
builtin: words(objCBuiltins),
blockKeywords: words(cBlockKeywords + " @synthesize @try @catch @finally @autoreleasepool @synchronized class try catch"),
defKeywords: words(cDefKeywords + " @interface @implementation @protocol @class class namespace"),
dontIndentStatements: /^@.*$|^template$/,
typeFirstDefinitions: true,
atoms: words("YES NO NULL Nil nil true false nullptr"),
isReservedIdentifier: cIsReservedIdentifier,
hooks: {
"#": cppHook,
"*": pointerHook,
"u": cpp11StringHook,
"U": cpp11StringHook,
"L": cpp11StringHook,
"R": cpp11StringHook,
"0": cpp14Literal,
"1": cpp14Literal,
"2": cpp14Literal,
"3": cpp14Literal,
"4": cpp14Literal,
"5": cpp14Literal,
"6": cpp14Literal,
"7": cpp14Literal,
"8": cpp14Literal,
"9": cpp14Literal,
token: function(stream, state, style) {
if (style == "variable" && stream.peek() == "(" &&
(state.prevToken == ";" || state.prevToken == null ||
state.prevToken == "}") &&
cppLooksLikeConstructor(stream.current()))
return "def";
}
},
namespaceSeparator: "::",
modeProps: {fold: ["brace", "include"]}
});
def("text/x-squirrel", {
name: "clike",
keywords: words("base break clone continue const default delete enum extends function in class" +
" foreach local resume return this throw typeof yield constructor instanceof static"),
types: cTypes,
blockKeywords: words("case catch class else for foreach if switch try while"),
defKeywords: words("function local class"),
typeFirstDefinitions: true,
atoms: words("true false null"),
hooks: {"#": cppHook},
modeProps: {fold: ["brace", "include"]}
});
// Ceylon Strings need to deal with interpolation
var stringTokenizer = null;
function tokenCeylonString(type) {
return function(stream, state) {
var escaped = false, next, end = false;
while (!stream.eol()) {
if (!escaped && stream.match('"') &&
(type == "single" || stream.match('""'))) {
end = true;
break;
}
if (!escaped && stream.match('``')) {
stringTokenizer = tokenCeylonString(type);
end = true;
break;
}
next = stream.next();
escaped = type == "single" && !escaped && next == "\\";
}
if (end)
state.tokenize = null;
return "string";
}
}
def("text/x-ceylon", {
name: "clike",
keywords: words("abstracts alias assembly assert assign break case catch class continue dynamic else" +
" exists extends finally for function given if import in interface is let module new" +
" nonempty object of out outer package return satisfies super switch then this throw" +
" try value void while"),
types: function(word) {
// In Ceylon all identifiers that start with an uppercase are types
var first = word.charAt(0);
return (first === first.toUpperCase() && first !== first.toLowerCase());
},
blockKeywords: words("case catch class dynamic else finally for function if interface module new object switch try while"),
defKeywords: words("class dynamic function interface module object package value"),
builtin: words("abstract actual aliased annotation by default deprecated doc final formal late license" +
" native optional sealed see serializable shared suppressWarnings tagged throws variable"),
isPunctuationChar: /[\[\]{}\(\),;\:\.`]/,
isOperatorChar: /[+\-*&%=<>!?|^~:\/]/,
numberStart: /[\d#$]/,
number: /^(?:#[\da-fA-F_]+|\$[01_]+|[\d_]+[kMGTPmunpf]?|[\d_]+\.[\d_]+(?:[eE][-+]?\d+|[kMGTPmunpf]|)|)/i,
multiLineStrings: true,
typeFirstDefinitions: true,
atoms: words("true false null larger smaller equal empty finished"),
indentSwitch: false,
styleDefs: false,
hooks: {
"@": function(stream) {
stream.eatWhile(/[\w\$_]/);
return "meta";
},
'"': function(stream, state) {
state.tokenize = tokenCeylonString(stream.match('""') ? "triple" : "single");
return state.tokenize(stream, state);
},
'`': function(stream, state) {
if (!stringTokenizer || !stream.match('`')) return false;
state.tokenize = stringTokenizer;
stringTokenizer = null;
return state.tokenize(stream, state);
},
"'": function(stream) {
stream.eatWhile(/[\w\$_\xa1-\uffff]/);
return "atom";
},
token: function(_stream, state, style) {
if ((style == "variable" || style == "type") &&
state.prevToken == ".") {
return "variable-2";
}
}
},
modeProps: {
fold: ["brace", "import"],
closeBrackets: {triples: '"'}
}
});
});

234
public/codemirror/mode/php/php.js vendored Normal file

File diff suppressed because one or more lines are too long

23
public/codemirror/theme/eclipse.css vendored Normal file
View File

@ -0,0 +1,23 @@
.cm-s-eclipse span.cm-meta { color: #FF1717; }
.cm-s-eclipse span.cm-keyword { line-height: 1em; font-weight: bold; color: #7F0055; }
.cm-s-eclipse span.cm-atom { color: #219; }
.cm-s-eclipse span.cm-number { color: #164; }
.cm-s-eclipse span.cm-def { color: #00f; }
.cm-s-eclipse span.cm-variable { color: black; }
.cm-s-eclipse span.cm-variable-2 { color: #0000C0; }
.cm-s-eclipse span.cm-variable-3, .cm-s-eclipse span.cm-type { color: #0000C0; }
.cm-s-eclipse span.cm-property { color: black; }
.cm-s-eclipse span.cm-operator { color: black; }
.cm-s-eclipse span.cm-comment { color: #3F7F5F; }
.cm-s-eclipse span.cm-string { color: #2A00FF; }
.cm-s-eclipse span.cm-string-2 { color: #f50; }
.cm-s-eclipse span.cm-qualifier { color: #555; }
.cm-s-eclipse span.cm-builtin { color: #30a; }
.cm-s-eclipse span.cm-bracket { color: #cc7; }
.cm-s-eclipse span.cm-tag { color: #170; }
.cm-s-eclipse span.cm-attribute { color: #00c; }
.cm-s-eclipse span.cm-link { color: #219; }
.cm-s-eclipse span.cm-error { color: #f00; }
.cm-s-eclipse .CodeMirror-activeline-background { background: #e8f2ff; }
.cm-s-eclipse .CodeMirror-matchingbracket { outline:1px solid grey; color:black !important; }

13
public/htaccess-apache Normal file
View File

@ -0,0 +1,13 @@
#apache服务器伪静态配置文件使用时将文件名改为.htaccess并复制到蓝天采集器根目录
<IfModule mod_rewrite.c>
Options +FollowSymlinks -Multiviews
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^app/(\w+)/(.*)$ app/$1/index.php [QSA,PT,L,E=PATH_INFO:$2]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,PT,L,E=PATH_INFO:$1]
</IfModule>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--IIS服务器伪静态配置文件使用时将文件名改为web.config即可-->
<!--iis服务器伪静态配置文件使用时将文件名改为web.config并复制到蓝天采集器根目录-->
<configuration>
<system.webServer>
<rewrite>
@ -13,7 +13,7 @@
</conditions>
<action type="Rewrite" url="app/{R:1}/index.php/{R:2}" appendQueryString="true" />
</rule>
<rule name="SkycaijiTp5" stopProcessing="true">
<rule name="SkycaijiRoot" stopProcessing="true">
<match url="^(.*)$" ignoreCase="false" />
<conditions logicalGrouping="MatchAll">
<add input="{HTTP_HOST}" pattern="^(.*)$" />

5
public/htaccess-nginx Normal file
View File

@ -0,0 +1,5 @@
#nginx服务器伪静态配置文件注意如果蓝天采集器安装在子目录中请将“子目录”替换为相应目录的名称否则删除文字“/子目录”
if (!-e $request_filename) {
rewrite ^/子目录/app/(\w+)/(.*)$ /子目录/app/$1/index.php?s=/$2 last;
rewrite ^/子目录/(.*)$ /子目录/index.php?s=/$1 last;
}

View File

@ -10,7 +10,10 @@
.panel .form-group:last-child{margin-bottom:0;}
.panel .form-group .help-block:last-child{margin-bottom:0;}
.label-custom-opened{font-weight:normal;background-color:#dedede;color:#555;}
.brl_0{border-left:0;}
.brr_0{border-right:0;}
.h-title{
color: #666;
font-weight: bold;
@ -54,14 +57,27 @@ div.in-line-mg{display:inline;margin-right:5px;}
.wrapper-not-enable .tab-content{background:#f1f1f1;opacity:0.7;}
.wrapper-not-enable .panel-collapse{background:#f1f1f1;opacity:0.7;}
.box-not-enable{background:#f1f1f1;opacity:0.7;}
#confirm_right .cr-msg p:last-child{margin-bottom:0;}
.table-responsive .table:last-child{margin-bottom:0;}
.table-responsive .table input.form-control{min-width:150px;}
.table-responsive .table textarea.form-control{min-width:150px;}
.table-responsive .table select.form-control{min-width:70px;}
.icon-info-tips{font-size:12px;cursor:pointer;color:#bbb;}
.icon-info-tips:hover{color:#3c8dbc;}
.echo-msg-clear{width:100%;overflow:hidden;clear:both;}
.echo-msg-lt{float:left;}
.echo-msg-lurl{float:left;margin-right:3px;height:16px;max-width:70%;overflow:hidden;text-overflow:ellipsis;word-wrap:break-word;word-break:break-all;}
/*皮肤*/
.skin-blue-light .treeview-skins,.skin-black-light .treeview-skins,.skin-red-light .treeview-skins,.skin-yellow-light .treeview-skins,.skin-purple-light .treeview-skins,.skin-green-light .treeview-skins{
color:#000;
}
.skin-black .btn-primary,.skin-black-light .btn-primary{background-color:#5A6E82;border-color:#4A6E82;}
.skin-black .btn-primary:hover,.skin-black-light .btn-primary:hover{background-color:#4A6E82;border-color:#1A6E82}
.skin-black .pagination .active a,.skin-black-light .pagination .active a{background-color:#5A6E82;border-color:#4A6E82;}
@ -97,11 +113,14 @@ div.in-line-mg{display:inline;margin-right:5px;}
/*数据表*/
.datatable .sub{padding-left:50px; background:url('../images/bg_column.gif') no-repeat 15px 10px;}
.datatable td .dropdown{display:inline;}
.datatable .chk{text-align:center;}
.datatable th.chk,.datatable td.chk{min-width:50px;width:50px;text-align:center;}
.datatable .chk-all{line-height:14px;margin:0;}
.datatable .chk-all span{display:block;font-size:12px;}
.datatable .name{max-width:450px;overflow:hidden;text-overflow:ellipsis;}
.datatable .url{max-width:260px;overflow:hidden;text-overflow:ellipsis;}
.datatable .desc{max-width:400px;white-space:normal;overflow:hidden;word-wrap:break-word;word-break:break-all;}
.datatable .sort input{height:auto;padding:0 5px;max-width:70px;}
.datatable .sort{width:80px;min-width:80px;}
.datatable .sort input{height:auto;padding:0 5px;min-width:100%!important;}
.datatable .bg0{background:#fcfcfc}
.datatable .chk-inline{vertical-align:baseline;margin-right:5px;}
.datatable .sep{color:#999;text-indent:-9999px;display:inline-block;width:2px;line-height:12px;margin-left:1px;border-left:1px solid #aaa;}
@ -201,9 +220,10 @@ table.table thead .sorting_desc:after {
border-bottom:0;
}
/*请求头信息*/
.c-p-request-headers .delete-request-header{margin-top:8px;}
.c-p-request-headers-img .delete-request-header-img{margin-top:8px;}
.c-p-request-headers table,.c-p-request-headers-img table{margin-bottom:0}
.c-p-request-headers .delete-request-header,.c-p-request-headers-img .delete-request-header-img{margin-top:8px;}
.c-p-request-headers td:first-child,.c-p-request-headers-img td:first-child{width:200px;}
.c-p-request-headers td:last-child,.c-p-request-headers-img td:last-child{width:50px;text-align:center;}
/*内容标签*/
.c-p-url-content-signs{
width:auto;
@ -211,8 +231,16 @@ table.table thead .sorting_desc:after {
}
/*页面源码表单和请求头*/
.c-p-url-web-form table,.c-p-url-web-header table{margin-bottom:0;}
.c-p-url-web-form .delete-url-web-form,.c-p-url-web-header .delete-url-web-header{margin-top:8px;}
.c-p-url-web-form td:first-child,.c-p-url-web-header td:first-child{width:200px;}
.c-p-url-web-form td:last-child,.c-p-url-web-header td:last-child{width:50px;text-align:center;}
/*页面渲染动作*/
.c-p-url-renderer-list table{margin-bottom:0;}
.c-p-url-renderer-list .td-renderer-element,.c-p-url-renderer-list .td-renderer-content{display:none;}
.c-p-url-renderer-list .td-renderer-op{width:65px;text-align:center;}
.c-p-url-renderer-list .td-renderer-op .input-group-addon:last-child{border-left:1px solid #d2d6de;}
/*显示标签列表input-group-btn必须position:static否则dropdown-menu定位太窄*/
.c-p-url-page-signs>.input-group-btn{position:static;}
.c-p-url-page-signs .dropdown-menu{padding:0;box-shadow:none;border:0;}
@ -220,8 +248,9 @@ table.table thead .sorting_desc:after {
.c-p-url-page-signs .c-p-url-ps-table .table{margin-bottom:0;}
.c-p-url-page-signs .c-p-url-ps-table .table td>a,.c-p-url-page-signs .dropdown-menu .table td>span{margin-right:5px;}
.c-p-url-page-signs .c-p-url-ps-table .table td>*:last-child{margin-right:0;}
.c-p-url-page-signs .c-p-url-ps-table .table td{white-space:normal!important;width:auto;}
.c-p-url-page-signs .c-p-url-ps-table .table td{white-space:normal!important;width:auto!important;}
.c-p-url-page-signs .c-p-url-ps-table .table td:first-child{white-space:nowrap!important;}
.c-p-url-page-signs .c-p-url-ps-table .table td:last-child{text-align:left!important;}
/*分页字段*/
.c-p-url-pagination-fields{
@ -287,32 +316,49 @@ table.table thead .sorting_desc:after {
.nav-save-rule{float:right!important;}
.nav-save-rule .dropdown-menu li a{padding-top:5px;padding-bottom:5px;}
/*数据处理*/
.form-control-slt{width:30px;text-align:center;}
.form-control-slt select{width:20px!important;height:30px!important;float:none!important;border:0!important;padding:0!important;margin:0!important;text-indent:-20px!important;}
.form-control-slt{width:30px!important;text-align:center;}
.form-control-slt select.form-control{min-width:20px!important;width:20px!important;height:30px!important;float:none!important;border:0!important;padding:0!important;margin:0!important;text-indent:-20px!important;}
.c-p-process-accordion .panel-heading .glyphicon{font-size:12px;}
.p-m-func-field{display:inline;width:80px;border:0;cursor:pointer;margin:0;padding:0;height:auto;color:#555;}
.p-m-api-val-field,.p-m-api-header-field{display:none;margin-left:-1px;padding:0;}
.p-m-api-table table,.p-m-api-header-table table{margin-bottom:0;}
.p-m-api-table td:first-child,.p-m-api-header-table td:first-child{width:200px;}
.p-m-api-table td:last-child,.p-m-api-header-table td:last-child{width:50px;text-align:center;}
.p-m-html-tags{}
.p-m-html-tags a{font-size:12px;font-weight:normal;cursor:pointer;margin-right:5px;}
.p-m-html-tags a span{margin-right:2px;color:#999;}
.p-m-if-val-func{position:relative;}
.p-m-if-val-func a.input-group-addon{border-left:0;}
.p-m-if-val-func .input-group-btn>select{border-left:0;width:auto;padding:0;padding-left:5px;text-align:center;}
.p-m-if-val-func-info{width:30px;display:block;padding:0;color:#bbb;font-size:12px;}
.p-m-if-op{width:35px;padding:0!important;padding-top:15px!important;font-size:11px;}
.p-m-if-op{width:70px;padding:15px 0 0 8px!important;font-size:11px;}
/*发布设置*/
.rele-db-error{margin-top:10px;color:red;font-weight:bold;}
.table-db-table-bind{padding:0;margin-bottom:0;border:0;}
.table-db-table-bind .table{margin-bottom:0;}
.table-db-table-bind .table thead th{padding-top:13px;padding-bottom:13px;}
.table-db-table-bind .form-control{min-width:150px;}
.db-table-bind-params{padding:0;margin-bottom:0;border:0;}
.db-table-bind-params .table{margin-bottom:0;}
.db-table-bind-params .table tr>th:first-child,.db-table-bind-params .table tr>td:first-child{padding-left:15px;}
.db-table-bind-params .table thead th{padding-top:13px;padding-bottom:13px;}
.db-table-bind-op{width:auto;height:auto;display:inline;padding:0;}
.db-table-bind-where-tpl,.db-table-bind-query-tpl{display:none;}
.db-table-bind-where,.db-table-bind-query{display:none;}
.db-table-bind-data-seq{display:none;}
.db-table-bind-where,.db-table-bind-query,.db-table-bind-data{border:0;}
.db-table-bind-signs>.input-group-btn{position:static;}
.dm-db-charset li {padding:5px 15px;}
.dm-db-charset li.divider{padding:0;}
.dm-db-charset li span{padding:5px; cursor:pointer;color:#555;}
.dm-db-charset li span:hover{background:#eee;}
/*sui步骤条*/
.toapi-param-table table,.toapi-header-table table{margin-bottom:0;}
.toapi-param-table td:first-child,.toapi-header-table td:first-child{width:200px;}
.toapi-param-table td:last-child,.toapi-header-table td:last-child{width:50px;text-align:center;}
/*步骤条*/
.steps-bar{width:100%;overflow:hidden;color:#999;}
.steps-bar a{color:#999;}
.steps-bar .step{
@ -415,12 +461,11 @@ table.table thead .sorting_desc:after {
.proxy-ip-box .h-title .glyphicon{font-size:80%;}
.proxy-ip-list .delete-proxy-ip{margin-top:8px;}
.proxy-ip-list .p-ip .form-control{min-width:150px;}
.proxy-ip-list .p-ip-info{vertical-align:middle;color:#999;}
.proxy-ip-list .p-top{padding-top:11px;}
.proxy-ip-list .p-top1{padding-top:13px;}
.proxy-api-list .p-api-title{width:90%;float:left;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;}
.proxy-api-list .p-api-title{max-width:80%;float:left;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;}
/*工具*/
.tool-json-tree{width:100%;overflow:hidden;}
@ -432,6 +477,14 @@ table.table thead .sorting_desc:after {
.tool-json-tree .val{}
.tool-json-tree .text{width:100%;}
.tool-json-tree .text textarea{width:100%;}
/*开发*/
.deve-editor-left{padding-right:0px;}
.deve-editor-right{padding-left:1px;}
.deve-editor-apps{padding-left:5px;list-style:none;}
.deve-editor-apps li{padding:2px 0;width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;}
.deve-editor-apps li a{color:#333;}
.deve-editor-apps li.cur a{font-weight:bold;}
/**/
.table-test-loop thead{background:#fafafa;}
.table-test-loop thead th,.table-test-loop thead td{
@ -454,8 +507,6 @@ table.table thead .sorting_desc:after {
.table-test-loop .view-ipt{}
.table-test-loop .view-btn{position:absolute;font-size:12px;top:12px;left:5px;}
.icon-delimiter-tips{font-size:12px;cursor:pointer;color:#bbb;}
footer.footer-end{display:none;}
.skin-black .nav-tabs-color li.active,.skin-black-light .nav-tabs-color li.active{border-top-color:#5A6E82!important;}
@ -471,10 +522,11 @@ footer.footer-end{display:none;}
/*采集窗口*/
.win-cem-process-body{position:relative;}
.win-cem-process-body #win_cem_process_box{display:block!important;}
.win-cem-process-body .win-cem-ifr-box{margin-left:80px;border-left:solid 1px #efefef;}
.win-cem-process-body .win-cem-ifr-box{margin-left:80px;}
#win_cem_process_box{display:none;}
#win_cem_process_nav{
border-right:solid 1px #efefef;
font-size:13px;
text-align:center;
position:absolute;
@ -505,6 +557,26 @@ footer.footer-end{display:none;}
.win-cem-ifr-box{width:auto;height:100%;}
.win-cem-ifr-box iframe{width:100%;height:100%;margin:0;border:0;}
@media (min-width: 1200px) {
/*table-responsive设置overflow:inherit;可正常显示dropdown-menu*/
.c-p-url-renderer-list{overflow:inherit;}
.db-table-bind-where,.db-table-bind-query,.db-table-bind-data{overflow:inherit;}
}
@media (max-width: 1199px) {
/*dropdown-menu用fixed避免被table-responsive的overflow:hidden;影响*/
.c-p-url-renderer-list .c-p-url-page-signs .dropdown-menu{padding:0;border:4px solid #ddd;border-radius:4px;background:transparent;position:fixed;left:10px;right:10px;bottom:10px;top:auto;max-height:80%;overflow-y:scroll;}
.c-p-url-renderer-list .c-p-url-page-signs .dropdown-menu .c-p-url-ps-table{background:#fff;}
.db-table-bind-signs .dropdown-menu{padding:0;border:4px solid #ddd;border-radius:4px;background:transparent;position:fixed;left:10px;right:10px;bottom:10px;top:auto;max-height:80%;overflow-y:scroll;}
.db-table-bind-signs .dropdown-menu table{margin:0;}
}
@media (min-width: 768px) {
.c-p-url-web-form,.c-p-url-web-header{overflow:inherit;} /*table-responsive设置overflow:inherit;可正常显示dropdown-menu*/
}
@media (max-width: 767px){
.main-header .logo{
width:140px;
@ -521,7 +593,17 @@ footer.footer-end{display:none;}
.content-wrapper .content{padding-top:8px;}
.c-p-url-page-signs .dropdown-menu .table td>a,.c-p-url-page-signs .dropdown-menu .table td>span{display:block;margin-right:0;}
.deve-editor-left,.deve-editor-right{padding-left:15px;padding-right:15px;margin-bottom:10px;}
/*dropdown-menu用fixed避免被table-responsive的overflow:hidden;影响*/
.c-p-url-web-form .c-p-url-page-signs .dropdown-menu,.c-p-url-web-header .c-p-url-page-signs .dropdown-menu{padding:0;border:4px solid #ddd;border-radius:4px;background:transparent;position:fixed;left:10px;right:10px;bottom:10px;top:auto;max-height:80%;overflow-y:scroll;}
.c-p-url-web-form .c-p-url-page-signs .dropdown-menu .c-p-url-ps-table,.c-p-url-web-header .c-p-url-page-signs .dropdown-menu .c-p-url-ps-table{background:#fff;}
/*元素最小宽度,防止太窄无法输入*/
.table-responsive .table input.form-control{min-width:100px;}
.table-responsive .table textarea.form-control{min-width:100px;}
}
@media (max-width: 550px){
/*采集器tab*/
.coll-tab>li{margin-bottom:5px;width:33%;}
@ -536,6 +618,9 @@ footer.footer-end{display:none;}
.c-p-source-tab>li.active>a{border-radius:3px;border-bottom-color:#ddd!important;background-color:#efefef!important;}
.mobile-input-group>.input-group-addon{display:table-caption;width:100%;background:#fafafa;margin-bottom:5px;border-right:1px solid #ccc;}
.c-p-url-web-form td:first-child,.c-p-url-web-header td:first-child{width:auto;}
/*自适应第一个td宽度*/
.c-p-request-headers td:first-child,.c-p-request-headers-img td:first-child{width:auto;}
.c-p-url-web-form td:first-child,.c-p-url-web-header td:first-child{width:auto;}
.p-m-api-table td:first-child,.p-m-api-header-table td:first-child{width:auto;}
.toapi-param-table td:first-child,.toapi-header-table td:first-child{width:auto;}
}

View File

@ -9,13 +9,38 @@ body>.container-fluid{padding:0px;margin:0px;}
width:35%;
padding:0;
margin:0;
resize:horizontal;
}
#box_guide{
padding:0;
margin:0;
margin-left:35%;
position:relative;
}
#box_resize{
border:0;
z-index:9999;
position:absolute;
top:48%;
left:-15.5px;
text-align:center;
font-size:14px;
opacity:0.7;
color:#555;
padding:0;
margin:0;
cursor:w-resize;
-moz-user-select:none;
-webkit-user-select:none;
-ms-user-select:none;
-khtml-user-select:none;
user-select:none;
}
#btn_resize .glyphicon{padding:0;line-height:inherit;}
.btn-resize-mousedown #btn_resize{position:absolute;padding:200px;left:-200px;top:-200px;}
.btn-resize-mousedown #btn_resize .glyphicon{color:#000;}
#ifr_browser_box{position:relative;}
#ifr_browser{
width:100%;
@ -25,7 +50,7 @@ body>.container-fluid{padding:0px;margin:0px;}
padding:0;
margin:0;
}
#ifr_loading{position:absolute;z-index:999999;top:15px;left:10px;background:url('../images/loading.gif') no-repeat 5px 0px;width:37px;height:32px;}
#ifr_loading{position:absolute;z-index:999;top:15px;left:10px;background:url('../images/loading.gif') no-repeat 5px 0px;width:37px;height:32px;}
@media(max-width:767px) {
#wrapper{overflow:auto;}
#ifr_collector {
@ -40,5 +65,8 @@ body>.container-fluid{padding:0px;margin:0px;}
margin-left: 0;
padding: 5px;
}
#btn_resize{display:none;}
#ifr_browser{height:auto;}
}

View File

@ -22,7 +22,8 @@ window.open(url,'_blank')}
function eleExchange(box,move,ele){if(!window.ele_exchange_is_touch){window.ele_exchange_is_touch=1;if('ontouchstart' in window||navigator.maxTouchPoints){window.ele_exchange_is_touch=2}}
if(window.ele_exchange_is_touch==2){$(box).on('click',move,function(){var obj=$(this).parents(ele).eq(0);var next=obj.next(ele);if(next.length>0){next.after(obj)}})}else{$(box).sortable({items:ele,handle:move,axis:'y'})}}
function showPanelCollapse(id){$(id).parent().find('a[data-toggle][href="'+id+'"]').attr('aria-expanded',!0).removeClass('collapsed');$(id).addClass('in').attr('aria-expanded',!0).attr('style','')}
function inputSelectCustom(sltObj,iptName,onOptions){if(sltObj&&iptName){$(sltObj).bind('change',function(){var ipt=$(this).parents('.input-select-custom').eq(0).find('[name="'+iptName+'"]');if($(this).val()=='custom'){ipt.show()}else{ipt.hide()}})}else if(onOptions&&typeof(onOptions)=='object'){$(onOptions.box).on('change',onOptions.slt,function(){var ipt=$(this).parents('.input-select-custom').eq(0).find(onOptions.ipt);if($(this).val()=='custom'){ipt.show()}else{ipt.hide()}})}}
function inputSelectCustom(sltObj,iptName,onOptions,customName,changeFunc){customName=customName?customName:'custom';var onChangeFunc=function(curObj,iptEle){var ipt=$(curObj).parents('.input-select-custom').eq(0).find(iptEle);if($(curObj).val()==customName){ipt.show()}else{ipt.hide()}
if(changeFunc&&typeof(changeFunc)=='function'){changeFunc()}};if(sltObj&&iptName){$(sltObj).bind('change',function(){onChangeFunc(this,'[name="'+iptName+'"]')})}else if(onOptions&&typeof(onOptions)=='object'){$(onOptions.box).on('change',onOptions.slt,function(){onChangeFunc(this,onOptions.ipt)})}}
function visualizeData(data){var cacheData=data;data=isNull(data)?'':data;var options={lg:1,hidden_func:function(){window.win_visualize_data=null}};if(dataIsJson(data)){var jsonId='json_'+generateUUID();modal('JSON解析','<div id="'+jsonId+'"></div>',options);var jsonTreeFunc=function(){window.tool_json_tree.treeId='#'+jsonId;window.tool_json_tree.load(data)};if(window.tool_json_tree){jsonTreeFunc()}else{$.getScript(window.site_config.pub+'/static/js/admin/tool_json_tree.js',jsonTreeFunc)}}else{options.loaded_func=function(){data=data.replace(/<script[^<>]*>[\s\S]*?<\/script>/ig,'');data=data.replace(/<meta[^<>]*charset[^<>]*>/i,'');var ifrId='#myModalIframe';$(ifrId).bind('load',function(){if($(ifrId).contents().find('body').html().length<=0){$(ifrId).contents().find('body').html(data)}});$(ifrId).contents().find('body').html(data)};var title='HTML预览';if(data&&data.indexOf('<pre>')===0){title='HTML代码'}
windowIframe(title,'',options)}(function(data){if(data){$('#myModal .modal-footer .close').addClass('btn btn-default').removeClass('close');$('#myModal .modal-footer').prepend('<button type="button" class="btn btn-info btn-back" data-dismiss="modal">返回</button>');$('#myModal .modal-footer .btn-back').bind('click',function(){visualizeData(data)})}})(window.win_visualize_data);window.win_visualize_data=cacheData}
function cpEasyBrowser(url,pageSource,inputUrls){pageSource=pageSource?pageSource:'';inputUrls=inputUrls?inputUrls:{};var data={type:'browser_url',page_source:pageSource,test_url:url,input_urls:inputUrls};data=JSON.stringify(data);window.top.postMessage(data,'*')}
@ -38,8 +39,9 @@ paramObj.attr('placeholder',placeholder).attr('rows',rows)})}}
var setFuncVal=function(){funcObj.val(funcVal).trigger('change')};if(funcObj.attr('data-is-loaded')){setFuncVal()}else{if(params.cache&&window[winCacheName]){funcObj.attr('data-is-loaded',1).append(window[winCacheName]);setFuncVal()}else{ajaxOpen({type:'GET',dataType:'json',url:ulink('collector/plugin_func'),async:params.cache?false:!0,data:{module:params.module},success:function(data){if(funcObj.attr('data-is-loaded')){setFuncVal()}else{funcObj.attr('data-is-loaded',1);if(data.code==1){var html='';var apps=data.data;if(apps&&typeof(apps)=='object'){for(var app in apps){var appData=apps[app];appData=appData?appData:{};var methods=appData.methods;if(methods){html+='<optgroup label="'+htmlspecialchars(appData.name+''+app+'')+'">';for(var m in methods){var mMethod=methods[m];mMethod=mMethod?mMethod:{};html+='<option value="'+app+':'+m+'" data-params="'+(mMethod.params?mMethod.params:'')+'" data-comment="'+(mMethod.comment?mMethod.comment:'')+'">'+m+''+(mMethod.comment_cut?mMethod.comment_cut:'')+'</option>'}
html+='</optgroup>'}}}
funcObj.append(html);if(params.cache){window[winCacheName]=html}}}},error:function(xhr,status,error){funcObj.removeAttr('data-is-loaded');toastr.error('函数插件载入失败:'+status+' '+error)},complete:function(xhr,status){setFuncVal()}})}}}
function pluginFuncTips(module){var tips='';if(module=='process'){tips='<p>如需扩展系统函数,请在根目录/data/config.php中添加配置</p>'+"<p>'EXTEND_PROCESS_FUNC'=&gt;array('PHP函数名'=&gt;'描述')</p>"+'<p>如需扩展插件函数,可创建<a href="'+ulink('develop/func?module=process')+'" target="_blank">函数插件</a></p>'}else if(module=='processIf'){tips='<p>选择函数,取反可获取函数结果的相反值</p>'+'<p>默认将当前字段作为参数传入,如需传入多个参数,一行一个值,可输入任何内容或调用字段</p>'+'<p>请按函数传参,否则运行出错!</p>'+'<p>如需扩展系统函数,请在根目录/data/config.php中添加配置</p>'+"<p>'EXTEND_PROCESS_IF'=&gt;array('PHP函数名'=&gt;'描述')</p>"+'<p>如需扩展插件函数,可创建<a href="'+ulink('develop/func?module=processIf')+'" target="_blank">函数插件</a></p>'}else if(module=='downloadImg'||module=='contentSign'){window.open(ulink('develop/func?module='+module));return!1}
function tipsPluginFunc(module){var tips='';if(module=='process'){tips='<p>如需扩展系统函数,请在根目录/data/config.php中添加配置</p>'+"<p>'EXTEND_PROCESS_FUNC'=&gt;array('PHP函数名'=&gt;'描述')</p>"+'<p>如需扩展插件函数,可创建<a href="'+ulink('develop/func?module=process')+'" target="_blank">函数插件</a></p>'}else if(module=='processIf'){tips='<p>选择函数,取反可获取函数结果的相反值</p>'+'<p>默认将当前字段作为参数传入,如需传入多个参数,一行一个值,可输入任何内容或调用字段</p>'+'<p>请按函数传参,否则运行出错!</p>'+'<p>如需扩展系统函数,请在根目录/data/config.php中添加配置</p>'+"<p>'EXTEND_PROCESS_IF'=&gt;array('PHP函数名'=&gt;'描述')</p>"+'<p>如需扩展插件函数,可创建<a href="'+ulink('develop/func?module=processIf')+'" target="_blank">函数插件</a></p>'}else if(module=='downloadImg'||module=='contentSign'){window.open(ulink('develop/func?module='+module));return!1}
confirmRight({msg:tips,yes:'确定',width:500,textAlign:'left'})}
function tipsCurlPost(){var tips='<p>表单数据模拟form表单输入的数据</p><p>表单上传模拟form表单输入并上传的数据</p>'+'<p>JSON数组以json格式发送数据可在“发送数据”的值中直接输入json字符串根节点名称使用###表示,子节点名称使用.分隔例如a.b.c</p>';confirmRight({msg:tips,yes:'确定',width:500,textAlign:'left'})}
function collectorWindow(title,uri,uriVals,options){options=options?options:{};options.backdrop_static=1;title=isNull(title)?'':title;title+='<div class="loading-sm" style="margin-left:5px;"></div>';window.win_collector_window_params={title:title,uri:uri,uriVals:uriVals,options:options};windowModal(title,ulink('admin/collector/echo_msg?op=run'),{lg:options.lg})}
var collectorEchoMsg={config:{},processes:{},close_non_stop:!1,end_set_timeout:null,run:function(config){collectorEchoMsg.config=isObject(config)?config:{};collectorEchoMsg.processes={};collectorEchoMsg.close_non_stop=!1;var winParams=window.win_collector_window_params;winParams=isObject(winParams)?winParams:{};var uri=winParams.uri?winParams.uri:'';var uriVals=isObject(winParams.uriVals)?winParams.uriVals:{};var options=isObject(winParams.options)?winParams.options:{};var winProcessBox=$('#myModal #win_cem_process_box').clone();if(uri){var title=winParams.title+'<small style="margin-left:10px;">日志读取间隔<input type="number" class="form-control input-sm" style="display:inline;width:40px;height:20px;padding:1px 2px 1px 2px;margin:0px 3px 0px 3px;" id="win_cem_interval" value="'+collectorEchoMsg.get_interval()+'" />秒<button type="button" class="btn btn-default btn-xs" id="win_cem_interval_btn" style="margin-left:3px;">保存</button>';var closeFuncs=new Array();if(!isNull(options.close_func)){if(isObject(options.close_func)){closeFuncs=options.close_func}else{closeFuncs.push(options.close_func)}}
closeFuncs.push(function(){if(!collectorEchoMsg.close_non_stop){collectorEchoMsg.stop_all()}});options.close_func=closeFuncs;windowIframe(title,'',options);$('#myModal #myModalIframe').hide();$('#myModal #win_cem_interval_btn').bind('click',function(){collectorEchoMsg.set_interval($('#win_cem_interval').val())});var runUrl=ulink(uri,uriVals);ajaxOpen({type:'get',url:runUrl,dataType:'json',async:!0,success:function(data){if(data.code==1){var processes=data.data?data.data:{};var collectorKey=processes.collector_key?processes.collector_key:'';var processKeys=isObject(processes.process_keys)?processes.process_keys:[];var processNum=processKeys.length;if(!collectorKey||processNum<=0){return}
@ -60,6 +62,8 @@ if(collectorEchoMsg.processes[collectorProcess].read_timeout){window.clearTimeou
winBackstageTask.count();winBackstageTask.status()}})},init_tasks:function(taskType){taskType=toInt(taskType);$('#win_bk_tasks_box_'+(taskType==0?1:0)).html('');$('[id^="win_bk_tasks_box_"] a[data-parent^="#win_bk_tasks_box_"]').bind('click',function(){var curTaskId=$($(this).attr('href')).attr('data-task-id');var curTaskType=$(this).parents('[id^="win_bk_tasks_nav_"]').eq(0).attr('data-task-type');winBackstageTask.collected(curTaskId,curTaskType)});$('[id^="win_bk_tasks_box_"] .fa-remove').bind('click',function(){var obj=$(this);var curTaskId=$(this).attr('data-task-id');ajaxOpen({type:'get',dataType:'json',async:!0,url:ulink('admin/task/bkdelete?id='+curTaskId),success:function(data){obj.parents('.panel').remove();var spanObj=$('#win_backstage_task').find('a[href="#win_bk_tasks_nav_'+taskType+'"]').find('span');var spanCount=spanObj.text();spanCount=spanCount?parseInt(spanCount):0;spanCount=spanCount>0?(spanCount-1):0;spanObj.text(spanCount)}})});$('#win_bk_tasks_box_'+taskType+' .pagination').addClass('pagination-sm');$('#win_bk_tasks_box_'+taskType+' .pagination a').bind('click',function(){var curTaskType=$(this).parents('[id^="win_bk_tasks_nav_"]').eq(0).attr('data-task-type');winBackstageTask.tasks(curTaskType,$(this).attr('href'));return!1})},collected:function(taskId,taskType,url){if(!url){url=ulink('admin/backstage/backstageTask?op=collected&tid='+taskId)}
ajaxOpen({type:'get',dataType:'html',async:!0,url:url,success:function(data){$('#win_bk_collected_'+taskId).html(data)},complete:function(){if(!isNull(taskType)&&0==toInt(taskType)){winBackstageTask.collected_set_timeout=window.setTimeout(function(){var isEnd=$('#win_bk_tasks_box_0').find('a[href="#win_bk_collected_'+taskId+'"]').attr('data-is-end');var isVisible=$('#win_bk_tasks_box_0 #win_bk_collected_'+taskId).is(':visible');if(!isEnd&&isVisible){winBackstageTask.collected(taskId,taskType,url)}else{window.clearTimeout(winBackstageTask.collected_set_timeout)}},3000)}}})},init_collected:function(taskStatus,taskId){$('[id^="win_bk_collected_"] .pagination').addClass('pagination-sm');$('[id^="win_bk_collected_"] .pagination a').bind('click',function(){var curTaskId=$(this).parents('[id^="win_bk_collected_"]').eq(0).attr('data-task-id');var curTaskType=$(this).parents('[id^="win_bk_tasks_nav_"]').eq(0).attr('data-task-type');winBackstageTask.collected(curTaskId,curTaskType,$(this).attr('href'));return!1});if(taskStatus&&taskId){winBackstageTask.set_task_end(taskId,taskStatus);winBackstageTask.count();winBackstageTask.status()}},set_task_end:function(taskId,status){if(taskId&&status){$('#win_bk_tasks_box_0').find('a[href="#win_bk_collected_'+taskId+'"]').attr('data-is-end','1').find('.is_loading').html('<small>'+status+'</small>')}},status_set_timeout:null,status:function(isLoop){if(!isLoop){window.clearTimeout(winBackstageTask.status_set_timeout)}
var taskIds=[];$('#win_bk_tasks_box_0').find('[id^="win_bk_collected_"]').each(function(){var taskId=$(this).attr('data-task-id');taskIds.push(taskId)});if(taskIds.length>0){ajaxOpen({type:'post',dataType:'json',async:!0,data:{tids:taskIds},url:ulink('admin/backstage/backstageTask?op=status'),success:function(data){var statusList=data.data;if(isObject(statusList)){for(var tid in statusList){if(statusList[tid]){winBackstageTask.set_task_end(tid,statusList[tid])}}}
var isVisible=$('#win_bk_tasks_box_0').is(':visible');var isEnd=!0;$('#win_bk_tasks_box_0').find('a[href^="#win_bk_collected_"]').each(function(){if(!$(this).attr('data-is-end')){isEnd=!1;return!1}});if(!isEnd&&isVisible){winBackstageTask.status_set_timeout=window.setTimeout(function(){winBackstageTask.status(!0)},3000)}else{window.clearTimeout(winBackstageTask.status_set_timeout)}}})}}};function ajax_check_userpwd(ajaxSet){var oldSuccess=ajaxSet.success;ajaxSet.success=function(data){if(data.data&&data.data._userpwd_){if(data.msg){toastr.error(data.msg)}
confirmRight({closeAfterFunc:!0,yes:'确定',no:'取消',msg:('<div style="margin-bottom:8px;">该操作需要验证您的登录密码</div><input class="form-control" type="password" id="confirm_ipt_userpwd" />')},function(){var ajaxSetData=isNull(ajaxSet.data)?{}:ajaxSet.data;var userpwd=$('#confirm_ipt_userpwd').val();if(typeof(ajaxSetData)=='object'){ajaxSetData._userpwd_=userpwd}else{ajaxSetData=ajaxSetData?(ajaxSetData+'&'):'';ajaxSetData+='_userpwd_='+encodeURIComponent(userpwd)}
ajaxSet.data=ajaxSetData;ajaxSet.success=oldSuccess;ajax_check_userpwd(ajaxSet)});$('body').on('keyup','#confirm_ipt_userpwd',function(event){if(event.keyCode=="13"){$('#confirm_right .cr-btn-yes').trigger("click")}})}else{if(oldSuccess&&typeof(oldSuccess)=='function'){oldSuccess(data)}}};ajaxOpen(ajaxSet)}
var isVisible=$('#win_bk_tasks_box_0').is(':visible');var isEnd=!0;$('#win_bk_tasks_box_0').find('a[href^="#win_bk_collected_"]').each(function(){if(!$(this).attr('data-is-end')){isEnd=!1;return!1}});if(!isEnd&&isVisible){winBackstageTask.status_set_timeout=window.setTimeout(function(){winBackstageTask.status(!0)},3000)}else{window.clearTimeout(winBackstageTask.status_set_timeout)}}})}}};function ajax_check_userpwd(ajaxSet){var oldSuccess=ajaxSet.success;ajaxSet.success=function(data){if(data.data&&data.data._check_pwd_){if(data.msg){toastr.error(data.msg)}
var msg='<div style="text-align:left;"><div style="margin-bottom:8px;">该操作需要验证您的登录密码</div>'+'<input class="form-control" type="password" id="confirm_ipt_check_pwd" placeholder="登录密码" />'+'<div class="checkbox" style="margin-bottom:0;"><label><input type="checkbox" value="1" id="confirm_ipt_check_skip" > 1小时内不再验证</label></div></div>';confirmRight({closeAfterFunc:!0,yes:'确定',no:'取消',msg:msg},function(){var ajaxSetData=isNull(ajaxSet.data)?{}:ajaxSet.data;var checkPwd=$('#confirm_ipt_check_pwd').val();var checkSkip=$('#confirm_ipt_check_skip').is(':checked')?1:'';if(typeof(ajaxSetData)=='object'){ajaxSetData._check_pwd_=checkPwd;ajaxSetData._check_skip_=checkSkip}else{ajaxSetData=ajaxSetData?(ajaxSetData+'&'):'';ajaxSetData+='_check_pwd_='+encodeURIComponent(checkPwd);ajaxSetData+='&_check_skip_='+encodeURIComponent(checkSkip)}
ajaxSet.data=ajaxSetData;ajaxSet.success=oldSuccess;ajax_check_userpwd(ajaxSet)});$('body').on('keyup','#confirm_ipt_check_pwd',function(event){if(event.keyCode=="13"){$('#confirm_right .cr-btn-yes').trigger("click")}})}else{if(oldSuccess&&typeof(oldSuccess)=='function'){oldSuccess(data)}}};ajaxOpen(ajaxSet)}
function editorCodeIfr(ifrEle,options){options=isObject(options)?options:{};if(options.set_value!=null&&typeof(options.set_value)!='undefined'){$(document).ready(function(){$(ifrEle).attr('src','');$(ifrEle).attr('src',ulink('develop/editor_code'));$(ifrEle).off('load').bind('load',function(){if(options.set_value&&$(ifrEle)[0].contentWindow.set_editor_code){$(ifrEle)[0].contentWindow.set_editor_code(options.set_value)}})})}else if(options.get_value){var ifrEle=$(ifrEle)[0];var val='';if(ifrEle&&ifrEle.contentWindow.get_editor_code){val=ifrEle.contentWindow.get_editor_code()}
return val}}

View File

@ -0,0 +1,13 @@
/*
|--------------------------------------------------------------------------
| SkyCaiji (蓝天采集器)
|--------------------------------------------------------------------------
| Copyright (c) 2018 https://www.skycaiji.com All rights reserved.
|--------------------------------------------------------------------------
| 使用协议 https://www.skycaiji.com/licenses
|--------------------------------------------------------------------------
*/
'use strict';function CodeEditorClass(){}
CodeEditorClass.prototype={constructor:CodeEditorClass,init_deve:function(config){var $_o=this;config=config?config:{};$('#btn_editor_save').bind('click',function(){ajax_check_userpwd({type:'POST',dataType:'json',url:ulink('develop/editor_save'),data:{type:config.type,module:config.module,app:config.app,appcode:$_o.editor_get_value()},beforeSend:function(){$('#btn_editor_save').attr('disabled',!0)},success:function(data){ajaxDataMsg(data)},complete:function(){$('#btn_editor_save').removeAttr('disabled')}})});var editorHeight=$(document.body).height()-$('#deve_editor_main').offset().top;editorHeight=parseInt(editorHeight)-60;$('#code_editor_box').height(editorHeight);$_o.editor_iframe($('#code_editor_txt').val());var appsScroll=!1;var deveAppsNav=$('#deve_editor_main .deve-editor-apps-nav');if(deveAppsNav.height()>editorHeight){appsScroll=!0;deveAppsNav.css('overflow-y','scroll')}
deveAppsNav.css('height',editorHeight+'px');if(appsScroll){var curApp=$('.deve-editor-apps .cur');if(curApp.length>0){var curAppTop=curApp.offset().top-deveAppsNav.offset().top;if(curAppTop>editorHeight){deveAppsNav.scrollTop(curAppTop-(editorHeight/2)-20)}}}},editor_iframe:function(appcode){var $_o=this;$('#code_editor_ifr').attr('src',ulink('develop/editor_code'));$('#code_editor_ifr').off('load').bind('load',function(){$_o.editor_set_value(appcode)})},editor_get_value:function(){return $('#code_editor_ifr')[0].contentWindow.get_editor_code()},editor_set_value:function(val){$('#code_editor_ifr')[0].contentWindow.set_editor_code(val)}}
var codeEditorClass=new CodeEditorClass()

View File

@ -7,10 +7,10 @@
| 使用协议 https://www.skycaiji.com/licenses
|--------------------------------------------------------------------------
*/
'use strict';function CollectorPattern(){this.formid='#form_coll';this.cpContentSign=null;this.cpFrontUrl=null;this.cpLevelUrl=null;this.cpRelationUrl=null;this.cpPagination=null;this.cpField=null;this.cpProcess=null}
CollectorPattern.prototype={constructor:CollectorPattern,init:function(){var $_o=this;$($_o.formid).bind('submit',function(){$('#coll_tab_content').find('.tab-pane[id^="coll_pattern_"]').each(function(){if($(this).hasClass('active')){$($_o.formid+' [name="tab_link"]').val($(this).attr('id'));return}});var settings=getFormAjaxSettings($(this));ajaxOpen(settings);return!1});$_o.cpContentSign=new CpContentSign($_o);$_o.cpFrontUrl=new CpFrontUrl($_o);$_o.cpLevelUrl=new CpLevelUrl($_o);$_o.cpRelationUrl=new CpRelationUrl($_o);$_o.cpPagination=new CpPagination($_o);$_o.cpField=new CpField($_o);$_o.cpProcess=new CpProcess($_o);inputSelectCustom($_o.formid+' select[name="config[charset]"]','config[charset_custom]');$($_o.formid+' #coll_pattern_request_headers .dm-useragent li a').bind('click',function(){$($_o.formid+' [name="config[request_headers][useragent]"]').val($(this).attr('data-useragent'))});$($_o.formid+' #coll_pattern_request_headers .add-request-header').bind('click',function(){$_o.add_request_header('','')});$($_o.formid+' #coll_pattern_request_headers .add-request-header-img').bind('click',function(){$_o.add_request_header_img('','')});$($_o.formid+' .c-p-request-headers').on('click','.delete-request-header',function(){$(this).parents('tr').eq(0).remove()});$($_o.formid+' .c-p-request-headers-img').on('click','.delete-request-header-img',function(){$(this).parents('tr').eq(0).remove()});$_o.init_page_list_op('front_url');$(this.formid+' #coll_pattern_source_url .add-source-url').bind('click',function(){windowModal('添加起始网址',ulink("cpattern/source"),{lg:1})});$(this.formid+' #coll_pattern_source_url .clear-source-url').bind('click',function(){$_o.source_op('clear_all')});$(this.formid+' #coll_pattern_source_url').on('click','.edit-source-url',function(){var parent=$(this).parents('[id^="source_url_"]').eq(0);var objid=parent.attr('id');var sourceUrl=parent.find('[name="config[source_url][]"]').val();sourceUrl=sourceUrl?sourceUrl:'';var url=ulink("cpattern/source");var options={lg:1};if(objid||sourceUrl){options.ajax={type:'post',data:{'source_url':sourceUrl,'objid':objid}}}
windowModal('添加起始网址',url,options)});$(this.formid+' #coll_pattern_source_url').on('click','.delete-source-url',function(){var obj=$(this);confirmRight(window.tpl_lang.confirm_delete,function(){obj.parents('[id^="source_url_"]').eq(0).remove()})});eleExchange(this.formid+' #coll_pattern_source_url','.icon-drag-move','[id^="source_url_"]');$(this.formid+' [name="config[source_is_url]"]').bind('click',function(){if($_o.source_is_url()){$('#alert_coll_pattern_link').show();$('#panel_coll_pattern_source_url_web').hide();$('#panel_coll_pattern_source_url_content_sign').hide();$('#panel_coll_pattern_source_url_pagination').hide();$('#panel_coll_pattern_level_url').hide();$('#panel_coll_pattern_url_content_sign').siblings('.panel').hide();$('#panel_coll_pattern_url_web').show()}else{$('#alert_coll_pattern_link').hide();$('#panel_coll_pattern_source_url_web').show();$('#panel_coll_pattern_source_url_content_sign').show();$('#panel_coll_pattern_source_url_pagination').show();$('#panel_coll_pattern_level_url').show();$('#panel_coll_pattern_url_content_sign').siblings('.panel').show()}});$_o.init_page('source_url');$_o.init_page('url');$($_o.formid).on('click','.c-p-url-page-signs .btn-page-signs',function(){$_o.parent_page_signs(this)});$_o.init_page_list_op('level_url');$_o.init_page_list_op('relation_url');$(this.formid+' #coll_pattern_field').on('click','.add-field',function(){$_o.field_editor(null,null)});$(this.formid+' #coll_pattern_field').on('click','.field-name',function(){$_o.field_editor($(this),null)});$(this.formid+' #coll_pattern_field').on('click','.add-field-default',function(){$_o.cpField.add_default()});$(this.formid+' #coll_pattern_field').on('click','.sort-field',function(){var fieldNames=$_o.get_field_names(!0);for(var i in fieldNames){var fieldTr=$($_o.formid+' #coll_pattern_field').find('.field-name[data-val="'+fieldNames[i]+'"]').parents('tr[id^="field_"]').eq(0);if(fieldTr.length>0){$($_o.formid+' #coll_pattern_field .c-p-field-list tbody').append(fieldTr)}}
toastr.success('调整完成')});$(this.formid+' #coll_pattern_field').on('click','.field-del',function(){var obj=$(this);confirmRight(window.tpl_lang.confirm_delete,function(){$_o.field_delete_tr(obj)})});$(this.formid+' #coll_pattern_field').on('click','.field-clone',function(){var tr=$(this).parents('tr[id^="field_"]').eq(0);var field=tr.find('[name="config[field_list][]"]').val();var process=tr.find('[name="config[field_process][]"]').val();confirmRight('确定复制字段?',function(){ajaxOpen({type:'POST',dataType:'json',url:ulink("cpattern/clone_field"),data:{field:field,process:process},success:function(data){if(data.code==1){data=data.data;var hasField=!1;do{data.field.name+='_1';hasField=$('#coll_pattern_field .c-p-field-list').find('.field-name[data-val="'+data.field.name+'"]');if(hasField&&hasField.length>0){hasField=!0}else{hasField=!1}}while(hasField);$_o.cpField.add(null,data.field,data.process);toastr.success('字段复制成功:'+data.field.name)}else{toastr.error(data.msg)}}})})});$(this.formid+' #coll_pattern_field').on('click','.field-process',function(){var process=$(this).parent().find('input[name="config[field_process][]"]').val();var prt=$(this).parents('tr[id^="field_"]').eq(0);var objid=prt.attr('id');var field=prt.find('.field-name').attr('data-val');var url=ulink("cpattern/process?field=_field_",{'_field_':field});windowModal('数据处理:'+field+'<small><a href="javascript:;" id="window_process_paste" title="粘贴" class="glyphicon glyphicon-paste" style="margin-left:7px;color:#888;"></a></small>',url,{lg:1,ajax:{type:'post',data:{objid:objid,process:process}}});$_o.process_paste()});$(this.formid+' #coll_pattern_process').on('click','.add-process',function(){var url=ulink("cpattern/process?type=common");windowModal('数据处理(通用)<small><a href="javascript:;" id="window_process_paste" title="粘贴" class="glyphicon glyphicon-paste" style="color:#888;"></a></small>',url,{lg:1});$_o.process_paste()});eleExchange(this.formid+' #coll_pattern_field','.icon-drag-move','tr[id^="field_"]');$(this.formid+' [name="effective"]').val(1)},load:function(config){var $_o=this;if(config){$(this.formid+' [name="config[charset]"]').val(config.charset).trigger('change');$(this.formid+' [name="config[charset_custom]"]').val(config.charset_custom);$(this.formid+' [name="config[url_complete]"][value="'+parseInt(config.url_complete)+'"]').prop('checked','checked');$(this.formid+' [name="config[url_reverse]"][value="'+parseInt(config.url_reverse)+'"]').prop('checked','checked');$(this.formid+' [name="config[page_render]"][value="'+parseInt(config.page_render)+'"]').prop('checked','checked');$(this.formid+' [name="config[url_repeat]"][value="'+parseInt(config.url_repeat)+'"]').prop('checked','checked');if(config.regexp_flags){for(var i in config.regexp_flags){$(this.formid).find('[name="config[regexp_flags][]"][value="'+config.regexp_flags[i]+'"]').prop('checked',!0)}}
'use strict';function CollectorPattern(){this.formid='#form_coll';this.cpFrontUrl=null;this.cpLevelUrl=null;this.cpRelationUrl=null;this.cpUrlWeb=null;this.cpRenderer=null;this.cpContentSign=null;this.cpPagination=null;this.cpField=null;this.cpProcess=null}
CollectorPattern.prototype={constructor:CollectorPattern,init_test:function(){var $_o=this;$_o.formid='#win_form_cache';$_o.cpUrlWeb=new CpUrlWeb($_o);$_o.cpRenderer=new CpRenderer($_o);$_o.cpUrlWeb.page_init('test');$_o.cpRenderer.page_init('test')},init:function(){var $_o=this;$($_o.formid).bind('submit',function(){$('#coll_tab_content').find('.tab-pane[id^="coll_pattern_"]').each(function(){if($(this).hasClass('active')){$($_o.formid+' [name="tab_link"]').val($(this).attr('id'));return}});var settings=getFormAjaxSettings($(this));ajaxOpen(settings);return!1});$_o.cpFrontUrl=new CpFrontUrl($_o);$_o.cpLevelUrl=new CpLevelUrl($_o);$_o.cpRelationUrl=new CpRelationUrl($_o);$_o.cpUrlWeb=new CpUrlWeb($_o);$_o.cpRenderer=new CpRenderer($_o);$_o.cpContentSign=new CpContentSign($_o);$_o.cpPagination=new CpPagination($_o);$_o.cpField=new CpField($_o);$_o.cpProcess=new CpProcess($_o);inputSelectCustom($_o.formid+' select[name="config[charset]"]','config[charset_custom]',null,null,function(){$_o.cpUrlWeb.def_config_charset('')});inputSelectCustom($_o.formid+' select[name="config[encode]"]','config[encode_custom]',null,null,function(){$_o.cpUrlWeb.def_config_encode('')});$($_o.formid+' [name="config[page_render]"]').bind('click',function(){$_o.cpRenderer.def_config_renderer_open('')});$($_o.formid+' [name="config[request_headers][open]"]').bind('click',function(){$_o.cpUrlWeb.def_config_header_global('')});$($_o.formid+' #coll_pattern_request_headers .dm-useragent li a').bind('click',function(){$($_o.formid+' [name="config[request_headers][useragent]"]').val($(this).attr('data-useragent'))});$($_o.formid+' #coll_pattern_request_headers .add-request-header').bind('click',function(){$_o.add_request_header('','')});$($_o.formid+' #coll_pattern_request_headers .add-request-header-img').bind('click',function(){$_o.add_request_header_img('','')});$($_o.formid+' .c-p-request-headers').on('click','.delete-request-header',function(){$(this).parents('tr').eq(0).remove()});$($_o.formid+' .c-p-request-headers-img').on('click','.delete-request-header-img',function(){$(this).parents('tr').eq(0).remove()});$_o.init_page_list_op('front_url');$(this.formid+' #coll_pattern_source_url .add-source-url').bind('click',function(){windowModal('添加起始网址',ulink("cpattern/source"),{lg:1})});$(this.formid+' #coll_pattern_source_url .clear-source-url').bind('click',function(){$_o.source_op('clear_all')});$(this.formid+' #coll_pattern_source_url').on('click','.edit-source-url',function(){var parent=$(this).parents('[id^="source_url_"]').eq(0);var objid=parent.attr('id');var sourceUrl=parent.find('[name="config[source_url][]"]').val();sourceUrl=sourceUrl?sourceUrl:'';var url=ulink("cpattern/source");var options={lg:1};if(objid||sourceUrl){options.ajax={type:'post',data:{'source_url':sourceUrl,'objid':objid}}}
windowModal('添加起始网址',url,options)});$(this.formid+' #coll_pattern_source_url').on('click','.delete-source-url',function(){var obj=$(this);confirmRight(window.tpl_lang.confirm_delete,function(){obj.parents('[id^="source_url_"]').eq(0).remove()})});eleExchange(this.formid+' #coll_pattern_source_url','.icon-drag-move','[id^="source_url_"]');$(this.formid+' [name="config[source_is_url]"]').bind('click',function(){if($_o.source_is_url()){$('#alert_coll_pattern_link').show();$('#panel_coll_pattern_source_url_web').hide();$('#panel_coll_pattern_source_url_renderer').hide();$('#panel_coll_pattern_source_url_content_sign').hide();$('#panel_coll_pattern_source_url_pagination').hide();$('#panel_coll_pattern_level_url').hide();$('#panel_coll_pattern_url_content_sign').siblings('.panel').hide();$('#panel_coll_pattern_url_web').show();$('#panel_coll_pattern_url_renderer').show()}else{$('#alert_coll_pattern_link').hide();$('#panel_coll_pattern_source_url_web').show();$('#panel_coll_pattern_source_url_renderer').show();$('#panel_coll_pattern_source_url_content_sign').show();$('#panel_coll_pattern_source_url_pagination').show();$('#panel_coll_pattern_level_url').show();$('#panel_coll_pattern_url_content_sign').siblings('.panel').show()}});$_o.init_page('source_url');$_o.init_page('url');$($_o.formid).on('click','.c-p-url-page-signs .btn-page-signs',function(){$_o.parent_page_signs(this)});$_o.init_page_list_op('level_url');$_o.init_page_list_op('relation_url');$(this.formid+' #coll_pattern_field').on('click','.add-field',function(){$_o.field_editor(null,null)});$(this.formid+' #coll_pattern_field').on('click','.field-name',function(){$_o.field_editor($(this),null)});$(this.formid+' #coll_pattern_field').on('click','.add-field-default',function(){$_o.cpField.add_default()});$(this.formid+' #coll_pattern_field').on('click','.sort-field',function(){var fieldNames=$_o.get_field_names(!0);for(var i in fieldNames){var fieldTr=$($_o.formid+' #coll_pattern_field').find('.field-name[data-val="'+fieldNames[i]+'"]').parents('tr[id^="field_"]').eq(0);if(fieldTr.length>0){$($_o.formid+' #coll_pattern_field .c-p-field-list tbody').append(fieldTr)}}
toastr.success('调整完成')});$(this.formid+' #coll_pattern_field').on('click','.field-del',function(){var obj=$(this);confirmRight(window.tpl_lang.confirm_delete,function(){$_o.field_delete_tr(obj)})});$(this.formid+' #coll_pattern_field').on('click','.field-clone',function(){var tr=$(this).parents('tr[id^="field_"]').eq(0);var field=tr.find('[name="config[field_list][]"]').val();var process=tr.find('[name="config[field_process][]"]').val();confirmRight('确定复制字段?',function(){ajaxOpen({type:'POST',dataType:'json',url:ulink("cpattern/clone_field"),data:{field:field,process:process},success:function(data){if(data.code==1){data=data.data;var hasField=!1;do{data.field.name+='_1';hasField=$('#coll_pattern_field .c-p-field-list').find('.field-name[data-val="'+data.field.name+'"]');if(hasField&&hasField.length>0){hasField=!0}else{hasField=!1}}while(hasField);$_o.cpField.add(null,data.field,data.process);toastr.success('字段复制成功:'+data.field.name)}else{toastr.error(data.msg)}}})})});$(this.formid+' #coll_pattern_field').on('click','.field-process',function(){var process=$(this).parent().find('input[name="config[field_process][]"]').val();var prt=$(this).parents('tr[id^="field_"]').eq(0);var objid=prt.attr('id');var field=prt.find('.field-name').attr('data-val');var url=ulink("cpattern/process?field=_field_",{'_field_':field});windowModal('数据处理:'+field+'<small><a href="javascript:;" id="window_process_paste" title="粘贴" class="glyphicon glyphicon-paste" style="margin-left:7px;color:#888;"></a></small>',url,{lg:1,ajax:{type:'post',data:{objid:objid,process:process}}});$_o.process_paste()});$(this.formid+' #coll_pattern_process').on('click','.add-process',function(){var url=ulink("cpattern/process?type=common");windowModal('数据处理(通用)<small><a href="javascript:;" id="window_process_paste" title="粘贴" class="glyphicon glyphicon-paste" style="color:#888;"></a></small>',url,{lg:1});$_o.process_paste()});eleExchange(this.formid+' #coll_pattern_field','.icon-drag-move','tr[id^="field_"]');$(this.formid+' [name="effective"]').val(1)},load:function(config){var $_o=this;if(config){$(this.formid+' [name="config[charset_custom]"]').val(config.charset_custom);$(this.formid+' [name="config[charset]"]').val(config.charset).trigger('change');$(this.formid+' [name="config[encode_custom]"]').val(config.encode_custom);$(this.formid+' [name="config[encode]"]').val(config.encode).trigger('change');$(this.formid+' [name="config[url_complete]"][value="'+toInt(config.url_complete)+'"]').prop('checked',!0);$(this.formid+' [name="config[url_reverse]"][value="'+toInt(config.url_reverse)+'"]').prop('checked',!0);$(this.formid+' [name="config[page_render]"][value="'+toInt(config.page_render)+'"]').prop('checked',!0).trigger('click');$(this.formid+' [name="config[url_repeat]"][value="'+toInt(config.url_repeat)+'"]').prop('checked',!0);$(this.formid+' [name="config[url_no_name]"][value="'+toInt(config.url_no_name)+'"]').prop('checked',!0);if(config.regexp_flags){for(var i in config.regexp_flags){$(this.formid).find('[name="config[regexp_flags][]"][value="'+config.regexp_flags[i]+'"]').prop('checked',!0)}}
if(isObject(config.front_urls)){for(var i in config.front_urls){$_o.cpFrontUrl.add(null,config.front_urls[i])}
showPanelCollapse('#coll_pattern_front_url')}
if(config.source_url){var source_url_html_list='';var sourceParams={get:1};for(var i in config.source_url){sourceParams.source_url=config.source_url[i];source_url_html_list+=this.source_op('add',sourceParams)}
@ -23,20 +23,17 @@ if(isObject(config.relation_urls)){for(var i in config.relation_urls){$_o.cpRela
showPanelCollapse('#coll_pattern_relation_url')}
if(config.field_list&&config.field_list.length>0){this.cpField.clearall();for(var i in config.field_list){var fieldProcess=null;if(config.field_process){fieldProcess=config.field_process[i]}
this.cpField.add(null,config.field_list[i],fieldProcess)}}
if(config.field_title){$(this.formid+' [name="config[field_title]"]').each(function(){if($(this).val()==config.field_title){$(this).prop('checked','checked')}})}
if(config.field_title){$(this.formid+' [name="config[field_title]"]').each(function(){if($(this).val()==config.field_title){$(this).prop('checked',!0)}})}
if(config.common_process&&config.common_process.length>0){showPanelCollapse('#coll_pattern_process');ajaxOpen({type:'post',url:ulink("cpattern/process?type=common&op=load"),data:{process:config.common_process},dataType:'html',beforeSend:function(){$($_o.cpProcess.processForm+' .c-p-process-accordion').append('<div class="loading" style="margin:5px 0 0 -5px;"></div>')},success:function(data){$('body').append(data)},complete:function(){$($_o.cpProcess.processForm+' .c-p-process-accordion').find('.loading').remove()}})}
if(config.request_headers){var r_h_params=new Array('useragent','cookie','referer');for(var i in r_h_params){$(this.formid+' [name="config[request_headers]['+r_h_params[i]+']"]').val(config.request_headers[r_h_params[i]])}
if(config.request_headers.custom_names){var r_h_vals=config.request_headers.custom_vals?config.request_headers.custom_vals:{};for(var i in config.request_headers.custom_names){$_o.add_request_header(config.request_headers.custom_names[i],r_h_vals[i])}}
var r_h_radios=new Array('open','img','img_use_page');for(var i in r_h_radios){var rhr_v=config.request_headers[r_h_radios[i]];if(r_h_radios[i]!='img_use_page'){rhr_v=parseInt(rhr_v)}
$(this.formid+' [name="config[request_headers]['+r_h_radios[i]+']"][value="'+rhr_v+'"]').trigger('click')}
if(toInt(config.request_headers.open)>0){showPanelCollapse('#coll_pattern_request_headers');showPanelCollapse('#c_p_request_headers_open')}
if(toInt(config.request_headers.img)>0){showPanelCollapse('#coll_pattern_request_headers');showPanelCollapse('#c_p_request_headers_img')}
if(config.request_headers){$(this.formid+' [name="config[request_headers][useragent]"]').val(config.request_headers.useragent);$(this.formid+' [name="config[request_headers][cookie]"]').val(config.request_headers.cookie);$(this.formid+' [name="config[request_headers][referer]"]').val(config.request_headers.referer);if(config.request_headers.custom_names){var r_h_vals=config.request_headers.custom_vals?config.request_headers.custom_vals:{};for(var i in config.request_headers.custom_names){$_o.add_request_header(config.request_headers.custom_names[i],r_h_vals[i])}}
config.request_headers.open=toInt(config.request_headers.open);config.request_headers.img=toInt(config.request_headers.img);$(this.formid+' [name="config[request_headers][open]"][value="'+config.request_headers.open+'"]').prop('checked',!0).trigger('click');$(this.formid+' [name="config[request_headers][img]"][value="'+config.request_headers.img+'"]').prop('checked',!0);$(this.formid+' [name="config[request_headers][img_use_page]"][value="'+config.request_headers.img_use_page+'"]').prop('checked',!0);if(config.request_headers.open>0){showPanelCollapse('#coll_pattern_request_headers');showPanelCollapse('#c_p_request_headers_open')}
if(config.request_headers.img>0){showPanelCollapse('#coll_pattern_request_headers');showPanelCollapse('#c_p_request_headers_img')}
if(config.request_headers.img_names){var r_h_img_vals=config.request_headers.img_vals?config.request_headers.img_vals:{};for(var i in config.request_headers.img_names){$_o.add_request_header_img(config.request_headers.img_names[i],r_h_img_vals[i])}}}}
$(this.formid+' [name="effective_edit"]').val(1)},get_page_vars:function(pageType,returnKey){var title='';var boxId='';var namePre='';var formId='';if('front_url'==pageType){title='前置页';boxId='#c_p_front_url';namePre='front_url';formId=this.cpFrontUrl.formObj}else if('source_url'==pageType){title='起始页';boxId='#coll_pattern_source_url';namePre='config[source_config]';formId=this.formid}else if('level_url'==pageType){title='多级页';boxId='#c_p_level_url';namePre='level_url';formId=this.cpLevelUrl.formObj}else if('relation_url'==pageType){title='关联页';boxId='#c_p_relation_url';namePre='relation_url';formId=this.cpRelationUrl.formObj}else if('url'==pageType){title='内容页';boxId='#coll_pattern_url';namePre='config';formId=this.formid}
$(this.formid+' [name="effective_edit"]').val(1)},get_page_vars:function(pageType,returnKey){var title='';var boxId='';var namePre='';var formId='';if('front_url'==pageType){title='前置页';boxId='#c_p_front_url';namePre='front_url';formId=this.cpFrontUrl.formObj}else if('source_url'==pageType){title='起始页';boxId='#coll_pattern_source_url';namePre='config[source_config]';formId=this.formid}else if('level_url'==pageType){title='多级页';boxId='#c_p_level_url';namePre='level_url';formId=this.cpLevelUrl.formObj}else if('relation_url'==pageType){title='关联页';boxId='#c_p_relation_url';namePre='relation_url';formId=this.cpRelationUrl.formObj}else if('url'==pageType){title='内容页';boxId='#coll_pattern_url';namePre='config';formId=this.formid}else if('test'==pageType){title='';boxId='#win_coll_pattern_test';namePre='config';formId='#win_form_test'}
var data={title:title,boxId:boxId,namePre:namePre,formId:formId};if(returnKey){return data[returnKey]}else{return data}},page_is_list:function(pageType){if(pageType=='front_url'||pageType=='level_url'||pageType=='relation_url'){return!0}else{return!1}},init_page_list_op:function(pageType){var $_o=this;if(!$_o.page_is_list(pageType)){return}
var pageVars=$_o.get_page_vars(pageType);var listObj='#c_p_'+pageType+'s';var parentObj='[id^="'+pageType+'_"]';$($_o.formid+' #coll_pattern_'+pageType+' .add-'+pageType.replace('_','-')).bind('click',function(){var url=ulink('cpattern/'+pageType);windowModal('添加'+pageVars.title+'规则',url,{lg:1})});$($_o.formid+' '+listObj).on('click','.name',function(){var parent=$(this).parents(parentObj).eq(0);var options={lg:1,ajax:{type:'post',data:{}}};options.ajax.data.objid=parent.attr('id');options.ajax.data[pageType]=parent.find('[name="config['+pageType+'s][]"]').val();windowModal('编辑'+pageVars.title+'规则',ulink('cpattern/'+pageType),options)});$($_o.formid+' '+listObj).on('click','.clone',function(){var parent=$(this).parents(parentObj).eq(0);var pageConfig=parent.find('[name="config['+pageType+'s][]"]').val();var postData={};postData[pageType]=pageConfig;confirmRight('确定复制'+pageVars.title+'',function(){ajaxOpen({type:'POST',dataType:'json',url:ulink('cpattern/clone_'+pageType),data:postData,success:function(data){if(data.code==1){data=data.data;var hasName=!1;do{data[pageType].name+='_1';hasName=$($_o.formid+' '+listObj).find('.name[data-val="'+data[pageType].name+'"]');if(hasName&&hasName.length>0){hasName=!0}else{hasName=!1}}while(hasName);if(pageType=='front_url'){$_o.cpFrontUrl.add(null,data[pageType])}else if(pageType=='level_url'){$_o.cpLevelUrl.add(null,data[pageType])}else if(pageType=='relation_url'){$_o.cpRelationUrl.add(null,data[pageType])}
toastr.success(pageVars.title+'复制成功:'+data[pageType].name)}else{toastr.error(data.msg)}}})})});$($_o.formid+' '+listObj).on('click','.delete',function(){var curObj=$(this);confirmRight('确定删除?',function(){curObj.parents(parentObj).eq(0).remove()})});eleExchange($_o.formid+' '+listObj,'.icon-drag-move','tbody tr')},init_page:function(pageType){var $_o=this;var pageVars=$_o.get_page_vars(pageType);var formId=pageVars.formId;var boxId=pageVars.boxId;var namePre=pageVars.namePre;if(!formId||!boxId||!namePre){return}
$(formId+' select[name="'+namePre+'[area_module]"],select[name="'+namePre+'[url_rule_module]"]').bind('click',function(){$_o.rule_module_slt(this)});var boxUrlWebId=boxId+'_web';$(boxUrlWebId+' [name="'+namePre+'[url_web][open]"]').bind('click',function(){if($(this).val()==1){$(boxUrlWebId+'_open').show()}else{$(boxUrlWebId+'_open').hide()}});inputSelectCustom(boxUrlWebId+' select[name="'+namePre+'[url_web][charset]"]',namePre+'[url_web][charset_custom]');$(boxUrlWebId+' select[name="'+namePre+'[url_web][form_method]"]').bind('change',function(){var obj=$(boxUrlWebId+' .c-p-url-web-content-type');if($(this).val()=='post'){obj.show()}else{obj.hide()}});$(boxUrlWebId+' .add-url-web-form').bind('click',function(){$_o.add_page_url_web(pageType,'form','','')});$(boxUrlWebId+' .c-p-url-web-form').on('click','.delete-url-web-form',function(){$(this).parents('tr').eq(0).remove()});$(boxUrlWebId+' .add-url-web-header').bind('click',function(){$_o.add_page_url_web(pageType,'header','','')});$(boxUrlWebId+' .c-p-url-web-header').on('click','.delete-url-web-header',function(){$(this).parents('tr').eq(0).remove()});$_o.cpContentSign.page_init(pageType);$_o.cpPagination.page_init(pageType)},load_page_rule:function(pageType,config,isPagination){var $_o=this;var pageVars=$_o.get_page_vars(pageType);var formId=pageVars.formId;var boxId=pageVars.boxId;var namePre=pageVars.namePre;if(!config||!formId||!boxId||!namePre){return}
$(formId+' select[name="'+namePre+'[area_module]"],select[name="'+namePre+'[url_rule_module]"]').bind('click',function(){$_o.rule_module_slt(this)});$_o.cpUrlWeb.page_init(pageType);$_o.cpRenderer.page_init(pageType);$_o.cpContentSign.page_init(pageType);$_o.cpPagination.page_init(pageType)},load_page_rule:function(pageType,config,isPagination){var $_o=this;var pageVars=$_o.get_page_vars(pageType);var formId=pageVars.formId;var boxId=pageVars.boxId;var namePre=pageVars.namePre;if(!config||!formId||!boxId||!namePre){return}
if(isPagination){boxId+='_pagination';namePre+='[pagination]'}
if(config.area||config.area_merge){$(formId+' [name="'+namePre+'[area]"]').val(config.area);$(formId+' [name="'+namePre+'[area_merge]"]').val(config.area_merge);showPanelCollapse(boxId+'_area')}
if(config.area_module){$(formId+' select[name="'+namePre+'[area_module]"]').val(config.area_module).trigger('click').trigger('change')}
@ -44,18 +41,9 @@ if(config.url_rule||config.url_merge){$(formId+' [name="'+namePre+'[url_rule]"]'
if(config.url_rule_module){$(formId+' select[name="'+namePre+'[url_rule_module]"]').val(config.url_rule_module).trigger('click').trigger('change')}
if(config.url_must||config.url_ban){$(formId+' [name="'+namePre+'[url_must]"]').val(config.url_must);$(formId+' [name="'+namePre+'[url_ban]"]').val(config.url_ban);showPanelCollapse(boxId+'_filter')}},load_page:function(pageType,config){var $_o=this;var pageVars=$_o.get_page_vars(pageType);var formId=pageVars.formId;var boxId=pageVars.boxId;var namePre=pageVars.namePre;if(!config||!formId||!boxId||!namePre){return}
if(pageType=='level_url'||pageType=='url'||pageType=='relation_url'){$_o.load_page_rule(pageType,config,!1)}
var urlWebConfig=config.url_web?config.url_web:{};var urlWebNamePre=namePre+'[url_web]';urlWebConfig.open=toInt(urlWebConfig.open);if(urlWebConfig.open){$(formId+' [name="'+urlWebNamePre+'[open]"][value="'+urlWebConfig.open+'"]').trigger('click');if(urlWebConfig.open>0){showPanelCollapse(boxId+'_web')}}
if(urlWebConfig.charset){$(formId+' select[name="'+urlWebNamePre+'[charset]"]').val(urlWebConfig.charset).trigger('change')}
if(urlWebConfig.charset_custom){$(formId+' [name="'+urlWebNamePre+'[charset_custom]"]').val(urlWebConfig.charset_custom)}
if(urlWebConfig.form_method){$(formId+' [name="'+urlWebNamePre+'[form_method]"]').val(urlWebConfig.form_method).trigger('change')}
if(urlWebConfig.content_type){$(formId+' [name="'+urlWebNamePre+'[content_type]"]').val(urlWebConfig.content_type)}
if(urlWebConfig.form_names){var urlWebFormVals=urlWebConfig.form_vals?urlWebConfig.form_vals:{};for(var i in urlWebConfig.form_names){$_o.add_page_url_web(pageType,'form',urlWebConfig.form_names[i],urlWebFormVals[i])}}
if(urlWebConfig.header_global){$(formId+' [name="'+urlWebNamePre+'[header_global]"]').val(urlWebConfig.header_global)}
if(urlWebConfig.header_names){var urlWebHeaderVals=urlWebConfig.header_vals?urlWebConfig.header_vals:{};for(var i in urlWebConfig.header_names){$_o.add_page_url_web(pageType,'header',urlWebConfig.header_names[i],urlWebHeaderVals[i])}}
$_o.cpContentSign.page_load(pageType,config.content_signs);$_o.cpPagination.page_load(pageType,config.pagination)},add_page_url_web:function(pageType,type,name,val){var $_o=this;var pageVars=$_o.get_page_vars(pageType);var boxId=pageVars.boxId;var namePre=pageVars.namePre;if(!boxId||!namePre||!type){return}
boxId+='_web';name=name?name:'';val=val?val:'';var tr=$_o.clone_tpl('#coll_tpl_url_web_'+type,namePre);tr.find('[name="'+namePre+'[url_web]['+type+'_names][]"]').val(name);tr.find('[name="'+namePre+'[url_web]['+type+'_vals][]"]').val(val);tr.find('.c-p-url-page-signs').each(function(){$(this).attr('data-page-type',pageType).attr('data-input-name',namePre+$(this).attr('data-input-name'))});$(boxId).find('.c-p-url-web-'+type).append(tr)},source_is_url:function(){var isUrl=$(this.formid+' [name="config[source_is_url]"]').is(':checked');isUrl=isUrl?1:'';return isUrl},source_op:function(op,params){var $_o=this;params=params?params:{};var formObj=params.formObj?params.formObj:'#form_source';if(op=='init'){$(formObj+' #source_url_sign').bind('click',function(){var sign=window.tpl_lang.sign_match.replace('{:id}','');var ipt=$('#source_url');if(ipt.val().indexOf(sign)<0){insertAtCaret(ipt,sign)}else{toastr.error('存在'+sign)}});$(formObj).find('.nav-tabs li a').bind('click',function(){$(formObj).find('input[name="source[type]"]').val($(this).attr('source-type'))});$(formObj).find('div[source-param]').find('input,textarea').bind('change',function(){if($(this).attr("type")=='radio'){return!1}
$(this).parents('div[source-param]').find('input[name="source[param]"]').prop('checked',!0)});if(params.source){$(formObj+' .nav-tabs').find('a[source-type="'+params.source.type+'"]').click();if(params.source.type=='custom'){$(formObj+' textarea[name="source[urls]"]').val(params.source.urls)}else if(params.source.type=='batch'){$(formObj+' input[name="source[url]"]').val(params.source.url);var param_type=params.source.param;if(param_type=='num'){$(formObj+' input[name="source[param_num_start]"]').val(params.source.param_num_start);$(formObj+' input[name="source[param_num_end]"]').val(params.source.param_num_end);$(formObj+' input[name="source[param_num_inc]"]').val(params.source.param_num_inc);if(params.source.param_num_desc){$(formObj+' input[name="source[param_num_desc]"]').prop('checked','checked')}}else if(param_type=='letter'){$(formObj+' input[name="source[param_letter_start]"]').val(params.source.param_letter_start);$(formObj+' input[name="source[param_letter_end]"]').val(params.source.param_letter_end);if(params.source.param_letter_desc){$(formObj+' input[name="source[param_letter_desc]"]').prop('checked','checked')}}else if(param_type=='custom'){$(formObj+' textarea[name="source[param_custom]"]').val(params.source.param_custom)}
$(formObj+' input[name="source[param]"][value="'+param_type+'"]').prop('checked','checked')}else if(params.source.type=='large'){$(formObj+' textarea[name="source[large_urls]"]').val(params.source.large_urls)}else if(params.source.type=='api'){$(formObj+' input[name="source[api]"]').val(params.source.api);$(formObj+' input[name="source[api_json]"]').val(params.source.api_json)}}}else if(op=='add'){var html='';if(params.html){html=params.html}else{var htmlObj=$_o.clone_tpl('#coll_tpl_source_url');htmlObj.find('[data-id="source_url_"]').attr('id','source_url_'+generateUUID()).removeAttr('data-id');var regLarge=/[\r\n]/;if(regLarge.test(params.source_url)){htmlObj.find('input[name="config[source_url][]"]').remove()}else{htmlObj.find('textarea[name="config[source_url][]"]').remove()}
$_o.cpUrlWeb.page_load(pageType,config.url_web);$_o.cpRenderer.page_load(pageType,config.renderer);$_o.cpContentSign.page_load(pageType,config.content_signs);$_o.cpPagination.page_load(pageType,config.pagination)},source_is_url:function(){var isUrl=$(this.formid+' [name="config[source_is_url]"]').is(':checked');isUrl=isUrl?1:'';return isUrl},source_op:function(op,params){var $_o=this;params=params?params:{};var formObj=params.formObj?params.formObj:'#form_source';if(op=='init'){$(formObj+' #source_url_sign').bind('click',function(){var sign=window.tpl_lang.sign_match.replace('{:id}','');var ipt=$('#source_url');if(ipt.val().indexOf(sign)<0){insertAtCaret(ipt,sign)}else{toastr.error('存在'+sign)}});$(formObj).find('.nav-tabs li a').bind('click',function(){$(formObj).find('input[name="source[type]"]').val($(this).attr('source-type'))});$(formObj).find('div[source-param]').find('input,textarea').bind('change',function(){if($(this).attr("type")=='radio'){return!1}
$(this).parents('div[source-param]').find('input[name="source[param]"]').prop('checked',!0)});if(params.source){$(formObj+' .nav-tabs').find('a[source-type="'+params.source.type+'"]').click();if(params.source.type=='custom'){$(formObj+' textarea[name="source[urls]"]').val(params.source.urls)}else if(params.source.type=='batch'){$(formObj+' input[name="source[url]"]').val(params.source.url);var param_type=params.source.param;if(param_type=='num'){$(formObj+' input[name="source[param_num_start]"]').val(params.source.param_num_start);$(formObj+' input[name="source[param_num_end]"]').val(params.source.param_num_end);$(formObj+' input[name="source[param_num_inc]"]').val(params.source.param_num_inc);if(params.source.param_num_desc){$(formObj+' input[name="source[param_num_desc]"]').prop('checked',!0)}}else if(param_type=='letter'){$(formObj+' input[name="source[param_letter_start]"]').val(params.source.param_letter_start);$(formObj+' input[name="source[param_letter_end]"]').val(params.source.param_letter_end);if(params.source.param_letter_desc){$(formObj+' input[name="source[param_letter_desc]"]').prop('checked',!0)}}else if(param_type=='custom'){$(formObj+' textarea[name="source[param_custom]"]').val(params.source.param_custom)}
$(formObj+' input[name="source[param]"][value="'+param_type+'"]').prop('checked',!0)}else if(params.source.type=='large'){$(formObj+' textarea[name="source[large_urls]"]').val(params.source.large_urls)}else if(params.source.type=='api'){$(formObj+' input[name="source[api]"]').val(params.source.api);$(formObj+' input[name="source[api_json]"]').val(params.source.api_json)}}}else if(op=='add'){var html='';if(params.html){html=params.html}else{var htmlObj=$_o.clone_tpl('#coll_tpl_source_url');htmlObj.find('[data-id="source_url_"]').attr('id','source_url_'+generateUUID()).removeAttr('data-id');var regLarge=/[\r\n]/;if(regLarge.test(params.source_url)){htmlObj.find('input[name="config[source_url][]"]').remove()}else{htmlObj.find('textarea[name="config[source_url][]"]').remove()}
html=htmlObj.html();html=html?html:'';html=html.replace('[_source_url_]',htmlspecialchars(params.source_url))}
if(params.get){return html}else{this.source_op('clear_null');$($_o.formid+' #coll_pattern_source_url .c-p-source-urls').append(html)}}else if(op=='add_sub'){ajaxOpen({type:'POST',dataType:'json',url:$(formObj).attr('action'),data:$(formObj).serialize(),success:function(data){var dataList=data.data?data.data:{};var objid=dataList.objid?dataList.objid:'';var addParams={};if(data.code==1){var source_type=$(formObj).find('input[name="source[type]"]').val();if(source_type=='custom'){$('#myModal').modal('hide');var urls=dataList.urls;var ix=0;var url_html_list='';for(var i in urls){addParams.get=1;addParams.source_url=urls[i];ix++;if(ix==1){if(objid){var newSource=$_o.source_op('add',addParams);$('#'+objid).replaceWith(newSource);continue}}
url_html_list+=$_o.source_op('add',addParams)}
@ -67,7 +55,7 @@ $('#myModal').modal('hide')}}else{toastr.error(data.msg)}},error:function(data){
if(!$_o.source_is_url()){options+='<option value="source_url">起始页</option>';var level_urls=new Array();$('#c_p_level_urls [id^="level_url_"]').each(function(){var levelName=$(this).find('.name').attr('data-val');level_urls.push('<option value="level_url:'+levelName+'">多级页:'+levelName+'</option>')});if(level_urls.length>0){options+=level_urls.join('')}}
options+='<option value="'+(setOptUrlVal?'url':'')+'" selected="selected">内容页</option>';var relation_urls=new Array();$('#c_p_relation_urls [id^="relation_url_"]').each(function(){var relationName=$(this).find('.name').attr('data-val');relation_urls.push('<option value="relation_url:'+relationName+'">关联页:'+relationName+'</option>')});if(relation_urls.length>0){options+=relation_urls.join('')}
return options},field_delete_tr:function(subEle){$(subEle).parents('tr[id^="field_"]').eq(0).remove()},field_editor:function(subEle,hiddenFunc){var field=null;var objid=null;var title='添加字段';if(subEle){objid=$(subEle).parents('tr[id^="field_"]').eq(0).attr('id');if(objid){field=$('#'+objid).find('input[name="config[field_list][]"]').val();title='编辑字段'}}
var options={hidden_func:hiddenFunc};options.ajax={type:'post',data:{objid:objid,field:field}};windowModal(title,ulink('cpattern/field'),options)},process_paste:function(){var $_o=this;$('body').off('click','#window_process_paste').on('click','#window_process_paste',function(){ajaxOpen({type:'get',dataType:'json',url:ulink('cpattern/clone_process?op=paste'),success:function(data){if(data.code==1){$_o.cpProcess.add(data.data);toastr.success(data.msg)}else{toastr.error(data.msg)}}})})},add_request_header:function(name,val){var $_o=this;name=name?name:'';val=val?val:'';var tr=$_o.clone_tpl('#coll_tpl_request_headers');tr.find('[name="config[request_headers][custom_names][]"]').val(name);tr.find('[name="config[request_headers][custom_vals][]"]').val(val);$($_o.formid+' #coll_pattern_request_headers table.c-p-request-headers tbody').append(tr)},add_request_header_img:function(name,val){var $_o=this;name=name?name:'';val=val?val:'';var tr=$_o.clone_tpl('#coll_tpl_request_headers_img');tr.find('[name="config[request_headers][img_names][]"]').val(name);tr.find('[name="config[request_headers][img_vals][]"]').val(val);$($_o.formid+' #coll_pattern_request_headers table.c-p-request-headers-img tbody').append(tr)},get_field_names:function(sortField){var fields=new Array();var trs=$(this.formid+' #coll_pattern_field .c-p-field-list').find('tr[id^="field_"]');if(sortField){var fieldsNormal=new Array();var fieldsExtract=new Array();var fieldsMerge=new Array();trs.each(function(){var fmodule=$(this).find('.field-module').attr('data-val');var fname=$(this).find('.field-name').attr('data-val');if(fname){if(fmodule=='extract'){fieldsExtract.push(fname)}else if(fmodule=='merge'){fieldsMerge.push(fname)}else{fieldsNormal.push(fname)}}});for(var i in fieldsNormal){fields.push(fieldsNormal[i])}
var options={hidden_func:hiddenFunc};options.ajax={type:'post',data:{objid:objid,field:field}};windowModal(title,ulink('cpattern/field'),options)},process_paste:function(){var $_o=this;$('body').off('click','#window_process_paste').on('click','#window_process_paste',function(){ajaxOpen({type:'get',dataType:'json',url:ulink('cpattern/clone_process?op=paste'),success:function(data){if(data.code==1){$_o.cpProcess.add(data.data);toastr.success(data.msg)}else{toastr.error(data.msg)}}})})},add_request_header:function(name,val){var $_o=this;name=name?name:'';val=val?val:'';var tr=$_o.clone_tpl('#coll_tpl_request_headers');tr.find('[name="config[request_headers][custom_names][]"]').val(name);tr.find('[name="config[request_headers][custom_vals][]"]').val(val);$($_o.formid+' #coll_pattern_request_headers .c-p-request-headers tbody').append(tr)},add_request_header_img:function(name,val){var $_o=this;name=name?name:'';val=val?val:'';var tr=$_o.clone_tpl('#coll_tpl_request_headers_img');tr.find('[name="config[request_headers][img_names][]"]').val(name);tr.find('[name="config[request_headers][img_vals][]"]').val(val);$($_o.formid+' #coll_pattern_request_headers .c-p-request-headers-img tbody').append(tr)},get_field_names:function(sortField){var fields=new Array();var trs=$(this.formid+' #coll_pattern_field .c-p-field-list').find('tr[id^="field_"]');if(sortField){var fieldsNormal=new Array();var fieldsExtract=new Array();var fieldsMerge=new Array();trs.each(function(){var fmodule=$(this).find('.field-module').attr('data-val');var fname=$(this).find('.field-name').attr('data-val');if(fname){if(fmodule=='extract'){fieldsExtract.push(fname)}else if(fmodule=='merge'){fieldsMerge.push(fname)}else{fieldsNormal.push(fname)}}});for(var i in fieldsNormal){fields.push(fieldsNormal[i])}
for(var i in fieldsExtract){fields.push(fieldsExtract[i])}
for(var i in fieldsMerge){fields.push(fieldsMerge[i])}}else{trs.each(function(){var fname=$(this).find('.field-name').attr('data-val');if(fname){fields.push(fname)}})}
return fields},rule_module_slt:function(curObj){curObj=$(curObj);var module=curObj.val();if(curObj.attr('data-module-input')){var ipt=$('[name="'+curObj.attr('data-module-input')+'"]');ipt.attr('data-val-'+module,ipt.val())}
@ -95,7 +83,7 @@ var nullTips='';if(sourceIsUrl){nullTips='起始页已设为内容页'}
for(var asi in allSigns){var pageSigns=allSigns[asi]?allSigns[asi]:{};var pageName=pageSigns.name;var signs=pageSigns.signs;signs=signs?signs:{};html+='<tr><td>'+pageName+'</td>';var signKeys=['area','url','content'];for(var ski in signKeys){html+='<td>';var signKey=signKeys[ski];var keySigns=signs[signKey];if(keySigns&&keySigns.length>0){var keyGlobalSigns=signs[signKey+'_global'];for(var ksi in keySigns){var sign=keySigns[ksi];var signHtml=htmlspecialchars(sign);if(keyGlobalSigns&&keyGlobalSigns.indexOf(sign)>-1){var color=valSigns.indexOf(sign)>-1?'color:green;':'';html+='<a href="javascript:;" data-val="'+signHtml+'" style="'+color+'">'+signHtml+'</a>'}else{html+='<span style="color:#999;" title="被覆盖">'+signHtml+'</span>'}}}else{html+='<span style="color:#999;" title="'+nullTips+'">无</span>'}
html+='</td>'}
html+='</tr>'}
if(dropdownMenu.length>0){var signsObj=$_o.clone_tpl('#coll_tpl_page_signs');$(dropdownMenu).append(signsObj);$(dropdownMenu).find('table tbody').html(html);$(dropdownMenu).find('a[data-val]').bind('click',function(){if(iptObj){insertAtCaret(iptObj,$(this).attr('data-val'))}});var sortObj=$(dropdownMenu).find('th.sorting');sortObj.removeClass('sorting');sortObj.addClass(pageSort=='asc'?'sorting_asc':'sorting_desc');sortObj.attr('title','页面'+(pageSort=='asc'?'升序':'序')+'排列');sortObj.bind('click',function(){ajaxOpen({type:'get',dataType:'json',url:ulink("cpattern/page_signs_sort"),success:function(data){toastr.success(data.msg)}})})}}}})},field_is_loop:function(){var hasLoop=$(this.formid+' #coll_pattern_field .c-p-field-list').find('.field-module[data-is-loop]');if(hasLoop&&hasLoop.length>0){hasLoop=1}else{hasLoop=''}
if(dropdownMenu.length>0){var signsObj=$_o.clone_tpl('#coll_tpl_page_signs');$(dropdownMenu).append(signsObj);$(dropdownMenu).find('table tbody').html(html);$(dropdownMenu).find('a[data-val]').bind('click',function(){if(iptObj){insertAtCaret(iptObj,$(this).attr('data-val'))}});var sortObj=$(dropdownMenu).find('th.sorting');sortObj.removeClass('sorting');sortObj.addClass(pageSort=='asc'?'sorting_asc':'sorting_desc');sortObj.attr('title','页面'+(pageSort=='asc'?'升序':'序')+'排列');sortObj.bind('click',function(){ajaxOpen({type:'get',dataType:'json',url:ulink("cpattern/page_signs_sort"),success:function(data){toastr.success(data.msg)}})})}}}})},field_is_loop:function(){var hasLoop=$(this.formid+' #coll_pattern_field .c-p-field-list').find('.field-module[data-is-loop]');if(hasLoop&&hasLoop.length>0){hasLoop=1}else{hasLoop=''}
return hasLoop}}
function CpFrontUrl(cpClass){this.$_cp=cpClass;this.formObj='#form_front_url'}
CpFrontUrl.prototype={constructor:CpFrontUrl,init:function(front_url){var $_o=this;$($_o.formObj).bind('submit',function(){$_o.add_sub();return!1});$_o.$_cp.init_page('front_url');$($_o.formObj).on('click','.c-p-url-page-signs .btn-page-signs',function(){$_o.$_cp.parent_page_signs(this)});if(front_url){var loadParams=['name','url'];for(var i in loadParams){if(front_url[loadParams[i]]){$($_o.formObj+' [name="front_url['+loadParams[i]+']"]').val(front_url[loadParams[i]])}}
@ -119,10 +107,46 @@ if(objid){objEle=$($_o.$_cp.formid+' #'+objid)}else{objEle=$_o.$_cp.clone_tpl('#
objEle.find('.name').attr('data-val',relation_url.name).text(relation_url.name);objEle.find('.page').text(relationPage);objEle.find('[name="config[relation_urls][]"]').val(encode_json2urlbase(relation_url));objEle.find('.signs').val(pageSigns.join(' '))},add_sub:function(){var $_o=this;var objid=$($_o.formObj+' input[name="objid"]').val();var checkName=!0;if(objid){var name=$($_o.$_cp.formid+' #'+objid).find('.name').attr('data-val');if(name==$($_o.formObj+' [name="relation_url[name]"]').val()){checkName=!1}}
if(checkName){var hasName=!1;$('#c_p_relation_urls [id^="relation_url_"] .name').each(function(){if($($_o.formObj+' [name="relation_url[name]"]').val()==$(this).attr('data-val')){hasName=!0;return!1}});if(hasName){toastr.error('该名称已存在!');return!1}}
ajaxOpen({type:'POST',dataType:'json',url:$($_o.formObj).attr('action'),data:$($_o.formObj).serialize(),success:function(data){if(data.code==1){$('#myModal').modal('hide');data=data.data;if(data){$_o.add(data.objid,data.relation_url)}}else{toastr.error(data.msg)}},error:function(data){toastr.error(data)}});return!1}}
function CpUrlWeb(cpClass){this.$_cp=cpClass}
CpUrlWeb.prototype={constructor:CpUrlWeb,page_init:function(pageType){var $_o=this;var pageVars=$_o.$_cp.get_page_vars(pageType);var boxId=pageVars.boxId;var namePre=pageVars.namePre;if(!boxId||!namePre){return}
var boxUrlWebId=boxId+'_web';$(boxUrlWebId+' [name="'+namePre+'[url_web][open]"]').bind('click',function(){if($(this).val()==1){$(boxUrlWebId+'_open').show()}else{$(boxUrlWebId+'_open').hide()}
$_o.def_config_use_url_web(pageType)});inputSelectCustom(boxUrlWebId+' select[name="'+namePre+'[url_web][charset]"]',namePre+'[url_web][charset_custom]');inputSelectCustom(boxUrlWebId+' select[name="'+namePre+'[url_web][encode]"]',namePre+'[url_web][encode_custom]');$_o.def_config_charset(pageType);$_o.def_config_encode(pageType);$(boxUrlWebId+' select[name="'+namePre+'[url_web][form_method]"]').bind('change',function(){var obj=$(boxUrlWebId+' .c-p-url-web-content-type');if($(this).val()=='post'){obj.show()}else{obj.hide()}});$_o.def_config_header_global(pageType);$(boxUrlWebId+' .add-url-web-form').bind('click',function(){$_o.add_page_url_web(pageType,'form','','')});$(boxUrlWebId+' .c-p-url-web-form').on('click','.delete-url-web-form',function(){$(this).parents('tr').eq(0).remove()});$(boxUrlWebId+' .add-url-web-header').bind('click',function(){$_o.add_page_url_web(pageType,'header','','')});$(boxUrlWebId+' .c-p-url-web-header').on('click','.delete-url-web-header',function(){$(this).parents('tr').eq(0).remove()})},page_load:function(pageType,urlWebConfig){var $_o=this;var pageVars=$_o.$_cp.get_page_vars(pageType);var formId=pageVars.formId;var boxId=pageVars.boxId;var namePre=pageVars.namePre;if(!formId||!boxId||!namePre){return}
if(!isObject(urlWebConfig)){urlWebConfig={}}
var urlWebNamePre=namePre+'[url_web]';urlWebConfig.open=toInt(urlWebConfig.open);$(formId+' [name="'+urlWebNamePre+'[open]"][value="'+urlWebConfig.open+'"]').trigger('click');if(urlWebConfig.open>0){showPanelCollapse(boxId+'_web')}
if(urlWebConfig.charset){$(formId+' select[name="'+urlWebNamePre+'[charset]"]').val(urlWebConfig.charset).trigger('change')}
if(urlWebConfig.charset_custom){$(formId+' [name="'+urlWebNamePre+'[charset_custom]"]').val(urlWebConfig.charset_custom)}
if(urlWebConfig.encode){$(formId+' select[name="'+urlWebNamePre+'[encode]"]').val(urlWebConfig.encode).trigger('change')}
if(urlWebConfig.encode_custom){$(formId+' [name="'+urlWebNamePre+'[encode_custom]"]').val(urlWebConfig.encode_custom)}
if(urlWebConfig.form_method){$(formId+' [name="'+urlWebNamePre+'[form_method]"]').val(urlWebConfig.form_method).trigger('change')}
if(urlWebConfig.content_type){$(formId+' [name="'+urlWebNamePre+'[content_type]"]').val(urlWebConfig.content_type)}
if(urlWebConfig.form_names){var urlWebFormVals=urlWebConfig.form_vals?urlWebConfig.form_vals:{};for(var i in urlWebConfig.form_names){$_o.add_page_url_web(pageType,'form',urlWebConfig.form_names[i],urlWebFormVals[i])}}
if(urlWebConfig.header_global){$(formId+' [name="'+urlWebNamePre+'[header_global]"][value="'+urlWebConfig.header_global+'"]').prop('checked',!0)}
if(urlWebConfig.header_names){var urlWebHeaderVals=urlWebConfig.header_vals?urlWebConfig.header_vals:{};for(var i in urlWebConfig.header_names){$_o.add_page_url_web(pageType,'header',urlWebConfig.header_names[i],urlWebHeaderVals[i])}}},add_page_url_web:function(pageType,type,name,val){var $_o=this;var pageVars=$_o.$_cp.get_page_vars(pageType);var boxId=pageVars.boxId;var namePre=pageVars.namePre;if(!boxId||!namePre||!type){return}
boxId+='_web';name=name?name:'';val=val?val:'';var tr=$_o.$_cp.clone_tpl('#coll_tpl_url_web_'+type,namePre);tr.find('[name="'+namePre+'[url_web]['+type+'_names][]"]').val(name);tr.find('[name="'+namePre+'[url_web]['+type+'_vals][]"]').val(val);tr.find('.c-p-url-page-signs').each(function(){$(this).attr('data-page-type',pageType).attr('data-input-name',namePre+$(this).attr('data-input-name'))});$(boxId).find('.c-p-url-web-'+type+' tbody').append(tr)},def_config_charset:function(pageType){var $_o=this;var val=$($_o.$_cp.formid+' [name="config[charset]"]').val();var formid=$_o.$_cp.formid;if(pageType){formid=$_o.$_cp.get_page_vars(pageType,'formId')}
if(!val||val=='auto'){val='自动检测'}else if(val=='custom'){if($_o.$_cp.page_is_list(pageType)){val=$($_o.$_cp.formid+' [name="config[charset_custom]"]').val();val=val?val:''}else{val=''}
val='自定义'+(val?('»'+htmlspecialchars(val)):'')}
$(formid).find('.def-config-charset').html('默认:'+val)},def_config_encode:function(pageType){var $_o=this;var val=$($_o.$_cp.formid+' [name="config[encode]"]').val();var formid=$_o.$_cp.formid;if(pageType){formid=$_o.$_cp.get_page_vars(pageType,'formId')}
if(!val){val='系统默认'}else if(val=='custom'){if($_o.$_cp.page_is_list(pageType)){val=$($_o.$_cp.formid+' [name="config[encode_custom]"]').val();val=val?val:''}else{val=''}
val='自定义'+(val?('»'+htmlspecialchars(val)):'')}
$(formid).find('.def-config-encode').html('默认:'+val)},def_config_header_global:function(pageType){var $_o=this;var val=$($_o.$_cp.formid+' [name="config[request_headers][open]"]:checked').val();val=toInt(val);var formid=$_o.$_cp.formid;if(pageType){formid=$_o.$_cp.get_page_vars(pageType,'formId')}
$(formid).find('.def-config-request-headers-open').html(val>0?'是':'否')},def_config_use_url_web:function(pageType){var $_o=this;var pageVars=$_o.$_cp.get_page_vars(pageType);var formId=pageVars.formId;var boxId=pageVars.boxId;var namePre=pageVars.namePre;if(!formId||!boxId||!namePre){return}
var urlWebOpen=$(formId).find('[name="'+namePre+'[url_web][open]"]:checked').val();urlWebOpen=toInt(urlWebOpen);$(boxId+'_pagination').find('.def-config-url-web-open').html(urlWebOpen>0?'是':'否')}}
function CpRenderer(cpClass){this.$_cp=cpClass}
CpRenderer.prototype={constructor:CpRenderer,page_init:function(pageType){var $_o=this;var pageVars=$_o.$_cp.get_page_vars(pageType);var boxId=pageVars.boxId;var namePre=pageVars.namePre;if(!boxId||!namePre){return}
$_o.def_config_renderer_open(pageType);var rdBoxId=boxId+'_renderer';$(rdBoxId+' .add-url-renderer').bind('click',function(){$_o.add(pageType)});$(rdBoxId+' [name="'+namePre+'[renderer][open]"]').bind('click',function(){$_o.def_config_use_renderer(pageType)});$(rdBoxId+' .c-p-url-renderer-list').on('change','select[name="'+namePre+'[renderer][types][]"]',function(){var type=$(this).val();var tr=$(this).parents('tr').eq(0);var types={'wait_time':{content:1,content_tips:'输入数字'},'scroll_top':{content:1,content_tips:'输入数字'},'click':{element:1},'val':{element:1,content:1,content_tips:'输入值'}};var tdTypeCols=3;tr.find('.td-renderer-element,.td-renderer-content').hide();tr.find('input[name="'+namePre+'[renderer][contents][]"]').attr('placeholder','');var curType=types[type];if(isObject(curType)){if(curType.element){tr.find('.td-renderer-element').show();tdTypeCols-=1}
if(curType.content){tr.find('.td-renderer-content').show();tdTypeCols-=1;if(curType.content_tips){tr.find('input[name="'+namePre+'[renderer][contents][]"]').attr('placeholder',curType.content_tips)}}}
tr.find('.td-renderer-type').attr('colspan',tdTypeCols)});$(rdBoxId+' .c-p-url-renderer-list').on('click','.delete-url-renderer',function(){$(this).parents('tr').eq(0).remove()});eleExchange(rdBoxId+' .c-p-url-renderer-list','.icon-drag-move','tr')},page_load:function(pageType,rdConfig){var $_o=this;var pageVars=$_o.$_cp.get_page_vars(pageType);var boxId=pageVars.boxId;var namePre=pageVars.namePre;if(!boxId||!namePre){return}
var rdBoxId=boxId+'_renderer';if(isObject(rdConfig)){$(rdBoxId).find('[name="'+namePre+'[renderer][open]"][value="'+rdConfig.open+'"]').prop('checked',!0).trigger('click');var rdTypes=isObject(rdConfig.types)?rdConfig.types:[];var rdElements=isObject(rdConfig.elements)?rdConfig.elements:[];var rdContents=isObject(rdConfig.contents)?rdConfig.contents:[];var showPanel=!1;var openVal=rdConfig.open=='y'?true:!1;var openDef=$($_o.$_cp.formid+' [name="config[page_render]"]:checked').val();openDef=toInt(openDef);openDef=openDef>0?true:!1;if(rdTypes&&rdTypes.length>0){for(var i in rdTypes){$_o.add(pageType,rdTypes[i],rdElements[i],rdContents[i])}
if((!rdConfig.open&&openDef)||openVal){showPanel=!0}}else{if(rdConfig.open){if(openVal!=openDef){showPanel=!0}}}
if(showPanel){showPanelCollapse(rdBoxId)}}},add:function(pageType,rdType,rdElement,rdContent){var $_o=this;var pageVars=$_o.$_cp.get_page_vars(pageType);var boxId=pageVars.boxId;var namePre=pageVars.namePre;if(!boxId||!namePre){return}
var rdBoxId=boxId+'_renderer';var tr=$_o.$_cp.clone_tpl('#coll_tpl_url_renderer',namePre);if(rdType){tr.find('[name*="[renderer][types]"]').val(rdType);tr.find('[name*="[renderer][elements]"]').val(rdElement);tr.find('[name*="[renderer][contents]"]').val(rdContent)}
tr.find('.c-p-url-page-signs').each(function(){$(this).attr('data-page-type',pageType).attr('data-input-name',namePre+$(this).attr('data-input-name'))});$(rdBoxId+' .c-p-url-renderer-list table').append(tr);if(rdType){$(rdBoxId+' .c-p-url-renderer-list').find('[name*="[renderer][types]"]:last-child').trigger('change')}},def_config_renderer_open:function(pageType){var $_o=this;var val=$($_o.$_cp.formid+' [name="config[page_render]"]:checked').val();val=toInt(val);var formid=$_o.$_cp.formid;if(pageType){formid=$_o.$_cp.get_page_vars(pageType,'formId')}
$(formid).find('.def-config-page-render').html(val>0?'是':'否')},def_config_use_renderer:function(pageType){var $_o=this;var pageVars=$_o.$_cp.get_page_vars(pageType);var formId=pageVars.formId;var boxId=pageVars.boxId;var namePre=pageVars.namePre;if(!formId||!boxId||!namePre){return}
var defConfigObj=$(boxId+'_pagination').find('.def-config-renderer-open');var rendererOpen=$(formId).find('[name="'+namePre+'[renderer][open]"]:checked').val();if(rendererOpen){defConfigObj.html(rendererOpen=='y'?'是':'否').show();defConfigObj.parent().find('.def-config-page-render').hide()}else{defConfigObj.parent().find('.def-config-page-render').show();defConfigObj.hide()}},}
function CpPagination(cpClass){this.$_cp=cpClass}
CpPagination.prototype={constructor:CpPagination,page_init:function(pageType){var $_o=this;if(pageType=='source_url'||pageType=='level_url'||pageType=='url'){var pageVars=$_o.$_cp.get_page_vars(pageType);var formId=pageVars.formId;var boxId=pageVars.boxId;var namePre=pageVars.namePre;if(!formId||!boxId||!namePre){return}
var pnBoxId=boxId+'_pagination';var pnNamePre=namePre+'[pagination]';$(formId+' select[name="'+pnNamePre+'[area_module]"],select[name="'+pnNamePre+'[url_rule_module]"]').bind('click',function(){$_o.$_cp.rule_module_slt(this)});$(pnBoxId+' [name="'+pnNamePre+'[open]"]').bind('click',function(){if($(this).val()==1){$(pnBoxId+'_open').show()}else{$(pnBoxId+'_open').hide()}});if(pageType=='url'){$(pnBoxId).on('click','.add-url-pagination-field',function(){var url=ulink("cpattern/pagination_field?is_loop=_is_loop_",{'_is_loop_':$_o.$_cp.field_is_loop()});windowModal('分页字段',url)});$(pnBoxId+' .c-p-url-pagination-fields').on('click','.field',function(){var parent=$(this).parents('[id^="pagination_field_"]').eq(0);var objid=parent.attr('id');var pnField=parent.find('[name="'+pnNamePre+'[fields][]"]').val();var url=ulink("cpattern/pagination_field?objid=_objid_&pagination_field=_pnfield_&is_loop=_is_loop_",{'_objid_':objid,'_pnfield_':pnField,'_is_loop_':$_o.$_cp.field_is_loop()});windowModal('分页字段',url)});$(pnBoxId+' .c-p-url-pagination-fields').on('click','.delete',function(){var parent=$(this).parents('[id^="pagination_field_"]').eq(0);confirmRight('确定删除?',function(){parent.remove()})})}}},page_load:function(pageType,pnConfig){var $_o=this;if(pageType=='source_url'||pageType=='level_url'||pageType=='url'){var pageVars=$_o.$_cp.get_page_vars(pageType);if(!pageVars.boxId||!pageVars.namePre){return}
var pnBoxId=pageVars.boxId+'_pagination';var pnNamePre=pageVars.namePre+'[pagination]';if(isObject(pnConfig)){$_o.$_cp.load_page_rule(pageType,pnConfig,!0);$(pnBoxId+' [name="'+pnNamePre+'[max]"]').val(toInt(pnConfig.max));pnConfig.open=toInt(pnConfig.open);if(pnConfig.open){$(pnBoxId+' [name="'+pnNamePre+'[open]"][value="'+pnConfig.open+'"]').trigger('click');if(pnConfig.open>0){showPanelCollapse(pnBoxId)}}
var pnBoxId=pageVars.boxId+'_pagination';var pnNamePre=pageVars.namePre+'[pagination]';if(isObject(pnConfig)){$_o.$_cp.load_page_rule(pageType,pnConfig,!0);$(pnBoxId+' [name="'+pnNamePre+'[max]"]').val(toInt(pnConfig.max));$(pnBoxId+' [name="'+pnNamePre+'[use_url_web]"][value="'+pnConfig.use_url_web+'"]').prop('checked',!0);$(pnBoxId+' [name="'+pnNamePre+'[use_renderer]"][value="'+pnConfig.use_renderer+'"]').prop('checked',!0);pnConfig.open=toInt(pnConfig.open);if(pnConfig.open){$(pnBoxId+' [name="'+pnNamePre+'[open]"][value="'+pnConfig.open+'"]').trigger('click');if(pnConfig.open>0){showPanelCollapse(pnBoxId)}}
if(pageType=='url'){if(pnConfig.fields){for(var i in pnConfig.fields){$_o.field_op(pageType,'add',{pagination_field:pnConfig.fields[i]})}}}}}},field_op:function(pageType,op,params){var $_o=this;if(pageType!='url'){return}
params=params?params:{};var formObj=params.formObj?params.formObj:'#form_pagination_field';var pageVars=$_o.$_cp.get_page_vars(pageType);if(!pageVars.boxId||!pageVars.namePre){return}
var pnBoxId=pageVars.boxId+'_pagination';var pnNamePre=pageVars.namePre+'[pagination]';if(op=='init'){var fieldNames=$_o.$_cp.get_field_names();var fieldOptions='<option value="">--请选择--</option><option value="::all">-全部字段-</option>';for(var i in fieldNames){fieldOptions+='<option value="'+fieldNames[i]+'">'+fieldNames[i]+'</option>'}
@ -130,7 +154,7 @@ $(formObj+' select[name="pagination_field[field]"]').html(fieldOptions);$(formOb
$('#'+objid).html(tpl)}else if(op=='add_sub'){var objid=$(formObj+' input[name="objid"]').val();var checkField=!0;if(objid){var field=$(pnBoxId+' #'+objid).find('.field').attr('data-field');if(field==$(formObj+' select[name="pagination_field[field]"]').val()){checkField=!1}}
if(checkField){var hasField=!1;var fieldList=new Array();$(pnBoxId+' .c-p-url-pagination-fields [id^="pagination_field_"] .field').each(function(){fieldList.push($(this).attr('data-field'))});for(var i in fieldList){if($(formObj+' select[name="pagination_field[field]"]').val()==fieldList[i]){hasField=!0;break}}
if(hasField){toastr.error('该字段已存在!');return!1}}
ajaxOpen({type:'POST',dataType:'json',url:$(formObj).attr('action'),data:$(formObj).serialize(),success:function(data){if(data.code==1){$('#myModal').modal('hide');$_o.field_op(pageType,'add',data.data)}else{toastr.error(data.msg)}},error:function(data){toastr.error(data)}});return!1}},}
ajaxOpen({type:'POST',dataType:'json',url:$(formObj).attr('action'),data:$(formObj).serialize(),success:function(data){if(data.code==1){$('#myModal').modal('hide');$_o.field_op(pageType,'add',data.data)}else{toastr.error(data.msg)}},error:function(data){toastr.error(data)}});return!1}}}
function CpField(cpClass){this.$_cp=cpClass;this.formObj='#form_field'}
CpField.prototype={constructor:CpField,init:function(fieldData){var $_o=this;var sourceOptions=$_o.$_cp.page_source_options(!1);if(sourceOptions){$($_o.formObj+' select[name="field[source]"]').html(sourceOptions)}
$($_o.formObj+' select[name="field[source]"]').bind('change',function(){var fsource=$(this).val();fsource=fsource.split(':');var pageType=fsource[0]?fsource[0]:'url';var pageName=fsource[1]?fsource[1]:'';var pageVars=$_o.$_cp.get_page_vars(pageType);var boxId=pageVars.boxId;var namePre=pageVars.namePre;var formId=pageVars.formId;var pageSigns=[];if(pageType=='source_url'||pageType=='url'){var urlConfig={};var noDefSign=!1;if(pageType=='source_url'){urlConfig.area='';urlConfig.url_rule='';noDefSign=!0}else{urlConfig.area=$(formId+' [name="'+namePre+'[area]"]').val();urlConfig.url_rule=$(formId+' [name="'+namePre+'[url_rule]"]').val()}
@ -150,7 +174,7 @@ if(objid){var eleObj=$($_o.$_cp.formid+' #'+objid);eleObj.find('.field-name').at
eleObj.find('input[name="config[field_list][]"]').val(encode_json2urlbase(fieldData))}else{var ptitle='';if(processData){ptitle=[];for(var i in processData){ptitle.push(window.tpl_lang['process_module_'+processData[i].module]+(processData[i].title?(''+processData[i].title):''))}
ptitle=ptitle.join(' / ')}
var html=$_o.$_cp.clone_tpl('#coll_tpl_field');html.attr('id','field_'+generateUUID());html.find('.field-name').attr('data-val',fieldData.name).text(fieldData.name);html.find('.field-source').attr('data-val',fieldData.source).text(fieldSource);html.find('.field-module').attr('data-val',fieldData.module).text(window.tpl_lang['field_module_'+fieldData.module]+isLoop);if(isLoop){html.find('.field-module').attr('data-is-loop',1)}else{html.find('.field-module').removeAttr('data-is-loop')}
html.find('[name="config[field_list][]"]').val(encode_json2urlbase(fieldData));html.find('[name="config[field_process][]"]').val(processData?encode_json2urlbase(processData):'');if(processData){html.find('.field-process').addClass('exist-process')}
html.find('[name="config[field_list][]"]').val(encode_json2urlbase(fieldData));html.find('[name="config[field_process][]"]').val(processData?encode_json2urlbase(processData):'');if(processData&&ptitle){html.find('.field-process').addClass('exist-process')}
html.find('.field-process').attr('title',ptitle);html.find('[name="config[field_title]"]').val(fieldData.name);$($_o.$_cp.formid+' #coll_pattern_field .c-p-field-list tbody').append(html)}},add_sub:function(){var $_o=this;var objid=$($_o.formObj+' input[name="objid"]').val();var checkName=!0;if(objid){var fname=$($_o.$_cp.formid+' #'+objid).find('.field-name').attr('data-val');if(fname==$($_o.formObj+' input[name="field[name]"]').val()){checkName=!1}}
if(checkName){var hasName=!1;var fieldNames=$_o.$_cp.get_field_names();for(var i in fieldNames){if($($_o.formObj+' input[name="field[name]"]').val()==fieldNames[i]){hasName=!0;break}}
if(hasName){toastr.error('字段名称已存在!');return!1}}
@ -161,11 +185,12 @@ CpProcess.prototype={constructor:CpProcess,init:function(processData,isCommon,is
if($($_o.processForm).is('form')){$($_o.processForm).bind('submit',function(){$_o.add_sub();return!1})}
$($_o.processBox+' .process-add').bind('click',function(){var module=$($_o.processBox+' select[name="process[module]"]').val();$_o.add({'add_new':1,'module':module})});if($($_o.processForm).prop('inited')==1){return!0}
$($_o.processForm).on('click','.p-m-html-tags a[data-val]',function(){var tag=$(this).attr('data-val');var moduleHtml=$(this).parents('.p-m-html-tags').eq(0).attr('module-html');var tagsObj=$(this).parents('section').eq(0).find('input[data-process="html:'+moduleHtml+'"]');var tags=tagsObj.val()+','+tag;tags=tags.replace(/(^,+)|(,+$)/,'');tagsObj.val(tags)});$($_o.processForm).on('change','[data-process="insert:insert_loc"]',function(){var helpEle=$(this).siblings('.help-block');if($(this).val()=='rand'){helpEle.show()}else{helpEle.hide()}});inputSelectCustom(null,null,{box:$_o.processForm,slt:'[data-process="translate:translate_from"]',ipt:'[data-process="translate:translate_from_custom"]'});inputSelectCustom(null,null,{box:$_o.processForm,slt:'[data-process="translate:translate_to"]',ipt:'[data-process="translate:translate_to_custom"]'});$_o.txt_insert_field($_o.processForm,'.p-m-func-field',function(sltObj){return $(sltObj).parents('section').eq(0).find('[data-process="func:func_param"]')});$($_o.processForm).on('click','.p-m-if-add',function(){var ifTable=$(this).parents('section').eq(0).find('.p-m-if-table');ifTable.append('<tr>'+ifTable.attr('data-tpl')+'</tr>')});$($_o.processForm).on('click','.p-m-if-del',function(){var tr=$(this).parents('tr').eq(0);confirmRight('确定删除?',function(){tr.remove()})});$($_o.processForm).on('change','[data-process="if:if_cond:"]',function(){var ifCond=$(this).val();var ifTr=$(this).parents('tr').eq(0);var ifTd=ifTr.find('.p-m-if-val').eq(0);var ifVal=ifTd.find('[data-process="if:if_val:"]').eq(0);var ifValInfo={name:ifVal.attr('name'),val:ifVal.val(),process:ifVal.attr('data-process')};var ifValType='def';if(ifCond=='func'){ifValType='func'}else if(ifCond.indexOf('time_')>-1){ifValType='time'}
ifTd.find('.p-m-if-val-def,.p-m-if-val-time,.p-m-if-val-func').hide();ifTd.find('[data-process="if:if_val:"]').removeAttr('name').removeAttr('data-process');var ifValBox=ifTd.find('.p-m-if-val-'+ifValType);var ifValEle=ifValBox.find('.p-m-if-val-ele');ifValEle.attr('name',ifValInfo.name).attr('data-process',ifValInfo.process).val(ifValInfo.val);ifValBox.show();if(ifValType=='func'){$_o.load_if_func(ifTd,null)}});$($_o.processForm).on('change','.p-m-if-val-time-date select',function(){$(this).parents('tr').eq(0).find('[data-process="if:if_val:"]').val($(this).val())});$($_o.processForm).on('click','.p-m-if-val-func-info',function(){pluginFuncTips('processIf')});$_o.txt_insert_field($_o.processForm,'.p-m-if-val-func-field select',function(sltObj){return $(sltObj).parents('td').eq(0).find('[data-process="if:if_val:"]')});$($_o.processForm).on('click','.p-m-if-info',function(){var tips='<p>执行顺序:从上至下判断,逻辑符“并且”的优先级高于“或者”</p>'+'<p>例如(字母表示条件):</p>'+'<p>a &amp;&amp; b || c &amp;&amp; d &amp;&amp; e || f || g &amp;&amp; h &amp;&amp; i &amp;&amp; j 等同于</p>'+'<p>(a &amp;&amp; b) || (c &amp;&amp; d &amp;&amp; e) || f || (g &amp;&amp; h &amp;&amp; i &amp;&amp; j)</p>'+'<p>括号中的条件都为真时才是真否则为假,整条语句中任意一个括号的结果为真最终结果为真,都为假最终结果为假</p>';confirmRight({msg:tips,yes:'确定',width:500,textAlign:'left'})});$($_o.processForm).on('click','.p-m-api-add',function(){var apiTable=$(this).parents('section').eq(0).find('.p-m-api-table');apiTable.append('<tr>'+apiTable.attr('data-tpl')+'</tr>')});$($_o.processForm).on('click','.p-m-api-del',function(){var tr=$(this).parents('tr').eq(0);tr.remove()});inputSelectCustom(null,null,{box:$_o.processForm,slt:'[data-process="api:api_charset"]',ipt:'[data-process="api:api_charset_custom"]'});$($_o.processForm).on('change','[data-process="api:api_params:val:"],[data-process="api:api_headers:val:"]',function(){var isHeader=!1;if($(this).attr('data-process')=='api:api_headers:val:'){isHeader=!0}
ifTd.find('.p-m-if-val-def,.p-m-if-val-time,.p-m-if-val-func').hide();ifTd.find('[data-process="if:if_val:"]').removeAttr('name').removeAttr('data-process');var ifValBox=ifTd.find('.p-m-if-val-'+ifValType);var ifValEle=ifValBox.find('.p-m-if-val-ele');ifValEle.attr('name',ifValInfo.name).attr('data-process',ifValInfo.process).val(ifValInfo.val);ifValBox.show();if(ifValType=='func'){$_o.load_if_func(ifTd,null)}});$($_o.processForm).on('change','.p-m-if-val-time-date select',function(){$(this).parents('tr').eq(0).find('[data-process="if:if_val:"]').val($(this).val())});$($_o.processForm).on('click','.p-m-if-val-func-info',function(){tipsPluginFunc('processIf')});$_o.txt_insert_field($_o.processForm,'.p-m-if-val-func-field select',function(sltObj){return $(sltObj).parents('td').eq(0).find('[data-process="if:if_val:"]')});$($_o.processForm).on('click','.p-m-if-info',function(){var tips='<p>执行顺序:从上至下判断,逻辑符“并且”的优先级高于“或者”</p>'+'<p>例如(字母表示条件):</p>'+'<p>a &amp;&amp; b || c &amp;&amp; d &amp;&amp; e || f || g &amp;&amp; h &amp;&amp; i &amp;&amp; j 等同于</p>'+'<p>(a &amp;&amp; b) || (c &amp;&amp; d &amp;&amp; e) || f || (g &amp;&amp; h &amp;&amp; i &amp;&amp; j)</p>'+'<p>括号中的条件都为真时才是真否则为假,整条语句中任意一个括号的结果为真最终结果为真,都为假最终结果为假</p>';confirmRight({msg:tips,yes:'确定',width:500,textAlign:'left'})});$($_o.processForm).on('click','.p-m-api-add',function(){var apiTable=$(this).parents('section').eq(0).find('.p-m-api-table table');apiTable.find('tbody').append('<tr>'+apiTable.attr('data-tpl')+'</tr>')});$($_o.processForm).on('click','.p-m-api-del',function(){var tr=$(this).parents('tr').eq(0);tr.remove()});inputSelectCustom(null,null,{box:$_o.processForm,slt:'[data-process="api:api_charset"]',ipt:'[data-process="api:api_charset_custom"]'});inputSelectCustom(null,null,{box:$_o.processForm,slt:'[data-process="api:api_encode"]',ipt:'[data-process="api:api_encode_custom"]'});$($_o.processForm).on('change','[data-process="api:api_params:val:"],[data-process="api:api_headers:val:"]',function(){var isHeader=!1;if($(this).attr('data-process')=='api:api_headers:val:'){isHeader=!0}
var val=$(this).val();var tdObj=$(this).parents('td').eq(0);var iptObj=tdObj.find('[data-process="api:'+(isHeader?'api_headers':'api_params')+':addon:"]');var sltObj=tdObj.find('.p-m-api-'+(isHeader?'header':'val')+'-field');iptObj.hide();sltObj.hide();if(val=='time'||val=='custom'){if(val=='time'){iptObj.attr('placeholder','默认格式Y-m-d H:i:s')}else if(val=='custom'){iptObj.attr('placeholder','输入任何内容');sltObj.css('display','table-cell')}
iptObj.show()}});$_o.txt_insert_field($_o.processForm,'.p-m-api-val-field select',function(sltObj){return $(sltObj).parents('td').eq(0).find('[data-process="api:api_params:addon:"]')});$_o.txt_insert_field($_o.processForm,'.p-m-api-header-field select',function(sltObj){return $(sltObj).parents('td').eq(0).find('[data-process="api:api_headers:addon:"]')});$($_o.processForm).on('click','.p-m-api-header-add',function(){var apiHdTable=$(this).parents('section').eq(0).find('.p-m-api-header-table');apiHdTable.append('<tr>'+apiHdTable.attr('data-tpl')+'</tr>')});$($_o.processForm).on('click','.p-m-api-header-del',function(){var tr=$(this).parents('tr').eq(0);tr.remove()});$($_o.processForm).on('change','[data-process="api:api_type"]',function(){var obj=$(this).parents('section').eq(0).find('.p-m-api-content-type');if($(this).val()=='post'){obj.show()}else{obj.hide()}});$($_o.processForm).on('change','[data-process="api:api_json_arr"]',function(){var ipt=$(this).parent().find('[data-process="api:api_json_implode"]');if($(this).val()=='implode'){ipt.show()}else{ipt.hide()}});$($_o.processForm).on('click','.sign-wildcard',function(){var toObj=$(this).parent().siblings('[data-process="replace:replace_from"]');cpWildcard(toObj)});$($_o.processForm).on('click','.c-p-process-title',function(){var panelTitle=$(this).parents('.panel').eq(0).find('.panel-title-title');if(panelTitle.find('input').is(':visible')){panelTitle.find('*').show();panelTitle.find('input').hide()}else{panelTitle.find('*').hide();panelTitle.find('input').show()}});(function(processForm,processBox){$(processForm).on('click','.c-p-process-clone',function(){var panelObj=$(this).parents('.panel[data-name^="process"]').eq(0);var formEle=document.createElement('form');$(formEle).append(panelObj.clone());$(panelObj).find('[name^="process"]').each(function(index){var processEle=$(formEle).find('[name^="process"]').eq(index);if($(this).is('input:radio')||$(this).is('input:checkbox')){processEle.prop('checked',$(this).is(':checked'))}else{processEle.val($(this).val())}});confirmRight({msg:'拷贝或复制数据处理',yes:'复制',no:'拷贝',close:!0},function(){ajaxOpen({type:'POST',dataType:'json',url:ulink('cpattern/clone_process'),data:$(formEle).serialize(),success:function(data){if(data.code==1){$_o.processForm=processForm;$_o.processBox=processBox;$_o.add(data.data);toastr.success(data.msg)}}})},function(){ajaxOpen({type:'POST',dataType:'json',url:ulink('cpattern/clone_process?op=copy'),data:$(formEle).serialize(),success:function(data){if(data.code==1){toastr.success(data.msg)}}})})})})($_o.processForm,$_o.processBox);$($_o.processForm).on('click','.c-p-process-del',function(){$_o.del(this)});eleExchange($_o.processForm+' .c-p-process-accordion','.panel-title-ops .icon-drag-move','.panel');if(processData){for(var i in processData){if(processData[i]){$_o.add(processData[i])}}}
$($_o.processForm).prop('inited',1)},add_sub:function(){var $_o=this;ajaxOpen({type:'POST',dataType:'json',url:$($_o.processForm).attr('action'),data:$($_o.processForm).serialize(),success:function(data){if(data.code==1){$('#myModal').modal('hide');if(data.data&&data.data.objid){$($_o.$_cp.formid+' #'+data.data.objid).find('input[name="config[field_process][]"]').val(data.data.process_json?url_base64encode(data.data.process_json):'');if(data.data.process){var process=data.data.process;var ptitle=[];for(var i in process){ptitle.push(window.tpl_lang['process_module_'+process[i].module]+(process[i].title?(''+process[i].title):''))}
ptitle=ptitle.join(' / ');$($_o.$_cp.formid+' #'+data.data.objid).find('.field-process').addClass('exist-process').attr('title',ptitle)}else{$($_o.$_cp.formid+' #'+data.data.objid).find('.field-process').removeClass('exist-process').attr('title','')}}}else{toastr.error(data.msg)}},error:function(data){toastr.error(data)}});return!1},del:function(obj){var $_o=this;confirmRight('是否删除?',function(){$(obj).parents('.panel').eq(0).remove()})},load_if_func:function(box,setVal){var $_o=this;loadPluginFunc({module:'processIf',boxObj:box,funcObj:'[data-process="if:if_addon:func:"]',paramObj:'[data-process="if:if_val:"]',funcVal:setVal,cache:!0})},add:function(params){var $_o=this;params=params?params:{};if(!params.module){toastr.error('请选择处理方式');return!1}
iptObj.show()}});$_o.txt_insert_field($_o.processForm,'.p-m-api-val-field select',function(sltObj){return $(sltObj).parents('td').eq(0).find('[data-process="api:api_params:addon:"]')});$_o.txt_insert_field($_o.processForm,'.p-m-api-header-field select',function(sltObj){return $(sltObj).parents('td').eq(0).find('[data-process="api:api_headers:addon:"]')});$($_o.processForm).on('click','.p-m-api-header-add',function(){var apiHdTable=$(this).parents('section').eq(0).find('.p-m-api-header-table table');apiHdTable.find('tbody').append('<tr>'+apiHdTable.attr('data-tpl')+'</tr>')});$($_o.processForm).on('click','.p-m-api-header-del',function(){var tr=$(this).parents('tr').eq(0);tr.remove()});$($_o.processForm).on('change','[data-process="api:api_type"]',function(){var obj=$(this).parents('section').eq(0).find('.p-m-api-content-type');if($(this).val()=='post'){obj.show()}else{obj.hide()}});$($_o.processForm).on('change','[data-process="api:api_json_arr"]',function(){var ipt=$(this).parent().find('[data-process="api:api_json_implode"]');if($(this).val()=='implode'){ipt.show()}else{ipt.hide()}});$($_o.processForm).on('click','.sign-wildcard',function(){var toObj=$(this).parent().siblings('[data-process="replace:replace_from"]');cpWildcard(toObj)});$($_o.processForm).on('click','.c-p-process-title',function(){var panelTitle=$(this).parents('.panel').eq(0).find('.panel-title-title');if(panelTitle.find('input').is(':visible')){panelTitle.find('*').show();panelTitle.find('input').hide()}else{panelTitle.find('*').hide();panelTitle.find('input').show()}});(function(processForm,processBox){$(processForm).on('click','.c-p-process-clone',function(){var panelObj=$(this).parents('.panel[data-name^="process"]').eq(0);var formEle=document.createElement('form');$(formEle).append(panelObj.clone());$(panelObj).find('[name^="process"]').each(function(index){var processEle=$(formEle).find('[name^="process"]').eq(index);if($(this).is('input:radio')||$(this).is('input:checkbox')){processEle.prop('checked',$(this).is(':checked'))}else{processEle.val($(this).val())}});confirmRight({msg:'拷贝或复制数据处理',yes:'复制',no:'拷贝',close:!0},function(){ajaxOpen({type:'POST',dataType:'json',url:ulink('cpattern/clone_process'),data:$(formEle).serialize(),success:function(data){if(data.code==1){$_o.processForm=processForm;$_o.processBox=processBox;$_o.add(data.data);toastr.success(data.msg)}}})},function(){ajaxOpen({type:'POST',dataType:'json',url:ulink('cpattern/clone_process?op=copy'),data:$(formEle).serialize(),success:function(data){if(data.code==1){toastr.success(data.msg)}}})})})})($_o.processForm,$_o.processBox);$($_o.processForm).on('click','.c-p-process-del',function(){$_o.del(this)});eleExchange($_o.processForm+' .c-p-process-accordion','.panel-title-ops .icon-drag-move','.panel');if(processData){for(var i in processData){if(processData[i]){$_o.add(processData[i])}}}
$($_o.processForm).prop('inited',1)},add_sub:function(){var $_o=this;ajaxOpen({type:'POST',dataType:'json',url:$($_o.processForm).attr('action'),data:$($_o.processForm).serialize(),success:function(data){if(data.code==1){$('#myModal').modal('hide');if(data.data&&data.data.objid){$($_o.$_cp.formid+' #'+data.data.objid).find('input[name="config[field_process][]"]').val(data.data.process_json?url_base64encode(data.data.process_json):'');var ptitle='';var processData=data.data.process;if(processData){ptitle=[];for(var i in processData){ptitle.push(window.tpl_lang['process_module_'+processData[i].module]+(processData[i].title?(''+processData[i].title):''))}
ptitle=ptitle.join(' / ')}
if(processData&&ptitle){$($_o.$_cp.formid+' #'+data.data.objid).find('.field-process').addClass('exist-process').attr('title',ptitle)}else{$($_o.$_cp.formid+' #'+data.data.objid).find('.field-process').removeClass('exist-process').attr('title','')}}}else{toastr.error(data.msg)}},error:function(data){toastr.error(data)}});return!1},del:function(obj){var $_o=this;confirmRight('是否删除?',function(){$(obj).parents('.panel').eq(0).remove()})},load_if_func:function(box,setVal){var $_o=this;loadPluginFunc({module:'processIf',boxObj:box,funcObj:'[data-process="if:if_addon:func:"]',paramObj:'[data-process="if:if_val:"]',funcVal:setVal,cache:!0})},add:function(params){var $_o=this;params=params?params:{};if(!params.module){toastr.error('请选择处理方式');return!1}
params.module=htmlspecialchars(params.module);params.title=params.title?htmlspecialchars(params.title):'';var parentid=$($_o.processForm+' .c-p-process-accordion').attr('id');if(!parentid){parentid='p_accordion_'+generateUUID();$($_o.processForm+' .c-p-process-accordion').attr('id',parentid)}
var dataParent=parentid?('data-parent="#'+parentid+'"'):'';var moduleHtml=$($_o.processBox+' .c-p-process-module[module="'+params.module+'"]').html();if(params.module=='html'){moduleHtml=moduleHtml.replace(/p_m_html_allow/ig,'p_m_html_allow_'+generateUUID());moduleHtml=moduleHtml.replace(/p_m_html_filter/ig,'p_m_html_filter_'+generateUUID())}
var processName='process[i_'+generateUUID()+']';moduleHtml='<input type="hidden" name="'+processName+'[module]" value="'+params.module+'" />'+moduleHtml;var collapseId='p_collapse_'+generateUUID();var html=$_o.$_cp.clone_tpl('#coll_tpl_process');html.attr('data-name',processName);html.find('a[data-toggle="collapse"]').attr('data-parent','#'+parentid).attr('href','#'+collapseId);if(params.title){html.find('.panel-title > a[data-toggle="collapse"]').text(window.tpl_lang['process_module_'+params.module]+'');html.find('.panel-title-title > a[data-toggle="collapse"]').text(params.title).show()}else{html.find('.panel-title > a[data-toggle="collapse"]').text(window.tpl_lang['process_module_'+params.module]);html.find('.panel-title-title > a[data-toggle="collapse"]').hide()}
@ -175,7 +200,7 @@ if(eleName.length>=4){eleName[1]+=eleName[3]?('['+eleName[3]+']'):'[]'}
$(this).attr('name',eleName[1])});if(params.module=='html'){$(curCollapse).find('[data-process="html:html_allow"]').val(params.html_allow?params.html_allow:'');$(curCollapse).find('[data-process="html:html_filter"]').val(params.html_filter?params.html_filter:'');if(params.html_filter){$(curCollapse).find('a[href^="#p_m_html_filter"]').tab('show')}}else if(params.module=='insert'){$(curCollapse).find('[data-process="insert:insert_loc"]').val(params.insert_loc?params.insert_loc:'').trigger('change');$(curCollapse).find('[data-process="insert:insert_txt"]').val(params.insert_txt?params.insert_txt:'')}else if(params.module=='replace'){$(curCollapse).find('[data-process="replace:replace_from"]').val(params.replace_from?params.replace_from:'');$(curCollapse).find('[data-process="replace:replace_to"]').val(params.replace_to?params.replace_to:'')}else if(params.module=='filter'){$(curCollapse).find('[data-process="filter:filter_list"]').val(params.filter_list?params.filter_list:'');$(curCollapse).find('[data-process="filter:filter_replace"]').val(params.filter_replace?params.filter_replace:'');$(curCollapse).find('[data-process="filter:filter_pass"][value="'+params.filter_pass+'"]').prop('checked',!0)}else if(params.module=='tool'){$(curCollapse).find('[data-process="tool:tool_list"]').attr('name',processName+'[tool_list][]');if(params.tool_list){for(var ti in params.tool_list){$(curCollapse).find('[data-process="tool:tool_list"][value="'+params.tool_list[ti]+'"]').prop('checked',!0)}}}else if(params.module=='translate'){$(curCollapse).find('[data-process="translate:translate_from"]').val(params.translate_from?params.translate_from:'').trigger('change');$(curCollapse).find('[data-process="translate:translate_to"]').val(params.translate_to?params.translate_to:'').trigger('change');$(curCollapse).find('[data-process="translate:translate_from_custom"]').val(params.translate_from_custom?params.translate_from_custom:'');$(curCollapse).find('[data-process="translate:translate_to_custom"]').val(params.translate_to_custom?params.translate_to_custom:'')}else if(params.module=='batch'){$(curCollapse).find('[data-process="batch:batch_list"]').val(params.batch_list?params.batch_list:'')}else if(params.module=='substr'){$(curCollapse).find('[data-process="substr:substr_len"]').val(params.substr_len?params.substr_len:'');$(curCollapse).find('[data-process="substr:substr_end"]').val(params.substr_end?params.substr_end:'')}else if(params.module=='func'){$(curCollapse).find('[data-process="func:func_param"]').val(params.func_param?params.func_param:'');loadPluginFunc({module:'process',boxObj:$(curCollapse),funcObj:'[data-process="func:func_name"]',paramObj:'[data-process="func:func_param"]',funcVal:params.func_name,cache:!0})}else if(params.module=='if'){var ifTrTpl=$(curCollapse).find('.p-m-if-table-tpl');var ifTable=$(curCollapse).find('.p-m-if-table');ifTable.attr('data-tpl',ifTrTpl.html());ifTrTpl.remove();if(params.if_type){$(curCollapse).find('[data-process="if:if_type"]').val(params.if_type)}
if(params.if_logic&&params.if_cond&&params.if_val){params.if_addon=params.if_addon?params.if_addon:{};for(var i in params.if_logic){ifTable.find('tbody').append('<tr data-if-id="'+i+'">'+ifTable.attr('data-tpl')+'</tr>');var curIfTr=ifTable.find('tr[data-if-id="'+i+'"]');curIfTr.find('[data-process="if:if_logic:"]').val(params.if_logic[i]);curIfTr.find('[data-process="if:if_cond:"]').val(params.if_cond[i]).trigger('change');curIfTr.find('[data-process="if:if_val:"]').val(params.if_val[i]);if(params.if_cond[i]=='func'){var ifFuncVal='';if(params.if_addon.func){ifFuncVal=params.if_addon.func[i]}
$_o.load_if_func(curIfTr,ifFuncVal);if(params.if_addon.turn){curIfTr.find('[data-process="if:if_addon:turn:"]').val(params.if_addon.turn[i])}}}}
eleExchange(curCollapse+' .p-m-if-table','.icon-drag-move','tbody tr')}else if(params.module=='api'){var apiTrTpl=$(curCollapse).find('.p-m-api-table-tpl');var apiTable=$(curCollapse).find('.p-m-api-table');apiTable.attr('data-tpl',apiTrTpl.html());apiTrTpl.remove();var apiHdTrTpl=$(curCollapse).find('.p-m-api-header-table-tpl');var apiHdTable=$(curCollapse).find('.p-m-api-header-table');apiHdTable.attr('data-tpl',apiHdTrTpl.html());apiHdTrTpl.remove();$(curCollapse).find('[data-process="api:api_url"]').val(params.api_url?params.api_url:'');$(curCollapse).find('[data-process="api:api_type"]').val(params.api_type?params.api_type:'').trigger('change');$(curCollapse).find('[data-process="api:api_content_type"]').val(params.api_content_type?params.api_content_type:'');$(curCollapse).find('[data-process="api:api_charset"]').val(params.api_charset?params.api_charset:'').trigger('change');$(curCollapse).find('[data-process="api:api_charset_custom"]').val(params.api_charset_custom?params.api_charset_custom:'');if(params.api_params){params.api_params.name=params.api_params.name?params.api_params.name:{};params.api_params.val=params.api_params.val?params.api_params.val:{};params.api_params.addon=params.api_params.addon?params.api_params.addon:{};for(var i in params.api_params.name){var trId='p-m-api-param_'+generateUUID();var trTpl='<tr id="'+trId+'">'+apiTable.attr('data-tpl')+'</tr>';apiTable.find('tbody').append(trTpl);apiTable.find('#'+trId+' [data-process="api:api_params:name:"]').val(params.api_params.name[i]);apiTable.find('#'+trId+' [data-process="api:api_params:val:"]').val(params.api_params.val[i]?params.api_params.val[i]:'').trigger('change');apiTable.find('#'+trId+' [data-process="api:api_params:addon:"]').val(params.api_params.addon[i]?params.api_params.addon[i]:'')}}
eleExchange(curCollapse+' .p-m-if-table','.icon-drag-move','tbody tr')}else if(params.module=='api'){var apiTrTpl=$(curCollapse).find('.p-m-api-table-tpl');var apiTable=$(curCollapse).find('.p-m-api-table table');apiTable.attr('data-tpl',apiTrTpl.html());apiTrTpl.remove();var apiHdTrTpl=$(curCollapse).find('.p-m-api-header-table-tpl');var apiHdTable=$(curCollapse).find('.p-m-api-header-table table');apiHdTable.attr('data-tpl',apiHdTrTpl.html());apiHdTrTpl.remove();$(curCollapse).find('[data-process="api:api_url"]').val(params.api_url?params.api_url:'');$(curCollapse).find('[data-process="api:api_type"]').val(params.api_type?params.api_type:'').trigger('change');$(curCollapse).find('[data-process="api:api_content_type"]').val(params.api_content_type?params.api_content_type:'');$(curCollapse).find('[data-process="api:api_charset"]').val(params.api_charset?params.api_charset:'').trigger('change');$(curCollapse).find('[data-process="api:api_charset_custom"]').val(params.api_charset_custom?params.api_charset_custom:'');$(curCollapse).find('[data-process="api:api_encode"]').val(params.api_encode?params.api_encode:'').trigger('change');$(curCollapse).find('[data-process="api:api_encode_custom"]').val(params.api_encode_custom?params.api_encode_custom:'');if(params.api_params){params.api_params.name=params.api_params.name?params.api_params.name:{};params.api_params.val=params.api_params.val?params.api_params.val:{};params.api_params.addon=params.api_params.addon?params.api_params.addon:{};for(var i in params.api_params.name){var trId='p-m-api-param_'+generateUUID();var trTpl='<tr id="'+trId+'">'+apiTable.attr('data-tpl')+'</tr>';apiTable.find('tbody').append(trTpl);apiTable.find('#'+trId+' [data-process="api:api_params:name:"]').val(params.api_params.name[i]);apiTable.find('#'+trId+' [data-process="api:api_params:val:"]').val(params.api_params.val[i]?params.api_params.val[i]:'').trigger('change');apiTable.find('#'+trId+' [data-process="api:api_params:addon:"]').val(params.api_params.addon[i]?params.api_params.addon[i]:'')}}
if(params.api_headers){params.api_headers.name=params.api_headers.name?params.api_headers.name:{};params.api_headers.val=params.api_headers.val?params.api_headers.val:{};params.api_headers.addon=params.api_headers.addon?params.api_headers.addon:{};for(var i in params.api_headers.name){var trId='p-m-api-header_'+generateUUID();var trTpl='<tr id="'+trId+'">'+apiHdTable.attr('data-tpl')+'</tr>';apiHdTable.find('tbody').append(trTpl);apiHdTable.find('#'+trId+' [data-process="api:api_headers:name:"]').val(params.api_headers.name[i]);apiHdTable.find('#'+trId+' [data-process="api:api_headers:val:"]').val(params.api_headers.val[i]?params.api_headers.val[i]:'').trigger('change');apiHdTable.find('#'+trId+' [data-process="api:api_headers:addon:"]').val(params.api_headers.addon[i]?params.api_headers.addon[i]:'')}}
$(curCollapse).find('[data-process="api:api_json"]').val(params.api_json?params.api_json:'');$(curCollapse).find('[data-process="api:api_json_arr"]').val(params.api_json_arr?params.api_json_arr:'implode').trigger('change');$(curCollapse).find('[data-process="api:api_json_implode"]').val(params.api_json_implode?params.api_json_implode:'');$(curCollapse).find('[data-process="api:api_interval"]').val(params.api_interval?params.api_interval:'');$(curCollapse).find('[data-process="api:api_wait"]').val(params.api_wait?params.api_wait:'');$(curCollapse).find('[data-process="api:api_retry"]').val(params.api_retry?params.api_retry:'')}
if($_o.processForm!=$_o.processFormField){$('#myModal').modal('hide')}},txt_insert_field:function(boxEle,sltEle,txtObjFunc){var $_o=this;$(boxEle).on('mouseover',sltEle,function(){if(!$(this).attr('data-loaded')){var fieldNames=$_o.$_cp.get_field_names(!0);var html='<option value="">插入字段</option><option value="###">###表示当前字段</option>';if(fieldNames){var formField=$(this).parents($_o.processFormField).eq(0).find('[name="field"]').val();if(formField){for(var i=0;i<fieldNames.length;i++){var curField=fieldNames[i];if(formField&&formField==curField){if(i<fieldNames.length-1){html+='<optgroup label="不能调用当前字段顺序后面的字段,可移动字段位置使之生效"></optgroup>'}
@ -203,7 +228,7 @@ if(contentSignFunc){showPanelCollapse('#panel_content_sign_func')}
loadPluginFunc({module:'contentSign',boxObj:$_o.formObj,funcObj:'[name="content_sign[func]"]',funcVal:contentSignFunc,paramObj:'[name="content_sign[func_param]"]'});$($_o.formObj+' .c-p-content-sign-add-cur').bind('click',function(){insertAtCaret($($_o.formObj).find('[name="content_sign[func_param]"]'),'###')});$($_o.formObj).on('click','.c-p-url-page-signs .btn-page-signs',function(){$_o.$_cp.parent_page_signs(this)})},add_sub:function(){var $_o=this;ajaxOpen({type:'POST',dataType:'json',url:$($_o.formObj).attr('action'),data:$($_o.formObj).serialize(),success:function(data){if(data.code==1){data=data.data;if(data&&data.content_sign){var contentSign=data.content_sign;if($_o.$_cp.page_is_list($_o.curPageType)){var namePre=$_o.$_cp.get_page_vars($_o.curPageType,'namePre');var pageTypeConfig=$_o.curPageConfig[namePre];if(!isObject(pageTypeConfig.content_signs)){pageTypeConfig.content_signs=[]}
contentSign._objid=data.objid;pageTypeConfig.content_signs.push(contentSign);$_o.curPageConfig[namePre]=pageTypeConfig}else{$_o.page_add($_o.curPageType,data.objid,contentSign)}}
$('#myModal').modal('hide')}else{toastr.error(data.msg)}},error:function(data){toastr.error(data)}});return!1}}
function cpRuleModuleInit(boxId,name,namePre){namePre=namePre?namePre:'';$(boxId+' [name="'+name+'['+namePre+'rule_multi]"]').bind('change',function(){if($(this).is(':checked')){$(boxId+' #c_p_'+name+'_'+namePre+'rule_multi_str').show()}else{$(boxId+' #c_p_'+name+'_'+namePre+'rule_multi_str').hide()}});$(boxId+' select[name="'+name+'['+namePre+'xpath_attr]"]').bind('change',function(){if($(this).val()=='custom'){$(boxId+' [name="'+name+'['+namePre+'xpath_attr_custom]"]').show()}else{$(boxId+' [name="'+name+'['+namePre+'xpath_attr_custom]"]').hide()}});$(boxId+' [name="'+name+'['+namePre+'xpath_multi]"]').bind('change',function(){if($(this).is(':checked')){$(boxId+' #c_p_'+name+'_'+namePre+'xpath_multi_str').show()}else{$(boxId+' #c_p_'+name+'_'+namePre+'xpath_multi_str').hide()}});$(boxId+' select[name="'+name+'['+namePre+'json_arr]"]').bind('change',function(){if($(this).val()=='implode'){$(boxId+' #c_p_'+name+'_'+namePre+'json_arr_implode').show()}else{$(boxId+' #c_p_'+name+'_'+namePre+'json_arr_implode').hide()}})}
function cpRuleModuleInit(boxId,name,namePre){namePre=namePre?namePre:'';$(boxId+' [name="'+name+'['+namePre+'rule_multi]"]').bind('change',function(){if($(this).is(':checked')){$(boxId+' #c_p_'+name+'_'+namePre+'rule_multi_str').show()}else{$(boxId+' #c_p_'+name+'_'+namePre+'rule_multi_str').hide()}});inputSelectCustom(boxId+' select[name="'+name+'['+namePre+'xpath_attr]"]',name+'['+namePre+'xpath_attr_custom]');$(boxId+' [name="'+name+'['+namePre+'xpath_multi]"]').bind('change',function(){if($(this).is(':checked')){$(boxId+' #c_p_'+name+'_'+namePre+'xpath_multi_str').show()}else{$(boxId+' #c_p_'+name+'_'+namePre+'xpath_multi_str').hide()}});$(boxId+' select[name="'+name+'['+namePre+'json_arr]"]').bind('change',function(){if($(this).val()=='implode'){$(boxId+' #c_p_'+name+'_'+namePre+'json_arr_implode').show()}else{$(boxId+' #c_p_'+name+'_'+namePre+'json_arr_implode').hide()}})}
function cpRuleModuleLoad(boxId,name,namePre,config){namePre=namePre?namePre:'';if(config){$(boxId+' [name="'+name+'['+namePre+'rule]"]').val(config[namePre+'rule']);$(boxId+' [name="'+name+'['+namePre+'rule_merge]"]').val(config[namePre+'rule_merge']);if(config[namePre+'rule_multi']){$(boxId+' [name="'+name+'['+namePre+'rule_multi]"]').prop('checked',!0).trigger('change')}
$(boxId+' [name="'+name+'['+namePre+'rule_multi_type]"][value="'+(config[namePre+'rule_multi_type']?config[namePre+'rule_multi_type']:'')+'"]').prop('checked',!0);$(boxId+' [name="'+name+'['+namePre+'xpath]"]').val(config[namePre+'xpath']);if(config[namePre+'xpath_multi']){$(boxId+' [name="'+name+'['+namePre+'xpath_multi]"]').prop('checked',!0).trigger('change')}
$(boxId+' [name="'+name+'['+namePre+'xpath_multi_type]"][value="'+(config[namePre+'xpath_multi_type']?config[namePre+'xpath_multi_type']:'')+'"]').prop('checked',!0);if(config[namePre+'json_loop']){$(boxId+' [name="'+name+'['+namePre+'json_loop]"]').prop('checked',!0)}

View File

@ -7,8 +7,8 @@
| 使用协议 https://www.skycaiji.com/licenses
|--------------------------------------------------------------------------
*/
'use strict';function SkycaijiCpatternBrowser(){this.consoleId='#skycaiji_console';this.config=null;this.bdNum=0;this.bdNumMax=11}
SkycaijiCpatternBrowser.prototype={constructor:SkycaijiCpatternBrowser,init:function(config){var $_o=this;$_o.config=config?config:{};$('#skycaiji_wrapper').attr('skycaiji-console',$($_o.consoleId).prop('outerHTML'));$('#skycaiji_tpl').remove();$('body').append('<textarea id="skycaiji_tpl" style="display:none;"></textarea>');$('#skycaiji_tpl').val($('#skycaiji_wrapper').prop("outerHTML"));$('#skycaiji_wrapper').remove();$('*').removeAttr('onclick').unbind('click').bind('click',function(){var tagName=$(this).prop('tagName').toLowerCase();if(tagName=='body'||tagName=='html'){return!1}
'use strict';function SkycaijiCpatternBrowser(){this.consoleId='#skycaiji_console';this.bdNum=0;this.bdNumMax=11}
SkycaijiCpatternBrowser.prototype={constructor:SkycaijiCpatternBrowser,init:function(configTips){var $_o=this;$('#skycaiji_wrapper').attr('skycaiji-console',$($_o.consoleId).prop('outerHTML'));$('#skycaiji_tpl').remove();$('body').append('<textarea id="skycaiji_tpl" style="display:none;"></textarea>');$('#skycaiji_tpl').val($('#skycaiji_wrapper').prop("outerHTML"));$('#skycaiji_wrapper').remove();$('*').removeAttr('onclick').unbind('click').bind('click',function(){var tagName=$(this).prop('tagName').toLowerCase();if(tagName=='body'||tagName=='html'){return!1}
$(this).data('skycaiji-click',$(this).data('skycaiji-click')?0:1);var xpaths=$_o.get_xpaths(this,!1);if(!xpaths.listXpath){var xpaths1=$_o.get_xpaths(this,!0);xpaths1.xpath=xpaths.xpath;xpaths=xpaths1}
$($_o.consoleId).remove();$('#skycaiji_wrapper').append($('#skycaiji_wrapper').attr('skycaiji-console'));$($_o.consoleId).show();if(xpaths.xpath){$($_o.consoleId).find('[skycaiji-id="xpath"]').val(xpaths.xpath);if(!xpaths.listXpath){$_o.show_xpath_ele($($_o.consoleId+' [skycaiji-id="show-xpath"]'),xpaths.xpath,$(this).data('skycaiji-click'))}}
if(xpaths.listXpath){$($_o.consoleId+' [skycaiji-id="listXpath"]').val(xpaths.listXpath);$($_o.consoleId+' [skycaiji-id="listXpath"]').parents('.skycaiji-block').eq(0).show();$($_o.consoleId+' [skycaiji-id="box-listXpath"]').removeClass('skycaiji-b-c-i');if(xpaths.listXpaths&&xpaths.listXpaths.length>1){var lxSlt=$($_o.consoleId+' [skycaiji-id="listXpaths"]');var sltOptions='';for(var i=xpaths.listXpaths.length-1;i>=0;i--){var lxOption=document.createElement('option');lxOption.value=xpaths.listXpaths[i];lxOption.text=xpaths.listXpaths[i];lxSlt.append(lxOption)}
@ -20,14 +20,12 @@ propVal=propVal.replace(/\s*class\s*=\s*[\'\"]\s*[\'\"]/ig,'')}else if(prop=='te
propVal=propVal?propVal:'';propVals[prop]=propVal}
$.each($(csspath)[0].attributes,function(){if(typeof(propVals[this.name])=='undefined'||propVals[this.name]==null){propVals[this.name]=this.value?this.value:''}});if(propVals){var html='';for(var i in propVals){if(propVals[i]){html+='<tr><td width="100px;">'+i+'</td><td><textarea rowspan="2">'+propVals[i]+'</textarea></td></tr>'}}
if(html){html='<table>'+html+'</table>'}
if(html){$_o.tips(html,3000,'skycaiji_tips_html',1)}else{$_o.tips('没有属性',1500)}}}});$('body').append($('#skycaiji_tpl').val());$('#skycaiji_wrapper').show();var configSetting={'charset':{name:'网页编码',val:'',loc:'采集器设置»网页编码'},'url_complete':{name:'自动补全网址',val:'',loc:'采集器设置»自动补全网址'},'page_render':{name:'页面渲染',val:'',loc:'采集器设置»页面渲染'},'useragent':{name:'浏览器标识',val:'',loc:'采集器设置»请求头信息»浏览器标识'},'cookie':{name:'cookie数据',val:'',loc:'采集器设置»请求头信息»Cookie 缓存数据'},};var configSetted={};var configUnset={};var cCharset={name:'网页编码',val:'',loc:'采集器设置»网页编码',}
if(!config.url_complete){configUnset.url_complete=configSetting.url_complete}
if(config.charset!='auto'&&config.charset!=''){configSetting.charset.val=config.charset;configSetted.charset=configSetting.charset}
if(config.request_headers&&config.request_headers.open==1){if(config.request_headers.useragent){configSetting.useragent.val=config.request_headers.useragent;configSetted.useragent=configSetting.useragent}
if(config.request_headers.cookie){configSetting.cookie.val=config.request_headers.cookie;configSetted.cookie=configSetting.cookie}}
var html='所见即所得,已过滤所有脚本!<br>';var htmlUnset='';for(var i in configUnset){htmlUnset+='<li title="位置:'+$_o.htmlspecialchars(configUnset[i].loc)+'">'+configUnset[i].name+'</li>'}
htmlUnset=htmlUnset?('建议设置:<ul>'+htmlUnset+'</ul>'):'';var htmlSetted='';for(var i in configSetted){htmlSetted+='<li title="值:'+$_o.htmlspecialchars(configSetted[i].val)+'">'+configSetted[i].name+'</li>'}
htmlSetted=htmlSetted?('已设置:<ul>'+htmlSetted+'</ul>'):'';html=html+htmlUnset+htmlSetted;$_o.tips(html,3000,'skycaiji_tips_list')},get_xpaths:function(element,noId){var $_o=this;var listXpath='';var maxEleNum=1;var xpath=$_o.ele_xpath(element,noId);xpath=xpath.split('/');var listXpaths=[];for(var i=(xpath.length-1);i>=0;i--){if(!xpath[i]){continue}
if(html){$_o.tips(html,3000,'skycaiji_tips_html',1)}else{$_o.tips('没有属性',1500)}}}});$('body').append($('#skycaiji_tpl').val());$('#skycaiji_wrapper').show();var html='所见即所得,已过滤所有脚本!<br>';if(configTips&&typeof(configTips)=='object'){var htmlUnset='';if(configTips.unset&&typeof(configTips.unset)=='object'){for(var i in configTips.unset){htmlUnset+='<li>'+configTips.unset[i]+'</li>'}
htmlUnset=htmlUnset?('建议设置:<ul>'+htmlUnset+'</ul>'):''}
var htmlSetted='';if(configTips.setted&&typeof(configTips.setted)=='object'){for(var i in configTips.setted){htmlSetted+='<li>'+configTips.setted[i]+'</li>'}
htmlSetted=htmlSetted?('已设置:<ul>'+htmlSetted+'</ul>'):''}
html=html+htmlUnset+htmlSetted}
$_o.tips(html,3000,'skycaiji_tips_list')},get_xpaths:function(element,noId){var $_o=this;var listXpath='';var maxEleNum=1;var xpath=$_o.ele_xpath(element,noId);xpath=xpath.split('/');var listXpaths=[];for(var i=(xpath.length-1);i>=0;i--){if(!xpath[i]){continue}
var parentXpath=xpath.slice(0,i+1);parentXpath[i]=parentXpath[i].replace(/\[\d+\]/,'');parentXpath=parentXpath.join('/');var subXpath=xpath.slice(i+1);subXpath=subXpath.join('/');var parentCsspath=$_o.xpath2csspath(parentXpath);var subCsspath=$_o.xpath2csspath(subXpath);var eleNum=0;if(subCsspath){var curIndex=-1;$(parentCsspath).each(function(){curIndex++;var curCsspath=parentCsspath+':eq('+curIndex+')>'+subCsspath;eleNum+=parseInt($(curCsspath).length)})}else{eleNum+=parseInt($(parentCsspath).length)}
if(eleNum>maxEleNum){maxEleNum=eleNum;listXpath=parentXpath+(subXpath?('/'+subXpath):'');listXpaths.push(listXpath)}}
return{'xpath':xpath.join('/'),'listXpath':listXpath,'listXpaths':listXpaths}},ele_xpath:function(ele,noId){if(!noId&&$(ele).prop('id')){return'//*[@id="'+$(ele).prop('id')+'"]'}

View File

@ -8,10 +8,12 @@
|--------------------------------------------------------------------------
*/
'use strict';function CpatternEasy(){this.collIfrId='#ifr_collector';this.browserIfrId='#ifr_browser';this.guideId='#box_guide';this.timer=null;this.timerCount=0;this.intro=null;this.step={isNext:!1,from:null,to:null,last:null};this.getToStep=null;this.eleList=[];this.eleListBackup=[{element:'#coll_tab [href="#coll_pattern_source"]',intro:'采集网页先配置抓取入口',is_tab:1},{element:'#coll_pattern_source_url .add-source-url',intro:'添加列表页网址',is_modal:1},{element:'#form_source [href="#tab_custom"]',intro:'切换到手工指定',in_modal:1},{element:'#form_source [name="source[urls]"]',intro:'输入网址,一行一条列表页网址(http://或https://开头)',in_modal:1},{element:'#form_source [type="submit"]',intro:'保存网址',in_modal:1,is_submit:1},{element:'#coll_pattern_source_url .c-p-source-urls [id^="source_url_"]:last',intro:'刚才输入的列表页网址 <a href="javascript:;" onclick="cpEasyBrowser($(\'#coll_pattern_source .c-p-source-urls > .form-group:last input:text\').val(),\'source_url\');">分析网页</a>'},{element:'#coll_tab [href="#coll_pattern_link"]',intro:'从列表页中抓取内容页网址',is_tab:1},{element:'[href="#coll_pattern_level_url"]',intro:'如需从起始页中抓取列表页网址可添加多级网址(选填)',no_click:1,in_source_url:1},{element:'#panel_coll_pattern_url',intro:'内容页网址获取',in_source_url:1},{element:'#panel_coll_pattern_url [href="#coll_pattern_url_filter"]',intro:'过滤得到最终的内容页网址(选填)',no_click:1,in_source_url:1},{element:'#panel_coll_pattern_url [href="#coll_pattern_url_area"]',intro:'仅从页面某块区域中提取网址',is_accordion:1,in_source_url:1},{element:'#panel_coll_pattern_url [name="config[area_module]"]',intro:'可选规则类型正则、xpath、json',in_source_url:1},{element:'#panel_coll_pattern_url [name="config[area]"]',intro:'输入获取网址区域的规则',in_source_url:1},{element:'#panel_coll_pattern_url [href="#coll_pattern_url_url"]',intro:'精准抓取某种格式的网址',is_accordion:1,in_source_url:1},{element:'#panel_coll_pattern_url [name="config[url_rule]"]',intro:'输入提取网址规则',in_source_url:1},{element:'#panel_coll_pattern_url [name="config[url_merge]"]',intro:'拼接成最终网址',in_source_url:1},{element:'[href="#coll_pattern_relation_url"]',intro:'如需从其他页面中抓取数据可添加关联页网址(选填)',no_click:1},{element:'#coll_tab [href="#coll_pattern_field"]',intro:'从内容页中抓取数据',is_tab:1},{element:'#coll_pattern_field .add-field',intro:'添加一个字段',is_modal:1},{element:'#form_field [name="field[name]"]',intro:'字段名称',in_modal:1},{element:'#form_field [name="field[source]"]',intro:'选择数据来源(默认内容页),从选中的页面里获取数据',in_modal:1},{element:'#form_field [name="field[module]"]',intro:'获取数据的方式',in_modal:1},{element:'#c_p_field_module',intro:'编辑字段',in_modal:1},{element:'#form_field [type="submit"]',intro:'保存字段',in_modal:1,is_submit:1},{element:'#coll_pattern_field .c-p-field-list tr:last',intro:'刚才保存的字段'},{element:'[href="#coll_pattern_process"]',intro:'将采集到的字段数据进行处理(选填)',no_click:1},{element:'[href="#coll_pattern_url_pagination"]',intro:'从分页中抓取数据(选填)',no_click:1},{element:'#form_coll [type="submit"]',intro:'保存规则'},]}
CpatternEasy.prototype={constructor:CpatternEasy,init:function(){var $_o=this;var wHeight=$(window).height();var wWidth=$(window).width();var ifrWin=$($_o.collIfrId).get(0).contentWindow;if(wWidth>767){$($_o.collIfrId).height(wHeight+'px');$('#ifr_browser_box').height((wHeight-$('#ifr_browser_box').offset().top)+'px');$(ifrWin).resize(function(){$($_o.guideId).css('margin-left',$($_o.collIfrId).width()+'px')})}else{$($_o.collIfrId).height((wHeight-50)+'px');$($_o.browserIfrId).height(wHeight+'px')}
CpatternEasy.prototype={constructor:CpatternEasy,init:function(resizeWidth){var $_o=this;var wHeight=$(window).height();var wWidth=$(window).width();var ifrWin=$($_o.collIfrId).get(0).contentWindow;if(wWidth>767){$($_o.collIfrId).height(wHeight+'px');$('#ifr_browser_box').height((wHeight-$('#ifr_browser_box').offset().top)+'px');$_o.resize_width(resizeWidth);var boxResize=$('#box_resize');$('#btn_resize').bind('mousedown',function(e){boxResize.addClass('btn-resize-mousedown');var distenceX=boxResize.offset().left-e.pageX;$(document).off('mousemove').bind('mousemove',function(e){var xWidth=e.pageX-distenceX;$_o.resize_width(xWidth)});$(document).off('mouseup').bind('mouseup',function(){boxResize.removeClass('btn-resize-mousedown');$(document).off('mousemove');$(document).off('mouseup');var ifrWidth=$($_o.collIfrId).width();ifrWidth=toInt(ifrWidth);ajaxOpen({type:"GET",url:ulink('cpattern/easymode_resize?width='+ifrWidth),dataType:"json",success:function(data){}})})})}else{$($_o.collIfrId).height((wHeight-50)+'px');$($_o.browserIfrId).height(wHeight+'px')}
window.addEventListener("message",function(event){var json=event.data;if(dataIsJson(json)){json=JSON.parse(json);if(json.type=='browser_url'){$_o.browser_url(json)}}},!1);$('#btn_browser').on('click',function(){var pageSource=$('#browser_source').val();var url=$('#browser_url').val();var urls=$('#browser_urls').val();urls=dataIsJson(urls)?JSON.parse(urls):{};$('#browser_urls').val('');if(url){$('#ifr_loading').remove();$('#ifr_browser_box').append('<div id="ifr_loading"></div>');var browserUrl=cpBrowserUrl($('#coll_id').val(),pageSource,url,urls);$($_o.browserIfrId).hide().attr('src',browserUrl)}});$('#browser_url').on('keyup',function(event){  if(event.keyCode=="13"){    $('#btn_browser').trigger('click');  }});$($_o.collIfrId).bind('load',function(){var ifr=$($_o.collIfrId).contents();var wrapper=ifr.find('body').children('.wrapper');wrapper.children('.main-header').hide();wrapper.children('.main-sidebar').hide();wrapper.children('.content-wrapper').css('margin-left','0px').find('.content-header>.breadcrumb').hide();var link=window.document.createElement('link');link.setAttribute('rel','stylesheet');link.setAttribute('type','text/css');link.setAttribute('href',window.site_config.pub+'/static/css/introjs.css?'+new Date().getTime());var script=window.document.createElement('script');script.setAttribute('type','text/javascript');script.setAttribute('src',window.site_config.pub+'/static/js/intro.js?'+new Date().getTime());var style=window.document.createElement('style');style.type='text/css';style.innerHTML='.intro-form-coll-zindex *{z-index:auto!important;} '+' .intro-hide .introjs-helperLayer,.intro-hide .introjs-tooltipReferenceLayer{display:none!important;}';ifr.find('head')[0].appendChild(link);ifr.find('head')[0].appendChild(script);ifr.find('head')[0].appendChild(style);$_o.intro=null;if(ifrWin.c_pattern){var curVal=$('#browser_source').val();var sourceOptions=ifrWin.c_pattern.page_source_options(!0);if(sourceOptions){$('#browser_source').html('<option value="">页面类型</option>'+sourceOptions).val(curVal)}}
$($_o.collIfrId).show();$($_o.collIfrId).get(0).contentWindow.onunload=function(){$($_o.collIfrId).hide()}});$($_o.browserIfrId).bind('load',function(){$('#ifr_loading').remove();var ifr=$($_o.browserIfrId).contents();var consoleEle=ifr.find('#skycaiji_console');if(!consoleEle||consoleEle.length<=0){var wrapper=ifr.find('body').children('.wrapper');wrapper.children('.main-header').hide();wrapper.children('.main-sidebar').hide();wrapper.children('.content-wrapper').css('margin-left','0px').children('.content-header').hide()}
$($_o.browserIfrId).show();$($_o.browserIfrId).get(0).contentWindow.onunload=function(){$($_o.browserIfrId).hide()}})},coll_guide:function(){var $_o=this;var ifrWin=$(this.collIfrId)[0].contentWindow;var ifrJq=ifrWin.$;ifrJq('body').on('shown.bs.modal','#myModal',function(){ifrJq('#form_coll').addClass('intro-form-coll-zindex');ifrJq('#form_coll').find('.introjs-showElement,.introjs-relativePosition').removeClass('introjs-showElement introjs-relativePosition')});ifrJq('body').on('hidden.bs.modal','#myModal',function(){ifrJq('#form_coll').removeClass('intro-form-coll-zindex')});$_o.eleList=$_o.get_ele_list();var stepList=[];for(var i in $_o.eleList){var eleParams=$_o.eleList[i]?$_o.eleList[i]:{};stepList.push({element:eleParams.element?eleParams.element:'',intro:eleParams.intro?eleParams.intro:'',position:eleParams.position?eleParams.position:null})}
$($_o.browserIfrId).show();$($_o.browserIfrId).get(0).contentWindow.onunload=function(){$($_o.browserIfrId).hide()}})},resize_width:function(width){width=toInt(width);var minWidth=100;var maxWidth=$(window).width()-100;if(width<minWidth){width=minWidth}
if(width>maxWidth){width=maxWidth}
$(this.collIfrId).width(width+'px');$(this.guideId).css('margin-left',width+'px')},coll_guide:function(){var $_o=this;var ifrWin=$(this.collIfrId)[0].contentWindow;var ifrJq=ifrWin.$;ifrJq('body').on('shown.bs.modal','#myModal',function(){ifrJq('#form_coll').addClass('intro-form-coll-zindex');ifrJq('#form_coll').find('.introjs-showElement,.introjs-relativePosition').removeClass('introjs-showElement introjs-relativePosition')});ifrJq('body').on('hidden.bs.modal','#myModal',function(){ifrJq('#form_coll').removeClass('intro-form-coll-zindex')});$_o.eleList=$_o.get_ele_list();var stepList=[];for(var i in $_o.eleList){var eleParams=$_o.eleList[i]?$_o.eleList[i]:{};stepList.push({element:eleParams.element?eleParams.element:'',intro:eleParams.intro?eleParams.intro:'',position:eleParams.position?eleParams.position:null})}
$_o.intro=ifrWin.introJs();$_o.intro.setOptions({prevLabel:'上一步',nextLabel:'下一步',skipLabel:'跳过',doneLabel:'结束',showBullets:!1,steps:stepList}).onbeforechange(function(targetElement){var toStep=$_o.intro._currentStep;if(ifrJq($_o.eleList[toStep].element).length<=0){ifrJq('body').addClass('intro-hide')}}).onchange(function(targetElement){var toStep=$_o.intro._currentStep;toStep=parseInt(toStep);var curStep=0;var isNext=!1;var isJump=!1;if($_o.getToStep){isNext=$_o.getToStep.isNext?true:!1;$_o.getToStep=null;isJump=1}else{if($_o.intro._direction=='backward'){isNext=!1}else{isNext=!0}}
if(isNext){curStep=toStep-1}else{curStep=toStep+1}
if(curStep>=0){var curStepEle=$_o.eleList[curStep];var toStepEle=$_o.eleList[toStep];var canClick=!1;if(isNext){if(toStepEle.in_modal){if(ifrJq('#myModal').length<=0||ifrJq('#myModal').is(':hidden')){canClick=!0}}else{canClick=!0}}else if(curStepEle.prev){canClick=!0}
@ -35,5 +37,4 @@ if(step<=0){$_o.coll_guide()}else{if(!$_o.intro){$_o.coll_guide()}
$_o.getToStep={isNext:isNext};$_o.intro.exit();var ifrJq=$($_o.collIfrId)[0].contentWindow.$;ifrJq('.introjs-overlay').remove();$_o.intro._targetElement=ifrJq('body')[0];$_o.intro.refresh();$_o.intro.goToStep(step).start()}},timer_open:function(func){if(this.timer){window.clearInterval(this.timer)}
if(this.timerCount>10){window.clearInterval(this.timer)}
this.timer=window.setInterval(func,500)},timer_close:function(){if(this.timer){window.clearInterval(this.timer)}},start_coll_guide:function(){var eleList=this.get_ele_list();if(JSON.stringify(eleList)!=JSON.stringify(this.eleList)){this.intro=null;this.step.last=0}
this.coll_goto_step()},browser_url:function(data){$('#browser_source').val(data.page_source);$('#browser_url').val(data.test_url);$('#browser_urls').val(JSON.stringify(data.input_urls));$('#btn_browser').click()}}
var cpatternEasy=null;$(document).ready(function(){window.cpatternEasy=new CpatternEasy();window.cpatternEasy.init()})
this.coll_goto_step()},browser_url:function(data){$('#browser_source').val(data.page_source);$('#browser_url').val(data.test_url);$('#browser_urls').val(JSON.stringify(data.input_urls));$('#btn_browser').click()}}

View File

@ -9,14 +9,14 @@
*/
'use strict';function CpTestSourceUrls(collId,maxNum,sourceIsUrl,hasLevels){this.coll_id=collId;this.max_num=maxNum;this.source_is_url=sourceIsUrl;this.has_levels=hasLevels;this.box_id='#win_test_source_urls';this.url_ajax_requests=new Array()}
CpTestSourceUrls.prototype={constructor:CpTestSourceUrls,init:function(){var $_o=this;$('#myModal').on('hide.bs.modal',function(e){if($_o&&$_o.url_ajax_requests){for(var i in $_o.url_ajax_requests){$_o.url_ajax_requests[i].abort()}}});$($_o.box_id).on('click','.set-test-num .set-num-btn',function(){var testNum=$($_o.box_id+' .set-test-num').find('.set-num').val();ajaxOpen({type:'get',dataType:'json',url:ulink('cpattern_test/level_num'),data:{num:testNum},async:!0,success:function(data){toastr.success(data.msg)}})});$($_o.box_id).on('click','.cont_ceshi',function(){var curUrl=$(this).attr('data-url');var test_url=ulink('cpattern_test/test_url?coll_id=_collid_&test_url=_url_',{'_collid_':$_o.coll_id,'_url_':curUrl});var urls={};$(this).parents('.source_url').each(function(){var surl=$(this).attr('data-url');if(surl){if($(this).attr('data-level')){urls['level_'+$(this).attr('data-level')]=surl}else{urls.source_url=surl}}});if(urls){for(var i in urls){test_url+='&'+i+'='+encodeURIComponent(urls[i])}}
window.open(test_url,'_blank')});$($_o.box_id).on('click','.cont_element',function(){var urls={};$(this).parents('.source_url').each(function(){var surl=$(this).attr('data-url');if(surl){if($(this).attr('data-level')){urls['level_'+$(this).attr('data-level')]=surl}else{urls.source_url=surl}}});if((/\beasymode\s*\=/i).test(window.self.location.href)&&window.top){cpEasyBrowser($(this).attr('data-url'),'url',urls)}else{var testUrl=$(this).attr('data-url');var browserUrl=cpBrowserUrl($_o.coll_id,'url',testUrl,urls);window.open(browserUrl,'_blank')}});$($_o.box_id).on('click','.cont_urls_num a',function(){var status=$(this).attr('status');if(status==1){$(this).html('[展开]');$(this).attr('status',0);$(this).parents('.cont_urls_num').eq(0).siblings('.cont_urls_list').hide()}else{$(this).html('[收起]');$(this).attr('status',1);$(this).parents('.cont_urls_num').eq(0).siblings('.cont_urls_list').show()}});$($_o.box_id+' .source_url').each(function(index){if(!$_o.source_is_url){var source_url=$(this).attr('data-url');if($_o.has_levels){$($_o.box_id+' .set-test-num').show().find('.set-num').val($_o.max_num);if(index<$_o.max_num){$_o.get_cont_urls(source_url,$(this),1)}}else{$_o.get_cont_urls(source_url,$(this),0)}}})},get_cont_urls:function(source_url,curObj,level,parentUrl,parentLevel){parentUrl=parentUrl?parentUrl:'';parentLevel=parentLevel?parentLevel:'';var $_o=this;if(source_url){curObj.children('.cont_urls_list').html('<div class="loading-sm"></div>').show();var url=ulink('cpattern_test/cont_urls?coll_id=_collid_',{'_collid_':$_o.coll_id});var url_ajax_request=ajaxOpen({type:'post',url:url,data:{source_url:source_url,level:level,parent_url:parentUrl,parent_level:parentLevel,},dataType:'json',async:!0,success:function(data){if(data.code==1){data=data.data?data.data:{};var urls=data.urls;var list='<ul style="list-style-type:'+(level>0?'decimal':'square')+';padding-left:15px;white-space:normal;overflow-x:scroll;">';if(level>0){for(var i in urls){urls[i]=htmlspecialchars(urls[i]);if(i<$_o.max_num){list+='<li class="source_url" data-url="'+urls[i]+'" data-level="'+level+'"><p><b>抓取第'+level+'级页面 “'+data.levelName+'”:</b>'+data.levelIsPost+urls[i]+'</p><p class="cont_urls_num"></p><div class="cont_urls_list"></div></li>'}}
list+='</ul>';curObj.children('.cont_urls_list').html(list).show();curObj.children('.cont_urls_num').html('获取到'+urls.length+'条网址'+(urls.length>$_o.max_num?'(只测试前'+$_o.max_num+'条)':'')+' <a href="javascript:;" status="1">[收起]</a>');curObj.children('.cont_urls_list').find('.source_url').each(function(){var obj=$(this);$_o.get_cont_urls(obj.attr('data-url'),obj,data.nextLevel,data.sourceUrl,data.level)})}else{for(var i in urls){urls[i]=htmlspecialchars(urls[i]);list+='<li>[<a href="javascript:;" class="cont_ceshi" data-url="'+urls[i]+'">测试</a>] '+'[<a href="javascript:;" class="cont_element" data-url="'+urls[i]+'">分析</a>] '+data.urlIsPost+urls[i]+'</li>'}
window.open(test_url,'_blank')});$($_o.box_id).on('click','.cont_element',function(){var urls={};$(this).parents('.source_url').each(function(){var surl=$(this).attr('data-url');if(surl){if($(this).attr('data-level')){urls['level_'+$(this).attr('data-level')]=surl}else{urls.source_url=surl}}});if((/\beasymode\s*\=/i).test(window.self.location.href)&&window.top){cpEasyBrowser($(this).attr('data-url'),'url',urls)}else{var testUrl=$(this).attr('data-url');var browserUrl=cpBrowserUrl($_o.coll_id,'url',testUrl,urls);window.open(browserUrl,'_blank')}});$($_o.box_id).on('click','.cont_urls_num a',function(){var status=$(this).attr('status');if(status==1){$(this).html('[展开]');$(this).attr('status',0);$(this).parents('.cont_urls_num').eq(0).siblings('.cont_urls_list').hide()}else{$(this).html('[收起]');$(this).attr('status',1);$(this).parents('.cont_urls_num').eq(0).siblings('.cont_urls_list').show()}});$($_o.box_id+' .source_url').each(function(index){if(!$_o.source_is_url){var source_url=$(this).attr('data-url');if($_o.has_levels){$($_o.box_id+' .set-test-num').show().find('.set-num').val($_o.max_num);if(index<$_o.max_num){$_o.get_cont_urls(source_url,$(this),1)}}else{$_o.get_cont_urls(source_url,$(this),0)}}})},get_cont_urls:function(source_url,curObj,level,parentUrl,parentLevel){parentUrl=parentUrl?parentUrl:'';parentLevel=parentLevel?parentLevel:'';var $_o=this;if(source_url){curObj.children('.cont_urls_list').html('<div class="loading-sm"></div>').show();var url=ulink('cpattern_test/cont_urls?coll_id=_collid_',{'_collid_':$_o.coll_id});var url_ajax_request=ajaxOpen({type:'post',url:url,data:{source_url:source_url,level:level,parent_url:parentUrl,parent_level:parentLevel,},dataType:'json',async:!0,success:function(data){if(data.code==1){data=data.data?data.data:{};var urls=data.urls;var list='<ul style="list-style-type:'+(level>0?'decimal':'square')+';padding-left:15px;white-space:normal;overflow-x:scroll;">';if(level>0){for(var i in urls){urls[i]=htmlspecialchars(urls[i]);if(i<$_o.max_num){list+='<li class="source_url" data-url="'+urls[i]+'" data-level="'+level+'"><p><b>抓取第'+level+'级页面 “'+data.levelName+'”:</b>'+data.levelOpened+urls[i]+'</p><p class="cont_urls_num"></p><div class="cont_urls_list"></div></li>'}}
list+='</ul>';curObj.children('.cont_urls_list').html(list).show();curObj.children('.cont_urls_num').html('获取到'+urls.length+'条网址'+(urls.length>$_o.max_num?'(只测试前'+$_o.max_num+'条)':'')+' <a href="javascript:;" status="1">[收起]</a>');curObj.children('.cont_urls_list').find('.source_url').each(function(){var obj=$(this);$_o.get_cont_urls(obj.attr('data-url'),obj,data.nextLevel,data.sourceUrl,data.level)})}else{for(var i in urls){urls[i]=htmlspecialchars(urls[i]);list+='<li>[<a href="javascript:;" class="cont_ceshi" data-url="'+urls[i]+'">测试</a>] '+'[<a href="javascript:;" class="cont_element" data-url="'+urls[i]+'">分析</a>] '+data.urlOpened+urls[i]+'</li>'}
list+='</ul>';curObj.children('.cont_urls_list').html(list).hide();curObj.children('.cont_urls_num').html('获取到'+urls.length+'条网址 <a href="javascript:;" status="0">[展开]</a>')}}else{curObj.children('.cont_urls_list').html('<span style="color:red">'+data.msg+'</span>').show()}}});$_o.url_ajax_requests.push(url_ajax_request)}}}
function CpTestUrl(collId,testType,pageSource){this.coll_id=collId;this.test=testType?testType:'get_fields';this.test_async=!0;this.page_source=pageSource?pageSource:'';this.box_id='#win_test_url';this.test_ajax_requests=new Array()}
CpTestUrl.prototype={constructor:CpTestUrl,ajax:function(params){var ajax_request=ajaxOpen(params);this.test_ajax_requests.push(ajax_request)},abort_test:function(){if(this.test_ajax_requests&&this.test_ajax_requests.length>0){for(var i in this.test_ajax_requests){this.test_ajax_requests[i].abort()}
this.test_ajax_requests=new Array()}},load_input_url:function(func){var $_o=this;var urlParams=$($_o.box_id+' [name="url_params"]').val();var inputedUrls={};$('#win_input_urls').find('[name]').each(function(){inputedUrls[$(this).attr('name')]=$(this).val()});var pageSource=$($_o.box_id+' [name="page_source"]').val();var url=ulink('cpattern_test/input_url?test=_test_&coll_id=_collid_&page_source=_source_',{'_test_':$_o.test,'_collid_':$_o.coll_id,'_source_':pageSource});if($($_o.box_id+' button.dropdown-toggle').attr('data-test')=='get_signs'){if($('#win_test_signs').find('[name="signs_cur_all"]').is(':checked')){url+='&signs_cur_all=1'}}
$_o.ajax({type:'post',url:url,dataType:'html',async:$_o.test_async,data:{url_params:urlParams,inputed_urls:inputedUrls},success:function(html){if(html){$('#win_input_urls').html(html).show()}else{$('#win_input_urls').html('').hide()}
if($('#win_input_urls').find('[name="page_source_post"]').length>0){$($_o.box_id+' .test-page-source-post').show()}else{$($_o.box_id+' .test-page-source-post').hide()}
var pageOpendObj=$('#win_input_urls').find('#input_url_page_opened');if(pageOpendObj.length>0){$($_o.box_id+' .test-page-opened').html(pageOpendObj.html()).show()}else{$($_o.box_id+' .test-page-opened').hide()}
execVarFuncs(func)}})},init:function(){var $_o=this;$($_o.box_id+' .dropdown-menu a[data-test]').bind('click',function(){$_o.abort_test();var btnObj=$(this).parents('.dropdown-menu').eq(0).siblings('button.dropdown-toggle').eq(0);var testName=$(this).attr('data-test');btnObj.attr('data-test',testName);btnObj.find('.test-tips').text($(this).attr('data-title'));if(testName=='get_html'||testName=='get_browser'||testName=='get_signs'||testName=='get_pagination'){$($_o.box_id+' [name="test_url"]').attr('placeholder','输入网址');$($_o.box_id+' .test-page-sources').show()}else{$($_o.box_id+' [name="test_url"]').attr('placeholder','输入内容页网址');$($_o.box_id+' .test-page-sources').hide()}
$($_o.box_id+' .field-vals').html('');$_o.test=testName;if(testName=='get_signs'){$('#win_test_signs').show()}else{$('#win_test_signs').hide()}
if(testName=='get_pagination'){$('#win_test_pagination').show()}else{$('#win_test_pagination').hide()}
@ -41,5 +41,5 @@ val=val.replace(/\</g,'&lt;').replace(/\>/g,'&gt;');signsHtml+='<div style="marg
if(!signsHtml){signsHtml='无'}
html+=signsHtml+'</td>'}
return html}}
function CpTestMatch(){var boxId='#win_test_match';$(boxId+' [name="input_type"]').bind('change',function(){$(boxId+' #input_type_url').hide();$(boxId+' #input_type_content').hide();$(boxId+' #input_type_'+$(this).val()).show()});$(boxId+' [name="type"]').bind('change',function(){$(boxId+' #type_rule').hide();$(boxId+' #type_xpath').hide();$(boxId+' #type_json').hide();$(boxId+' #type_'+$(this).val()).show()});$(boxId+' [name="form_method"]').bind('change',function(){if($(this).val()=='post'){$('#post_content_type').show()}else{$('#post_content_type').hide()}});inputSelectCustom(boxId+' select[name="charset"]','charset_custom');$(boxId+' .form .add').bind('click',function(){var tr=$(boxId+' #tpl_tr_form').html();$(boxId+' .form .table tbody').append('<tr>'+tr+'</tr>')});$(boxId+' .header .add').bind('click',function(){var tr=$(boxId+' #tpl_tr_header').html();$(boxId+' .header .table tbody').append('<tr>'+tr+'</tr>')});$(boxId).on('click','.form .table .delete',function(){$(this).parents('tr').eq(0).remove()});$(boxId).on('click','.header .table .delete',function(){$(this).parents('tr').eq(0).remove()});$(boxId+' .test-match-val .visualize').bind('click',function(){visualizeData($('#test_match_val').val())});cpRuleModuleInit(boxId,'field','');$(boxId+' form').bind('submit',function(){$(boxId).append('<div class="test-loading loading"></div>');ajaxOpen({type:'post',url:$(this).attr('action'),dataType:'json',data:$(this).serialize(),success:function(data){$(boxId).find('.test-loading').remove();if(data.code==1){var valObj=$(boxId+' .test-match-val');valObj.show();if(dataIsHtml(data.msg)){valObj.find('.visualize').show()}else{valObj.find('.visualize').hide()}
function CpTestMatch(){var boxId='#win_test_match';$(boxId+' [name="input_type"]').bind('change',function(){$(boxId+' #input_type_url').hide();$(boxId+' #input_type_content').hide();$(boxId+' #input_type_'+$(this).val()).show()});$(boxId+' [name="type"]').bind('change',function(){$(boxId+' #type_rule').hide();$(boxId+' #type_xpath').hide();$(boxId+' #type_json').hide();$(boxId+' #type_'+$(this).val()).show()});$(boxId+' .test-match-val .visualize').bind('click',function(){visualizeData($('#test_match_val').val())});cpRuleModuleInit(boxId,'field','');$(boxId+' form').bind('submit',function(){$(boxId).append('<div class="test-loading loading"></div>');ajaxOpen({type:'post',url:$(this).attr('action'),dataType:'json',data:$(this).serialize(),success:function(data){$(boxId).find('.test-loading').remove();if(data.code==1){var valObj=$(boxId+' .test-match-val');valObj.show();if(dataIsHtml(data.msg)){valObj.find('.visualize').show()}else{valObj.find('.visualize').hide()}
valObj.find('#test_match_val').val(data.msg)}else{toastr.error(data.msg)}}});return!1})}

View File

@ -8,7 +8,7 @@
|--------------------------------------------------------------------------
*/
'use strict';function DevelopClass(){this.packTypes={};this.downFrameworkSize=0;this.downFrameworkNum=0}
DevelopClass.prototype={constructor:DevelopClass,release_cms:function(config){var $_o=this;$('#form_cms select[name="cms_name"]').bind('change',function(){if($(this).val()=='custom'){$('#cms_name_custom').show()}else{$('#cms_name_custom').hide()}});$('#add_param').bind('click',function(){windowModal('参数',ulink('develop/cmsAddParam'))});$('#param_list').on('click','.param-key',function(){var parentObj=$(this).parents('tr[id^="param_"]').eq(0);var paramval=parentObj.find('input[name="params[]"]').val();var objid=parentObj.attr('id');windowModal('参数',ulink('develop/cmsAddParam?objid=_objid_&param=_param_',{'_objid_':objid,'_param_':paramval}))});$('#param_list').on('click','.delete-param',function(){$(this).parents('tr').eq(0).remove()});if(config&&!$.isEmptyObject(config)){$('#form_cms [name="name"]').val(config.name);var cmsnameOpt=$('#form_cms [name="cms_name"] option[value="'+config.cms_name+'"]');if(cmsnameOpt.length>0){$('#form_cms [name="cms_name"]').val(config.cms_name)}else{$('#form_cms [name="cms_name"]').val('custom').trigger('change');$('#form_cms [name="cms_name_custom"]').val(config.cms_name)}
DevelopClass.prototype={constructor:DevelopClass,release_cms:function(config){var $_o=this;inputSelectCustom('#form_cms select[name="cms_name"]','cms_name_custom');$('#add_param').bind('click',function(){windowModal('参数',ulink('develop/cmsAddParam'))});$('#param_list').on('click','.param-key',function(){var parentObj=$(this).parents('tr[id^="param_"]').eq(0);var paramval=parentObj.find('input[name="params[]"]').val();var objid=parentObj.attr('id');windowModal('参数',ulink('develop/cmsAddParam?objid=_objid_&param=_param_',{'_objid_':objid,'_param_':paramval}))});$('#param_list').on('click','.delete-param',function(){$(this).parents('tr').eq(0).remove()});if(config&&!$.isEmptyObject(config)){$('#form_cms [name="name"]').val(config.name);var cmsnameOpt=$('#form_cms [name="cms_name"] option[value="'+config.cms_name+'"]');if(cmsnameOpt.length>0){$('#form_cms [name="cms_name"]').val(config.cms_name)}else{$('#form_cms [name="cms_name"]').val('custom').trigger('change');$('#form_cms [name="cms_name_custom"]').val(config.cms_name)}
$('#form_cms [name="identifier"]').val(config.identifier);$('#form_cms [name="copyright"]').val(config.copyright);if(config.is_edit){$('#form_cms [name="cms_name"]').attr("disabled","disabled");$('#form_cms [name="cms_name_custom"]').attr("disabled","disabled");$('#form_cms [name="identifier"]').attr("disabled","disabled");$('#form_cms [name="copyright"]').attr("disabled","disabled")}
if(config.params){for(var i in config.params){$_o.add_cms_param(config.params[i])}}}},init_cms_param:function(){var $_o=this;$('#win_form_param select[name="param[type]"]').bind('change',function(){$('#win_form_param .param-type-select').hide();var curType=$(this).val();if(curType=='select_val'||curType=='select_func'){$('#win_form_param .param-type-select[data-select="'+curType+'"]').show()}});$('#win_form_param').submit(function(){var checkKey=!0;var curKey=$('#win_form_param [name="param[key]"]').val();var objid=$('#win_form_param input[name="objid"]').val();if(objid){if(curKey==$('#'+objid).find('.param-key').attr('data-val')){checkKey=!1}}
if(checkKey){var hasKey=!1;$('#param_list .param-key').each(function(){if(curKey==$(this).attr('data-val')){hasKey=!0;return!1}});if(hasKey){toastr.error('变量名已存在!');return!1}}
@ -19,5 +19,5 @@ if(checkName){var hasName=!1;$('#pack_list .pack-name').each(function(){if(curNa
ajaxOpen({type:'POST',dataType:'json',url:$(this).attr('action'),data:$(this).serialize(),success:function(data){if(data.code==1){$_o.add_app_pack(data.data,objid);$('#myModal').modal('hide')}else{toastr.error(data.msg)}},error:function(data){toastr.error(data)}});return!1});$('#win_form_pack [name="pack[type]"]').bind('change',function(){var type=$(this).val();$(this).siblings('.help-block').each(function(){if($(this).hasClass('type-'+type)){$(this).show()}else{$(this).hide()}})})},load_app_pack:function(pack){if(pack){$('#win_form_pack [name="pack[name]"]').val(pack.name);$('#win_form_pack [name="pack[type]"]').val(pack.type).trigger('change');$('#win_form_pack [name="pack[nav_link]"]').val(pack.nav_link);$('#win_form_pack [name="pack[target]"][value="'+parseInt(pack.target)+'"]').prop('checked','checked')}},down_framework:function(params){var $_o=this;params=params?params:{};var url='develop/installFramework?app='+$('#form_app [name="app"]').val();if(params.block_no){url+='&block_no='+params.block_no}
url=ulink(url);ajaxOpen({type:'get',dataType:'json',url:url,success:function(data){if(data.code==1){var dataData=data.data;dataData=dataData?dataData:{};if(dataData.next_block_no>0){var per=parseInt(parseFloat(dataData.next_block_no/dataData.blocks)*100);$('#install_framework').find('.perct').text(per);$_o.down_framework({'block_no':dataData.next_block_no})}else{$('#install_framework').find('.perct').text('100');ajaxDataMsg(data)}}else{$('#install_framework').attr('disabled',!1).html('下载失败');if(data.msg){toastr.error(data.msg)}}},error:function(){$('#install_framework').attr('disabled',!1).html('下载失败')}})},func:function(module,config){var $_o=this;$('#add_method').bind('click',function(){$_o.func_add_method()});$('#form_func').on('click','.delete-method',function(){$(this).parents('tr').remove()});if(module){$('#form_func [name="module"]').val(module)}
if(config&&!$.isEmptyObject(config)){for(var i in config){$('#form_func [name="'+i+'"]').val(config[i])}
$('#form_func [name="module"]').attr('disabled','disabled');$('#form_func [name="identifier"]').attr('disabled','disabled');$('#form_func [name="copyright"]').attr('disabled','disabled')}},func_add_method:function(method,desc){method=method?method:'';desc=desc?desc:'';var tr='<tr><td><input type="text" name="methods[method][]" value="'+htmlspecialchars(method)+'" class="form-control" /></td>'+'<td><input type="text" name="methods[comment][]" class="form-control" value="'+htmlspecialchars(desc)+'" /></td>'+'<td><a href="javascript:;" class="glyphicon glyphicon-remove delete-method" style="margin-top:8px;"></a></td></tr>';$('#form_func table.method_list tbody').append(tr)}}
$('#form_func [name="module"]').attr('readonly','readonly').attr('onfocus','this.defaultIndex=this.selectedIndex;').attr('onchange','this.selectedIndex=this.defaultIndex;');$('#form_func [name="identifier"]').attr('readonly','readonly');$('#form_func [name="copyright"]').attr('readonly','readonly')}},func_add_method:function(method,desc){method=method?method:'';desc=desc?desc:'';var tr='<tr><td><input type="text" name="methods[method][]" value="'+htmlspecialchars(method)+'" class="form-control" /></td>'+'<td><input type="text" name="methods[comment][]" class="form-control" value="'+htmlspecialchars(desc)+'" /></td>'+'<td><a href="javascript:;" class="glyphicon glyphicon-remove delete-method" style="margin-top:8px;"></a></td></tr>';$('#form_func table.method_list tbody').append(tr)}}
var developClass=new DevelopClass()

View File

@ -7,12 +7,13 @@
| 使用协议 https://www.skycaiji.com/licenses
|--------------------------------------------------------------------------
*/
'use strict';$(document).ready(function(){$('#op_clean').bind('click',function(){windowModal('清理缓存',ulink('setting/clean'))});$('#a_collect_now').bind('click',function(){collectorWindow('实时采集','admin/backstage/collect',null,{lg:1})});$('#upgrade_db').bind('click',function(){var obj=$(this);ajaxOpen({type:'get',dataType:'json',url:ulink('install/upgrade/db'),success:function(data){if(data.code==1){obj.html(data.msg?data.msg:'升级成功');window.setTimeout(function(){window.location.reload()},1000)}else{obj.html(data.msg?data.msg:'升级失败')}}})});$('body').on('click','#op_upgrade',function(){var obj=$(this);if(obj.attr('upgrading')==1){return!1}
'use strict';$(document).ready(function(){$('#op_clean').bind('click',function(){windowModal('清理缓存',ulink('setting/clean'))});$('#a_run_auto_backstage').bind('click',function(){windowModal('正在激活自动采集...',ulink('admin/backstage/run_auto_backstage'))});$('#a_collect_now').bind('click',function(){collectorWindow('实时采集','admin/backstage/collect',null,{lg:1})});$('#upgrade_db').bind('click',function(){var obj=$(this);ajaxOpen({type:'get',dataType:'json',url:ulink('install/upgrade/db'),success:function(data){if(data.code==1){obj.html(data.msg?data.msg:'升级成功');window.setTimeout(function(){window.location.reload()},1000)}else{obj.html(data.msg?data.msg:'升级失败')}}})});$('body').on('click','#op_upgrade',function(){var obj=$(this);if(obj.attr('upgrading')==1){return!1}
$('#upgrade_error').html('').hide();var versionFile=obj.attr('data-version-file');if(versionFile=='zip'){obj.html('正在下载压缩包...')}else{obj.html('正在检索更新文件...')}
ajaxOpen({type:'get',dataType:'json',url:ulink('upgrade/download?version_file=_vfile_',{'_vfile_':versionFile}),success:function(data){obj.attr('upgrading',1);if(versionFile=='zip'){if(data.code==1){data=data.data?data.data:{};var size=toInt(data.size);size=size/(1024*1024);size=Math.floor(size*100)/100;obj.html('正在下载... &nbsp;<span class="size">0MB</span> / '+size+'MB');var upgradeZipClass=new UpgradeZipClass(data.size,data.blocks);upgradeZipClass.down_zip(1)}else{obj.html(data.msg?data.msg:'压缩包下载失败')}}else{if(data.code==1){var fileList=new Array();if(data.data.files){for(var i in data.data.files){fileList.push(data.data.files[i])}}
if(fileList.length>0){obj.html('正在更新...');var upgradeClass=new UpgradeClass(fileList);upgradeClass.down_file(0)}else{obj.html('没有需要更新的文件')}}else{var upgradeClass=new UpgradeClass(null);upgradeClass.down_complete()}}}});return!1});$('#refresh_admin_index').bind('click',function(){$('#skycaiji_admin_index').parents('.box').eq(0).find('.overlay').show();ajaxOpen({type:'get',dataType:'json',async:!0,timeout:10000,url:ulink('backstage/adminIndex?refresh=1'),success:function(data){var html=data.html?data.html:'';$('#skycaiji_admin_index').html(html);$('#skycaiji_admin_index').parents('.box').eq(0).find('.overlay').hide()},error:function(){$('#refresh_admin_index').trigger('click')}})});$('#box_open_basedir .close').bind('click',function(){confirmRight('忽略该问题?',function(){ajaxOpen({type:'get',dataType:'json',url:ulink('backstage/ignoreOpenBasedir'),success:function(data){$('#box_open_basedir').remove()}})})});$('#upgrade_check').html('正在检测更新...');ajaxOpen({type:'get',dataType:'json',async:!0,timeout:10000,url:ulink('backstage/newVersion'),success:function(data){data=data.data;if(data){if(data.is_new_version){var html='<a href="javascript:;" id="op_upgrade" data-version-file="'+(data.version_file?data.version_file:'')+'">检测到新版本V'+data.new_version+'点击升级</a>';if(data.version_link){html+=' &nbsp;<a href="'+data.version_link[1]+'" target="_blank" style="color:red;">'+data.version_link[0]+'</a>'}
if(fileList.length>0){obj.html('正在更新...');var upgradeClass=new UpgradeClass(fileList);upgradeClass.down_file(0)}else{obj.html('没有需要更新的文件')}}else{var upgradeClass=new UpgradeClass(null);upgradeClass.down_complete()}}}});return!1});$('#refresh_admin_index').bind('click',function(){$('#skycaiji_admin_index').parents('.box').eq(0).find('.overlay').show();ajaxOpen({type:'get',dataType:'json',async:!0,timeout:10000,url:ulink('backstage/adminIndex?refresh=1'),success:function(data){var html=data.html?data.html:'';$('#skycaiji_admin_index').html(html);$('#skycaiji_admin_index').parents('.box').eq(0).find('.overlay').hide()},error:function(){var times=$('#refresh_admin_index').attr('data-times');times=toInt(times);if(times<3){$('#refresh_admin_index').attr('data-times',times+1).trigger('click')}}})});$('#box_open_basedir .close').bind('click',function(){confirmRight('忽略该问题?',function(){ajaxOpen({type:'get',dataType:'json',url:ulink('backstage/ignoreOpenBasedir'),success:function(data){$('#box_open_basedir').remove()}})})});$('#upgrade_check').html('正在检测更新...');ajaxOpen({type:'get',dataType:'json',async:!0,timeout:10000,url:ulink('backstage/newVersion'),success:function(data){data=data.data;if(data){if(data.is_new_version){var html='<a href="javascript:;" id="op_upgrade" data-version-file="'+(data.version_file?data.version_file:'')+'">检测到新版本V'+data.new_version+'点击升级</a>';if(data.version_link){html+=' &nbsp;<a href="'+data.version_link[1]+'" target="_blank" style="color:red;">'+data.version_link[0]+'</a>'}
$('#upgrade_check').html(html)}else{$('#upgrade_check').html('暂无更新')}
if(data.is_new_admin_index){$('#refresh_admin_index').trigger('click')}}else{$('#upgrade_check').html('')}},error:function(){$('#upgrade_check').html('<a href="javascript:;" onclick="window.location.reload();">检测失败</a>')}});ajaxOpen({type:'get',dataType:'json',async:!0,timeout:60000,url:ulink('backstage/checkUp'),success:function(data){data=data.data;if(data){var list=[];if(data.phpInvalid){list.push('<a href="'+ulink('setting/caiji')+'" target="_blank">cli命令行</a>')}
if(data.phpCliVersion){$('#php_cli_version').show().find('span').html(data.phpCliVersion)}
if(data.pageRenderInvalid){list.push('<a href="'+ulink('setting/page_render')+'" target="_blank">页面渲染</a>')}
if(list.length>0){list=list.join(' , ');$('#invalid_list').find('[data-box]').html(list);$('#invalid_list').fadeIn()}
if(data.tongji){for(var i in data.tongji){$('#data_'+i).text(data.tongji[i])}}}}})});function UpgradeZipClass(size,blocks){this.size=size?toInt(size):0;this.blocks=blocks?toInt(blocks):0;this.nextBlockNo=0;this.existBlocks=0}

View File

@ -14,7 +14,7 @@ window.location.href=ulink('mystore/rule?order='+order+'&sort='+sort);return!1})
var className=$(this).attr('class');var sort='desc';if(className=='sorting_desc'){sort='asc'}
window.location.href=ulink('mystore/releaseApp?order='+order+'&sort='+sort);return!1});$('#deleteall').bind('click',function(){var obj=$(this);confirmRight(window.tpl_lang.confirm_delete,function(){ajaxOpen({type:"POST",url:ulink('mystore/releaseAppOp?op=deleteall'),dataType:"json",data:$('#form_list').serialize(),success:function(data){data.code==1?toastr.success(data.msg):toastr.error(data.msg);window.setTimeout("window.location.reload();",2500)}})})});$('#list_table .delete').bind('click',function(){var obj=$(this);confirmRight(window.tpl_lang.confirm_delete,function(){ajaxOpen({type:"GET",url:obj.attr('url'),dataType:"json",success:function(data){data.code==1?toastr.success(data.msg):toastr.error(data.msg);if(data.code==1){obj.parents('tr').eq(0).remove()}}})})});$('#list_table').on('click','.store-detail',function(){openStoreUrl($(this).attr('data-url'))});$('#check_update').bind('click',function(){$_o.check_releaseapp_update()});$('#auto_check').bind('click',function(){var auto=$(this).is(':checked')?1:0;ajaxOpen({type:"GET",url:ulink('mystore/releaseAppOp?op=auto_check&auto='+auto),dataType:"json",success:function(data){data.code==1?toastr.success(data.msg):toastr.error(data.msg)}})});if($('#auto_check').is(':checked')){$_o.check_releaseapp_update()}},check_releaseapp_update:function(){var ids=new Array();$('#list_table').find('tr[data-app-id]').each(function(){ids.push($(this).attr('data-app-id'))});if(ids.length>0){$('.nav-check-update #check_update').html('<div class="loading-sm"></div> 正在检测更新');$('.store-detail').find('.new-version').remove();ajaxOpen({type:"get",url:ulink('mystore/releaseAppOp?op=check_store_update'),dataType:"json",async:!0,data:{ids:ids},success:function(data){if(data.code==1){for(var id in data.data){var storeDetail=$('tr[data-app-id="'+data.data[id]+'"]').find('.store-detail');storeDetail.append('<span class="new-version">新</span>')}}},complete:function(){$('.nav-check-update #check_update').html('检测更新')}})}},init_funcapp:function(){var $_o=this;$('table.datatable thead th[data-order]').bind('click',function(){var order=$(this).attr('data-order');if(!order){return!1}
var className=$(this).attr('class');var sort='desc';if(className=='sorting_desc'){sort='asc'}
window.location.href=ulink('mystore/funcApp?order='+order+'&sort='+sort);return!1});$('#deleteall').bind('click',function(){var obj=$(this);confirmRight(window.tpl_lang.confirm_delete,function(){ajaxOpen({type:"POST",url:ulink('mystore/funcAppOp?op=deleteall'),dataType:"json",data:$('#form_list').serialize(),success:function(data){data.code==1?toastr.success(data.msg):toastr.error(data.msg);window.setTimeout("window.location.reload();",2500)}})})});$('#list_table .delete').bind('click',function(){var obj=$(this);var id=$(this).parents('tr[data-app-id]').attr('data-app-id');confirmRight(window.tpl_lang.confirm_delete,function(){ajaxOpen({type:"GET",url:ulink('mystore/funcAppOp?op=delete'),dataType:"json",data:{id:id},success:function(data){data.code==1?toastr.success(data.msg):toastr.error(data.msg);if(data.code==1){obj.parents('tr').eq(0).remove()}}})})});$('#list_table .enable').bind('click',function(){var obj=$(this);var id=$(this).parents('tr[data-app-id]').attr('data-app-id');var enable=$(this).attr('data-val');enable=(enable==1)?0:1;ajaxOpen({type:'GET',url:ulink('mystore/funcAppOp?op=enable'),dataType:'json',data:{id:id,enable:enable},success:function(data){if(data.code){obj.attr('data-val',enable?1:0);obj.text(enable?'已启用':'已禁用');obj.css('color',(enable?'green':'red'))}else{toastr.error(data.msg)}}})});$('#list_table .methods .dropdown-toggle').bind('click',function(){var obj=$(this);var id=$(this).parents('tr[data-app-id]').attr('data-app-id');var box=obj.parents('.methods');box.find('.dropdown-menu').html('<li style="padding-left:15px;"><div class="loading-sm"></div></li>');ajaxOpen({type:'GET',url:ulink('mystore/funcAppOp?op=detail'),dataType:'json',data:{id:id},success:function(data){if(data.code&&data.data){var methods=data.data.methods;var html='';for(var m in methods){var mMethod=methods[m];mMethod=mMethod?mMethod:{};html+='<li><a href="javascript:;" data-func-method="'+m+'">'+m+''+(mMethod.comment_cut?mMethod.comment_cut:'')+'</a></li>'}
window.location.href=ulink('mystore/funcApp?order='+order+'&sort='+sort);return!1});$('#deleteall').bind('click',function(){var obj=$(this);confirmRight(window.tpl_lang.confirm_delete,function(){ajaxOpen({type:"POST",url:ulink('mystore/funcAppOp?op=deleteall'),dataType:"json",data:$('#form_list').serialize(),success:function(data){data.code==1?toastr.success(data.msg):toastr.error(data.msg);window.setTimeout("window.location.reload();",2500)}})})});$('#list_table .delete').bind('click',function(){var obj=$(this);var id=$(this).parents('tr[data-app-id]').attr('data-app-id');confirmRight(window.tpl_lang.confirm_delete,function(){ajaxOpen({type:"GET",url:ulink('mystore/funcAppOp?op=delete'),dataType:"json",data:{id:id},success:function(data){data.code==1?toastr.success(data.msg):toastr.error(data.msg);if(data.code==1){obj.parents('tr').eq(0).remove()}}})})});$('#list_table .enable').bind('click',function(){var obj=$(this);var id=$(this).parents('tr[data-app-id]').attr('data-app-id');var enable=$(this).attr('data-val');enable=(enable==1)?0:1;ajaxOpen({type:'GET',url:ulink('mystore/funcAppOp?op=enable'),dataType:'json',data:{id:id,enable:enable},success:function(data){if(data.code){obj.attr('data-val',enable?1:0);obj.text(enable?'已启用':'已禁用');obj.css('color',(enable?'green':'red'))}else{toastr.error(data.msg)}}})});$('#list_table .methods .dropdown-toggle').bind('click',function(){var obj=$(this);var id=$(this).parents('tr[data-app-id]').attr('data-app-id');var box=obj.parents('.methods');box.find('.dropdown-menu').html('<li style="padding-left:15px;"><div class="loading-sm"></div></li>');ajaxOpen({type:'GET',url:ulink('mystore/funcAppOp?op=detail'),dataType:'json',data:{id:id},success:function(data){if(data.code&&data.data){var methods=data.data.methods;methods=methods?methods:{};var html='';for(var m in methods){var mMethod=methods[m];mMethod=mMethod?mMethod:{};html+='<li><a href="javascript:;" data-func-method="'+m+'">'+m+''+(mMethod.comment_cut?mMethod.comment_cut:'')+'</a></li>'}
if(!html){html='<li><a href="javascript:;">无方法</a></li>'}
box.find('.dropdown-menu').html(html);box.find('.dropdown-menu [data-func-method]').bind('click',function(){var funcMethod=$(this).attr('data-func-method');windowModal('方法:'+funcMethod,ulink('mystore/funcAppOp?op=method&id=_id_&name=_name_',{'_id_':id,'_name_':funcMethod}),{lg:1})})}}})});$('#list_table').on('click','.store-detail',function(){openStoreUrl($(this).attr('data-url'))});$('#check_update').bind('click',function(){$_o.check_funcapp_update()});$('#auto_check').bind('click',function(){var auto=$(this).is(':checked')?1:0;ajaxOpen({type:"GET",url:ulink('mystore/funcAppOp?op=auto_check&auto='+auto),dataType:"json",success:function(data){data.code==1?toastr.success(data.msg):toastr.error(data.msg)}})});if($('#auto_check').is(':checked')){$_o.check_funcapp_update()}},check_funcapp_update:function(){var ids=new Array();$('#list_table').find('tr[data-app-id]').each(function(){ids.push($(this).attr('data-app-id'))});if(ids.length>0){$('.nav-check-update #check_update').html('<div class="loading-sm"></div> 正在检测更新');$('.store-detail').find('.new-version').remove();ajaxOpen({type:"get",url:ulink('mystore/funcAppOp?op=check_store_update'),dataType:"json",async:!0,data:{ids:ids},success:function(data){if(data.code==1){for(var id in data.data){var storeDetail=$('tr[data-app-id="'+data.data[id]+'"]').find('.store-detail');storeDetail.append('<span class="new-version">新</span>')}}},complete:function(){$('.nav-check-update #check_update').html('检测更新')}})}}}
box.find('.dropdown-menu').html(html);box.find('.dropdown-menu [data-func-method]').bind('click',function(){var funcMethod=$(this).attr('data-func-method');windowModal('方法:'+funcMethod,ulink('mystore/funcAppOp?op=method&id=_id_&name=_name_',{'_id_':id,'_name_':funcMethod}),{lg:1,'full_height':1})})}}})});$('#list_table').on('click','.store-detail',function(){openStoreUrl($(this).attr('data-url'))});$('#check_update').bind('click',function(){$_o.check_funcapp_update()});$('#auto_check').bind('click',function(){var auto=$(this).is(':checked')?1:0;ajaxOpen({type:"GET",url:ulink('mystore/funcAppOp?op=auto_check&auto='+auto),dataType:"json",success:function(data){data.code==1?toastr.success(data.msg):toastr.error(data.msg)}})});if($('#auto_check').is(':checked')){$_o.check_funcapp_update()}},check_funcapp_update:function(){var ids=new Array();$('#list_table').find('tr[data-app-id]').each(function(){ids.push($(this).attr('data-app-id'))});if(ids.length>0){$('.nav-check-update #check_update').html('<div class="loading-sm"></div> 正在检测更新');$('.store-detail').find('.new-version').remove();ajaxOpen({type:"get",url:ulink('mystore/funcAppOp?op=check_store_update'),dataType:"json",async:!0,data:{ids:ids},success:function(data){if(data.code==1){for(var id in data.data){var storeDetail=$('tr[data-app-id="'+data.data[id]+'"]').find('.store-detail');storeDetail.append('<span class="new-version">新</span>')}}},complete:function(){$('.nav-check-update #check_update').html('检测更新')}})}}}
var myStoreClass=new MyStoreClass()

View File

@ -8,17 +8,13 @@
|--------------------------------------------------------------------------
*/
'use strict';function ProxyClass(){}
ProxyClass.prototype={constructor:ProxyClass,init_setting:function(proxyConfig){var $_o=this;$('#proxy_ip_table').attr('data-tpl',$('#proxy_ip_table .proxy-ip-tpl').html());$('#proxy_ip_table .proxy-ip-tpl').remove();$('[name="open"]').bind('click',function(){if($(this).val()==1){$('.content-wrapper').removeClass('wrapper-not-enable')}else{$('.content-wrapper').addClass('wrapper-not-enable')}});$('#btn_sub').bind('click',function(){var ip_list=new Array();var user_list=new Array();var pwd_list=new Array();var type_list=new Array();$('[data-name="ip_list[]"]').each(function(){ip_list.push($(this).val())});$('[data-name="user_list[]"]').each(function(){user_list.push($(this).val())});$('[data-name="pwd_list[]"]').each(function(){pwd_list.push($(this).val())});$('[data-name="type_list[]"]').each(function(){type_list.push($(this).val())});if(ip_list){$('[name="ip_list"]').val(JSON.stringify(ip_list))}
if(user_list){$('[name="user_list"]').val(JSON.stringify(user_list))}
if(pwd_list){$('[name="pwd_list"]').val(JSON.stringify(pwd_list))}
if(type_list){$('[name="type_list"]').val(JSON.stringify(type_list))}});$('#batch_proxy_ip').bind('click',function(){windowModal('批量添加',ulink('proxy/batch'))});$('#add_proxy_ip').bind('click',function(){windowModal('添加代理IP',ulink('proxy/add'))});$('#invalid_proxy_ip').bind('click',function(){confirmRight('确定清理无效ip',function(){windowModal('正在清理...',ulink('proxy/clearInvalid'),{ajax:{success:function(){$_o.reload_iframe('清理完成')}}})})});$('#proxy_ip_iframe').bind('load',function(){$('#panel_proxy_ip .loading').hide();$(this).show();var mainheight=$(this).contents().find('body').height()+1;$(this).height(mainheight)});$('#proxy_ip_table').on('click','.delete-proxy-ip',function(){$(this).parents('tr').eq(0).remove()});$('[name="use"]').bind('click',function(){$('[id^="proxy_use_"]').hide();$('#proxy_use_'+$(this).val()).show()});$('[name="api[open]"]').bind('click',function(){if($(this).val()==1){showPanelCollapse('#panel_proxy_api')}});$('#proxy_api .p-api-add').bind('click',function(){$_o.add_api()});$('#proxy_api').on('click','.p-api-format a[data-val]',function(){var obj=$(this).parents('.p-api-panel').eq(0).find('[data-name="api_format"]');insertAtCaret(obj,$(this).attr('data-val'))});eleExchange('#proxy_api','.p-api-move','.p-api-panel');$('#proxy_api').on('click','.p-api-delete',function(){var obj=$(this);confirmRight('确定删除?',function(){obj.parents('.p-api-panel').eq(0).remove()})});$('#proxy_api').on('click','.btn-api-test',function(){var config={};$(this).parents('.p-api-panel').eq(0).find('[data-name]').each(function(){var name=$(this).attr('data-name');config[name]=$(this).val()});windowModal('测试接口',ulink('proxy/testApi'),{ajax:{type:'post',data:{config:config}}})});if(proxyConfig){$('[name="open"][value="'+toInt(proxyConfig.open)+'"]').trigger('click');$('[name="failed"]').val(toInt(proxyConfig.failed));$('[name="use"][value="'+proxyConfig.use+'"]').trigger('click');$('[name="use_num"]').val(toInt(proxyConfig.use_num));$('[name="use_time"]').val(toInt(proxyConfig.use_time));if(proxyConfig.api){$('[name="api[open]"][value="'+toInt(proxyConfig.api.open)+'"]').trigger('click');$('[name="api[insert]"]').val(proxyConfig.api.insert)}
ProxyClass.prototype={constructor:ProxyClass,init_setting:function(proxyConfig){var $_o=this;$('#proxy_ip_table').attr('data-tpl',$('#proxy_ip_table .proxy-ip-tpl').html());$('#proxy_ip_table .proxy-ip-tpl').remove();$('[name="open"]').bind('click',function(){if($(this).val()==1){$('.content-wrapper').removeClass('wrapper-not-enable')}else{$('.content-wrapper').addClass('wrapper-not-enable')}});$('.edit-proxy-groups').bind('click',function(){windowModal('管理分组',ulink('proxy/groups'))});$('#batch_proxy_ip').bind('click',function(){windowModal('批量添加',ulink('proxy/batch'))});$('#add_proxy_ip').bind('click',function(){windowModal('添加代理IP',ulink('proxy/add'),{lg:1})});$('#invalid_proxy_ip').bind('click',function(){confirmRight('确定清理无效ip',function(){windowModal('正在清理...',ulink('proxy/clearInvalid'),{ajax:{success:function(){$_o.reload_iframe('清理完成')}}})})});$('#proxy_ip_iframe').bind('load',function(){$('#panel_proxy_ip .loading').hide();$(this).show();var mainheight=$(this).contents().find('body').height()+1;$(this).height(mainheight)});$('#proxy_ip_table').on('click','.delete-proxy-ip',function(){$(this).parents('tr').eq(0).remove()});$('[name="use"]').bind('click',function(){$('[id^="proxy_use_"]').hide();$('#proxy_use_'+$(this).val()).show()});$('[name="api[open]"]').bind('click',function(){if($(this).val()==1){showPanelCollapse('#panel_proxy_api')}});$('#proxy_api .p-api-add').bind('click',function(){$_o.add_api()});$('#proxy_api').on('click','.p-api-format a[data-val]',function(){var obj=$(this).parents('.p-api-panel').eq(0).find('[data-name="api_format"]');insertAtCaret(obj,$(this).attr('data-val'))});eleExchange('#proxy_api','.p-api-move','.p-api-panel');$('#proxy_api').on('click','.p-api-delete',function(){var obj=$(this);confirmRight('确定删除?',function(){obj.parents('.p-api-panel').eq(0).remove()})});$('#proxy_api').on('click','.btn-api-test',function(){var config={};$(this).parents('.p-api-panel').eq(0).find('[data-name]').each(function(){var name=$(this).attr('data-name');config[name]=$(this).val()});windowModal('测试接口',ulink('proxy/testApi'),{ajax:{type:'post',data:{config:config}}})});if(proxyConfig){$('[name="open"][value="'+toInt(proxyConfig.open)+'"]').trigger('click');$('[name="failed"]').val(toInt(proxyConfig.failed));$('[name="group_id"]').val(toInt(proxyConfig.group_id));$('[name="use"][value="'+proxyConfig.use+'"]').trigger('click');$('[name="use_num"]').val(toInt(proxyConfig.use_num));$('[name="use_time"]').val(toInt(proxyConfig.use_time));if(proxyConfig.api){$('[name="api[open]"][value="'+toInt(proxyConfig.api.open)+'"]').trigger('click');$('[name="api[insert]"]').val(proxyConfig.api.insert)}
if(proxyConfig.apis){for(var i in proxyConfig.apis){$_o.add_api(proxyConfig.apis[i])}}}},reload_iframe:function(msg){$('#myModal').modal('hide');toastr.success(msg);$('#panel_proxy_ip .loading').show();$('#proxy_ip_iframe').hide();$('#proxy_ip_iframe').attr('src',$('#proxy_ip_iframe').attr('src')).hide()},add_api:function(data){data=data?data:{};var tpl=$('#proxy_api_tpl').clone();tpl.removeAttr('id').css('display','block');var unique=generateUUID();var collapseId='api_collapse_'+unique;tpl.find('.p-api-title').attr('href','#'+collapseId);tpl.find('.p-api-collapse').attr('id',collapseId);tpl.find('[data-name]').each(function(){var name=$(this).attr('data-name');$(this).attr('name','apis[i_'+unique+']['+name+']');if(data[name]){$(this).val(data[name])}});if(data.api_url){tpl.find('.p-api-title small').text(''+data.api_url)}
$('#proxy_api_box').append(tpl)},init_list:function(search){search=search?search:{};if(search){for(var i in search){$('#form_search').find('[name="'+i+'"]').val(search[i])}}
$('#form_list').on('change','[data-name="ip_list[]"],[data-name="user_list[]"],[data-name="pwd_list[]"],[data-name="type_list[]"]',function(){$(this).parents('tr').eq(0).find('[data-name="ips[]"]').prop('checked',!0)});$('#form_list').on('click','.op-delete',function(){var tr=$(this).parents('tr').eq(0);var ip=tr.find('[data-name="ips[]"]').val();ajaxOpen({type:'get',dataType:'json',url:ulink('proxy/op?op=delete&ip=_ip_',{'_ip_':ip}),success:function(data){if(data.code==1){tr.fadeOut(100,function(){tr.remove()});toastr.success(data.msg)}else{toastr.error(data.msg)}}})});$('#form_list').on('click','.check-all-ip',function(){var checked=$(this).is(":checked")?true:!1;$('[data-name="ips[]"]').prop('checked',checked)});$('#form_list').on('click','.delete-all-ip',function(){confirmRight('确定删除选中的IP',function(){$('#form_list').find('[name="op"]').val('delete_all');var ips=new Array();$('#form_list').find('[data-name="ips[]"]').each(function(){if($(this).is(':checked')){ips.push($(this).val())}});if(ips){$('[name="ips"]').val(JSON.stringify(ips))}
$('#form_list').submit()})});$('#form_list').on('click','.update-all-ip',function(){confirmRight('确定修改?',function(){$('#form_list').find('[name="op"]').val('update_all');var ips=new Array();var ip_list=new Array();var user_list=new Array();var pwd_list=new Array();var type_list=new Array();$('#form_list').find('[data-name="ips[]"]').each(function(){if($(this).is(':checked')){ips.push($(this).val());var tr=$(this).parents('tr').eq(0);ip_list.push(tr.find('[data-name="ip_list[]"]').val());user_list.push(tr.find('[data-name="user_list[]"]').val());pwd_list.push(tr.find('[data-name="pwd_list[]"]').val());type_list.push(tr.find('[data-name="type_list[]"]').val())}});if(ips){$('[name="ips"]').val(JSON.stringify(ips))}
if(ip_list){$('[name="ip_list"]').val(JSON.stringify(ip_list))}
if(user_list){$('[name="user_list"]').val(JSON.stringify(user_list))}
if(pwd_list){$('[name="pwd_list"]').val(JSON.stringify(pwd_list))}
if(type_list){$('[name="type_list"]').val(JSON.stringify(type_list))}
$('#form_list').submit()})})},init_add:function(){var $_o=this;var formid='#win_form_proxy_add';$(formid+' .proxy-ip-list').attr('data-tpl','<tr>'+$(formid+' .tpl-proxy-ip').html()+'</tr>');$(formid+' .tpl-proxy-ip').remove();$(formid+' .add-proxy-ip').bind('click',function(){$(formid+' .proxy-ip-list tbody').append($(formid+' .proxy-ip-list').attr('data-tpl'))});$(formid).on('click','.op-delete',function(){$(this).parents('tr').eq(0).remove()});$(formid).bind('submit',function(){ajaxOpen({type:'post',dataType:'json',url:$(this).attr('action'),data:$(this).serialize(),success:function(data){if(data.code==1){$_o.reload_iframe('添加成功')}else{toastr.error(data.msg)}}});return!1})},init_batch:function(){var $_o=this;var formid='#win_form_proxy_batch';$(formid+' .format a[data-val]').bind('click',function(){var obj=$('#win_form_proxy_batch input[name="format"]');insertAtCaret(obj,$(this).attr('data-val'))});$(formid+' .btn-test').bind('click',function(){$(formid).find('[name="is_test"]').val(1);ajaxOpen({type:'POST',dataType:'json',url:$(formid).attr('action'),data:$(formid).serialize(),success:function(data){if(data.code==1){$(formid+' .test-result').show();$(formid+' .test-result').find('textarea').val(data.msg)}else{toastr.error(data.msg)}}})});$(formid).bind('submit',function(){$(formid).find('[name="is_test"]').val('');ajaxOpen({type:'POST',dataType:'json',url:$(this).attr('action'),data:$(this).serialize(),success:function(data){if(data.code==1){$_o.reload_iframe('添加成功')}else{toastr.error(data.msg)}},});return!1})},}
$('#form_list').on('change','[data-name="ip_list[]"],[data-name="user_list[]"],[data-name="pwd_list[]"],[data-name="type_list[]"],[data-name="gid_list[]"]',function(){$(this).parents('tr').eq(0).find('[data-name="ips[]"]').prop('checked',!0)});$('#form_list').on('click','.op-delete',function(){var tr=$(this).parents('tr').eq(0);var ip=tr.find('[data-name="ips[]"]').val();ajaxOpen({type:'get',dataType:'json',url:ulink('proxy/op?op=delete&ip=_ip_',{'_ip_':ip}),success:function(data){if(data.code==1){tr.fadeOut(100,function(){tr.remove()});toastr.success(data.msg)}else{toastr.error(data.msg)}}})});$('#form_list').on('click','.check-all-ip',function(){var checked=$(this).is(":checked")?true:!1;$('[data-name="ips[]"]').prop('checked',checked)});$('#form_list').on('click','.delete-all-ip',function(){confirmRight('确定删除选中的IP',function(){$('#form_list').find('[name="op"]').val('delete_all');var ips=new Array();$('#form_list').find('[data-name="ips[]"]').each(function(){if($(this).is(':checked')){ips.push($(this).val())}});if(ips){$('[name="ips"]').val(JSON.stringify(ips))}
$('#form_list').submit()})});$('#form_list').on('click','.update-all-ip',function(){confirmRight('确定修改?',function(){$('#form_list').find('[name="op"]').val('update_all');var ips=new Array();var paramNames=['ip_list','user_list','pwd_list','type_list','gid_list'];var paramDatas={};for(var i in paramNames){paramDatas[paramNames[i]]=new Array()}
$('#form_list').find('[data-name="ips[]"]').each(function(){if($(this).is(':checked')){ips.push($(this).val());var tr=$(this).parents('tr').eq(0);for(var paramName in paramDatas){paramDatas[paramName].push(tr.find('[data-name="'+paramName+'[]"]').val())}}});if(ips){$('[name="ips"]').val(JSON.stringify(ips))}
for(var paramName in paramDatas){if(paramDatas[paramName]){$('[name="'+paramName+'"]').val(JSON.stringify(paramDatas[paramName]))}}
$('#form_list').submit()})})},init_add:function(){var $_o=this;var formid='#win_form_proxy_add';$(formid+' .proxy-ip-list').attr('data-tpl','<tr>'+$(formid+' .tpl-proxy-ip').html()+'</tr>');$(formid+' .tpl-proxy-ip').remove();$(formid+' .add-proxy-ip').bind('click',function(){$(formid+' .proxy-ip-list tbody').append($(formid+' .proxy-ip-list').attr('data-tpl'))});$(formid).on('click','.op-delete',function(){$(this).parents('tr').eq(0).remove()});$(formid).bind('submit',function(){ajaxOpen({type:'post',dataType:'json',url:$(this).attr('action'),data:$(this).serialize(),success:function(data){if(data.code==1){$_o.reload_iframe('添加成功')}else{toastr.error(data.msg)}}});return!1})},init_batch:function(){var $_o=this;var formid='#win_form_proxy_batch';$(formid+' .format a[data-val]').bind('click',function(){var obj=$('#win_form_proxy_batch input[name="format"]');insertAtCaret(obj,$(this).attr('data-val'))});$(formid+' .btn-test').bind('click',function(){$(formid).find('[name="is_test"]').val(1);ajaxOpen({type:'POST',dataType:'json',url:$(formid).attr('action'),data:$(formid).serialize(),success:function(data){if(data.code==1){$(formid+' .test-result').show();$(formid+' .test-result').find('textarea').val(data.msg)}else{toastr.error(data.msg)}}})});$(formid).bind('submit',function(){$(formid).find('[name="is_test"]').val('');ajaxOpen({type:'POST',dataType:'json',url:$(this).attr('action'),data:$(this).serialize(),success:function(data){if(data.code==1){$_o.reload_iframe('添加成功')}else{toastr.error(data.msg)}},});return!1})},init_groups:function(groups){var $_o=this;var formid='#win_form_proxy_groups';$(formid+' .proxy-group-list').attr('data-tpl','<tr>'+$(formid+' .proxy-group-tpl').html()+'</tr>');$(formid+' .proxy-group-tpl').remove();$(formid+' .proxy-group-add').bind('click',function(){$(formid+' .proxy-group-list tbody').append($(formid+' .proxy-group-list').attr('data-tpl'))});$(formid).on('click','.proxy-group-delete',function(){var prtObj=$(this).parents('tr').eq(0);var groupId=prtObj.find('[name="group_id[]"]').val();confirmRight('确定删除该分组?',function(){ajaxOpen({type:'get',dataType:'json',url:ulink('proxy/delete_group?id='+groupId),success:function(data){if(data.code==1){prtObj.remove();if(data.msg){toastr.success(data.msg)}}}})})});if(isObject(groups)){for(var i in groups){var tpl=$(formid+' .proxy-group-list').attr('data-tpl');tpl=$(tpl);var groupData=groups[i];if(isObject(groupData)){tpl.find('[name="group_id[]"]').val(groupData.id);tpl.find('[name="group_sort[]"]').val(groupData.sort);tpl.find('[name="group_name[]"]').val(groupData.name);if(groupData._ip_num){tpl.find('.proxy-group-ip-num').html(groupData._ip_num+'个IP')}}
$(formid+' .proxy-group-list tbody').append(tpl)}}},}
var proxyClass=new ProxyClass()

View File

@ -8,20 +8,30 @@
|--------------------------------------------------------------------------
*/
'use strict';function ReleaseClass(formid,releid){this.formid='#'+formid;this.releid=releid}
ReleaseClass.prototype={constructor:ReleaseClass,init:function(){var $_o=this;$($_o.formid+' select[name="module"]').bind('change',function(){$($_o.formid+' .rele-module').hide();$($_o.formid+' .rele-module[module="'+$(this).val()+'"]').show()});$('#btn_import_release').bind('click',function(){windowModal('导入配置会覆盖当前任务的发布设置,且不可恢复',ulink('release/import'))});$('#rele_module_cms .btn-cms-detect').bind('click',function(){$_o.cms_detect()});$('#rele_module_cms .btn-cms-bind').bind('click',function(){$_o.cms_bind()});$('#rele_module_cms').on('change','select[name="cms[app]"]',function(){var cmsApp=$(this).val();$_o.cms_bind({cms:{app:cmsApp}})});$('#cms_list').on('click','li a',function(){var path=$(this).attr('path');if(path){$($_o.formid+' [name="cms[path]"]').val(path);$('#cms_tab a[href="#cms_tab_bind"]').tab('show');$_o.cms_bind()}});$('#rele_module_cms').on('change','select[name^="cms_app[param]"]',function(){var cusName=$(this).attr('name').replace('cms_app[param]','cms_app[custom]');if($(this).val()=='custom:'){$('input[name="'+cusName+'"]').show()}else{$('input[name="'+cusName+'"]').hide()}});$('#db_tab_config .dm-db-charset li span').bind('click',function(){var charset=$(this).attr('data-val');charset=charset?charset:'';$('#db_tab_config [name="db[charset]"]').val(charset)});$('#db_tab_config .btn-db-names').bind('click',function(){$_o.db_connect('db_names')});$('#db_tab_config .btn-db-connect').bind('click',function(){$_o.db_connect()});$('#db_tab_table').on('change','select[name^="db_table[field]"]',function(){var cusName=$(this).attr('name').replace('db_table[field]','db_table[custom]');if($(this).val()=='custom:'){$('input[name="'+cusName+'"]').show()}else{$('input[name="'+cusName+'"]').hide()}});$('#rele_module_file').on('click','.btn-file-rand-path',function(){var randStr=$_o.rand_str(10);$($_o.formid+' [name="file[path]"]').val(randStr)});$('#rele_module_api').on('click','.btn-api-rand-url',function(){var randStr=$_o.rand_str(10);$($_o.formid+' [name="api[url]"]').val(randStr)});$('#diy_tab').on('click','[data-type]',function(){$($_o.formid+' [name="diy[type]"]').val($(this).attr('data-type'))});$('#rele_module_toapi').on('change','[name="toapi[type]"]',function(){if($(this).val()=='post'){$('#rele_module_toapi .toapi-content-type').show()}else{$('#rele_module_toapi .toapi-content-type').hide()}});$('#rele_module_toapi').on('click','.toapi-add-param',function(){$_o.toapi_add_param(null,null)});$('#rele_module_toapi').on('click','.toapi-del-param',function(){$(this).parents('tr').eq(0).remove()});inputSelectCustom('#rele_module_toapi [name="toapi[charset]"]','toapi[charset_custom]');inputSelectCustom(null,null,{box:'#rele_module_toapi',slt:'[name="toapi[param_val][]"]',ipt:'[name="toapi[param_addon][]"]'});$('#rele_module_toapi').on('click','.toapi-add-header',function(){$_o.toapi_add_header(null,null)});$('#rele_module_toapi').on('click','.toapi-del-header',function(){$(this).parents('tr').eq(0).remove()});inputSelectCustom(null,null,{box:'#rele_module_toapi',slt:'[name="toapi[header_val][]"]',ipt:'[name="toapi[header_addon][]"]'})},load:function(data){var $_o=this;if(data.module){$($_o.formid+' select[name="module"]').val(data.module).trigger('change')}
if(data.config){if('cms'==data.module){$_o.cms_bind(data.config);$(document).ready(function(){$('#cms_tab a[href="#cms_tab_bind"]').tab('show')})}else if('db'==data.module){$_o.db_bind(data.config)}else if('file'==data.module){if(data.config.file){$($_o.formid+' [name="file[path]"]').val(data.config.file.path);$($_o.formid+' [name="file[type]"]').each(function(){if($(this).val()==data.config.file.type){$(this).prop('checked',!0)}});$($_o.formid+' [name="file[txt_implode]"]').val(data.config.file.txt_implode);if(data.config.file.hide_fields){for(var fi in data.config.file.hide_fields){$($_o.formid+' [name="file[hide_fields][]"][value="'+data.config.file.hide_fields[fi]+'"]').prop('checked',!0)}}}}else if('api'==data.module){if(data.config.api){$($_o.formid+' [name="api[url]"]').val(data.config.api.url);$($_o.formid+' [name="api[cache_time]"]').val(data.config.api.cache_time);if(data.config.api.hide_fields){for(var fi in data.config.api.hide_fields){$($_o.formid+' [name="api[hide_fields][]"][value="'+data.config.api.hide_fields[fi]+'"]').prop('checked',!0)}}}}else if('diy'==data.module){if(data.config.diy){$(document).ready(function(){$('#diy_tab a[href="#diy_tab_'+data.config.diy.type+'"]').tab('show');for(var i in data.config.diy){$($_o.formid+' [name="diy['+i+']"]').val(data.config.diy[i])}
ReleaseClass.prototype={constructor:ReleaseClass,init:function(){var $_o=this;$($_o.formid).bind('submit',function(){var module=$($_o.formid+' select[name="module"]').val();if(module=='diy'&&$_o.has_diy_editor()){var diyCode=editorCodeIfr('#diy_editor_ifr',{'get_value':1});if(diyCode){$($_o.formid+' [name="diy[code]"]').val(diyCode)}}
var settings=getFormAjaxSettings($(this));ajaxOpen(settings);return!1});$($_o.formid+' select[name="module"]').bind('change',function(){var module=$(this).val();$($_o.formid+' .rele-module').hide();$($_o.formid+' .rele-module[module="'+module+'"]').show()});$('#btn_import_release').bind('click',function(){windowModal('导入配置会覆盖当前任务的发布设置,且不可恢复',ulink('release/import'))});$('#rele_module_cms .btn-cms-detect').bind('click',function(){$_o.cms_detect()});$('#rele_module_cms .btn-cms-bind').bind('click',function(){$_o.cms_bind()});$('#rele_module_cms').on('change','select[name="cms[app]"]',function(){var cmsApp=$(this).val();$_o.cms_bind({cms:{app:cmsApp}})});$('#cms_list').on('click','li a',function(){var path=$(this).attr('path');if(path){$($_o.formid+' [name="cms[path]"]').val(path);$('#cms_tab a[href="#cms_tab_bind"]').tab('show');$_o.cms_bind()}});$('#rele_module_cms').on('change','select[name^="cms_app[param]"]',function(){var cusName=$(this).attr('name').replace('cms_app[param]','cms_app[custom]');if($(this).val()=='custom:'){$('input[name="'+cusName+'"]').show()}else{$('input[name="'+cusName+'"]').hide()}});$('#db_tab_config .dm-db-charset li span').bind('click',function(){var charset=$(this).attr('data-val');charset=charset?charset:'';$('#db_tab_config [name="db[charset]"]').val(charset)});$('#db_tab_config .btn-db-names').bind('click',function(){$_o.db_connect('db_names')});$('#db_tab_config .btn-db-connect').bind('click',function(){$_o.db_connect()});$('#rele_module_file').on('click','.btn-file-rand-path',function(){var randStr=$_o.rand_str(10);$($_o.formid+' [name="file[path]"]').val(randStr)});$('#rele_module_api').on('click','.btn-api-rand-url',function(){var randStr=$_o.rand_str(10);$($_o.formid+' [name="api[url]"]').val(randStr)});$('#diy_tab').on('click','[data-type]',function(){var type=$(this).attr('data-type');$($_o.formid+' [name="diy[type]"]').val(type);if(type=='code'&&$_o.has_diy_editor()){var diyCode=$($_o.formid+' [name="diy[code]"]').val();diyCode=diyCode?diyCode:'';editorCodeIfr('#diy_editor_ifr',{'set_value':diyCode})}});$('#rele_module_toapi').on('change','[name="toapi[type]"]',function(){if($(this).val()=='post'){$('#rele_module_toapi .toapi-content-type').show()}else{$('#rele_module_toapi .toapi-content-type').hide()}});$('#rele_module_toapi').on('click','.toapi-add-param',function(){$_o.toapi_add_param(null,null)});$('#rele_module_toapi').on('click','.toapi-del-param',function(){$(this).parents('tr').eq(0).remove()});inputSelectCustom('#rele_module_toapi [name="toapi[charset]"]','toapi[charset_custom]');inputSelectCustom('#rele_module_toapi [name="toapi[encode]"]','toapi[encode_custom]');inputSelectCustom(null,null,{box:'#rele_module_toapi',slt:'[name="toapi[param_val][]"]',ipt:'[name="toapi[param_addon][]"]'});$('#rele_module_toapi').on('click','.toapi-add-header',function(){$_o.toapi_add_header(null,null)});$('#rele_module_toapi').on('click','.toapi-del-header',function(){$(this).parents('tr').eq(0).remove()});inputSelectCustom(null,null,{box:'#rele_module_toapi',slt:'[name="toapi[header_val][]"]',ipt:'[name="toapi[header_addon][]"]'});$('#btn_rele_test').bind('click',function(){collectorWindow('测试','admin/release/test?id='+$_o.releid,null,{lg:1})})},load:function(data){var $_o=this;if(data.module){$($_o.formid+' select[name="module"]').val(data.module).trigger('change')}
if(data.config){if('cms'==data.module){$_o.cms_bind(data.config);$(document).ready(function(){$('#cms_tab a[href="#cms_tab_bind"]').tab('show')})}else if('db'==data.module){$_o.db_bind(data.config)}else if('file'==data.module){if(data.config.file){$($_o.formid+' [name="file[path]"]').val(data.config.file.path);$($_o.formid+' [name="file[type]"]').each(function(){if($(this).val()==data.config.file.type){$(this).prop('checked',!0)}});$($_o.formid+' [name="file[txt_implode]"]').val(data.config.file.txt_implode);if(data.config.file.hide_fields){for(var fi in data.config.file.hide_fields){$($_o.formid+' [name="file[hide_fields][]"][value="'+data.config.file.hide_fields[fi]+'"]').prop('checked',!0)}}}}else if('api'==data.module){if(data.config.api){$($_o.formid+' [name="api[url]"]').val(data.config.api.url);$($_o.formid+' [name="api[cache_time]"]').val(data.config.api.cache_time);if(data.config.api.hide_fields){for(var fi in data.config.api.hide_fields){$($_o.formid+' [name="api[hide_fields][]"][value="'+data.config.api.hide_fields[fi]+'"]').prop('checked',!0)}}}}else if('diy'==data.module){if(data.config.diy){$(document).ready(function(){$('#diy_tab a[href="#diy_tab_'+data.config.diy.type+'"]').tab('show').trigger('click');for(var i in data.config.diy){$($_o.formid+' [name="diy['+i+']"]').val(data.config.diy[i])}
if(data.config.diy.app){var appName=data.config.diy.app;if(appName.length>1){appName=appName.substr(0,1).toUpperCase()+appName.substr(1).toLowerCase()}else{appName=appName.toUpperCase()}
$($_o.formid+' [name="diy[app]"]').parent().find('.diy-app-name').text(appName+'.php')}})}}else if('toapi'==data.module){var config=data.config.toapi;if(config){$($_o.formid+' [name="toapi[url]"]').val(config.url);$($_o.formid+' [name="toapi[type]"]').val(config.type).trigger('change');$($_o.formid+' [name="toapi[content_type]"]').val(config.content_type);$($_o.formid+' [name="toapi[charset_custom]"]').val(config.charset_custom);$($_o.formid+' [name="toapi[charset]"]').val(config.charset).trigger('change');if(config.response){for(var i in config.response){$($_o.formid+' [name="toapi[response]['+i+']"]').val(config.response[i])}}
$($_o.formid+' [name="diy[app]"]').parent().find('.diy-app-name').text(appName+'.php');$($_o.formid+' [name="diy[app]"]').parent().find('.diy-app-editor').show().find('.btn_diy_editor').attr('href',ulink('develop/editor?type=release&module=diy&app=_app_',{'_app_':appName}))}
if($_o.has_diy_editor()&&data.config.diy.code){editorCodeIfr('#diy_editor_ifr',{'set_value':data.config.diy.code})}})}}else if('toapi'==data.module){var config=data.config.toapi;if(config){$($_o.formid+' [name="toapi[url]"]').val(config.url);$($_o.formid+' [name="toapi[type]"]').val(config.type).trigger('change');$($_o.formid+' [name="toapi[content_type]"]').val(config.content_type);$($_o.formid+' [name="toapi[charset_custom]"]').val(config.charset_custom);$($_o.formid+' [name="toapi[charset]"]').val(config.charset).trigger('change');$($_o.formid+' [name="toapi[encode_custom]"]').val(config.encode_custom);$($_o.formid+' [name="toapi[encode]"]').val(config.encode).trigger('change');if(config.response){for(var i in config.response){$($_o.formid+' [name="toapi[response]['+i+']"]').val(config.response[i])}}
if(config.param_name){config.param_val=config.param_val?config.param_val:{};config.param_addon=config.param_addon?config.param_addon:{};for(var i in config.param_name){var pname=config.param_name[i]?config.param_name[i]:'';var pval=config.param_val[i]?config.param_val[i]:'';var paddon=config.param_addon[i]?config.param_addon[i]:'';$_o.toapi_add_param({name:pname,val:pval,addon:paddon},i)}}
if(config.header_name){config.header_val=config.header_val?config.header_val:{};config.header_addon=config.header_addon?config.header_addon:{};for(var i in config.header_name){var hname=config.header_name[i]?config.header_name[i]:'';var hval=config.header_val[i]?config.header_val[i]:'';var haddon=config.header_addon[i]?config.header_addon[i]:'';$_o.toapi_add_header({name:hname,val:hval,addon:haddon},i)}}
$($_o.formid+' [name="toapi[interval]"]').val(toInt(config.interval));$($_o.formid+' [name="toapi[wait]"]').val(toInt(config.wait));$($_o.formid+' [name="toapi[retry]"]').val(toInt(config.retry))}}}},cms_detect:function(){var $_o=this;$('#cms_list').html('').addClass('loading');ajaxOpen({type:'get',url:ulink("release/cmsDetect"),dataType:'json',success:function(data){$('#cms_list').removeClass('loading');if(data.code==1){var html='<p>点击选择CMS</p>';for(var x in data.data){var list=data.data[x];html+='<label>'+x+'</label><ul>';for(var y in list){html+='<li><a href="javascript:;" path="'+list[y]+'">'+list[y]+'</a></li>'}
html+='</ul>'}
$('#cms_list').html(html)}else{$('#cms_list').html(data.msg)}}})},cms_bind:function(config){var $_o=this;$('#cms_bind').html('').addClass('loading');var postData=$($_o.formid).serialize();if(config&&config.cms&&config.cms.app){postData='cms[app]='+encodeURIComponent(config.cms.app)+'&'+postData}
ajaxOpen({type:'post',url:ulink("release/cmsBind"),dataType:'html',data:postData,success:function(data,textStatus,request){$('#cms_bind').removeClass('loading').show();if((/application\/json/i).test(request.getResponseHeader('Content-Type'))){data=jQuery.parseJSON(data);$('#cms_bind').html('<b style="color:red;">'+data.msg+'</b>')}else{$('#cms_bind').html(data);if(config&&config.cms_app){if(config.cms_app.param){for(var f in config.cms_app.param){var paramEle=$('#cms_bind').find('[name="cms_app[param]['+f+']"]');if(paramEle.is('select')){paramEle.val(config.cms_app.param[f]).trigger('change')}else if(paramEle.is('input:radio')){$('#cms_bind').find('[name="cms_app[param]['+f+']"][value="'+config.cms_app.param[f]+'"]').prop('checked','checked')}else{paramEle.val(config.cms_app.param[f])}}
if(config.cms_app.custom){for(var f in config.cms_app.custom){$('#cms_bind').find('[name="cms_app[custom]['+f+']"]').val(config.cms_app.custom[f])}}}}}},error:function(XMLHttpRequest,textStatus,errorThrown){$('#cms_bind').removeClass('loading').show();$('#cms_bind').html(XMLHttpRequest.responseText)}})},db_bind:function(config){var $_o=this;$($_o.formid+' select[name="db[type]"]').val(config.db.type);$(document).ready(function(){$('#db_tab a[href="#db_tab_table"]').tab('show');$('#db_tab_table .db-table-list').html('').addClass('loading');ajaxOpen({type:'get',url:ulink("release/dbTables?id=_id_",{_id_:$_o.releid}),timeout:10000,dataType:'json',success:function(data){if(data.code==1){$('#db_tab_table .db-table-list').html(data.msg)}else{$('#db_tab_table .db-table-list').css('color','red').html(data.msg)}},complete:function(XMLHttpRequest,status){$('#db_tab_table .db-table-list').removeClass('loading');if(status=='timeout'){$('#db_tab_table .db-table-list').css('color','red').html('数据库连接超时')}}});$('#db_tab_table .db-table-list').on('click','.btn-db-table-bind',function(){var curTable=$(this).parents('.db-table-list').eq(0).find('.db-table-select').val();$_o.db_table_bind(curTable)});eleExchange('#db_table_bind_list','.icon-drag-move','.panel-default');$('#db_table_bind_list').on('click','.glyphicon-remove',function(){var obj=$(this);confirmRight(window.tpl_lang.confirm_delete,function(){obj.parents('.panel').eq(0).remove()})});$('#db_table_bind_list').on('change','select[name^="field"]',function(){if($(this).val()=='custom:'){$(this).siblings('input[name^="custom"]').show()}});if(config.db_table&&config.db_table.field){var tables=new Array();for(var table in config.db_table.field){tables.push(table)}
tables=tables.join(',');$('#db_tab_table .db-table-binding').addClass('loading');$_o.db_table_bind(tables)}})},db_table_bind:function(curTable){var $_o=this;var bindUrl=ulink("release/dbTableBind?id=_id_&table=_table_",{_id_:$_o.releid,_table_:curTable});if($('#db_table_bind_list').find('[id^="db_table_name_'+curTable+'"]').length>0){toastr.error('已绑定该表')}else{ajaxOpen({type:'get',url:bindUrl,dataType:'html',success:function(data){if(dataIsJson(data)){ajaxDataMsg(data)}else{$('#db_table_bind_list').append(data)}},complete:function(){$('#db_tab_table .db-table-binding').removeClass('loading').hide()}})}},db_connect:function(op){op=op?op:'';var $_o=this;$('#db_tab_config .rele-db-error').html('').addClass('loading');ajaxOpen({type:'post',url:ulink("release/dbConnect?op="+op),timeout:10000,dataType:'json',data:$($_o.formid).serialize(),success:function(data){if(data.code==1){if(op=='db_names'){modal('选择数据库',data.msg)}else{$('#db_tab_config .rele-db-error').css('color','green').html(data.msg)}}else{toastr.error(data.msg);$('#db_tab_config .rele-db-error').css('color','red').html(data.msg)}},complete:function(XMLHttpRequest,status){$('#db_tab_config .rele-db-error').removeClass('loading');if(status=='timeout'){$('#db_tab_config .rele-db-error').css('color','red').html('数据库连接超时')}}})},toapi_add_param:function(param,index){var $_o=this;var paramTable=$('#rele_module_toapi').find('.toapi-param-table');if(!paramTable.attr('data-tpl')){var paramTpl=$('#rele_module_toapi').find('.toapi-param-tpl');paramTable.attr('data-tpl',paramTpl.html());paramTpl.remove()}
if(config.cms_app.custom){for(var f in config.cms_app.custom){$('#cms_bind').find('[name="cms_app[custom]['+f+']"]').val(config.cms_app.custom[f])}}}}}},error:function(XMLHttpRequest,textStatus,errorThrown){$('#cms_bind').removeClass('loading').show();$('#cms_bind').html(XMLHttpRequest.responseText)}})},db_bind:function(config){var $_o=this;$($_o.formid+' select[name="db[type]"]').val(config.db.type);$(document).ready(function(){$('#db_tab a[href="#db_tab_table"]').tab('show');$('#db_tab_table .db-table-list').html('').addClass('loading');ajaxOpen({type:'get',url:ulink("release/dbTables?id=_id_",{_id_:$_o.releid}),timeout:10000,dataType:'json',success:function(data){if(data.code==1){$('#db_tab_table .db-table-list').html(data.msg)}else{$('#db_tab_table .db-table-list').css('color','red').html(data.msg)}},complete:function(XMLHttpRequest,status){$('#db_tab_table .db-table-list').removeClass('loading');if(status=='timeout'){$('#db_tab_table .db-table-list').css('color','red').html('数据库连接超时')}}});$('#db_tab_table .db-table-list').on('click','.btn-db-table-bind',function(){var curTable=$(this).parents('.db-table-list').eq(0).find('.db-table-select').val();$_o.db_table_bind(curTable)});eleExchange('#db_table_bind_list','.db-table-bind-move','[id^="db_table_t_"]');$('#db_table_bind_list').on('click','.db-table-bind-del',function(){var obj=$(this);confirmRight(window.tpl_lang.confirm_delete,function(){obj.parents('[id^="db_table_t_"]').eq(0).remove()})});$('#db_table_bind_list').on('change','.db-table-bind-op',function(){var prtObj=$(this).parents('[id^="db_table_t_"]').eq(0);prtObj.find('.db-table-bind-where').hide();prtObj.find('.db-table-bind-query').hide();prtObj.find('.db-table-bind-data').hide();prtObj.find('.db-table-bind-data-seq').hide();var val=$(this).val();var showData=!1;if(!val){showData=!0;prtObj.find('.db-table-bind-data').show()}else if(val=='update'){showData=!0;prtObj.find('.db-table-bind-where').show();prtObj.find('.db-table-bind-data').show()}else if(val=='query'){prtObj.find('.db-table-bind-where').show();prtObj.find('.db-table-bind-query').show()}
if(showData){var seqObj=prtObj.find('.db-table-bind-data-seq');if(seqObj.length>0){seqObj.show()}}});$('#db_table_bind_list').on('click','.db-table-bind-signs .btn-db-table-bind-signs',function(){var boxObj=$(this).parents('.db-table-bind-signs').eq(0);if(!boxObj||boxObj.length<=0){return}
var dropdownMenu=boxObj.find('.dropdown-menu');if(dropdownMenu.length>0){dropdownMenu.html('');var key=$(this).parents('[id^="db_table_t_"]').eq(0).attr('data-key');ajaxOpen({type:'POST',dataType:'html',url:ulink('release/dbTableBindSings?table_key=_key_',{'_key_':key}),data:$($_o.formid).serialize(),success:function(html){dropdownMenu.html(html);dropdownMenu.find('a[data-val]').bind('click',function(){insertAtCaret($(this).parents('.db-table-bind-signs').eq(0).find('input[name^="db_tables"]').eq(0),$(this).attr('data-val'))})}})}});$('#db_table_bind_list').on('click','.db-table-bind-where-add',function(){$_o.db_table_bind_where_add(this)});$('#db_table_bind_list').on('click','.db-table-bind-where-del',function(){$(this).parents('tr').eq(0).remove()});$('#db_table_bind_list').on('click','.db-table-bind-query-add',function(){$_o.db_table_bind_query_add(this)});$('#db_table_bind_list').on('click','.db-table-bind-query-del',function(){$(this).parents('tr').eq(0).remove()});if(isObject(config.db_tables)&&config.db_tables.length>0){$('#db_tab_table .db-table-binding').addClass('loading');$_o.db_table_bind(null,1)}})},db_table_bind:function(curTable,isDbTables){var $_o=this;curTable=curTable?curTable:'';isDbTables=isDbTables?isDbTables:'';var bindUrl=ulink('release/dbTableBind?id=_id_&table=_tb_&is_db_tables=_dbtb_',{'_id_':$_o.releid,'_tb_':curTable,'_dbtb_':isDbTables});ajaxOpen({type:'get',url:bindUrl,dataType:'html',success:function(data){if(dataIsJson(data)){ajaxDataMsg(data)}else{$('#db_table_bind_list').append(data)}},complete:function(){$('#db_tab_table .db-table-binding').removeClass('loading').hide()}})},db_table_bind_load:function(dbTables){var $_o=this;if(isObject(dbTables)){for(var key in dbTables){var tBoxId='#db_table_t_'+key;var namePre='db_tables['+key+']';var dbTable=dbTables[key];if(isObject(dbTable)){$(tBoxId).find('[name="'+namePre+'[op]').val(dbTable.op).trigger('change');var opTypes=['where','query'];for(var opi in opTypes){var opType=opTypes[opi];if(isObject(dbTable[opType])){for(var i in dbTable[opType]){if(!isObject(dbTable[opType])){dbTable[opType][i]=[]}}
for(var i in dbTable[opType].field){var opData={};for(var ii in dbTable[opType]){opData[ii]=dbTable[opType][ii][i]}
$_o.db_table_bind_op_add(opType,key,opData)}}}
if(isObject(dbTable.query)){for(var qk in dbTable.query){$(tBoxId).find('[name="'+namePre+'[field]['+qk+']"]').val(dbTable.query[qk])}}
if(isObject(dbTable.field)){for(var fk in dbTable.field){$(tBoxId).find('[name="'+namePre+'[field]['+fk+']"]').val(dbTable.field[fk])}}
if(isObject(dbTable.sequence)){for(var sk in dbTable.sequence){$(tBoxId).find('[name="'+namePre+'[sequence]['+sk+']"]').val(dbTable.sequence[sk])}}
eleExchange(tBoxId+' .db-table-bind-where','.db-table-bind-where-move','tbody tr')}}}},db_table_bind_where_add:function(curObj,whereData){var key=$(curObj).parents('[id^="db_table_t_"]').eq(0).attr('data-key');this.db_table_bind_op_add('where',key,whereData)},db_table_bind_query_add:function(curObj,queryData){var key=$(curObj).parents('[id^="db_table_t_"]').eq(0).attr('data-key');this.db_table_bind_op_add('query',key,queryData)},db_table_bind_op_add:function(opType,key,opData){if(opType&&key){var boxObj=$('#db_table_bind_list').find('#db_table_t_'+key);if(boxObj.length>0){var opTypeClass='.db-table-bind-'+opType;var tbBox=boxObj.find(opTypeClass);if(tbBox.length>0){var tpl=tbBox.find(opTypeClass+'-tpl').clone();tpl.removeClass('db-table-bind-'+opType+'-tpl');if(isObject(opData)){for(var dk in opData){tpl.find('[data-name="['+opType+']['+dk+'][]"]').val(opData[dk])}}
tpl.find('[data-name]').each(function(){$(this).attr('name','db_tables['+key+']'+$(this).attr('data-name'));$(this).removeAttr('data-name')});tbBox.find('tbody').append(tpl)}}}},db_connect:function(op){op=op?op:'';var $_o=this;$('#db_tab_config .rele-db-error').html('').addClass('loading');ajaxOpen({type:'post',url:ulink("release/dbConnect?op="+op),timeout:10000,dataType:'json',data:$($_o.formid).serialize(),success:function(data){if(data.code==1){if(op=='db_names'){modal('选择数据库',data.msg)}else{$('#db_tab_config .rele-db-error').css('color','green').html(data.msg)}}else{toastr.error(data.msg);$('#db_tab_config .rele-db-error').css('color','red').html(data.msg)}},complete:function(XMLHttpRequest,status){$('#db_tab_config .rele-db-error').removeClass('loading');if(status=='timeout'){$('#db_tab_config .rele-db-error').css('color','red').html('数据库连接超时')}}})},toapi_add_param:function(param,index){var $_o=this;var paramTable=$('#rele_module_toapi').find('.toapi-param-table table');if(!paramTable.attr('data-tpl')){var paramTpl=$('#rele_module_toapi').find('.toapi-param-tpl');paramTable.attr('data-tpl',paramTpl.html());paramTpl.remove()}
param=param?param:{};if(!index){index=generateUUID()}
paramTable.find('tbody').append('<tr data-param-id="'+index+'">'+paramTable.attr('data-tpl')+'</tr>');var curTr=paramTable.find('[data-param-id="'+index+'"]');curTr.find('[name="toapi[param_name][]"]').val(param.name?param.name:'');curTr.find('[name="toapi[param_val][]"]').val(param.val?param.val:'').trigger('change');curTr.find('[name="toapi[param_addon][]"]').val(param.addon?param.addon:'')},toapi_add_header:function(header,index){var $_o=this;var headerTable=$('#rele_module_toapi').find('.toapi-header-table');if(!headerTable.attr('data-tpl')){var headerTpl=$('#rele_module_toapi').find('.toapi-header-tpl');headerTable.attr('data-tpl',headerTpl.html());headerTpl.remove()}
paramTable.find('tbody').append('<tr data-param-id="'+index+'">'+paramTable.attr('data-tpl')+'</tr>');var curTr=paramTable.find('[data-param-id="'+index+'"]');curTr.find('[name="toapi[param_name][]"]').val(param.name?param.name:'');curTr.find('[name="toapi[param_val][]"]').val(param.val?param.val:'').trigger('change');curTr.find('[name="toapi[param_addon][]"]').val(param.addon?param.addon:'')},toapi_add_header:function(header,index){var $_o=this;var headerTable=$('#rele_module_toapi').find('.toapi-header-table table');if(!headerTable.attr('data-tpl')){var headerTpl=$('#rele_module_toapi').find('.toapi-header-tpl');headerTable.attr('data-tpl',headerTpl.html());headerTpl.remove()}
header=header?header:{};if(!index){index=generateUUID()}
headerTable.find('tbody').append('<tr data-header-id="'+index+'">'+headerTable.attr('data-tpl')+'</tr>');var curTr=headerTable.find('[data-header-id="'+index+'"]');curTr.find('[name="toapi[header_name][]"]').val(header.name?header.name:'');curTr.find('[name="toapi[header_val][]"]').val(header.val?header.val:'').trigger('change');curTr.find('[name="toapi[header_addon][]"]').val(header.addon?header.addon:'')},rand_str:function(len){var chars='ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678';  var maxPos=chars.length;  var str='';  for(var i=0;i<len;i++){    str+=chars.charAt(Math.floor(Math.random()*maxPos));  }
return str},import:function(id,name){var $_o=this;$($_o.formid+' input[name="release_id"]').val(id);$('#btn_import_release').text('导入配置:'+name);$('#myModal').modal('hide')}}
return str},import_rele:function(id,name){var $_o=this;$($_o.formid+' input[name="release_id"]').val(id);$('#btn_import_release').text('导入配置:'+name);$('#myModal').modal('hide')},has_diy_editor:function(){return $('#diy_editor_ifr').length>0?true:!1}}

View File

@ -8,7 +8,7 @@
|--------------------------------------------------------------------------
*/
'use strict';function SettingClass(){this.caijiForm='#form_set';this.downImgForm='#form_set';this.pageRenderForm='#form_set';this.transForm='#form_set';this.siteForm='#form_set';this.emailForm='#form_set';this.storeForm='#form_set'}
SettingClass.prototype={constructor:SettingClass,caiji_init:function(caijiConfig){var $_o=this;caijiConfig=caijiConfig?caijiConfig:{};$($_o.caijiForm+' [name="auto"]').bind('click',function(){if($(this).val()>0){$('#set_caiji_run').show()}else{$('#set_caiji_run').hide()}});$($_o.caijiForm+' [name="run"]').bind('change',function(){$('#set_caiji_run .help-block').hide();$('#set_caiji_run .run-'+$(this).val()).show()});$($_o.caijiForm+' [name="server"]').bind('change',function(){$('#set_caiji_server .server-').hide();$('#set_caiji_server .server-cli').hide();$('#set_caiji_server .server-'+$(this).val()).show()});$('#btn_test_php').bind('click',function(){ajax_check_userpwd({type:'POST',dataType:'json',url:ulink('setting/test_php'),data:{php:$($_o.caijiForm+' [name="server_php"]').val()},beforeSend:function(){$('#btn_test_php').text('测试中...').attr('disabled',!0)},success:function(data){if(data.code==1){toastr.success(data.msg)}else{toastr.error(data.msg)}},complete:function(){$('#btn_test_php').text('测试').removeAttr('disabled')}})});$($_o.caijiForm).bind('submit',function(){var formObj=$(this);var settings=getFormAjaxSettings(formObj);settings.complete=function(){formObj.find('button[type="submit"]').removeAttr('disabled')};ajax_check_userpwd(settings);return!1});$($_o.caijiForm+' [name="robots"][value="'+toInt(caijiConfig.robots)+'"]').prop('checked',!0);$($_o.caijiForm+' [name="auto"][value="'+toInt(caijiConfig.auto)+'"]').trigger("click");$($_o.caijiForm+' [name="run"]').val(caijiConfig.run?caijiConfig.run:'backstage').trigger("change");$($_o.caijiForm+' [name="server"]').val(caijiConfig.server).trigger("change");$($_o.caijiForm+' [name="same_url"][value="'+toInt(caijiConfig.same_url)+'"]').prop('checked',!0);$($_o.caijiForm+' [name="same_title"][value="'+toInt(caijiConfig.same_title)+'"]').prop('checked',!0);$($_o.caijiForm+' [name="real_time"][value="'+toInt(caijiConfig.real_time)+'"]').prop('checked',!0)},down_img_init:function(imgConfig){var $_o=this;imgConfig=imgConfig?imgConfig:{};$($_o.downImgForm+' [name="download_img"]').bind('click',function(){if($(this).val()==1){$('.content-wrapper').removeClass('wrapper-not-enable')}else{$('.content-wrapper').addClass('wrapper-not-enable')}});$($_o.downImgForm+' [name="img_name"]').bind('change',function(){if($(this).val()=='custom'){$('#img_name_custom').show()}else{$('#img_name_custom').hide()}});inputSelectCustom($_o.downImgForm+' [name="charset"]','charset_custom');$($_o.downImgForm+' .dropup-img-params .dropdown-menu a').bind('click',function(){var val=$(this).attr('data-val');if(val){var obj=$($_o.downImgForm).find('[name="img_func_param"]');var objVal=obj.val();objVal=objVal?(objVal+"\r\n"):'';obj.val(objVal+val)}});$($_o.downImgForm).on('click','.name-custom-path a[data-val]',function(){insertAtCaret($('[name="name_custom_path"]'),$(this).attr('data-val'))});for(var i in imgConfig){var ele=$($_o.downImgForm).find('[name="'+i+'"]').eq(0);if(!ele.is('input:radio')){ele.val(imgConfig[i])}}
SettingClass.prototype={constructor:SettingClass,caiji_init:function(caijiConfig){var $_o=this;caijiConfig=caijiConfig?caijiConfig:{};$($_o.caijiForm+' [name="auto"]').bind('click',function(){if($(this).val()>0){$('#set_caiji_run').show()}else{$('#set_caiji_run').hide()}});$($_o.caijiForm+' [name="run"]').bind('change',function(){$('#set_caiji_run .help-block').hide();$('#set_caiji_run .run-'+$(this).val()).show()});$($_o.caijiForm+' [name="server"]').bind('change',function(){$('#set_caiji_server .server-').hide();$('#set_caiji_server .server-cli').hide();$('#set_caiji_server .server-'+$(this).val()).show()});$('#btn_test_php').bind('click',function(){ajax_check_userpwd({type:'POST',dataType:'json',url:ulink('setting/test_php'),data:{php:$($_o.caijiForm+' [name="server_php"]').val()},beforeSend:function(){$('#btn_test_php').text('测试中...').attr('disabled',!0)},success:function(data){if(data.code==1){toastr.success(data.msg)}else{toastr.error(data.msg)}},complete:function(){$('#btn_test_php').text('测试').removeAttr('disabled')}})});$($_o.caijiForm).bind('submit',function(){var formObj=$(this);var settings=getFormAjaxSettings(formObj);settings.complete=function(){formObj.find('button[type="submit"]').removeAttr('disabled')};ajax_check_userpwd(settings);return!1});$($_o.caijiForm+' [name="robots"][value="'+toInt(caijiConfig.robots)+'"]').prop('checked',!0);$($_o.caijiForm+' [name="auto"][value="'+toInt(caijiConfig.auto)+'"]').trigger("click");$($_o.caijiForm+' [name="run"]').val(caijiConfig.run?caijiConfig.run:'backstage').trigger("change");$($_o.caijiForm+' [name="server"]').val(caijiConfig.server).trigger("change");$($_o.caijiForm+' [name="ip_resolve"]').val(caijiConfig.ip_resolve);$($_o.caijiForm+' [name="same_url"][value="'+toInt(caijiConfig.same_url)+'"]').prop('checked',!0);$($_o.caijiForm+' [name="same_title"][value="'+toInt(caijiConfig.same_title)+'"]').prop('checked',!0);$($_o.caijiForm+' [name="real_time"][value="'+toInt(caijiConfig.real_time)+'"]').prop('checked',!0);if(caijiConfig.ip_resolve||toInt(caijiConfig.max_redirs)>0){showPanelCollapse('#panel_others')}},down_img_init:function(imgConfig){var $_o=this;imgConfig=imgConfig?imgConfig:{};$($_o.downImgForm+' [name="download_img"]').bind('click',function(){if($(this).val()==1){$('.content-wrapper').removeClass('wrapper-not-enable')}else{$('.content-wrapper').addClass('wrapper-not-enable')}});$($_o.downImgForm+' [name="img_name"]').bind('change',function(){if($(this).val()=='custom'){$('#img_name_custom').show()}else{$('#img_name_custom').hide()}});inputSelectCustom($_o.downImgForm+' [name="charset"]','charset_custom');$($_o.downImgForm+' .dropup-img-params .dropdown-menu a').bind('click',function(){var val=$(this).attr('data-val');if(val){var obj=$($_o.downImgForm).find('[name="img_func_param"]');var objVal=obj.val();objVal=objVal?(objVal+"\r\n"):'';obj.val(objVal+val)}});$($_o.downImgForm).on('click','.name-custom-path a[data-val]',function(){insertAtCaret($('[name="name_custom_path"]'),$(this).attr('data-val'))});for(var i in imgConfig){var ele=$($_o.downImgForm).find('[name="'+i+'"]').eq(0);if(!ele.is('input:radio')){ele.val(imgConfig[i])}}
if(imgConfig.img_func){showPanelCollapse('#panel_img_func')}
$($_o.downImgForm+' [name="download_img"][value="'+toInt(imgConfig.download_img)+'"]').trigger("click");$($_o.downImgForm+' [name="data_image"][value="'+toInt(imgConfig.data_image)+'"]').trigger("click");$($_o.downImgForm+' [name="img_name"]').trigger("change");$($_o.downImgForm+' [name="charset"]').trigger("change");loadPluginFunc({module:'downloadImg',boxObj:$_o.downImgForm,funcObj:'[name="img_func"]',paramObj:'[name="img_func_param"]',funcVal:imgConfig.img_func})},page_render_init:function(renderConfig){var $_o=this;renderConfig=renderConfig?renderConfig:{};$($_o.pageRenderForm+' [name="tool"]').bind('change',function(){var tool=$(this).val();$('[id^="render_tool_"]').hide();if(tool){$('#render_tool_'+tool).show()}});$('#btn_chrome_test').bind('click',function(){ajax_check_userpwd({type:'POST',dataType:'json',url:ulink('setting/chrome_test'),data:$($_o.pageRenderForm).serialize(),beforeSend:function(){$('#btn_chrome_test').text('测试中...').attr('disabled',!0)},success:function(data){if(data.code==1){toastr.success(data.msg)}else{var warning=!1;if(data.msg.indexOf(':WARNING')>-1){warning=!0;if(data.msg.indexOf(':ERROR')>-1){warning=!1}}
if(warning){toastr.warning(data.msg)}else{toastr.error(data.msg)}}},complete:function(){$('#btn_chrome_test').text('测试').removeAttr('disabled')}})});$($_o.pageRenderForm).bind('submit',function(){var formObj=$(this);var settings=getFormAjaxSettings(formObj);settings.complete=function(){formObj.find('button[type="submit"]').removeAttr('disabled')};ajax_check_userpwd(settings);return!1});$('#btn_chrome_clean').bind('click',function(){confirmRight('确定清理?',function(){windowModal('正在清理...',ulink('setting/chrome_clean'))})});$('#btn_chrome_restart').bind('click',function(){confirmRight('确定重启?',function(){windowModal('正在重启...',ulink('setting/chrome_restart'))})});$($_o.pageRenderForm+' [name="tool"]').val(renderConfig.tool).trigger('change')},translate_init:function(transConfig){var $_o=this;transConfig=transConfig?transConfig:{};$($_o.transForm+' [name="open"]').bind('click',function(){if($(this).val()==1){$('.content-wrapper').removeClass('wrapper-not-enable')}else{$('.content-wrapper').addClass('wrapper-not-enable')}});$($_o.transForm+' [name="api"]').bind('change',function(){$('[id^="api_"]').hide();$('#api_'+$(this).val()).show()});$($_o.transForm+' [name="open"][value="'+toInt(transConfig.open)+'"]').trigger('click');$($_o.transForm+' [name="api"]').val(transConfig.api).trigger("change");$($_o.transForm+' [name="pass_html"][value="'+toInt(transConfig.pass_html)+'"]').trigger('click')},site_init:function(siteConfig){var $_o=this;siteConfig=siteConfig?siteConfig:{};siteConfig.login=siteConfig.login?siteConfig.login:{};$($_o.siteForm+' [name="verifycode"]').bind('click',function(){if($(this).val()==1){$('#verifycode_len').show()}else{$('#verifycode_len').hide()}});$($_o.siteForm+' [name="login[limit]"]').bind('click',function(){if($(this).val()==1){$('#login_limit').show()}else{$('#login_limit').hide()}});$($_o.siteForm+' #btn_timezone').bind('click',function(){var nowTime=new Date();var offset=nowTime.getTimezoneOffset()/60;ajaxOpen({type:'post',url:ulink("setting/site_timezone"),data:{time:nowTime.getTime(),offset:offset},dataType:'json',success:function(data){if(data.code==1){if(data.data&&data.data.timezone){if($($_o.siteForm+' [name="timezone"]').find('option[value="'+data.data.timezone+'"]').length>0){$($_o.siteForm+' [name="timezone"]').val(data.data.timezone)}else{toastr.error('自动调整失败,请手动选择!')}}}else{if(data.msg){toastr.error(data.msg)}}}})});$($_o.siteForm+' [name="verifycode"][value="'+toInt(siteConfig.verifycode)+'"]').prop('checked','checked').trigger('click');$($_o.siteForm+' [name="hidehome"][value="'+toInt(siteConfig.hidehome)+'"]').prop('checked','checked');$($_o.siteForm+' [name="closelog"][value="'+toInt(siteConfig.closelog)+'"]').prop('checked','checked');$($_o.siteForm+' [name="dblong"][value="'+toInt(siteConfig.dblong)+'"]').prop('checked','checked');$($_o.siteForm+' [name="login[limit]"][value="'+toInt(siteConfig.login.limit)+'"]').prop('checked','checked').trigger('click');$($_o.siteForm+' [name="closetrans"][value="'+toInt(siteConfig.closetrans)+'"]').prop('checked','checked');$($_o.siteForm+' [name="timezone"]').val(siteConfig.timezone)},email_init:function(emailConfig){var $_o=this;emailConfig=emailConfig?emailConfig:{};$('#btn_test').bind('click',function(){$($_o.emailForm+' [name="is_test"]').val(1);$($_o.emailForm).submit()});$($_o.emailForm+' button[type="submit"]').bind('click',function(){$($_o.emailForm+' [name="is_test"]').val(0)});$($_o.emailForm+' [name="type"][value="'+emailConfig.type+'"]').prop('checked','checked')},store_init:function(storeConfig){var $_o=this;storeConfig=storeConfig?storeConfig:{};$($_o.storeForm).bind('submit',function(){var obj=$(this);ajaxOpen({type:'post',url:obj.attr('action'),dataType:'json',data:obj.serialize(),success:function(data){if(data.code==1){ajaxDataMsg(data)}else{if(data.msg){toastr.error(data.msg)}

View File

@ -10,13 +10,14 @@
'use strict';var taskOpClass={import_rule:function(ruleId,ruleName){$('#form_item input[name="rule_id"]').val(ruleId);$('#btn_import_rule').text('导入规则:'+ruleName);if(ruleId=='file'){var settings=getFormAjaxSettings($('#form_item'));settings.url=ulink('task/import_rule_file');settings.beforeSend=null;settings.error=null;settings.success=function(data){data.url='';if(data.msg){ajaxDataMsg(data)}
$('#import_rule_file_plugins').hide().find('.plugins-info').html('');var dataData=data.data;if(isObject(dataData)){if(isObject(dataData.show_plugins)){var html='<input type="hidden" name="upload_addon[ignore_plugin]" value="1" />';for(var app in dataData.show_plugins){html+='<div class="checkbox"><label><input type="checkbox" name="upload_addon[plugins][]" value="'+app+'">'+dataData.show_plugins[app]+'</label></div>'}
$('#import_rule_file_plugins').show().find('.plugins-info').html(html)}}};ajaxOpen(settings)}else{$('#form_item [name="rule_file"]').val('')}
$('#myModal').modal('hide')},import_task:function(id,name){$('#form_item input[name="task_id"]').val(id);$('#btn_import_task').text('导入任务:'+name);$('#myModal').modal('hide')},task_init:function(){$('#form_item select[name="module"]').bind('change',function(){if($(this).val()!='pattern'){$('#btn_import_rule').parents('.input-group-btn').hide()}else{$('#btn_import_rule').parents('.input-group-btn').show()}});$('#form_item select[name="auto"]').bind('change',function(){var val=$(this).val();val=toInt(val);if(val==2){$('#config_task_timer').show()}else{$('#config_task_timer').hide()}});$('select[id^="task_timer_"]').bind('change',function(){var name=$(this).attr('data-name');if(name){var val=$(this).val();val=val?val.join(','):'';$('#form_item [name="'+name+'"]').val(val)}});$('#form_item [name="rule_file"]').bind('change',function(){taskOpClass.import_rule('file',$(this).val());$(this).parents('.dropdown').removeClass('open')});$('#form_item [name="config[download_img]"]').bind('click',function(){var open=!1;var val=$(this).val();if(val=='y'){open=!0}else if($(this).attr('data-global')){open=!0}
$('#config_download_img').css('background',open?'#fff':'#f1f1f1');$('#config_download_img').css('opacity',open?1:0.7)});$('#form_item [name="config[img_name]"]').bind('change',function(){var val=$(this).val();if(val=='custom'){$('#config_img_name_custom').show()}else{$('#config_img_name_custom').hide()}});$('#config_img_name_custom').on('click','.name-custom-path a[data-val]',function(){insertAtCaret($('[name="config[name_custom_path]"]'),$(this).attr('data-val'))});$('#config_img_name_custom').on('click','.name-custom-name a[data-val]',function(){insertAtCaret($('[name="config[name_custom_name]"]'),$(this).attr('data-val'))});$('#form_item [name="config[img_func]"]').bind('change',function(){var open=!1;var val=$(this).val();if(val){if(val!='n'){open=!0}}else{if($(this).attr('data-global')){open=!0}}
$('#myModal').modal('hide')},import_task:function(id,name){$('#form_item input[name="task_id"]').val(id);$('#btn_import_task').text('导入任务:'+name);$('#myModal').modal('hide')},task_init:function(){$('#form_item select[name="module"]').bind('change',function(){if($(this).val()!='pattern'){$('#btn_import_rule').parents('.input-group-btn').hide()}else{$('#btn_import_rule').parents('.input-group-btn').show()}});$('#form_item select[name="auto"]').bind('change',function(){var val=$(this).val();val=toInt(val);if(val==2){$('#config_task_timer').show()}else{$('#config_task_timer').hide()}});$('select[id^="task_timer_"]').bind('change',function(){var name=$(this).attr('data-name');if(name){var val=$(this).val();val=val?val.join(','):'';$('#form_item [name="'+name+'"]').val(val)}});$('#form_item [name="rule_file"]').bind('change',function(){taskOpClass.import_rule('file',$(this).val());$(this).parents('.dropdown').removeClass('open')});$('#form_item [name="config[proxy]"]').bind('click',function(){var open=!1;var val=$(this).val();if(val=='y'){open=!0}else if($(this).attr('data-global')){open=!0}
if(open){$('#config_proxy').removeClass('box-not-enable')}else{$('#config_proxy').addClass('box-not-enable')}});$('#form_item [name="config[download_img]"]').bind('click',function(){var open=!1;var val=$(this).val();if(val=='y'){open=!0}else if($(this).attr('data-global')){open=!0}
if(open){$('#config_download_img').removeClass('box-not-enable')}else{$('#config_download_img').addClass('box-not-enable')}});$('#form_item [name="config[img_name]"]').bind('change',function(){var val=$(this).val();if(val=='custom'){$('#config_img_name_custom').show()}else{$('#config_img_name_custom').hide()}});$('#config_img_name_custom').on('click','.name-custom-path a[data-val]',function(){insertAtCaret($('[name="config[name_custom_path]"]'),$(this).attr('data-val'))});$('#config_img_name_custom').on('click','.name-custom-name a[data-val]',function(){insertAtCaret($('[name="config[name_custom_name]"]'),$(this).attr('data-val'))});$('#form_item [name="config[img_func]"]').bind('change',function(){var open=!1;var val=$(this).val();if(val){if(val!='n'){open=!0}}else{if($(this).attr('data-global')){open=!0}}
if(open){$('#config_img_func').show()}else{$('#config_img_func').hide()}});$('#form_item .dropup-img-params .dropdown-menu a').bind('click',function(){var val=$(this).attr('data-val');if(val){var obj=$('#form_item [name="config[img_func_param]"]');var objVal=obj.val();objVal=objVal?(objVal+"\r\n"):'';obj.val(objVal+val)}})},task_load:function(taskData,fieldList){taskOpClass.task_init();var imgFunc='';if(taskData){$('#form_item select[name="tg_id"]').val(toInt(taskData.tg_id));$('#form_item select[name="module"]').val(taskData.module);$('#form_item select[name="auto"]').val(toInt(taskData.auto)).trigger('change');var task_timer=taskData._task_timer;if(task_timer){var timerNames=['month','day','hour','minute'];for(var i in timerNames){var timerName=timerNames[i];var timerData=task_timer[timerName];if(!timerData||typeof(timerData)!='object'){timerData=[]}
if(timerData.length>0){$('#form_item [name="task_timer['+timerName+']"]').val(timerData.join(','));for(var ii in timerData){$('#task_timer_'+timerName).find('option[value="'+timerData[ii]+'"]').prop('selected','selected')}}else{$('#task_timer_'+timerName).find('option[value=""]').prop('selected','selected')}}}
var task_config=taskData.config;var showConfig=!1;if(task_config){imgFunc=task_config.img_func;for(var i in task_config){if(task_config[i]){showConfig=!0;break}}
for(var i in task_config){var ele=$('#form_item').find('[name="config['+i+']"]').eq(0);var eleType=ele.attr('type');if(ele.is('input')&&eleType=='radio'){$('#form_item').find('[name="config['+i+']"][value="'+task_config[i]+'"]').prop('checked','checked')}else if(ele.is('input')&&eleType=='number'){task_config[i]=toInt(task_config[i]);if(task_config[i]!=0){ele.val(task_config[i])}}else{ele.val(task_config[i])}}
$('#form_item [name="config[download_img]"][value="'+task_config.download_img+'"]').trigger('click');$('#form_item [name="config[img_name]"]').trigger('change');$('#form_item [name="config[img_func]"]').trigger('change')}
$('#form_item [name="config[proxy]"][value="'+task_config.proxy+'"]').trigger('click');$('#form_item [name="config[download_img]"][value="'+task_config.download_img+'"]').trigger('click');$('#form_item [name="config[img_name]"]').trigger('change');$('#form_item [name="config[img_func]"]').trigger('change')}
if(taskData._show_config||showConfig){showPanelCollapse('#task_config')}
if(fieldList&&fieldList.length>0){$('#config_img_name_custom .name-custom-path-fields').html('');$('#config_img_name_custom .name-custom-name-fields').html('');for(var i in fieldList){var fieldHtml='[字段:'+fieldList[i]+']';fieldHtml='<li><a href="javascript:;" data-val="'+fieldHtml+'">'+fieldHtml+'</a></li>';$('#config_img_name_custom .name-custom-path-fields').append(fieldHtml);$('#config_img_name_custom .name-custom-name-fields').append(fieldHtml)}}}
loadPluginFunc({module:'downloadImg',boxObj:'#form_item',funcObj:'[name="config[img_func]"]',funcVal:imgFunc,paramObj:'[name="config[img_func_param]"]'})}}

View File

@ -20,7 +20,7 @@ function isNull(str){var space=/^[\s\r\n]*$/;if(space.test(str)||str==null||str=
function isObject(data){if(data&&typeof(data)=='object'){return!0}else{return!1}}
function toInt(val){val=val?val:0;val=parseInt(val);if(isNaN(val)){val=0}
return val}
function dataIsJson(data){if((/^\{(.+\:.+,*){1,}\}$/).test(data)||(/^\[(.+,*)+\]$/).test(data)){return!0}else{return!1}}
function dataIsJson(data){if((/^\{[\s\S]*\}$/).test(data)||(/^\[[\s\S]*\]$/).test(data)){return!0}else{return!1}}
function dataIsHtml(data){if((/<\w+[^<>]*>/).test(data)){return!0}else{return!1}}
function ajaxOpen(settings){if(settings.type&&'post'==settings.type.toLowerCase()){if(window.site_config){var regToken=new RegExp("_usertoken_\\s*=",'i');if(!regToken.test(settings.url)){var usertoken=window.site_config.usertoken;var data=settings.data;if(isNull(data)){data={'_usertoken_':usertoken}}else{if(typeof(data)=='object'){data._usertoken_=usertoken}else{if(!regToken.test(data)){data+='&_usertoken_='+encodeURIComponent(usertoken)}}}
settings.data=data}}}
@ -40,7 +40,7 @@ options.full_height=1;modal(title,'<div class="loading" style="margin:10px;"></d
function execVarFuncs(funcs){if(!isNull(funcs)){if(typeof(funcs)=='function'){funcs()}else if(typeof(funcs)=='object'){for(var i in funcs){var func=funcs[i];if(typeof(func)=='function'){func()}}}}}
function ajaxDataMsg(data){if(typeof data=='string'){data=eval('('+data+')')}
if(data.code==1){toastr.success(data.msg)}else{toastr.error(data.msg)}
if(data.url){window.setTimeout("window.location.href='"+data.url+"';",2500)}}
if(data.url){window.setTimeout("window.location.href='"+data.url+"';",2000)}}
function checkall(obj,chkName){var status=$(obj).is(":checked")?true:!1;$("input[name='"+chkName+"']:checkbox").prop('checked',status)}
function url_base64encode(str){str=Base64.encode(str);str=str.replace(/\+/g,'-').replace(/\//g,'_').replace(/\=/g,'');return str}
function url_base64decode(str){str=str.replace(/\-/g,'+').replace(/\_/g,'/');var mod4=str.length%4;if(mod4){str+=('====').substr(mod4)}

File diff suppressed because one or more lines are too long

View File

@ -17,15 +17,15 @@ class Api extends CollectController{
\util\Param::set_task_close_echo();
$taskId=input('id/d',0);
$apiurl=input('apiurl');
$releData=model('Release')->where(array('task_id'=>$taskId))->find();
$mrele=model('Release');
$releData=$mrele->where(array('task_id'=>$taskId))->find();
if(empty($releData)){
json(array('error'=>'没有发布设置!'))->send();
}
$releData['config']=unserialize($releData['config']?:'');
$releData['config']=$mrele->compatible_config($releData['config']);
if($apiurl!=$releData['config']['api']['url']){
json(array('error'=>'api地址错误'))->send();
}
\util\Param::set_task_api_response();
header('Content-type:text/json');
$this->collect_tasks($taskId, null, true);

View File

@ -50,10 +50,10 @@ class Backstage extends BaseController{
$collectBackstageTime=CacheModel::getInstance()->getCache('collect_backstage_time','data');
$collectBackstageTime=intval($collectBackstageTime);
if((time()-$collectBackstageTime)>60*3){
if((time()-$collectBackstageTime)>60*5){
$runInfo['auto_status']='停止运行';
$serverData['caiji'].='<p class="help-block">自动采集停止了,请重新<a href="'.url('admin/setting/caiji').'">保存设置</a>以便激活采集</p>';
$serverData['caiji'].='<p class="help-block">自动采集已停止 <a href="javascript:;" id="a_run_auto_backstage">点击激活</a></p>';
}else{
$runInfo['auto_status']='<span style="font-size:16px;">'.(model('Config')->server_is_cli()?'cli':'web').'后台运行</span>';
$runInfo['auto_status1']='<small>'.date('m-d H:i:s',$collectBackstageTime).'</small>';
@ -154,8 +154,18 @@ class Backstage extends BaseController{
return $this->fetch('backstage/index');
}
public function run_auto_backstageAction(){
controller('admin/Setting')->_run_auto_backstage();
$this->success('操作完成');
}
/*实时采集*/
public function collectAction(){
controller('admin/Index','controller')->auto_collectAction();
}
public function checkUpAction(){
\util\Funcs::close_session();
$info=array(
'pageRenderInvalid'=>false,
@ -179,35 +189,30 @@ class Backstage extends BaseController{
if($mconfig->server_is_cli()){
$phpvInfo=$mconfig->exec_php_version(g_sc_c('caiji','server_php'));
if(empty($phpvInfo)||!$phpvInfo['success']){
if(empty($phpvInfo)||(!$phpvInfo['success']&&$phpvInfo['msg'])){
$info['phpInvalid']=true;
}
}
$autoTaskIds=model('Task')->where('`auto`>0')->column('id');
if(!empty($autoTaskIds)){
foreach ($autoTaskIds as $autoTaskId){
$collConfig=model('Collector')->where('task_id',$autoTaskId)->value('config');
if($phpvInfo['msg']){
$collConfig=unserialize($collConfig?:'');
if(is_array($collConfig)&&$collConfig['page_render']){
$pageRender=g_sc_c('page_render');
init_array($pageRender);
if(empty($pageRender['tool'])){
$info['pageRenderInvalid']=true;
}elseif($mconfig->page_render_is_chrome()){
init_array($pageRender['chrome']);
$chromeSoket=new \util\ChromeSocket($pageRender['chrome']['host'],$pageRender['chrome']['port'],$pageRender['timeout'],$pageRender['chrome']['filename'],$pageRender['chrome']);
$info['pageRenderInvalid']=$chromeSoket->hostIsOpen()?false:true;
}
break;
if(preg_match('/\bPHP\s+(?P<ver>\d+(\.\d+){1,})/i', $phpvInfo['msg'],$mphpv)){
$mphpv=$mphpv['ver'];
$info['phpCliVersion']=$mphpv;
}
}
}
if(model('Task')->where('`auto`>0')->count()>0){
if($mconfig->page_render_is_chrome()){
init_array($pageRender['chrome']);
$chromeSoket=new \util\ChromeSocket($pageRender['chrome']['host'],$pageRender['chrome']['port'],$pageRender['timeout'],$pageRender['chrome']['filename'],$pageRender['chrome']);
$info['pageRenderInvalid']=$chromeSoket->hostIsOpen()?false:true;
}
}
$cacheTongji=cache('admin_check_up_tongji');
$cacheTongji=is_array($cacheTongji)?$cacheTongji:array();
$tongji=array();
@ -235,18 +240,13 @@ class Backstage extends BaseController{
$this->success('','',$info);
}
/*实时采集*/
public function collectAction(){
controller('admin/Index','controller')->auto_collectAction();
}
/*检测更新*/
public function newVersionAction(){
\util\Funcs::close_session();
$version=\util\Tools::curl_skycaiji('/client/info/version?v='.SKYCAIJI_VERSION);
$version=json_decode($version,true);
$version=is_array($version)?$version:array();
$new_version=trim($version['new_version']);
$new_version=trim($version['new_version']?:0);
$cur_version=g_sc_c('version');
@ -431,23 +431,24 @@ class Backstage extends BaseController{
if(!empty($taskIds)){
foreach ($taskIds as $taskId){
$cache=$mcache->db()->where('cname',$taskId)->find();
$taskStatus=$cache['ctype'];
if(empty($taskStatus)){
$taskStatus='';
$collStatus=\skycaiji\admin\model\Task::collecting_status($taskId);
if($collStatus){
if($collStatus=='none'){
$taskStatus='已断开';
}elseif($collStatus=='unlock'){
$taskStatus='运行中断';
}
}
}else{
$taskStatus='已结束';
}
$taskStatus=$cache?$cache['ctype']:'';
if(empty($taskStatus)){
$taskStatus='';
$collStatus=\skycaiji\admin\model\Task::collecting_status($taskId);
if($collStatus){
if($collStatus=='none'){
$taskStatus='已断开';
}elseif($collStatus=='unlock'){
$taskStatus='运行中断';
}
}
}else{
$taskStatus='已结束';
}
$statusList[$taskId]=$taskStatus;
}
}

View File

@ -53,20 +53,29 @@ class BaseController extends \skycaiji\common\controller\BaseController{
public function ajax_check_userpwd(){
if(!input('?_userpwd_')){
$this->error('','',array('_userpwd_'=>true));
}
$userpwd=input('_userpwd_','');
if(empty($userpwd)){
$this->error('请输入密码','',array('_userpwd_'=>true));
}
$user=g_sc('user');
if(empty($user)){
$this->error('请先登录');
}
if(\skycaiji\admin\model\User::pwd_encrypt($userpwd,$user['salt'])!=$user['password']){
$muser=model('User');
$checkUserpwd=cookie('check_userpwd');
if(empty($checkUserpwd)||$checkUserpwd!=$muser->generate_key($user)){
$this->error('密码错误','',array('_userpwd_'=>true));
if(!input('?_check_pwd_')){
$this->error('','',array('_check_pwd_'=>true));
}
$userpwd=input('_check_pwd_','');
if(empty($userpwd)){
$this->error('请输入密码','',array('_check_pwd_'=>true));
}
if(\skycaiji\admin\model\User::pwd_encrypt($userpwd,$user['salt'])!=$user['password']){
$this->error('密码错误','',array('_check_pwd_'=>true));
}
if(input('_check_skip_')){
cookie('check_userpwd',$muser->generate_key($user),array('expire'=>3600));
}
}
}
}

View File

@ -21,7 +21,6 @@ class CollectController extends \skycaiji\admin\controller\BaseController{
if($echo){
$logFilename=\skycaiji\admin\model\Collector::echo_msg_filename();
if(!empty($logFilename)){
$color=empty($color)?'red':$color;
if(!isset(self::$echo_msg_head)){
self::$echo_msg_head=true;
@ -40,30 +39,32 @@ class CollectController extends \skycaiji\admin\controller\BaseController{
$cssJs='<!DOCTYPE html><style type="text/css">'
.'body{padding:0;margin:10px;font-size:13px;color:#000;line-height:16px;}p{padding:0;margin:0;}a{color:#aaa;}'
.'.clear{width:100%;overflow:hidden;clear:both;}.left{float:left;}'
.'.lurl{float:left;margin-right:3px;height:16px;max-width:70%;overflow:hidden;text-overflow:ellipsis;word-wrap:break-word;word-break:break-all;}'
.'.echo-msg-clear{width:100%;overflow:hidden;clear:both;}'
.'.echo-msg-lt{float:left;}'
.'.echo-msg-lurl{float:left;margin-right:3px;height:16px;max-width:70%;overflow:hidden;text-overflow:ellipsis;word-wrap:break-word;word-break:break-all;}'
.'</style>';
$this->_echo_msg_write($cssJs, $logFilename);
}
if(is_array($strArgs)){
$strArg0=is_array($strArgs[0])?'':$strArgs[0];
$strArgs=array_slice($strArgs, 1);
foreach ($strArgs as $k=>$v){
$v=is_array($v)?'':htmlspecialchars($v,ENT_QUOTES);
$strArgs[$k]=$v;
}
$strArgs=vsprintf($strArg0, $strArgs);
}
$txt='<div style="color:'.$color.';'.$div_style.'">'.$strArgs.'</div>'.$end_str;
$this->_echo_msg_write($txt, $logFilename);
$this->_echo_msg_write($this->_echo_msg_str($strArgs,$color,$end_str,$div_style), $logFilename);
}
}
}
protected function _echo_msg_str($strArgs,$color='red',$end_str='',$div_style=''){
$color=empty($color)?'red':$color;
if(is_array($strArgs)){
$strArg0=is_array($strArgs[0])?'':$strArgs[0];
$strArgs=array_slice($strArgs, 1);
foreach ($strArgs as $k=>$v){
$v=is_array($v)?'':htmlspecialchars($v,ENT_QUOTES);
$strArgs[$k]=$v;
}
$strArgs=vsprintf($strArg0, $strArgs);
}
return ('<div style="color:'.$color.';'.$div_style.'">'.$strArgs.'</div>'.$end_str);
}
public function echo_msg_exit($strArgs,$color='red',$echo=true,$end_str='',$div_style=''){
$this->echo_msg($strArgs,$color,$echo,$end_str,$div_style);
exit();

View File

@ -111,6 +111,7 @@ class Cpattern extends BaseController {
}
}else{
$sourceUrl=input('source_url','','trim');
$source=array();
if($sourceUrl){
$source['objid']=input('objid','');
@ -147,8 +148,8 @@ class Cpattern extends BaseController {
$source['type']='custom';
$source['urls']=$sourceUrl;
}
$this->assign('source',$source);
}
$this->assign('source',$source);
return $this->fetch();
}
}
@ -178,7 +179,7 @@ class Cpattern extends BaseController {
$field['num_end'] = max ( $field['num_start'], $field ['num_end'] );
break;
case 'list':if(empty($field['list']))$this->error('随机抽取不能为空!');break;
case 'list':if(empty($field['list']))$this->error('列表数据不能为空!');break;
case 'extract':if(empty($field['extract']))$this->error('请选择字段!');break;
case 'merge':if(empty($field['merge']))$this->error('字段组合不能为空!');break;
case 'sign':
@ -194,7 +195,7 @@ class Cpattern extends BaseController {
'words' =>'words',
'num' => array('num_start','num_end'),
'time' => array ('time_format','time_start','time_end','time_stamp'),
'list' => 'list',
'list' => array('list','list_type'),
'extract' =>array('extract','extract_module','extract_rule','extract_rule_merge','extract_rule_multi','extract_rule_multi_str','extract_xpath','extract_xpath_attr','extract_xpath_attr_custom','extract_xpath_multi','extract_xpath_multi_str','extract_json','extract_json_arr','extract_json_arr_implode'),
'merge' => 'merge',
'sign' => 'sign'
@ -552,20 +553,39 @@ class Cpattern extends BaseController {
$eCpattern=controller('admin/Cpattern','event');
$eCpattern->init($collData);
$resizeWidth=CacheModel::getInstance()->getCache('cpattern_easymode_resize','data');
init_array($resizeWidth);
$resizeWidth=intval($resizeWidth['width']);
$this->set_html_tags('任务:'.$taskData['name'].'_简单模式');
$this->assign('taskId',$taskId);
$this->assign('collId',$collId);
$this->assign('resizeWidth',$resizeWidth);
return $this->fetch();
}
public function easymode_resizeAction(){
$width=input('width/d',0);
$cname='cpattern_easymode_resize';
$mcache=CacheModel::getInstance();
$data=$mcache->getCache($cname,'data');
if(empty($data)&&!is_array($data)){
$data=array();
}
$data['width']=$width;
$mcache->setCache($cname,$data);
$this->success();
}
public function page_signs_sortAction(){
$mcache=CacheModel::getInstance();
$key='cpattern_page_signs_sort';
$sort=$mcache->getCache($key,'data');
$sort=$sort=='asc'?'desc':'asc';
$mcache->setCache($key,$sort);
$this->success('已将页面设为'.($sort=='asc'?'升序':'倒序').'排列');
$this->success('已将页面设为'.($sort=='asc'?'升序':'序').'排列');
}
/*获取父级页面的标签列表*/
public function page_signsAction(){
@ -594,7 +614,9 @@ class Cpattern extends BaseController {
$urlConfig['area']='';
$urlConfig['url_rule']='';
$sourceConfig=$urlConfig;
$pageType='url';
if($pageType=='source_url'){
$pageType='url';
}
}
$eCpattern=controller('admin/Cpattern','event');

View File

@ -161,10 +161,10 @@ class CpatternTest extends BaseController {
}
if($sourceIsUrl){
$vurls=$this->eCpattern->page_convert_url_signs('url', '', $vurls, array(), false);
$vurls=$this->eCpattern->page_convert_url_signs('url', '', false, $vurls, array(), false);
}else{
$vurls=$this->eCpattern->page_convert_url_signs('source_url', '', $vurls, array(), false);
$vurls=$this->eCpattern->page_convert_url_signs('source_url', '', false, $vurls, array(), false);
}
$source_urls[$v]=$vurls;
}
@ -190,20 +190,23 @@ class CpatternTest extends BaseController {
$testNum=3;
}
$sourceUrlIsPost=$this->eCpattern->page_is_post('source_url')?'[POST] ':'';
$sourceUrlOpened=$this->_page_opened_tips('source_url');
$this->assign('testNum',$testNum);
$this->assign('source_urls',$source_urls);
$this->assign('sourceIsUrl',$sourceIsUrl);
$this->assign('sourceUrlIsPost',$sourceUrlIsPost);
$this->assign('sourceUrlOpened',$sourceUrlOpened);
$this->assign('config',$this->eCpattern->config);
$this->assign('openedTools',$this->_opened_tools(false));
return $this->fetch('cpattern:test_source_urls');
}
private function _page_opened_tips($pageType,$pageName=''){
return $this->eCpattern->page_opened_tips($pageType,$pageName,false,true);
}
private function _opened_tools($isHead=true){
$opened_tools=array();
if($this->eCpattern->config['page_render']){
if($this->eCpattern->page_render_is_open()){
$opened_tools[]='页面渲染';
}
if(g_sc_c('proxy','open')){
@ -291,18 +294,14 @@ class CpatternTest extends BaseController {
);
cache($cacheKeyPre.$curLevel,$cachePageData,1200);
$urlIsPost=$this->eCpattern->page_is_post('url')?'[POST] ':'';
$levelIsPost=$this->eCpattern->page_is_post('level_url',$levelData['levelName'])?'[POST] ':'';
$this->success('', null, array(
'sourceUrl'=>$source_url,
'urls' => $levelData['urls'],
'urlIsPost'=>$urlIsPost,
'urlOpened'=>$this->_page_opened_tips('url'),
'levelName' => $levelData['levelName'],
'level' => $curLevel,
'nextLevel' => $levelData['nextLevel'],
'levelIsPost'=>$levelIsPost,
'levelOpened'=>$this->_page_opened_tips('level_url',$levelData['levelName']),
));
}
@ -321,12 +320,15 @@ class CpatternTest extends BaseController {
$urlParams=input('param.','','trim');
$urlParams=base64_encode(serialize($urlParams));
$urlIsPost=$this->eCpattern->page_is_post('url');
$urlOpened=$this->_page_opened_tips('url');
$pageSource=input('page_source','');
if($pageSource=='source_url'&&$this->eCpattern->source_is_url()){
$pageSource='url';
}
$this->assign('pageSource',$pageSource);
$this->assign('urlIsPost',$urlIsPost);
$this->assign('urlOpened',$urlOpened);
$this->assign('pageSources',$this->eCpattern->page_source_options());
$this->assign('urlParams',$urlParams);
if(request()->isAjax()){
@ -424,6 +426,8 @@ class CpatternTest extends BaseController {
$pageSigns=$this->eCpattern->parent_page_signs($pageType,$pageName,'url_web');
$this->_page_signs_input_urls(true,true,$pageSigns,$inputedUrls,$input_urls);
$pageSigns=$this->eCpattern->parent_page_signs($pageType,$pageName,'renderer');
$this->_page_signs_input_urls(true,true,$pageSigns,$inputedUrls,$input_urls);
}elseif($test=='get_html'||$test=='get_browser'){
if(!empty($pageType)){
@ -494,23 +498,23 @@ class CpatternTest extends BaseController {
unset($input_urls['source_url']);
}
$is_post_list=array();
$pageOpenedList=array();
foreach ($input_urls as $iu_type=>$iu_urls){
if($this->eCpattern->page_is_list($iu_type)){
$is_post_list[$iu_type]=array();
$pageOpenedList[$iu_type]=array();
foreach ($iu_urls as $v){
$is_post_list[$iu_type][$v['name']]=$this->eCpattern->page_is_post($iu_type,$v['name']);
$pageOpenedList[$iu_type][$v['name']]=$this->_page_opened_tips($iu_type,$v['name']);
}
}else{
$is_post_list[$iu_type]=$this->eCpattern->page_is_post($iu_type);
$pageOpenedList[$iu_type]=$this->_page_opened_tips($iu_type);
}
}
$is_post=$this->eCpattern->page_is_post($pageType,$pageName);
$pageOpened=$this->_page_opened_tips($pageType,$pageName);
$this->assign('input_urls',$input_urls);
$this->assign('is_post_list',$is_post_list);
$this->assign('is_post',$is_post);
$this->assign('pageOpenedList',$pageOpenedList);
$this->assign('pageOpened',$pageOpened);
return $this->fetch('cpattern:test_input_url');
}
@ -520,13 +524,15 @@ class CpatternTest extends BaseController {
$this->_page_signs_input_urls($isContUrl,false,$pageSigns,$inputedUrls,$input_urls);
$pageSigns=$this->eCpattern->parent_page_signs($pageType,$pageName,'url_web');
$this->_page_signs_input_urls($isContUrl,true,$pageSigns,$inputedUrls,$input_urls);
$pageSigns=$this->eCpattern->parent_page_signs($pageType,$pageName,'renderer');
$this->_page_signs_input_urls($isContUrl,true,$pageSigns,$inputedUrls,$input_urls);
}
private function _page_signs_input_urls($isContUrl,$isUrlWeb,$pageSigns,$inputedUrls,&$input_urls){
private function _page_signs_input_urls($isContUrl,$inPageConfig,$pageSigns,$inputedUrls,&$input_urls){
$iptUrls=array();
if(!empty($pageSigns)){
if($isUrlWeb){
if($inPageConfig){
if(!empty($pageSigns['cur'])&&(!empty($pageSigns['cur']['url'])||!empty($pageSigns['cur']['area']))){
@ -618,31 +624,21 @@ class CpatternTest extends BaseController {
}
if($levelNames){
foreach ($levelNames as $levelName){
$pageSigns=$this->eCpattern->parent_page_signs('level_url',$levelName);
$iptUrls=$this->_page_signs_input_urls($isContUrl,false,$pageSigns,$inputedUrls,$input_urls);
if(is_array($iptUrls['level_url'])){
foreach ($iptUrls['level_url'] as $k=>$v){
if(isset($input_urls['level_url'][$k])){
unset($iptUrls['level_url'][$k]);
$mergeTypes=array(''=>false,'url_web'=>true,'renderer'=>true);
foreach ($mergeTypes as $mtk=>$mtv){
$pageSigns=$this->eCpattern->parent_page_signs('level_url',$levelName,$mtk);
$iptUrls=$this->_page_signs_input_urls($isContUrl,$mtv,$pageSigns,$inputedUrls,$input_urls);
if(is_array($iptUrls['level_url'])){
foreach ($iptUrls['level_url'] as $k=>$v){
if(isset($input_urls['level_url'][$k])){
unset($iptUrls['level_url'][$k]);
}
}
}
if(!empty($iptUrls['level_url'])){
$this->_input_urls_parent($isContUrl,$iptUrls, $inputedUrls, $input_urls);
}
}
$pageSigns=$this->eCpattern->parent_page_signs('level_url',$levelName,'url_web');
$iptUrls=$this->_page_signs_input_urls($isContUrl,true,$pageSigns,$inputedUrls,$input_urls);
if(is_array($iptUrls['level_url'])){
foreach ($iptUrls['level_url'] as $k=>$v){
if(isset($input_urls['level_url'][$k])){
unset($iptUrls['level_url'][$k]);
if(!empty($iptUrls['level_url'])){
$this->_input_urls_parent($isContUrl,$iptUrls, $inputedUrls, $input_urls);
}
}
if(!empty($iptUrls['level_url'])){
$this->_input_urls_parent($isContUrl,$iptUrls, $inputedUrls, $input_urls);
}
}
}
}
@ -777,9 +773,6 @@ class CpatternTest extends BaseController {
$html=$this->eCpattern->get_page_html($test_url, $pageType, $pageName);
$jsonHtml=\util\Funcs::convert_html2json($html,true);
$config=$this->eCpattern->config;
$config=is_array($config)?$config:array();
if(empty($jsonHtml)){
@ -787,10 +780,24 @@ class CpatternTest extends BaseController {
$html=preg_replace('/\bon[a-z]+\s*\=\s*[\'\"]/', "$0return;", $html);
$html=preg_replace('/<meta[^<>]*charset[^<>]*?>/i', '', $html);
$html=preg_replace('/<meta[^<>]*http-equiv\s*=\s*[\'\"]{0,1}refresh\b[\'\"]{0,1}[^<>]*?>/i', '', $html);
header("Content-type:text/html;charset=utf-8");
$this->assign('html',$html);
$this->assign('config',$config);
$configUnset=array();
$configSetted=array();
if(!$this->eCpattern->get_config('url_complete')){
$configUnset[]='自动补全网址';
}
if($this->eCpattern->renderer_is_open($pageType,$pageName)){
$configSetted[]='页面渲染';
}
if(g_sc_c('proxy','open')){
$configSetted[]='代理';
}
header("Content-type:text/html;charset=utf-8");
$this->assign('configTips',array('setted'=>$configSetted,'unset'=>$configUnset));
$this->assign('html',$html);
return $this->fetch('cpattern:browser');
}else{
@ -1190,7 +1197,6 @@ class CpatternTest extends BaseController {
return $matches;
}
public function matchAction(){
if(request()->isPost()){
$this->_test_init();
@ -1199,63 +1205,49 @@ class CpatternTest extends BaseController {
$field=input('field/a',array(),'trim');
if($inputType=='url'){
$pageSource=input('page_source','');
$url=input('url','','trim');
$charset=input('charset','');
$charsetCustom=input('charset_custom','');
$formMethod=input('form_method','');
$contentType=input('content_type','');
$formNames=trim_input_array('form_names');
$formVals=trim_input_array('form_vals');
$headerGlobal=input('header_global','');
$headerNames=trim_input_array('header_names');
$headerVals=trim_input_array('header_vals');
$config=input('config/a',array(),'trim');
if(empty($pageSource)){
$this->error('请选择页面类型');
}
if(empty($url)){
$this->error('请输入网址');
}
$charset=$charset=='custom'?$charsetCustom:$charset;
if(empty($charset)){
$charset=$this->eCpattern->config['charset'];
list($pageType,$pageName)=$this->eCpattern->page_source_split($pageSource);
$config=$this->eCpattern->page_set_config($pageType, $config);
init_array($config);
$eCpConfig1=null;
$eCpConfig2=null;
if($pageType=='front_url'||$pageType=='level_url'||$pageType=='relation_url'){
foreach ($this->eCpattern->config[$pageType.'s'] as $k=>$v){
if($v&&is_array($v)&&$v['name']==$pageName){
$eCpConfig1=&$this->eCpattern->config[$pageType.'s'][$k];
$eCpConfig2=&$this->eCpattern->config['new_'.$pageType.'s'][$v['name']];
break;
}
}
}elseif($pageType=='source_url'){
if($this->eCpattern->source_is_url()){
$eCpConfig1=&$this->eCpattern->config;
}else{
$eCpConfig1=&$this->eCpattern->config['source_config'];
}
}elseif($pageType=='url'){
$eCpConfig1=&$this->eCpattern->config;
}
if($eCpConfig1){
$eCpConfig1=array_merge($eCpConfig1,$config);
}
if($eCpConfig2){
$eCpConfig2=array_merge($eCpConfig2,$config);
}
$headers=array();
if(empty($headerGlobal)){
$headers=$this->eCpattern->config_params['headers']['page'];
}elseif($headerGlobal=='y'){
$headers=$this->eCpattern->config_params['headers']['page_headers'];
}
$useCookie=\util\Param::get_gsc_use_cookie(false,true);
if(!empty($useCookie)){
unset($headers['cookie']);
$headers['cookie']=$useCookie;
}
$headers=\util\Funcs::array_key_merge($headers,$this->eCpattern->arrays_to_key_val($headerNames, $headerVals));
if($contentType){
$headers['content-type']=$contentType;
}
$formData=$this->eCpattern->arrays_to_key_val($formNames, $formVals);
$postData=false;
if($formMethod=='post'){
$postData=$formData;
}else{
$postData=false;
$url=\util\Funcs::url_params_charset($url,$formData,$charset);
}
$content=$this->eCpattern->get_html($url,$postData,$headers,$charset);
$content=$this->eCpattern->get_page_html($url, $pageType, $pageName);
}else{
$content=input('content','','trim');
@ -1265,7 +1257,7 @@ class CpatternTest extends BaseController {
}
$val='';
if($type=='rule'){
$rule=$this->eCpattern->convert_sign_match($field['rule']);
@ -1303,6 +1295,17 @@ class CpatternTest extends BaseController {
}else{
$this->_test_init(true,true);
$this->set_html_tags('模拟匹配','模拟匹配'.$this->_opened_tools());
$defConfig=array('charset'=>'','encode'=>'','page_render'=>'');
foreach($defConfig as $k=>$v){
$defConfig[$k]=$this->eCpattern->get_config($k);
$defConfig[$k]=htmlspecialchars($defConfig[$k]);
}
$defConfig['request_headers_open']=$this->eCpattern->get_config('request_headers','open');
$this->assign('defConfig',$defConfig);
$this->assign('pageSources',$this->eCpattern->page_source_options());
if(request()->isAjax()){
return view('cpattern:test_match_ajax');
}else{

View File

@ -93,7 +93,7 @@ class Develop extends BaseController {
$this->create_cms_app(array('name'=>$name,'app'=>$appName), $params,$is_edit);
}else{
$appName=input('app');
$appName=input('app','');
$appName=ucfirst($appName);
$config=array();
@ -130,7 +130,7 @@ class Develop extends BaseController {
$cmsClass=null;
$this->error($ex->getMessage());
}
if(is_array($cmsClass->_params)){
if($cmsClass&&property_exists($cmsClass,'_params')&&is_array($cmsClass->_params)){
foreach ($cmsClass->_params as $k=>$v){
$param=array(
'key'=>$k,
@ -160,6 +160,11 @@ class Develop extends BaseController {
$config['params'][]=$param;
}
}
if(empty($cmsClass)){
$this->assign('noClass',1);
}
}
}
$this->set_html_tags(
@ -167,7 +172,7 @@ class Develop extends BaseController {
'开发CMS发布插件 <small><a href="https://www.skycaiji.com/manual/doc/cms" target="_blank"><span class="glyphicon glyphicon-info-sign"></span></a></small>',
breadcrumb(array(array('url'=>url('mystore/releaseApp'),'title'=>'CMS发布插件'),array('url'=>url('develop/releaseCms'),'title'=>'开发CMS发布插件')))
);
$this->assign('appName',$appName);
$this->assign('config',$config);
$this->assign('is_old_plugin',$is_old_plugin);
return $this->fetch('releaseCms');
@ -787,10 +792,11 @@ EOF;
'开发函数插件 <small><a href="https://www.skycaiji.com/manual/doc/func" target="_blank"><span class="glyphicon glyphicon-info-sign"></span></a></small>',
breadcrumb(array(array('url'=>url('mystore/funcApp'),'title'=>'函数插件'),array('url'=>url('develop/func'),'title'=>'开发函数插件')))
);
if(input('?app')){
$app=input('app','');
if($app){
$funcData=$mfuncApp->where('app',input('app'))->find();
$funcData=$mfuncApp->where('app',$app)->find();
if(!empty($funcData)){
$funcClass=$mfuncApp->get_app_class($funcData['module'],$funcData['app']);
$funcClass['name']=$funcData['name'];
@ -798,7 +804,7 @@ EOF;
$this->assign('funcClass',$funcClass);
}
}
$this->assign('app',$app);
$this->assign('module',$module);
$this->assign('modules',$mfuncApp->funcModules);
return $this->fetch();
@ -938,4 +944,183 @@ EOF;
}
}
}
public function editorAction(){
$type=input('type','');
$module=input('module','');
$app=input('app','');
$mReleApp=model('ReleaseApp');
$mFuncApp=model('FuncApp');
$isApp=false;
$setTitle='';
$setNav='';
if(!empty($type)){
if(!empty($app)){
$isApp=true;
$appcode='';
if($type=='release'){
$setTitle='发布插件';
$appName=$app;
if($module=='diy'){
if($mReleApp->isSystemApp($app,'diy')){
$this->error('不能编辑系统文件');
}
$setTitle.=' » 自定义';
if($mReleApp->appFileExists($app,'diy')){
$appcode=file_get_contents($mReleApp->appFileName($app,'diy'));
}
}else{
if($mReleApp->isSystemApp($app,'cms')){
$this->error('不能编辑系统文件');
}
$releData=$mReleApp->where('app',$app)->find();
if(!empty($releData)){
if($mReleApp->appFileExists($releData['app'],$releData['module'])){
$appcode=file_get_contents($mReleApp->appFileName($releData['app'],$releData['module']));
}
if($releData['module']=='cms'){
$setTitle.=' » cms程序';
if($releData['name']){
$appName.=''.$releData['name'].'';
}
$setNav=breadcrumb(array(array('url'=>url('develop/releaseCms?app='.$app),'title'=>$app),'编辑插件'));
}
}
}
$setTitle.=' » '.$appName;
}elseif($type=='func'){
$setTitle='函数插件';
$appName=$app;
$funcData=$mFuncApp->where('app',$app)->find();
if(!empty($funcData)){
if(file_exists($mFuncApp->filename($funcData['module'],$funcData['app']))){
$appcode=file_get_contents($mFuncApp->filename($funcData['module'],$funcData['app']));
}
if($funcData['module']){
$setTitle.=' » '.$mFuncApp->get_func_module_val($funcData['module'],'name');
}
if($funcData['name']){
$appName.=''.$funcData['name'].'';
}
}
$setTitle.=' » '.$appName;
$setNav=breadcrumb(array(array('url'=>url('develop/func?app='.$app),'title'=>$app),'编辑插件'));
}
$appcode=$appcode?:'';
if($setTitle){
$setTitle='<span style="font-size:18px;">编辑插件:'.$setTitle.'</span>';
}
}
}else{
$type='release';
}
$appList=array();
if($type=='release'){
$appList=$mReleApp->order('app asc')->column('name','app');
init_array($appList);
$mRele=model('Release');
$diyList=$mRele->where('module','diy')->column('config','id');
if($diyList){
foreach ($diyList as $k=>$v){
$diyApp='';
if($v){
$v=unserialize($v);
if(is_array($v)&&is_array($v['diy'])&&$v['diy']['type']=='app'&&$v['diy']['app']){
$diyApp=$v['diy']['app'];
}
}
if($diyApp&&!$mReleApp->isSystemApp($diyApp,'diy')){
$diyList[$k]=$diyApp;
}else{
unset($diyList[$k]);
}
}
if($diyList){
$diyList=array_unique($diyList);
sort($diyList);
$this->assign('diyList',$diyList);
}
}
}elseif($type=='func'){
$appList=$mFuncApp->order('app asc')->column('name','app');
}
init_array($appList);
$setTitle=$setTitle?:'插件编辑器';
$setNav=$setNav?:breadcrumb(array(array('url'=>url('develop/editor'),'title'=>'插件编辑器')));
$this->set_html_tags(
'插件编辑器',
$setTitle,
$setNav
);
$this->assign('config',array('type'=>$type,'module'=>$module,'app'=>$app));
$this->assign('type',$type);
$this->assign('module',$module);
$this->assign('app',$app);
$this->assign('isApp',$isApp);
$this->assign('appList',$appList);
$this->assign('appcode',$appcode);
return $this->fetch();
}
public function editor_codeAction(){
$appcode=input('appcode','','trim');
$this->assign('appcode',$appcode);
return $this->fetch('editor_code');
}
public function editor_saveAction(){
$this->ajax_check_userpwd();
if(request()->isPost()){
$type=input('type','');
$module=input('module','');
$app=input('app','');
$appcode=input('appcode','','trim');
$filename='';
if($type=='release'){
$mReleApp=model('ReleaseApp');
$module=$module=='diy'?'diy':'cms';
if($mReleApp->isSystemApp($app,$module)){
$this->error('不能编辑系统文件');
}
if(!$mReleApp->isRightApp($app,$module)){
$this->error('插件名称格式错误');
}
if($module=='cms'){
$releData=$mReleApp->where(array('app'=>$app,'module'=>'cms'))->find();
if(empty($releData)){
$this->error('插件不存在');
}
}
$filename=$mReleApp->appFileName($app,$module);
}elseif($type=='func'){
$mFuncApp=model('FuncApp');
$funcData=$mFuncApp->where('app',$app)->find();
if(empty($funcData)||empty($funcData['module'])||empty($funcData['app'])){
$this->error('插件不存在');
}
$filename=$mFuncApp->filename($funcData['module'],$funcData['app']);
}else{
$this->error('类型错误');
}
if(empty($filename)){
$this->error('插件文件错误');
}
file_put_contents($filename, $appcode);
$uri=sprintf('develop/editor?type=%s&module=%s&app=%s',$type,$module,$app);
$this->success('操作成功',$uri);
}else{
$this->error('提交错误');
}
}
}

View File

@ -553,7 +553,6 @@ class Index extends CollectController{
$this->collect_tasks($taskIds,input('collect_num/d'),input('collect_auto'));
}
private function _collect_check_key(){
if(is_empty(session('user_login'))){
@ -564,4 +563,26 @@ class Index extends CollectController{
}
return true;
}
public function proc_open_execAction(){
$key=input('key');
if(empty($key)||$key!=\util\Param::get_proc_open_exec_key()){
$this->error('密钥错误');
}
$params=cache('proc_open_exec_params');
\util\Param::set_proc_open_exec_key();
cache('proc_open_exec_params',null);
$info=array();
if(!empty($params)&&is_array($params)){
$timeout=intval($params[2]);
$timeout=max($timeout,15);
set_time_limit($timeout);
\util\Funcs::close_session();
$info=\util\Tools::proc_open_exec($params[0],$params[1],$params[2],$params[3],$params[4]);
}
return json($info);
}
}

View File

@ -704,6 +704,16 @@ class Mystore extends BaseController {
}
}
private function _safe_unserialize($code){
$code=base64_decode(trim($code));
if(preg_match('/\bO\:\d+\:[\'\"][^\'\"]+?[\'\"]/',$code)){
$this->error('错误的文件');
}
$code=unserialize($code);
return $code;
}
public function _upload_addon($typeIsRule,$formFileName,$installRule,$installPlugin){
$typeName=$typeIsRule?'规则':'插件';
$file=$_FILES[$formFileName];
@ -717,7 +727,7 @@ class Mystore extends BaseController {
if(preg_match_all('/\/\*skycaiji-plugin-start\*\/(?P<data>[\s\S]+?)\/\*skycaiji-plugin-end\*\//i',$fileTxt,$fileMatches)){
foreach ($fileMatches['data'] as $k=>$v){
$v=$v?:'';
$v=unserialize(base64_decode(trim($v)));
$v=$this->_safe_unserialize($v);
if($v['type']&&$v['app']){
$pluginDataList[$v['type'].':'.$v['app']]=$v;
}
@ -727,7 +737,7 @@ class Mystore extends BaseController {
if($typeIsRule){
if(preg_match('/\/\*skycaiji-collector-start\*\/(?P<data>[\s\S]+?)\/\*skycaiji-collector-end\*\//i',$fileTxt,$fileMatch)){
$ruleData=unserialize(base64_decode(trim($fileMatch['data'])));
$ruleData=$this->_safe_unserialize($fileMatch['data']);
}
if(empty($ruleData)||!is_array($ruleData)){
return return_result('不是规则文件');

View File

@ -13,7 +13,7 @@ namespace skycaiji\admin\controller;
class Proxy extends BaseController {
public function listAction(){
$mproxy=model('Proxyip');
$mproxy=model('ProxyIp');
$cond=array();
$search=array(
'num'=>input('num/d',200),
@ -21,7 +21,8 @@ class Proxy extends BaseController {
'user'=>input('user'),
'pwd'=>input('pwd'),
'type'=>input('?type')?input('type'):'all',
'invalid'=>input('?invalid')?input('invalid'):'all',
'invalid'=>input('?invalid')?input('invalid'):'all',
'group_id'=>input('?group_id')?input('group_id'):'all',
);
if(!empty($search['ip'])){
@ -35,6 +36,10 @@ class Proxy extends BaseController {
$cond['invalid']=$search['invalid'];
}
if($search['group_id']!='all'){
$cond['group_id']=$search['group_id'];
}
if(!empty($search['user'])){
$cond['user']=$search['user'];
@ -71,72 +76,66 @@ class Proxy extends BaseController {
$urlParams=input('param.');
$urlParams=http_build_query($urlParams);
$this->assign('proxyGroups',model('ProxyGroup')->getAll());
$this->assign('proxyTypes',$mproxy->proxy_types());
$this->assign('search',$search);
$this->assign('urlParams',$urlParams);
return $this->fetch();
}
private function _input_str2json($name){
$data=input($name,'','trim');
$data=empty($data)?array():json_decode($data,true);
init_array($data);
$data=array_map('trim', $data);
return $data;
}
public function opAction(){
$op=input('op');
$listUrl=input('url_params','','trim');
$listUrl='proxy/list?'.ltrim($listUrl,'?');
$mproxy=model('Proxyip');
$mproxy=model('ProxyIp');
if($op=='delete'){
$ip=input('ip');
$mproxy->where('ip',$ip)->delete();
$this->success('删除成功',$listUrl);
}elseif($op=='delete_all'){
$ips=input('ips','','trim');
$ips=empty($ips)?array():json_decode($ips,true);
$ips=array_map('trim', $ips);
$ips=$this->_input_str2json('ips');
if(!empty($ips)){
$mproxy->where('ip','in',$ips)->delete();
}
$this->success('删除成功',$listUrl);
}elseif($op=='update_all'){
$ips=input('ips','','trim');
$ip_list=input('ip_list','','trim');
$user_list=input('user_list','','trim');
$pwd_list=input('pwd_list','','trim');
$type_list=input('type_list','','trim');
$ips=empty($ips)?array():json_decode($ips,true);
$ip_list=empty($ip_list)?array():json_decode($ip_list,true);
$user_list=empty($user_list)?array():json_decode($user_list,true);
$pwd_list=empty($pwd_list)?array():json_decode($pwd_list,true);
$type_list=empty($type_list)?array():json_decode($type_list,true);
$ips=array_map('trim', $ips);
$ip_list=array_map('trim', $ip_list);
$user_list=array_map('trim', $user_list);
$pwd_list=array_map('trim', $pwd_list);
$type_list=array_map('trim', $type_list);
$ips=$this->_input_str2json('ips');
$paramNames=array('ip'=>'ip_list','user'=>'user_list','pwd'=>'pwd_list','type'=>'type_list','group_id'=>'gid_list');
$paramDatas=array();
foreach($paramNames as $paramField=>$paramName){
$paramDatas[$paramField]=$this->_input_str2json($paramName);
}
for($i=0;$i<count($ips);$i++){
$mproxy->strict(false)->where('ip',$ips[$i])->update(array(
'ip'=>$ip_list[$i],
'user'=>$user_list[$i],
'pwd'=>$pwd_list[$i],
'type'=>$type_list[$i],
));
$proxyData=array();
foreach ($paramDatas as $paramField=>$paramData){
$proxyData[$paramField]=$paramData[$i];
}
$mproxy->strict(false)->where('ip',$ips[$i])->update($proxyData);
}
$this->success('修改成功',$listUrl);
}
}
public function addAction(){
$mproxy=model('Proxyip');
$mproxy=model('ProxyIp');
$proxyTypes=$mproxy->proxy_types();
if(request()->isPost()){
$ip_list=input('ip_list/a',array(),'trim');
$user_list=input('user_list/a',array(),'trim');
$pwd_list=input('pwd_list/a',array(),'trim');
$type_list=input('type_list/a',array(),'trim');
$gid_list=input('gid_list/a',array(),'intval');
if(!empty($ip_list)){
$nowTime=time();
@ -146,6 +145,7 @@ class Proxy extends BaseController {
'user'=>$user_list[$k],
'pwd'=>$pwd_list[$k],
'type'=>$type_list[$k],
'group_id'=>$gid_list[$k],
'addtime'=>$nowTime
);
$mproxy->db()->strict(false)->insert($newData,true);
@ -155,15 +155,15 @@ class Proxy extends BaseController {
$this->error('请添加ip');
}
}else{
$this->assign('proxyGroups',model('ProxyGroup')->getAll());
$this->assign('proxyTypes',$proxyTypes);
return $this->fetch();
}
}
/*批量添加代理*/
public function batchAction(){
$mproxy=model('Proxyip');
$mproxy=model('ProxyIp');
$proxyTypes=$mproxy->proxy_types();
if(request()->isPost()){
$type=input('type');
@ -171,11 +171,12 @@ class Proxy extends BaseController {
$fmt=input('format','','trim');
$user=input('user','','trim');
$pwd=input('pwd','','trim');
$groupId=input('group_id/d',0);
$ipList=array();
if(!empty($fmt)&&preg_match_all('/[^\r\n]+/',$ips,$mips)){
foreach ($mips[0] as $ip){
$ip=model('Proxyip')->get_format_ips($ip,$fmt,false);
$ip=model('ProxyIp')->get_format_ips($ip,$fmt,false);
if(empty($ip)){
continue;
}
@ -186,7 +187,8 @@ class Proxy extends BaseController {
$ipList=$mproxy->ips_format2db($ipList,array(
'type'=>$type,
'user'=>$user,
'pwd'=>$pwd
'pwd'=>$pwd,
'group_id'=>$groupId,
));
if(empty($ipList)){
@ -207,6 +209,7 @@ class Proxy extends BaseController {
$this->success('批量添加成功');
}
}else{
$this->assign('proxyGroups',model('ProxyGroup')->getAll());
$this->assign('proxyTypes',$proxyTypes);
return $this->fetch();
}
@ -214,7 +217,7 @@ class Proxy extends BaseController {
/*清理无效ip*/
public function clearInvalidAction(){
$mproxy=model('Proxyip');
$mproxy=model('ProxyIp');
$mproxy->where('invalid',1)->delete();
$this->success('清理完成','setting/proxy');
}
@ -222,14 +225,15 @@ class Proxy extends BaseController {
/*测试代理接口*/
public function testApiAction(){
$config=input('config/a',array(),'trim');
$mproxy=model('Proxyip');
$mproxy=model('ProxyIp');
$html=get_html($config['api_url']);
$ips=$mproxy->get_format_ips($html,$config['api_format'],true);
$ips=$mproxy->ips_format2db ( $ips, array (
'type' => $config ['api_type'],
'user' => $config ['api_user'],
'pwd' => $config ['api_pwd'],
'pwd' => $config ['api_pwd'],
'group_id' => $config ['api_group_id'],
) );
@ -249,4 +253,77 @@ class Proxy extends BaseController {
$this->assign('ips',$ips);
return $this->fetch('testApi');
}
public function groupsAction(){
$mgroup=model('ProxyGroup');
$mip=model('ProxyIp');
if(request()->isPost()){
$groupIds=input('group_id/a',array(),'intval');
$groupSorts=input('group_sort/a',array(),'intval');
$groupNames=input('group_name/a',array(),'trim');
\util\Funcs::filter_key_val_list3($groupNames,$groupIds,$groupSorts);
$upDatas=array();
$addDatas=array();
$addNames=array();
foreach ($groupIds as $k=>$groupId){
$groupData=array('name'=>$groupNames[$k],'sort'=>$groupSorts[$k]);
if($groupId>0){
$upDatas[$groupId]=$groupData;
}else{
$addDatas[]=$groupData;
$addNames[$groupData['name']]=$groupData['name'];
}
}
if($upDatas){
$dbNames=$mgroup->where('id','in',array_keys($upDatas))->column('name','id');
foreach ($dbNames as $dbId=>$dbName){
$upName=$upDatas[$dbId]['name'];
if($dbName!=$upName&&$mgroup->where('name',$upName)->count()>0){
unset($upDatas[$dbId]);
}
}
foreach ($upDatas as $upId=>$upData){
$mgroup->strict(false)->where('id',$upId)->update($upData);
}
}
if($addDatas){
$dbNames=$mgroup->where('name','in',$addNames)->column('name','id');
if($dbNames){
foreach ($addDatas as $k=>$addData){
if(in_array($addData['name'], $dbNames)){
unset($addDatas[$k]);
}
}
}
$mgroup->strict(false)->insertAll($addDatas);
}
$this->success('操作成功');
}else{
$groups=$mgroup->order('sort desc')->column('id,name,sort');
init_array($groups);
$groups=array_values($groups);
foreach ($groups as $k=>$v){
$v['_ip_num']=$mip->where('group_id',$v['id'])->count();
$groups[$k]=$v;
}
$this->assign('groups',$groups);
return $this->fetch();
}
}
public function delete_groupAction(){
$id=input('id/d',0);
if($id>0){
model('ProxyGroup')->where('id',$id)->delete();
model('ProxyIp')->where('group_id',$id)->update(array('group_id'=>0));
}
$this->success('删除成功');
}
}

View File

@ -12,6 +12,7 @@
namespace skycaiji\admin\controller;
use skycaiji\admin\model\DbCommon;
use think\db\Query;
class Release extends CollectController{
/*发布设置*/
public function setAction(){
@ -71,26 +72,20 @@ class Release extends CollectController{
if(!empty($releData)){
$releData=$releData->toArray();
$releData['config']=unserialize($releData['config']?:'');
}else{
$releData=array();
}
if(!is_array($releData['config'])){
$releData['config']=array();
}
foreach (config('release_modules') as $v){
if(!is_array($releData['config'][$v])){
$releData['config'][$v]=array();
}
}
$releData['config']=$mrele->compatible_config($releData['config']);
$this->assign('config',$releData['config']);
$this->assign('releData',$releData);
$apiRootUrl=config('root_website');
if(stripos(\think\Request::instance()->root(),'/index.php?s=')!==false){
if(stripos(\think\Request::instance()->root()?:'','/index.php?s=')!==false){
$apiRootUrl.='/index.php?s=';
}elseif(stripos(\think\Request::instance()->root(),'/index.php')!==false){
}elseif(stripos(\think\Request::instance()->root()?:'','/index.php')!==false){
$apiRootUrl.='/index.php';
}
@ -244,20 +239,16 @@ class Release extends CollectController{
}
public function testAction(){
$this->_test();
}
public function test_toapiAction(){
$this->_test(array('test_toapi'=>1));
}
private function _test($urlParams=null){
$releId=input('id/d',0);
$releData=model('Release')->getById($releId);
if(empty($releData)){
$this->error(lang('rele_error_empty_rele'));
}
$urlParams=null;
if($releData['module']=='toapi'){
$urlParams=array('test_toapi'=>1);
}
$this->collect_create_or_run(function()use($releData){
return array($releData['task_id']);
},1,null,false,$urlParams);
@ -354,69 +345,138 @@ class Release extends CollectController{
$this->success($msgSuccess);
}
}
/*数据表绑定数据*/
public function dbTableBindAction(){
$releId=input('id/d',0);
$table=input('table');
$tables=explode(',', $table);
$tables=array_filter($tables);
$tables=array_values($tables);
if(empty($table)){
$this->error('请选择表');
}
$mrele=model('Release');
$mtask=model('Task');
$mcoll=model('Collector');
$releData=$mrele->where(array('id'=>$releId))->find();
if(empty($releData)){
$this->error(lang('rele_error_empty_rele'));
}
$config=unserialize($releData['config']?:'');
$adb=controller('admin/Rdb','event');
$db_config=$adb->get_db_config($config['db']);
try {
$mdb=new DbCommon($db_config);
$fields=array();
$field_values=array();
foreach ($tables as $tbName){
$fields[$tbName]=$mdb->getFields($tbName);
if(!empty($config['db_table']['field'][$tbName])){
$tableFields=$config['db_table']['field'][$tbName];
if(!empty($tableFields)){
$issetFields=array();
foreach ($fields[$tbName] as $k=>$v){
if(isset($tableFields[$k])){
$issetFields[$k]=$v;
}
}
$fields[$tbName]=\util\Funcs::array_key_merge($issetFields,$fields[$tbName]);
}
$field_values[$tbName]['field']=$tableFields;
$field_values[$tbName]['custom']=$config['db_table']['custom'][$tbName];
}
}
$taskData=$mtask->getById($releData['task_id']);
if(!empty($taskData)){
$collFields=$adb->get_coll_fields($taskData['id'], $taskData['module']);
}
}catch (\Exception $ex){
$dbMsg=$this->trans_db_msg($ex->getMessage());
$this->error($dbMsg);
}
$this->assign('collFields',$collFields);
$this->assign('tables',$tables);
$this->assign('fields',$fields);
$this->assign('field_values',$field_values);
return $this->fetch('dbTableBind');
$releId=input('id/d',0);
$table=input('table','');
$isDbTables=input('is_db_tables');
$mrele=model('Release');
$mtask=model('Task');
$mcoll=model('Collector');
$releData=$mrele->where(array('id'=>$releId))->find();
if(empty($releData)){
$this->error(lang('rele_error_empty_rele'));
}
$releData['config']=$mrele->compatible_config($releData['config']);
$dbTables=$releData['config']['db_tables'];
init_array($dbTables);
$tbTables=array();
if($isDbTables){
foreach ($dbTables as $v){
if(is_array($v)){
$tbTables[]=$v['table'];
}
}
}else{
$tbTables=explode(',', $table);
}
$tbTables=array_filter($tbTables);
$tbTables=array_values($tbTables);
if(empty($tbTables)){
$this->error('请选择表');
}
init_array($tbTables);
if(!$isDbTables){
$dbTables=array();
foreach ($tbTables as $v){
$dbTables[]=array('table'=>$v);
}
}
$dbTables1=array();
foreach ($dbTables as $k=>$v){
init_array($v);
init_array($v['field']);
$k='i_'.\util\Funcs::uniqid($v['table']);
$dbTables1[$k]=$v;
}
$dbTables=$dbTables1;
$seqList=array();
$adb=controller('admin/Rdb','event');
$dbConfig=$adb->get_db_config($releData['config']['db']);
try {
$mdb=new DbCommon($dbConfig);
$tbFields=array();
foreach ($tbTables as $tbName){
$tbFields[$tbName]=$mdb->getFields($tbName);
}
$dbHasSeq=$mrele->db_has_sequence($releData['config']['db']['type']);
if($dbHasSeq){
$seqList=$mdb->db()->query('select * from user_sequences');
foreach ($seqList as $k=>$v){
$seqList[$k]=$v['SEQUENCE_NAME'];
}
init_array($seqList);
}
}catch (\Exception $ex){
$dbMsg=$this->trans_db_msg($ex->getMessage());
$this->error($dbMsg);
}
$this->assign('tbTables',$tbTables);
$this->assign('tbFields',$tbFields);
$this->assign('dbTables',$dbTables);
$this->assign('seqList',$seqList);
$this->assign('dbHasSeq',$mrele->db_has_sequence($releData['config']['db']['type']));
return $this->fetch('dbTableBind');
}
public function dbTableBindSingsAction(){
$collFields=array();
$autoIds=array();
$querySigns=array();
if(request()->isPost()){
$mrele=model('Release');
$tableKey=input('table_key','','trim');
$taskId=input('task_id/d',0);
$dbTables=trim_input_array('db_tables');
$dbTables=$mrele->config_db_tables($dbTables,true);
$taskData=model('Task')->getById($taskId);
if(!empty($taskData)){
$collFields=controller('admin/Rdb','event')->get_coll_fields($taskData['id'], $taskData['module']);
}
init_array($collFields);
foreach ($dbTables as $tbKey=>$dbTable){
if($tbKey==$tableKey){
break;
}
if(empty($dbTable['op'])){
if($dbTable['table']){
$autoIds[$dbTable['table']]=$dbTable['table'];
}
}elseif($dbTable['op']=='query'){
$tbQuery=$dbTable['query'];
foreach ($tbQuery['sign'] as $k=>$v){
$v=$mrele->db_tables_query_sign($tbQuery['type'][$k],$tbQuery['field'][$k],$v);
$querySigns[$v]=$v;
}
}
}
}
$collFields=array_values($collFields);
$autoIds=array_values($autoIds);
$querySigns=array_values($querySigns);
$maxCount=max(count($collFields),count($autoIds),count($querySigns));
$this->assign('maxCount',$maxCount);
$this->assign('collFields',$collFields);
$this->assign('autoIds',$autoIds);
$this->assign('querySigns',$querySigns);
return $this->fetch('dbTableBindSings');
}
/*翻译数据库错误信息*/
public function trans_db_msg($msg){
$msg=lang('rele_error_db').str_replace('Unknown database', lang('error_unknown_database'), $msg);

View File

@ -111,6 +111,8 @@ class Setting extends BaseController {
$config['real_time']=input('real_time/d',0);
$config['retry']=input('retry/d',0);
$config['wait']=input('wait/d',0);
$config['ip_resolve']=input('ip_resolve');
$config['max_redirs']=input('max_redirs/d',0);
unset($config['download_img']);
@ -123,17 +125,10 @@ class Setting extends BaseController {
}
}
$mconfig->setConfig('caiji',$config);
if($config['auto']){
if($config['run']=='backstage'){
$bskey=\util\Funcs::uniqid('auto_backstage');
\util\Param::set_auto_backstage_key($bskey);
@get_html(url('admin/index/auto_backstage?key='.$bskey,null,false,true),null,array('timeout'=>3));
}
}
$this->_run_auto_backstage();
$this->success(lang('op_success'),'setting/caiji');
}else{
$this->set_html_tags(
@ -155,6 +150,23 @@ class Setting extends BaseController {
}
return $this->fetch();
}
public function _run_auto_backstage(){
$mconfig=model('Config');
$config=$mconfig->getConfig('caiji','data');
init_array($config);
if($config['auto']){
if($config['run']=='backstage'){
$bskey=\util\Param::set_auto_backstage_key();
@get_html(url('admin/index/auto_backstage?key='.$bskey,null,false,true),null,array('timeout'=>3));
}
}
$config=$mconfig->getConfig('page_render','data');
$this->_chrome_start($config);
}
/*图片本地化设置*/
public function download_imgAction(){
$mconfig=model('Config');
@ -290,21 +302,12 @@ class Setting extends BaseController {
/*代理设置*/
public function proxyAction(){
$mconfig=model('Config');
$mproxy=model('Proxyip');
$mproxy=model('ProxyIp');
if(request()->isPost()){
$config=array();
$ip_list=input('ip_list','','trim');
$user_list=input('user_list','','trim');
$pwd_list=input('pwd_list','','trim');
$type_list=input('type_list','','trim');
$ip_list=empty($ip_list)?array():json_decode($ip_list,true);
$user_list=empty($user_list)?array():json_decode($user_list,true);
$pwd_list=empty($pwd_list)?array():json_decode($pwd_list,true);
$type_list=empty($type_list)?array():json_decode($type_list,true);
$config['open']=input('open/d',0);
$config['failed']=input('failed/d',0);
$config['group_id']=input('group_id/d',0);
$config['use']=strtolower(input('use'));
$config['use_num']=input('use_num/d',0);
$config['use_time']=input('use_time/d',0);
@ -316,46 +319,6 @@ class Setting extends BaseController {
$this->error('每个IP使用多少分钟必须大于0');
}
if(!empty($ip_list)&&is_array($ip_list)){
$ip_list=array_map('trim', $ip_list);
$user_list=array_map('trim', $user_list);
$pwd_list=array_map('trim', $pwd_list);
$type_list=array_map('trim', $type_list);
$nowTime=time();
for($k=count($ip_list);$k>=0;$k--){
$v=$ip_list[$k];
if(empty($v)){
continue;
}
$newData=array(
'ip'=>$v,
'user'=>$user_list[$k],
'pwd'=>$pwd_list[$k],
'type'=>$type_list[$k],
'invalid'=>0,
'failed'=>0,
'num'=>0,
'time'=>0,
'addtime'=>$nowTime,
);
if($mproxy->where(array('ip'=>$newData['ip']))->count()>0){
unset($newData['invalid']);
$mproxy->strict(false)->where(array('ip'=>$newData['ip']))->update($newData);
}else{
$mproxy->db()->insert($newData,true);
}
}
}
$config['api']=input('api/a',array(),'trim');
$config['apis']=input('apis/a',array(),'trim');
$config['apis']=is_array($config['apis'])?$config['apis']:array();
@ -374,10 +337,11 @@ class Setting extends BaseController {
'代理设置',
'代理设置',
breadcrumb(array(array('url'=>url('setting/caiji'),'title'=>lang('setting_caiji')),array('url'=>url('setting/proxy'),'title'=>'代理')))
);
);
$proxyConfig=$mconfig->getConfig('proxy','data');
init_array($proxyConfig);
$proxyConfig['ip_count']=$mproxy->count();
$this->assign('proxyGroups',model('ProxyGroup')->getAll());
$this->assign('proxyConfig',$proxyConfig);
$this->assign('proxyTypes',$mproxy->proxy_types());
}
@ -519,6 +483,8 @@ class Setting extends BaseController {
$config['tool']=strtolower(input('tool'));
$config['chrome']=input('chrome/a',array());
$config['timeout']=input('timeout/d');
$config['wait_end_ms']=input('wait_end_ms/d',0);
$config['wait_end_num']=input('wait_end_num/d',0);
if(!in_array($config['tool'],array('chrome'))){
$config['tool']='';
}
@ -528,10 +494,7 @@ class Setting extends BaseController {
}
$mconfig->setConfig('page_render',$config);
if($config['tool']=='chrome'){
$chromeSoket=new \util\ChromeSocket($config['chrome']['host'],$config['chrome']['port'],$config['timeout'],$config['chrome']['filename'],$config['chrome']);
$this->_chrome_start($chromeSoket);
}
$this->_chrome_start($config);
$this->success(lang('op_success'),'setting/page_render');
}else{
$this->set_html_tags(
@ -544,17 +507,16 @@ class Setting extends BaseController {
init_array($config['chrome']);
$this->assign('config',$config);
if($mconfig->page_render_is_chrome(true,$config['tool'])){
$chromeSoket=new \util\ChromeSocket($config['chrome']['host'],$config['chrome']['port'],$config['timeout'],$config['chrome']['filename'],$config['chrome']);
$toolIsOpen=$chromeSoket->hostIsOpen();
$this->assign('toolIsOpen',$toolIsOpen);
}
$chromeSocket=$this->_chrome_socket($config);
$toolIsOpen=$chromeSocket?$chromeSocket->hostIsOpen():false;
$this->assign('toolIsOpen',$toolIsOpen);
return $this->fetch('page_render');
}
}
/*清理缓存目录*/
public function cleanAction(){
$clearPageRender=model('Config')->page_render_is_chrome()?true:false;
if(request()->isPost()){
set_time_limit(1000);
$types=input('types/a');
@ -586,6 +548,11 @@ class Setting extends BaseController {
\util\Tools::clear_runtime_dir($systemPaths);
}
}
if($clearPageRender&&(in_array('all', $types)||in_array('page_render', $types))){
$this->_clear_page_render();
}
}
if(in_array('all', $types)||in_array('data', $types)){
@ -607,6 +574,7 @@ class Setting extends BaseController {
$this->success('清理完成','backstage/index');
}else{
$this->assign('clearPageRender',$clearPageRender);
return $this->fetch();
}
}
@ -640,7 +608,7 @@ class Setting extends BaseController {
$this->ajax_check_userpwd();
$chrome=input('chrome/a',array());
$return=\util\ChromeSocket::execHeadless($chrome['filename'], $chrome['port'], $chrome, 'all', true);
$return=\util\ChromeSocket::execHeadless($chrome['filename'], $chrome['port'], $chrome, true);
if(!empty($return['error'])){
$this->error($return['error']);
@ -670,33 +638,52 @@ class Setting extends BaseController {
}
public function chrome_cleanAction(){
$config=model('Config')->getConfig('page_render','data');
init_array($config);
init_array($config['chrome']);
$chromeSoket=new \util\ChromeSocket($config['chrome']['host'],$config['chrome']['port'],$config['timeout'],$config['chrome']['filename'],$config['chrome']);
$chromeSoket->clearBrowser();
$this->_clear_page_render();
$this->success('清理完成','');
}
public function chrome_restartAction(){
$config=model('Config')->getConfig('page_render','data');
init_array($config);
init_array($config['chrome']);
$chromeSoket=new \util\ChromeSocket($config['chrome']['host'],$config['chrome']['port'],$config['timeout'],$config['chrome']['filename'],$config['chrome']);
$this->_chrome_start($chromeSoket);
$this->_chrome_start($config,true);
$this->success('重启完成','setting/page_render');
}
private function _chrome_start($chromeSoket){
if($chromeSoket){
private function _chrome_start($config,$restart=false){
init_array($config);
$chromeSocket=$this->_chrome_socket($config);
if($chromeSocket){
try {
$chromeSoket->closeBrowser();
$chromeSoket->openHost();
if($restart){
$chromeSocket->closeBrowser();
$chromeSocket->openHost();
}else{
if(!$chromeSocket->hostIsOpen()){
$chromeSocket->openHost();
}
}
}catch (\Exception $ex){
$this->error($ex->getMessage());
}
}else{
$this->error('失败');
}
}
private function _chrome_socket($config){
init_array($config);
init_array($config['chrome']);
$chromeSocket=null;
if(model('Config')->page_render_is_chrome(true,$config['tool'])){
$chromeSocket=new \util\ChromeSocket($config['chrome']['host'],$config['chrome']['port'],$config['timeout'],$config['chrome']['filename'],$config['chrome']);
}
return $chromeSocket;
}
private function _clear_page_render(){
$config=model('Config')->getConfig('page_render','data');
$chromeSocket=$this->_chrome_socket($config);
if($chromeSocket){
$chromeSocket->clearBrowser();
}
}
}

View File

@ -331,7 +331,6 @@ class Task extends CollectController {
}else{
$mtaskgroup=model('Taskgroup');
$tgSelect=$mtaskgroup->getLevelSelect();
$gConfig=$this->_global_caiji_config();
if($isAdd){
$this->set_html_tags(
lang('task_add'),
@ -375,8 +374,39 @@ class Task extends CollectController {
$this->assign('timerInfo',$timerInfo);
$this->assign('fieldList',$fieldList);
}
$imgFuncParam=g_sc_c('download_img','img_func_param');
if($imgFuncParam){
$imgFuncParam=str_replace("\r", '\r', $imgFuncParam);
$imgFuncParam=str_replace("\n", '\n', $imgFuncParam);
$imgFuncParam=htmlspecialchars($imgFuncParam,ENT_QUOTES);
}else{
$imgFuncParam='';
}
$proxyGroupId=g_sc_c('proxy','group_id');
$proxyGroupId=intval($proxyGroupId);
$gConfig=array(
'num'=>intval(g_sc_c('caiji','num')),
'interval'=>intval(g_sc_c('caiji','interval')),
'interval_html'=>intval(g_sc_c('caiji','interval_html')),
'same_url'=>g_sc_c('caiji','same_url')>0?'允许':'过滤',
'same_title'=>g_sc_c('caiji','same_title')>0?'允许':'过滤',
'real_time'=>g_sc_c('caiji','real_time')>0?'是':'否',
'proxy'=>g_sc_c('proxy','open')>0?'1':'',
'proxy_group_id'=>$proxyGroupId<=0?'全部':model('ProxyGroup')->getNameById($proxyGroupId),
'download_img'=>g_sc_c('download_img','download_img')>0?'1':'',
'img_path'=>g_sc_c('download_img','img_path')?g_sc_c('download_img','img_path'):(config('root_path').DS.'data'.DS.'images'),
'img_url'=>g_sc_c('download_img','img_url')?g_sc_c('download_img','img_url'):(config('root_website').'/data/images'),
'img_name'=>g_sc_c('download_img','img_name'),
'name_custom_path'=>g_sc_c('download_img','name_custom_path')?g_sc_c('download_img','name_custom_path'):'无',
'name_custom_name'=>lang('down_img_name_custom_name_'.g_sc_c('download_img','name_custom_name')),
'interval_img'=>intval(g_sc_c('download_img','interval_img')),
'img_func'=>g_sc_c('download_img','img_func'),
'img_func_param'=>$imgFuncParam
);
$this->assign('gConfig',$gConfig);
$this->assign('tgSelect',$tgSelect);
$this->assign('proxyGroups',model('ProxyGroup')->getAll());
if(request()->isAjax()){
return view('save_ajax');
}else{
@ -399,38 +429,6 @@ class Task extends CollectController {
}
private function _global_caiji_config(){
$imgFuncParam=g_sc_c('download_img','img_func_param');
if($imgFuncParam){
$imgFuncParam=str_replace("\r", '\r', $imgFuncParam);
$imgFuncParam=str_replace("\n", '\n', $imgFuncParam);
$imgFuncParam=htmlspecialchars($imgFuncParam,ENT_QUOTES);
}else{
$imgFuncParam='';
}
$gConfig=array(
'num'=>intval(g_sc_c('caiji','num')),
'interval'=>intval(g_sc_c('caiji','interval')),
'interval_html'=>intval(g_sc_c('caiji','interval_html')),
'same_url'=>g_sc_c('caiji','same_url')>0?'允许':'过滤',
'same_title'=>g_sc_c('caiji','same_title')>0?'允许':'过滤',
'real_time'=>g_sc_c('caiji','real_time')>0?'是':'否',
'proxy'=>g_sc_c('proxy','open')>0?'是':'否',
'download_img'=>g_sc_c('download_img','download_img')>0,
'img_path'=>g_sc_c('download_img','img_path')?g_sc_c('download_img','img_path'):(config('root_path').DS.'data'.DS.'images'),
'img_url'=>g_sc_c('download_img','img_url')?g_sc_c('download_img','img_url'):(config('root_website').'/data/images'),
'img_name'=>g_sc_c('download_img','img_name'),
'name_custom_path'=>g_sc_c('download_img','name_custom_path')?g_sc_c('download_img','name_custom_path'):'无',
'name_custom_name'=>lang('down_img_name_custom_name_'.g_sc_c('download_img','name_custom_name')),
'interval_img'=>intval(g_sc_c('download_img','interval_img')),
'img_func'=>g_sc_c('download_img','img_func'),
'img_func_param'=>$imgFuncParam
);
return $gConfig;
}
private function _save_config($config=array()){
$config=is_array($config)?$config:array();
$config['num']=intval($config['num']);
@ -439,7 +437,8 @@ class Task extends CollectController {
$config['img_path']=trim($config['img_path']);
$config['img_url']=trim($config['img_url']);
$config['interval_img']=intval($config['interval_img']);
$config['proxy_group_id']=trim($config['proxy_group_id']);
$mconfig=model('Config');
if(!empty($config['img_path'])){

View File

@ -19,13 +19,24 @@ class CollectBase extends \skycaiji\admin\controller\CollectController {
$this->echo_msg($msg,'red');
return null;
}else{
parent::error($msg,$url,$data,$wait,$header);
$url=$url?$url:'';
$msg=$this->_echo_msg_str($msg,'red');
$txt=g_sc('collect_echo_msg_txt');
$txt=$txt?($txt."\r\n".$msg):$msg;
parent::error($txt,$url,$data,$wait,$header);
}
}
/*采集器的输出内容需要重写,只有正在采集时才输出内容*/
public function echo_msg($strArgs,$color='red',$echo=true,$end_str='',$div_style=''){
if($this->is_collecting()){
parent::echo_msg($strArgs,$color,$echo,$end_str,$div_style);
}else{
$msg=$this->_echo_msg_str($strArgs,$color,$end_str,$div_style);
$txt=g_sc('collect_echo_msg_txt');
$txt=$txt?($txt."\r\n".$msg):$msg;
set_g_sc('collect_echo_msg_txt',$txt);
}
}
@ -229,5 +240,49 @@ class CollectBase extends \skycaiji\admin\controller\CollectController {
}
return true;
}
public function retry_first_echo($retryCur,$msg,$url=null,$htmlInfo=null){
if($retryCur<=0){
$msg=$msg?:'';
if(is_array($htmlInfo)&&$htmlInfo['error']&&is_array($htmlInfo['error'])){
$msg.='»Curl Error '.$htmlInfo['error']['no'].': '.$htmlInfo['error']['msg'];
}
$msg=htmlspecialchars($msg);
if($url){
$url=htmlspecialchars($url);
$msg='<div class="echo-msg-clear"><span class="echo-msg-lt">'.$msg.'</span><a href="'.$url.'" target="_blank" class="echo-msg-lurl">'.$url.'</a></div>';
}
$this->echo_msg($msg);
}
}
public function retry_do_func(&$retryCur,$retryMax,$echoMsg,$echoError=null){
$do=false;
if($retryMax>0){
if($retryCur<$retryMax){
$retryCur++;
$this->echo_msg(array('%s第%s次',$retryCur>1?' / ':'重试:',$retryCur),'black',true,'','display:inline;');
$do=true;
}else{
$retryCur=0;
if($this->is_collecting()){
if($echoMsg){
$this->echo_msg(' / '.htmlspecialchars($echoMsg),'black',true,'','display:inline;margin-right:5px;');
}
}else{
if($echoError){
$this->echo_error(htmlspecialchars($echoError));
}
}
}
}
return $do;
}
}
?>

View File

@ -19,6 +19,7 @@ class Cpattern extends CpatternEvent{
$config['url_reverse']=intval($config['url_reverse']);
$config['page_render']=intval($config['page_render']);
$config['url_repeat']=intval($config['url_repeat']);
$config['url_no_name']=intval($config['url_no_name']);
if(!is_array($config['regexp_flags'])){
$config['regexp_flags']=array();
@ -176,9 +177,11 @@ class Cpattern extends CpatternEvent{
);
}
$config['charset'] = $config['charset']=='custom' ? $config ['charset_custom'] : $config ['charset'];
$config['charset']= $config['charset']=='custom' ? $config ['charset_custom'] : $config ['charset'];
$config['charset']= empty($config['charset'])?'auto':$config['charset'];
$config['encode']=$config['encode']=='custom' ? $config ['encode_custom'] : $config ['encode'];
$config['regexp_flags']=is_array($config['regexp_flags'])?$config['regexp_flags']:array();
$regexpFlags='';
@ -493,7 +496,7 @@ class Cpattern extends CpatternEvent{
if(g_sc_c('caiji','robots')){
$opened_tools[]='遵守robots协议';
}
if($this->config['page_render']){
if($this->page_render_is_open()){
$opened_tools[]='页面渲染';
}
if(g_sc_c('download_img','download_img')){
@ -607,15 +610,13 @@ class Cpattern extends CpatternEvent{
if($sourceIsUrl){
$source_urls=array_values($source_urls);
$this->cont_urls_list['_source_is_url_']=$this->page_convert_url_signs('url', '', $source_urls, array(), false);
$this->cont_urls_list['_source_is_url_']=$this->page_convert_url_signs('url', '', false, $source_urls, array(), false);
$source_urls=array('_source_is_url_'=>'_source_is_url_');
}else{
$source_urls=$this->page_convert_url_signs('source_url', '', $source_urls, array(), false);
$source_urls=$this->page_convert_url_signs('source_url', '', false, $source_urls, array(), false);
}
$isFormPost=$this->page_is_post('source_url')?'[POST] ':'';
$pageOpened=$this->page_opened_tips('source_url');
foreach ($source_urls as $key_source_url=>$source_url){
$this->cur_source_url=$source_url;
if(array_key_exists($source_url,$this->used_source_urls)){
@ -649,7 +650,7 @@ class Cpattern extends CpatternEvent{
}
}
$this->used_pagination_urls['source_url'][$pageCurMd5]=1;
$this->echo_msg($isFormPost?array('采集起始页%s%s',$pagePnStr,$isFormPost.$pageCurUrl):array('采集起始页%s<a href="%s" target="_blank">%s</a>',$pagePnStr,$pageCurUrl,$pageCurUrl),$pageIsPn?'black':'green');
$this->echo_msg($pageOpened?array('采集起始页%s%s',$pagePnStr,$pageOpened.$pageCurUrl):array('采集起始页%s<a href="%s" target="_blank">%s</a>',$pagePnStr,$pageCurUrl,$pageCurUrl),$pageIsPn?'black':'green');
if(!empty($this->config['level_urls'])){
@ -718,8 +719,8 @@ class Cpattern extends CpatternEvent{
}
}
if($frontUrl){
$isFormPost=$this->page_is_post('front_url',$fuv['name'])?'[POST] ':'';
$this->echo_msg($isFormPost?array('采集前置页“%s”%s',$fuv['name'],$isFormPost.$frontUrl):array('采集前置页“%s”<a href="%s" target="_blank">%s</a>',$fuv['name'],$frontUrl,$frontUrl),'black');
$pageOpened=$this->page_opened_tips('front_url',$fuv['name']);
$this->echo_msg($pageOpened?array('采集前置页“%s”%s',$fuv['name'],$pageOpened.$frontUrl):array('采集前置页“%s”<a href="%s" target="_blank">%s</a>',$fuv['name'],$frontUrl,$frontUrl),'black');
$htmlInfo=$this->get_page_html($frontUrl,'front_url',$fuv['name'],false,true);
if($fuv['use_cookie']||$fuv['use_cookie_img']){
@ -880,8 +881,7 @@ class Cpattern extends CpatternEvent{
$allowColl=false;
}
if($allowColl){
$base_url=$this->match_base_url($fromUrl, $html);
$domain_url=$this->match_domain_url($fromUrl);
$url_info=$this->match_url_info($fromUrl,$html);
$pn_area='';
if(!empty($pnConfig['reg_area'])){
@ -905,9 +905,9 @@ class Cpattern extends CpatternEvent{
if(!empty($pnConfig['url_complete'])){
$pn_area=preg_replace_callback('/(\bhref\s*=\s*[\'\"])([^\'\"]*)([\'\"])/i',function($matche_p_a) use ($base_url,$domain_url){
$pn_area=preg_replace_callback('/(\bhref\s*=\s*[\'\"])([^\'\"]*)([\'\"])/i',function($matche_p_a) use ($url_info){
$matche_p_a[2]=\skycaiji\admin\event\Cpattern::create_complete_url($matche_p_a[2], $base_url, $domain_url);
$matche_p_a[2]=\util\Tools::create_complete_url($matche_p_a[2], $url_info);
return $matche_p_a[1].$matche_p_a[2].$matche_p_a[3];
},$pn_area);
}
@ -1042,25 +1042,16 @@ class Cpattern extends CpatternEvent{
return;
}
$pageOpened=$this->page_opened_tips($pageType,$pageName);
$cur_url=$field_source_url;
$this->echo_msg(array('%s<a href="%s" target="_blank">%s</a>',$source_echo_msg,$field_source_url,$field_source_url),'black');
$this->echo_msg($pageOpened?array('%s%s',$source_echo_msg,$pageOpened.$field_source_url):array('%s<a href="%s" target="_blank">%s</a>',$source_echo_msg,$field_source_url,$field_source_url),'black');
$htmlInfo=$this->get_page_html($field_source_url, $pageType, $pageName,false,true);
$html=$htmlInfo['html'];
}
}
static $fieldArr=array('words','num','time','list');
static $baseUrls=array();
static $domainUrls=array();
$urlMd5=md5($cur_url);
if(empty($baseUrls[$urlMd5])){
$baseUrls[$urlMd5]=$this->match_base_url($cur_url, $html);
}
if(empty($domainUrls[$urlMd5])){
$domainUrls[$urlMd5]=$this->match_domain_url($cur_url);
}
$base_url=$baseUrls[$urlMd5];
$domain_url=$domainUrls[$urlMd5];
$url_info=$this->match_url_info($cur_url, $html, 'set_field');
$val='';
$field_func='field_module_'.$module;
@ -1077,7 +1068,7 @@ class Cpattern extends CpatternEvent{
'value'=>$v,
'img'=>$this->field_val_list[$field_params['extract']]['imgs'][$cur_url_md5][$k],
);
$val[$k]=$this->field_module_extract($field_params, $extract_field_val, $base_url, $domain_url);
$val[$k]=$this->field_module_extract($field_params, $extract_field_val, $url_info);
}
}else{
@ -1085,7 +1076,7 @@ class Cpattern extends CpatternEvent{
'value'=>$this->field_val_list[$field_params['extract']]['values'][$cur_url_md5],
'img'=>$this->field_val_list[$field_params['extract']]['imgs'][$cur_url_md5],
);
$val=$this->field_module_extract($field_params, $extract_field_val, $base_url, $domain_url);
$val=$this->field_module_extract($field_params, $extract_field_val, $url_info);
}
}elseif('merge'==$module){
@ -1103,15 +1094,17 @@ class Cpattern extends CpatternEvent{
$val=array();
foreach ($this->field_val_list[$this->first_loop_field]['values'][$cur_url_md5] as $v_k=>$v_v){
$cur_field_val_list=array();
foreach ($this->field_val_list as $k=>$v){
$cur_field_val_list[$k]=array(
'value'=>(is_array($v['values'][$cur_url_md5])?$v['values'][$cur_url_md5][$v_k]:$v['values'][$cur_url_md5]),
'img'=>(is_array($v['imgs'][$cur_url_md5][$v_k])?$v['imgs'][$cur_url_md5][$v_k]:$v['imgs'][$cur_url_md5])
);
}
$val[$v_k]=$this->field_module_merge($field_params,$cur_field_val_list);
if(is_array($this->field_val_list[$this->first_loop_field]['values'][$cur_url_md5])){
foreach ($this->field_val_list[$this->first_loop_field]['values'][$cur_url_md5] as $v_k=>$v_v){
$cur_field_val_list=array();
foreach ($this->field_val_list as $k=>$v){
$cur_field_val_list[$k]=array(
'value'=>(is_array($v['values'][$cur_url_md5])?$v['values'][$cur_url_md5][$v_k]:$v['values'][$cur_url_md5]),
'img'=>((is_array($v['imgs'][$cur_url_md5])&&is_array($v['imgs'][$cur_url_md5][$v_k]))?$v['imgs'][$cur_url_md5][$v_k]:$v['imgs'][$cur_url_md5])
);
}
$val[$v_k]=$this->field_module_merge($field_params,$cur_field_val_list);
}
}
}
}elseif(in_array($module,$fieldArr)){
@ -1123,8 +1116,10 @@ class Cpattern extends CpatternEvent{
$val=array();
foreach ($this->field_val_list[$this->first_loop_field]['values'][$cur_url_md5] as $v_k=>$v_v){
$val[$v_k]=$this->$field_func($field_params);
if(is_array($this->field_val_list[$this->first_loop_field]['values'][$cur_url_md5])){
foreach ($this->field_val_list[$this->first_loop_field]['values'][$cur_url_md5] as $v_k=>$v_v){
$val[$v_k]=$this->$field_func($field_params);
}
}
}
}elseif($module=='json'){
@ -1204,13 +1199,13 @@ class Cpattern extends CpatternEvent{
}
$val=preg_replace_callback('/(\bhref\s*=\s*[\'\"])([^\'\"]*)([\'\"])/i',function($matche) use ($base_url,$domain_url){
$val=preg_replace_callback('/(\bhref\s*=\s*[\'\"])([^\'\"]*)([\'\"])/i',function($matche) use ($url_info){
$matche[2]=\skycaiji\admin\event\Cpattern::create_complete_url($matche[2], $base_url, $domain_url);
$matche[2]=\util\Tools::create_complete_url($matche[2], $url_info);
return $matche[1].$matche[2].$matche[3];
},$val);
$val=preg_replace_callback('/(\bsrc\s*=\s*[\'\"])([^\'\"]*)([\'\"])/i',function($matche) use ($base_url,$domain_url){
$matche[2]=\skycaiji\admin\event\Cpattern::create_complete_url($matche[2], $base_url, $domain_url);
$val=preg_replace_callback('/(\bsrc\s*=\s*[\'\"])([^\'\"]*)([\'\"])/i',function($matche) use ($url_info){
$matche[2]=\util\Tools::create_complete_url($matche[2], $url_info);
return $matche[1].$matche[2].$matche[3];
},$val);
@ -1282,7 +1277,8 @@ class Cpattern extends CpatternEvent{
if(empty($pnConfig['max'])||(count((array)$this->used_pagination_urls['url'])<$pnConfig['max'])){
$this->collect_sleep(g_sc_c('caiji','interval_html'),true,true);
$this->echo_msg(array('——采集分页:<a href="%s" target="_blank">%s</a>',$page_url,$page_url),'black');
$pageOpened=$this->page_opened_tips('url','',true);
$this->echo_msg($pageOpened?array('——采集分页:%s',$pageOpened.$page_url):array('——采集分页:<a href="%s" target="_blank">%s</a>',$page_url,$page_url),'black');
$htmlInfo=$this->get_page_html($page_url,'url','',true,true);
if(empty($htmlInfo['html'])){
return $this->echo_error('未获取到分页源代码');
@ -1555,6 +1551,7 @@ class Cpattern extends CpatternEvent{
/*初始化数据处理初始化config时使用*/
public function initProcess($processList){
if(!empty($processList)){
$processList=$this->set_process($processList);
foreach ($processList as $k=>$v){
if('replace'==$v['module']){
$v['replace_from']=$this->correct_reg_pattern($v['replace_from']);
@ -1603,8 +1600,9 @@ class Cpattern extends CpatternEvent{
}
return $this->echo_error('未获取到'.htmlspecialchars($sourceTips).($sourceIsPagination?'分页':'').'源代码');
}
$base_url=$this->match_base_url($sourceUrl, $html);
$domain_url=$this->match_domain_url($sourceUrl);
$url_info=$this->match_url_info($sourceUrl,$html);
$areaMatch=$this->rule_match_area($pageType,$pageName,false,$html,true);
$html=$areaMatch['area'];
@ -1627,7 +1625,7 @@ class Cpattern extends CpatternEvent{
}
}
$contUrlsMatches=$this->rule_match_urls($pageType,$pageName,false,$html,$op_not_complete?false:array('base'=>$base_url,'domain'=>$domain_url),true);
$contUrlsMatches=$this->rule_match_urls($pageType,$pageName,false,$html,$op_not_complete?false:$url_info,true);
$cont_urls=$contUrlsMatches['urls'];
@ -1797,8 +1795,8 @@ class Cpattern extends CpatternEvent{
}
}
$this->used_pagination_urls[$levelSource][$pageCurMd5]=1;
$isFormPost=$this->page_is_post('level_url',$levelConfig['name'])?'[POST] ':'';
$this->echo_msg($isFormPost?array('%s分析第%s级%s%s',$next_level_str,$level,$pagePnStr,$isFormPost.$pageCurUrl):array('%s分析第%s级%s<a href="%s" target="_blank">%s</a>',$next_level_str,$level,$pagePnStr,$pageCurUrl,$pageCurUrl),'black');
$pageOpened=$this->page_opened_tips('level_url',$levelConfig['name']);
$this->echo_msg($pageOpened?array('%s分析第%s级%s%s',$next_level_str,$level,$pagePnStr,$pageOpened.$pageCurUrl):array('%s分析第%s级%s<a href="%s" target="_blank">%s</a>',$next_level_str,$level,$pagePnStr,$pageCurUrl,$pageCurUrl),'black');
if($level_data['nextLevel']>0){
$return_msg=$this->_collect_level($pageCurUrl,$level_data['nextLevel']);
@ -1862,7 +1860,7 @@ class Cpattern extends CpatternEvent{
$mcacheSource=CacheModel::getInstance('source_url');
$mcacheLevel=CacheModel::getInstance('level_url');
$mcacheCont=CacheModel::getInstance('cont_url');
$isFormPost=$this->page_is_post('url')?'[POST] ':'';
$pageOpened=$this->page_opened_tips('url');
foreach ($this->cont_urls_list as $cont_key=>$cont_urls){
@ -1919,7 +1917,7 @@ class Cpattern extends CpatternEvent{
continue;
}
$mcacheCont->setCache($md5_cont_url, 1);
$this->echo_msg($isFormPost?array('%s采集内容页%s',$echo_str,$isFormPost.$cont_url):array('%s采集内容页<a href="%s" target="_blank">%s</a>',$echo_str,$cont_url,$cont_url),'black');
$this->echo_msg($pageOpened?array('%s采集内容页%s',$echo_str,$pageOpened.$cont_url):array('%s采集内容页<a href="%s" target="_blank">%s</a>',$echo_str,$cont_url,$cont_url),'black');
$field_vals_list=$this->getFields($cont_url);
$is_loop=empty($this->first_loop_field)?false:true;

View File

@ -18,112 +18,6 @@ class CpatternBase extends CollectBase{
public function init($config){}
public function collect($num=10){}
/**
* 匹配根目录
* @param string $url 完整的网址
* @param string $html 页面源码
* @return Ambigous <NULL, string>
*/
public function match_base_url($url,$html){
if(!empty($html)&&preg_match('/<base\b[^<>]*\bhref\s*=\s*[\'\"](?P<base>[^\'\"]*)[\'\"]/i',$html,$base_url)){
$base_url=$base_url['base'];
if(!preg_match('/^\w+\:\/\//', $base_url)){
$urlBase=$this->match_base_url($url, null);
$urlDomain=$this->match_domain_url($url);
$base_url=$this->create_complete_url($base_url, $urlBase, $urlDomain);
}
}else{
$base_url=preg_replace('/[\#\?].*$/', '', $url);
}
if(!preg_match('/\/$/', $base_url)){
if(preg_match('/(^\w+\:\/\/[^\/]+)(.*$)/',$base_url,$mbase)){
$mbase[2]=preg_replace('/[^\/]+$/', '', $mbase[2]);
$base_url=$mbase[1].$mbase[2];
}
}
$base_url=rtrim($base_url,'/');
return $base_url?$base_url:null;
}
/**
* 匹配域名
* @param string $url 完整的网址
* @return NULL|string
*/
public function match_domain_url($url){
$domain_url=null;
if(preg_match('/^\w+\:\/\/([\w\-]+\.){1,}[\w]+/',$url,$domain_url)){
$domain_url=rtrim($domain_url[0],'/');
}else{
$domain_url=null;
}
return empty($domain_url)?null:$domain_url;
}
/**
* 生成完整网址
* @param string $url 要填充的网址
* @param string $base_url 根目录网址
* @param string $domain_url 域名
*/
public function create_complete_url($url,$base_url,$domain_url){
static $base_domain=array();
if(preg_match('/^\w+\:/', $url)){
return $url;
}elseif(strpos($url,'//')===0){
$url=(stripos($base_url, 'https://')===0?'https:':'http:').$url;
}elseif(strpos($url,'/')===0){
$curDomain='';
if($base_url){
$baseMd5=md5($base_url);
if(!isset($base_domain[$baseMd5])){
$base_domain[$baseMd5]=$this->match_domain_url($base_url);
}
$curDomain=$base_domain[$baseMd5];
}
$curDomain=empty($curDomain)?rtrim($domain_url,'/'):$curDomain;
$url=$curDomain.'/'.ltrim($url,'/');
}elseif(stripos($url,'javascript')===0||stripos($url,'#')===0||$url==''){
$url='';
}elseif(!preg_match('/^\w+\:\/\//', $url)){
$url=$base_url.'/'.ltrim($url,'/');
}
if(!empty($url)&&preg_match('/\/(\.){1,2}\//', $url)){
if(preg_match('/(^\w+\:\/\/(?:[\w\-]+\.){1,}[\w]+\/)([^\?\#]+)(.*$)/',$url,$murl)){
$paths=explode('/', $murl[2]);
$newPaths=array();
foreach ($paths as $k=>$v){
if($v=='..'){
array_pop($newPaths);
}elseif($v!='.'){
$newPaths[]=$v;
}
}
$url=$murl[1].implode('/', $newPaths).$murl[3];
}
}
return $url;
}
/*正则规则匹配数据*/
public function rule_module_rule_data($configParams,$html,$parentMatches=array(),$whole=false,$returnMatch=false){
$val=null;
@ -651,6 +545,7 @@ class CpatternBase extends CollectBase{
if(is_array($processList)){
$processList=\util\Funcs::array_array_map('trim',$processList);
foreach ($processList as $k=>$v){
init_array($v);
$v['module']=strtolower($v['module']);
if(!empty($v['title'])){
$v['title']=str_replace(array("'",'"'),'',strip_tags($v['title']));
@ -668,20 +563,22 @@ class CpatternBase extends CollectBase{
$v['filter_list']=trim($v['filter_list']);
}elseif('api'==$v['module']){
if(!is_array($v['api_params'])){
$v['api_params']=array();
}
init_array($v['api_params']);
\util\Funcs::filter_key_val_list3($v['api_params']['name'],$v['api_params']['val'],$v['api_params']['addon']);
if(!is_array($v['api_headers'])){
$v['api_headers']=array();
}
init_array($v['api_headers']);
\util\Funcs::filter_key_val_list3($v['api_headers']['name'],$v['api_headers']['val'],$v['api_headers']['addon']);
}elseif('tool'==$v['module']){
init_array($v['tool_list']);
}elseif('if'==$v['module']){
init_array($v['if_addon']);
\util\Funcs::filter_key_val_list5($v['if_cond'],$v['if_logic'],$v['if_val'],$v['if_addon']['func'],$v['if_addon']['turn']);
}
$processList[$k]=$v;
}
$processList=array_values($processList);
}
init_array($processList);
return $processList;
}
@ -741,6 +638,22 @@ class CpatternBase extends CollectBase{
$pageConfig['pagination']=$pnConfig;
}
$renderer=$pageConfig['renderer'];
init_array($renderer);
\util\Funcs::filter_key_val_list3($renderer['types'], $renderer['elements'], $renderer['contents']);
foreach ($renderer['types'] as $k=>$v){
if(!$this->renderer_type_has_option($v, 'element')){
$renderer['elements'][$k]='';
}
if(!$this->renderer_type_has_option($v, 'content')){
$renderer['contents'][$k]='';
}
}
$pageConfig['renderer']=$renderer;
return $pageConfig;
}
@ -984,6 +897,18 @@ class CpatternBase extends CollectBase{
}
return array($type,$name);
}
public function renderer_type_has_option($type,$checkOption){
$types=array(
'wait_time'=>array('content'=>true),
'scroll_top'=>array('content'=>true),
'click'=>array('element'=>true),
'val'=>array('element'=>true,'content'=>true),
);
$options=$types[$type];
init_array($options);
return $options[$checkOption]?true:false;
}
/*多个数组合并成键值对*/
public function arrays_to_key_val($arr1,$arr2){
if(!is_array($arr1)){
@ -1000,7 +925,7 @@ class CpatternBase extends CollectBase{
if(!isset($data)){
$data=array();
foreach ($arr1 as $k=>$v){
if(!empty($v)){
if(!\util\Funcs::is_null($v)){
$data[$v]=$arr2[$k];
}
@ -1042,35 +967,15 @@ class CpatternBase extends CollectBase{
$tips=($result['error']?(''.$result['error']):'');
if($retryMax<=0||($retryCur<=0&&$this->is_collecting())){
$this->echo_error('数据处理»翻译失败'.$tips);
}
$this->retry_first_echo($retryCur,'数据处理»翻译失败'.$tips);
$this->collect_sleep($transConf['wait']);
if($retryMax>0){
if($this->retry_do_func($retryCur,$retryMax,'翻译无效','翻译无效'.$tips)){
if($retryCur<$retryMax){
$retryCur++;
if($this->is_collecting()){
$this->echo_msg(array('%s第%s次',$retryCur>1?' / ':'重试:',$retryCur),'black',true,'','display:inline;'.($retryCur==$retryMax?'margin-right:5px;':''));
}
return $this->execute_translate($retryParams[0],$retryParams[1],$retryParams[2]);
}else{
$retryCur=0;
if($this->is_collecting()){
$this->echo_msg('翻译无效','red',true,'','display:inline;margin-right:5px;');
}else{
$this->echo_error('数据处理»翻译:已重试'.$retryMax.'次,翻译无效'.$tips);
}
}
return $this->execute_translate($retryParams[0],$retryParams[1],$retryParams[2]);
}
$result='';
}
}
@ -1096,12 +1001,18 @@ class CpatternBase extends CollectBase{
return $return['data'];
}
public function page_url_web_opened($urlWebConfig){
if(is_array($urlWebConfig)&&!empty($urlWebConfig['open'])){
return true;
public function page_url_web_opened($urlWebConfig,$paginationConfig=null){
$opened=false;
if($paginationConfig&&is_array($paginationConfig)&&$paginationConfig['use_url_web']){
$opened=$paginationConfig['use_url_web']=='y'?true:false;
}else{
return false;
if($urlWebConfig&&is_array($urlWebConfig)&&!empty($urlWebConfig['open'])){
$opened=true;
}
}
return $opened;
}
}
?>

View File

@ -62,6 +62,33 @@ class CpatternColl extends CpatternBase{
}
public function match_url_info($url,$html,$cacheKey=false){
static $cacheList=array();
$cacheMd5=null;
$info=array();
if($cacheKey){
init_array($cacheList[$cacheKey]);
$cacheMd5=md5($url);
$info=$cacheList[$cacheKey][$cacheMd5];
}
if(empty($info)){
$info=array('cur_url'=>$url,'url_no_name'=>$this->config['url_no_name']);
$baseInfo=\util\Tools::match_base_url($url,$html,true);
$info=array_merge($info,$baseInfo);
$info['domain_url']=\util\Tools::match_domain_url($url);
if($cacheKey){
$cacheList[$cacheKey][$cacheMd5]=$info;
}
}
init_array($info);
return $info;
}
/*规则匹配区域*/
public function rule_match_area($pageType,$pageName,$isPagination,$html,$returnMatch=false){
$matches=array();
@ -139,7 +166,7 @@ class CpatternColl extends CpatternBase{
/*规则匹配网址*/
public function rule_match_urls($pageType,$pageName,$isPagination,$html,$urlComplete=false,$returnMatch=false){
public function rule_match_urls($pageType,$pageName,$isPagination,$html,$completeUrlInfo=false,$returnMatch=false){
$cont_urls=array();
$cont_urls_matches=array();
$config=$this->get_page_config($pageType,$pageName,$isPagination?'pagination':null);
@ -208,7 +235,7 @@ class CpatternColl extends CpatternBase{
$doComplete=false;
$doMust=false;
$doBan=false;
if(!empty($urlComplete)&&is_array($urlComplete)){
if(!empty($completeUrlInfo)&&is_array($completeUrlInfo)){
$doComplete=true;
}
@ -245,7 +272,7 @@ class CpatternColl extends CpatternBase{
if($doComplete){
$contUrl=$this->create_complete_url($contUrl, $urlComplete['base'], $urlComplete['domain']);
$contUrl=\util\Tools::create_complete_url($contUrl, $completeUrlInfo);
$cont_urls[$k]=$contUrl;
}
if($doMust){
@ -279,7 +306,7 @@ class CpatternColl extends CpatternBase{
}
}
return $this->page_convert_url_signs($pageType, $pageName, $cont_urls, $cont_urls_matches, $returnMatch);
return $this->page_convert_url_signs($pageType, $pageName, $isPagination, $cont_urls, $cont_urls_matches, $returnMatch);
}
/*正则规则匹配数据*/
@ -293,9 +320,13 @@ class CpatternColl extends CpatternBase{
}
/*页面转换网址标签参数*/
public function page_convert_url_signs($pageType,$pageName,$cont_urls,$cont_urls_matches,$returnMatch=false){
public function page_convert_url_signs($pageType,$pageName,$isPagination,$cont_urls,$cont_urls_matches,$returnMatch=false){
$urlPostKeys=array();
$urlRenderKeys=array();
$pnConfig=$isPagination?$this->get_page_config($pageType,$pageName,'pagination'):null;
$urlWebConfig=$this->get_page_config($pageType,$pageName,'url_web');
if($this->page_url_web_opened($urlWebConfig)){
if($this->page_url_web_opened($urlWebConfig,$pnConfig)){
$formData=$this->arrays_to_key_val($urlWebConfig['form_names'], $urlWebConfig['form_vals']);
@ -325,29 +356,29 @@ class CpatternColl extends CpatternBase{
foreach ($cont_urls as $k=>$v){
$cont_urls[$k]=$v.'#post_'.md5(serialize($urlsForms[$k]));
$urlPostKeys[$k]=md5(serialize($urlsForms[$k]));
}
}else{
$charset=$urlWebConfig['charset']=='custom'?$urlWebConfig['charset_custom']:$urlWebConfig['charset'];
if(empty($charset)){
$charset=$this->config['charset'];
}
$charset=strtolower($charset);
$charset=$this->page_url_web_charset($urlWebConfig);
if(!empty($charset)&&!in_array($charset,array('auto','utf-8','utf8'))){
foreach ($cont_urls as $k=>$v){
foreach ($urlsForms[$k] as $fk=>$fv){
$urlsForms[$k][$fk]=iconv('utf-8',$charset.'//IGNORE',$fv);
foreach ($urlsForms as $k=>$v){
$urlsForms[$k]=\util\Funcs::convert_charset($v, 'utf-8', $charset);
}
}
foreach ($cont_urls as $k=>$v){
$vName='';
if(strpos($v,'#')!==false){
if(preg_match('/(^.*?)\#(.*$)/',$v,$mv)){
$v=$mv[1];
$vName='#'.$mv[2];
}
$cont_urls[$k]=$v.(strpos($v,'?')===false?'?':'&').http_build_query($urlsForms[$k]);
}
}else{
foreach ($cont_urls as $k=>$v){
$cont_urls[$k]=$v.(strpos($v,'?')===false?'?':'&').http_build_query($urlsForms[$k]);
}
$cont_urls[$k]=$v.(strpos($v,'?')===false?'?':'&').http_build_query($urlsForms[$k]).$vName;
unset($urlsForms[$k]);
}
}
}
@ -355,6 +386,54 @@ class CpatternColl extends CpatternBase{
}
}
$renderConfig=$this->get_page_config($pageType,$pageName,'renderer');
if($this->renderer_is_open(null,null,$renderConfig,$pnConfig)){
if(!empty($renderConfig['types'])){
$renderParentMatches=$this->merge_str_signs(implode(' ',$renderConfig['contents']));
if(!empty($renderParentMatches)){
$renderParentMatches=$this->parent_page_signs2matches($this->parent_page_signs($pageType,$pageName,'renderer'));
}
init_array($renderParentMatches);
foreach ($cont_urls as $k=>$v){
$renderContParentMatches=array_merge($renderParentMatches,is_array($cont_urls_matches[$k])?$cont_urls_matches[$k]:array());
$renderContent=array();
foreach ($renderConfig['contents'] as $rck=>$rcv){
$renderContent[$rck]=$rcv?$this->merge_match_signs($renderContParentMatches,$rcv):$rcv;
}
$urlRenderKeys[$k]=md5(serialize(array('types'=>$renderConfig['types'],'elements'=>$renderConfig['elements'],'contents'=>$renderContent)));
}
}
}
if(!empty($urlPostKeys)||!empty($urlRenderKeys)){
foreach ($cont_urls as $k=>$v){
$urlPostKeys[$k]=$urlPostKeys[$k]?:'';
$urlRenderKeys[$k]=$urlRenderKeys[$k]?:'';
$vUrl='';
$vUrlKey='';
if($urlPostKeys[$k]){
$vUrl.='post_';
$vUrlKey=$urlPostKeys[$k];
}
if($urlRenderKeys[$k]){
$vUrl.='render_';
if($vUrlKey){
$vUrlKey=md5($vUrlKey.$urlRenderKeys[$k]);
}else{
$vUrlKey=$urlRenderKeys[$k];
}
}
if($vUrl){
$cont_urls[$k]=$v.'#'.$vUrl.$vUrlKey;
}
}
}
if($returnMatch){
$return=array('urls'=>array(),'matches'=>array());
@ -636,9 +715,25 @@ class CpatternColl extends CpatternBase{
$foundContentIsArr=is_array($foundPageSigns['cur']['content'])?true:false;
$ruleWhole=$this->page_rule_is_null($pageType)?false:true;
if(empty($mergeType)||$mergeType=='content_sign'||in_array($mergeType,$inUrlRule)){
$openUrlWeb=$this->page_url_web_opened($pageConfig['url_web']);
if(empty($mergeType)||$mergeType=='content_sign'||$mergeType=='renderer'||in_array($mergeType,$inUrlRule)){
$pageRendererMerge='';
if(empty($mergeType)||$mergeType=='renderer'){
if($this->renderer_is_open(null,null,$pageConfig['renderer'])){
if(is_array($pageConfig['renderer']['types'])&&is_array($pageConfig['renderer']['contents'])){
$pageRendererMerge=array();
foreach ($pageConfig['renderer']['types'] as $k=>$v){
if($this->renderer_type_has_option($v, 'content')){
$pageRendererMerge[]=$pageConfig['renderer']['contents'][$k];
}
}
$pageRendererMerge=implode(' ', $pageRendererMerge);
}
}
}
$openUrlWeb=$this->page_url_web_opened($pageConfig['url_web']);
$pageHeaderMerge='';
if(empty($mergeType)||$mergeType=='url_web'||$mergeType=='header'){
if($openUrlWeb){
@ -671,7 +766,7 @@ class CpatternColl extends CpatternBase{
}
}
$pageSigns=$this->signs_not_in_rule($pageConfig['reg_url'],$pageUrlMerge.$pageHeaderMerge.$pageFormMerge.implode('',$unknownPageSigns),$ruleWhole,false,true);
$pageSigns=$this->signs_not_in_rule($pageConfig['reg_url'],$pageUrlMerge.$pageHeaderMerge.$pageFormMerge.$pageRendererMerge.implode('',$unknownPageSigns),$ruleWhole,false,true);
if(is_array($pageSigns['unknown'])){
$unknownPageSigns=$pageSigns['unknown'];
}
@ -911,10 +1006,76 @@ class CpatternColl extends CpatternBase{
return $pageSources;
}
public function page_opened_tips($pageType,$pageName='',$isPagination=false,$returnHtml=false){
$tips='';
if($this->page_is_post($pageType,$pageName,$isPagination)){
$tips.=$returnHtml?'<span class="label label-default label-custom-opened">post</span> ':'[post] ';
}
if($this->renderer_is_open($pageType,$pageName,null,$isPagination)){
$tips.=$returnHtml?'<span class="label label-default label-custom-opened">渲染</span> ':'[渲染] ';
}
return $tips;
}
public function page_render_is_open(){
static $pages=array('front_url','level_url','relation_url');
$opened=false;
foreach ($pages as $page){
if(!$opened){
$pageData=$this->get_config('new_'.$page.'s');
if(is_array($pageData)){
foreach ($pageData as $k=>$v){
$opened=$this->renderer_is_open($page,$k);
if($opened){
break;
}
}
}
}
}
if(!$opened){
$opened=$this->renderer_is_open('source_url');
}
if(!$opened){
$opened=$this->renderer_is_open('url');
}
return $opened;
}
public function renderer_is_open($pageType,$pageName='',$rendererConfig=null,$paginationConfig=null){
$opened=$this->get_config('page_render');
if($pageType){
$rendererConfig=$this->get_page_config($pageType,$pageName,'renderer');
if($paginationConfig){
$paginationConfig=$this->get_page_config($pageType,$pageName,'pagination');
}
}
if($paginationConfig&&is_array($paginationConfig)&&$paginationConfig['use_renderer']){
$opened=$paginationConfig['use_renderer']=='y'?true:false;
}else{
if($rendererConfig&&is_array($rendererConfig)&&!empty($rendererConfig['open'])){
$opened=$rendererConfig['open']=='y'?true:false;
}
}
return $opened;
}
/*页面是否是post模式*/
public function page_is_post($pageType,$pageName=''){
public function page_is_post($pageType,$pageName='',$isPagination=false){
$urlWebConfig=$this->get_page_config($pageType,$pageName,'url_web');
if($this->page_url_web_opened($urlWebConfig)&&$urlWebConfig['form_method']=='post'){
$pnConfig=$isPagination?$this->get_page_config($pageType,$pageName,'pagination'):null;
if($this->page_url_web_opened($urlWebConfig,$pnConfig)&&$urlWebConfig['form_method']=='post'){
return true;
}else{
return false;
@ -932,6 +1093,33 @@ class CpatternColl extends CpatternBase{
}
public function page_url_web_charset($urlWebConfig){
$charset='';
if($this->page_url_web_opened($urlWebConfig)){
$charset=$urlWebConfig['charset']=='custom'?$urlWebConfig['charset_custom']:$urlWebConfig['charset'];
}
if(empty($charset)){
$charset=$this->config['charset'];
}
$charset=strtolower($charset);
return $charset;
}
public function page_url_web_encode($urlWebConfig){
$encode='';
if($this->page_url_web_opened($urlWebConfig)){
$encode=$urlWebConfig['encode']=='custom'?$urlWebConfig['encode_custom']:$urlWebConfig['encode'];
}
if(empty($encode)){
$encode=$this->config['encode'];
}
$encode=strtolower($encode);
return $encode;
}
public function get_config($key1,$key2=null,$key3=null){
$keys=array($key1);
if(isset($key2)){
@ -987,14 +1175,12 @@ class CpatternColl extends CpatternBase{
public function get_page_html($url,$pageType,$pageName,$isPagination=false,$returnInfo=false){
$pageName=$pageName?$pageName:'';
$headers=array();
$urlForm=array();
$pageSource=$this->page_source_merge($pageType, $pageName);
$charset=null;
$urlWebConfig=$this->get_page_config($pageType,$pageName,'url_web');
$openUrlWeb=$this->page_url_web_opened($urlWebConfig);
$pnConfig=$isPagination?$this->get_page_config($pageType,$pageName,'pagination'):null;
$openUrlWeb=$this->page_url_web_opened($urlWebConfig,$pnConfig);
if(!empty($pageSource)){
@ -1056,10 +1242,19 @@ class CpatternColl extends CpatternBase{
}
}
$otherConfig=array('curlopts'=>array());
$charset=$this->page_url_web_charset($urlWebConfig);
$encode=$this->page_url_web_encode($urlWebConfig);
if($encode){
$otherConfig['curlopts'][CURLOPT_ENCODING]=$encode;
}
$filterUrl=false;
$postData=null;
if($openUrlWeb){
$charset=$urlWebConfig['charset']=='custom'?$urlWebConfig['charset_custom']:$urlWebConfig['charset'];
$formData=$this->arrays_to_key_val($urlWebConfig['form_names'], $urlWebConfig['form_vals']);
if(!empty($formData)&&is_array($formData)){
@ -1078,11 +1273,11 @@ class CpatternColl extends CpatternBase{
if($urlWebConfig['form_method']=='post'){
$filterUrl=true;
$postData=$formData;
if($urlWebConfig['content_type']){
$headers['content-type']=$urlWebConfig['content_type'];
}
$url=preg_replace('/\#post_\w{32}$/i', '', $url);
}else{
$postData=null;
@ -1090,17 +1285,32 @@ class CpatternColl extends CpatternBase{
unset($formData);
}
if(empty($charset)){
$charset=$this->config['charset'];
$rendererConfig=$this->get_page_config($pageType,$pageName,'renderer');
if($this->renderer_is_open(null,null,$rendererConfig,$pnConfig)){
$filterUrl=true;
$signs=$this->merge_str_signs(implode(' ',$rendererConfig['contents']));
if(!empty($signs)){
$signs=$this->parent_page_signs($pageType, $pageName, 'renderer');
$signs=$this->parent_page_signs2matches($signs);
foreach ($rendererConfig['contents'] as $k=>$v){
$rendererConfig['contents'][$k]=$this->merge_match_signs($signs, $v);
}
}
$otherConfig['renderer']=$rendererConfig;
}
if($filterUrl){
$url=preg_replace('/\#(post_|render_|post_render_){1,}\w{32}$/i', '', $url);
}
$htmlInfo=array();
$html=null;
if($isPagination){
$htmlInfo=$this->get_html($url,$postData,$headers,$charset,true);
$htmlInfo=$this->get_html($url,$postData,$headers,$charset,$otherConfig,true);
$html=$htmlInfo['html'];
}else{
@ -1144,7 +1354,7 @@ class CpatternColl extends CpatternBase{
$htmlInfo=$this->cache_page_htmls[$pageType][$pageName][$cacheKey];
}else{
$htmlInfo=$this->get_html($url,$postData,$headers,$charset,true);
$htmlInfo=$this->get_html($url,$postData,$headers,$charset,$otherConfig,true);
$this->cache_page_htmls[$pageType][$pageName][$cacheKey]=$htmlInfo;
}
@ -1213,36 +1423,39 @@ class CpatternColl extends CpatternBase{
* @param string $url 网址
* @param bool|array $postData post数据
* @param array $headers 请求头信息
* @param string $charset 页面编码
* @param string $charset 网页编码
* @param array $otherConfig 其他配置
* @param string $returnInfo 返回数据信息
* @return string|array
*/
public function get_html($url,$postData=false,$headers=array(),$charset=null,$returnInfo=false){
public function get_html($url,$postData=false,$headers=array(),$charset=null,$otherConfig=array(),$returnInfo=false){
static $retryCur=0;
$retryMax=intval(g_sc_c('caiji','retry'));
$retryParams=null;
if($retryMax>0){
$retryParams=array(0=>$url,1=>$postData,2=>$headers,3=>$charset,4=>$returnInfo);
$retryParams=array(0=>$url,1=>$postData,2=>$headers,3=>$charset,4=>$otherConfig,5=>$returnInfo);
}
$isPost=false;
$pageOpened='';
if(isset($postData)&&$postData!==false){
$isPost=true;
$pageOpened.='[post] ';
}
if(empty($charset)){
$charset=$this->config['charset'];
}
$pageRenderTool=null;
if($this->config['page_render']){
if($this->renderer_is_open(null,null,$otherConfig['renderer'])){
$pageRenderTool=g_sc_c('page_render','tool');
if(empty($pageRenderTool)){
$this->echo_error('页面渲染未设置,请检查<a href="'.url('setting/page_render').'" target="_blank">渲染设置</a>','setting/page_render');
return null;
}
$pageOpened.='[渲染] ';
}
$htmlInfo=array();
$html=null;
@ -1260,15 +1473,17 @@ class CpatternColl extends CpatternBase{
$headers['cookie']=$hdCookie;
}
}
$mproxy=model('Proxyip');
$mproxy=model('ProxyIp');
$proxyDbIp=null;
if(!is_empty(g_sc_c('proxy','open'))){
$proxyDbIp=$mproxy->get_usable_ip();
$proxyIp=$mproxy->to_proxy_ip($proxyDbIp);
if(!empty($proxyIp)){
if(empty($proxyIp)){
$this->echo_error('没有可用的代理IP');
return null;
}else{
$options['proxy']=$proxyIp;
}
}
@ -1287,12 +1502,13 @@ class CpatternColl extends CpatternBase{
$chromeConfig=g_sc_c('page_render','chrome');
init_array($chromeConfig);
try {
$options['renderer']=$otherConfig['renderer'];
$chromeSocket=new \util\ChromeSocket($chromeConfig['host'],$chromeConfig['port'],g_sc_c('page_render','timeout'),$chromeConfig['filename'],$chromeConfig);
$chromeSocket->newTab($options['proxy']);
$chromeSocket->websocket(null);
$htmlInfo=$chromeSocket->getRenderHtml($url,$headers,$options,$charset,$postData,true);
}catch (\Exception $ex){
$this->echo_error('页面渲染失败请检查<a href="'.url('setting/page_render').'" target="_blank">渲染设置</a>','setting/page_render');
$this->echo_error('页面渲染失败'.$ex->getMessage().' 请检查<a href="'.url('setting/page_render').'" target="_blank">渲染设置</a>');
return null;
}
}else{
@ -1300,24 +1516,28 @@ class CpatternColl extends CpatternBase{
return null;
}
}else{
$options['curlopts']=$otherConfig['curlopts'];
init_array($options['curlopts']);
$confMaxRedirs=g_sc_c('caiji','max_redirs');
$confMaxRedirs=intval($confMaxRedirs);
if($confMaxRedirs>0){
$options['curlopts'][CURLOPT_MAXREDIRS]=$confMaxRedirs;
}
$htmlInfo=get_html($url,$headers,$options,$charset,$postData,true);
}
init_array($htmlInfo);
$html=$htmlInfo['html'];
if(empty($html)||!$htmlInfo['ok']){
if($this->is_collecting()){
if(!empty($proxyDbIp)){
$this->echo_msg(array('代理IP%s',$proxyDbIp['ip']),'black',true,'','display:inline;margin-right:5px;');
}
if($retryCur<=0){
$urlEcho=htmlspecialchars($url);
$echoMsg='<div class="clear"><span class="left">访问网址失败:</span>'.($isPost?('[POST] '.$urlEcho):('<a href="'.$urlEcho.'" target="_blank" class="lurl">'.$urlEcho.'</a>')).'</div>';
$this->echo_error($echoMsg);
}
if(!empty($proxyDbIp)){
$this->echo_msg(array('代理IP%s',$proxyDbIp['ip']),'black',true,'','display:inline;margin-right:5px;');
}
$this->retry_first_echo($retryCur,'访问网址失败',$url,$htmlInfo);
if(!empty($proxyDbIp)){
if($htmlInfo['code']!=404){
@ -1327,37 +1547,25 @@ class CpatternColl extends CpatternBase{
$this->collect_sleep(g_sc_c('caiji','wait'));
if($retryMax>0&&is_array($retryParams)){
if($retryCur<$retryMax){
$retryCur++;
if($this->is_collecting()){
$this->echo_msg(array('%s第%s次',$retryCur>1?' / ':'重试:',$retryCur),'black',true,'','display:inline;'.($retryCur==$retryMax?'margin-right:5px;':''));
}
return $this->get_html($retryParams[0],$retryParams[1],$retryParams[2],$retryParams[3],$retryParams[4]);
}else{
$retryCur=0;
if($this->is_collecting()){
$this->echo_msg('网址无效','red',true,'','display:inline;margin-right:5px;');
}
}
if($this->retry_do_func($retryCur,$retryMax,'网址无效')){
return $this->get_html($retryParams[0],$retryParams[1],$retryParams[2],$retryParams[3],$retryParams[4],$retryParams[5]);
}
return $returnInfo?$htmlInfo:null;
}
$retryCur=0;
if($this->config['url_complete']){
$base_url=$this->match_base_url($url, $html);
$domain_url=$this->match_domain_url($url, $html);
$html=preg_replace_callback('/(\bhref\s*=\s*[\'\"])([^\'\"]*)([\'\"])/i',function($matche) use ($base_url,$domain_url){
$url_info=$this->match_url_info($url,$html);
$html=preg_replace_callback('/(\bhref\s*=\s*[\'\"])([^\'\"]*)([\'\"])/i',function($matche) use ($url_info){
$matche[2]=\skycaiji\admin\event\Cpattern::create_complete_url($matche[2], $base_url, $domain_url);
$matche[2]=\util\Tools::create_complete_url($matche[2], $url_info);
return $matche[1].$matche[2].$matche[3];
},$html);
$html=preg_replace_callback('/(\bsrc\s*=\s*[\'\"])([^\'\"]*)([\'\"])/i',function($matche) use ($base_url,$domain_url){
$matche[2]=\skycaiji\admin\event\Cpattern::create_complete_url($matche[2], $base_url, $domain_url);
$html=preg_replace_callback('/(\bsrc\s*=\s*[\'\"])([^\'\"]*)([\'\"])/i',function($matche) use ($url_info){
$matche[2]=\util\Tools::create_complete_url($matche[2], $url_info);
return $matche[1].$matche[2].$matche[3];
},$html);
}

View File

@ -90,7 +90,7 @@ class CpatternEvent extends CpatternColl{
return $val;
}
/*字段提取内容*/
public function field_module_extract($field_params,$extract_field_val,$base_url,$domain_url){
public function field_module_extract($field_params,$extract_field_val,$url_info){
$field_html=$extract_field_val['value'];
if(empty($field_html)){
return '';
@ -105,7 +105,7 @@ class CpatternEvent extends CpatternColl{
}else{
if(preg_match('/<img\b[^<>]*\bsrc\s*=\s*[\'\"](?P<url>[^\'\"]+?)[\'\"]/i',$field_html,$cover)){
$cover=$cover['url'];
$cover=$this->create_complete_url($cover, $base_url, $domain_url);
$cover=\util\Tools::create_complete_url($cover, $url_info);
$val=$cover;
}
}
@ -256,21 +256,54 @@ class CpatternEvent extends CpatternColl{
$key=md5($field_params['list']);
if(!isset($list[$key])){
if(preg_match_all('/[^\r\n]+/', $field_params['list'],$str_list)){
$str_list=$str_list[0];
}else{
$str_list=array();
if(preg_match_all('/[^\r\n]+/', $field_params['list'],$strList)){
$strList=$strList[0];
}
$list[$key]=$str_list;
init_array($strList);
$list[$key]=$strList;
}
$str_list=$list[$key];
$strList=$list[$key];
$val='';
if(!empty($str_list)){
$randi=array_rand($str_list,1);
$val=$str_list[$randi];
if(!empty($strList)){
if(empty($field_params['list_type'])){
$randi=array_rand($strList,1);
$val=$strList[$randi];
}else{
static $keyIndexs=array();
$isAsc=$field_params['list_type']=='asc'?true:false;
$endIndex=count($strList)-1;
if(isset($keyIndexs[$key])){
$curIndex=intval($keyIndexs[$key]);
}else{
$curIndex=$isAsc?0:$endIndex;
}
if($isAsc){
if($curIndex>$endIndex){
$curIndex=0;
}
$val=$strList[$curIndex];
$curIndex++;
}else{
if($curIndex<0){
$curIndex=$endIndex;
}
$val=$strList[$curIndex];
$curIndex--;
}
$keyIndexs[$key]=$curIndex;
}
}
return $val;
}
public function field_module_merge($field_params,$val_list){
$val='';
@ -372,9 +405,7 @@ class CpatternEvent extends CpatternColl{
static $regEmpty='/^([\s\r\n]|\&nbsp\;)*$/';
if(!is_empty(g_sc_c('translate'))&&!is_empty(g_sc_c('translate','open'))&&!empty($fieldVal)){
if($this->is_collecting()){
$this->echo_msg(array('正在翻译:%s',$fieldName),'black',true,'','display:inline;margin-right:5px;');
}
$this->echo_msg(array('正在翻译:%s',$fieldName),'black',true,'','display:inline;margin-right:5px;');
$langFrom=$params['translate_from']=='custom'?$params['translate_from_custom']:$params['translate_from'];
$langTo=$params['translate_to']=='custom'?$params['translate_to_custom']:$params['translate_to'];
@ -717,7 +748,7 @@ class CpatternEvent extends CpatternColl{
}
$url=$params['api_url'];
$result=null;
$htmlInfo=null;
if(!empty($url)){
$isLoc=false;
if(!preg_match('/^\w+\:\/\//', $url)&&strpos($url, '/')===0){
@ -736,6 +767,15 @@ class CpatternEvent extends CpatternColl{
if(empty($charset)){
$charset='utf-8';
}
$curlopts=array();
$encode=$params['api_encode'];
if($encode=='custom'){
$encode=$params['api_encode_custom'];
}
if($encode){
$curlopts[CURLOPT_ENCODING]=$encode;
}
$postData=array();
@ -794,43 +834,19 @@ class CpatternEvent extends CpatternColl{
$postData=null;
}
$result=get_html($url,$headers,array(),$charset,$postData,true);
$htmlInfo=get_html($url,$headers,array('curlopts'=>$curlopts),$charset,$postData,true);
$this->collect_sleep($params['api_interval'],true);
if(!empty($result['ok'])){
if(!empty($htmlInfo['ok'])){
$retryCur=0;
$fieldVal=$this->rule_module_json_data(array('json'=>$params['api_json'],'json_arr'=>$params['api_json_arr'],'json_arr_implode'=>$params['api_json_implode']),$result['html']);
$fieldVal=$this->rule_module_json_data(array('json'=>$params['api_json'],'json_arr'=>$params['api_json_arr'],'json_arr_implode'=>$params['api_json_implode']),$htmlInfo['html']);
}else{
if($retryMax<=0||($retryCur<=0&&$this->is_collecting())){
$urlEcho=htmlspecialchars($url);
$echoMsg='<div class="clear"><span class="left">数据处理»调用接口失败:</span><a href="'.$urlEcho.'" target="_blank" class="lurl">'.$urlEcho.'</a></div>';
if(!$this->is_collecting()){
$echoMsg=strip_tags($echoMsg);
}
$this->echo_error($echoMsg);
}
$this->retry_first_echo($retryCur,'数据处理»调用接口失败',$url,$htmlInfo);
$this->collect_sleep($params['api_wait']);
if($retryMax>0&&is_array($retryParams)){
if($retryCur<$retryMax){
$retryCur++;
if($this->is_collecting()){
$this->echo_msg(array('%s第%s次',$retryCur>1?' / ':'重试:',$retryCur),'black',true,'','display:inline;'.($retryCur==$retryMax?'margin-right:5px;':''));
}
return $this->process_f_api($retryParams[0],$retryParams[1],$retryParams[2],$retryParams[3],$retryParams[4],$retryParams[5]);
}else{
$retryCur=0;
if($this->is_collecting()){
$this->echo_msg('接口无效','red',true,'','display:inline;margin-right:5px;');
}else{
$this->echo_error('数据处理»调用接口:'.htmlspecialchars($url).',已重试'.$retryMax.'次,接口无效 ');
}
}
if($this->retry_do_func($retryCur,$retryMax,'接口无效','接口无效')){
return $this->process_f_api($retryParams[0],$retryParams[1],$retryParams[2],$retryParams[3],$retryParams[4],$retryParams[5]);
}
}
}

View File

@ -184,7 +184,10 @@ class Rcms extends Release{
'catfish'=>'application/catfishajax/controller/Index.php',
'pboot'=>'data/pbootcms.db',
'yzmcms'=>'yzmphp/yzmphp.php',
'chanzhi'=>'js/chanzhi.all.js',
'chanzhi'=>'js/chanzhi.all.js',
'eyoucms'=>'core/library/think/template/taglib/Eyou.php',
'xunruicms'=>'static/assets/global/css/xunruicms.css',
'dedebiz'=>'system/libraries/dedebiz.class.php',
);
return $files;
}

View File

@ -12,222 +12,312 @@
namespace skycaiji\admin\event;
use skycaiji\admin\model\DbCommon;
class Rdb extends Release{
protected $db_conn_list=array();
/**
* 设置页面post过来的config
* @param unknown $config
*/
public function setConfig($config){
$db=input('db/a',array(),'trim');
foreach ($db as $k=>$v){
if(empty($v)&&'pwd'!=$k){
$this->error(lang('error_null_input',array('str'=>lang('rele_db_'.$k))));
}
}
$config['db']=$db;
$config['db_table']=input('db_table/a',array(),'trim');
if(is_array($config['db_table'])&&is_array($config['db_table']['field'])){
foreach($config['db_table']['field'] as $tbName=>$tbFields){
if(is_array($tbFields)){
foreach ($tbFields as $tbField=>$fieldVal){
if(empty($fieldVal)){
unset($config['db_table']['field'][$tbName][$tbField]);
unset($config['db_table']['custom'][$tbName][$tbField]);
continue;
}
}
}
}
}
return $config;
}
/*导出数据*/
public function export($collFieldsList,$options=null){
$db_config=$this->get_db_config($this->config['db']);
$db_config['fields_strict']=false;
$db_key=md5(serialize($db_config));
if(empty($this->db_conn_list[$db_key])){
$mdb=new DbCommon($db_config);
$mdb=$mdb->db();
$this->db_conn_list[$db_key]=$mdb;
}else{
$mdb=$this->db_conn_list[$db_key];
}
$addedNum=0;
$dbCharset=strtolower($db_config['db_charset']);
if(empty($dbCharset)||$dbCharset=='utf-8'||$dbCharset=='utf8'){
$dbCharset=null;
}
foreach ($collFieldsList as $collFieldsKey=>$collFields){
$mdb->startTrans();
$contTitle=$collFields['title'];
$contUrl=$collFields['url'];
$collFields=$collFields['fields'];
$this->init_download_img($this->task,$collFields);
$tableFields=array();
foreach ($this->config['db_table']['field'] as $tbName=>$tbFields){
foreach ($tbFields as $tbField=>$fieldVal){
if(empty($fieldVal)){
unset($tbFields[$tbField]);
continue;
}
if(strcasecmp('custom:',$fieldVal)==0){
$fieldVal=$this->config['db_table']['custom'][$tbName][$tbField];
}elseif(preg_match('/^field\:(.+)$/ui',$fieldVal,$collField)){
$fieldVal=$this->get_field_val($collFields[$collField[1]]);
$fieldVal=is_null($fieldVal)?'':$fieldVal;
}
if(!empty($dbCharset)){
$fieldVal=$this->utf8_to_charset($dbCharset, $fieldVal);
}
$tbFields[$tbField]=$fieldVal;
}
$tableFields[$tbName]=$tbFields;
}
if(!empty($tableFields)){
if('oracle'==$db_config['db_type']){
$pdoOracle=new \PDO($db_config['db_dsn'], $db_config['db_user'], $db_config['db_pwd'],array());
$pdoOracle->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
}
$errorMsg=false;
$autoidList=array();
foreach ($tableFields as $table=>$fields){
$table=strtolower($table);
foreach ($fields as $k=>$v){
$fields[$k]=preg_replace_callback('/auto_id\@([^\s\#]+)[\#]{0,1}/i',function($autoidTbName)use($autoidList){
$autoidTbName=trim($autoidTbName[1]);
$autoidTbName=strtolower($autoidTbName);
return $autoidList[$autoidTbName];
},$v);
}
try {
if('oracle'==$db_config['db_type']){
$insertSql='insert into '.$table.' ';
$insertKeys=array();
$insertVals=array();
$sequenceName='';
foreach ($fields as $k=>$v){
if(preg_match('/^sequence\@([^\s]+)$/i', $v,$m_sequence)){
$sequenceName=$m_sequence[1];
continue;
}
$insertKeys[]=$k;
$insertVals[]="'".str_replace("'", "''", $v)."'";
}
$insertSql.='('.implode(',', $insertKeys).') values ('.implode(',', $insertVals).')';
if($pdoOracle->exec($insertSql)){
if(!empty($sequenceName)){
$autoId=$pdoOracle->query("select {$sequenceName}.CURRVAL as id FROM DUAL");
if($autoId){
$autoId=$autoId->fetch();
$autoidList[$table]=$autoId[0];
}
}
if(empty($autoidList[$table])){
$autoidList[$table]=1;
}
}else{
$autoidList[$table]=0;
}
}else{
$autoidList[$table]=$mdb->table($table)->insert($fields,false,true);
}
}catch (\Exception $ex){
$errorMsg=$ex->getMessage();
$this->echo_msg(array('%s',$errorMsg));
$errorMsg=!empty($errorMsg)?$errorMsg:($table.'表入库失败');
break;
}
if($autoidList[$table]<=0){
break;
}
}
$returnData=array('id'=>0);
if(!empty($errorMsg)){
$mdb->rollback();
$returnData['error']=$errorMsg;
}else{
$mdb->commit();
reset($autoidList);
$firstTable=key($autoidList);
$firstId=intval($autoidList[$firstTable]);
if($firstId>0){
$addedNum++;
$returnData['id']=$firstId;
$returnData['target']="{$db_config['db_type']}:{$db_config['db_name']}@table:{$firstTable}@id:{$firstId}";
}else{
$returnData['error']='数据库插入失败';
}
}
$this->record_collected($contUrl,$returnData,$this->release,$contTitle);
}
unset($collFieldsList[$collFieldsKey]['fields']);
}
return $addedNum;
}
/*将发布配置中的数据库参数转换成tp数据库参数*/
protected $db_conn_list=array();
/**
* 设置页面post过来的config
* @param unknown $config
*/
public function setConfig($config){
$db=input('db/a',array(),'trim');
foreach ($db as $k=>$v){
if(empty($v)&&'pwd'!=$k){
$this->error(lang('error_null_input',array('str'=>lang('rele_db_'.$k))));
}
}
$config['db']=$db;
$dbTables=trim_input_array('db_tables');
$dbTables=model('Release')->config_db_tables($dbTables);
$config['db_tables']=$dbTables;
return $config;
}
private function _convert_val_signs($val,$charset,&$collFields,&$querySigns,&$autoIds){
$error='';
$val=preg_replace_callback('/\[([\x{4e00}-\x{9fa5}]+)\:(.*?)\]/u',function($match)use(&$error,&$collFields,&$querySigns,&$autoIds){
$type=$match[1];
$name=$match[2];
$name=$name?trim($name):'';
$returnVal='';
if($type=='采集字段'){
$returnVal=$this->get_field_val($collFields[$name]);
$returnVal=is_null($returnVal)?'':$returnVal;
}elseif($type=='查询'){
$name=strtolower($name);
$returnVal=$querySigns[$name];
$returnVal=is_null($returnVal)?'':$returnVal;
}elseif($type=='自增主键'){
$name=strtolower($name);
$returnVal=$autoIds[$name];
$returnVal=$returnVal?:'';
if(!$returnVal){
$error='没有自增主键'.$name;
}
}else{
$returnVal=$match[0];
}
return $returnVal;
}, $val);
if($error){
throw new \Exception($error);
}
if(!empty($charset)){
$val=$this->utf8_to_charset($charset, $val);
}
return $val;
}
/*导出数据*/
public function export($collFieldsList,$options=null){
$db_config=$this->get_db_config($this->config['db']);
$db_config['fields_strict']=false;
$db_key=md5(serialize($db_config));
if(empty($this->db_conn_list[$db_key])){
$mdb=new DbCommon($db_config);
$mdb=$mdb->db();
$this->db_conn_list[$db_key]=$mdb;
}else{
$mdb=$this->db_conn_list[$db_key];
}
$addedNum=0;
$dbCharset=strtolower($db_config['db_charset']);
if(empty($dbCharset)||$dbCharset=='utf-8'||$dbCharset=='utf8'){
$dbCharset=null;
}
$mrele=model('Release');
static $whereCondStrs=array('eq'=>'=','neq'=>'<>','gt'=>'>','egt'=>'>=','lt'=>'<','elt'=>'<=','like'=>'like','nlike'=>'not like','in'=>'in','nin'=>'not in','between'=>'between','nbetween'=>'not between');
static $queryTypeStrs=array('','max','min','count','sum','avg');
static $mvalConds=array('in','nin','between','nbetween');
$dbHasSeq=$mrele->db_has_sequence($db_config['db_type']);
foreach ($collFieldsList as $collFieldsKey=>$collFields){
$autoIds=array();
$querySigns=array();
$insertTables=array();
$updateTables=array();
$contTitle=$collFields['title'];
$contUrl=$collFields['url'];
$collFields=$collFields['fields'];
$this->init_download_img($this->task,$collFields);
$dbTables=$this->config['db_tables'];
$errorMsg=false;
$mdb->startTrans();
foreach ($dbTables as $tbKey=>$dbTable){
$table=$dbTable['table']?:'';
$table=strtolower($table);
try{
if(!$table){
continue;
}
$sqlWhereList=array();
if(!empty($dbTable['op'])){
$tbWhere=$dbTable['where'];
foreach ($tbWhere['logic'] as $k=>$v){
if($k===0){
$v='and';
}
$v=$v?:'and';
if($whereCondStrs[$tbWhere['cond'][$k]]){
$whereVal=$tbWhere['val'][$k];
$whereVal=$this->_convert_val_signs($whereVal,$dbCharset,$collFields,$querySigns,$autoIds);
if(in_array($tbWhere['cond'][$k],$mvalConds)){
$whereVal=explode(',',$whereVal);
}
$sqlWhereList[]=array($v,$tbWhere['field'][$k],$whereCondStrs[$tbWhere['cond'][$k]],$whereVal);
}
}
}
if($dbTable['op']=='query'){
$tbQuery=$dbTable['query'];
foreach ($tbQuery['type'] as $k=>$v){
$v=$v?:'';
if(in_array($v, $queryTypeStrs)){
$v=$v?($v.'('.$tbQuery['field'][$k].')'):$tbQuery['field'][$k];
$mdb=$mdb->table($table)->field($v.' as qval');
if($sqlWhereList){
foreach ($sqlWhereList as $sqlWhere){
if($sqlWhere[0]=='or'){
$mdb=$mdb->whereOr($sqlWhere[1],$sqlWhere[2],$sqlWhere[3]);
}else{
$mdb=$mdb->where($sqlWhere[1],$sqlWhere[2],$sqlWhere[3]);
}
}
}
$v=$mdb->find();
$v=is_array($v)?$v['qval']:'';
$v=is_null($v)?'':$v;
$k=$mrele->db_tables_query_sign($tbQuery['type'][$k],$tbQuery['field'][$k],$tbQuery['sign'][$k]);
if($k){
$v=$this->charset_to_utf8($dbCharset, $v);
$querySigns[$k]=$v;
}
}
}
}elseif(empty($dbTable['op'])||$dbTable['op']=='update'){
$sequenceName='';
$tbField=$dbTable['field'];
foreach ($tbField as $k=>$v){
$v=$this->_convert_val_signs($v,$dbCharset,$collFields,$querySigns,$autoIds);
$tbField[$k]=$v;
}
if($dbHasSeq){
$tbSeq=$dbTable['sequence'];
$sequenceName=$tbSeq['seq'];
if($sequenceName&&$tbSeq['field']&&!$tbSeq['trigger']){
$tbField[$tbSeq['field']]='#sequence:'.$sequenceName.'#';
}
}
if(empty($tbField)){
$this->echo_msg('表'.$table.'字段必须绑定数据','orange');
}else{
if(empty($dbTable['op'])){
$status=$mdb->table($table)->insert($tbField);
if($status>0){
$insertTables[]=$table;
if($dbHasSeq){
$autoIds[$table]=$mdb->getLastInsID($sequenceName);
}else{
$autoIds[$table]=$mdb->getLastInsID();
}
}else{
throw new \Exception('新增失败');
}
}elseif($dbTable['op']=='update'){
if(empty($sqlWhereList)){
$this->echo_msg('表'.$table.'更新必须添加条件','orange');
}else{
foreach ($sqlWhereList as $sqlWhere){
if($sqlWhere[0]=='or'){
$mdb=$mdb->whereOr($sqlWhere[1],$sqlWhere[2],$sqlWhere[3]);
}else{
$mdb=$mdb->where($sqlWhere[1],$sqlWhere[2],$sqlWhere[3]);
}
}
$status=$mdb->table($table)->update($tbField);
if($status>0){
$updateTables[]=$table;
}else{
$this->echo_msg('表'.$table.'更新失败','orange');
}
}
}
}
}
}catch (\Exception $ex){
$errorMsg=$ex->getMessage();
$errorTbOp='';
switch ($dbTable['op']){
case 'update':$errorTbOp='更新';break;
case 'query':$errorTbOp='查询';break;
default:$errorTbOp='新增';break;
}
$errorTbOp='表'.$table.$errorTbOp.'';
$errorMsg=$errorTbOp.($errorMsg?$errorMsg:'数据库操作失败');
break;
}
}
$returnData=array('id'=>0);
if(!empty($errorMsg)){
$mdb->rollback();
$returnData['error']=$errorMsg;
}else{
$mdb->commit();
$firstTable='';
$firstId=0;
$firstOp='';
if(count($insertTables)>0){
$firstTable=reset($insertTables);
$firstId=intval($autoIds[$firstTable]);
$firstOp='新增';
}elseif(count($updateTables)>0){
$firstTable=reset($updateTables);
$firstOp='更新';
}
if($firstTable){
$addedNum++;
$returnData['target']="{$db_config['db_type']}:{$db_config['db_name']}@table:{$firstTable}";
if($firstId>0){
$returnData['id']=$firstId;
$returnData['target'].="@id:{$firstId}";
}else{
$returnData['id']=1;
$returnData['target'].="@".$firstOp;
}
}else{
$returnData['error']='没有成功的新增或更新操作';
}
}
$this->record_collected($contUrl,$returnData,$this->release,$contTitle);
unset($collFieldsList[$collFieldsKey]['fields']);
}
return $addedNum;
}
/*将发布配置中的数据库参数转换成tp数据库参数*/
public function get_db_config($config_db){
$db_config=array(
'db_type' => strtolower($config_db['type']),
'db_user' => $config_db['user'],
'db_pwd' => $config_db['pwd'],
'db_host' => $config_db['host'],
'db_port' => $config_db['port'],
'db_charset' => $config_db['charset'],
'db_name' => $config_db['name'],
);
if(strcasecmp($db_config['db_charset'], 'utf-8')===0){
$db_config['db_charset']='utf8';
}
if('mysqli'==$db_config['db_type']){
$db_config['db_type']='mysql';
}elseif('oracle'==$db_config['db_type']){
$db_config['db_dsn']="oci:host={$db_config['db_host']};dbname={$db_config['db_name']};charset={$db_config['db_charset']}";
}elseif('sqlsrv'==$db_config['db_type']){
$db_config['db_dsn']='sqlsrv:Database='.$db_config['db_name'].';Server='.$db_config['db_host'];
}
return $db_config;
$db_config=array(
'db_type' => strtolower($config_db['type']),
'db_user' => $config_db['user'],
'db_pwd' => $config_db['pwd'],
'db_host' => $config_db['host'],
'db_port' => $config_db['port'],
'db_charset' => $config_db['charset'],
'db_name' => $config_db['name'],
);
if(strcasecmp($db_config['db_charset'], 'utf-8')===0){
$db_config['db_charset']='utf8';
}
if('mysqli'==$db_config['db_type']){
$db_config['db_type']='mysql';
}elseif('oracle'==$db_config['db_type']){
$db_config['db_dsn']="oci:host={$db_config['db_host']};dbname={$db_config['db_name']};charset={$db_config['db_charset']}";
}elseif('sqlsrv'==$db_config['db_type']){
$db_config['db_dsn']='sqlsrv:Database='.$db_config['db_name'].';Server='.$db_config['db_host'];
}
return $db_config;
}
}
?>

View File

@ -27,11 +27,11 @@ class Rdiy extends Release{
if(empty($diy['app'])){
$this->error('请输入插件名称');
}
if(in_array($diy['app'], array('base','code'))){
$this->error($diy['app'].'为系统保留名称,不能使用');
if(model('ReleaseApp')->isSystemApp($diy['app'],'diy')){
$this->error($diy['app'].'为系统保留名称,不能使用');
}
if(!preg_match('/^[a-z][a-z0-9]+$/i', $diy['app'])){
$this->error('插件名称必须以字母开头且由字母或数字组成');
if(!model('ReleaseApp')->isRightApp($diy['app'],'diy')){
$this->error('插件名称必须以字母开头且由字母或数字组成');
}
}elseif($diy['type']=='code'){
if(empty($diy['code'])){

View File

@ -16,9 +16,7 @@ abstract class Release extends ReleaseBase{
public $task;
/*发布时初始化*/
public function init($release){
if(!is_array($release['config'])){
$release['config']=unserialize($release['config']?:'');
}
$release['config']=model('Release')->compatible_config($release['config']);
$this->release=$release;
$this->config=$release['config'];

View File

@ -46,7 +46,6 @@ class ReleaseBase extends CollectBase{
if(!empty($returnData['error'])){
if(model('Collected')->collGetNumByUrl($url)<=0){
model('Collected')->insert(array(
@ -61,8 +60,7 @@ class ReleaseBase extends CollectBase{
'addtime'=>time()
));
}
$this->echo_msg(array('%s<a href="%s" target="_blank">%s</a>',$returnData['error'],$url,$url),'red',$echo);
$this->echo_msg(array('%s',$returnData['error']),'red',$echo);
}
}
@ -165,14 +163,18 @@ class ReleaseBase extends CollectBase{
return $url;
}
$mproxy=model('Proxyip');
$mproxy=model('ProxyIp');
$options=array();
$proxyDbIp=null;
if(!is_empty(g_sc_c('proxy','open'))){
$proxyDbIp=$mproxy->get_usable_ip();
$proxyIp=$mproxy->to_proxy_ip($proxyDbIp);
if(!empty($proxyIp)){
if(empty($proxyIp)){
$this->echo_msg(array('没有可用的代理IP跳过下载<a href="%s" target="_blank">图片</a>',$url));
return $url;
}else{
$options['proxy']=$proxyIp;
}
@ -376,9 +378,9 @@ class ReleaseBase extends CollectBase{
if(!empty($proxyDbIp)){
$this->echo_msg(array('代理IP%s',$proxyDbIp['ip']),'black',true,'','display:inline;margin-right:5px;');
}
if($retryCur<=0){
$this->echo_msg(array('<div class="clear"><span class="left">图片下载失败:</span><a href="%s" target="_blank" class="lurl">%s</a></div>',$url,$url),'red');
}
$this->retry_first_echo($retryCur,'图片下载失败',$url,$imgCodeInfo);
if(!empty($proxyDbIp)){
if($imgCodeInfo['code']!=404){
@ -389,17 +391,8 @@ class ReleaseBase extends CollectBase{
$this->collect_sleep(g_sc_c('download_img','wait'));
if($retryMax>0){
if($retryCur<$retryMax){
$retryCur++;
$this->echo_msg(array('%s第%s次',$retryCur>1?' / ':'重试:',$retryCur),'black',true,'','display:inline;'.($retryCur==$retryMax?'margin-right:5px;':''));
return $this->download_img($retryParams[0]);
}else{
$retryCur=0;
$this->echo_msg('图片无效','red',true,'','display:inline;margin-right:5px;');
}
if($this->retry_do_func($retryCur,$retryMax,'图片无效')){
return $this->download_img($retryParams[0]);
}
}
}catch (\Exception $ex){
@ -430,7 +423,7 @@ class ReleaseBase extends CollectBase{
}
}
if(!empty($charset)&&!empty($filename)){
$filename=iconv('utf-8',$charset.'//IGNORE',$filename);
$filename=\util\Funcs::convert_charset($filename,'utf-8',$charset);
}
return $filename;
}
@ -467,14 +460,16 @@ class ReleaseBase extends CollectBase{
/*utf8转换成其他编码*/
public function utf8_to_charset($charset,$val){
static $chars=array('utf-8','utf8','utf8mb4');
if(!in_array(strtolower($charset),$chars)){
if(!empty($val)){
$val=iconv('utf-8',$charset.'//IGNORE',$val);
}
}
$val=\util\Funcs::convert_charset($val,'utf-8',$charset);
return $val;
}
/*其他编码转换成utf8*/
public function charset_to_utf8($charset,$val){
$val=\util\Funcs::convert_charset($val,$charset,'utf-8');
return $val;
}
/**
* 任意编码转换成utf8
* @param mixed $val 字符串或数组

View File

@ -22,9 +22,6 @@ class Rtoapi extends Release{
if(empty($toapi['url'])){
$this->error('请输入接口地址');
}
if(empty($toapi['response']['id'])){
$this->error('请输入响应id的健名');
}
$toapi['param_name']=is_array($toapi['param_name'])?$toapi['param_name']:array();
@ -89,6 +86,11 @@ class Rtoapi extends Release{
$apiResponse=$this->config['toapi']['response'];
$apiResponse=is_array($apiResponse)?$apiResponse:array();
$apiResponse['id']=$apiResponse['id']?:'id';
$apiResponse['target']=$apiResponse['target']?:'target';
$apiResponse['desc']=$apiResponse['desc']?:'desc';
$apiResponse['error']=$apiResponse['error']?:'error';
$apiCharset=$this->config['toapi']['charset'];
if($apiCharset=='custom'){
$apiCharset=$this->config['toapi']['charset_custom'];
@ -97,6 +99,17 @@ class Rtoapi extends Release{
$apiCharset='utf-8';
}
$curlopts=array();
$apiEncode=$this->config['toapi']['encode'];
if($apiEncode=='custom'){
$apiEncode=$this->config['toapi']['encode_custom'];
}
if($apiEncode){
$curlopts[CURLOPT_ENCODING]=$apiEncode;
}
$paramVals=array();
$paramFields=array();
if(is_array($this->config['toapi']['param_name'])){
@ -143,8 +156,8 @@ class Rtoapi extends Release{
}
}
$apiWait=intval($this->config['toapi']['wait']);
$apiRetry=intval($this->config['toapi']['retry']);
$retryWait=intval($this->config['toapi']['wait']);
$retryMax=intval($this->config['toapi']['retry']);
foreach ($collFieldsList as $collFieldsKey=>$collFields){
$contTitle=$collFields['title'];
@ -177,14 +190,16 @@ class Rtoapi extends Release{
}
}
$curRetry=0;
$retryCur=0;
do{
$doWhile=false;
$html=get_html($url,$headerData,array(),$apiCharset,$postData);
$htmlInfo=get_html($url,$headerData,array('return_body'=>1,'curlopts'=>$curlopts),$apiCharset,$postData,true);
init_array($htmlInfo);
$html=$htmlInfo['html']?:'';
$this->collect_sleep($this->config['toapi']['interval'],true);
$json=json_decode($html,true);
$returnData=array('id'=>'','target'=>'','desc'=>'','error'=>'');
if(!empty($apiResponse['id'])&&isset($json[$apiResponse['id']])){
if(!empty($apiResponse['id'])&&is_array($json)&&isset($json[$apiResponse['id']])){
foreach ($returnData as $k=>$v){
@ -203,25 +218,14 @@ class Rtoapi extends Release{
}
}else{
if($curRetry<=0){
$this->echo_msg('发布设置»调用接口失败');
}
$this->collect_sleep($apiWait);
$this->retry_first_echo($retryCur,'发布设置»调用接口失败',null,$htmlInfo);
if($apiRetry>0){
if($curRetry<$apiRetry){
$curRetry++;
if($this->is_collecting()){
$this->echo_msg(array('%s第%s次',$curRetry>1?' / ':'重试:',$curRetry),'black',true,'','display:inline;'.($curRetry==$apiRetry?'margin-right:5px;':''));
}
$doWhile=true;
}else{
$curRetry=0;
}
$this->collect_sleep($retryWait);
if($this->retry_do_func($retryCur,$retryMax,'接口无效')){
$doWhile=true;
}
$returnData['id']=0;
$returnData['error']='发布接口无响应状态';
}
@ -230,7 +234,7 @@ class Rtoapi extends Release{
$this->record_collected($contUrl,$returnData,$this->release,$contTitle);
if($testToapi){
$this->echo_msg('<p>获取到响应数据:</p><textarea name="data" style="width:100%;margin:5px 0;" rows="5">'.htmlspecialchars($html).'</textarea>','black');
$this->echo_msg('<p>发布接口响应数据:</p><textarea name="data" style="width:100%;margin:5px 0;" rows="5">'.htmlspecialchars($html).'</textarea>','black');
}

View File

@ -169,7 +169,7 @@ return array(
'field_module_words'=>'固定文字',
'field_module_num'=>'随机数字',
'field_module_time'=>'时间',
'field_module_list'=>'随机抽取',
'field_module_list'=>'列表抽取',
'field_module_json'=>'JSON提取',
'field_module_merge'=>'字段组合',
'field_module_extract'=>'字段提取',

View File

@ -113,6 +113,7 @@ class App extends \skycaiji\common\model\BaseModel{
}
/*清理描述html*/
public function clear_desc($desc){
$desc=$desc?:'';
$desc=strip_tags($desc,'<p><br><b><i><a>');
$desc=preg_replace('/<(p|br|b|i)\s+.*?>/i', "<$1>", $desc);
$desc=preg_replace('/[\r\n]+/', ' ', $desc);

View File

@ -174,7 +174,7 @@ class Collector extends \skycaiji\common\model\BaseModel{
if(is_dir($dir)){
@rmdir($dir);
}
CacheModel::getInstance('collecting')->deleteCache($collectorKey);
self::collecting_data($collectorKey,'delete');
}else{
$collFile=self::collecting_file($collectorKey.'/'.$processKey);
if(file_exists($collFile)){
@ -189,18 +189,29 @@ class Collector extends \skycaiji\common\model\BaseModel{
}
}
public static function collecting_data($collectorKey){
$processes=array();
if(!empty($collectorKey)){
$processes=CacheModel::getInstance('collecting')->getCache($collectorKey,'data');
public static function collecting_data($collectorKey,$dataOp=null){
if($collectorKey){
$mcache=CacheModel::getInstance('collecting');
if(!isset($dataOp)){
$processes=$mcache->getCache($collectorKey,'data');
init_array($processes);
return $processes;
}elseif($dataOp==='delete'){
$mcache->deleteCache($collectorKey);
}elseif(is_array($dataOp)){
$mcache->setCache($collectorKey,$dataOp);
}
}else{
if(!isset($dataOp)){
return array();
}
}
if(!is_array($processes)){
$processes=array();
}
return $processes;
}
public static function collecting_process_status($collectorKey,$processKey){
$status='none';
@ -247,12 +258,6 @@ class Collector extends \skycaiji\common\model\BaseModel{
}
return $lockList;
}
/*采集密钥*/
public static function collect_key($isProcess=false){
$key=\util\Funcs::uniqid($isProcess?'collect_process':'auto_collect');
\util\Param::set_temp_cahce_key($key);
return $key;
}
/*触发运行自动采集*/
public static function collect_run_auto($rootUrl=''){
try{
@ -263,7 +268,7 @@ class Collector extends \skycaiji\common\model\BaseModel{
}else{
$url=url('admin/index/auto_collect',null,false,true);
}
$url.=(strpos($url, '?')===false?'?':'&').'backstage_run=1&key='.self::collect_key();
$url.=(strpos($url, '?')===false?'?':'&').'backstage_run=1&key='.\util\Param::set_temp_cahce_key('auto_collect');
get_html($url,null,array('timeout'=>3));
}catch(\Exception $ex){}
}
@ -306,7 +311,7 @@ class Collector extends \skycaiji\common\model\BaseModel{
$processes[$k]=$v;
}
CacheModel::getInstance('collecting')->setCache($collectorKey,$processes);
self::collecting_data($collectorKey,$processes);
$collFile=self::collecting_file($collectorKey.'/main');
write_dir_file($collFile,'1');
@ -340,7 +345,7 @@ class Collector extends \skycaiji\common\model\BaseModel{
$chList=array();
foreach ($processes as $pkey=>$ptids){
$allParams=array(
'key'=>self::collect_key(true),
'key'=>\util\Param::set_temp_cahce_key('collect_process'),
'collector_process'=>$collectorKey.'-'.$pkey,
);
if(isset($collectNum)){
@ -360,7 +365,7 @@ class Collector extends \skycaiji\common\model\BaseModel{
}
$allParams=http_build_query($allParams);
$url=url('admin/index/collect_process?'.$allParams,null,false,true);
$chList[$pkey]=\util\Curl::get($url,null,array('return_curl'=>1,'timeout'=>3));
$chList[$pkey]=get_html($url,null,array('return_curl'=>1,'timeout'=>3));
curl_multi_add_handle($mh, $chList[$pkey]);
}

View File

@ -276,7 +276,7 @@ class Config extends \skycaiji\common\model\Config {
$result=return_result('',false);
$phpFile=self::cli_safe_filename($phpFile);
$phpFile.=' -v';
$info=\util\Tools::proc_open_exec($phpFile,'all',10,true);
$info=\util\Tools::proc_open_exec_curl($phpFile,'all',10,true);
$info=is_array($info)?$info:array();
$info['output']=trim($info['output']);
$info['error']=trim($info['error']);

View File

@ -11,6 +11,7 @@
namespace skycaiji\admin\model;
use think\Db;
use think\db\Query;
/*动态操作数据库*/
@ -36,12 +37,10 @@ class DbCommon{
$this->config['params'][\PDO::ATTR_PERSISTENT]=true;
}
if(isset($config['fields_strict'])){
$this->config['fields_strict']=$config['fields_strict'];
}
if($this->config['type']=='mysqli'){
$this->config['type']='mysql';
@ -62,7 +61,7 @@ class DbCommon{
$config=$this->config;
if($config['type']=='oracle'){
$config['type']='\think\oracle\Connection';
$config['type']='\\skycaiji\\admin\\model\\DbOracleConnection';
}
if($compatible){
@ -187,4 +186,43 @@ class DbCommon{
}
}
class DbOracle extends \think\oracle\Connection{
public function getLastInsID($sequence = null){
if ($sequence) {
return parent::getLastInsID($sequence);
}
return 0;
}
}
class DbOracleConnection extends \think\oracle\Connection{
public function getLastInsID($sequence = null){
if ($sequence) {
return parent::getLastInsID($sequence);
}
return 0;
}
public function execute($sql, $bind = [], Query $query = null){
$seqStr='#sequence:';
foreach ($bind as $dataKey=>$dataVal){
if(is_array($dataVal)){
$dataVal=$dataVal[0];
}
if(strpos($dataVal,$seqStr)===0){
$seqVal='';
if(preg_match('/'.$seqStr.'(.*?)#/i',$dataVal,$seqVal)){
$seqVal=$seqVal[1];
$seqVal=$seqVal.'.nextval';
}
$sql=preg_replace('/\:'.$dataKey.'\b(\s*[\,\)])/',$seqVal."$1",$sql);
unset($bind[$dataKey]);
}
}
return parent::execute($sql,$bind,$query);
}
}
?>

View File

@ -11,8 +11,6 @@
namespace skycaiji\admin\model;
class FuncApp extends \skycaiji\common\model\BaseModel{
protected $tableName='func_app';
public $funcPath;
public $funcModules=array(
'process'=>array (
@ -67,8 +65,10 @@ class FuncApp extends \skycaiji\common\model\BaseModel{
if(is_array($appData['methods'])){
$methods='';
$settedList=array();
foreach ($appData['methods']['method'] as $k=>$v){
if($this->right_method($v)){
if($this->right_method($v)&&!in_array($v, $settedList)){
$settedList[]=$v;
$methods.="\r\n /**\r\n * ".$this->format_str($appData['methods']['comment'][$k])."\r\n */"
."\r\n public function {$v}(\$val){\r\n return \$val;\r\n }";
@ -82,7 +82,15 @@ class FuncApp extends \skycaiji\common\model\BaseModel{
$funcTpl=str_replace(array('{$module}','{$classname}','{$name}','{$methods}'), array($module,$app,$appData['name'],$appData['methods']), $funcTpl);
if(write_dir_file($funcFile,$funcTpl)){
return $this->insertApp(array('module'=>$module,'app'=>$app,'name'=>$name,'enable'=>1));
$funcData=$this->where('app',$app)->find();
if(!empty($funcData)){
$this->where('id',$funcData['id'])->update(array('name'=>$name,'uptime'=>time()));
return $funcData['id'];
}else{
return $this->insertApp(array('module'=>$module,'app'=>$app,'name'=>$name,'enable'=>1));
}
}else{
return false;
}
@ -142,26 +150,34 @@ class FuncApp extends \skycaiji\common\model\BaseModel{
}
/*获取插件文件类的属性*/
public function get_app_class($module,$app,$options=array()){
$config=array();
$module=$this->format_module($module);
$config['module']=$module;
$config['app']=$app;
$config['methods']=array();
if(preg_match('/^(\w+?)([A-Z])(\w*)$/',$app,$mapp)){
$config['identifier']=$mapp[1];
$config['copyright']=$mapp[2].$mapp[3];
}
$filename=$this->filename($module,$app);
if(file_exists($filename)){
$class=$this->app_classname($module, $app);
if(class_exists($class)){
$copyright='';
$identifier='';
if(preg_match('/^(\w+?)([A-Z])(\w*)$/',$app,$mapp)){
$identifier=$mapp[1];
$copyright=$mapp[2].$mapp[3];
}
if(\util\Funcs::class_exists_clean($class)){
$config['filename']=$filename;
$class=new $class();
$reClass = new \ReflectionClass($class);
$name=$reClass->getDocComment();
$name=preg_replace('/^[\/\*\s]+/m', '', $name);
$name=trim($name);
$config['name']=$name;
$reMethods=$reClass->getMethods(\ReflectionMethod::IS_PUBLIC);
$methods=array();
$reMethods=$reClass->getMethods(\ReflectionMethod::IS_PUBLIC);
if(!empty($reMethods)){
$phpCode=array();
if(!empty($options['method_code'])||!empty($options['method_params'])){
@ -232,19 +248,11 @@ class FuncApp extends \skycaiji\common\model\BaseModel{
}
$methods[$methodName]=$methodData;
}
}
return array (
'module' => $module,
'app' => $app,
'filename' => $filename,
'copyright' => $copyright,
'identifier' => $identifier,
'name' => $name,
'methods' => $methods,
);
}
$config['methods']=$methods;
}
}
return array();
return $config;
}
public function app_classname($module,$app){
return '\\plugin\\func\\'.$module.'\\'.$app;
@ -299,31 +307,6 @@ class FuncApp extends \skycaiji\common\model\BaseModel{
}
}
/*获取所有插件类*/
public function get_class_list($module){
$apps=$this->get_app_list($module);
$classList=array();
foreach($apps as $app){
$class=$this->get_app_class($module,$app);
if(!empty($class)){
$classList[$app]=$class;
}
}
return $classList;
}
public function get_app_list($module){
$apps=scandir($this->funcPath.$module);
$appList=array();
if(!empty($apps)){
foreach($apps as $app){
if(preg_match('/(\w+)\.php/i',$app,$mapp)){
$appList[$app]=$mapp[1];
}
}
}
return $appList;
}
public function get_func_module_val($module,$key){
if(is_array($this->funcModules[$module])){
@ -333,7 +316,6 @@ class FuncApp extends \skycaiji\common\model\BaseModel{
}
}
/**
* 执行插件函数
* @param string $module 模块
@ -380,7 +362,7 @@ class FuncApp extends \skycaiji\common\model\BaseModel{
if(!isset($class_list[$className])){
$class=$this->app_classname($module,$className);
if(!class_exists($class)){
if(!\util\Funcs::class_exists_clean($class)){
$class_list[$className]=1;
}else{
$enable=$this->field('enable')->where(array('app'=>$className,'module'=>$module))->value('enable');

View File

@ -0,0 +1,26 @@
<?php
/*
|--------------------------------------------------------------------------
| SkyCaiji (蓝天采集器)
|--------------------------------------------------------------------------
| Copyright (c) 2018 https://www.skycaiji.com All rights reserved.
|--------------------------------------------------------------------------
| 使用协议 https://www.skycaiji.com/licenses
|--------------------------------------------------------------------------
*/
namespace skycaiji\admin\model;
class ProxyGroup extends \skycaiji\common\model\BaseModel{
public function getAll($cond=null,$order='sort desc'){
$list=$this->where($cond)->order($order)->column('*');
init_array($list);
return $list;
}
public function getNameById($id){
$name=$this->where('id',$id)->column('name','id');
$name=$name[$id];
$name=$name?:'';
return $name;
}
}
?>

View File

@ -11,8 +11,7 @@
namespace skycaiji\admin\model;
class Proxyip extends \skycaiji\common\model\BaseModel {
public $name='proxy_ip';
class ProxyIp extends \skycaiji\common\model\BaseModel {
public function __construct($data=[]){
parent::__construct($data);
}
@ -62,6 +61,10 @@ class Proxyip extends \skycaiji\common\model\BaseModel {
$cond['num']=array('lt',1);
}
if(!empty($config['group_id'])){
$cond['group_id']=$config['group_id'];
}
$cond['invalid']=0;
$proxyipData=$this->where($cond)->order($order)->find();
@ -70,7 +73,13 @@ class Proxyip extends \skycaiji\common\model\BaseModel {
$apiInsert=strtolower($config['api']['insert']);
if(empty($apiInsert)){
if($this->where('invalid',0)->count()<=0){
$cond2=array();
if(!empty($config['group_id'])){
$cond2['group_id']=$config['group_id'];
}
$cond2['invalid']=0;
if($this->where($cond2)->count()<=0){
$this->add_api_ips();
$proxyipData=$this->where($cond)->order($order)->find();
@ -166,6 +175,10 @@ class Proxyip extends \skycaiji\common\model\BaseModel {
$ips=array();
if(preg_match_all('/'.$format.'/i',$html,$mips)){
init_array($mips['ip']);
init_array($mips['port']);
init_array($mips['user']);
init_array($mips['pwd']);
for($i=0;$i<count($mips[0]);$i++){
$ips[$mips['ip'][$i].':'.$mips['port'][$i]]=array(
'ip'=>$mips['ip'][$i],
@ -212,6 +225,7 @@ class Proxyip extends \skycaiji\common\model\BaseModel {
}
$ip['ip']=$ip['ip'].':'.$ip['port'];
$ip['type']=$default['type'];
$ip['group_id']=$default['group_id'];
$ip['addtime']=$nowTime;
unset($ip['port']);
$ipList[$k]=$ip;
@ -242,7 +256,8 @@ class Proxyip extends \skycaiji\common\model\BaseModel {
$ips = $this->ips_format2db ( $ips, array (
'type' => $api ['api_type']?$api ['api_type']:'',
'user' => $api ['api_user']?$api ['api_user']:'',
'pwd' => $api ['api_pwd']?$api ['api_pwd']:'',
'pwd' => $api ['api_pwd']?$api ['api_pwd']:'',
'group_id' => $api ['api_group_id']?$api ['api_group_id']:'',
) );
if(!empty($ips)){

View File

@ -12,21 +12,120 @@
namespace skycaiji\admin\model;
class Release extends \skycaiji\common\model\BaseModel{
public function getByTaskid($taskId){
static $dataList=array();
if(empty($taskId)){
return null;
}
if(!isset($dataList[$taskId])){
$taskData=$this->where(array('task_id'=>$taskId))->find();
if(!empty($taskData)){
$dataList[$taskId]=$taskData->toArray();
}else{
$dataList[$taskId]=array();
}
}
return $dataList[$taskId];
}
public function compatible_config($config){
if(!is_array($config)){
$config=unserialize($config?:'');
}
init_array($config);
foreach (config('release_modules') as $v){
init_array($config[$v]);
}
if(!empty($config['db_table'])){
$confDbTable=$config['db_table'];
init_array($confDbTable);
init_array($confDbTable['field']);
init_array($confDbTable['custom']);
$dbTables=array();
foreach ($confDbTable['field'] as $table=>$field){
$custom=$confDbTable['custom'][$table];
init_array($field);
init_array($custom);
$sequence=array();
foreach ($field as $fk=>$fv){
if(strcasecmp('custom:',$fv)==0){
$fv=$custom[$fk];
$fv=preg_replace_callback('/auto_id\@([^\s\#]+)[\#]{0,1}/i',function($mname){
$mname=trim($mname[1]);
return '[自增主键:'.$mname.']';
},$fv);
$fv=preg_replace_callback('/sequence\@([^\s]+)/i',function($mname)use(&$sequence,$fk){
$mname=trim($mname[1]);
$sequence['field']=$fk;
$sequence['seq']=$mname;
$sequence['trigger']='';
return null;
},$fv);
}elseif(preg_match('/^field\:(.+)$/ui',$fv,$collField)){
$fv='[采集字段:'.$collField[1].']';
}
if(is_null($fv)){
unset($field[$fk]);
}else{
$field[$fk]=$fv;
}
}
$dbTables[]=array(
'table'=>$table,
'field'=>$field,
'sequence'=>$sequence,
);
}
$dbTables=$this->config_db_tables($dbTables);
unset($config['db_table']);
$config['db_tables']=$dbTables;
}
return $config;
}
public function config_db_tables($dbTables,$keepIndex=false){
init_array($dbTables);
foreach ($dbTables as $tbKey=>$dbTable){
init_array($dbTable['field']);
foreach ($dbTable['field'] as $fk=>$fv){
if(is_null($fv)||$fv===''){
unset($dbTable['field'][$fk]);
continue;
}
}
$tbWhere=$dbTable['where'];
init_array($tbWhere);
\util\Funcs::filter_key_val_list4($tbWhere['field'], $tbWhere['cond'], $tbWhere['logic'], $tbWhere['val']);
\util\Funcs::filter_key_val_list4($tbWhere['cond'], $tbWhere['field'], $tbWhere['logic'], $tbWhere['val']);
\util\Funcs::filter_key_val_list4($tbWhere['logic'], $tbWhere['field'], $tbWhere['cond'], $tbWhere['val']);
$dbTable['where']=$tbWhere;
$tbQuery=$dbTable['query'];
init_array($tbQuery);
\util\Funcs::filter_key_val_list3($tbQuery['field'], $tbQuery['type'], $tbQuery['sign']);
$dbTable['query']=$tbQuery;
init_array($dbTable['sequence']);
$dbTables[$tbKey]=$dbTable;
}
if(!$keepIndex){
$dbTables=array_values($dbTables);
}
return $dbTables;
}
public function db_tables_query_sign($type,$field,$sign=''){
if(empty($sign)){
$sign=($type?($type.'_'):'').$field;
}
$sign=strtolower($sign);
return $sign;
}
public function db_has_sequence($dbType){
$dbType=strtolower($dbType?:'');
if($dbType=='oracle'){
return true;
}
return false;
}
}
?>

View File

@ -13,8 +13,6 @@ namespace skycaiji\admin\model;
use think\Loader;
class ReleaseApp extends \skycaiji\common\model\BaseModel{
protected $tableName='release_app';
public function addCms($cms,$code='',$tpl=''){
if(empty($cms['app'])){
return false;
@ -23,11 +21,10 @@ class ReleaseApp extends \skycaiji\common\model\BaseModel{
$cms['module']='cms';
$cms['uptime']=$cms['uptime']>0?$cms['uptime']:time();
if(!preg_match('/^([A-Z][a-z0-9]*){3}$/',$cms['app'])){
return false;
if(!$this->isRightApp($cms['app'], 'cms')){
return false;
}
$codeFmt=\util\Funcs::strip_phpcode_comment($code);
if(!preg_match('/^\s*namespace\s+plugin\\\release\b/im',$codeFmt)){
@ -67,20 +64,46 @@ class ReleaseApp extends \skycaiji\common\model\BaseModel{
return $success;
}
public function appFileName($appName,$model='cms'){
$model=strtolower($model);
public function appFileName($appName,$module='cms'){
$module=strtolower($module);
$appName=ucfirst($appName);
return config('plugin_path').'/release/'.$model.'/'.$appName.'.php';
return config('plugin_path').'/release/'.$module.'/'.$appName.'.php';
}
public function appFileExists($appName,$model='cms'){
$fileName=$this->appFileName($appName,$model);
public function appFileExists($appName,$module='cms'){
$fileName=$this->appFileName($appName,$module);
return file_exists($fileName)?true:false;
}
public function appImportClass($appName,$model='cms'){
$cmsClass='\\plugin\\release\\'.strtolower($model).'\\'.ucfirst($appName);
$cmsClass=new $cmsClass();
public function appImportClass($appName,$module='cms'){
$cmsClass='\\plugin\\release\\'.strtolower($module).'\\'.ucfirst($appName);
if(\util\Funcs::class_exists_clean($cmsClass)){
$cmsClass=new $cmsClass();
}else{
$cmsClass=null;
}
return $cmsClass;
}
public function isSystemApp($appName,$module='cms'){
static $systemApps = array(
'cms'=>array('basecms'),
'diy'=>array('basediy','codediy','base','code'),
);
$appName=$appName?strtolower($appName):'';
if (is_array($systemApps[$module])&&in_array($appName, $systemApps[$module])) {
return true;
} else {
return false;
}
}
public function isRightApp($app,$module){
if($module=='diy'){
return preg_match('/^[a-z][a-z0-9]+$/i', $app)?true:false;
}elseif($module=='cms'){
return preg_match('/^([A-Z][a-z0-9]*){3}$/',$app)?true:false;
}
return false;
}
/*导入v1.x版本发布插件*/
public function oldImportClass($appName,$model='Cms'){
$model=ucfirst($model);

View File

@ -77,7 +77,14 @@ class Task extends \skycaiji\common\model\BaseModel{
}else{
set_g_sc(['c','proxy','open'],$config['proxy']=='n'?0:1);
}
if(!is_numeric($config['proxy_group_id'])){
set_g_sc(['c','proxy','group_id'],$original_config['proxy']['group_id']);
}else{
set_g_sc(['c','proxy','group_id'],$config['proxy_group_id']);
}
static $imgParams=array('img_path','img_url','img_name','name_custom_path','name_custom_name','interval_img','img_func_param');
foreach ($imgParams as $imgParam){

View File

@ -12,7 +12,6 @@
namespace skycaiji\admin\model;
class TaskTimer extends \skycaiji\common\model\BaseModel{
protected $tableName='task_timer';
public function addTimer($taskId,$timerData){
if(is_array($timerData)){

View File

@ -15,7 +15,7 @@
{/if}
</a>
</h4>
<a href="javascript:;" class="fa fa-remove pull-right" data-task-id="{$task['id']}" style="font-size:90%;color:#ccc" title="删除"></a>
<a href="javascript:;" class="fa fa-remove pull-right" data-task-id="{$task['id']}" style="color:#ccc;" title="删除"></a>
</div>
<div id="win_bk_collected_{$task['id']}" data-task-id="{$task['id']}" class="panel-collapse collapse">
<div class="box-body">

View File

@ -110,7 +110,7 @@
</tr>
<tr>
<th>PHP版本</th>
<td>{$serverData['php']}</td>
<td>{$serverData['php']} <a href="{:url('setting/caiji')}" id="php_cli_version" style="display:none;margin-left:10px;">CLI命令行版本<span></span></a></td>
</tr>
<tr>
<th>上传限制</th>

View File

@ -12,11 +12,11 @@
</div>
<form id="form_list" method="post" ajax-submit="true" action="{:url('collected/op')}">
{:html_usertoken()}
<div class="table-responsive">
<div class="table-responsive" style="border:0;">
<table id="list_table" class="table table-hover datatable">
<thead>
<tr>
<th width="60" class="chk">{$Think.lang.select}</th>
<th class="chk">{$Think.lang.select}</th>
<th class="url">源网址</th>
<th>已发布至</th>
<th>任务名</th>
@ -46,7 +46,7 @@
</tbody>
<tfoot>
<tr>
<td class="chk"><label><input type="checkbox" id="chkall" onclick="checkall(this,'ids[]')" />全部</label></td>
<td class="chk"><label class="chk-all"><input type="checkbox" id="chkall" onclick="checkall(this,'ids[]')" /><span>全部</span></label></td>
<td colspan="6">
<button type="button" class="btn btn btn-danger" id="deleteall">{$Think.lang.delete}</button>
</td>

View File

@ -4,9 +4,9 @@
{block name="content"}
<script type="text/javascript">
confirmRight('规则中包含插件,是否一同导出?',function(){
window.location.href=ulink('collector/export&coll_id=_cid_&export_func=1',{'_cid_':'{$coll_id}'});
window.location.href=ulink('collector/export?coll_id=_cid_&export_func=1',{'_cid_':'{$coll_id}'});
},function(){
window.location.href=ulink('collector/export&coll_id=_cid_&export_func=0',{'_cid_':'{$coll_id}'});
window.location.href=ulink('collector/export?coll_id=_cid_&export_func=0',{'_cid_':'{$coll_id}'});
});
</script>
{/block}

View File

@ -145,6 +145,7 @@
<li><a href="{:url('admin/develop/releaseCms')}"><i class="fa fa-circle-o"></i> CMS发布插件</a></li>
<li><a href="{:url('admin/develop/func')}"><i class="fa fa-circle-o"></i> 函数插件</a></li>
<li><a href="{:url('admin/develop/app')}"><i class="fa fa-circle-o"></i> 应用程序</a></li>
<li><a href="{:url('admin/develop/editor')}"><i class="fa fa-edit"></i> 插件编辑器</a></li>
</ul>
</li>
<li><a href="{:url('admin/tool/fileManager')}"><i class="fa fa-circle-o"></i> 文件管理</a></li>

View File

@ -5,7 +5,7 @@
<script type="text/javascript" src="{:config('root_website')}/public/static/js/admin/cpattern_browser.js?{$Think.config.html_v}"></script>
<script type="text/javascript">
$(document).ready(function() {
window.skycaijiCB.init({$config|json_encode});
window.skycaijiCB.init({$configTips|json_encode});
});
</script>

View File

@ -49,7 +49,7 @@
表示当前内容标签的值
<div class="dropdown-menu dropdown-menu-right"></div>
</div>
,请按函数传参,否则运行出错!<a href="javascript:;" onclick="pluginFuncTips('contentSign')">扩展函数</a>
,请按函数传参,否则运行出错!<a href="javascript:;" onclick="tipsPluginFunc('contentSign')">扩展函数</a>
</div>
</div>
</div>

View File

@ -9,6 +9,7 @@
<div id="wrapper">
<iframe id="ifr_collector" src="{:url('collector/set?easymode=1&task_id='.$taskId)}" style="display:none;"></iframe>
<div id="box_guide">
<div id="box_resize"><span id="btn_resize" title="调整宽度"><span class="glyphicon glyphicon-resize-horizontal"></span></span></div>
<input type="hidden" id="coll_id" value="{$collId}" />
<div class="input-group">
<div class="input-group-btn">
@ -34,4 +35,8 @@
</div>
</div>
</div>
<script type="text/javascript">
var cpatternEasy=new CpatternEasy();
cpatternEasy.init('{$resizeWidth}');
</script>
{/block}

View File

@ -29,8 +29,8 @@
<optgroup label="数据生成">
<option value="words">{$Think.lang.field_module_words}</option>
<option value="num">{$Think.lang.field_module_num}</option>
<option value="time">{$Think.lang.field_module_time}</option>
<option value="list">{$Think.lang.field_module_list}</option>
<option value="time">{$Think.lang.field_module_time}</option>
</optgroup>
<optgroup label="字段">
<option value="extract">字段提取内容</option>
@ -108,8 +108,19 @@
<div class="checkbox"><label><input type="checkbox" name="field[time_stamp]" value="1" {$field['time_stamp']?'checked="checked"':''}> 转换成时间戳</label></div>
</div>
<div class="c-p-field-module" module="list" style="display:none;">
<textarea name="field[list]" class="form-control" rows="3">{$field['list']}</textarea>
<p class="help-block">一行一条数据,从列表中随机抽取</p>
<div class="form-group">
<label>列表数据</label>
<textarea name="field[list]" class="form-control" rows="3">{$field['list']}</textarea>
<p class="help-block">一行一条数据,从列表中抽取数据</p>
</div>
<div class="form-group">
<label>抽取方式</label>
<select name="field[list_type]" class="form-control">
<option value="" selected="selected">随机抽取</option>
<option value="asc">顺序抽取</option>
<option value="desc">倒序抽取</option>
</select>
</div>
</div>
<div class="c-p-field-module" module="merge" style="display:none;">
<textarea name="field[merge]" class="form-control" rows="3">{$field['merge']}</textarea>

View File

@ -10,7 +10,7 @@
</div>
<div class="form-group">
<div class="input-group">
<div class="input-group-addon">分页分隔符 <span title="提示信息" class="glyphicon glyphicon-info-sign icon-delimiter-tips" onclick="cpDelimiterTips()"></span></div>
<div class="input-group-addon">分页分隔符 <span title="提示信息" class="glyphicon glyphicon-info-sign icon-info-tips" onclick="cpDelimiterTips()"></span></div>
<input type="text" name="pagination_field[delimiter]" class="form-control" placeholder="选填,内容多页之间插入字符" />
</div>
{if !empty($isLoop)}

View File

@ -87,31 +87,23 @@
</div>
<div class="c-p-process-module" module="if">
<section>
<div class="form-group">
<div class="input-group">
<span class="input-group-addon">
<a href="javascript:;" class="glyphicon glyphicon-info-sign p-m-if-info" style="color:#999;"></a>
</span>
<select data-process="if:if_type" class="form-control">
<option value="1">{$Think.lang.p_m_if_1}</option>
<option value="2">{$Think.lang.p_m_if_2}</option>
<option value="3">{$Think.lang.p_m_if_3}</option>
<option value="4">{$Think.lang.p_m_if_4}</option>
</select>
<div class="input-group-btn">
<button class="btn btn-default p-m-if-add" type="button"><span class="glyphicon glyphicon-plus" style="color:#3c8dbc"></span></button>
</div>
</div>
<div class="form-group" style="margin-bottom:10px;">
<select data-process="if:if_type" class="form-control">
<option value="1">{$Think.lang.p_m_if_1}</option>
<option value="2">{$Think.lang.p_m_if_2}</option>
<option value="3">{$Think.lang.p_m_if_3}</option>
<option value="4">{$Think.lang.p_m_if_4}</option>
</select>
</div>
<div class="form-group">
<div class="table-responsive">
<table class="table table-hover p-m-if-table" style="margin-bottom:0;">
<table class="table table-bordered table-hover p-m-if-table" style="margin-bottom:0;">
<thead>
<tr>
<th style="min-width:95px;">逻辑</th>
<th style="min-width:150px;">条件</th>
<th style="min-width:200px;"></th>
<th style="max-width:90px;"></th>
<th style="width:95px;">逻辑 <a href="javascript:;" class="glyphicon glyphicon-info-sign icon-info-tips p-m-if-info"></a></th>
<th style="width:150px;">条件</th>
<th></th>
<th style="width:70px;">操作 <a href="javascript:;" class="glyphicon glyphicon-plus p-m-if-add" title="添加"></a></th>
</tr>
</thead>
<tbody>
@ -195,8 +187,8 @@
<option value="1">取反</option>
</select>
</div>
<div class="input-group-addon" style="padding:0;">
<a href="javascript:;" class="p-m-if-val-func-info"><span class="glyphicon glyphicon-info-sign"></span></a>
<div class="input-group-addon" style="padding:0;min-width:31px;width:31px;">
<a href="javascript:;" class="glyphicon glyphicon-info-sign icon-info-tips p-m-if-val-func-info"></a>
</div>
</div>
<div class="input-group">
@ -230,7 +222,7 @@
<div class="input-group input-select-custom">
<div class="input-group-btn">
<select data-process="translate:translate_from" class="form-control">
<option value="">-请选择--</option>
<option value="">--请选择--</option>
<option value="auto">自动检测</option>
{foreach $transApiLangs as $k=>$v}
<option value="{$k}">{$v}</option>
@ -246,7 +238,7 @@
<div class="input-group input-select-custom">
<div class="input-group-btn">
<select data-process="translate:translate_to" class="form-control">
<option value="">-请选择--</option>
<option value="">--请选择--</option>
{foreach $transApiLangs as $k=>$v}
<option value="{$k}">{$v}</option>
{/foreach}
@ -305,7 +297,7 @@
<textarea data-process="func:func_param" rows="2" class="form-control" data-placeholder="默认传入当前字段"></textarea>
<div class="help-block">
一行一个值, 可输入任何内容或<select class="p-m-func-field"><option value="">插入字段</option></select>
请按函数传参, 否则运行出错!<a href="javascript:;" onclick="pluginFuncTips('process')">扩展函数</a>
请按函数传参, 否则运行出错!<a href="javascript:;" onclick="tipsPluginFunc('process')">扩展函数</a>
</div>
</div>
</section>
@ -318,22 +310,7 @@
<p class="help-block">/开头自动补全为{:config('root_website')}/</p>
</div>
<div class="form-group">
<label>请求方式</label>
<select data-process="api:api_type" class="form-control">
<option value="">GET</option>
<option value="post">POST</option>
</select>
</div>
<div class="form-group p-m-api-content-type" style="display:none;">
<label>POST数据类型</label>
<select data-process="api:api_content_type" class="form-control">
<option value="">默认表单数据application/x-www-form-urlencoded</option>
<option value="application/json">JSON数组application/json</option>
<option value="multipart/form-data">表单上传multipart/form-data</option>
</select>
</div>
<div class="form-group">
<label>数据编码</label>
<label>网页编码</label>
<div class="input-group input-select-custom">
<div class="input-group-btn">
<select data-process="api:api_charset" class="form-control">
@ -346,16 +323,48 @@
<input type="text" class="form-control" data-process="api:api_charset_custom">
</div>
</div>
<div class="form-group">
<label>内容解压缩</label>
<div class="input-group input-select-custom">
<div class="input-group-btn">
<select data-process="api:api_encode" class="form-control">
<option value="">系统默认</option>
<option value="gzip">gzip</option>
<option value="br">br</option>
<option value="compress">compress</option>
<option value="deflate">deflate</option>
<option value="identity">identity</option>
<option value="custom">自定义</option>
</select>
</div>
<input type="text" class="form-control" data-process="api:api_encode_custom">
</div>
</div>
<div class="form-group">
<label>请求方式</label>
<select data-process="api:api_type" class="form-control">
<option value="">GET</option>
<option value="post">POST</option>
</select>
</div>
<div class="form-group p-m-api-content-type" style="display:none;">
<label>POST数据类型 <a href="javascript:;" class="glyphicon glyphicon-info-sign icon-info-tips" onclick="tipsCurlPost()"></a></label>
<select data-process="api:api_content_type" class="form-control">
<option value="">默认表单数据application/x-www-form-urlencoded</option>
<option value="application/json">JSON数组application/json</option>
<option value="multipart/form-data">表单上传multipart/form-data</option>
</select>
</div>
<div class="form-group">
<label>发送数据</label>
<a href="javascript:;" class="glyphicon glyphicon-plus p-m-api-add" title="添加"></a>
<div class="table-responsive">
<table class="table table-bordered table-hover p-m-api-table" style="margin-bottom:0;">
<div class="table-responsive p-m-api-table">
<table class="table table-bordered table-hover">
<thead>
<tr>
<td>名称</td>
<td></th>
<td style="width:50px;">删除</td>
<td>删除</td>
</tr>
</thead>
<tbody>
@ -394,13 +403,13 @@
<div class="form-group">
<label>请求头信息</label>
<a href="javascript:;" class="glyphicon glyphicon-plus p-m-api-header-add" title="添加"></a>
<div class="table-responsive">
<table class="table table-bordered table-hover p-m-api-header-table" style="margin-bottom:0;">
<div class="table-responsive p-m-api-header-table">
<table class="table table-bordered table-hover">
<thead>
<tr>
<td>名称</td>
<td></td>
<td style="width:50px;">删除</td>
<td>删除</td>
</tr>
</thead>
<tbody>

View File

@ -14,7 +14,7 @@
<div style="display:inline;"><a href="javascript:;" title="{$Think.lang.tips_sign_group}" class="blk" onclick="cpMatch('[name=\'{$_tpl_name}[{$_tpl_name_pre}rule]\']',{group:1})">捕获组</a></div>
<div>
<span title="{$Think.lang.tips_regular}">正则</span>
<a href="javascript:;" title="提示信息" class="glyphicon glyphicon-info-sign" style="font-size:11px;" onclick="cpRuleTips()"></a>
<a href="javascript:;" title="提示信息" class="glyphicon glyphicon-info-sign icon-info-tips" onclick="cpRuleTips()"></a>
</div>
</div>
</div>
@ -32,12 +32,12 @@
<div class="checkbox"><label><input type="checkbox" name="{$_tpl_name}[{$_tpl_name_pre}rule_multi]" value="1"> 允许匹配多个结果</label></div>
<div class="input-group" style="display:none;" id="c_p_{$_tpl_name}_{$_tpl_name_pre}rule_multi_str">
{if $_tpl_allow_loop}
<div class="input-group-addon" style="border-right:0;"><label class="radio-inline"><input type="radio" name="{$_tpl_name}[{$_tpl_name_pre}rule_multi_type]" value="">拼接为文本 <span title="提示信息" class="glyphicon glyphicon-info-sign icon-delimiter-tips" onclick="cpDelimiterTips()"></span></label></div>
<input type="text" style="border-left-style:dashed;" name="{$_tpl_name}[{$_tpl_name_pre}rule_multi_str]" class="form-control" placeholder="多个结果之间分隔符">
<div class="input-group-addon" style="border-right:0;"><label class="radio-inline"><input type="radio" name="{$_tpl_name}[{$_tpl_name_pre}rule_multi_type]" value="">拼接为文本 <span title="提示信息" class="glyphicon glyphicon-info-sign icon-info-tips" onclick="cpDelimiterTips()"></span></label></div>
<input type="text" name="{$_tpl_name}[{$_tpl_name_pre}rule_multi_str]" class="form-control" placeholder="多个结果之间分隔符">
<div class="input-group-addon"><label class="radio-inline"><input type="radio" name="{$_tpl_name}[{$_tpl_name_pre}rule_multi_type]" value="loop">循环入库</label></div>
{else /}
<input type="text" name="{$_tpl_name}[{$_tpl_name_pre}rule_multi_str]" class="form-control" placeholder="多个结果之间分隔符" />
<div class="input-group-addon" style="padding-left:9px;padding-right:9px;"><span title="提示信息" class="glyphicon glyphicon-info-sign icon-delimiter-tips" onclick="cpDelimiterTips()"></span></div>
<div class="input-group-addon" style="padding-left:9px;padding-right:9px;"><span title="提示信息" class="glyphicon glyphicon-info-sign icon-info-tips" onclick="cpDelimiterTips()"></span></div>
{/if}
</div>
{elseif $_tpl_type=='xpath' /}
@ -47,34 +47,38 @@
</div>
<div class="form-group">
<label>属性</label>
<select name="{$_tpl_name}[{$_tpl_name_pre}xpath_attr]" class="form-control">
<option value=""></option>
<option value="innerHtml">innerHtml</option>
<option value="outerHtml">outerHtml</option>
<option value="text">text</option>
<option value="value">value</option>
<option value="id">id</option>
<option value="class">class</option>
<option value="name">name</option>
<option value="href">href</option>
<option value="src">src</option>
<option value="style">style</option>
<option value="width">width</option>
<option value="height">height</option>
<option value="alt">alt</option>
<option value="custom">自定义</option>
</select>
<input type="text" class="form-control" name="{$_tpl_name}[{$_tpl_name_pre}xpath_attr_custom]" style="margin-top:10px;display:none;">
<div class="input-group input-select-custom">
<div class="input-group-btn">
<select name="{$_tpl_name}[{$_tpl_name_pre}xpath_attr]" class="form-control">
<option value=""></option>
<option value="innerHtml">innerHtml</option>
<option value="outerHtml">outerHtml</option>
<option value="text">text</option>
<option value="value">value</option>
<option value="id">id</option>
<option value="class">class</option>
<option value="name">name</option>
<option value="href">href</option>
<option value="src">src</option>
<option value="style">style</option>
<option value="width">width</option>
<option value="height">height</option>
<option value="alt">alt</option>
<option value="custom">自定义</option>
</select>
</div>
<input type="text" class="form-control" name="{$_tpl_name}[{$_tpl_name_pre}xpath_attr_custom]" />
</div>
</div>
<div class="checkbox"><label><input type="checkbox" name="{$_tpl_name}[{$_tpl_name_pre}xpath_multi]" value="1"> 允许匹配多个结果</label></div>
<div class="input-group" style="display:none;" id="c_p_{$_tpl_name}_{$_tpl_name_pre}xpath_multi_str">
{if $_tpl_allow_loop}
<div class="input-group-addon" style="border-right:0;"><label class="radio-inline"><input type="radio" name="{$_tpl_name}[{$_tpl_name_pre}xpath_multi_type]" value="">拼接为文本 <span title="提示信息" class="glyphicon glyphicon-info-sign icon-delimiter-tips" onclick="cpDelimiterTips()"></span></label></div>
<input type="text" style="border-left-style:dashed;" name="{$_tpl_name}[{$_tpl_name_pre}xpath_multi_str]" class="form-control" placeholder="多个结果之间分隔符">
<div class="input-group-addon" style="border-right:0;"><label class="radio-inline"><input type="radio" name="{$_tpl_name}[{$_tpl_name_pre}xpath_multi_type]" value="">拼接为文本 <span title="提示信息" class="glyphicon glyphicon-info-sign icon-info-tips" onclick="cpDelimiterTips()"></span></label></div>
<input type="text" name="{$_tpl_name}[{$_tpl_name_pre}xpath_multi_str]" class="form-control" placeholder="多个结果之间分隔符">
<div class="input-group-addon"><label class="radio-inline"><input type="radio" name="{$_tpl_name}[{$_tpl_name_pre}xpath_multi_type]" value="loop">循环入库</label></div>
{else /}
<input type="text" name="{$_tpl_name}[{$_tpl_name_pre}xpath_multi_str]" class="form-control" placeholder="多个结果之间分隔符" />
<div class="input-group-addon" style="padding-left:9px;padding-right:9px;"><span title="提示信息" class="glyphicon glyphicon-info-sign icon-delimiter-tips" onclick="cpDelimiterTips()"></span></div>
<div class="input-group-addon" style="padding-left:9px;padding-right:9px;"><span title="提示信息" class="glyphicon glyphicon-info-sign icon-info-tips" onclick="cpDelimiterTips()"></span></div>
{/if}
</div>
{elseif $_tpl_type=='json' /}
@ -97,7 +101,7 @@
</select>
<div class="input-group" id="c_p_{$_tpl_name}_{$_tpl_name_pre}json_arr_implode" style="margin-top:5px;">
<textarea name="{$_tpl_name}[{$_tpl_name_pre}json_arr_implode]" class="form-control" rows="1" placeholder="输入分隔符"></textarea>
<div class="input-group-addon" style="padding-left:9px;padding-right:9px;"><span title="提示信息" class="glyphicon glyphicon-info-sign icon-delimiter-tips" onclick="cpDelimiterTips()"></span></div>
<div class="input-group-addon" style="padding-left:9px;padding-right:9px;"><span title="提示信息" class="glyphicon glyphicon-info-sign icon-info-tips" onclick="cpDelimiterTips()"></span></div>
</div>
</div>
{/if}

View File

@ -35,6 +35,23 @@
<input type="text" name="config[charset_custom]" class="form-control">
</div>
</div>
<div class="form-group">
<label class="control-label">内容解压缩</label>
<div class="input-group input-select-custom">
<div class="input-group-btn">
<select name="config[encode]" class="form-control">
<option value="">系统默认</option>
<option value="gzip">gzip</option>
<option value="br">br</option>
<option value="compress">compress</option>
<option value="deflate">deflate</option>
<option value="identity">identity</option>
<option value="custom">自定义</option>
</select>
</div>
<input type="text" name="config[encode_custom]" class="form-control">
</div>
</div>
<div class="form-group">
<label class="control-label">自动补全网址</label>
<div class="input-group">
@ -44,7 +61,7 @@
<p class="help-block">将所有页面源码中的相对地址转换成绝对地址包含超链接、图片、JS链接等</p>
</div>
<div class="form-group">
<label class="control-label">网址不排重</label>
<label class="control-label">重复采集网址</label>
<div class="input-group">
<label class="radio-inline"><input type="radio" name="config[url_repeat]" value="1"> </label>
<label class="radio-inline"><input type="radio" name="config[url_repeat]" value="0" checked="checked"> </label>
@ -65,7 +82,15 @@
<label class="radio-inline"><input type="radio" name="config[page_render]" value="1"> </label>
<label class="radio-inline"><input type="radio" name="config[page_render]" value="0" checked="checked"> </label>
</div>
<p class="help-block">需先配置<a href="{:url('setting/page_render')}">页面渲染</a>可自动加载ajax内容注意渲染后的html源码与未渲染时的不相同原先的规则可能会失效</p>
<p class="help-block">需先配置<a href="{:url('setting/page_render')}" target="_blank">页面渲染</a>可自动加载ajax内容注意渲染后的html源码与未渲染时的不相同html的变动可能会导致原来的规则失效</p>
</div>
<div class="form-group">
<label class="control-label">网址去除锚点</label>
<div class="input-group">
<label class="radio-inline"><input type="radio" name="config[url_no_name]" value="1"> </label>
<label class="radio-inline"><input type="radio" name="config[url_no_name]" value="0" checked="checked"> </label>
</div>
<p class="help-block">通常情况下网址中有锚点(#)和无锚点解析出的内容是相同的,为避免采集到重复内容可去除网址锚点</p>
</div>
<div class="form-group">
<label class="control-label">正则匹配模式</label>
@ -135,8 +160,8 @@
</div>
<div class="form-group">
<label class="control-label">自定义 <a href="javascript:;" class="glyphicon glyphicon-plus add-request-header" title="添加"></a></label>
<div class="table-responsive">
<table class="table table-bordered c-p-request-headers" style="margin-bottom:0;">
<div class="table-responsive c-p-request-headers">
<table class="table table-bordered">
<thead>
<tr>
<td>名称</td>
@ -173,16 +198,16 @@
<div class="form-group">
<label class="control-label">使用全局请求头</label>
<div class="input-group">
<label class="radio-inline"><input type="radio" name="config[request_headers][img_use_page]" value="" checked="checked"> 默认</label>
<label class="radio-inline"><input type="radio" name="config[request_headers][img_use_page]" value="y"> 强制使用</label>
<label class="radio-inline"><input type="radio" name="config[request_headers][img_use_page]" value="n"> 强制禁用</label>
<label class="radio-inline"><input type="radio" name="config[request_headers][img_use_page]" value="" checked="checked"> 默认<span class="def-config-request-headers-open"></span></label>
<label class="radio-inline"><input type="radio" name="config[request_headers][img_use_page]" value="y"> </label>
<label class="radio-inline"><input type="radio" name="config[request_headers][img_use_page]" value="n"> </label>
</div>
<p class="help-block">默认使用采集器设置»请求头信息»抓取页面中的置(受全局开启状态影响)</p>
<p class="help-block">默认使用采集器设置»请求头信息»抓取页面中的置(受全局开启状态影响)</p>
</div>
<div class="form-group">
<label class="control-label">自定义 <a href="javascript:;" class="glyphicon glyphicon-plus add-request-header-img" title="添加"></a></label>
<div class="table-responsive">
<table class="table table-bordered c-p-request-headers-img" style="margin-bottom:0;">
<div class="table-responsive c-p-request-headers-img">
<table class="table table-bordered">
<thead>
<tr>
<td>名称</td>
@ -270,7 +295,7 @@
{if condition="!empty($collData['config'])&&!empty($collData['config']['front_urls'])"}
<li><a href="{:url('cpattern_test/front_urls?coll_id='.$collData['id'])}" target="_blank">测试抓取前置页</a></li>
{/if}
<li><a href="{:url('cpattern_test/test_url?test=get_browser&coll_id='.$collData['id'])}" target="_blank">测试分析网页</a></li>
<li><a href="{:url('cpattern_test/test_url?test=get_browser&page_source=source_url&coll_id='.$collData['id'])}" target="_blank">测试分析网页</a></li>
<li><a href="{:url('cpattern_test/match?coll_id='.$collData['id'])}" target="_blank">模拟匹配数据</a></li>
</ul>
</div>

View File

@ -27,11 +27,12 @@
</div>
<div id="{$_tpl_vars['id']}_web_open" style="display:none;margin-top:15px;">
<div class="form-group">
<label class="control-label">编码</label>
<label class="control-label">页编码</label>
<div class="input-group input-select-custom">
<div class="input-group-btn">
<select name="{$_tpl_vars['name']}[url_web][charset]" class="form-control">
<option value="">默认:采集器设置»网页编码</option>
<option value="" class="def-config-charset"></option>
<option value="auto">自动检测</option>
<option value="utf-8">utf-8</option>
<option value="gbk">gbk</option>
<option value="gb2312">gb2312</option>
@ -40,6 +41,26 @@
</div>
<input type="text" class="form-control" name="{$_tpl_vars['name']}[url_web][charset_custom]">
</div>
<p class="help-block">默认使用采集器设置»网页编码中的配置</p>
</div>
<div class="form-group">
<label class="control-label">内容解压缩</label>
<div class="input-group input-select-custom">
<div class="input-group-btn">
<select name="{$_tpl_vars['name']}[url_web][encode]" class="form-control">
<option value="" class="def-config-encode"></option>
<option value="n">系统默认</option>
<option value="gzip">gzip</option>
<option value="br">br</option>
<option value="compress">compress</option>
<option value="deflate">deflate</option>
<option value="identity">identity</option>
<option value="custom">自定义</option>
</select>
</div>
<input type="text" class="form-control" name="{$_tpl_vars['name']}[url_web][encode_custom]">
</div>
<p class="help-block">默认使用采集器设置»内容解压缩中的配置</p>
</div>
<div class="form-group">
<label>请求方式</label>
@ -49,7 +70,7 @@
</select>
</div>
<div class="form-group c-p-url-web-content-type" style="display:none;">
<label>POST数据类型</label>
<label>POST数据类型 <a href="javascript:;" class="glyphicon glyphicon-info-sign icon-info-tips" onclick="tipsCurlPost()"></a></label>
<select name="{$_tpl_vars['name']}[url_web][content_type]" class="form-control">
<option value="">默认表单数据application/x-www-form-urlencoded</option>
<option value="application/json">JSON数组application/json</option>
@ -57,8 +78,9 @@
</select>
</div>
<div class="form-group">
<label class="control-label">发送数据 <a href="javascript:;" class="glyphicon glyphicon-plus add-url-web-form" title="添加" style="font-size:12px;"></a></label>
<table class="table table-bordered table-hover c-p-url-web-form" style="margin-bottom:0;">
<label class="control-label">发送数据 <a href="javascript:;" class="glyphicon glyphicon-plus add-url-web-form" title="添加"></a></label>
<div class="table-responsive c-p-url-web-form">
<table class="table table-bordered table-hover">
<thead>
<tr>
<td>名称</td>
@ -69,18 +91,21 @@
<tbody>
</tbody>
</table>
</div>
</div>
<div class="form-group">
<label>使用全局请求头</label>
<select name="{$_tpl_vars['name']}[url_web][header_global]" class="form-control">
<option value="">默认:采集器设置»请求头信息»抓取页面中的配置(受全局开启状态影响)</option>
<option value="y">强制使用</option>
<option value="n">强制禁用</option>
</select>
<div class="input-group">
<label class="radio-inline"><input type="radio" name="{$_tpl_vars['name']}[url_web][header_global]" value="" checked="checked"> 默认:<span class="def-config-request-headers-open"></span></label>
<label class="radio-inline"><input type="radio" name="{$_tpl_vars['name']}[url_web][header_global]" value="y"> </label>
<label class="radio-inline"><input type="radio" name="{$_tpl_vars['name']}[url_web][header_global]" value="n"> </label>
</div>
<p class="help-block">默认使用采集器设置»请求头信息»抓取页面中的配置(受全局开启状态影响)</p>
</div>
<div class="form-group">
<label class="control-label">请求头信息 <a href="javascript:;" class="glyphicon glyphicon-plus add-url-web-header" title="添加" style="font-size:12px;"></a></label>
<table class="table table-bordered table-hover c-p-url-web-header" style="margin-bottom:0;">
<label class="control-label">请求头信息 <a href="javascript:;" class="glyphicon glyphicon-plus add-url-web-header" title="添加"></a></label>
<div class="table-responsive c-p-url-web-header">
<table class="table table-bordered table-hover">
<thead>
<tr>
<td>名称</td>
@ -91,6 +116,7 @@
<tbody>
</tbody>
</table>
</div>
<p class="help-block">添加新的或者覆盖已有的请求头信息</p>
</div>
</div>
@ -98,6 +124,39 @@
</div>
</div>
<div class="panel panel-default" id="panel_{$_tpl_vars['id']}_renderer">
<div class="panel-heading">
<h4 class="panel-title">
<a data-toggle="collapse" href="#{$_tpl_vars['id']}_renderer" aria-expanded="false" class="collapsed">执行页面渲染</a>
</h4>
</div>
<div id="{$_tpl_vars['id']}_renderer" class="panel-collapse collapse" aria-expanded="false">
<div class="panel-body">
<div class="form-group">
<label class="control-label">开启页面渲染</label>
<div class="input-group">
<label class="radio-inline"><input type="radio" name="{$_tpl_vars['name']}[renderer][open]" value="" checked="checked"> 默认:<span class="def-config-page-render"></span></label>
<label class="radio-inline"><input type="radio" name="{$_tpl_vars['name']}[renderer][open]" value="y"> </label>
<label class="radio-inline"><input type="radio" name="{$_tpl_vars['name']}[renderer][open]" value="n"> </label>
</div>
<p class="help-block">默认:采集器设置»页面渲染的状态</p>
</div>
<div class="form-group">
<label class="control-label">
页面渲染动作
<a href="javascript:;" class="glyphicon glyphicon-plus add-url-renderer" title="添加"></a>
</label>
<div class="table-responsive c-p-url-renderer-list">
<table class="table table-hover">
<tbody>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
{if $_tpl_page_type!='test'}
<div class="panel panel-default" id="panel_{$_tpl_vars['id']}_content_sign"{if $_tpl_page_type=='url'} style="margin-bottom:0;"{/if}>
<div class="panel-heading">
<h4 class="panel-title">
@ -109,7 +168,7 @@
<div class="form-group">
<label class="control-label">
内容标签
<a href="javascript:;" class="glyphicon glyphicon-plus add-url-content-sign" title="添加" style="font-size:12px;"></a>
<a href="javascript:;" class="glyphicon glyphicon-plus add-url-content-sign" title="添加"></a>
</label>
<div class="c-p-url-content-signs">
</div>
@ -118,6 +177,7 @@
</div>
</div>
</div>
{/if}
{if $_tpl_page_type=='source_url'}
{include file="cpattern:set_pagination" _page_type="source_url" /}

View File

@ -41,7 +41,7 @@
<div style="display:inline;"><a href="javascript:;" title="{$Think.lang.tips_sign_match_global}" onclick="cpMatch('[name=\'{$_tpl_name}[area]\']',{zimu:{$_tpl_match_global?1:0}})">{:cp_sign('match')}</a></div>
<div>
<div style="display:inline;"><a href="javascript:;" title="{$Think.lang.tips_sign_group_global}" onclick="cpMatch('[name=\'{$_tpl_name}[area]\']',{group:1,zimu:{$_tpl_match_global?1:0}})">捕获组</a></div>
<div style="display:inline;"><a href="javascript:;" title="提示信息" class="glyphicon glyphicon-info-sign" style="font-size:11px;" onclick="cpRuleTips({$_tpl_match_global?1:''})"></a></div>
<div style="display:inline;"><a href="javascript:;" title="提示信息" class="glyphicon glyphicon-info-sign icon-info-tips" onclick="cpRuleTips({$_tpl_match_global?1:''})"></a></div>
</div>
</li>
<li data-module="xpath">xpath语法</li>
@ -102,7 +102,7 @@
<div style="display:inline;"><a href="javascript:;" title="{$Think.lang.tips_sign_match_global}" onclick="cpMatch('[name=\'{$_tpl_name}[url_rule]\']',{zimu:{$_tpl_match_global?1:0}})">{:cp_sign('match')}</a></div>
<div>
<div style="display:inline;"><a href="javascript:;" title="{$Think.lang.tips_sign_group_global}" onclick="cpMatch('[name=\'{$_tpl_name}[url_rule]\']',{group:1,zimu:{$_tpl_match_global?1:0}})">捕获组</a></div>
<div style="display:inline;"><a href="javascript:;" title="提示信息" class="glyphicon glyphicon-info-sign" style="font-size:11px;" onclick="cpRuleTips({$_tpl_match_global?1:''})"></a></div>
<div style="display:inline;"><a href="javascript:;" title="提示信息" class="glyphicon glyphicon-info-sign icon-info-tips" onclick="cpRuleTips({$_tpl_match_global?1:''})"></a></div>
</div>
</li>
<li data-module="xpath">xpath语法</li>

View File

@ -37,6 +37,24 @@
<input type="number" class="form-control" name="{$_tpl_vars['name']}[pagination][max]" value="10">
<p class="help-block">填0表示不限制会自动循环抓取到最后一页为防止出现无限循环的情况最好设置一个数值以便采集到相应数量的分页后跳出循环抓取</p>
</div>
<div class="form-group">
<label class="control-label">使用“请求{$_tpl_vars['title']}网址”</label>
<div class="input-group">
<label class="radio-inline"><input type="radio" name="{$_tpl_vars['name']}[pagination][use_url_web]" value="" checked="checked"> 默认:<span class="def-config-url-web-open"></span></label>
<label class="radio-inline"><input type="radio" name="{$_tpl_vars['name']}[pagination][use_url_web]" value="y"> </label>
<label class="radio-inline"><input type="radio" name="{$_tpl_vars['name']}[pagination][use_url_web]" value="n"> </label>
</div>
<p class="help-block">抓取{$_tpl_vars['title']}分页时发送请求,默认使用{$_tpl_vars['title']}»请求{$_tpl_vars['title']}网址的配置(受开启状态影响)</p>
</div>
<div class="form-group">
<label class="control-label">使用“执行页面渲染”</label>
<div class="input-group">
<label class="radio-inline"><input type="radio" name="{$_tpl_vars['name']}[pagination][use_renderer]" value="" checked="checked"> 默认:<span class="def-config-page-render"></span><span class="def-config-renderer-open" style="display:none;"></span></label>
<label class="radio-inline"><input type="radio" name="{$_tpl_vars['name']}[pagination][use_renderer]" value="y"> </label>
<label class="radio-inline"><input type="radio" name="{$_tpl_vars['name']}[pagination][use_renderer]" value="n"> </label>
</div>
<p class="help-block">抓取{$_tpl_vars['title']}分页时执行页面渲染,默认使用{$_tpl_vars['title']}»执行页面渲染的配置(受开启状态影响)</p>
</div>
</div>
</div>
</div>

View File

@ -42,6 +42,45 @@
</td>
<td><a href="javascript:;" class="glyphicon glyphicon-remove delete-url-web-header"></a></td>
</tr>
<tr id="coll_tpl_url_renderer">
<td class="td-renderer-type" colspan="3">
<select class="form-control" data-name="[renderer][types][]">
<option value="">--请选择--</option>
<option value="wait_end">等待页面完全渲染</option>
<option value="wait_time">等待时间(秒)</option>
<option value="scroll_half">滚动到中间</option>
<option value="scroll_end">滚动到底部</option>
<option value="scroll_top">滚动到指定位置</option>
<option value="val">赋值</option>
<option value="click">点击</option>
</select>
</td>
<td class="td-renderer-element">
<div class="input-group">
<span class="input-group-addon">元素</span>
<input type="text" class="form-control" data-name="[renderer][elements][]" autocomplete="off" placeholder="输入xpath" />
</div>
</td>
<td class="td-renderer-content">
<div class="input-group c-p-url-page-signs" data-page-type="" data-input-name="[renderer][contents][]">
<span class="input-group-addon">内容</span>
<input type="text" data-merge-type="url" class="form-control" data-name="[renderer][contents][]" autocomplete="off" placeholder="" />
<div class="input-group-addon">
<a href="javascript:;" title="调用全局内容标签" role="button" class="dropdown-toggle btn-page-signs" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span style="font-size:12px;">{:cp_sign('match','N')}</span>
<span class="caret"></span>
</a>
<div class="dropdown-menu dropdown-menu-right"></div>
</div>
</div>
</td>
<td class="td-renderer-op">
<div class="input-group">
<div class="input-group-addon"><a href="javascript:;" class="glyphicon icon-drag-move" title="移动"></a></div>
<div class="input-group-addon"><a href="javascript:;" class="glyphicon glyphicon-remove delete-url-renderer" title="删除"></a></div>
</div>
</td>
</tr>
<tr id="coll_tpl_front_url">
<td><a href="javascript:;" class="name" data-val=""></a></td>
<td class="sign"><input type="text" class="form-control signs" readonly="true" /></td>

View File

@ -9,11 +9,11 @@
<tbody>
{foreach $frontDataList as $frontIx=>$frontData}
<tr>
<th>前置页:{$frontData['name']}</th>
<th style="padding-top:16px;">前置页:{$frontData['name']}</th>
<td>
<table class="table table-hover">
<tr>
<td width="90">网址</td>
<td style="width:90px;">网址</td>
<td>{$frontData['url']|htmlspecialchars}</td>
</tr>
<tr>

View File

@ -6,9 +6,9 @@
<div class="form-group">
<div class="input-group input-group-sm">
<div class="input-group-addon">起始页</div>
<input type="text" name="source_url" class="form-control" value="{$input_urls['source_url']|htmlspecialchars}" />
{if $is_post_list['source_url']}
<div class="input-group-addon">POST</div>
<input type="text" name="source_url" class="form-control" value="{$input_urls['source_url']?htmlspecialchars($input_urls['source_url']):''}" />
{if $pageOpenedList['source_url']}
<div class="input-group-addon">{$pageOpenedList['source_url']}</div>
{/if}
</div>
</div>
@ -18,9 +18,9 @@
<div class="form-group">
<div class="input-group input-group-sm">
<div class="input-group-addon">多级页:{$level_url['name']}</div>
<input type="text" name="level_{$level_url['level']}" class="form-control" value="{$level_url['url']|htmlspecialchars}" />
{if $is_post_list['level_url'][$level_url['name']]}
<div class="input-group-addon">POST</div>
<input type="text" name="level_{$level_url['level']}" class="form-control" value="{$level_url['url']?htmlspecialchars($level_url['url']):''}" />
{if $pageOpenedList['level_url'][$level_url['name']]}
<div class="input-group-addon">{$pageOpenedList['level_url'][$level_url['name']]}</div>
{/if}
</div>
</div>
@ -30,9 +30,9 @@
<div class="form-group">
<div class="input-group input-group-sm">
<div class="input-group-addon">内容页</div>
<input type="text" name="url" class="form-control" value="{$input_urls['url']|htmlspecialchars}" />
{if $is_post_list['url']}
<div class="input-group-addon">POST</div>
<input type="text" name="url" class="form-control" value="{$input_urls['url']?htmlspecialchars($input_urls['url']):''}" />
{if $pageOpenedList['url']}
<div class="input-group-addon">{$pageOpenedList['url']}</div>
{/if}
</div>
</div>
@ -40,6 +40,6 @@
</div>
</div>
{/if}
{if $is_post}
<input type="hidden" name="page_source_post" value="1" />
{if $pageOpened}
<div id="input_url_page_opened" style="display:none;">{$pageOpened}</div>
{/if}

View File

@ -1,141 +1,86 @@
<style type="text/css">
.c-p-url-web-form .c-p-url-page-signs,.c-p-url-web-header .c-p-url-page-signs{display:block;}
.c-p-url-page-signs .input-group-addon:last-child{display:none!important;}
</style>
<div id="win_test_match">
<form method="post" action="{:url('cpattern_test/match')}">
{:html_usertoken()}
<input type="hidden" name="coll_id" value="{$collData['id']}" />
<div class="form-group">
<label>模拟类型</label>
<select class="form-control" name="input_type">
<option value="content">内容</option>
<option value="url">网址</option>
</select>
</div>
<div id="input_type_content">
<form id="win_form_cache" style="display:none;">
<input type="text" name="config[charset]" value="{$defConfig['charset']}" />
<input type="text" name="config[encode]" value="{$defConfig['encode']}" />
<input type="radio" name="config[page_render]" value="1" {$defConfig['page_render']?'checked="checked"':''} /> <input type="radio" name="config[page_render]" value="0" {$defConfig['page_render']?'':'checked="checked"'} />
<input type="radio" name="config[request_headers][open]" value="1" {$defConfig['request_headers_open']?'checked="checked"':''} /> <input type="radio" name="config[request_headers][open]" value="0" {$defConfig['request_headers_open']?'':'checked="checked"'} />
</form>
<form id="win_form_test" method="post" action="{:url('cpattern_test/match')}">
{:html_usertoken()}
<input type="hidden" name="coll_id" value="{$collData['id']}" />
<div class="form-group">
<label>输入内容</label>
<textarea rows="5" class="form-control" name="content"></textarea>
<label>模拟类型</label>
<select class="form-control" name="input_type">
<option value="content">内容</option>
<option value="url">网址</option>
</select>
</div>
</div>
<div id="input_type_url" style="display:none;">
<div class="form-group">
<label>输入网址</label>
<input type="text" name="url" class="form-control" />
<p class="help-block">网址必须以http://或https://开头</p>
</div>
<div class="form-group">
<label class="control-label">页面编码</label>
<div class="input-group input-select-custom">
<div class="input-group-btn">
<select name="charset" class="form-control">
<option value="">默认:采集器设置»网页编码</option>
<option value="utf-8">utf-8</option>
<option value="gbk">gbk</option>
<option value="gb2312">gb2312</option>
<option value="custom">自定义</option>
</select>
</div>
<input type="text" class="form-control" name="charset_custom">
<div id="input_type_content">
<div class="form-group">
<label>输入内容</label>
<textarea rows="5" class="form-control" name="content"></textarea>
</div>
</div>
<div class="form-group">
<label class="control-label">请求方式</label>
<select name="form_method" class="form-control">
<option value="">GET</option>
<option value="post">POST</option>
</select>
</div>
<div class="form-group" id="post_content_type" style="display:none;">
<label>POST数据类型</label>
<select name="content_type" class="form-control">
<option value="">默认表单数据application/x-www-form-urlencoded</option>
<option value="application/json">JSON数组application/json</option>
<option value="multipart/form-data">表单上传multipart/form-data</option>
</select>
</div>
<div class="form-group form">
<label class="control-label">发送数据 <a href="javascript:;" class="glyphicon glyphicon-plus add" title="添加" style="font-size:12px;"></a></label>
<table class="table table-bordered table-hover" style="margin-bottom:0;">
<thead>
<tr>
<td>名称</td>
<td></td>
<td>删除</td>
</tr>
</thead>
<tbody>
</tbody>
</table>
<div id="input_type_url" style="display:none;">
<div class="form-group">
<label>页面类型</label>
<select class="form-control" name="page_source">
<option value="">页面类型</option>
{foreach $pageSources as $k=>$v}
<option value="{$k}">{$v}</option>
{/foreach}
</select>
</div>
<div class="form-group">
<label>输入网址</label>
<input type="text" name="url" class="form-control" />
<p class="help-block">网址必须以http://或https://开头</p>
</div>
{include file="cpattern:set_page" _page_type="test" /}
</div>
<div class="form-group">
<label>使用全局请求头</label>
<select name="header_global" class="form-control">
<option value="">默认:采集器设置»请求头信息»抓取页面中的配置(受全局开启状态影响)</option>
<option value="y">强制使用</option>
<option value="n">强制禁用</option>
<label>获取方式</label>
<select class="form-control" name="type">
<option value="rule" checked="checked">规则匹配</option>
<option value="xpath">XPath匹配</option>
<option value="json">JSON提取</option>
</select>
</div>
<div class="form-group header">
<label class="control-label">请求头信息 <a href="javascript:;" class="glyphicon glyphicon-plus add" title="添加" style="font-size:12px;"></a></label>
<table class="table table-bordered table-hover" style="margin-bottom:0;">
<thead>
<tr>
<td>名称</td>
<td></td>
<td>删除</td>
</tr>
</thead>
<tbody>
</tbody>
</table>
<p class="help-block">添加新的或者覆盖已有的请求头信息</p>
<div class="form-group" id="type_rule">
{include file="cpattern:rule_module" _type="rule" _name="field" _name_pre="" _allow_loop="" /}
</div>
<div class="form-group" id="type_xpath" style="display:none;">
{include file="cpattern:rule_module" _type="xpath" _name="field" _name_pre="" _allow_loop="" /}
</div>
<div class="form-group" id="type_json" style="display:none;">
{include file="cpattern:rule_module" _type="json" _name="field" _name_pre="" _allow_loop="" /}
</div>
<div class="form-group">
<button type="submit" class="btn btn-default btn-block">开始测试</button>
</div>
</div>
<div class="form-group">
<label>获取方式</label>
<select class="form-control" name="type">
<option value="rule" checked="checked">规则匹配</option>
<option value="xpath">XPath匹配</option>
<option value="json">JSON提取</option>
</select>
</div>
<div class="form-group" id="type_rule">
{include file="cpattern:rule_module" _type="rule" _name="field" _name_pre="" _allow_loop="" /}
</div>
<div class="form-group" id="type_xpath" style="display:none;">
{include file="cpattern:rule_module" _type="xpath" _name="field" _name_pre="" _allow_loop="" /}
</div>
<div class="form-group" id="type_json" style="display:none;">
{include file="cpattern:rule_module" _type="json" _name="field" _name_pre="" _allow_loop="" /}
</div>
<div class="form-group">
<button type="submit" class="btn btn-default btn-block">开始测试</button>
</div>
</form>
<div class="form-group test-match-val" style="display:none;">
<div><label>匹配结果</label><a href="javascript:;" class="visualize" style="margin-left:5px;display:none;">预览</a></div>
<textarea id="test_match_val" rows="10" class="form-control"></textarea>
</div>
<table style="display:none">
<tr id="tpl_tr_form">
<td><input type="text" name="form_names[]" class="form-control" /></td>
<td><input type="text" name="form_vals[]" class="form-control" /></td>
<td><a href="javascript:;" class="glyphicon glyphicon-remove delete" style="margin-top:8px;"></a></td>
</tr>
<tr id="tpl_tr_header">
<td><input type="text" name="header_names[]" class="form-control" /></td>
<td><input type="text" name="header_vals[]" class="form-control" /></td>
<td><a href="javascript:;" class="glyphicon glyphicon-remove delete" style="margin-top:8px;"></a></td>
</tr>
</table>
</div>
{include file="cpattern:set_tpl" /}
<script type="text/javascript">
'use strict';//严格模式
$.getScript("__PUBLIC__/static/js/admin/cpattern_test.js?{$Think.config.html_v}", function() {
CpTestMatch();
});
$.getScript("__PUBLIC__/static/js/admin/collector.js?{$Think.config.html_v}", function() {
$.getScript("__PUBLIC__/static/js/admin/cpattern_test.js?{$Think.config.html_v}", function() {
CpTestMatch();
var testCp=new CollectorPattern();
testCp.init_test();
});
});
</script>

View File

@ -27,14 +27,14 @@
<li>
[<a href="javascript:;" class="cont_ceshi" data-url="{$url|htmlspecialchars}">测试</a>]
[<a href="javascript:;" class="cont_element" data-url="{$url|htmlspecialchars}">分析</a>]
{$sourceUrlIsPost}{$url|htmlspecialchars}
{$sourceUrlOpened}{$url|htmlspecialchars}
</li>
{/foreach}
{else /}
<li>
[<a href="javascript:;" class="cont_ceshi" data-url="{$urls|htmlspecialchars}">测试</a>]
[<a href="javascript:;" class="cont_element" data-url="{$urls|htmlspecialchars}">分析</a>]
{$sourceUrlIsPost}{$urls|htmlspecialchars}
{$sourceUrlOpened}{$urls|htmlspecialchars}
</li>
{/if}
</ul>
@ -43,7 +43,7 @@
{else /}
{foreach name="source_urls" item="source_url"}
<div class="source_url" data-url="{$source_url|htmlspecialchars}">
<p><b>抓取起始页面:</b>{$sourceUrlIsPost}{$source_url|htmlspecialchars}</p>
<p><b>抓取起始页面:</b>{$sourceUrlOpened}{$source_url|htmlspecialchars}</p>
<p class="cont_urls_num"></p>
<div class="cont_urls_list">
</div>

View File

@ -25,7 +25,7 @@ body>.wrapper>.content-wrapper{transition:none;}
{/foreach}
</select>
</div>
<div class="input-group-addon test-page-source-post" style="border-left:0;{$urlIsPost?'':'display:none'}">POST</div>
<div class="input-group-addon test-page-opened" style="border-left:0;{$urlOpened?'':'display:none'}">{$urlOpened}</div>
<div class="input-group-btn"><button type="button" class="btn btn-default test-sub">确定</button></div>
</div>
</div>

View File

@ -93,7 +93,7 @@
</div>
<div class="form-group">
<table class="table table-hover c-p-request-headers">
<table class="table table-hover">
<thead>
<tr>
<th class="col-xs-2" style="padding-left:0;">程序操作</th>

View File

@ -0,0 +1,73 @@
{extend name="common:main" /}
{block name="cssjs"}
{/block}
{block name="content"}
{if !$isApp}
<div class="nav-tabs-custom">
<ul class="nav nav-tabs">
<li{$type=='release'?' class="active"':''}><a href="{:url('develop/editor')}">发布插件</a></li>
<li{$type=='func'?' class="active"':''}><a href="{:url('develop/editor?type=func')}">函数插件</a></li>
</ul>
<div class="tab-content">
<div class="tab-pane active">
{if $appList||$diyList}
<ul class="deve-editor-apps">
{if $appList}
{foreach $appList as $k=>$v}
<li><a href="{:url('develop/editor?type='.$type.'&app='.$k)}">{$k}{$v}</a></li>
{/foreach}
{/if}
{if $diyList}
{foreach $diyList as $v}
<li><a href="{:url('develop/editor?type=release&module=diy&app='.$v)}">{$v}(自定义)</a></li>
{/foreach}
{/if}
</ul>
{else /}
无插件
{/if}
</div>
</div>
</div>
{else /}
<script src="__PUBLIC__/static/js/admin/code_editor.js?{$Think.config.html_v}"></script>
<div class="row" id="deve_editor_main">
<div class="col-sm-8 col-md-9 deve-editor-left">
<textarea id="code_editor_txt" style="display:none;">{$appcode?htmlspecialchars($appcode):''}</textarea>
<div id="code_editor_box"><iframe id="code_editor_ifr" style="width:100%;height:100%;border:0;"></iframe></div>
<button type="submit" id="btn_editor_save" class="btn btn-default btn-block" style="margin:0;margin-top:12px;">修改插件</button>
</div>
<div class="col-sm-4 col-md-3 deve-editor-right">
<div class="nav-tabs-custom deve-editor-apps-nav">
<ul class="nav nav-tabs">
<li{$type=='release'?' class="active"':''}><a href="{:url('develop/editor')}">发布插件</a></li>
<li{$type=='func'?' class="active"':''}><a href="{:url('develop/editor?type=func')}">函数插件</a></li>
</ul>
<div class="tab-content">
<div class="tab-pane active">
{if $appList||$diyList}
<ul class="deve-editor-apps">
{if $appList}
{foreach $appList as $k=>$v}
<li{if $k==$app} class="cur"{/if}><a href="{:url('develop/editor?type='.$type.'&app='.$k)}">{$k}{$v}</a></li>
{/foreach}
{/if}
{if $diyList}
{foreach $diyList as $v}
<li{if $v==$app} class="cur"{/if}><a href="{:url('develop/editor?type=release&module=diy&app='.$v)}">{$v}(自定义)</a></li>
{/foreach}
{/if}
</ul>
{else /}
无插件
{/if}
</div>
</div>
</div>
</div>
</div>
<script type="text/javascript">
codeEditorClass.init_deve({$config|json_encode});
</script>
{/if}
{/block}

Some files were not shown because too many files have changed in this diff Show More