创建数据表
在Navicat中连接到Mysql数据库,创建一个设备型号对照表。
表名:device_models
手动录入一条数据,作为测试用
编写后台Model层接口
在phalapi接口框架中创建一个使用了DataModel
数据基类的Model
类,由于遵循规范的数据库命名,在Model类里,数据库名无需单独声明。
// phalapi/src/manage/Model/Device/Models.php
<?php
/*
* @Description: 设备型号对照表
* @Author: feiYun
* @Email: 283054503@qq.com
* @LastEditTime: 2024-10-04 16:02:09
*/
namespace Manage\Model\Device;
use PhalApi\Model\DataModel;
class Models extends DataModel {
}
接口权限验证
这个接口类的权限验证比较重要。如果不设置,易语言里是没有权限进行数据上传的。
首先继承通用数据接口
use PhalApi\Api\DataApi as Api;
继承这个类以后,必须调用userCheck()
进行身份验证,防止接口被非法调用。
然而,这个接口类里,外部上传数据的接口是不需要进行鉴权的。因此,在userCheck()
这个方法里进行空操作,也就是不执行身份验证。
这样以来,此类下的所有公开接口都是免鉴权的。
但是呢,除了上传数据的接口,其他的接口都需要进行鉴权。
所以要对公开的方法进行重载和鉴权:
/**
* 获取表格列表数据(需登录)
* @desc 通用数据接口,获取表格列表数据,默认按ID降序返回,支持分页和搜索
*/
public function tableList()
{
\PhalApi\DI()->admin->check(); // 检查是否登录
return parent::tableList();
}
/**
* 更新数据(需登录)
* @desc 通用数据接口,根据ID更新单条数据
* @method POST
* @return int|boolean updated_num 更新的数据条数,0表示无更新,1表示更新成功
*/
public function updateData()
{
\PhalApi\DI()->admin->check(); // 检查是否登录
return parent::updateData();
}
/**
* 批量删除(需登录)
* @desc 通用数据接口,根据ID批量删除数据
*/
public function deleteDataIDs()
{
\PhalApi\DI()->admin->check(); // 检查是否登录
return parent::deleteDataIDs();
}
这样就实现了除了重载的3个类需要鉴权以外,其他接口都不需要鉴权。
下面是完整的业务代码。
编写后台Api层接口
在Api层提供对外的增删改查方法。
其中创建数据的方法内,实现了重复内容的检测和拦截
// phalapi/src/manage/Api/Device/Models.php
<?php
namespace Manage\Api\Device;
use PhalApi\Api\DataApi as Api; // 继承通用接口,用于数据接口的通用操作。内部必须包含userCheck方法,用于身份验证。如果不需要身份验证,则重载userCheck方法为空操作即可。
use PhalApi\Exception\BadRequestException;
/**
* 设备-型号对照
*/
class Models extends Api
{
protected function userCheck()
{
// 不需要进行身份验证,重载后进行空操作。如果有接口需要单独进行身份验证,则调用权限检查方法即可
}
protected function getDataModel()
{
return new \Manage\Model\Device\Models();
}
// 检查添加数据时的参数,在库里是否已存在
protected function checkCreateData($newData)
{
if ($newData['model']) {
$this->checkCreateExist(array(
'model' => $newData['model'],
), '型号' . ' 已存在');
}
if ($newData['product_name']) {
$this->checkCreateExist(array(
'product_name' => $newData['product_name'],
), '品名' . ' 已存在');
}
}
// 列表的默认排序
protected function getTableListOrder()
{
// return 'create_time,state';
return 'id ASC';
}
/**
* 获取表格列表数据(需登录)
* @desc 通用数据接口,获取表格列表数据,默认按ID降序返回,支持分页和搜索
*/
public function tableList()
{
\PhalApi\DI()->admin->check(); // 检查是否登录
return parent::tableList();
}
/**
* 更新数据(需登录)
* @desc 通用数据接口,根据ID更新单条数据
* @method POST
* @return int|boolean updated_num 更新的数据条数,0表示无更新,1表示更新成功
*/
public function updateData()
{
\PhalApi\DI()->admin->check(); // 检查是否登录
return parent::updateData();
}
/**
* 批量删除(需登录)
* @desc 通用数据接口,根据ID批量删除数据
*/
public function deleteDataIDs()
{
\PhalApi\DI()->admin->check(); // 检查是否登录
return parent::deleteDataIDs();
}
/**
* 检查添加数据时的一些关键值是否已存在
*
* @param [array] $where 查询条件
* @param [string] $label 提示标签内容
* @return void
*/
protected function checkCreateExist($where, $label)
{
$recrodModel = $this->getDataModel();
$total = $recrodModel->count($where);
if ($total > 0) {
throw new BadRequestException($label, 1);
}
}
/**
* 列表模糊搜索
* 查询条件,$where是一个数组,对应当前传入的条件参数
* @author feiYun <283054503@qq.com>
*
* @param [type] $where
* @return void
*/
protected function getTableListWhere($where)
{
// 清除对象中的空成员
$searchParams = array();
if (!$where) {
return $searchParams;
}
foreach ($where as $key => $value) {
if ($value !== '') {
// $searchParams[$key] = $value; //精确匹配
$searchParams[$key . ' LIKE ?'] = '%' . $value . '%'; //模糊匹配
}
}
return $searchParams;
}
// 不允许客户端写入的字段(添加数据时,要排除的字段)
protected function createDataExcludeKeys()
{
// 去除id字段,避免报错
return ['id'];
}
// 创建时更多初始化的数据
protected function beforeCreateData($newData)
{
// 这里做一下数据拦截,检查输入的数据,在库里是否存在。如果存在,则报错
$this->checkCreateData($newData);
// 自动添加当前时间为创建时间
$newData['create_time'] = time();
// $newData['creater'] = \PhalApi\DI()->admin->username;
return $newData;
}
protected function beforeUpdateData($updateData)
{
// 例如,自动添加最后更新时间
$updateData['update_time'] = time();
// $updateData['updater'] = \PhalApi\DI()->admin->username;
return $updateData;
}
/**
* @ignore
*/
public function getData()
{
throw new \PhalApi\Exception\BadRequestException('此接口已关闭');
}
/**
* @ignore
*/
public function deleteData()
{
throw new \PhalApi\Exception\BadRequestException('此接口已关闭');
}
}
接口文档与数据测试
接口编写完成以后,自动生成接口文档
先查询数据,接口名Manage.Device_Models.TableList
返回一条手工录入的数据
{
"ret": 200,
"data": {
"total": 1,
"items": [
{
"id": 1,
"product_name": "OCE-AN10",
"model": "HUAWEI Mate 40 5G",
"create_time": 1728030123,
"update_time": null,
"remarks": null,
"state": null
}
]
},
"msg": ""
}
然后增加数据,接口名Manage.Device_Models.CreateData
调用接口上传数据
对易语言原先的代码进行了简单的重构,增加了数据上传接口的调用
主要有以下几点:
- 使用多线程上传数据,实测上千条数据都能成功上传,零出错
- 由于是一次性操作,所以上传的速度不重要,重要的就是稳定和完整,不要遗漏数据。
- 数据里有中文的,需要进行编码转换。否则无法入库
- 接口返回值里的中文乱码也需要转码
将数据库清空,上传八百多条数据的实测效果:
数据库内的漂亮呈现:
获取列表数据的API接口返回内容:
查询和显示品名
获取设备列表的时候,根据设备型号,在型号对照表里查询对应的产品名称
1. 官方交流QQ群,添加多个不批。建议使用安卓手机或电脑申请。
飞云脚本圈: 586333520
Auto.js学习交流③群:286635606
Auto.js学习交流②群:712194666(满员)
IOS免越狱自动化测试群:691997586
2. 盗版,破解有损他人权益和违法作为,请各位会员支持正版。
3. 本站部分资源来源于用户上传和网络搜集,如有侵权请提供版权证明并联系站长删除。
4.如未特别申明,本站的技术性文章均为原创,未经授权,禁止转载/搬运等侵权行为。
5.全站所有付费服务均为虚拟商品,购买后自动发货。售出后概不接受任何理由的退、换。注册即为接受此条款。
6.如果站内内容侵犯了您的权益,请联系站长删除。
飞云脚本 » 易语言数据清洗(2),将json数据通过api接口提交到数据库
飞云脚本圈: 586333520
Auto.js学习交流③群:286635606
Auto.js学习交流②群:712194666(满员)
IOS免越狱自动化测试群:691997586
2. 盗版,破解有损他人权益和违法作为,请各位会员支持正版。
3. 本站部分资源来源于用户上传和网络搜集,如有侵权请提供版权证明并联系站长删除。
4.如未特别申明,本站的技术性文章均为原创,未经授权,禁止转载/搬运等侵权行为。
5.全站所有付费服务均为虚拟商品,购买后自动发货。售出后概不接受任何理由的退、换。注册即为接受此条款。
6.如果站内内容侵犯了您的权益,请联系站长删除。
飞云脚本 » 易语言数据清洗(2),将json数据通过api接口提交到数据库