From 74c5f0aebf3ec25c57e1806cf05713ef4b0e3247 Mon Sep 17 00:00:00 2001 From: 15090180611 <215509543@qq.com> Date: Fri, 17 Jan 2025 13:59:57 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8E=E5=8F=B0=E8=B0=83=E6=95=B4=20?= =?UTF-8?q?=E6=9C=BA=E6=9E=84=E5=90=8E=E5=8F=B0api=E7=99=BB=E5=BD=95?= =?UTF-8?q?=EF=BC=8C=E6=B3=A8=E5=86=8C=EF=BC=8C=E5=9B=BE=E7=89=87=E4=B8=8A?= =?UTF-8?q?=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/admin/view/command/add.html | 1 + application/admin/view/index/index.html | 2 +- .../common/controller/ManystoreApiBase.php | 8 +- application/common/library/Token.php | 1 + application/config.php | 2 + application/manystore/view/index/index.html | 2 +- application/manystoreapi/controller/Ajax.php | 288 ------------ .../manystoreapi/controller/Attachment.php | 160 +++++++ .../manystoreapi/controller/Common.php | 362 +++++++++++++++ .../manystoreapi/controller/Dashboard.php | 59 --- application/manystoreapi/controller/Index.php | 133 ------ application/manystoreapi/controller/Sms.php | 105 +++++ application/manystoreapi/controller/Token.php | 19 +- application/manystoreapi/controller/User.php | 436 +++++------------- .../manystoreapi/library/ManystoreAuth.php | 36 +- public/assets/css/backend.css | 2 +- public/assets/css/manystore.css | 2 +- 17 files changed, 779 insertions(+), 839 deletions(-) delete mode 100644 application/manystoreapi/controller/Ajax.php create mode 100644 application/manystoreapi/controller/Attachment.php create mode 100644 application/manystoreapi/controller/Common.php delete mode 100644 application/manystoreapi/controller/Dashboard.php delete mode 100644 application/manystoreapi/controller/Index.php create mode 100644 application/manystoreapi/controller/Sms.php diff --git a/application/admin/view/command/add.html b/application/admin/view/command/add.html index 9374529..2180096 100644 --- a/application/admin/view/command/add.html +++ b/application/admin/view/command/add.html @@ -353,6 +353,7 @@ + diff --git a/application/admin/view/index/index.html b/application/admin/view/index/index.html index 8faf400..c6b671a 100644 --- a/application/admin/view/index/index.html +++ b/application/admin/view/index/index.html @@ -4,7 +4,7 @@ {include file="common/meta" /} - +
diff --git a/application/common/controller/ManystoreApiBase.php b/application/common/controller/ManystoreApiBase.php index 4ce72a5..f322177 100644 --- a/application/common/controller/ManystoreApiBase.php +++ b/application/common/controller/ManystoreApiBase.php @@ -249,7 +249,7 @@ class ManystoreApiBase extends Controller /** * 引入后台控制器的traits */ - use \app\manystore\library\traits\Backend; +// use \app\manystore\library\traits\Backend; public function _initialize() { @@ -279,7 +279,7 @@ class ManystoreApiBase extends Controller $this->auth = Auth::instance(); $token = $this->request->server('HTTP_TOKEN', $this->request->request('token', \think\Cookie::get('token'))); - + if(!$token)$token = $this->request->server('HTTP_SHOP_TOKEN',""); // 设置当前请求的URI $this->auth->setRequestUri($path); // 检测是否需要验证登录 @@ -297,7 +297,7 @@ class ManystoreApiBase extends Controller // } // $this->error(__('Please login first'), url('index/login', ['url' => $url])); - $this->error(__('Please login first'), ['errcode'=>30002], 401); + $this->apierror(__('Please login first'), ['errcode'=>30002], 401); } @@ -308,7 +308,7 @@ class ManystoreApiBase extends Controller // 判断控制器和方法判断是否有对应权限 if (!$this->auth->check($path)) { Hook::listen('manystore_nopermission', $this); - $this->error(__('You have no permission'), null, 403); + $this->apierror(__('You have no permission'), null, 403); } } diff --git a/application/common/library/Token.php b/application/common/library/Token.php index dab8709..d0e927d 100644 --- a/application/common/library/Token.php +++ b/application/common/library/Token.php @@ -48,6 +48,7 @@ class Token if (true === $name) { return new $class($options); } + $options = array_merge(Config::get('token'), $options); self::$instance[$name] = new $class($options); } diff --git a/application/config.php b/application/config.php index 8ce2570..42e1f16 100644 --- a/application/config.php +++ b/application/config.php @@ -297,6 +297,8 @@ return [ 'show_submenu' => false, //后台皮肤,为空时表示使用skin-black-blue 'adminskin' => '', + //后台皮肤,为空时表示使用skin-black-blue + 'manystoreskin' => '', //后台是否启用面包屑 'breadcrumb' => false, //是否允许未知来源的插件压缩包 diff --git a/application/manystore/view/index/index.html b/application/manystore/view/index/index.html index c82c71d..5cd786d 100644 --- a/application/manystore/view/index/index.html +++ b/application/manystore/view/index/index.html @@ -4,7 +4,7 @@ {include file="common/meta" /} - +
diff --git a/application/manystoreapi/controller/Ajax.php b/application/manystoreapi/controller/Ajax.php deleted file mode 100644 index 6163ad4..0000000 --- a/application/manystoreapi/controller/Ajax.php +++ /dev/null @@ -1,288 +0,0 @@ -request->filter(['strip_tags', 'htmlspecialchars']); - } - - /** - * 加载语言包 - */ - public function lang() - { - header('Content-Type: application/javascript'); - $controllername = input("controllername"); - //默认只加载了控制器对应的语言名,你还根据控制器名来加载额外的语言包 - $this->loadlang($controllername); - return jsonp(Lang::get(), 200, [], ['json_encode_param' => JSON_FORCE_OBJECT | JSON_UNESCAPED_UNICODE]); - } - - /** - * 上传文件 - */ - public function upload() - { - Config::set('default_return_type', 'json'); - $file = $this->request->file('file'); - if (empty($file)) { - $this->error(__('No file upload or server upload limit exceeded')); - } - - //判断是否已经存在附件 - $sha1 = $file->hash(); - $extparam = $this->request->post(); - - $upload = Config::get('upload'); - - preg_match('/(\d+)(\w+)/', $upload['maxsize'], $matches); - $type = strtolower($matches[2]); - $typeDict = ['b' => 0, 'k' => 1, 'kb' => 1, 'm' => 2, 'mb' => 2, 'gb' => 3, 'g' => 3]; - $size = (int)$upload['maxsize'] * pow(1024, isset($typeDict[$type]) ? $typeDict[$type] : 0); - $fileInfo = $file->getInfo(); - $suffix = strtolower(pathinfo($fileInfo['name'], PATHINFO_EXTENSION)); - $suffix = $suffix && preg_match("/^[a-zA-Z0-9]+$/", $suffix) ? $suffix : 'file'; - $fileInfo['suffix'] = $suffix; - - $mimetypeArr = explode(',', strtolower($upload['mimetype'])); - $typeArr = explode('/', $fileInfo['type']); - - //禁止上传PHP和HTML文件 - if (in_array($fileInfo['type'], ['text/x-php', 'text/html']) || in_array($suffix, ['php', 'html', 'htm', 'phar', 'phtml']) || preg_match("/^php(.*)/i", $fileInfo['suffix'])) { - $this->error(__('Uploaded file format is limited')); - } - - //Mimetype值不正确 - if (stripos($fileInfo['type'], '/') === false) { - $this->error(__('Uploaded file format is limited')); - } - - //验证文件后缀 - if ($upload['mimetype'] !== '*' && - ( - !in_array($suffix, $mimetypeArr) - || (stripos($typeArr[0] . '/', $upload['mimetype']) !== false && (!in_array($fileInfo['type'], $mimetypeArr) && !in_array($typeArr[0] . '/*', $mimetypeArr))) - ) - ) { - $this->error(__('Uploaded file format is limited')); - } - //验证是否为图片文件 - $imagewidth = $imageheight = 0; - if (in_array($fileInfo['type'], ['image/gif', 'image/jpg', 'image/jpeg', 'image/bmp', 'image/png', 'image/webp']) || in_array($suffix, ['gif', 'jpg', 'jpeg', 'bmp', 'png', 'webp'])) { - $imgInfo = getimagesize($fileInfo['tmp_name']); - if (!$imgInfo || !isset($imgInfo[0]) || !isset($imgInfo[1])) { - $this->error(__('Uploaded file is not a valid image')); - } - $imagewidth = isset($imgInfo[0]) ? $imgInfo[0] : $imagewidth; - $imageheight = isset($imgInfo[1]) ? $imgInfo[1] : $imageheight; - } - $replaceArr = [ - '{year}' => date("Y"), - '{mon}' => date("m"), - '{day}' => date("d"), - '{hour}' => date("H"), - '{min}' => date("i"), - '{sec}' => date("s"), - '{random}' => Random::alnum(16), - '{random32}' => Random::alnum(32), - '{filename}' => $suffix ? substr($fileInfo['name'], 0, strripos($fileInfo['name'], '.')) : $fileInfo['name'], - '{suffix}' => $suffix, - '{.suffix}' => $suffix ? '.' . $suffix : '', - '{filemd5}' => md5_file($fileInfo['tmp_name']), - ]; - $savekey = $upload['savekey']; - $savekey = str_replace(array_keys($replaceArr), array_values($replaceArr), $savekey); - - $uploadDir = substr($savekey, 0, strripos($savekey, '/') + 1); - $fileName = substr($savekey, strripos($savekey, '/') + 1); - // - $splInfo = $file->validate(['size' => $size])->move(ROOT_PATH . '/public' . $uploadDir, $fileName); - $category = request()->post('category'); - $category = array_key_exists($category, config('site.attachmentcategory') ?? []) ? $category : ''; - - if ($splInfo) { - $params = array( - 'category' => $category, - 'shop_id' => (int)SHOP_ID, - 'user_id' => 0, - 'filesize' => $fileInfo['size'], - 'imagewidth' => $imagewidth, - 'imageheight' => $imageheight, - 'imagetype' => $suffix, - 'imageframes' => 0, - 'mimetype' => $fileInfo['type'], - 'url' => $uploadDir . $splInfo->getSaveName(), - 'uploadtime' => time(), - 'storage' => 'local', - 'sha1' => $sha1, - 'extparam' => json_encode($extparam), - ); - $attachment = model("ManystoreAttachment"); - $attachment->data(array_filter($params)); - $attachment->save(); - \think\Hook::listen("upload_after", $attachment); - $this->success(__('Upload successful'), null, [ - 'url' => $uploadDir . $splInfo->getSaveName() - ]); - } else { - // 上传失败获取错误信息 - $this->error($file->getError()); - } - } - - /** - * 通用排序 - */ - public function weigh() - { - //排序的数组 - $ids = $this->request->post("ids"); - //拖动的记录ID - $changeid = $this->request->post("changeid"); - //操作字段 - $field = $this->request->post("field"); - //操作的数据表 - $table = $this->request->post("table"); - //主键 - $pk = $this->request->post("pk"); - //排序的方式 - $orderway = $this->request->post("orderway", "", 'strtolower'); - $orderway = $orderway == 'asc' ? 'ASC' : 'DESC'; - $sour = $weighdata = []; - $ids = explode(',', $ids); - $prikey = $pk ? $pk : (Db::name($table)->getPk() ?: 'id'); - $pid = $this->request->post("pid"); - //限制更新的字段 - $field = in_array($field, ['weigh']) ? $field : 'weigh'; - - // 如果设定了pid的值,此时只匹配满足条件的ID,其它忽略 - if ($pid !== '') { - $hasids = []; - $list = Db::name($table)->where($prikey, 'in', $ids)->where('pid', 'in', $pid)->field("{$prikey},pid")->select(); - foreach ($list as $k => $v) { - $hasids[] = $v[$prikey]; - } - $ids = array_values(array_intersect($ids, $hasids)); - } - - $list = Db::name($table)->field("$prikey,$field")->where($prikey, 'in', $ids)->order($field, $orderway)->select(); - foreach ($list as $k => $v) { - $sour[] = $v[$prikey]; - $weighdata[$v[$prikey]] = $v[$field]; - } - $position = array_search($changeid, $ids); - $desc_id = $sour[$position]; //移动到目标的ID值,取出所处改变前位置的值 - $sour_id = $changeid; - $weighids = array(); - $temp = array_values(array_diff_assoc($ids, $sour)); - foreach ($temp as $m => $n) { - if ($n == $sour_id) { - $offset = $desc_id; - } else { - if ($sour_id == $temp[0]) { - $offset = isset($temp[$m + 1]) ? $temp[$m + 1] : $sour_id; - } else { - $offset = isset($temp[$m - 1]) ? $temp[$m - 1] : $sour_id; - } - } - $weighids[$n] = $weighdata[$offset]; - Db::name($table)->where($prikey, $n)->update([$field => $weighdata[$offset]]); - } - $this->success(); - } - - /** - * 清空系统缓存 - */ - public function wipecache() - { - $type = $this->request->request("type"); - switch ($type) { - case 'all': - case 'content': - Cache::clear('ShopCacheTag'.SHOP_ID); - if ($type == 'content') - break; - } - - \think\Hook::listen("wipecache_after"); - $this->success(); - } - - /** - * 读取分类数据,联动列表 - */ - public function category() - { - $type = $this->request->get('type'); - $pid = $this->request->get('pid'); - $where = ['status' => 'normal']; - $categorylist = null; - if ($pid !== '') { - if ($type) { - $where['type'] = $type; - } - if ($pid) { - $where['pid'] = $pid; - } - - $categorylist = Db::name('category')->where($where)->field('id as value,name')->order('weigh desc,id desc')->select(); - } - $this->success('', null, $categorylist); - } - - /** - * 读取省市区数据,联动列表 - */ - public function area() - { - $params = $this->request->get("row/a"); - if (!empty($params)) { - $province = isset($params['province']) ? $params['province'] : ''; - $city = isset($params['city']) ? $params['city'] : null; - } else { - $province = $this->request->get('province'); - $city = $this->request->get('city'); - } - $where = ['pid' => 0, 'level' => 1]; - $provincelist = null; - if ($province !== '') { - if ($province) { - $where['pid'] = $province; - $where['level'] = 2; - } - if ($city !== '') { - if ($city) { - $where['pid'] = $city; - $where['level'] = 3; - } - $provincelist = Db::name('area')->where($where)->field('id as value,name')->select(); - } - } - $this->success('', null, $provincelist); - } - -} diff --git a/application/manystoreapi/controller/Attachment.php b/application/manystoreapi/controller/Attachment.php new file mode 100644 index 0000000..d9fd81a --- /dev/null +++ b/application/manystoreapi/controller/Attachment.php @@ -0,0 +1,160 @@ +model = new \app\common\model\ManystoreAttachment; + parent::_initialize(); + + + } + + + /** + * 附件列表查看 + * @ApiMethod (GET) + * @ApiParams (name="category", type="string", required=true, description="附件分类分类标识:category1=非机密类1,category2=非机密类2,cert=证件机密类,code=二维码类,user=用户普通上传") + * @ApiParams (name="mimetype", type="string", required=true, description="消息类型image/*=图片,audio/*=音频,video/*=视频,text/*=文档,application/*=应用程序,zip,rar,7z,tar=压缩文件") + */ + public function index() + { + //设置过滤方法 + $this->request->filter(['strip_tags', 'trim']); + + $mimetypeQuery = []; + $filter = $this->request->request('filter'); + + $filterArr = $this->request->param(); + if (isset($filterArr['category']) && $filterArr['category'] == 'unclassed') { + $filterArr['category'] = ',unclassed'; + $this->request->get(['filter' => json_encode(array_diff_key($filterArr, ['category' => '']))]); + } + + if (isset($filterArr['mimetype']) && preg_match("/[]\,|\*]/", $filterArr['mimetype'])) { + $this->request->get(['filter' => json_encode(array_diff_key($filterArr, ['mimetype' => '']))]); + $mimetypeQuery = function ($query) use ($filterArr) { + $mimetypeArr = explode(',', $filterArr['mimetype']); + foreach ($mimetypeArr as $index => $item) { + if (stripos($item, "/*") !== false) { + $query->whereOr('mimetype', 'like', str_replace("/*", "/", $item) . '%'); + } else { + $query->whereOr('mimetype', 'like', '%' . $item . '%'); + } + } + }; + } + + list($where, $sort, $order, $offset, $limit) = $this->buildparams(); + + $list = $this->model->with(["user"]) + ->where($mimetypeQuery) + ->whereRaw("`filename` NOT REGEXP '^[0-9A-Fa-f]{32}'") + ->where($where) + ->order($sort, $order) + ->paginate($limit); + foreach ($list as $row) { + $row->getRelation('user')->visible(['nickname', 'realname', 'mobile', 'avatar']); + + } + $rows = $list->items(); + + $cdnurl = preg_replace("/\/(\w+)\.php$/i", '', $this->request->root()); + foreach ($rows as $k => &$v) { + $v['fullurl'] = ($v['storage'] == 'local' ? $cdnurl : $this->view->config['upload']['cdnurl']) . $v['url']; + } + unset($v); + $result = array("total" => $list->total(), "rows" => $rows); + $this->apisuccess(__('发送成功'),$result); + //return json($result); + + } + + + + + /** + * 删除附件 + * @ApiMethod (POST) + * @ApiParams (name="ids", type="string", required=true, description="附件id") + * @param array $ids + */ + public function del($ids = "") + { + if (!$this->request->isPost()) { + $this->apierror(__("Invalid parameters")); + } + $ids = $ids ? $ids : $this->request->post("ids"); + if ($ids) { + \think\Hook::add('upload_delete', function ($params) { + if ($params['storage'] == 'local') { + $attachmentFile = ROOT_PATH . '/public' . $params['url']; + if (is_file($attachmentFile)) { + @unlink($attachmentFile); + } + } + }); + $attachmentlist = $this->model->where('id', 'in', $ids)->select(); + foreach ($attachmentlist as $attachment) { + \think\Hook::listen("upload_delete", $attachment); + $attachment->delete(); + } + $this->apisuccess(); + } + $this->apierror(__('Parameter %s can not be empty', 'ids')); + } + + + + /** + * 归类 + * @ApiMethod (POST) + * @ApiParams (name="category", type="string", required=true, description="附件分类分类标识:category1=非机密类1,category2=非机密类2,cert=证件机密类,code=二维码类,user=用户普通上传") + * @ApiParams (name="ids", type="string", required=true, description="附件id") + */ + public function classify() + { +// if (!$this->auth->check('general/attachment/edit')) { +// \think\Hook::listen('admin_nopermission', $this); +// $this->apierror(__('You have no permission'), ''); +// } + if (!$this->request->isPost()) { + $this->apierror(__("Invalid parameters")); + } + $category = $this->request->post('category', ''); + $ids = $this->request->post('ids'); + if (!$ids) { + $this->apierror(__('Parameter %s can not be empty', 'ids')); + } + $categoryList = \app\common\model\Attachment::getCategoryList(); + if ($category && !isset($categoryList[$category])) { + $this->apierror(__('Category not found')); + } + +// if(!defined('SHOP_ID')){ +// define('SHOP_ID', $this->auth->shop_id); +// } + + $category = $category == 'unclassed' ? '' : $category; + ManystoreAttachment::where('id', 'in', $ids)->update(['category' => $category]); + $this->apisuccess(); + } + + + +} \ No newline at end of file diff --git a/application/manystoreapi/controller/Common.php b/application/manystoreapi/controller/Common.php new file mode 100644 index 0000000..d57305f --- /dev/null +++ b/application/manystoreapi/controller/Common.php @@ -0,0 +1,362 @@ +request->server("HTTP_SID")); + } + parent::_initialize(); + } + + /** + * 加载初始化 + * + * @ApiParams (name="version", type="string", required=true, description="版本号") + * @ApiParams (name="lng", type="string", required=true, description="经度") + * @ApiParams (name="lat", type="string", required=true, description="纬度") + */ + public function init() + { + if ($version = $this->request->request('version')) { + $lng = $this->request->request('lng'); + $lat = $this->request->request('lat'); + + //配置信息 + $upload = Config::get('upload'); + //如果非服务端中转模式需要修改为中转 + if ($upload['storage'] != 'local' && isset($upload['uploadmode']) && $upload['uploadmode'] != 'server') { + //临时修改上传模式为服务端中转 + set_addon_config($upload['storage'], ["uploadmode" => "server"], false); + + $upload = \app\common\model\Config::upload(); + // 上传信息配置后 + Hook::listen("upload_config_init", $upload); + + $upload = Config::set('upload', array_merge(Config::get('upload'), $upload)); + } + + $upload['cdnurl'] = $upload['cdnurl'] ? $upload['cdnurl'] : cdnurl('', true); + $upload['uploadurl'] = preg_match("/^((?:[a-z]+:)?\/\/)(.*)/i", $upload['uploadurl']) ? $upload['uploadurl'] : url($upload['storage'] == 'local' ? '/api/common/upload' : $upload['uploadurl'], '', false, true); + + $content = [ + 'citydata' => Area::getCityFromLngLat($lng, $lat), + 'versiondata' => Version::check($version), + 'uploaddata' => $upload, + 'coverdata' => Config::get("cover"), + ]; + $this->apisuccess('', $content); + } else { + $this->apierror(__('Invalid parameters')); + } + } + + /** + * 用户上传文件(上传到总后台) + * @ApiMethod (POST) + * @ApiParams (name="file", type="File", required=true, description="文件流") + * @ApiParams (name="category", type="string", required=true, description="分类标识:category1=非机密类1,category2=非机密类2,cert=证件机密类,code=二维码类,user=用户普通上传") + * + */ + public function upload() + { + Config::set('default_return_type', 'json'); + //必须设定cdnurl为空,否则cdnurl函数计算错误 + Config::set('upload.cdnurl', ''); + $category = $this->request->post("category",'user'); +// var_dump($category);die; + $chunkid = $this->request->post("chunkid"); + if ($chunkid) { + if (!Config::get('upload.chunking')) { + $this->apierror(__('Chunk file disabled')); + } + $action = $this->request->post("action"); + $chunkindex = $this->request->post("chunkindex/d"); + $chunkcount = $this->request->post("chunkcount/d"); + $filename = $this->request->post("filename"); + + $method = $this->request->method(true); + if ($action == 'merge') { + $attachment = null; + //合并分片文件 + try { + $upload = new Upload(); + $attachment = $upload->merge($chunkid, $chunkcount, $filename); + } catch (UploadException $e) { + $this->apierror($e->getMessage()); + } + $this->apisuccess(__('Uploaded successful'), ['url' => $attachment->url, 'fullurl' => cdnurl($attachment->url, true)]); + } elseif ($method == 'clean') { + //删除冗余的分片文件 + try { + $upload = new Upload(); + $upload->clean($chunkid); + } catch (UploadException $e) { + $this->apierror($e->getMessage()); + } + $this->apisuccess(); + } else { + //上传分片文件 + //默认普通上传文件 + $file = $this->request->file('file'); + try { + + $upload = new Upload($file); + $upload->chunk($chunkid, $chunkindex, $chunkcount); + + } catch (UploadException $e) { + $this->apierror($e->getMessage()); + } + $this->apisuccess(); + } + } else { + $attachment = null; + //默认普通上传文件 + $file = $this->request->file('file'); + try { + + $upload = new Upload($file,$category); + $attachment = $upload->upload(); + +// $attachment = $upload->upload(); + } catch (UploadException $e) { + $this->apierror($e->getMessage().$e->getFile().$e->getLine()); + } catch (\Exception $e) { + $this->apierror($e->getMessage().$e->getFile().$e->getLine()); + } + + $this->apisuccess(__('Uploaded successful'), ['url' => $attachment->url, 'fullurl' => cdnurl($attachment->url, true)]); + } + + } + + + + + /** + * 机构端上传文件(上传到机构后台) + * @ApiMethod (POST) + * @ApiParams (name="file", type="File", required=true, description="文件流") + * @ApiParams (name="category", type="string", required=true, description="分类标识:category1=非机密类1,category2=非机密类2,cert=证件机密类,code=二维码类,user=用户普通上传") + * + */ + public function manystoreupload() + { + Config::set('default_return_type', 'json'); + $file = $this->request->file('file'); + $category = $this->request->post("category",'user'); + if (empty($file)) { + $this->apierror(__('No file upload or server upload limit exceeded')); + } + + //判断是否已经存在附件 + $sha1 = $file->hash(); + $extparam = $this->request->post(); + + $upload = Config::get('upload'); + + preg_match('/(\d+)(\w+)/', $upload['maxsize'], $matches); + $type = strtolower($matches[2]); + $typeDict = ['b' => 0, 'k' => 1, 'kb' => 1, 'm' => 2, 'mb' => 2, 'gb' => 3, 'g' => 3]; + $size = (int)$upload['maxsize'] * pow(1024, isset($typeDict[$type]) ? $typeDict[$type] : 0); + $fileInfo = $file->getInfo(); + $suffix = strtolower(pathinfo($fileInfo['name'], PATHINFO_EXTENSION)); + $suffix = $suffix && preg_match("/^[a-zA-Z0-9]+$/", $suffix) ? $suffix : 'file'; + $fileInfo['suffix'] = $suffix; + + $mimetypeArr = explode(',', strtolower($upload['mimetype'])); + $typeArr = explode('/', $fileInfo['type']); + + //禁止上传PHP和HTML文件 + if (in_array($fileInfo['type'], ['text/x-php', 'text/html']) || in_array($suffix, ['php', 'html', 'htm', 'phar', 'phtml']) || preg_match("/^php(.*)/i", $fileInfo['suffix'])) { + $this->apierror(__('Uploaded file format is limited')); + } + + //Mimetype值不正确 + if (stripos($fileInfo['type'], '/') === false) { + $this->apierror(__('Uploaded file format is limited')); + } + + //验证文件后缀 + if ($upload['mimetype'] !== '*' && + ( + !in_array($suffix, $mimetypeArr) + || (stripos($typeArr[0] . '/', $upload['mimetype']) !== false && (!in_array($fileInfo['type'], $mimetypeArr) && !in_array($typeArr[0] . '/*', $mimetypeArr))) + ) + ) { + $this->apierror(__('Uploaded file format is limited')); + } + //验证是否为图片文件 + $imagewidth = $imageheight = 0; + if (in_array($fileInfo['type'], ['image/gif', 'image/jpg', 'image/jpeg', 'image/bmp', 'image/png', 'image/webp']) || in_array($suffix, ['gif', 'jpg', 'jpeg', 'bmp', 'png', 'webp'])) { + $imgInfo = getimagesize($fileInfo['tmp_name']); + if (!$imgInfo || !isset($imgInfo[0]) || !isset($imgInfo[1])) { + $this->apierror(__('Uploaded file is not a valid image')); + } + $imagewidth = isset($imgInfo[0]) ? $imgInfo[0] : $imagewidth; + $imageheight = isset($imgInfo[1]) ? $imgInfo[1] : $imageheight; + } + $replaceArr = [ + '{year}' => date("Y"), + '{mon}' => date("m"), + '{day}' => date("d"), + '{hour}' => date("H"), + '{min}' => date("i"), + '{sec}' => date("s"), + '{random}' => Random::alnum(16), + '{random32}' => Random::alnum(32), + '{filename}' => $suffix ? substr($fileInfo['name'], 0, strripos($fileInfo['name'], '.')) : $fileInfo['name'], + '{suffix}' => $suffix, + '{.suffix}' => $suffix ? '.' . $suffix : '', + '{filemd5}' => md5_file($fileInfo['tmp_name']), + ]; + $savekey = $upload['savekey']; + $savekey = str_replace(array_keys($replaceArr), array_values($replaceArr), $savekey); + + $uploadDir = substr($savekey, 0, strripos($savekey, '/') + 1); + $fileName = substr($savekey, strripos($savekey, '/') + 1); + // + $splInfo = $file->validate(['size' => $size])->move(ROOT_PATH . '/public' . $uploadDir, $fileName); + + $category = array_key_exists($category, config('site.attachmentcategory') ?? []) ? $category : 'user'; + + if ($splInfo) { + $user_id = 0; + $user = $this->auth->getUser();//登录用户 + if($user)$user_id = $user['user_id']; + + + $params = array( + 'category' => $category, + 'shop_id' => (int)$this->auth->shop_id ?:0, + 'user_id' => $user_id, + 'filesize' => $fileInfo['size'], + 'imagewidth' => $imagewidth, + 'imageheight' => $imageheight, + 'imagetype' => $suffix, + 'imageframes' => 0, + 'mimetype' => $fileInfo['type'], + 'url' => $uploadDir . $splInfo->getSaveName(), + 'uploadtime' => time(), + 'storage' => 'local', + 'sha1' => $sha1, + 'extparam' => json_encode($extparam), + ); + $attachment = new ManystoreAttachment; + $attachment->data(array_filter($params)); + $attachment->save(); + \think\Hook::listen("upload_after", $attachment); +// $this->success(__('Upload successful'), null, [ +// 'url' => $uploadDir . $splInfo->getSaveName() +// ]); + + $this->apisuccess(__('Uploaded successful'), ['url' => $attachment->url, 'fullurl' => cdnurl($attachment->url, true)]); + + + } else { + // 上传失败获取错误信息 + $this->apierror($file->getError()); + } + + } + + + + /** + * 验证码 + * @ApiParams (name="id", type="string", required=true, description="要生成验证码的标识") + * @return \think\Response + */ + public function captcha($id = "") + { + \think\Config::set([ + 'captcha' => array_merge(config('captcha'), [ + 'fontSize' => 44, + 'imageH' => 150, + 'imageW' => 350, + ]) + ]); + $captcha = new Captcha((array)Config::get('captcha')); + return $captcha->entry($id); + + + + + } + + + /** + * @ApiTitle(生成随机昵称和头像) + * @ApiSummary(生成随机昵称和头像) + * @ApiMethod(GET) + * @ApiParams(name = "number", type = "int",required=true,description = "生成数量") + * @ApiReturn({ unpaid_user_data 参与中 paid_user_data 已报名 }) + */ + public function virtualgenerate(){ + $number = $this->request->get('number/d',''); + if(empty($number)){ + $this->apierror(__('缺少必要参数')); + } + try { + $res = (new Virtual)->getVirtualUser($number); + } catch (\Exception $e){ +// Log::log($e->getMessage()); + $this->apierror($e->getMessage(),['errcode'=>$e->getCode()]); + } + $this->apisuccess('生成成功', $res); + } + + + + /** + * @ApiTitle(通过时间点得到当前的星期数据) + * @ApiSummary(通过时间点得到当前的星期数据) + * @ApiMethod(GET) + * @ApiParams(name="time",type="string",required=true,description="选择的时间点") + * @ApiReturn({ unpaid_user_data 参与中 paid_user_data 已报名 }) + */ + public function get_week_by_time(){ + $time = $this->request->get('time/s',''); + +// if(empty($time)){ +// $this->error(__('缺少必要参数')); +// } + try { + $res = (new Virtual)->getWeekByTime($time); + } catch (\Exception $e){ +// Log::log($e->getMessage()); + $this->apierror($e->getMessage(),['errcode'=>$e->getCode()]); + } + $this->apisuccess('生成成功', $res); + } + +} diff --git a/application/manystoreapi/controller/Dashboard.php b/application/manystoreapi/controller/Dashboard.php deleted file mode 100644 index 22761ee..0000000 --- a/application/manystoreapi/controller/Dashboard.php +++ /dev/null @@ -1,59 +0,0 @@ -view->assign([ - 'totaluser' => 35200, - 'totalviews' => 219390, - 'totalorder' => 32143, - 'totalorderamount' => 174800, - 'todayuserlogin' => 321, - 'todayusersignup' => 430, - 'todayorder' => 2324, - 'unsettleorder' => 132, - 'sevendnu' => '80%', - 'sevendau' => '32%', - 'paylist' => $paylist, - 'createlist' => $createlist, - 'addonversion' => $addonVersion, - 'uploadmode' => $uploadmode - ]); - - $this->view->assign('check_full',(new \app\common\model\dyqc\ManystoreShop)->checkFull(SHOP_ID)); - $this->view->assign('check_full_msg',(new \app\common\model\dyqc\ManystoreShop)->checkFullMsg(SHOP_ID)); - - return $this->view->fetch(); - } - -} diff --git a/application/manystoreapi/controller/Index.php b/application/manystoreapi/controller/Index.php deleted file mode 100644 index b83644c..0000000 --- a/application/manystoreapi/controller/Index.php +++ /dev/null @@ -1,133 +0,0 @@ -request->filter('trim,strip_tags,htmlspecialchars'); - } - - /** - * 后台首页 - */ - public function index() - { - //左侧菜单 - $cookieArr = ['adminskin' => "/^skin\-([a-z\-]+)\$/i", 'multiplenav' => "/^(0|1)\$/", 'multipletab' => "/^(0|1)\$/", 'show_submenu' => "/^(0|1)\$/"]; - foreach ($cookieArr as $key => $regex) { - $cookieValue = $this->request->cookie($key); - if (!is_null($cookieValue) && preg_match($regex, $cookieValue)) { - config('fastadmin.' . $key, $cookieValue); - } - } - list($menulist, $navlist, $fixedmenu, $referermenu) = $this->auth->getSidebar([ - 'dashboard' => 'hot', - 'addon' => ['new', 'red', 'badge'], - 'auth/rule' => __('Menu'), - 'general' => ['new', 'purple'], - ], $this->view->site['fixedpage']); - $action = $this->request->request('action'); - if ($this->request->isPost()) { - if ($action == 'refreshmenu') { - $this->success('', null, ['menulist' => $menulist, 'navlist' => $navlist]); - } - } - $this->assignconfig('cookie', ['prefix' => config('cookie.prefix')]); - $this->view->assign('menulist', $menulist); - $this->view->assign('navlist', $navlist); - $this->view->assign('fixedmenu', $fixedmenu); - $this->view->assign('referermenu', $referermenu); - $this->view->assign('title', __('Home')); - return $this->view->fetch(); - } - - /** - * 管理员登录 - */ - public function login() - { - $url = $this->request->get('url', 'index/index'); - if ($this->auth->isLogin()) { - $this->success(__("You've logged in, do not login again"), $url); - } - if ($this->request->isPost()) { - $username = $this->request->post('username'); - $password = $this->request->post('password'); - $keeplogin = $this->request->post('keeplogin'); - $token = $this->request->post('__token__'); - $rule = [ - 'username' => 'require|length:3,30', - 'password' => 'require|length:3,30', - '__token__' => 'require|token', - ]; - $data = [ - 'username' => $username, - 'password' => $password, - '__token__' => $token, - ]; -// if (Config::get('fastadmin.login_captcha')) { -// $rule['captcha'] = 'require|captcha'; -// $data['captcha'] = $this->request->post('captcha'); -// } - -// $validate = new Validate($rule, [], ['username' => __('Username'), 'password' => __('Password'), 'captcha' => __('Captcha')]); - $validate = new Validate($rule, [], ['username' => __('Username'), 'password' => __('Password')]); - - $result = $validate->check($data); - if (!$result) { - $this->error($validate->getError(), $url, ['token' => $this->request->token()]); - } - ManystoreLog::setTitle(__('Login')); - $result = $this->auth->login($username, $password, $keeplogin ? 86400 : 0); - if ($result === true) { - Hook::listen("admin_login_after", $this->request); - $this->success(__('Login successful'), $url, ['url' => $url, 'id' => $this->auth->id, 'username' => $username, 'avatar' => $this->auth->avatar]); - } else { - $msg = $this->auth->getError(); - $msg = $msg ? $msg : __('Username or password is incorrect'); - $this->error($msg, $url, ['token' => $this->request->token()]); - } - } - - // 根据客户端的cookie,判断是否可以自动登录 - if ($this->auth->autologin()) { - $this->redirect($url); - } - $background = Config::get('fastadmin.login_background'); - $background = stripos($background, 'http') === 0 ? $background : config('site.cdnurl') . $background; - $this->view->assign('background', $background); - $this->view->assign('title', __('Login')); - Hook::listen("admin_login_init", $this->request); - return $this->view->fetch(); - } - - /** - * 注销登录 - */ - public function logout() - { - $this->auth->logout(); - Hook::listen("manystore_logout_after", $this->request); - $this->success(__('Logout successful'), 'index/login'); - } - -} diff --git a/application/manystoreapi/controller/Sms.php b/application/manystoreapi/controller/Sms.php new file mode 100644 index 0000000..ef0735e --- /dev/null +++ b/application/manystoreapi/controller/Sms.php @@ -0,0 +1,105 @@ +request->post("mobile"); + $event = $this->request->post("event"); + $event = $event ? $event : 'register'; + + if (!$mobile || !\think\Validate::regex($mobile, "^1\d{10}$")) { + $this->apierror(__('手机号不正确')); + } + $last = Smslib::get($mobile, $event); + if ($last && time() - $last['createtime'] < 60) { + $this->apierror(__('发送频繁')); + } + $ipSendTotal = \app\common\model\Sms::where(['ip' => $this->request->ip()])->whereTime('createtime', '-1 hours')->count(); + if ($ipSendTotal >= 5) { + $this->apierror(__('发送频繁')); + } + if ($event) { + $userinfo = Manystore::getByMobile($mobile); + if ($event == 'register' && $userinfo) { + //已被注册 + $this->apierror(__('已被注册')); + } elseif (in_array($event, ['changemobile']) && $userinfo) { + //被占用 + $this->apierror(__('已被占用')); + } elseif (in_array($event, ['changepwd', 'resetpwd']) && !$userinfo) { + //未注册 + $this->apierror(__('未注册')); + } + } + if (!Hook::get('sms_send')) { + $this->apierror(__('请在后台插件管理安装短信验证插件')); + } + $ret = Smslib::send($mobile, null, $event); + if ($ret) { + $this->apisuccess(__('发送成功')); + } else { + $this->apierror(__('发送失败,请检查短信配置是否正确')); + } + } + + /** + * 检测验证码 + * + * @ApiMethod (POST) + * @ApiParams (name="mobile", type="string", required=true, description="手机号") + * @ApiParams (name="event", type="string", required=true, description="事件名称") + * @ApiParams (name="captcha", type="string", required=true, description="验证码") + */ + public function check() + { + $mobile = $this->request->post("mobile"); + $event = $this->request->post("event"); + $event = $event ? $event : 'register'; + $captcha = $this->request->post("captcha"); + + if (!$mobile || !\think\Validate::regex($mobile, "^1\d{10}$")) { + $this->apierror(__('手机号不正确')); + } + if ($event) { + $userinfo = Manystore::getByMobile($mobile); + if ($event == 'register' && $userinfo) { + //已被注册 + $this->apierror(__('已被注册')); + } elseif (in_array($event, ['changemobile']) && $userinfo) { + //被占用 + $this->apierror(__('已被占用')); + } elseif (in_array($event, ['changepwd', 'resetpwd']) && !$userinfo) { + //未注册 + $this->apierror(__('未注册')); + } + } + $ret = Smslib::check($mobile, $captcha, $event); + if ($ret) { + $this->apisuccess(__('成功')); + } else { + $this->apierror(__('验证码不正确')); + } + } +} diff --git a/application/manystoreapi/controller/Token.php b/application/manystoreapi/controller/Token.php index 06e73ab..a0ee4dd 100644 --- a/application/manystoreapi/controller/Token.php +++ b/application/manystoreapi/controller/Token.php @@ -2,13 +2,13 @@ namespace app\manystoreapi\controller; -use app\common\controller\Api; +use app\common\controller\ManystoreApiBase; use fast\Random; /** - * Token接口 + * 机构API后台:Token接口 */ -class Token extends Api +class Token extends ManystoreApiBase { protected $noNeedLogin = []; protected $noNeedRight = '*'; @@ -20,8 +20,9 @@ class Token extends Api public function check() { $token = $this->auth->getToken(); - $tokenInfo = \app\common\library\Token::get($token); - $this->success('', ['token' => $tokenInfo['token'], 'expires_in' => $tokenInfo['expires_in']]); +// $tokenInfo = \app\common\library\Token::get($token); + $tokenInfo = \app\common\library\Token::init($this->auth->init_data)->get($token); + $this->apisuccess('', ['token' => $tokenInfo['token'], 'expires_in' => $tokenInfo['expires_in']]); } /** @@ -32,11 +33,11 @@ class Token extends Api { //删除源Token $token = $this->auth->getToken(); - \app\common\library\Token::delete($token); + \app\common\library\Token::init($this->auth->init_data)->delete($token); //创建新Token $token = Random::uuid(); - \app\common\library\Token::set($token, $this->auth->id, 2592000); - $tokenInfo = \app\common\library\Token::get($token); - $this->success('', ['token' => $tokenInfo['token'], 'expires_in' => $tokenInfo['expires_in']]); + \app\common\library\Token::init($this->auth->init_data)->set($token, $this->auth->id, 2592000); + $tokenInfo = \app\common\library\Token::init($this->auth->init_data)->get($token); + $this->apisuccess('', ['token' => $tokenInfo['token'], 'expires_in' => $tokenInfo['expires_in']]); } } diff --git a/application/manystoreapi/controller/User.php b/application/manystoreapi/controller/User.php index 3511448..2077715 100644 --- a/application/manystoreapi/controller/User.php +++ b/application/manystoreapi/controller/User.php @@ -1,13 +1,14 @@ 1, - "msg" => "获取成功", - "data" => {} - *}) - */ - - public function getOpenid(){ - $code = $this->request->param('code/s'); - - try { - $result = LoginService::getInstance(['mini_config' => $this->miniConfig])->getOpenid($code); - } catch (\WeChat\Exceptions\LocalCacheException $e){ - $this->error($e->getMessage()); - } catch (\Exception $e){ - $this->error($e->getMessage()); - } - if(empty($result['openid'])){ - $this->error(__('获取openid失败'),$result); - } - - Cache::set('wechat_miniapp_code'.$code.$result['openid'],"1",60); - $this->success('',$result); - } - - /** - * @ApiTitle(加密信息解密) - * @ApiSummary(解密微信信息) - * @ApiRoute(/api/user/decodeData) - * @ApiMethod(POST) - * @ApiParams(name = "iv", type = "string",required=true) - * @ApiParams(name = "encryptedData", type = "string",required=true) - * @ApiParams(name = "sessionKey", type = "string",required=true) - * @ApiHeaders(name = "brand-key", type = "string",require = true, description = "应用key") - * @ApiHeaders(name = "token", type = "string", require = true, description = "Token") - * @ApiReturn({ - "code" => 1, - "msg" => "获取成功", - "data" => {} - *}) - */ - public function decodeData() { - $iv = $this->request->param('iv/s'); - $encryptedData = $this->request->param('encryptedData/s'); - $sessionKey = $this->request->param('sessionKey/s'); - if(empty($iv) || empty($encryptedData) || empty($sessionKey)){ - $this->error(__('Params error')); - } - $result = LoginService::getInstance(['mini_config' => $this->miniConfig])->decodeData($iv,$sessionKey,$encryptedData); - $info = empty($result["phoneNumber"]) ? ($result["purePhoneNumber"] ?? '' ) : $result["phoneNumber"]; - Cache::set('wechat_miniapp_core'.$info,"1",60); - $this->success('',$result); - } - - - - /** - * @ApiTitle(微信小程序授权登录注册通用[支持静默登录]) - * @ApiSummary(登录注册通用-支持静默登录) - * @ApiRoute(/api/user/registerLogin) - * @ApiMethod(POST) - * @ApiParams(name = "mobile", type = "string",required=false,description = "mobile 静默非必传,手机授权必传") - * @ApiParams(name = "unionid", type = "string",required=false, description = "unionid 非必传") - * @ApiParams(name = "apptype", type = "string",required=false, description = "应用类型默认miniapp") - * @ApiParams(name = "platform", type = "string",require=false, description = "平台标识默认wechat") - * @ApiParams(name = "openid", type = "string", require=true, description = "授权的openid") - * @ApiParams(name = "keeptime", type = "string", require=false, description = "token保持时间,默认0永久") - * @ApiParams(name = "code", type = "string", require=true, description = "授权的code") - * @ApiReturn({ - "code" => 1, - "msg" => "获取成功", - "data" => {‘token’:xxxxx,'errcode':0(如果为30001则是需要重新授权)} - *}) - */ - public function registerLogin(){ - $extend= $params = []; - $extend['mobile'] = $this->request->param('mobile/s',''); - $params['unionid'] = $this->request->param('unionid/s',''); - $params['apptype'] = $this->request->param('apptype/s','miniapp'); - $params['openid'] = $this->request->param('openid/s',''); - $platform = $this->request->param('platform/s','wechat'); - $code = $this->request->param('code/s',''); - if(empty($code)){ - $this->error(__('缺少code')); - } - //手机号变必填 -// if(empty($extend['mobile'])){ -// $this->error(__('未传手机号')); -// } - - - $wechat_mini_code = Cache::get("{$platform}_{$params['apptype']}_code".$code.$params['openid']); - if(!$wechat_mini_code)$this->error("授权code已过期或已使用,请重新发起授权!",['errcode'=>30002]); - - if($extend['mobile']){ - $wechat_mini_mobile = Cache::get("{$platform}_{$params['apptype']}_core".$extend['mobile']); - if(!$wechat_mini_mobile)$this->error("授权手机号已过期或已使用,请重新发起授权!",['errcode'=>30002]); - } - - - - //推荐人:逻辑未实现 - $rec_user_id = $this->request->param('rec_user_id',0,'xilufitness_get_id_value'); - $keeptime = $this->request->param('keeptime/d',0); - //access_token - - try { - \addons\third\library\Service::loginAndRegisterByMobile($platform, $params, $extend, $keeptime); - } catch (\Exception $e){ - Log::log($e->getMessage()); - $this->error($e->getMessage(),['errcode'=>$e->getCode()]); - } - Cache::rm("{$platform}_{$params['apptype']}_code".$code.$params['openid']); - - if($extend['mobile']){ - Cache::rm("{$platform}_{$params['apptype']}_core".$extend['mobile']); - } - - $this->success('获取成功', ['token' => $this->auth->getToken()]); - } - - - - - /** @@ -186,14 +51,9 @@ class User extends Api 'welcome' => $this->auth->nickname, 'user_info'=>$this->auth->getUserinfo() ]; - //是否有核销按钮展示权 - $data['have_auth'] = \app\common\model\User::verificationAuth($this->auth->id); - $data['have_teacher'] = \app\common\model\User::teacherAuth($this->auth->id); - //机构认证信息 - $data['shop_auth_info'] = ManystoreShop::getAuthInfo($this->auth->id); $data['user_info']["avatar"] = $data['user_info']["avatar"]? cdnurl($data['user_info']["avatar"],true):$data['user_info']["avatar"]; - $this->success('调用成功',$data); + $this->apisuccess('调用成功',$data); } /** @@ -208,14 +68,14 @@ class User extends Api $account = $this->request->post('account'); $password = $this->request->post('password'); if (!$account || !$password) { - $this->error(__('Invalid parameters')); + $this->apierror(__('Invalid parameters')); } $ret = $this->auth->login($account, $password); if ($ret) { $data = ['userinfo' => $this->auth->getUserinfo()]; - $this->success(__('Logged in successful'), $data); + $this->apisuccess(__('Logged in successful'), $data); } else { - $this->error($this->auth->getError()); + $this->apierror($this->auth->getError()); } } @@ -239,7 +99,7 @@ class User extends Api if (!Sms::check($mobile, $captcha, 'mobilelogin')) { $this->error(__('Captcha is incorrect')); } - $user = \app\common\model\User::getByMobile($mobile); + $user = Manystore::getByMobile($mobile); if ($user) { if ($user->status != 'normal') { $this->error(__('Account is locked')); @@ -247,55 +107,19 @@ class User extends Api //如果已经有账号则直接登录 $ret = $this->auth->direct($user->id); } else { - $ret = $this->auth->register($mobile, Random::alnum(), '', $mobile, []); + $ret = null; +// $ret = $this->auth->register($mobile, Random::alnum(), '', $mobile, []); } if ($ret) { Sms::flush($mobile, 'mobilelogin'); $data = ['userinfo' => $this->auth->getUserinfo()]; - $this->success(__('Logged in successful'), $data); + $this->apisuccess(__('Logged in successful'), $data); } else { - $this->error($this->auth->getError()); + $this->apierror($this->auth->getError()); } } - /** - * 注册会员 - * - * @ApiMethod (POST) - * @ApiParams (name="username", type="string", required=true, description="用户名") - * @ApiParams (name="password", type="string", required=true, description="密码") - * @ApiParams (name="email", type="string", required=true, description="邮箱") - * @ApiParams (name="mobile", type="string", required=true, description="手机号") - * @ApiParams (name="code", type="string", required=true, description="验证码") - */ - public function register() - { - $username = $this->request->post('username'); - $password = $this->request->post('password'); - $email = $this->request->post('email'); - $mobile = $this->request->post('mobile'); - $code = $this->request->post('code'); - if (!$username || !$password) { - $this->error(__('Invalid parameters')); - } - if ($email && !Validate::is($email, "email")) { - $this->error(__('Email is incorrect')); - } - if ($mobile && !Validate::regex($mobile, "^1\d{10}$")) { - $this->error(__('Mobile is incorrect')); - } - $ret = Sms::check($mobile, $code, 'register'); - if (!$ret) { - $this->error(__('Captcha is incorrect')); - } - $ret = $this->auth->register($username, $password, $email, $mobile, []); - if ($ret) { - $data = ['userinfo' => $this->auth->getUserinfo()]; - $this->success(__('Sign up successful'), $data); - } else { - $this->error($this->auth->getError()); - } - } + /** * 退出登录 @@ -304,10 +128,10 @@ class User extends Api public function logout() { if (!$this->request->isPost()) { - $this->error(__('Invalid parameters')); + $this->apierror(__('Invalid parameters')); } $this->auth->logout(); - $this->success(__('Logout successful')); + $this->apisuccess(__('Logout successful')); } /** @@ -318,11 +142,6 @@ class User extends Api * @ApiParams (name="avatar", type="string", required=true, description="头像地址") * @ApiParams (name="username", type="string", required=true, description="用户名") * @ApiParams (name="nickname", type="string", required=true, description="昵称") - * @ApiParams (name="realname", type="string", required=true, description="姓名") - * @ApiParams (name="gender", type="int", required=true, description="性别:0女 1男") - * @ApiParams (name="birthday", type="string", required=true, description="出生日期:日期字符串 比如”1995-9-20") - * @ApiParams (name="work", type="string", required=true, description="职业") - * @ApiParams (name="bio", type="string", required=true, description="个人简介") */ public function profile() { @@ -333,45 +152,45 @@ class User extends Api if(!$update_fields)$this->error(__('请指定要更新的字段!')); $username = $this->request->post('username/s'); $nickname = $this->request->post('nickname/s'); - $realname = $this->request->post('realname/s'); - $gender = $this->request->post('gender/d'); - $birthday = $this->request->post('birthday/s'); - $work = $this->request->post('work/s'); - $bio = $this->request->post('bio/s',null); +// $realname = $this->request->post('realname/s'); +// $gender = $this->request->post('gender/d'); +// $birthday = $this->request->post('birthday/s'); +// $work = $this->request->post('work/s'); +// $bio = $this->request->post('bio/s',null); $avatar = $this->request->post('avatar', null, 'trim,strip_tags,htmlspecialchars'); if ($username && in_array('username', $update_fields)) { - $exists = \app\common\model\User::where('username', $username)->where('id', '<>', $this->auth->id)->find(); + $exists = Manystore::where('username', $username)->where('id', '<>', $this->auth->id)->find(); if ($exists) { - $this->error(__('Username already exists')); + $this->apierror(__('Username already exists')); } $user->username = $username; } if ($nickname && in_array('nickname', $update_fields)) { - $exists = \app\common\model\User::where('nickname', $nickname)->where('id', '<>', $this->auth->id)->find(); + $exists = Manystore::where('nickname', $nickname)->where('id', '<>', $this->auth->id)->find(); if ($exists) { - $this->error(__('Nickname already exists')); + $this->apierror(__('Nickname already exists')); } $user->nickname = $nickname; } - if(in_array('bio', $update_fields))$user->bio = $bio; +// if(in_array('bio', $update_fields))$user->bio = $bio; if($avatar!==null && in_array('avatar', $update_fields))$user->avatar = $avatar; - if(in_array('realname', $update_fields))$user->realname = $realname; - if(in_array('gender', $update_fields)){ - if(!in_array($gender, [1,0]))$this->error(__('请输入正确的性别!')); - $user->gender = $gender; - } - if(in_array('birthday', $update_fields))$user->birthday = $birthday; - if(in_array('work', $update_fields))$user->work = $work; +// if(in_array('realname', $update_fields))$user->realname = $realname; +// if(in_array('gender', $update_fields)){ +// if(!in_array($gender, [1,0]))$this->error(__('请输入正确的性别!')); +// $user->gender = $gender; +// } +// if(in_array('birthday', $update_fields))$user->birthday = $birthday; +// if(in_array('work', $update_fields))$user->work = $work; $user->save(); //调用事件 $datas = ['user' => $user]; - \think\Hook::listen('user_update_after', $datas); + \think\Hook::listen('manystore_update_after', $datas); - $this->success(); + $this->apisuccess(); } /** @@ -387,26 +206,26 @@ class User extends Api $email = $this->request->post('email'); $captcha = $this->request->post('captcha'); if (!$email || !$captcha) { - $this->error(__('Invalid parameters')); + $this->apierror(__('Invalid parameters')); } if (!Validate::is($email, "email")) { - $this->error(__('Email is incorrect')); + $this->apierror(__('Email is incorrect')); } - if (\app\common\model\User::where('email', $email)->where('id', '<>', $user->id)->find()) { - $this->error(__('Email already exists')); + if (Manystore::where('email', $email)->where('id', '<>', $user->id)->find()) { + $this->apierror(__('Email already exists')); } $result = Ems::check($email, $captcha, 'changeemail'); if (!$result) { - $this->error(__('Captcha is incorrect')); + $this->apierror(__('Captcha is incorrect')); } - $verification = $user->verification; - $verification->email = 1; - $user->verification = $verification; +// $verification = $user->verification; +// $verification->email = 1; +// $user->verification = $verification; $user->email = $email; $user->save(); Ems::flush($email, 'changeemail'); - $this->success(); + $this->apisuccess(); } /** @@ -422,118 +241,87 @@ class User extends Api $mobile = $this->request->post('mobile'); $captcha = $this->request->post('captcha'); if (!$mobile || !$captcha) { - $this->error(__('Invalid parameters')); + $this->apierror(__('Invalid parameters')); } if (!Validate::regex($mobile, "^1\d{10}$")) { - $this->error(__('Mobile is incorrect')); + $this->apierror(__('Mobile is incorrect')); } - if (\app\common\model\User::where('mobile', $mobile)->where('id', '<>', $user->id)->find()) { - $this->error(__('Mobile already exists')); + if (Manystore::where('mobile', $mobile)->where('id', '<>', $user->id)->find()) { + $this->apierror(__('Mobile already exists')); } $result = Sms::check($mobile, $captcha, 'changemobile'); if (!$result) { - $this->error(__('Captcha is incorrect')); + $this->apierror(__('Captcha is incorrect')); } - $verification = $user->verification; - $verification->mobile = 1; - $user->verification = $verification; +// $verification = $user->verification; +// $verification->mobile = 1; +// $user->verification = $verification; $user->mobile = $mobile; $user->save(); Sms::flush($mobile, 'changemobile'); - $this->success(); + $this->apisuccess(); } - /** - * 第三方登录 - * - * @ApiMethod (POST) - * @ApiParams (name="platform", type="string", required=true, description="平台名称") - * @ApiParams (name="code", type="string", required=true, description="Code码") - */ - public function third() - { - $url = url('user/index'); - $platform = $this->request->post("platform"); - $code = $this->request->post("code"); - $config = get_addon_config('third'); - if (!$config || !isset($config[$platform])) { - $this->error(__('Invalid parameters')); - } - $app = new \addons\third\library\Application($config); - //通过code换access_token和绑定会员 - $result = $app->{$platform}->getUserInfo(['code' => $code]); - if ($result) { - $loginret = \addons\third\library\Service::connect($platform, $result); - if ($loginret) { - $data = [ - 'userinfo' => $this->auth->getUserinfo(), - 'thirdinfo' => $result - ]; - $this->success(__('Logged in successful'), $data); - } - } - $this->error(__('Operation failed'), $url); - } - /** - * 重置密码 - * - * @ApiMethod (POST) - * @ApiParams (name="mobile", type="string", required=true, description="手机号") - * @ApiParams (name="newpassword", type="string", required=true, description="新密码") - * @ApiParams (name="captcha", type="string", required=true, description="验证码") - */ - public function resetpwd() - { - $type = $this->request->post("type", "mobile"); - $mobile = $this->request->post("mobile"); - $email = $this->request->post("email"); - $newpassword = $this->request->post("newpassword"); - $captcha = $this->request->post("captcha"); - if (!$newpassword || !$captcha) { - $this->error(__('Invalid parameters')); - } - //验证Token - if (!Validate::make()->check(['newpassword' => $newpassword], ['newpassword' => 'require|regex:\S{6,30}'])) { - $this->error(__('Password must be 6 to 30 characters')); - } - if ($type == 'mobile') { - if (!Validate::regex($mobile, "^1\d{10}$")) { - $this->error(__('Mobile is incorrect')); - } - $user = \app\common\model\User::getByMobile($mobile); - if (!$user) { - $this->error(__('User not found')); - } - $ret = Sms::check($mobile, $captcha, 'resetpwd'); - if (!$ret) { - $this->error(__('Captcha is incorrect')); - } - Sms::flush($mobile, 'resetpwd'); - } else { - if (!Validate::is($email, "email")) { - $this->error(__('Email is incorrect')); - } - $user = \app\common\model\User::getByEmail($email); - if (!$user) { - $this->error(__('User not found')); - } - $ret = Ems::check($email, $captcha, 'resetpwd'); - if (!$ret) { - $this->error(__('Captcha is incorrect')); - } - Ems::flush($email, 'resetpwd'); - } - //模拟一次登录 - $this->auth->direct($user->id); - $ret = $this->auth->changepwd($newpassword, '', true); - if ($ret) { - $this->success(__('Reset password successful')); - } else { - $this->error($this->auth->getError()); - } - } +// /** +// * 重置密码 +// * +// * @ApiMethod (POST) +// * @ApiParams (name="mobile", type="string", required=true, description="手机号") +// * @ApiParams (name="newpassword", type="string", required=true, description="新密码") +// * @ApiParams (name="captcha", type="string", required=true, description="验证码") +// */ +// public function resetpwd() +// { +// $type = $this->request->post("type", "mobile"); +// $mobile = $this->request->post("mobile"); +// $email = $this->request->post("email"); +// $newpassword = $this->request->post("newpassword"); +// $captcha = $this->request->post("captcha"); +// if (!$newpassword || !$captcha) { +// $this->error(__('Invalid parameters')); +// } +// //验证Token +// if (!Validate::make()->check(['newpassword' => $newpassword], ['newpassword' => 'require|regex:\S{6,30}'])) { +// $this->error(__('Password must be 6 to 30 characters')); +// } +// if ($type == 'mobile') { +// if (!Validate::regex($mobile, "^1\d{10}$")) { +// $this->error(__('Mobile is incorrect')); +// } +// $user = \app\common\model\User::getByMobile($mobile); +// if (!$user) { +// $this->error(__('User not found')); +// } +// $ret = Sms::check($mobile, $captcha, 'resetpwd'); +// if (!$ret) { +// $this->error(__('Captcha is incorrect')); +// } +// Sms::flush($mobile, 'resetpwd'); +// } else { +// if (!Validate::is($email, "email")) { +// $this->error(__('Email is incorrect')); +// } +// $user = \app\common\model\User::getByEmail($email); +// if (!$user) { +// $this->error(__('User not found')); +// } +// $ret = Ems::check($email, $captcha, 'resetpwd'); +// if (!$ret) { +// $this->error(__('Captcha is incorrect')); +// } +// Ems::flush($email, 'resetpwd'); +// } +// //模拟一次登录 +// $this->auth->direct($user->id); +// $ret = $this->auth->changepwd($newpassword, '', true); +// if ($ret) { +// $this->success(__('Reset password successful')); +// } else { +// $this->error($this->auth->getError()); +// } +// } diff --git a/application/manystoreapi/library/ManystoreAuth.php b/application/manystoreapi/library/ManystoreAuth.php index c29ce42..73c12c5 100644 --- a/application/manystoreapi/library/ManystoreAuth.php +++ b/application/manystoreapi/library/ManystoreAuth.php @@ -244,22 +244,22 @@ class ManystoreAuth return $ids; } - /** - * 获得用户资料 - * @param int $uid 用户id - * @return mixed - */ - protected function getUserInfo($uid) - { - static $user_info = []; - - $user = Db::name($this->config['auth_user']); - // 获取用户表主键 - $_pk = is_string($user->getPk()) ? $user->getPk() : 'uid'; - if (!isset($user_info[$uid])) { - $user_info[$uid] = $user->where($_pk, $uid)->find(); - } - - return $user_info[$uid]; - } +// /** +// * 获得用户资料 +// * @param int $uid 用户id +// * @return mixed +// */ +// protected function getUserInfo($uid) +// { +// static $user_info = []; +// +// $user = Db::name($this->config['auth_user']); +// // 获取用户表主键 +// $_pk = is_string($user->getPk()) ? $user->getPk() : 'uid'; +// if (!isset($user_info[$uid])) { +// $user_info[$uid] = $user->where($_pk, $uid)->find(); +// } +// +// return $user_info[$uid]; +// } } diff --git a/public/assets/css/backend.css b/public/assets/css/backend.css index c9cfdf0..6bb65e4 100644 --- a/public/assets/css/backend.css +++ b/public/assets/css/backend.css @@ -1,6 +1,6 @@ @import url("../css/bootstrap.css"); @import url("../css/fastadmin.css"); -@import url("../css/skins/skin-black-blue.css"); +@import url("../css/skins/skin-blue-light.css"); @import url("../css/iconfont.css"); @import url("../libs/font-awesome/css/font-awesome.min.css"); @import url("../libs/toastr/toastr.min.css"); diff --git a/public/assets/css/manystore.css b/public/assets/css/manystore.css index 926c194..d9610e9 100644 --- a/public/assets/css/manystore.css +++ b/public/assets/css/manystore.css @@ -1,6 +1,6 @@ @import url("../css/bootstrap.css"); @import url("../css/fastadmin.css"); -@import url("../css/skins/skin-black-blue.css"); +@import url("../css/skins/skin-black-light.css"); @import url("../css/iconfont.css"); @import url("../libs/font-awesome/css/font-awesome.min.css"); @import url("../libs/toastr/toastr.min.css");