IDMS系统框架

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');
    }

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,809评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,189评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,290评论 0 359
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,399评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,425评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,116评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,710评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,629评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,155评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,261评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,399评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,068评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,758评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,252评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,381评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,747评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,402评论 2 358

推荐阅读更多精彩内容