From 1a68cddd1cdc709affa4daa583eae239f706b82c Mon Sep 17 00:00:00 2001 From: tensent Date: Sun, 19 Apr 2020 21:03:28 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=AC=AC=E4=B8=89=E6=96=B9?= =?UTF-8?q?=E7=99=BB=E5=BD=95=E6=8F=92=E4=BB=B6=E6=89=A9=E5=B1=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- addons/syslogin/Plugin.php | 20 ++-- addons/syslogin/config.php | 6 ++ addons/syslogin/controller/Index.php | 62 +++++++++-- addons/syslogin/model/SyncLogin.php | 16 +++ addons/syslogin/service/Application.php | 67 ++++++++++++ addons/syslogin/service/Qq.php | 132 ++++++++++++++++++++++++ addons/syslogin/service/Service.php | 87 ++++++++++++++++ addons/syslogin/service/Wechat.php | 122 ++++++++++++++++++++++ addons/syslogin/service/Weibo.php | 114 ++++++++++++++++++++ addons/syslogin/view/index/bind.html | 79 ++++++++++++++ addons/syslogin/view/index/login.html | 1 - addons/syslogin/view/login.html | 5 +- app/controller/Base.php | 48 +++++---- app/controller/admin/Addons.php | 5 +- app/http/form/template/fieldlist.html | 2 +- app/model/Model.php | 3 +- public/static/common/js/require-form.js | 14 ++- view/addon/front.html | 63 +++++++++++ 18 files changed, 793 insertions(+), 53 deletions(-) create mode 100644 addons/syslogin/config.php create mode 100644 addons/syslogin/model/SyncLogin.php create mode 100644 addons/syslogin/service/Application.php create mode 100644 addons/syslogin/service/Qq.php create mode 100644 addons/syslogin/service/Service.php create mode 100644 addons/syslogin/service/Wechat.php create mode 100644 addons/syslogin/service/Weibo.php create mode 100644 addons/syslogin/view/index/bind.html delete mode 100644 addons/syslogin/view/index/login.html create mode 100644 view/addon/front.html diff --git a/addons/syslogin/Plugin.php b/addons/syslogin/Plugin.php index 0f1acbb1..29f8f23c 100644 --- a/addons/syslogin/Plugin.php +++ b/addons/syslogin/Plugin.php @@ -13,26 +13,26 @@ namespace addons\syslogin; * @author thinkphp */ -class Plugin extends \sent\Addons{ +class Plugin extends \sent\Addons { public $info = array( - 'name'=>'Syslogin', - 'title'=>'第三方登录', - 'description'=>'第三方登录', - 'status'=>1, - 'author'=>'molong', - 'version'=>'0.1' + 'name' => 'Syslogin', + 'title' => '第三方登录', + 'description' => '第三方登录', + 'status' => 1, + 'author' => 'molong', + 'version' => '0.1', ); - public function loginBottomAddon(){ + public function loginBottomAddon() { return $this->fetch('login'); } - public function install(){ + public function install() { return true; } - public function uninstall(){ + public function uninstall() { return true; } } \ No newline at end of file diff --git a/addons/syslogin/config.php b/addons/syslogin/config.php new file mode 100644 index 00000000..78301134 --- /dev/null +++ b/addons/syslogin/config.php @@ -0,0 +1,6 @@ + ['title' => 'QQ', 'name' => 'qq', 'type' => 'fieldlist', 'value' => ['app_id' => '', 'app_secret' => '', 'callback' => '/', 'code' => '', 'scope' => '']], + 'wechat' => ['title' => 'Wechat', 'name' => 'wechat', 'type' => 'fieldlist', 'value' => ['app_id' => '', 'app_secret' => '', 'callback' => '/', 'scope' => '']], + 'weibo' => ['title' => 'Weibo', 'name' => 'weibo', 'type' => 'fieldlist', 'value' => ['app_id' => '', 'app_secret' => '', 'callback' => '/']], +]; \ No newline at end of file diff --git a/addons/syslogin/controller/Index.php b/addons/syslogin/controller/Index.php index 12aa7c3f..f9f2ac61 100644 --- a/addons/syslogin/controller/Index.php +++ b/addons/syslogin/controller/Index.php @@ -9,12 +9,60 @@ namespace addons\syslogin\controller; -class Index extends \app\controller\front\Base{ - - public function login(){ - } +use addons\syslogin\model\SyncLogin; +use think\facade\Session; - public function callback(){ - - } +class Index extends \app\controller\front\Base { + + public function login() { + $config = $this->getAddonsConfig(); + foreach ($config as $key => $value) { + $config[$key] = json_decode($value, true); + } + $app = new \addons\syslogin\service\Application($config); + $platform = $this->request->param('platform'); + return $this->redirect($app->$platform->getAuthorizeUrl()); + } + + public function callback() { + $code = $this->request->param('code'); + if (!$code) { + return $this->error("非法操作!"); + } + $config = $this->getAddonsConfig(); + foreach ($config as $key => $value) { + $config[$key] = json_decode($value, true); + } + $app = new \addons\syslogin\service\Application($config); + $platform = $this->request->param('platform', 'wechat'); + $userInfo = $app->$platform->getUserInfo(); + + Session::set("{$platform}-userinfo", $userInfo); + $sync = SyncLogin::where(['platform' => $platform, 'openid' => $userInfo['openid']])->find(); + if ($sync) { + if ($sync['uid']) { + //已绑定用户直接登录 + SyncLogin::login($userInfo); + } else { + //未绑定用户跳转绑定用户 + return $this->redirect('/addons/syslogin/index/bind/platform/' . $platform); + } + } else { + SyncLogin::register($userInfo); + //未绑定用户跳转绑定用户 + return $this->redirect('/addons/syslogin/index/bind/platform/' . $platform); + } + } + + public function bind() { + $platform = $this->request->param('platform', 'wechat'); + + $userinfo = Session::get("{$platform}-userinfo"); + + $this->data = [ + 'userinfo' => $userinfo['userinfo'], + 'platform' => $platform, + ]; + return $this->fetch(); + } } diff --git a/addons/syslogin/model/SyncLogin.php b/addons/syslogin/model/SyncLogin.php new file mode 100644 index 00000000..f0453686 --- /dev/null +++ b/addons/syslogin/model/SyncLogin.php @@ -0,0 +1,16 @@ + 'Qq', + 'weibo' => 'Weibo', + 'wechat' => 'Wechat', + ]; + + /** + * 服务对象信息 + * @var array + */ + protected $services = []; + + public function __construct($options = []) + { + $options = array_intersect_key($options, $this->providers); + $options = array_merge($this->config, is_array($options) ? $options : []); + foreach ($options as $key => &$option) { + $option['app_id'] = isset($option['app_id']) ? $option['app_id'] : ''; + $option['app_secret'] = isset($option['app_secret']) ? $option['app_secret'] : ''; + // 如果未定义回调地址则自动生成 + $option['callback'] = isset($option['callback']) && $option['callback'] ? $option['callback'] : addon_url('syslogin/index/callback', [':platform' => $key], false, true); + } + $this->config = $options; + //注册服务器提供者 + $this->registerProviders(); + } + + /** + * 注册服务提供者 + */ + private function registerProviders() + { + foreach ($this->providers as $k => $v) { + $this->services[$k] = function () use ($k, $v) { + $options = $this->config[$k]; + $objname = __NAMESPACE__ . "\\{$v}"; + return new $objname($options); + }; + } + } + + public function __set($key, $value) + { + $this->services[$key] = $value; + } + + public function __get($key) + { + return isset($this->services[$key]) ? $this->services[$key]($this) : null; + } +} diff --git a/addons/syslogin/service/Qq.php b/addons/syslogin/service/Qq.php new file mode 100644 index 00000000..30d77e7f --- /dev/null +++ b/addons/syslogin/service/Qq.php @@ -0,0 +1,132 @@ +config = array_merge($this->config, $config); + } + $this->config = array_merge($this->config, is_array($options) ? $options : []); + } + + /** + * 登陆 + */ + public function login() { + header("Location:" . $this->getAuthorizeUrl()); + } + + /** + * 获取authorize_url + */ + public function getAuthorizeUrl() { + $state = md5(uniqid(rand(), true)); + Session::set('state', $state); + $queryarr = array( + "response_type" => "code", + "client_id" => $this->config['app_id'], + "redirect_uri" => $this->config['callback'], + "scope" => $this->config['scope'], + "state" => $state, + ); + request()->isMobile() && $queryarr['display'] = 'mobile'; + $url = self::GET_AUTH_CODE_URL . '?' . http_build_query($queryarr); + return $url; + } + + /** + * 获取用户信息 + * @param array $params + * @return array + */ + public function getUserInfo($params = []) { + $params = $params ? $params : $_GET; + if (isset($params['access_token']) || (isset($params['state']) && $params['state'] == Session::get('state') && isset($params['code']))) { + //获取access_token + $data = isset($params['code']) ? $this->getAccessToken($params['code']) : $params; + $access_token = isset($data['access_token']) ? $data['access_token'] : ''; + $refresh_token = isset($data['refresh_token']) ? $data['refresh_token'] : ''; + $expires_in = isset($data['expires_in']) ? $data['expires_in'] : 0; + if ($access_token) { + $openid = $this->getOpenId($access_token); + //获取用户信息 + $queryarr = [ + "access_token" => $access_token, + "oauth_consumer_key" => $this->config['app_id'], + "openid" => $openid, + ]; + $ret = Http::get(self::GET_USERINFO_URL, $queryarr); + $userinfo = (array) json_decode($ret, true); + if (!$userinfo || !isset($userinfo['ret']) || $userinfo['ret'] !== 0) { + return []; + } + $userinfo = $userinfo ? $userinfo : []; + $userinfo['avatar'] = isset($userinfo['figureurl_qq_2']) ? $userinfo['figureurl_qq_2'] : ''; + $data = [ + 'access_token' => $access_token, + 'refresh_token' => $refresh_token, + 'expires_in' => $expires_in, + 'openid' => $openid, + 'userinfo' => $userinfo, + ]; + return $data; + } + } + return []; + } + + /** + * 获取access_token + * @param string $code + * @return array + */ + public function getAccessToken($code = '') { + if (!$code) { + return []; + } + $queryarr = array( + "grant_type" => "authorization_code", + "client_id" => $this->config['app_id'], + "client_secret" => $this->config['app_secret'], + "redirect_uri" => $this->config['callback'], + "code" => $code, + ); + $ret = Http::get(self::GET_ACCESS_TOKEN_URL, $queryarr); + $params = []; + parse_str($ret, $params); + return $params ? $params : []; + } + + /** + * 获取open_id + * @param string $access_token + * @return string + */ + private function getOpenId($access_token = '') { + $response = Http::get(self::GET_OPENID_URL, ['access_token' => $access_token]); + if (strpos($response, "callback") !== false) { + $lpos = strpos($response, "("); + $rpos = strrpos($response, ")"); + $response = substr($response, $lpos + 1, $rpos - $lpos - 1); + } + $user = (array) json_decode($response, true); + return isset($user['openid']) ? $user['openid'] : ''; + } +} diff --git a/addons/syslogin/service/Service.php b/addons/syslogin/service/Service.php new file mode 100644 index 00000000..616e7683 --- /dev/null +++ b/addons/syslogin/service/Service.php @@ -0,0 +1,87 @@ + $platform, + 'openid' => $params['openid'], + 'openname' => isset($params['userinfo']['nickname']) ? $params['userinfo']['nickname'] : '', + 'access_token' => $params['access_token'], + 'refresh_token' => $params['refresh_token'], + 'expires_in' => $params['expires_in'], + 'logintime' => $time, + 'expiretime' => $time + $params['expires_in'], + ]; + $auth = \app\common\library\Auth::instance(); + + $auth->keeptime($keeptime); + $third = Third::get(['platform' => $platform, 'openid' => $params['openid']]); + if ($third) { + $user = User::get($third['user_id']); + if (!$user) { + return false; + } + $third->save($values); + return $auth->direct($user->id); + } else { + // 先随机一个用户名,随后再变更为u+数字id + $username = Random::alnum(20); + $password = Random::alnum(6); + $domain = request()->host(); + + Db::startTrans(); + try { + // 默认注册一个会员 + $result = $auth->register($username, $password, $username . '@' . $domain, '', $extend, $keeptime); + if (!$result) { + return false; + } + $user = $auth->getUser(); + $fields = ['username' => 'u' . $user->id, 'email' => 'u' . $user->id . '@' . $domain]; + if (isset($params['userinfo']['nickname'])) { + $fields['nickname'] = $params['userinfo']['nickname']; + } + if (isset($params['userinfo']['avatar'])) { + $fields['avatar'] = htmlspecialchars(strip_tags($params['userinfo']['avatar'])); + } + + // 更新会员资料 + $user = User::get($user->id); + $user->save($fields); + + // 保存第三方信息 + $values['user_id'] = $user->id; + Third::create($values); + Db::commit(); + } catch (PDOException $e) { + Db::rollback(); + $auth->logout(); + return false; + } + + // 写入登录Cookies和Token + return $auth->direct($user->id); + } + } +} diff --git a/addons/syslogin/service/Wechat.php b/addons/syslogin/service/Wechat.php new file mode 100644 index 00000000..ad97b48e --- /dev/null +++ b/addons/syslogin/service/Wechat.php @@ -0,0 +1,122 @@ +config = array_merge($this->config, $config); + } + $this->config = array_merge($this->config, is_array($options) ? $options : []); + } + + /** + * 登陆 + */ + public function login() { + header("Location:" . $this->getAuthorizeUrl()); + } + + /** + * 获取authorize_url + */ + public function getAuthorizeUrl() { + $state = md5(uniqid(rand(), true)); + Session::set('state', $state); + $queryarr = array( + "appid" => $this->config['app_id'], + "redirect_uri" => $this->config['callback'], + "response_type" => "code", + "scope" => $this->config['scope'], + "state" => $state, + ); + request()->isMobile() && $queryarr['display'] = 'mobile'; + $url = self::GET_AUTH_CODE_URL . '?' . http_build_query($queryarr) . '#wechat_redirect'; + return $url; + } + + /** + * 获取用户信息 + * @param array $params + * @return array + */ + public function getUserInfo($params = []) { + $params = $params ? $params : request()->get(); + if (isset($params['access_token']) || (isset($params['state']) && $params['state'] == Session::get('state') && isset($params['code']))) { + //获取access_token + $data = isset($params['code']) ? $this->getAccessToken($params['code']) : $params; + $access_token = isset($data['access_token']) ? $data['access_token'] : ''; + $refresh_token = isset($data['refresh_token']) ? $data['refresh_token'] : ''; + $expires_in = isset($data['expires_in']) ? $data['expires_in'] : 0; + if ($access_token) { + $openid = isset($data['openid']) ? $data['openid'] : ''; + $unionid = isset($data['unionid']) ? $data['unionid'] : ''; + if (stripos($this->config['scope'], 'snsapi_userinfo') !== false) { + //获取用户信息 + $queryarr = [ + "access_token" => $access_token, + "openid" => $openid, + "lang" => 'zh_CN', + ]; + $client = new \GuzzleHttp\Client(); + $ret = $client->post(self::GET_USERINFO_URL, ['form_params' => $queryarr])->getBody()->getContents(); + $userinfo = (array) json_decode($ret, true); + if (!$userinfo || isset($userinfo['errcode'])) { + return []; + } + $userinfo = $userinfo ? $userinfo : []; + $userinfo['avatar'] = isset($userinfo['headimgurl']) ? $userinfo['headimgurl'] : ''; + } else { + $userinfo = []; + } + $data = [ + 'access_token' => $access_token, + 'refresh_token' => $refresh_token, + 'expires_in' => $expires_in, + 'openid' => $openid, + 'unionid' => $unionid, + 'userinfo' => $userinfo, + ]; + return $data; + } + } + return []; + } + + /** + * 获取access_token + * @param string code + * @return array + */ + public function getAccessToken($code = '') { + if (!$code) { + return []; + } + $queryarr = array( + "appid" => $this->config['app_id'], + "secret" => $this->config['app_secret'], + "code" => $code, + "grant_type" => "authorization_code", + ); + $client = new \GuzzleHttp\Client(); + $response = $client->post(self::GET_ACCESS_TOKEN_URL, ['form_params' => $queryarr])->getBody()->getContents(); + $ret = (array) json_decode($response, true); + return $ret ? $ret : []; + } +} diff --git a/addons/syslogin/service/Weibo.php b/addons/syslogin/service/Weibo.php new file mode 100644 index 00000000..b38a8312 --- /dev/null +++ b/addons/syslogin/service/Weibo.php @@ -0,0 +1,114 @@ +config = array_merge($this->config, $config); + } + $this->config = array_merge($this->config, is_array($options) ? $options : []); + } + + /** + * 登陆 + */ + public function login() { + header("Location:" . $this->getAuthorizeUrl()); + } + + /** + * 获取authorize_url + */ + public function getAuthorizeUrl() { + $state = md5(uniqid(rand(), true)); + Session::set('state', $state); + $queryarr = array( + "response_type" => "code", + "client_id" => $this->config['app_id'], + "redirect_uri" => $this->config['callback'], + "state" => $state, + ); + request()->isMobile() && $queryarr['display'] = 'mobile'; + $url = self::GET_AUTH_CODE_URL . '?' . http_build_query($queryarr); + return $url; + } + + /** + * 获取用户信息 + * @param array $params + * @return array + */ + public function getUserInfo($params = []) { + $params = $params ? $params : $_GET; + if (isset($params['access_token']) || (isset($params['state']) && $params['state'] == Session::get('state') && isset($params['code']))) { + //获取access_token + $data = isset($params['code']) ? $this->getAccessToken($params['code']) : $params; + $access_token = isset($data['access_token']) ? $data['access_token'] : ''; + $refresh_token = isset($data['refresh_token']) ? $data['refresh_token'] : ''; + $expires_in = isset($data['expires_in']) ? $data['expires_in'] : 0; + if ($access_token) { + $uid = isset($data['uid']) ? $data['uid'] : ''; + //获取用户信息 + $queryarr = [ + "access_token" => $access_token, + "uid" => $uid, + ]; + $ret = Http::get(self::GET_USERINFO_URL, $queryarr); + $userinfo = (array) json_decode($ret, true); + if (!$userinfo || isset($userinfo['error_code'])) { + return []; + } + $userinfo = $userinfo ? $userinfo : []; + $userinfo['nickname'] = isset($userinfo['screen_name']) ? $userinfo['screen_name'] : ''; + $userinfo['avatar'] = isset($userinfo['profile_image_url']) ? $userinfo['profile_image_url'] : ''; + $data = [ + 'access_token' => $access_token, + 'refresh_token' => $refresh_token, + 'expires_in' => $expires_in, + 'openid' => $uid, + 'userinfo' => $userinfo, + ]; + return $data; + } + } + return []; + } + + /** + * 获取access_token + * @param string code + * @return array + */ + public function getAccessToken($code = '') { + if (!$code) { + return ''; + } + $queryarr = array( + "grant_type" => "authorization_code", + "client_id" => $this->config['app_id'], + "client_secret" => $this->config['app_secret'], + "redirect_uri" => $this->config['callback'], + "code" => $code, + ); + $response = Http::post(self::GET_ACCESS_TOKEN_URL, $queryarr); + $ret = (array) json_decode($response, true); + return $ret ? $ret : []; + } +} diff --git a/addons/syslogin/view/index/bind.html b/addons/syslogin/view/index/bind.html new file mode 100644 index 00000000..9598a9eb --- /dev/null +++ b/addons/syslogin/view/index/bind.html @@ -0,0 +1,79 @@ +{extend name="../../../view/addon/front" /} +{block name="body"} +
+ +
{$userinfo.nickname}
+
+ +{/block} +{block name="script"} + + +{/block} \ No newline at end of file diff --git a/addons/syslogin/view/index/login.html b/addons/syslogin/view/index/login.html deleted file mode 100644 index 62ec5348..00000000 --- a/addons/syslogin/view/index/login.html +++ /dev/null @@ -1 +0,0 @@ -登录 \ No newline at end of file diff --git a/addons/syslogin/view/login.html b/addons/syslogin/view/login.html index ad194a26..29f8c459 100644 --- a/addons/syslogin/view/login.html +++ b/addons/syslogin/view/login.html @@ -3,6 +3,7 @@ .third-login li{list-style: none;} \ No newline at end of file diff --git a/app/controller/Base.php b/app/controller/Base.php index 901c54bd..42a99ae1 100644 --- a/app/controller/Base.php +++ b/app/controller/Base.php @@ -8,16 +8,15 @@ // +---------------------------------------------------------------------- namespace app\controller; -use think\App; -use think\exception\ValidateException; -use think\facade\View; -use think\facade\Cache; -use think\facade\Route; -use think\facade\Event; -use think\Validate; use app\model\Config; use app\model\Hooks; use app\model\SeoRule; +use think\App; +use think\exception\ValidateException; +use think\facade\Cache; +use think\facade\Event; +use think\facade\View; +use think\Validate; class Base { @@ -78,7 +77,7 @@ class Base { $hooks = Cache::get('sentcms_hooks'); if (!$hooks) { $hooks = Hooks::where('status', 1)->column('addons', 'name'); - foreach($hooks as $key => $values){ + foreach ($hooks as $key => $values) { if (is_string($values)) { $values = explode(',', $values); } else { @@ -95,7 +94,6 @@ class Base { Event::listenEvents($hooks); } - View::assign('version', \think\facade\Env::get('VERSION')); View::assign('config', $this->config); // 控制器初始化 @@ -142,19 +140,20 @@ class Base { } protected function fetch($template = '') { - if($this->request->param('addon')){ + if ($this->request->param('addon')) { $this->tpl_config['view_dir_name'] = 'addons' . DIRECTORY_SEPARATOR . $this->request->param('addon') . DIRECTORY_SEPARATOR . 'view'; } View::config($this->tpl_config); View::assign($this->data); return View::fetch($template); } - + /** * 是否为手机访问 * @return boolean [description] */ - public function isMobile() {//return true; + public function isMobile() { +//return true; // 如果有HTTP_X_WAP_PROFILE则一定是移动设备 if (isset($_SERVER['HTTP_X_WAP_PROFILE'])) { return true; @@ -200,14 +199,14 @@ class Base { if (class_exists($class)) { $reflection = new \ReflectionClass($class); $group_doc = $this->Parser($reflection->getDocComment()); - if(isset($group_doc['title'])){ + if (isset($group_doc['title'])) { $mate = $group_doc['title']; } - $method = $reflection->getMethods(\ReflectionMethod::IS_FINAL | \ReflectionMethod::IS_PUBLIC); + $method = $reflection->getMethods(\ReflectionMethod::IS_FINAL | \ReflectionMethod::IS_PUBLIC); foreach ($method as $key => $v) { - if($action == $v->name){ + if ($action == $v->name) { $title_doc = $this->Parser($v->getDocComment()); - if(isset($title_doc['title'])){ + if (isset($title_doc['title'])) { $mate = $title_doc['title']; } } @@ -223,8 +222,8 @@ class Base { protected function setSeo($title = '', $keywords = '', $description = '') { $seo = array( - 'title' => $title, - 'keywords' => $keywords, + 'title' => $title, + 'keywords' => $keywords, 'description' => $description, ); //获取还没有经过变量替换的META信息 @@ -237,10 +236,19 @@ class Base { } $data = array( - 'title' => $meta['title'], - 'keywords' => $meta['keywords'], + 'title' => $meta['title'], + 'keywords' => $meta['keywords'], 'description' => $meta['description'], ); View::assign('seo', $data); } + + protected function getAddonsConfig() { + $config = []; + $addons = $this->request->param('addon'); + $addon = get_addons_instance($addons)->getConfig(); + $config = \app\model\Addons::where('name', $addons)->value('config'); + + return $config ? json_decode($config, true) : $addon; + } } diff --git a/app/controller/admin/Addons.php b/app/controller/admin/Addons.php index 8c9f7d7f..da0ab317 100644 --- a/app/controller/admin/Addons.php +++ b/app/controller/admin/Addons.php @@ -120,7 +120,7 @@ class Addons extends Base { if ($this->request->isPost()) { $config = $this->request->post(); $id = $this->request->param('id'); - + $result = AddonsM::update(['config' => $config], ['id' => $id]); if ($result) { return $this->success('完成设置!'); @@ -138,8 +138,9 @@ class Addons extends Base { $keyList = $class->getConfig(true); $this->data = array( + 'info' => $info['config'], 'keyList' => $keyList, - 'meta_title' => $info['title'] . " - 设置" + 'meta_title' => $info['title'] . " - 设置", ); return $this->fetch('admin/public/edit'); } else { diff --git a/app/http/form/template/fieldlist.html b/app/http/form/template/fieldlist.html index 28864a2c..b5db7d28 100644 --- a/app/http/form/template/fieldlist.html +++ b/app/http/form/template/fieldlist.html @@ -6,5 +6,5 @@
追加
- + \ No newline at end of file diff --git a/app/model/Model.php b/app/model/Model.php index 43a0af22..3bbec9a5 100644 --- a/app/model/Model.php +++ b/app/model/Model.php @@ -101,9 +101,8 @@ class Model extends \think\Model{ (new Attribute())->where('model_id', $data['id'])->delete(); $db = new \com\Datatable(); if ($db->CheckTable($data['name'])) { - $result = $db->delTable($data['name'])->query(); + $db->delTable($data['name'])->query(); } - return $result; } protected function setAttributeSortAttr($value) { diff --git a/public/static/common/js/require-form.js b/public/static/common/js/require-form.js index 00e00275..5b30955b 100644 --- a/public/static/common/js/require-form.js +++ b/public/static/common/js/require-form.js @@ -398,18 +398,16 @@ define(['jquery', 'bootstrap', 'validator'], function ($, undefined, Validator) return true; } var template = $(this).data("template"); - var json = []; + var json = {}; try { - var d = textarea.val().split(/[\n,]/g); - d.map(function(item, i){ - json.push(item.split(":")) - }) - // json = JSON.parse(textarea.val()); + json = JSON.parse(textarea.val()); } catch (e) { } $.each(json, function (i, j) { - var item = (j.length > 0) ? {key:j[0],value:j[1],other:j[2]} : {key:i,value:j[0]}; - $(".btn-append,.append", container).trigger('click', template ? j : item); + $(".btn-append,.append", container).trigger('click', template ? j : { + key: i, + value: j + }); }); }); }); diff --git a/view/addon/front.html b/view/addon/front.html new file mode 100644 index 00000000..5703b359 --- /dev/null +++ b/view/addon/front.html @@ -0,0 +1,63 @@ + + + + + + +用户中心 + + + + + + + +
+
+ +
+ +
+
+ +
+
+ {block name="body"} +
+
+

+
+
+
+ {/block} +
+
+
+
+ +
+ + Copyright © 2013-2020 SentCMS. All rights + reserved. +
+
+ + +{block name="script"}{/block} + + \ No newline at end of file