From caacd7342575d1ce4e7b5eabe7936c584082b67d Mon Sep 17 00:00:00 2001 From: zhaoxiang <756958008@qq.com> Date: Fri, 23 Jun 2017 14:34:35 +0800 Subject: [PATCH] =?UTF-8?q?added=20ApiAdmin=E6=B7=BB=E5=8A=A0=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E9=AA=8C=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controller/LoginController.class.php | 7 + .../VerificationController.class.php | 30 ++ Application/Admin/View/Login/index.html | 70 ++++- Public/js/gt.js | 277 ++++++++++++++++++ 4 files changed, 383 insertions(+), 1 deletion(-) create mode 100644 Application/Admin/Controller/VerificationController.class.php create mode 100644 Public/js/gt.js diff --git a/Application/Admin/Controller/LoginController.class.php b/Application/Admin/Controller/LoginController.class.php index 9c27085..6099839 100644 --- a/Application/Admin/Controller/LoginController.class.php +++ b/Application/Admin/Controller/LoginController.class.php @@ -16,6 +16,13 @@ class LoginController extends BaseController { public function login() { $pass = user_md5(I('post.password')); $user = I('post.username'); + + $challenge = I('post.geetest_challenge'); + $validate = I('post.geetest_validate'); + if(!$challenge || md5($challenge) != $validate){ + $this->ajaxError('请先通过验证!'); + } + $userInfo = D('ApiUser')->where(array('username' => $user, 'password' => $pass))->find(); if (!empty($userInfo)) { if ($userInfo['status']) { diff --git a/Application/Admin/Controller/VerificationController.class.php b/Application/Admin/Controller/VerificationController.class.php new file mode 100644 index 0000000..2c06a1e --- /dev/null +++ b/Application/Admin/Controller/VerificationController.class.php @@ -0,0 +1,30 @@ + + */ + +namespace Admin\Controller; + + +use Think\Controller; + +class VerificationController extends Controller { + + private $gt_captcha_id = 'YourID'; + private $gt_private_key = 'YourKey'; + + public function gt(){ + $rnd1 = md5(rand(0, 100)); + $rnd2 = md5(rand(0, 100)); + $challenge = $rnd1 . substr($rnd2, 0, 2); + $result = array( + 'success' => 0, + 'gt' => $this->gt_captcha_id, + 'challenge' => $challenge, + 'new_captcha'=>1 + ); + $this->ajaxReturn($result); + } +} \ No newline at end of file diff --git a/Application/Admin/View/Login/index.html b/Application/Admin/View/Login/index.html index 2afd9df..13ffa61 100644 --- a/Application/Admin/View/Login/index.html +++ b/Application/Admin/View/Login/index.html @@ -1,4 +1,3 @@ - @@ -52,6 +51,33 @@ .login-box .version{ font-size: 12px; } + .inp { + border: 1px solid gray; + padding: 0 10px; + width: 200px; + height: 30px; + font-size: 18px; + } + .btn { + border: 1px solid gray; + width: 100px; + height: 30px; + font-size: 18px; + cursor: pointer; + } + #embed-captcha { + width: 300px; + margin: 0 auto; + } + .show { + display: block; + } + .hide { + display: none; + } + #notice { + color: red; + } @@ -73,6 +99,13 @@ +
+
+
+

正在加载验证码......

+

请先完成验证

+
+
@@ -80,6 +113,8 @@
+ + + \ No newline at end of file diff --git a/Public/js/gt.js b/Public/js/gt.js new file mode 100644 index 0000000..e5c8569 --- /dev/null +++ b/Public/js/gt.js @@ -0,0 +1,277 @@ +/* initGeetest 1.0.0 + * 用于加载id对应的验证码库,并支持宕机模式 + * 暴露 initGeetest 进行验证码的初始化 + * 一般不需要用户进行修改 + */ +(function (global, factory) { + "use strict"; + if (typeof module === "object" && typeof module.exports === "object") { + // CommonJS + module.exports = global.document ? + factory(global, true) : + function (w) { + if (!w.document) { + throw new Error("Geetest requires a window with a document"); + } + return factory(w); + }; + } else { + factory(global); + } +})(typeof window !== "undefined" ? window : this, function (window, noGlobal) { + "use strict"; + if (typeof window === 'undefined') { + throw new Error('Geetest requires browser environment'); + } + var document = window.document; + var Math = window.Math; + var head = document.getElementsByTagName("head")[0]; + + function _Object(obj) { + this._obj = obj; + } + + _Object.prototype = { + _each: function (process) { + var _obj = this._obj; + for (var k in _obj) { + if (_obj.hasOwnProperty(k)) { + process(k, _obj[k]); + } + } + return this; + } + }; + function Config(config) { + var self = this; + new _Object(config)._each(function (key, value) { + self[key] = value; + }); + } + + Config.prototype = { + api_server: 'api.geetest.com', + protocol: 'http://', + type_path: '/gettype.php', + fallback_config: { + slide: { + static_servers: ["static.geetest.com", "dn-staticdown.qbox.me"], + type: 'slide', + slide: '/static/js/geetest.0.0.0.js' + }, + fullpage: { + static_servers: ["static.geetest.com", "dn-staticdown.qbox.me"], + type: 'fullpage', + fullpage: '/static/js/fullpage.0.0.0.js' + } + }, + _get_fallback_config: function () { + var self = this; + if (isString(self.type)) { + return self.fallback_config[self.type]; + } else if (self.new_captcha) { + return self.fallback_config.fullpage; + } else { + return self.fallback_config.slide; + } + }, + _extend: function (obj) { + var self = this; + new _Object(obj)._each(function (key, value) { + self[key] = value; + }) + } + }; + var isNumber = function (value) { + return (typeof value === 'number'); + }; + var isString = function (value) { + return (typeof value === 'string'); + }; + var isBoolean = function (value) { + return (typeof value === 'boolean'); + }; + var isObject = function (value) { + return (typeof value === 'object' && value !== null); + }; + var isFunction = function (value) { + return (typeof value === 'function'); + }; + var callbacks = {}; + var status = {}; + var random = function () { + return parseInt(Math.random() * 10000) + (new Date()).valueOf(); + }; + var loadScript = function (url, cb) { + var script = document.createElement("script"); + script.charset = "UTF-8"; + script.async = true; + script.onerror = function () { + cb(true); + }; + var loaded = false; + script.onload = script.onreadystatechange = function () { + if (!loaded && + (!script.readyState || + "loaded" === script.readyState || + "complete" === script.readyState)) { + + loaded = true; + setTimeout(function () { + cb(false); + }, 0); + } + }; + script.src = url; + head.appendChild(script); + }; + var normalizeDomain = function (domain) { + return domain.replace(/^https?:\/\/|\/$/g, ''); + }; + var normalizePath = function (path) { + path = path.replace(/\/+/g, '/'); + if (path.indexOf('/') !== 0) { + path = '/' + path; + } + return path; + }; + var normalizeQuery = function (query) { + if (!query) { + return ''; + } + var q = '?'; + new _Object(query)._each(function (key, value) { + if (isString(value) || isNumber(value) || isBoolean(value)) { + q = q + encodeURIComponent(key) + '=' + encodeURIComponent(value) + '&'; + } + }); + if (q === '?') { + q = ''; + } + return q.replace(/&$/, ''); + }; + var makeURL = function (protocol, domain, path, query) { + domain = normalizeDomain(domain); + + var url = normalizePath(path) + normalizeQuery(query); + if (domain) { + url = protocol + domain + url; + } + + return url; + }; + var load = function (protocol, domains, path, query, cb) { + var tryRequest = function (at) { + + var url = makeURL(protocol, domains[at], path, query); + loadScript(url, function (err) { + if (err) { + if (at >= domains.length - 1) { + cb(true); + } else { + tryRequest(at + 1); + } + } else { + cb(false); + } + }); + }; + tryRequest(0); + }; + var jsonp = function (domains, path, config, callback) { + if (isObject(config.getLib)) { + config._extend(config.getLib); + callback(config); + return; + } + if (config.offline) { + callback(config._get_fallback_config()); + return; + } + var cb = "geetest_" + random(); + window[cb] = function (data) { + if (data.status === 'success') { + callback(data.data); + } else if (!data.status) { + callback(data); + } else { + callback(config._get_fallback_config()); + } + window[cb] = undefined; + try { + delete window[cb]; + } catch (e) { + } + }; + load(config.protocol, domains, path, { + gt: config.gt, + callback: cb + }, function (err) { + if (err) { + callback(config._get_fallback_config()); + } + }); + }; + var throwError = function (errorType, config) { + var errors = { + networkError: '网络错误' + }; + if (typeof config.onError === 'function') { + config.onError(errors[errorType]); + } else { + throw new Error(errors[errorType]); + } + }; + var detect = function () { + return !!window.Geetest; + }; + if (detect()) { + status.slide = "loaded"; + } + var initGeetest = function (userConfig, callback) { + var config = new Config(userConfig); + if (userConfig.https) { + config.protocol = 'https://'; + } else if (!userConfig.protocol) { + config.protocol = window.location.protocol + '//'; + } + jsonp([config.api_server || config.apiserver], config.type_path, config, function (newConfig) { + var type = newConfig.type; + var init = function () { + config._extend(newConfig); + callback(new window.Geetest(config)); + }; + callbacks[type] = callbacks[type] || []; + var s = status[type] || 'init'; + if (s === 'init') { + status[type] = 'loading'; + callbacks[type].push(init); + load(config.protocol, newConfig.static_servers || newConfig.domains, newConfig[type] || newConfig.path, null, function (err) { + if (err) { + status[type] = 'fail'; + throwError('networkError', config); + } else { + status[type] = 'loaded'; + var cbs = callbacks[type]; + for (var i = 0, len = cbs.length; i < len; i = i + 1) { + var cb = cbs[i]; + if (isFunction(cb)) { + cb(); + } + } + callbacks[type] = []; + } + }); + } else if (s === "loaded") { + init(); + } else if (s === "fail") { + throwError('networkError', config); + } else if (s === "loading") { + callbacks[type].push(init); + } + }); + }; + window.initGeetest = initGeetest; + return initGeetest; +}); +