Commit 231dcb10 authored by shajiaiming's avatar shajiaiming

Merge branch 'feature/ucenter' into 'master'

Feature/ucenter See merge request !57
parents f4c21ec8 5a0d1767
<?php
namespace api\base;
class BaseConstant
{
const ERROR = 'error';
const MSG = 'msg';
const MESSAGE = 'message';
const CODE = 'code';
const VAL = 'val';
const DATA = 'data';
const OK = 'ok';
const FINALTAG = 'finaltag';
}
...@@ -37,7 +37,7 @@ class BaseResponse extends Response ...@@ -37,7 +37,7 @@ class BaseResponse extends Response
$return = $data; $return = $data;
} }
if (YII_ENV_DEV) { if (YII_ENV_DEV) {
$return['time'] = \Yii::$app->controller->end - \Yii::$app->controller->start; #$return['time'] = \Yii::$app->controller->end - \Yii::$app->controller->start;
} }
\Yii::$app->response->data = $return; \Yii::$app->response->data = $return;
parent::send(); parent::send();
......
<?php
namespace api\base;
use yii\helpers\Html;
use yii\web\Response;
class ResponseMsg
{
public $is_support_jsonp = false;
public $header_list = [];
private static $default_header_list = [];
public function __construct()
{
// if ('cli' !== php_sapi_name()){
// $this->header_list = self::$default_header_list;
// $this->fzmCrossHeader();
// }
}
public function fzmCrossHeader()
{
$allow_list = \Yii::$app->params['allow_options_domain']['common'];
$origin = \Yii::$app->request->headers->get('Origin');
if (!in_array($origin, $allow_list)) {
$origin = implode(',', $allow_list);
}
$this->header('Access-Control-Allow-Origin', $origin);
$this->header('Access-Control-Allow-Methods', 'POST,GET,OPTIONS');
$this->header('Access-Control-Allow-Credentials', 'true');
$this->header('Access-Control-Allow-Headers', 'Authorization,FZM-REQUEST-OS,FZM-USER-IP,FZM-REQUEST-UUID,Content-Type,Content-Length');
}
public static function setDefaultHeader($default_header_list)
{
foreach ($default_header_list as $key => $header) {
self::$default_header_list[$key] = $header;
}
}
public static function getDefaultHeader()
{
return self::$default_header_list;
}
public function arrSuccess($data = BaseConstant::OK, $code = 200)
{
return [BaseConstant::ERROR => false, BaseConstant::MESSAGE => $data, BaseConstant::CODE => $code];
}
public function arrFail($data, $code = -1)
{
return [BaseConstant::ERROR => true, BaseConstant::MESSAGE => $data, BaseConstant::CODE => $code];
}
/**
* 失败返回接口
* @param string $msg
* @param int $code
* @return string
*/
public function jsonError($msg = '', $code = -1)
{
if (empty($msg)) {
$msg = 'unknown error';
}
$view = [
BaseConstant::CODE => $code,
BaseConstant::MSG => $msg,
BaseConstant::DATA => null,
];
$json = json_encode($view);
return $this->dumpJsonData($json);
}
/**
* 成功返回接口
* @param string $msg
* @param int $code
* @return string
*/
public function jsonSuccess($data = '', $code = 200)
{
$view = [
BaseConstant::CODE => $code,
BaseConstant::MESSAGE => BaseConstant::OK,
BaseConstant::DATA => $data
];
$json = json_encode($view);
return $this->dumpJsonData($json);
}
/**
* 直接处理接口数据
* @param $ret
*/
public function dealRet($ret)
{
if (true === $ret[BaseConstant::ERROR]) {
$this->jsonError($ret[BaseConstant::MESSAGE] ? : 'unknown error');
} else {
$this->jsonSuccess($ret[BaseConstant::MESSAGE] ? : BaseConstant::OK);
}
}
/**
* 根据是否为JSONP做特殊处理输出
* @param $json
* @return string
*/
public function dumpJsonData($json)
{
$callback = '';
if (true === $this->is_support_jsonp) {
if (!$this->isDebug()) {
$this->header('Content-type', 'application/javascript');
}
$callback_key = 'jsonpcallback';
$callback = $_GET[$callback_key];
if ($callback) {
$callback = Html::encode($callback_key);
$json = $callback . '(' . $json . ')';
}
}
if (!$callback && !$this->isDebug()) {
$this->header('Content-type', 'application/json');
}
return $json;
}
/**
* @param $json_str
* @param string $callback_key
* @return string
*/
public function printByJson($json_str, $callback_key = '')
{
$callback = '';
if ($callback_key) {
$callback = $_GET[$callback_key] ?? '';
}
if ($callback) {
$callback = Html::encode($callback_key);
if (!$this->isDebug()) {
$this->header('Content-type', 'application/javascript');
}
return $callback . '(' . $json_str . ')';
} else {
if (!$this->isDebug()) {
$this->header('Content-type', 'application/json');
}
return $json_str;
}
}
/**
* @param $arr
* @param string $callback_key
* @return string
*/
public function printByArr($arr, $callback_key = '')
{
$callback = '';
if ($callback_key) {
$callback = $_GET[$callback_key] ?? '';
}
if ($callback) {
$callback = Html::encode($callback_key);
if (!$this->isDebug()) {
$this->header('Content-type', 'application/javascript');
}
return $callback . '(' . json_encode($arr) . ')';
} else {
if (!$this->isDebug()) {
$this->header('Content-type', 'application/json');
}
return json_encode($arr);
}
}
public function printOldFail($code, $code_msg, $detail_code, $detail_msg, $callback_key = '')
{
$this->fzmCrossHeader();
$callback = '';
if ($callback_key) {
$callback = $_GET[$callback_key] ?? '';
}
$arr = ['code' => $code, 'error' => $code_msg, 'ecode' => $detail_code, 'message' => $detail_msg, 'data' => []];
if ($callback) {
$callback = Html::encode($callback_key);
if (!$this->isDebug()) {
$this->header('Content-type', 'application/javascript');
}
return $callback . '(' . json_encode($arr) . ')';
} else {
if (!$this->isDebug()) {
$this->header('Content-type', 'application/json');
}
return json_encode($arr);
}
}
/**
* @param $success_data
* @param string $callback_key
* @return string
*/
public function printOldSuccess($success_data, $callback_key = '')
{
$this->fzmCrossHeader();
$callback = '';
if ($callback_key) {
$callback = $_GET[$callback_key] ?? '';
}
$arr = ['code' => 200, 'ecode' => 200, 'error' => 'OK', 'message' => 'OK', 'data' => $success_data];
if ($callback) {
$callback = Html::encode($callback_key);
if (!$this->isDebug()) {
$this->header('Content-type', 'application/javascript');
}
return $callback . '(' . json_encode($arr) . ')';
} else {
if (!$this->isDebug()) {
$this->header('Content-type', 'application/json');
}
return json_encode($arr);
}
}
/**
* 解决xdebug cookie设置不了的问题
*/
private function isDebug()
{
if (defined('SERVICE_ENV') && (SERVICE_ENV === 'test' || SERVICE_ENV === 'local') && isset($_GET['debug'])) {
return true;
}
return false;
}
public function header($key, $value)
{
$this->header_list[$key] = $value;
}
public function getHeaders()
{
return $this->header_list;
}
public function withHeaders($header_arr)
{
\Yii::$app->response->format = \yii\web\Response::FORMAT_RAW;
foreach ($header_arr as $key => $val) {
\Yii::$app->response->headers->add($key, $val);
}
return $this;
}
public function withContent($content)
{
return $content;
}
}
<?php
/**
* Created by PhpStorm.
* User: jiaming
* Date: 2019/7/17
* Time: 11:11
*/
namespace common\base;
use yii\web\Request;
class BaseRequest extends Request
{
private $user_id = 0;
private $platform_id = 0;
public function getUserId()
{
return $this->user_id;
}
public function setUserId($value)
{
$this->user_id = $value;
}
public function getPlatformId()
{
return $this->platform_id;
}
public function setPlatformId($value)
{
$this->platform_id = $value;
}
}
\ No newline at end of file
<?php
/**
* Created by PhpStorm.
* User: jiaming
* Date: 2019/6/20
* Time: 11:11
*/
namespace common\behaviors;
use Yii;
use common\models\Admin;
use api\base\ResponseMsg;
use common\components\Response;
use yii\base\ActionFilter;
class LoginStatusAuthInterceptor extends ActionFilter
{
public function beforeAction($action)
{
$request_class = get_class($action->controller);
$request_action = $action->id;
if('login' == $request_action || 'user-sync' == $request_action){
return true;
}
$token_string = Yii::$app->request->headers->get('Token');
if(false == $token_string){
$msg = 'platform auth error';
$code = '40004';
goto doEnd;
}
$model = new Admin();
$user = $model->loginByAccessToken($token_string,'');
if(false == $user){
$msg = 'user auth error';
$code = '40004';
goto doEnd;
}
$user_id = $user->uid;
$platform_id = $user->platform_id;
Yii::$app->request->setUserId($user_id);
Yii::$app->request->setPlatformId($platform_id);
return true;
doEnd :
// 返回错误
$response_message = new ResponseMsg();
$content = $response_message->jsonError($msg, $code);
$content = $response_message->withHeaders($response_message->getHeaders())->withContent($content);
Yii::$app->response->data = $content;
Yii::$app->response->send();
return false;
}
public function frontAuth()
{
//验证用户token正确性
}
}
\ No newline at end of file
<?php
/**
* Created by PhpStorm.
* User: jiaming
* Date: 2019/6/20
* Time: 11:11
*/
namespace common\behaviors;
use api\base\ResponseMsg;
use yii\base\ActionFilter;
use common\models\Admin;
use Yii;
class UserAuthInterceptor extends ActionFilter
{
public function beforeAction($action)
{
if (!parent::beforeAction($action)) {
return false;
}
$request_class = get_class($action->controller);
$request_action = $action->id;
if('login' == $request_action || 'user-sync' == $request_action){
return true;
}
$token_string = Yii::$app->request->headers->get('Token');
$model = new Admin();
$user = $model->loginByAccessToken($token_string, '');
if (empty($user)) {
$code = '40001';
$msg = 'user auth error';
goto doEnd;
}
$user_id = $user->uid;
$platform_id = $user->platform_id;
Yii::$app->request->setUserId($user_id);
Yii::$app->request->setPlatformId($platform_id);
$user_auth = Yii::$app->params['user_auth']['user_auth'];
$user_auth_map = $user_auth[$platform_id] ?? null;
if (empty($user_auth_map)) {
$code = '40001';
$msg = 'platform auth error';
goto doEnd;
}
$user_auth_map = $user_auth_map[$user_id] ?? null;
if (empty($user_auth_map)) {
$code = '40001';
$msg = 'user auth error';
goto doEnd;
}
$auth_type_map = Yii::$app->params['user_auth'][$user_auth_map];
$auth_type_map = array_unique($auth_type_map, SORT_REGULAR);
$switch = false;
foreach ($auth_type_map as $key => $auth_type) {
if (empty($auth_type)) continue;
if ($request_class == $auth_type['class']) {
$action_map = $auth_type['actions'];
$switch = true;
break;
}
}
if (false == $switch) {
$code = '40003';
$msg = 'controller auth error';
goto doEnd;
}
if (empty($action_map)) {
return true;
}
if (in_array($request_action, $action_map)) {
return true;
} else {
$code = '40004';
$msg = 'action auth error';
goto doEnd;
}
doEnd :
// 返回错误
$response_message = new ResponseMsg();
$content = $response_message->jsonError($msg, $code);
$content = $response_message->withHeaders($response_message->getHeaders())->withContent($content);
Yii::$app->response->data = $content;
Yii::$app->response->send();
return false;
}
}
\ No newline at end of file
...@@ -13,12 +13,14 @@ use yii\web\IdentityInterface; ...@@ -13,12 +13,14 @@ use yii\web\IdentityInterface;
* @property string $uid * @property string $uid
* @property string $username * @property string $username
* @property string $password * @property string $password
* @property string $access_token
* @property string $reg_time * @property string $reg_time
* @property string $reg_ip * @property string $reg_ip
* @property string $last_login_time * @property string $last_login_time
* @property string $last_login_ip * @property string $last_login_ip
* @property string $update_time * @property string $update_time
* @property integer $status * @property integer $status
* @property integer $platform_id
*/ */
class Admin extends \common\modelsgii\Admin implements IdentityInterface class Admin extends \common\modelsgii\Admin implements IdentityInterface
{ {
...@@ -34,14 +36,6 @@ class Admin extends \common\modelsgii\Admin implements IdentityInterface ...@@ -34,14 +36,6 @@ class Admin extends \common\modelsgii\Admin implements IdentityInterface
} }
/** /**
* @inheritdoc
*/
public static function findIdentityByAccessToken($token, $type = null)
{
throw new NotSupportedException('"findIdentityByAccessToken" is not implemented.');
}
/**
* 根据用户名获取账号信息 * 根据用户名获取账号信息
* *
* @param string $username * @param string $username
...@@ -156,4 +150,43 @@ class Admin extends \common\modelsgii\Admin implements IdentityInterface ...@@ -156,4 +150,43 @@ class Admin extends \common\modelsgii\Admin implements IdentityInterface
$this->password = null; $this->password = null;
} }
/**
* @inheritdoc
*/
public static function findIdentityByAccessToken($token, $type = null)
{
$user = static::find()->where(['access_token' => $token, 'status' => self::STATUS_ACTIVE])->one();
if (!$user) {
return false;
}
// if ($user->expire_at < time()) {
// throw new UnauthorizedHttpException('the access - token expired ', -1);
// } else {
// return $user;
// }
return $user;
}
public function loginByAccessToken($accessToken, $type) {
return static::findIdentityByAccessToken($accessToken, $type);
}
/**
* Generate accessToken string
* @return string
* @throws \yii\base\Exception
*/
public function generateAccessToken()
{
$this->access_token = Yii::$app->security->generateRandomString();
return $this->access_token;
}
public static function loadArray(array $data)
{
return self::getDb()->createCommand()->batchInsert(self::tableName(),
['bind_uid', 'username', 'salt', 'password', 'reg_time', 'reg_ip', 'last_login_time', 'last_login_ip', 'update_time', 'status', 'platform_id'],
$data)->execute();
}
} }
...@@ -11,10 +11,13 @@ class LoginForm extends Model ...@@ -11,10 +11,13 @@ class LoginForm extends Model
{ {
public $username; public $username;
public $password; public $password;
public $token;
public $rememberMe = true; public $rememberMe = true;
private $_user; private $_user;
//定义场景
const SCENARIOS_LOGIN = 'login';
/** /**
* @inheritdoc * @inheritdoc
...@@ -31,6 +34,13 @@ class LoginForm extends Model ...@@ -31,6 +34,13 @@ class LoginForm extends Model
]; ];
} }
public function scenarios() {
$scenarios = [
self:: SCENARIOS_LOGIN => ['username', 'password'],
];
return array_merge( parent:: scenarios(), $scenarios);
}
/** /**
* Validates the password. * Validates the password.
* This method serves as the inline validation for password. * This method serves as the inline validation for password.
...@@ -56,7 +66,12 @@ class LoginForm extends Model ...@@ -56,7 +66,12 @@ class LoginForm extends Model
public function login() public function login()
{ {
if ($this->validate()) { if ($this->validate()) {
return Yii::$app->user->login($this->getUser(), $this->rememberMe ? 3600 * 24 * 30 : 0); if ($this->getUser()) {
$access_token = $this->_user->generateAccessToken();
$this->_user->access_token = $access_token ;
$this->_user->save();
return $access_token;
}
} }
return false; return false;
...@@ -70,7 +85,21 @@ class LoginForm extends Model ...@@ -70,7 +85,21 @@ class LoginForm extends Model
protected function getUser() protected function getUser()
{ {
if ($this->_user === null) { if ($this->_user === null) {
$this->_user = User::findByUsername($this->username); $this->_user = Admin::findByUsername($this->username);
}
return $this->_user;
}
/**
* Finds user by [[token]]
*
* @return User|null
*/
protected function getToken()
{
if ($this->_user === null) {
$this->_user = Admin::findIdentityByAccessToken($this->token);
} }
return $this->_user; return $this->_user;
......
...@@ -10,6 +10,7 @@ use yii\helpers\HtmlPurifier; ...@@ -10,6 +10,7 @@ use yii\helpers\HtmlPurifier;
* @property string $uid * @property string $uid
* @property string $username * @property string $username
* @property string $password * @property string $password
* @property string $access_token
* @property string $salt * @property string $salt
* @property string $reg_time * @property string $reg_time
* @property string $reg_ip * @property string $reg_ip
...@@ -17,6 +18,7 @@ use yii\helpers\HtmlPurifier; ...@@ -17,6 +18,7 @@ use yii\helpers\HtmlPurifier;
* @property string $last_login_ip * @property string $last_login_ip
* @property string $update_time * @property string $update_time
* @property integer $status * @property integer $status
* @property integer $platform_id
*/ */
class Admin extends \common\core\BaseActiveRecord class Admin extends \common\core\BaseActiveRecord
{ {
...@@ -42,10 +44,11 @@ class Admin extends \common\core\BaseActiveRecord ...@@ -42,10 +44,11 @@ class Admin extends \common\core\BaseActiveRecord
return HtmlPurifier::process($str); return HtmlPurifier::process($str);
} }
], ],
[['reg_time', 'reg_ip', 'last_login_time', 'last_login_ip', 'update_time', 'status'], 'integer'], [['reg_time', 'reg_ip', 'last_login_time', 'last_login_ip', 'update_time', 'status', 'platform_id'], 'integer'],
[['username'], 'string', 'max' => 32], [['username'], 'string', 'max' => 32],
[['password'], 'string', 'min' => 6, 'max' => 60], [['password'], 'string', 'min' => 6, 'max' => 60],
[['salt'], 'string', 'max' => 32], [['salt'], 'string', 'max' => 32],
['access_token', 'safe']
]; ];
} }
...@@ -65,6 +68,7 @@ class Admin extends \common\core\BaseActiveRecord ...@@ -65,6 +68,7 @@ class Admin extends \common\core\BaseActiveRecord
'last_login_ip' => 'Last Login Ip', 'last_login_ip' => 'Last Login Ip',
'update_time' => 'Update Time', 'update_time' => 'Update Time',
'status' => 'Status', 'status' => 'Status',
'platform_id' => 'platform_id',
'group' => 'group' 'group' => 'group'
]; ];
} }
......
<?php
namespace common\service\trusteeship;
use Yii;
use common\helpers\Curl;
class TrusteeShipService
{
private $node_params;
public function __construct($parameter = [])
{
if (empty($parameter)) {
$this->node_params = Yii::$app->params['trusteeship'];
} else {
$this->node_params = $parameter;
}
}
public function urlBuild($uri = '')
{
$config = $this->node_params;
$scheme = $config['scheme'] ?? 'http';
$host = $config['host'] ?? '127.0.0.1';
$port = (string)$config['port'] ?? '';
if ($port) {
return $scheme . '://' . $host . ':' . $port . '/' . $uri;
} else {
return $scheme . '://' . $host . '/' . $uri;
}
}
public function send($method = 'GET', $uri, $params = [])
{
$ch = new Curl();
if(!empty($params)) {
$ch->setGetParams($params);
}
$result = $ch->$method($this->urlBuild($uri), false);
if (!$result) {
return ['code' => -1, 'msg' => $ch->errorText];
}
if (200 == $result['code'] && isset($result['data'])) {
return ['code' => $result['code'], 'msg' =>$result['data']];
} else {
return ['code' => -1, 'msg' => $result['message']];
}
}
public function getUserList($params = [])
{
$uri = 'backend/user/user-list';
return $this->send("GET", $uri, $params);
}
public function getWalletBalance($params = [])
{
$uri = 'backend/account/wallet-balance';
return $this->send("GET", $uri, $params);
}
public function getUserAsset($params = [])
{
$uri = 'backend/user/asset';
return $this->send("GET", $uri, $params);
}
}
<?php
namespace wallet\base;
class BaseConstant
{
const ERROR = 'error';
const MSG = 'msg';
const MESSAGE = 'message';
const CODE = 'code';
const VAL = 'val';
const DATA = 'data';
const OK = 'ok';
const FINALTAG = 'finaltag';
}
This diff is collapsed.
<?php
/**
* Created by PhpStorm.
* User: rlgyzhcn
* Date: 18-5-31
* Time: 下午1:28
*/
namespace wallet\base;
use yii\web\Response;
class BaseResponse extends Response
{
public function send()
{
//错误处理
$excpetion = \Yii::$app->errorHandler->exception;
if ($excpetion !== null) {
$this->data = [
'code' => $excpetion->getCode(),
'msg' => $excpetion->getMessage(),
'line' => $excpetion->getLine(),
'file' => $excpetion->getFile(),
];
}
//TODO 在这里对数据进行format,这样控制器中可以直接return一个array,保存到数据域data中即可,eg:['code'=>0,'data'=>$data]
$data = \Yii::$app->response->data;
if (empty($data)) {
$return['code'] = 1;
$return['msg'] = '数据为空';
} elseif (is_array($data) && !isset($data['code'])) {
$return['code'] = 0;
$return['count'] = count($data);
$return['data'] = $data;
} else {
$return = $data;
}
if (YII_ENV_DEV) {
#$return['time'] = \Yii::$app->controller->end - \Yii::$app->controller->start;
}
\Yii::$app->response->data = $return;
parent::send();
}
}
\ No newline at end of file
<?php
namespace wallet\base;
use yii\helpers\Html;
use yii\web\Response;
class ResponseMsg
{
public $is_support_jsonp = false;
public $header_list = [];
private static $default_header_list = [];
public function __construct()
{
// if ('cli' !== php_sapi_name()){
// $this->header_list = self::$default_header_list;
// $this->fzmCrossHeader();
// }
}
public function fzmCrossHeader()
{
$allow_list = \Yii::$app->params['allow_options_domain']['common'];
$origin = \Yii::$app->request->headers->get('Origin');
if (!in_array($origin, $allow_list)) {
$origin = implode(',', $allow_list);
}
$this->header('Access-Control-Allow-Origin', $origin);
$this->header('Access-Control-Allow-Methods', 'POST,GET,OPTIONS');
$this->header('Access-Control-Allow-Credentials', 'true');
$this->header('Access-Control-Allow-Headers', 'Authorization,FZM-REQUEST-OS,FZM-USER-IP,FZM-REQUEST-UUID,Content-Type,Content-Length');
}
public static function setDefaultHeader($default_header_list)
{
foreach ($default_header_list as $key => $header) {
self::$default_header_list[$key] = $header;
}
}
public static function getDefaultHeader()
{
return self::$default_header_list;
}
public function arrSuccess($data = BaseConstant::OK, $code = 200)
{
return [BaseConstant::ERROR => false, BaseConstant::MESSAGE => $data, BaseConstant::CODE => $code];
}
public function arrFail($data, $code = -1)
{
return [BaseConstant::ERROR => true, BaseConstant::MESSAGE => $data, BaseConstant::CODE => $code];
}
/**
* 失败返回接口
* @param string $msg
* @param int $code
* @return string
*/
public function jsonError($msg = '', $code = -1)
{
if (empty($msg)) {
$msg = 'unknown error';
}
$view = [
BaseConstant::CODE => $code,
BaseConstant::MESSAGE => $msg,
];
$json = json_encode($view);
return $this->dumpJsonData($json);
}
/**
* 成功返回接口
* @param string $msg
* @param int $code
* @return string
*/
public function jsonSuccess($data = '', $code = 200)
{
$view = [
BaseConstant::CODE => $code,
BaseConstant::MESSAGE => BaseConstant::OK,
BaseConstant::DATA => $data
];
$json = json_encode($view);
return $this->dumpJsonData($json);
}
/**
* 直接处理接口数据
* @param $ret
*/
public function dealRet($ret)
{
if (true === $ret[BaseConstant::ERROR]) {
$this->jsonError($ret[BaseConstant::MESSAGE] ? : 'unknown error');
} else {
$this->jsonSuccess($ret[BaseConstant::MESSAGE] ? : BaseConstant::OK);
}
}
/**
* 根据是否为JSONP做特殊处理输出
* @param $json
* @return string
*/
public function dumpJsonData($json)
{
$callback = '';
if (true === $this->is_support_jsonp) {
if (!$this->isDebug()) {
$this->header('Content-type', 'application/javascript');
}
$callback_key = 'jsonpcallback';
$callback = $_GET[$callback_key];
if ($callback) {
$callback = Html::encode($callback_key);
$json = $callback . '(' . $json . ')';
}
}
if (!$callback && !$this->isDebug()) {
$this->header('Content-type', 'application/json');
}
return $json;
}
/**
* @param $json_str
* @param string $callback_key
* @return string
*/
public function printByJson($json_str, $callback_key = '')
{
$callback = '';
if ($callback_key) {
$callback = $_GET[$callback_key] ?? '';
}
if ($callback) {
$callback = Html::encode($callback_key);
if (!$this->isDebug()) {
$this->header('Content-type', 'application/javascript');
}
return $callback . '(' . $json_str . ')';
} else {
if (!$this->isDebug()) {
$this->header('Content-type', 'application/json');
}
return $json_str;
}
}
/**
* @param $arr
* @param string $callback_key
* @return string
*/
public function printByArr($arr, $callback_key = '')
{
$callback = '';
if ($callback_key) {
$callback = $_GET[$callback_key] ?? '';
}
if ($callback) {
$callback = Html::encode($callback_key);
if (!$this->isDebug()) {
$this->header('Content-type', 'application/javascript');
}
return $callback . '(' . json_encode($arr) . ')';
} else {
if (!$this->isDebug()) {
$this->header('Content-type', 'application/json');
}
return json_encode($arr);
}
}
public function printOldFail($code, $code_msg, $detail_code, $detail_msg, $callback_key = '')
{
$this->fzmCrossHeader();
$callback = '';
if ($callback_key) {
$callback = $_GET[$callback_key] ?? '';
}
$arr = ['code' => $code, 'error' => $code_msg, 'ecode' => $detail_code, 'message' => $detail_msg, 'data' => []];
if ($callback) {
$callback = Html::encode($callback_key);
if (!$this->isDebug()) {
$this->header('Content-type', 'application/javascript');
}
return $callback . '(' . json_encode($arr) . ')';
} else {
if (!$this->isDebug()) {
$this->header('Content-type', 'application/json');
}
return json_encode($arr);
}
}
/**
* @param $success_data
* @param string $callback_key
* @return string
*/
public function printOldSuccess($success_data, $callback_key = '')
{
$this->fzmCrossHeader();
$callback = '';
if ($callback_key) {
$callback = $_GET[$callback_key] ?? '';
}
$arr = ['code' => 200, 'ecode' => 200, 'error' => 'OK', 'message' => 'OK', 'data' => $success_data];
if ($callback) {
$callback = Html::encode($callback_key);
if (!$this->isDebug()) {
$this->header('Content-type', 'application/javascript');
}
return $callback . '(' . json_encode($arr) . ')';
} else {
if (!$this->isDebug()) {
$this->header('Content-type', 'application/json');
}
return json_encode($arr);
}
}
/**
* 解决xdebug cookie设置不了的问题
*/
private function isDebug()
{
if (defined('SERVICE_ENV') && (SERVICE_ENV === 'test' || SERVICE_ENV === 'local') && isset($_GET['debug'])) {
return true;
}
return false;
}
public function header($key, $value)
{
$this->header_list[$key] = $value;
}
public function getHeaders()
{
return $this->header_list;
}
public function withHeaders($header_arr)
{
\Yii::$app->response->format = \yii\web\Response::FORMAT_RAW;
foreach ($header_arr as $key => $val) {
\Yii::$app->response->headers->add($key, $val);
}
return $this;
}
public function withContent($content)
{
return $content;
}
}
namespace: backend\tests
actor: Tester
paths:
tests: tests
log: tests/_output
data: tests/_data
helpers: tests/_support
settings:
bootstrap: _bootstrap.php
colors: true
memory_limit: 1024M
modules:
config:
Yii2:
configFile: 'config/test-local.php'
main-local.php
params-local.php
\ No newline at end of file
<?php
$params = array_merge(
require __DIR__ . '/../../common/config/params.php',
require __DIR__ . '/../../common/config/params-local.php',
require __DIR__ . '/params.php',
require __DIR__ . '/params-local.php'
);
return [
'id' => 'app-backend',
'basePath' => dirname(__DIR__),
'timeZone' => 'Etc/GMT-8',
'controllerNamespace' => 'backend\controllers',
'bootstrap' => ['log'],
'defaultRoute' => 'site/index',
'layout' => 'main',
'modules' => [],
'components' => [
'request' => [
'class' => 'common\core\Request',
'baseUrl' => '/admin',
'cookieValidationKey' => 'Yr4XDePew55tutE3CVZ7vBUqVO3iorN6',
//'csrfParam' => '_csrf-backend',
],
'session' => [
'name' => 'manage-backend',
],
'errorHandler' => [
'errorAction' => 'public/error',
],
'urlManager' => [
'class' => 'common\core\UrlManager',
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [
],
]
],
'params' => $params,
];
<?php
return [
'adminEmail' => 'admin@example.com',
/* 后台错误页面模板 */
'action_error' => '@backend/views/public/error.php', // 默认错误跳转对应的模板文件
'action_success' => '@backend/views/public/success.php', // 默认成功跳转对应的模板文件
];
<?php
namespace wallet\controllers;
use common\models\psources\CoinPlatformWithHold;
use common\service\chain33\Chain33Service;
use Yii;
use wallet\base\BaseController;
use yii\data\Pagination;
class MonitorController extends BaseController
{
/**
* landing
* @return array
* @throws \yii\base\Exception
* @throws \yii\base\InvalidConfigException
*/
public function actionList()
{
$msg = 'ok';
$code = 0;
$page = Yii::$app->request->get('page', 1);
$query = CoinPlatformWithHold::find()->select('id, platform, address')->asArray();
$count = $query->count();
if( 0 == $count ) {
$msg = '数据不存在';
$code = -1;
$data = null;
goto doEnd;
}
$models = $query->offset(($page - 1) * 10)->limit(10)->asArray()->all();
$countQuery = clone $query;
$pages = new Pagination(['totalCount' => $countQuery->count(), 'pageSize' => '10']);
$address = [];
foreach ($models as $model){
$address[] = $model['address'];
}
if(empty($address)){
$data = null;
goto doEnd;
}
$service = new Chain33Service();
$execer = 'coins';
$result = $service->getBalance($address, $execer);
if(0 != $result['code']){
$msg = $result['msg'];
$code = -1;
goto doEnd;
}
$result_balance = $result['result'];
$balance_arr = [];
foreach ($result_balance as $key => $val){
$balance_arr[$val['addr']] = $val;
}
foreach ($models as &$model){
$model['balance'] = $balance_arr[$model['address']]['balance'];
}
$data = [
'list' => $models,
'page' => [
'pageCount' => $pages->pageCount,
'pageSize' => 10,
'currentPage' => $page,
]
];
doEnd :
return ['code' => $code, 'msg' => $msg, 'data' => $data];
}
}
\ No newline at end of file
<?php
namespace wallet\controllers;
use Yii;
use common\models\Admin;
use common\models\LoginForm;
use wallet\base\BaseController;
use common\service\trusteeship\TrusteeShipService;
class UserController extends BaseController
{
/**
* landing
* @return array
* @throws \yii\base\Exception
* @throws \yii\base\InvalidConfigException
*/
public function actionLogin()
{
$msg = 'ok';
$code = 0;
$model = new LoginForm();
$model->setScenario(LoginForm::SCENARIOS_LOGIN);
$model->load(Yii::$app->request->post(), '');
if (!$model->login()) {
$msg = implode(", ", \yii\helpers\ArrayHelper::getColumn($model->errors, 0, false)); // Model's Errors string
$data = null;
$code = -1;
goto doEnd;
}
$data = ['access_token' => $model->login()];
doEnd :
return ['code' => $code, 'msg' => $msg, 'data' => $data];
}
public function actionUserInfo()
{
$msg = 'ok';
$code = 0;
$token_string = Yii::$app->request->headers->get('Token');
$user = Admin::findIdentityByAccessToken($token_string);
$data = [
'username' => $user->username,
'uid' => isset($user->bind_uid) ? $user->bind_uid : $user->uid,
'type' => isset($user->bind_uid) ? 2 : 1,
'platform_id' => $user->platform_id
];
return ['code' => $code, 'msg' => $msg, 'data' => $data];
}
/**
* 用户同步
*/
public function actionUserSync()
{
$items = Yii::$app->request->post();
if (count($items['items']) > 10) {
return ['code' => -1, 'data' => [], 'msg' => '一次最多同步20条数据'];
}
$duplicate = 0;
foreach ($items['items'] as $key => $item) {
$model = Admin::find()->where(['username' => $item['username']])->andWhere(['platform_id' => (int)$item['platform']])->one();
if ($model) {
$duplicate++;
continue;
}
$datas[] = [
$item['bind_uid'],
$item['username'],
Yii::$app->security->generateRandomString(),
Yii::$app->security->generatePasswordHash('123456'),
time(),
ip2long('127.0.0.1'),
0,
ip2long('127.0.0.1'),
0,
1,
$item['platform']
];
}
if (!empty($datas)) {
Admin::loadArray($datas);
}
return ['code' => 1, 'data' => [], 'msg' => '数据更新成功,共有 ' . $duplicate . ' 条重复'];
$header = Yii::$app->request->headers;
$platform_id = $header['platform_id'] ?? 17;
$post = Yii::$app->request->post();
$data = [
'bind_uid' => $post['bind_uid'],
'username' => $post['username'],
'salt' => Yii::$app->security->generateRandomString(),
'password' => Yii::$app->security->generatePasswordHash('123456'),
'reg_time' => time(),
'reg_ip' => ip2long('127.0.0.1'),
'last_login_time' => 0,
'last_login_ip' => ip2long('127.0.0.1'),
'update_time' => 0,
'status' => 1,
'platform_id' => $platform_id
];
$role = Yii::$app->request->post('role', 'GHPwallet');
$model = new Admin();
if ($model->load($data, '') && $model->save()) {
$auth = Yii::$app->authManager;
$role = $auth->getRole($role);
$auth->assign($role, $model->uid);
exit;
} else {
var_dump($model->errors);
exit;
}
}
/**
* 用户列表
*/
public function actionUserList()
{
$current_platform_id = Yii::$app->request->getPlatformId();
if(1 === $current_platform_id) {
$platform_id = Yii::$app->request->get('platform_id', 1);
$platform_id = empty($platform_id) ? 1 : $platform_id;
} else {
$platform_id = Yii::$app->request->getPlatformId();
}
if(!isset(Yii::$app->params['trusteeship']['port'][$platform_id])){
return ['code' => -1, 'data' => [], 'msg' => '此钱包节点尚未开通'];
}
$node_params = [
'scheme' => Yii::$app->params['trusteeship']['scheme'],
'host' => Yii::$app->params['trusteeship']['host'],
'port' => Yii::$app->params['trusteeship']['port'][$platform_id]
];
$page = Yii::$app->request->get('page', 1);
$size = Yii::$app->request->get('size', 15);
$real_type = Yii::$app->request->get('real_type', '');
$search_type = Yii::$app->request->get('search_type', 'user');
$search = Yii::$app->request->get('search', '');
$start_time = Yii::$app->request->get('start_time', '');
$end_time = Yii::$app->request->get('end_time', '');
$params = [
'page' => $page,
'size' => $size,
'real_type' => $real_type,
'search_type' => $search_type,
'search' => $search,
'start_time' => $start_time,
'end_time' => $end_time
];
$service = new TrusteeShipService($node_params);
$result = $service->getUserList($params);
if (200 !== $result['code']) {
return ['code' => $result['code'], 'data' => [], 'msg' => $result['msg']];
}
return ['code' => 1, 'data' => $result['msg'], 'msg' => 'success'];
}
}
\ No newline at end of file
<?php
namespace wallet\controllers;
use common\service\trusteeship\TrusteeShipService;
use Yii;
use common\models\Admin;
use wallet\base\BaseController;
use common\models\psources\CoinPlatform;
class WalletController extends BaseController
{
/**
* landing
* @return array
* @throws \yii\base\Exception
* @throws \yii\base\InvalidConfigException
*/
public function actionList()
{
$platform_id = Yii::$app->request->getPlatformId();
if (1 === $platform_id) {
$platforms = CoinPlatform::find()->select('id, name')->asArray()->all();
} else {
$platforms = CoinPlatform::find()->select('id, name')->where(['id' => $platform_id])->asArray()->all();
}
return ['code' => 0, 'msg' => 'ok', 'data' => $platforms];
}
public function actionWalletBallance()
{
$current_platform_id = Yii::$app->request->getPlatformId();
if(1 === $current_platform_id) {
$platform_id = Yii::$app->request->get('platform_id', 1);
$platform_id = empty($platform_id) ? 1 : $platform_id;
} else {
$platform_id = Yii::$app->request->getPlatformId();
}
if(!isset(Yii::$app->params['trusteeship']['port'][$platform_id])){
return ['code' => -1, 'data' => [], 'msg' => '此钱包节点尚未开通'];
}
$node_params = [
'scheme' => Yii::$app->params['trusteeship']['scheme'],
'host' => Yii::$app->params['trusteeship']['host'],
'port' => Yii::$app->params['trusteeship']['port'][$platform_id]
];
$type = Yii::$app->request->get('type', 1);
$page = Yii::$app->request->get('page', 1);
$size = Yii::$app->request->get('size', 15);
$currency = Yii::$app->request->get('currency ', '');
$params = [
'type' => $type,
'page' => $page,
'size' => $size,
'currency' => $currency
];
$service = new TrusteeShipService($node_params);
$result = $service->getWalletBalance($params);
if (200 !== $result['code']) {
return ['code' => $result['code'], 'data' => [], 'msg' => $result['msg']];
}
return ['code' => 1, 'data' => $result['msg'], 'msg' => 'success'];
}
public function actionUserAsset()
{
$platform_id = Yii::$app->request->getPlatformId();
$node_params = [
'scheme' => Yii::$app->params['trusteeship']['scheme'],
'host' => Yii::$app->params['trusteeship']['host'],
'port' => Yii::$app->params['trusteeship']['port'][$platform_id]
];
$uid = Yii::$app->request->get('uid', '');
$params = [
'uid' => $uid
];
$service = new TrusteeShipService($node_params);
$result = $service->getUserAsset($params);
if (200 !== $result['code']) {
return ['code' => $result['code'], 'data' => [], 'msg' => $result['msg']];
}
return ['code' => 1, 'data' => $result['msg'], 'msg' => 'success'];
}
}
\ No newline at end of file
*
!.gitignore
\ No newline at end of file
<?php
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'test');
defined('YII_APP_BASE_PATH') or define('YII_APP_BASE_PATH', __DIR__.'/../../');
require_once YII_APP_BASE_PATH . '/vendor/autoload.php';
require_once YII_APP_BASE_PATH . '/vendor/yiisoft/yii2/Yii.php';
require_once YII_APP_BASE_PATH . '/common/config/bootstrap.php';
require_once __DIR__ . '/../config/bootstrap.php';
<?php
return [
[
'username' => 'erau',
'auth_key' => 'tUu1qHcde0diwUol3xeI-18MuHkkprQI',
// password_0
'password_hash' => '$2y$13$nJ1WDlBaGcbCdbNC5.5l4.sgy.OMEKCqtDQOdQ2OWpgiKRWYyzzne',
'password_reset_token' => 'RkD_Jw0_8HEedzLk7MM-ZKEFfYR7VbMr_1392559490',
'created_at' => '1392559490',
'updated_at' => '1392559490',
'email' => 'sfriesen@jenkins.info',
],
];
<?php
namespace backend\tests;
/**
* Inherited Methods
* @method void wantToTest($text)
* @method void wantTo($text)
* @method void execute($callable)
* @method void expectTo($prediction)
* @method void expect($prediction)
* @method void amGoingTo($argumentation)
* @method void am($role)
* @method void lookForwardTo($achieveValue)
* @method void comment($description)
* @method \Codeception\Lib\Friend haveFriend($name, $actorClass = NULL)
*
* @SuppressWarnings(PHPMD)
*/
class FunctionalTester extends \Codeception\Actor
{
use _generated\FunctionalTesterActions;
/**
* Define custom actions here
*/
}
<?php
namespace backend\tests;
/**
* Inherited Methods
* @method void wantToTest($text)
* @method void wantTo($text)
* @method void execute($callable)
* @method void expectTo($prediction)
* @method void expect($prediction)
* @method void amGoingTo($argumentation)
* @method void am($role)
* @method void lookForwardTo($achieveValue)
* @method void comment($description)
* @method \Codeception\Lib\Friend haveFriend($name, $actorClass = NULL)
*
* @SuppressWarnings(PHPMD)
*/
class UnitTester extends \Codeception\Actor
{
use _generated\UnitTesterActions;
/**
* Define custom actions here
*/
}
class_name: FunctionalTester
modules:
enabled:
- Yii2
<?php
namespace backend\tests\functional;
use backend\tests\FunctionalTester;
use common\fixtures\UserFixture;
/**
* Class LoginCest
*/
class LoginCest
{
/**
* Load fixtures before db transaction begin
* Called in _before()
* @see \Codeception\Module\Yii2::_before()
* @see \Codeception\Module\Yii2::loadFixtures()
* @return array
*/
public function _fixtures()
{
return [
'user' => [
'class' => UserFixture::className(),
'dataFile' => codecept_data_dir() . 'login_data.php'
]
];
}
/**
* @param FunctionalTester $I
*/
public function loginUser(FunctionalTester $I)
{
$I->amOnPage('/site/login');
$I->fillField('Username', 'erau');
$I->fillField('Password', 'password_0');
$I->click('login-button');
$I->see('Logout (erau)', 'form button[type=submit]');
$I->dontSeeLink('Login');
$I->dontSeeLink('Signup');
}
}
<?php
/**
* Here you can initialize variables via \Codeception\Util\Fixtures class
* to store data in global array and use it in Cests.
*
* ```php
* // Here _bootstrap.php
* \Codeception\Util\Fixtures::add('user1', ['name' => 'davert']);
* ```
*
* In Cests
*
* ```php
* \Codeception\Util\Fixtures::get('user1');
* ```
*/
\ No newline at end of file
class_name: UnitTester
<?php
/**
* Here you can initialize variables via \Codeception\Util\Fixtures class
* to store data in global array and use it in Tests.
*
* ```php
* // Here _bootstrap.php
* \Codeception\Util\Fixtures::add('user1', ['name' => 'davert']);
* ```
*
* In Tests
*
* ```php
* \Codeception\Util\Fixtures::get('user1');
* ```
*/
/index-test.php
/robots.txt
/upload
\ No newline at end of file
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php
\ No newline at end of file
<?php
/**
* Created by PhpStorm.
* User: rlgyzhcn
* Date: 18-5-3
* Time: 下午12:53
*/
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');
require __DIR__ . '/../../vendor/autoload.php';
require __DIR__ . '/../../vendor/yiisoft/yii2/Yii.php';
require __DIR__ . '/../../common/config/bootstrap.php';
$config = yii\helpers\ArrayHelper::merge(
require __DIR__ . '/../../common/config/main.php',
require __DIR__ . '/../../common/config/main-local.php',
require __DIR__ . '/../config/main.php',
require __DIR__ . '/../config/main-local.php'
);
(new yii\web\Application($config))->run();
\ No newline at end of file
/**
* 自定义刷新提示
*/
var whenShowLoading=null;
var showMyLoading=function () {
if (typeof(layer) === 'object' && whenShowLoading === null) {
whenShowLoading = layer.load(2, {shade: false});
}
return true;
};
var hideMyLoading=function () {
if (typeof(layer) === 'object' && whenShowLoading !== null) {
layer.close(whenShowLoading);
whenShowLoading = null;
}
return true;
};
/**
* Bootstrap Table Chinese translation
*/
(function ($) {
'use strict';
$.fn.bootstrapTable.locales['zh-CN'] = {
contentType: "application/x-www-form-urlencoded",
striped: true, //设置为 true 会有隔行变色效果
cache: false, //设置为 false 禁用 AJAX 数据缓存
silent: true, //静默刷新方式 refresh {silent: true}
dataType: "json", //服务器返回的数据类型
queryParamsType:'', //queryParams {pageSize, pageNumber, searchText, sortName, sortOrder}
undefinedText: '', //当数据为 undefined 时显示的字符
sidePagination: "server", //服务器分页
pagination: true, //设置为 true 会在表格底部显示分页条
paginationLoop: false, //设置为 true 启用分页条无限循环的功能
/*fixedColumns: true,
fixedNumber: 2,*/
paginationPreText: '上一页',
paginationNextText: '下一页',
ajaxOptions: function () {
if (typeof(request_token) === 'string') {
return {
headers: {"Authorization": 'Bearer ' + request_token}
};
} else {
return {};
}
},
formatLoadingMessage: function () {
return '';
},
formatRecordsPerPage: function (pageNumber) {
return '';//'每页显示 ' + pageNumber + ' 条记录';
},
formatShowingRows: function (pageFrom, pageTo, totalRows) {
return '<span style="font-size: 11px">第 <b>'+pageFrom+'</b>-<b>'+pageTo+'</b> 条,共 <b>'+totalRows+'</b> 条数据. </span>';
//return '显示第 ' + pageFrom + ' 到第 ' + pageTo + ' 条记录,总共 ' + totalRows + ' 条记录';
},
formatSearch: function () {
return '搜索';
},
formatNoMatches: function () {
return '<span style="color: #9e9e9e">没有找到匹配的记录</span>';
},
formatPaginationSwitch: function () {
return '隐藏/显示分页';
},
formatRefresh: function () {
return '刷新';
},
formatToggle: function () {
return '切换';
},
formatColumns: function () {
return '列';
},
formatExport: function () {
return '导出';
},
formatClearFilters: function () {
return '清空过滤';
},
onLoadSuccess: function () {
return hideMyLoading();
},
onLoadError: function () {
return hideMyLoading();
},
onRefresh: function () {
return showMyLoading();
},
onPageChange: function () {
return showMyLoading();
}
};
$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['zh-CN']);
})(jQuery);
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment