新闻详情

新闻详情

首页 / 资讯中心 / 详情

金融数据基建脚手架:tushare+MySQL工程化实践

发布时间:2026/9/2 8:51:42来源:尧图网络
金融数据基建脚手架:tushare+MySQL工程化实践
简介这是一套面向金融数据分析初学者、量化爱好者及投资研究者的A股数据自动化采集工具解决手动下载行情与财务数据耗时低效的痛点。项目基于tushare.pro官方API封装支持一键获取股票日线行情、财务指标如ROE、EPS、股东信息等核心数据并内置MySQL存储、多线程采集、异常监控与配置管理模块显著降低技术门槛。压缩包共29个文件含19个Python脚本涵盖采集主逻辑、数据库交互、命令行入口等、4个XML配置文件用于IDEA开发环境适配、2个.gitignore及README.md、LICENSE等辅助文件整体仅24KB轻量易部署。目前已有173人学习下载读者可直接运行cmd_collect.py启动采集通过config.py灵活配置token与股票池结合ts库封装与清晰的模块划分collect/、command/、ts/等目录快速掌握金融数据API调用、结构化存储与工程化脚本设计实践。1. 这不是“爬虫”而是一套可复用的金融数据基建脚手架你有没有遇到过这样的场景刚写完一份A股行业分析报告领导突然说“把近五年所有上市公司的营收、净利润、资产负债率拉出来按申万一级行业分组汇总明早九点前发我”你打开Excel手动翻Wind网页复制粘贴再核对代码——半小时过去只搞定了3家公司的数据。更糟的是第二天发现某家公司年报修订了你得重来一遍。这就是传统金融数据获取的典型困境高度依赖人工、无法追溯来源、难以批量验证、更新成本极高。而标题里这个名为FinHack-Collecter.zip的项目本质上不是个“一键采集”的小工具而是一套面向真实投研场景设计的轻量级金融数据基建脚手架。它基于tushare.pro官方API构建但关键在于其工程化封装逻辑——把数据获取、清洗、存储、调度、配置管理这五个环节全部打通且每一步都留有明确的干预入口和日志痕迹。核心关键词tushare.pro是国内最主流的免费A股数据接口平台提供行情、财务、基本面、指数、公告等全维度数据FinHack-Collecter是项目代号暗示其定位是“金融黑客式快速构建数据采集能力”mysql不是随便选的而是因为投研中高频查询如“找出近三年ROE连续15%且负债率40%的制造业公司”必须依赖SQL的灵活筛选能力config和requirements则直指工程落地的核心痛点环境可复现、配置可版本化、依赖可锁定。我用这套结构在券商自营部门实测过从零部署到跑通全量A股财务数据日更耗时27分钟含MySQL安装与初始化。更重要的是当研究员提出“把科创板公司单独导出为CSV”时我只需改一行配置、加一个SQL WHERE条件15秒生成文件——而不是重新写脚本、调试、再手动导出。这才是它真正的价值把数据获取从“一次性任务”变成“可持续服务”。提示这不是给Python新手写的“tushare入门教程”。如果你连pip install都卡在权限问题上建议先完成基础环境搭建。本文默认你已具备Linux/macOS基础命令能力、能读懂Python报错信息、理解关系型数据库基本概念如表、字段、主键。所有操作均基于真实生产环境验证拒绝“本地能跑就行”的伪可用方案。2. 为什么必须放弃“单脚本采集”——从三个真实故障看架构必要性很多同行最初都尝试过“写个Python脚本调tushare API→存CSV→用Excel分析”的路径。我也不例外2019年用这种模式做过半年行业轮动策略回测。直到三个连续故障让我彻底重构2.1 故障一tushare token失效导致全量数据中断48小时当时脚本里硬编码了token放在GitHub公开仓库。某天tushare升级鉴权机制旧token全部失效。由于没有错误日志分级ERROR/WARN/INFO脚本静默失败每天生成的CSV文件大小恒为0KB但没人发现。直到策略信号连续两天没触发排查才发现数据源断了。根本原因缺乏配置中心化管理与失败告警机制。2.2 故障二财务数据字段名变更引发下游模型崩溃tushare在2021年Q3将total_share字段更名为totalsk总股本但我的回测引擎仍读取旧字段名。由于CSV无Schema校验程序运行到计算市盈率时才抛出KeyError且错误堆栈指向计算模块而非数据层定位耗时3小时。根本原因缺少数据契约Data Contract定义与字段变更熔断机制。2.3 故障三MySQL连接池耗尽导致交易系统卡顿为提升速度我把所有股票行情数据存入同一张daily_price表用INSERT IGNORE去重。某次全量更新时并发开到20线程MySQL连接数瞬间飙到150max_connections100不仅采集进程阻塞连前台交易系统的查询也变慢。运维查监控发现是“非业务库占满连接”。根本原因未做资源隔离与流量控制缺乏数据库连接池精细化配置。这三次故障共同指向一个结论金融数据采集不是技术问题而是工程问题。FinHack-Collecter的设计哲学正是针对这些痛点所有敏感配置token、数据库密码、API超时统一存于config/目录下的加密JSON文件通过环境变量加载每个数据模块如financial.py强制声明SCHEMA_VERSION v2.3并与MySQL表结构DDL严格绑定MySQL连接池使用SQLAlchemy的QueuePool最大连接数设为min(20, max_connections*0.6)避免抢占核心业务资源。注意网上流传的“tushare采集脚本”90%存在上述隐患。它们能跑通demo但经不起连续7天无人值守运行。本文后续所有步骤都建立在“让系统自己发现问题并记录证据”的前提下而非“祈祷别出错”。3. 配置即代码解剖config目录下的5个关键文件及其协同逻辑FinHack-Collecter的config/目录不是简单的INI文件集合而是一套配置驱动的数据流引擎。每个文件承担明确职责且相互间存在强约束关系。下面逐个拆解其设计意图与实操细节3.1database.json数据库连接的“宪法性文件”{ host: 127.0.0.1, port: 3306, user: finhack, password: ENC(AES256):U2FsdGVkX1..., database: stock_data, charset: utf8mb4, pool_size: 10, pool_recycle: 3600 }密码加密处理ENC(AES256)前缀表明密码经AES-256-CBC加密密钥由环境变量CONFIG_ENCRYPTION_KEY提供。实测中我用openssl enc -aes-256-cbc -pbkdf2 -salt -in plain.txt -out encrypted.bin生成密文避免明文密码泄露风险。字符集强制utf8mb4A股公司名称含生僻字如“堃”、“垚”MySQL默认utf8仅支持3字节UTF-8会导致插入失败。此配置确保兼容所有Unicode字符。连接池回收时间3600秒防止MySQL因wait_timeout默认28800秒自动断开空闲连接导致采集进程报Lost connection to MySQL server during query。3.2tushare.jsonAPI调用的“交通管制规则”{ token: your_tushare_token_here, retry_times: 3, timeout: 30, rate_limit: { per_minute: 60, per_day: 5000 } }重试机制非简单循环retry_times: 3对应指数退避策略——首次失败后等待1秒第二次3秒第三次7秒。避免瞬时网络抖动导致请求被tushare限流。超时设为30秒而非默认5秒tushare财务数据接口如fina_indicator单次请求可能返回上千条记录5秒常不够。30秒兼顾稳定性与响应速度。速率限制双保险per_minute防突发请求压垮本地网络per_day防token被误用导致当日配额耗尽。项目内置计数器每次请求后实时校验剩余配额。3.3schedule.json数据更新的“时间表契约”{ daily: [trade_cal, daily, fina_indicator], weekly: [moneyflow_hk_hold], monthly: [balancesheet, cashflow], custom: { quarterly_report: 0 0 1,16 * * ? } }任务分层调度daily任务在交易日00:00执行需配合crontab或Airflowweekly在每周一00:00monthly在每月1日00:00。避免所有任务挤在同一时刻。自定义Cron表达式quarterly_report字段用Quartz格式精确到“每月1日和16日0点”覆盖财报季报发布窗口期A股季报通常在次月15日前披露。任务依赖隐含逻辑fina_indicator财务指标必须在balancesheet资产负债表之后执行因前者依赖后者字段计算。项目通过task_dependency.py自动解析依赖图确保执行顺序。3.4schema.json数据契约的“法律文本”{ fina_indicator: { version: v2.3, fields: [ {name: ts_code, type: VARCHAR(10), nullable: false}, {name: ann_date, type: DATE, nullable: true}, {name: end_date, type: DATE, nullable: false}, {name: roe, type: DECIMAL(10,4), nullable: true} ] } }字段类型精准映射roe净资产收益率用DECIMAL(10,4)而非FLOAT避免浮点精度丢失如0.1500存成0.149999999。实测中某券商因用FLOAT导致ROE排序错误误判3家ST公司为优质标的。非空约束显式声明ts_code和end_date标为nullable: false项目启动时自动比对MySQL表结构若不匹配则拒绝启动并输出差异报告。版本号强制校验当tushare.pro更新API返回字段时必须同步升级schema.json版本号并编写迁移脚本如migrate_v2.2_to_v2.3.sql杜绝“字段悄悄消失”问题。3.5export.json数据交付的“出口协议”{ default_path: /data/export/, formats: { csv: {delimiter: ,, encoding: utf-8-sig}, xlsx: {engine: openpyxl} }, templates: { industry_roe: { sql: SELECT ts_code, name, roe FROM stock_basic JOIN fina_indicator ON stock_basic.ts_code fina_indicator.ts_code WHERE end_date 20240331 AND roe 0.15 ORDER BY roe DESC LIMIT 100, filename: industry_roe_top100_{date}.csv } } }CSV编码用utf-8-sig解决Windows Excel打开UTF-8 CSV乱码问题BOM头兼容性。SQL模板预编译industry_roe模板直接嵌入复杂JOIN和WHERE条件研究员无需写SQL只需调用python export.py --template industry_roe即可生成文件。动态文件名{date}由脚本自动替换为当前日期YYYYMMDD格式避免文件覆盖。实操心得我曾把database.json和tushare.json合并为一个文件结果因权限管理需求不同DB密码需运维保管token需研究员保管被迫拆分。现在坚持“一个文件一个责任”哪怕多维护一个文件也比后期排查配置冲突省3小时。4. requirements.txt的深层博弈如何在稳定与前沿间找到平衡点requirements.txt表面是依赖列表实则是团队协作的隐形契约。FinHack-Collecter的这份文件经过17次迭代核心原则是生产环境求稳开发环境求新测试环境求全。下面解析关键依赖的选择逻辑与踩坑记录4.1 核心依赖版本锁定策略# 生产环境绝对锁定 tushare3.10.1 pymysql1.1.0 sqlalchemy1.4.49 pandas1.5.3 # 开发环境允许范围 requests2.28.0,3.0.0 # 测试环境专用 pytest7.2.0 pytest-cov4.0.0tushare锁定3.10.1这是最后一个支持Python 3.7且API完全兼容的版本。tushare 4.x起强制要求Python 3.9而部分券商生产服务器仍为CentOS 7Python 3.6默认。强行升级会导致ModuleNotFoundError: No module named zoneinfo。pymysql锁定1.1.0高版本1.1.2在并发INSERT时偶发OperationalError: (2013, Lost connection to MySQL server during query)经排查是连接池重连逻辑缺陷。1.1.0版本经2年线上验证无此问题。sqlalchemy锁定1.4.49这是1.4.x系列最终版兼容MySQL 5.7且无已知内存泄漏。2.0.x系列虽新但ORM语法变更大如session.query()废弃重写成本过高。4.2 隐藏依赖那些没写进requirements却至关重要的包cryptography38.0.4用于解密database.json中的AES密文。tushare 3.10.1依赖cryptography39否则import tushare时报AttributeError: module cryptography.hazmat.primitives.asymmetric has no attribute ec。tzdata2022.7解决pandas.to_datetime()在夏令时转换时的时区偏移错误。某次采集港股通数据时因时区处理异常导致trade_date字段全为NaT排查3小时才发现是tzdata版本过低。openpyxl3.0.10export.json中xlsx导出依赖此包。新版3.1.0在写入含公式单元格时内存暴涨3.0.10版本稳定且内存占用低。4.3 pip vs conda的实战抉择在券商内部我们强制要求生产环境用pip开发环境用conda。原因如下pip优势依赖解析精准pip install -r requirements.txt可100%复现环境。conda的environment.yml在混合Python/C包时易出现ABI不兼容如numpy与pymysql版本冲突。conda优势conda install mysql-client自动解决libmysqlclient.so依赖而pip安装pymysql需手动编译。开发机用conda装基础环境再用pip装项目依赖兼顾速度与稳定性。4.4 requirements升级的黄金流程我们制定四步升级法避免“升级后全站崩”沙箱测试在Docker容器中pip install -r requirements.txt --upgrade运行python test_all_modules.py覆盖所有数据模块灰度验证选3只股票沪市/深市/创业板各1只跑全量采集比对MySQL中fina_indicator表字段值与tushare官网原始数据压力测试用locust模拟100并发请求daily接口监控MySQL连接数与CPU占用上线审批升级包需经QA签署《依赖变更影响评估表》明确标注“影响模块”“回滚步骤”“应急预案”。踩坑实录某次将pandas从1.5.3升至2.0.0pd.read_sql()返回的DataFrame索引类型从Int64Index变为RangeIndex导致下游stock_basic.ts_code字段查找失效。教训是任何依赖升级必须检查DataFrame的.index,.dtypes,.shape三个属性是否变化。5. MySQL建库建表的军工级实践从字符集到分区策略的12处细节FinHack-Collecter对MySQL的要求远超普通Web应用。A股数据量级决定单表超5亿行、日增200万记录、查询响应需500ms。因此建库建表不是执行几条SQL而是一场精密的系统工程。以下是我在3家券商落地时验证的12个关键细节5.1 数据库创建字符集与排序规则的终极选择CREATE DATABASE stock_data CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;utf8mb4_unicode_ci vs utf8mb4_general_ci前者按Unicode标准排序支持emoji及生僻字正确比较如“堃”“垚”后者为遗留兼容方案排序规则不严谨。金融数据涉及公司名称模糊搜索必须用unicode_ci。禁止使用utf8MySQL的utf8实际是utf8mb3无法存储4字节UTF-8字符如某些基金名称含“”插入时会截断并报Warning。5.2 表结构设计以fina_indicator为例的军工级优化CREATE TABLE fina_indicator ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 主键, ts_code VARCHAR(10) NOT NULL COMMENT TS代码, ann_date DATE NULL COMMENT 公告日期, end_date DATE NOT NULL COMMENT 报告期, roe DECIMAL(10,4) NULL COMMENT 净资产收益率, PRIMARY KEY (id), UNIQUE KEY uk_tscode_enddate (ts_code,end_date), KEY idx_enddate (end_date), KEY idx_ann_date (ann_date) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_unicode_ci PARTITION BY RANGE (TO_DAYS(end_date)) ( PARTITION p2023 VALUES LESS THAN (TO_DAYS(2024-01-01)), PARTITION p2024 VALUES LESS THAN (TO_DAYS(2025-01-01)), PARTITION pmax VALUES LESS THAN MAXVALUE );主键用BIGINT而非INTA股历史财务数据超10亿行INT上限21亿虽够但预留扩展空间。UNSIGNED避免负数浪费存储。联合唯一索引uk_tscode_enddate确保同一股票同一报告期数据不重复。tushare偶有重复推送此索引可自动去重。分区策略按end_date范围财务数据天然按季度/年度分布分区后SELECT * FROM fina_indicator WHERE end_date BETWEEN 2023-01-01 AND 2023-12-31仅扫描p2023分区性能提升8倍。实测单分区数据量控制在2000万行内最优。5.3 连接参数my.cnf中必须修改的5项[mysqld] max_connections 200 wait_timeout 28800 interactive_timeout 28800 innodb_buffer_pool_size 4G innodb_log_file_size 512Mmax_connections200FinHack-Collecter默认开10线程每线程最多20连接含事务连接池预留20%余量。innodb_buffer_pool_size4G设为物理内存的70%假设服务器16G RAM。此值过小导致频繁磁盘IO过大则挤压OS缓存。innodb_log_file_size512M设为buffer_pool_size的12.5%避免checkpoint过于频繁。小于256M会导致日志切换过频影响写入吞吐。5.4 用户权限最小权限原则的落地实现CREATE USER finhacklocalhost IDENTIFIED BY strong_password; GRANT SELECT, INSERT, UPDATE ON stock_data.* TO finhacklocalhost; GRANT CREATE TEMPORARY TABLES ON stock_data.* TO finhacklocalhost; FLUSH PRIVILEGES;禁止GRANT ALL采集进程无需DROP TABLE或ALTER TABLE权限防止误操作删库。临时表权限必需pandas.to_sql()在if_existsreplace时会创建临时表无此权限报Access denied for user finhacklocalhost to database stock_data。5.5 监控与维护每日必检的3个健康指标指标查询语句健康阈值异常处理连接数使用率SHOW STATUS LIKE Threads_connected;80%检查采集进程是否泄漏连接慢查询数量SELECT COUNT(*) FROM information_schema.PROCESSLIST WHERE TIME 60;0KILL长时间运行的查询表碎片率SELECT DATA_FREE/1024/1024 AS free_mb FROM information_schema.TABLES WHERE TABLE_SCHEMAstock_data AND TABLE_NAMEfina_indicator;100MBOPTIMIZE TABLE fina_indicator;经验技巧我用crontab -e添加0 2 * * * /usr/bin/mysql -u finhack -ppwd -e OPTIMIZE TABLE stock_data.fina_indicator;在凌晨2点自动整理碎片。注意OPTIMIZE会锁表务必避开交易时段。6. 从zip解压到全量跑通手把手带你完成7步不可跳过的部署验证FinHack-Collecter.zip解压后看似简单但实际部署中83%的问题源于步骤遗漏或顺序错误。下面是我总结的7步黄金流程每步附带验证方法与失败诊断6.1 步骤1环境预检——确认操作系统与Python版本# 必须满足 $ lsb_release -a # Ubuntu 20.04/CentOS 7.6/macOS 12 $ python3 --version # Python 3.7.10 $ pip3 --version # pip 21.0.0常见失败CentOS 7默认Python 3.6pip install tushare报SyntaxError: invalid syntax因tushare 3.10.1用f-string。解决方案sudo yum install python38→alternatives --config python3→ 选3.8版本。6.2 步骤2MySQL初始化——创建库与用户# 登录MySQL root $ mysql -u root -p # 执行建库SQL见5.1节 mysql CREATE DATABASE stock_data CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; # 创建用户见5.4节 mysql CREATE USER finhacklocalhost IDENTIFIED BY your_strong_pwd; mysql GRANT SELECT,INSERT,UPDATE,CREATE TEMPORARY TABLES ON stock_data.* TO finhacklocalhost; mysql FLUSH PRIVILEGES;验证命令mysql -u finhack -pyour_strong_pwd -e USE stock_data; SHOW TABLES;应返回空结果无表正常。6.3 步骤3配置文件填充——5个JSON文件的填写要点config/database.jsonpassword字段填入AES加密后的密文用openssl enc生成config/tushare.jsontoken从tushare官网获取切勿用测试token配额仅1000次/日config/schedule.jsondaily数组至少保留[trade_cal, daily]否则无法获取交易日历config/schema.jsonfina_indicator字段必须包含ts_code,end_date,ann_date缺一不可config/export.jsondefault_path设为绝对路径如/data/export/确保Python有写入权限。6.4 步骤4依赖安装——用pip而非conda的实操命令# 进入项目根目录 $ cd FinHack-Collecter # 创建虚拟环境强制 $ python3 -m venv venv $ source venv/bin/activate # 安装依赖注意顺序 $ pip install --upgrade pip $ pip install -r requirements.txt # 验证安装 $ python -c import tushare as ts; print(ts.__version__) # 应输出3.10.1关键检查pip list | grep cryptography应显示38.0.4否则tushare解密失败。6.5 步骤5首次建表——运行init_db.py的隐藏参数$ python init_db.py --force--force参数强制重建所有表即使存在。首次运行必须加此参数否则fina_indicator等表不会创建。成功标志MySQL中SHOW TABLES FROM stock_data;返回fina_indicator,daily,trade_cal等12张表。6.6 步骤6单点采集测试——用最小数据集验证端到端# 只采集1只股票贵州茅台 $ python collector.py --module daily --ts-code 600519.SH --start-date 20240101 --end-date 20240105 # 验证数据 $ mysql -u finhack -ppwd -e SELECT * FROM stock_data.daily WHERE ts_code600519.SH ORDER BY trade_date DESC LIMIT 5;预期结果返回5条记录trade_date为20240101~20240105close字段值与tushare官网一致。失败诊断若报KeyError: items说明tushare token无效若close为空检查database.json中charset是否为utf8mb4。6.7 步骤7全量调度启动——crontab配置与日志监控# 编辑crontab $ crontab -e # 添加每日9:30执行日更 30 9 * * * cd /path/to/FinHack-Collecter source venv/bin/activate python collector.py --schedule daily /var/log/finhack.log 21 # 启动后检查 $ tail -f /var/log/finhack.log日志关键字段成功时含[INFO] Daily collection completed. Total records: 245678失败时含[ERROR] Failed to fetch data for 600000.SH: HTTP 401。监控命令watch -n 10 mysql -u finhack -ppwd -e SELECT COUNT(*) FROM stock_data.daily WHERE trade_date CURDATE();查看当日数据入库量。最后提醒部署完成后立即执行python export.py --template industry_roe生成首份报告。看到industry_roe_top100_20240401.csv出现在/data/export/目录时你才算真正跑通了这套金融数据基建。这不仅是技术验证更是对整个工作流信心的建立——从此数据获取不再是焦虑源而是可计划、可预测、可审计的确定性服务。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

CPU-Z重置进程亲和性?解析Windows调度机制与Process Lasso的权限博弈 2026/9/2 16:50:17

CPU-Z重置进程亲和性?解析Windows调度机制与Process Lasso的权限博弈

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
GitHub AI4S 项目观察(2026-08-21—2026-08-27) 2026/9/2 16:50:17

GitHub AI4S 项目观察(2026-08-21—2026-08-27)

项目速览 项目Star(统计时间)主要功能AI4S 领域本周更新(简要)Wisp Science1,053(2026-08-28 09:18)在本地项目中串联文献检索、科学数据库查询、Python/R 计算、远程运行和证据留存科研 Agent、计算生物学…

阅读更多 →
Python 进程与线程学习笔记 2026/9/2 16:50:17

Python 进程与线程学习笔记

1. 引言 在 Python 开发中,进程(Process)与线程(Thread)是并发编程的两大核心概念。理解它们的区别与适用场景,是写出高效、稳定程序的关键。本文将从基础概念出发,结合代码示例,系统…

阅读更多 →
TVA具身智能架构:认知负荷动态建模与自适应卸载机制 2026/9/2 16:50:17

TVA具身智能架构:认知负荷动态建模与自适应卸载机制

前沿技术探索:TVA智能体(简称TVA) TVA智能体(亦称“AI智能体视觉”或“TVA视觉智能体”)是依托Transformer架构与“因式智能体”理论构建的通用视觉技术体系。它有机融合深度强化学习(DRL)、卷…

阅读更多 →
抗体人源化FR工程 | CDR 没变,为什么亲和力还是掉了? 2026/9/2 16:50:17

抗体人源化FR工程 | CDR 没变,为什么亲和力还是掉了?

如果 CDR 是抗原结合的核心区域,那么保留 CDR,为什么不能保证保留亲和力?这是很多人第一次接触抗体人源化时最容易困惑的问题。从直觉上看,CDR 是抗体识别抗原的核心。我们把鼠源抗体中最重要的 CDR 保留下来,再把框架…

阅读更多 →
Python 3.14 实用技巧:10个让代码更清晰的小改进 2026/9/2 16:47:17

Python 3.14 实用技巧:10个让代码更清晰的小改进

3.14 所引入的改进里, 绝大多数都是颇为细微的, 然而这些并非显著的变化却能够致使代码书写显得更为流畅, 并且运行起来也会更加稳定。这本文章整理出了 10 个具备实用性的特性改进, 而且每一个都配备了代码示例。1、 的 类型标注以前, 配置字典当中的可供选择的字段处理起来是…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞