基础通用参数:

  1. token* 用户token 由后端生成并返回给前端,是用户身份的唯一表示 默认1:需要验证,0不验证
  2. api_token* 前后端接口验证规则
  3. client_id* client_id:1 客户端表示
  4. device_token* 设备唯一标示码

参数解释: apiRoute:api路由 data: 请求参数

前端

采用flyio

一个支持所有JavaScript运行环境的基于Promise的、支持请求转发、强大的http请求库。可以让您在多个端上尽可能大限度的实现代码复用。 多端支持:Node.js微信小程序WeexReact NativeQuick App

  1. // 文件路径:~/api/config.js
  2. tokendevice_token写在request.body
  3. fly.interceptors.request.use(request => {
  4. request.body.token = uni.getStorageSync('token')
  5. request.body.device_token = uni.getStorageSync('devicetoken')
  6. return request
  7. })
  8. // post方法封装
  9. api_token url+当前格式化日期入2020-01-20+前端约定字段baseAppoint 再经过md5加密生成
  10. let api_token = null;
  11. function post(url, data = {}) {
  12. api_token = md5(
  13. `${url}${utils.formartDate()}${baseAppoint}`
  14. );
  15. return request(
  16. url,
  17. {
  18. ...data,
  19. api_token,
  20. client_id: 1,
  21. },
  22. "POST"
  23. );
  24. }
  25. // 配置接口路 例:
  26. export default{
  27. getreadprofile(data) {
  28. return post(apiRoute, data);
  29. },
  30. getAddressdel(data) {
  31. return post(apiRoute, data);
  32. },
  33. ....
  34. }

api调用

  1. // 先在main.js中做全局挂载
  2. import api from "./api";
  3. Vue.prototype.$http = api; //全局挂载api
  4. // 具体引用
  5. this.$http.getreadprofile(data).then(res=>{
  6. console.log(res)
  7. // res:返回接口
  8. )

上传文件

上传文件部门进一步封装了uview-ui 上传组件

  1. // ~/components/upLoader.vue
  2. 上传地址和上传参数已经上传执行已经上传成功后返回值 已经在组件内部封装好,可直接调用
  3. <upLoader ref="upLoader" :width="750" :height="500"></upLoader>
  4. 获取文件上传返回结果: const uploadedCoverImg = this.$refs.upLoader.resultSrc

nvue中请求

  1. pages/live/live.js 封装了在nvue中的请求方法 http()
  2. http(path = "", params = {}, method = "POST") {
  3. const token = uni.getStorageSync("token");
  4. return new Promise((resolve, reject) => {
  5. uni.request({
  6. url: `${this.baseUrl}/${path}?t=${new Date().getTime()}`,
  7. method: method,
  8. data: {
  9. api_token: md5(
  10. `${path}${this.formartDate()}${SECRETKEY}`
  11. ),
  12. client_id: 1,
  13. token,
  14. ...params,
  15. },
  16. success: (res) => {
  17. resolve(res);
  18. },
  19. fail: (err) => {
  20. reject(err);
  21. },
  22. });
  23. });
  24. },
  25. //调用方法:
  26. //
  27. this.http(apiRoute, data).then(res => {
  28. console.log(res)
  29. // res:返回接口
  30. })

后端

接口验证方法:/application/apicloud/model/Gongyong.php

  1. /*
  2. * 接口验证
  3. * @param $isToken 是否验证用户token,默认1:需要验证,0不验证
  4. */
  5. public function apivalidate($isToken = 1){
  6. if(input('post.client_id') && input('post.api_token')){
  7. $client_id = input('post.client_id');
  8. $api_token = input('post.api_token');
  9. $module = request()->module();
  10. $controller = request()->controller();
  11. $action = request()->action(true);
  12. $secretstr = $module.'/'.$controller.'/'.$action;
  13. $client_secret = Db::name('secret')->where('id',$client_id)->value('client_secret');
  14. if($client_secret){
  15. $api_token_server = md5($secretstr.date('Y-m-d', time()).$client_secret);
  16. if($api_token != $api_token_server){
  17. $result = array('status'=>400,'mess'=>'接口请求验证失败','data'=>array('status'=>400));
  18. }else{
  19. //验证个人token
  20. if($isToken){
  21. //验证设备token
  22. $device_token = input('post.device_token');
  23. $token = input('post.token');
  24. $valitk = $this->checktokens($token,$device_token);
  25. if($valitk['status'] != 90001){
  26. if($valitk['status'] == 90003){
  27. $result = array('status'=>400,'mess'=>'账号已在其他设备上登录,请重新登录','data'=>array('status'=>400));
  28. }else{
  29. $result = array('status'=>400,'mess'=>'身份验证失败','data'=>array('status'=>400));
  30. }
  31. }else{
  32. $result = array('status'=>200,'mess'=>'接口请求验证成功','user_id'=>$valitk['user_id']);
  33. }
  34. }else{
  35. $result = array('status'=>200,'mess'=>'接口请求验证成功','data'=>array('status'=>200));
  36. }
  37. }
  38. }else{
  39. $result = array('status'=>400,'mess'=>'接口请求验证失败','data'=>array('status'=>400));
  40. }
  41. }else{
  42. $result = array('status'=>400,'mess'=>'接口请求验证失败','data'=>array('status'=>400));
  43. }
  44. return $result;
  45. }
  46. public function checktokens($token,$device_token=""){
  47. $rxins = Db::name('rxin')->where('token',$token)->find();
  48. if (!empty($rxins)){
  49. $yhinfos = Db::name('member')->where('id',$rxins['user_id'])->where('checked',1)->field('id,appinfo_code')->find();
  50. if($yhinfos){
  51. //查看当前用户表中存储的设备clientid值与传递的device_token值是否一致,不一致提示在其他设备登录,请重新登录
  52. if($device_token && $device_token != $yhinfos['appinfo_code']){
  53. $valitoken = array('status'=>90003,'user_id'=>$rxins['user_id']);
  54. }else{
  55. $valitoken = array('status'=>90001,'user_id'=>$rxins['user_id']);
  56. }
  57. }else{
  58. $valitoken = array('status'=>90002,'user_id'=>0);
  59. }
  60. }else{
  61. $valitoken = array('status'=>90002,'user_id'=>0);
  62. }
  63. return $valitoken;
  64. }

调用方式:

继承Common控制器,如:class Login extends Common 在接口开始位置加入api_token验证方法

需要获取$user_id的情况

  1. $tokenRes = $this->checkToken();
  2. if($tokenRes['status'] == 400){ // 400返回错误描述
  3. datamsg(LOSE,$tokenRes['mess'],$tokenRes['data']);
  4. }else{ // 成功则返回$user_id
  5. $user_id = $tokenRes['user_id'];
  6. }

不需要获取$user_id的情况

  1. $tokenRes = $this->checkToken(0); // 传入0,代表不需要获取$user_id
  2. if($tokenRes['status'] == 400){ // 400返回错误描述
  3. datamsg(LOSE,$tokenRes['mess'],$tokenRes['data']);
  4. }
  1. function datamsg($code, $msg, $result = '')
  2. {
  3. $data['status'] = $code;
  4. $data['mess'] = $msg;
  5. is_object($result)?$result = $result->toArray():'';
  6. if (is_array($result)) {
  7. foreach ($result as $key => $value) {
  8. if ($value===null) {
  9. $result[$key] ='';
  10. }
  11. }
  12. }
  13. $data['data'] = result_type($result);
  14. echo json_encode($data);die;
  15. }
  16. 成功状态
  17. datamsg(WIN,'文本描述',array());
  18. 失败状态
  19. datamsg(LOSE,'文本描述',array());