IDMS系统框架
1.IDMS系统框架简介
IDMS系统简称智能终端管理系统,包含智能终端的OTA及APP升级管理与智能终端的信息查询与修改。
IDMS系统的系统架构来源于 Laravel框架。
2. 基本路由
你可以将所有路由都定义在routes/web.php中。最基本的 Lumen 路由接收一个 URI 和一个闭包:
/**
* 路由解析
*/
$api->post('merchant/xmlAnalyze', ['uses' => 'MerchantController@xmlAnalyze']);
$api->get('merchant/getEndPointNo/{MrchNo}', ['uses' => 'MerchantController@getEndPointNo']);
3. 中间件简介
HTTP中间件提供了一个便利的机制来过滤进入应用的HTTP请求。例如,Lumen包含了一个中间件来验证用户是否经过授权,如果用户没有经过授权,中间件会将用户重定向到登录页面,否则如果用户经过授权,中间件就会允许请求继续往前进入下一步操作。
当然,除了认证之外,中间件还可以被用来处理更多其它任务。比如:CORS中间件可以用于为离开站点的响应添加合适的头(跨域);日志中间件可以记录所有进入站点的请求。
所有中间件存放在 app/Http/Middleware 目录下。
class Authenticate
{
/**
* The authentication guard factory instance.
*
* @var \Illuminate\Contracts\Auth\Factory
*/
protected $auth;
/**
* Create a new middleware instance.
*
* @param \Illuminate\Contracts\Auth\Factory $auth
* @return void
*/
public function __construct(Auth $auth)
{
$this->auth = $auth;
}
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string|null $guard
* @return mixed
*/
public function handle($request, Closure $next, $guard = null)
{
if ($this->auth->guard($guard)->guest()) {
return response('未登录或者已超时.', 401);
}
$user = $this->auth->guard($guard)->user();
// return $next($request);
//超管放过
$roles=$user->roles;
if($roles && count($roles) > 0)
{
foreach ($roles as $role)
{
if('0000' == $role->id)
return $next($request);
}
}
$perms=$user->permissions();
if(!$perms ||count($perms) <= 0)
return response('该用户尚未分配权限.', 401);
foreach ($perms as $perm)
{
if($perm->permission == API::router()->currentRouteAction())
return $next($request);
}
return response('未经授权的功能调用.', 403);
}
}
4. 控制器
将所有的请求处理逻辑都放在单个routes.php中肯定是不合理的,你也许还希望使用控制器类组织管理这些行为。控制器可以将相关的HTTP请求封装到一个类中进行处理。通常控制器存放在app/Http/Controllers目录中。
class AddressController extends Controller
{
/**
* @api {get} /api/address/{parent} 地址管理-获取地址子节点
* @apiName getChildrenByParent
* @apiDescription 马继康
* @apiGroup Address
* @apiVersion 1.0.0
*
* @apiParam (param_obj) {string} parent 地址父节点*
*
* @apiSuccess (response_obj) {string} code 错误码
* @apiSuccess (response_obj) {string} msg 错误信息
* @apiSuccess (response_obj) {obj} data 返回数据
*
* @apiSuccess (response_obj->data) {string} id 地址id
* @apiSuccess (response_obj->data) {string} addr_name 地址名称
*
* @apiSuccessExample {json} Success-Response:
* {
* "code": "00000",
* "msg": "操作成功",
* "data": [
* {
* "id": "320100000000",
* "addr_name": "南京市"
* }
* ]
* }
* @apiErrorExample {json} Error-Response:
* HTTP/1.1 400 Bad Request
* {"message":"\u6279\u91cf\u521b\u5efa\u5931\u8d25","status_code":400}
*/
public function getChildrenByParent($parent)
{
$new = new getAddress();
$data = $new->getChildrenByParent($parent);
return $this->formatReturnValue('00000',['data'=>$data]);
}
/**
* @api {get} /api/address/getfulladdress/{id} 地址管理-根据地址id获取完全地址
* @apiName getFullAddress
* @apiDescription 马继康
* @apiGroup Address
* @apiVersion 1.0.0
*
* @apiParam (param_obj) {string} id 地址id*
*
* @apiSuccess (response_obj) {string} code 错误码
* @apiSuccess (response_obj) {string} msg 错误信息
* @apiSuccess (response_obj) {obj} data 返回数据
* @apiSuccessExample {json} Success-Response:
* {
* "code": "00000",
* "msg": "操作成功",
* "data":{
"full_address":"江苏省南京市雨花台区铁心桥街道"
* }
* }
* @apiErrorExample {json} Error-Response:
* HTTP/1.1 400 Bad Request
* {"message":"\u6279\u91cf\u521b\u5efa\u5931\u8d25","status_code":400}
*/
public function getFullAddress($id)
{
$new = new getAddress();
$data = $new->getFullAddress($id);
return $this->formatReturnValue('00000',["full_address"=>$data]);
}
5. 访问请求实例
通过依赖注入获取当前HTTP请求实例,应该在控制器的构造函数或方法中对Illuminate\Http\Request类进行类型提示,当前请求实例会被服务容器自动注入:
<?php
/**
* Created by PhpStorm.
* User: hll
* Date: 2017/2/14
* Time: 14:26
*/
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Models\Group;
use App\Models\GroupUser;
use App\Models\Providers;
use App\Models\Terminal;
use App\Models\TermModel;
use Dingo\Api\Http\Request;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Input;
use App\Utils\Helpers;
use Illuminate\Support\Facades\Redis;
use App\Console\Commands\RedisSubscribe;
class ProviderController extends Controller
{
/**
* @api {get} /api/provider/index 获取供应商
* @apiName index
* @apiGroup ProviderController
* @apiVersion 0.1.0
*
* @apiSuccessExample {json} Success-Response:
* HTTP/1.1 200 OK
* {
* "msg": "",
* "code": "000000",
* "data":"[
* {
* "id":"28CA15AD-732C-7D94-0E7F-E5FC7E5AA8DD",
* "provider_name":"测试"
* },
* {
* "id":"28CA15AD-732C-7D94-0E7F-E5FC7E5AA8DS",
* "provider_name":"测试12"
* }
* ]"
* }
* @apiErrorExample {json} Error-Response:
* HTTP/1.1 400
* {
* "msg": "errmessage",
* "code": "000000",
* "data":
* }
* @apiSampleRequest http://192.168.10.179:9011/api/provider/index?id=&provider_phone=
*/
public function index()
{
$request = $this->request;
$provider = Providers::select('id', 'provider_name', 'provider_address_detail', 'provider_phone', 'note');
/*测试同步数据代码
Redis::publish('test-channel', json_encode(['term_provider' => '676E49E6-8ED7-C09D-D538-F64BCFFC2F15','term_model' => '44F09B16-A085-291E-8EB7-2611C60AB703','term_mac' => 'bar1','term_wifi' => 'bar2','term_imei' => 'bar3','term_produce_date' => '2017-02-21']));
$url = 'http://192.168.10.179:9011/api/termimalupload/upload';
$array=array("term_provider"=>"aaa","term_model"=>"bbbb","term_mac"=>"11","term_wifi"=>"22","term_imei"=>"33","term_produce_date"=>"44");
$array= ['id'=>'9I8U000001','term_provider' => '676E49E6-8ED7-C09D-D538-F64BCFFC2F15','term_model' => '44F09B16-A085-291E-8EB7-2611C60AB703','term_mac' => 'bar1','term_wifi' => 'bar2','term_imei' => 'bar3','term_produce_date' => '2017-02-21'];
$curl = curl_init();
//设置提交的url
curl_setopt($curl, CURLOPT_URL, $url);
//设置头文件的信息作为数据流输出
curl_setopt($curl, CURLOPT_HEADER, 0);
//设置获取的信息以文件流的形式返回,而不是直接输出。
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
//设置post方式提交
curl_setopt($curl, CURLOPT_POST, 1);
//设置post数据
$post_data = $array;
curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);
//执行命令
$data = curl_exec($curl);
//关闭URL请求
curl_close($curl);
// dd($data);
*/
//供应商编号
if ($request->input('id')) {
$provider = $provider->where('id', $request->input('id'));
}
//供应商电话
if ($request->input('provider_phone'))
$provider = $provider->where('provider_phone', $request->input('provider_phone'));
$provider->orderBy('id','desc');
return $this->formatReturnValue('00000', $provider->get());
}
/**
* @api {post} /api/provider/store 新增供应商
* @apiName store
* @apiGroup ProviderController
* @apiVersion 0.1.0
* @apiParam {string} id 供应商编号
* @apiParam {string} providername 名称
* @apiParam {string} addressid 地址
* @apiParam {string} addressdetail 详细地址
* @apiParam {string} phone 电话
* @apiParam {string} note 备注
*
*
* @apiSuccessExample {json} Success-Response:
* HTTP/1.1 200 OK
* {
* "code": 000000,
* "msg": "success",
* }
* @apiErrorExample {json} Error-Response:
* HTTP/1.1 400
* {
* "msg": "errmessage",
* "code": "000000",
* }
* @apiSampleRequest http://192.168.10.179:9011/api/provider/store
*/
public function store()
{
$request = $this->request;
$validator = \Validator::make($request->input(), [
'id'=>'required|digits:6|unique:providers,id',
'providername' => 'required|max:30',
'addressdetail' => 'required|max:30',
'phone' => 'required|max:20'
]);
if ($validator->fails()) {
return $this->errorBadRequest($this->formatValidatorErrors($validator->errors()->all()));
}
$maxsort = Providers::max('pro_sort');
if ($maxsort == null) {
$maxsort = 1;
} else {
$maxsort = $maxsort + 1;
}
$provider = new Providers();
$provider->id = $request->input('id');
$provider->provider_name = $request->input('providername');
$provider->address_id = $request->input('addressid');
$provider->provider_address_detail = $request->input('addressdetail');
$provider->provider_phone = $request->input('phone');
$provider->note = $request->input('note');
$provider->pro_sort = $maxsort;
try {
$provider->save();
} catch (\Exception $ex) {
$this->logExceptionInfo($request,$ex);
return $this->formatReturnValue('00000', $this->errorBadRequest($ex));
}
return $this->formatReturnValue('00000');
}
/**
* @api {put} /api/provider/update 修改供应商
* @apiName update
* @apiGroup ProviderController
* @apiVersion 0.1.0
* @apiParam {string} id 编号
* @apiParam {string} providername 名称
* @apiParam {string} addressid 地址
* @apiParam {string} addressdetail 详细地址
* @apiParam {string} phone 电话
* @apiParam {string} note 备注
*
*
* @apiSuccessExample {json} Success-Response:
* HTTP/1.1 200 OK
* {
* "code": 000000,
* "msg": "success",
* }
* @apiErrorExample {json} Error-Response:
* HTTP/1.1 400
* {
* "msg": "errmessage",
* "code": "000000",
* }
* @apiSampleRequest http://192.168.10.179:9011/api/provider/update
*/
public function update()
{
$request = $this->request;
$validator = \Validator::make($request->input(), [
'id' => 'required|max:36'
]);
if ($validator->fails()) {
return $this->errorBadRequest($this->formatValidatorErrors($validator->errors()->all()));
}
$provider = Providers::where('id', $request->input('id'))
->first();
$provider->provider_name = $request->input('providername');
$provider->address_id = $request->input('addressid');
$provider->provider_address_detail = $request->input('addressdetail');
$provider->provider_phone = $request->input('phone');
$provider->note = $request->input('note');
try {
$provider->save();
} catch (\Exception $ex) {
$this->logExceptionInfo($request,$ex);
return $this->formatReturnValue('00000', $this->errorBadRequest($ex));
}
return $this->formatReturnValue('00000');
}
/**
* @api {post} /api/provider/delete 删除供应商
* @apiName delete
* @apiGroup ProviderController
* @apiVersion 0.1.0
* @apiParam {string} id 编号
* @apiSuccessExample {json} Success-Response:
* HTTP/1.1 200 OK
* {
* "code": 000000,
* "msg": "success",
* }
* @apiErrorExample {json} Error-Response:
* HTTP/1.1 400
* {
* "msg": "errmessage",
* "code": "000000",
* }
* @apiSampleRequest http://192.168.10.179:9011/api/provider/delete
*/
public function delete()
{
$request = $this->request;
$validator = \Validator::make($request->input(), [
'id' => 'required|max:36'
]);
if ($validator->fails()) {
return $this->errorBadRequest($this->formatValidatorErrors($validator->errors()->all()));
}
$provide = Providers::where('id', $request->input('id'))
->first();
if (empty($provide)) {
return $this->formatReturnValue('01400');
}
$getTermModelByPro = TermModel::select('id')->where('term_provider',$request->input('id'))->first();
if(!empty($getTermModelByPro))
return $this->formatReturnValue('01401');
$provide->id = $request->input('id');
try {
$provide->delete();
} catch (\Exception $ex) {
$this->logExceptionInfo($request,$ex);
return $this->formatReturnValue('00000', $this->errorBadRequest($ex));
}
return $this->formatReturnValue('00000');
}
}
6. 响应
所有路由和控制器都会返回某种被发送到用户浏览器的响应,Lumen提供了多种不同的方式来返回响应,最基本的响应就是从路由或控制器返回一个简单的字符串。
/**
* @api {put} /api/provider/update 修改供应商
* @apiName update
* @apiGroup ProviderController
* @apiVersion 0.1.0
* @apiParam {string} id 编号
* @apiParam {string} providername 名称
* @apiParam {string} addressid 地址
* @apiParam {string} addressdetail 详细地址
* @apiParam {string} phone 电话
* @apiParam {string} note 备注
*
*
* @apiSuccessExample {json} Success-Response:
* HTTP/1.1 200 OK
* {
* "code": 000000,
* "msg": "success",
* }
* @apiErrorExample {json} Error-Response:
* HTTP/1.1 400
* {
* "msg": "errmessage",
* "code": "000000",
* }
* @apiSampleRequest http://192.168.10.179:9011/api/provider/update
*/
public function update()
{
$request = $this->request;
$validator = \Validator::make($request->input(), [
'id' => 'required|max:36'
]);
if ($validator->fails()) {
return $this->errorBadRequest($this->formatValidatorErrors($validator->errors()->all()));
}
$provider = Providers::where('id', $request->input('id'))
->first();
$provider->provider_name = $request->input('providername');
$provider->address_id = $request->input('addressid');
$provider->provider_address_detail = $request->input('addressdetail');
$provider->provider_phone = $request->input('phone');
$provider->note = $request->input('note');
try {
$provider->save();
} catch (\Exception $ex) {
$this->logExceptionInfo($request,$ex);
return $this->formatReturnValue('00000', $this->errorBadRequest($ex));
}
return $this->formatReturnValue('00000');
}