易语言数据清洗(2),将json数据通过api接口提交到数据库

创建数据表

在Navicat中连接到Mysql数据库,创建一个设备型号对照表。
表名:device_models

file

手动录入一条数据,作为测试用

file

编写后台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('此接口已关闭');
    }
}

接口文档与数据测试

接口编写完成以后,自动生成接口文档

file

先查询数据,接口名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

file

调用接口上传数据

对易语言原先的代码进行了简单的重构,增加了数据上传接口的调用

file

主要有以下几点:

  • 使用多线程上传数据,实测上千条数据都能成功上传,零出错
  • 由于是一次性操作,所以上传的速度不重要,重要的就是稳定和完整,不要遗漏数据。
  • 数据里有中文的,需要进行编码转换。否则无法入库
  • 接口返回值里的中文乱码也需要转码

将数据库清空,上传八百多条数据的实测效果:

file

数据库内的漂亮呈现:

file

获取列表数据的API接口返回内容:

file

查询和显示品名

获取设备列表的时候,根据设备型号,在型号对照表里查询对应的产品名称

file

1. 官方交流QQ群,添加多个不批。建议使用安卓手机或电脑申请。
飞云脚本圈: 586333520飞云脚本圈
Auto.js学习交流③群:286635606
Auto.js学习交流②群:712194666(满员)
IOS免越狱自动化测试群:691997586
2. 盗版,破解有损他人权益和违法作为,请各位会员支持正版。
3. 本站部分资源来源于用户上传和网络搜集,如有侵权请提供版权证明并联系站长删除。
4.如未特别申明,本站的技术性文章均为原创,未经授权,禁止转载/搬运等侵权行为。
5.全站所有付费服务均为虚拟商品,购买后自动发货。售出后概不接受任何理由的退、换。注册即为接受此条款。
6.如果站内内容侵犯了您的权益,请联系站长删除。
飞云脚本 » 易语言数据清洗(2),将json数据通过api接口提交到数据库

企业级大数据智能营销管理系统

了解详情