【应用】基于 Next.js 16 + Python mplfinance的金融K线图与技术指标可视化平台(三)

文章目录

    • 七、模拟行情数据生成
      • [7.1 设计目标](#7.1 设计目标)
      • [7.2 种子随机数 --- mulberry32](#7.2 种子随机数 — mulberry32)
      • [7.3 几何布朗运动模型](#7.3 几何布朗运动模型)
      • [7.4 偶发跳空与事件放量](#7.4 偶发跳空与事件放量)
      • [7.5 量价相关性](#7.5 量价相关性)
      • [7.6 日期生成](#7.6 日期生成)
      • [7.7 模拟标的列表](#7.7 模拟标的列表)
    • 八、数据库设计
      • [8.1 Prisma Schema](#8.1 Prisma Schema)
      • [8.2 数据库连接管理](#8.2 数据库连接管理)
      • [8.3 数据库文件路径](#8.3 数据库文件路径)

七、模拟行情数据生成

7.1 设计目标

项目不依赖外部行情数据源,而是通过 src/lib/stockData.ts 在内存中生成模拟 OHLCV 数据。这保证了演示的即时性和确定性------同一标的每次生成的序列完全相同,便于复现和调试。

7.2 种子随机数 --- mulberry32

使用 mulberry32 算法作为伪随机数生成器(PRNG),它是一种快速的 32 位哈希函数。种子通过对标的代码字符串做 FNV-1a 哈希得到,确保不同标的生成不同但可复现的序列:
#mermaid-svg-Sc0KYdJF43bVkUzN{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Sc0KYdJF43bVkUzN .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Sc0KYdJF43bVkUzN .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Sc0KYdJF43bVkUzN .error-icon{fill:#552222;}#mermaid-svg-Sc0KYdJF43bVkUzN .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Sc0KYdJF43bVkUzN .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Sc0KYdJF43bVkUzN .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Sc0KYdJF43bVkUzN .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Sc0KYdJF43bVkUzN .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Sc0KYdJF43bVkUzN .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Sc0KYdJF43bVkUzN .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Sc0KYdJF43bVkUzN .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Sc0KYdJF43bVkUzN .marker.cross{stroke:#333333;}#mermaid-svg-Sc0KYdJF43bVkUzN svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Sc0KYdJF43bVkUzN p{margin:0;}#mermaid-svg-Sc0KYdJF43bVkUzN .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Sc0KYdJF43bVkUzN .cluster-label text{fill:#333;}#mermaid-svg-Sc0KYdJF43bVkUzN .cluster-label span{color:#333;}#mermaid-svg-Sc0KYdJF43bVkUzN .cluster-label span p{background-color:transparent;}#mermaid-svg-Sc0KYdJF43bVkUzN .label text,#mermaid-svg-Sc0KYdJF43bVkUzN span{fill:#333;color:#333;}#mermaid-svg-Sc0KYdJF43bVkUzN .node rect,#mermaid-svg-Sc0KYdJF43bVkUzN .node circle,#mermaid-svg-Sc0KYdJF43bVkUzN .node ellipse,#mermaid-svg-Sc0KYdJF43bVkUzN .node polygon,#mermaid-svg-Sc0KYdJF43bVkUzN .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Sc0KYdJF43bVkUzN .rough-node .label text,#mermaid-svg-Sc0KYdJF43bVkUzN .node .label text,#mermaid-svg-Sc0KYdJF43bVkUzN .image-shape .label,#mermaid-svg-Sc0KYdJF43bVkUzN .icon-shape .label{text-anchor:middle;}#mermaid-svg-Sc0KYdJF43bVkUzN .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Sc0KYdJF43bVkUzN .rough-node .label,#mermaid-svg-Sc0KYdJF43bVkUzN .node .label,#mermaid-svg-Sc0KYdJF43bVkUzN .image-shape .label,#mermaid-svg-Sc0KYdJF43bVkUzN .icon-shape .label{text-align:center;}#mermaid-svg-Sc0KYdJF43bVkUzN .node.clickable{cursor:pointer;}#mermaid-svg-Sc0KYdJF43bVkUzN .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Sc0KYdJF43bVkUzN .arrowheadPath{fill:#333333;}#mermaid-svg-Sc0KYdJF43bVkUzN .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Sc0KYdJF43bVkUzN .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Sc0KYdJF43bVkUzN .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Sc0KYdJF43bVkUzN .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Sc0KYdJF43bVkUzN .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Sc0KYdJF43bVkUzN .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Sc0KYdJF43bVkUzN .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Sc0KYdJF43bVkUzN .cluster text{fill:#333;}#mermaid-svg-Sc0KYdJF43bVkUzN .cluster span{color:#333;}#mermaid-svg-Sc0KYdJF43bVkUzN div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Sc0KYdJF43bVkUzN .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Sc0KYdJF43bVkUzN rect.text{fill:none;stroke-width:0;}#mermaid-svg-Sc0KYdJF43bVkUzN .icon-shape,#mermaid-svg-Sc0KYdJF43bVkUzN .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Sc0KYdJF43bVkUzN .icon-shape p,#mermaid-svg-Sc0KYdJF43bVkUzN .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Sc0KYdJF43bVkUzN .icon-shape .label rect,#mermaid-svg-Sc0KYdJF43bVkUzN .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Sc0KYdJF43bVkUzN .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Sc0KYdJF43bVkUzN .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Sc0KYdJF43bVkUzN :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} symbol 字符串

e.g. 'DEMO.600519'
FNV-1a 哈希

2166136261 → 逐字符 XOR & 乘
32 位种子值
mulberry32(seed)
均匀随机数 [0,1)
Box-Muller → 标准正态分布

typescript 复制代码
function hashSymbol(symbol: string): number {
  let h = 2166136261  // FNV offset basis
  for (let i = 0; i < symbol.length; i++) {
    h ^= symbol.charCodeAt(i)
    h = Math.imul(h, 16777619)  // FNV prime
  }
  return h >>> 0
}

7.3 几何布朗运动模型

行情生成基于 几何布朗运动(GBM),这是金融工程中描述股价运动的标准数学模型。核心公式为:

S_{t+1} = S_t × (1 + drift + midTrend + ε × σ × regime)

其中各参数含义:

参数 含义 来源
drift 日漂移率(长期趋势) 标的元信息,如白酒 0.0004、半导体 0.001
midTrend 中期趋势摆动 sin(trendPhase) × 0.0022,模拟牛熊周期
ε 标准正态随机数 Box-Muller 变换
σ 基础波动率 标的元信息,如银行 0.012、芯片 0.033
regime 波动率状态切换 1 + sin(...) × 0.55,模拟高/低波动率市场环境

7.4 偶发跳空与事件放量

约 3% 的交易日会触发"事件跳空"------价格突然跳升或跳跌 1.5~3.5 倍日波动率。这模拟了突发利好/利空导致的价格跳空,使生成的 K 线图更贴近真实市场形态。同时,跳空当日的成交量会额外放大 1.4 倍,体现"量价配合"的市场规律。

7.5 量价相关性

成交量并非纯随机,而是与当日价格振幅正相关:
#mermaid-svg-Uatg9sPY5MO9mdKx{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Uatg9sPY5MO9mdKx .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Uatg9sPY5MO9mdKx .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Uatg9sPY5MO9mdKx .error-icon{fill:#552222;}#mermaid-svg-Uatg9sPY5MO9mdKx .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Uatg9sPY5MO9mdKx .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Uatg9sPY5MO9mdKx .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Uatg9sPY5MO9mdKx .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Uatg9sPY5MO9mdKx .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Uatg9sPY5MO9mdKx .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Uatg9sPY5MO9mdKx .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Uatg9sPY5MO9mdKx .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Uatg9sPY5MO9mdKx .marker.cross{stroke:#333333;}#mermaid-svg-Uatg9sPY5MO9mdKx svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Uatg9sPY5MO9mdKx p{margin:0;}#mermaid-svg-Uatg9sPY5MO9mdKx .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Uatg9sPY5MO9mdKx .cluster-label text{fill:#333;}#mermaid-svg-Uatg9sPY5MO9mdKx .cluster-label span{color:#333;}#mermaid-svg-Uatg9sPY5MO9mdKx .cluster-label span p{background-color:transparent;}#mermaid-svg-Uatg9sPY5MO9mdKx .label text,#mermaid-svg-Uatg9sPY5MO9mdKx span{fill:#333;color:#333;}#mermaid-svg-Uatg9sPY5MO9mdKx .node rect,#mermaid-svg-Uatg9sPY5MO9mdKx .node circle,#mermaid-svg-Uatg9sPY5MO9mdKx .node ellipse,#mermaid-svg-Uatg9sPY5MO9mdKx .node polygon,#mermaid-svg-Uatg9sPY5MO9mdKx .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Uatg9sPY5MO9mdKx .rough-node .label text,#mermaid-svg-Uatg9sPY5MO9mdKx .node .label text,#mermaid-svg-Uatg9sPY5MO9mdKx .image-shape .label,#mermaid-svg-Uatg9sPY5MO9mdKx .icon-shape .label{text-anchor:middle;}#mermaid-svg-Uatg9sPY5MO9mdKx .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Uatg9sPY5MO9mdKx .rough-node .label,#mermaid-svg-Uatg9sPY5MO9mdKx .node .label,#mermaid-svg-Uatg9sPY5MO9mdKx .image-shape .label,#mermaid-svg-Uatg9sPY5MO9mdKx .icon-shape .label{text-align:center;}#mermaid-svg-Uatg9sPY5MO9mdKx .node.clickable{cursor:pointer;}#mermaid-svg-Uatg9sPY5MO9mdKx .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Uatg9sPY5MO9mdKx .arrowheadPath{fill:#333333;}#mermaid-svg-Uatg9sPY5MO9mdKx .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Uatg9sPY5MO9mdKx .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Uatg9sPY5MO9mdKx .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Uatg9sPY5MO9mdKx .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Uatg9sPY5MO9mdKx .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Uatg9sPY5MO9mdKx .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Uatg9sPY5MO9mdKx .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Uatg9sPY5MO9mdKx .cluster text{fill:#333;}#mermaid-svg-Uatg9sPY5MO9mdKx .cluster span{color:#333;}#mermaid-svg-Uatg9sPY5MO9mdKx div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Uatg9sPY5MO9mdKx .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Uatg9sPY5MO9mdKx rect.text{fill:none;stroke-width:0;}#mermaid-svg-Uatg9sPY5MO9mdKx .icon-shape,#mermaid-svg-Uatg9sPY5MO9mdKx .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Uatg9sPY5MO9mdKx .icon-shape p,#mermaid-svg-Uatg9sPY5MO9mdKx .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Uatg9sPY5MO9mdKx .icon-shape .label rect,#mermaid-svg-Uatg9sPY5MO9mdKx .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Uatg9sPY5MO9mdKx .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Uatg9sPY5MO9mdKx .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Uatg9sPY5MO9mdKx :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是
基础成交量

800万 × (0.6~1.4) 随机
最终成交量
|涨跌幅| / 日波动率
权重 0.9
跳空事件?
+1.4 倍

typescript 复制代码
const move = Math.abs((close - open) / open)
const baseVol = 8_000_000 * (0.6 + rnd() * 0.8)
const volume = Math.round(baseVol * (1 + move / dailyVol * 0.9 + (shock !== 0 ? 1.4 : 0)))

7.6 日期生成

从当前日期倒推,跳过周末(周六周日),生成约 520 个交易日(约两年)的日期序列。日期使用 ISO 格式 YYYY-MM-DD,保证 Python 端 pd.to_datetime 能正确解析。

7.7 模拟标的列表

代码 名称 行业 基础价 漂移率 波动率 特征
DEMO.600519 云山白酒 消费·白酒 168 0.04% 1.9% 低波动稳健白马
DEMO.300750 宁州新能源 电力设备·电池 96 0.08% 2.8% 高成长高波动
DEMO.000001 蓝湾银行 金融·银行 12.6 0.02% 1.2% 极低波动防守型
DEMO.688111 衡芯半导体 科技·芯片 74 0.10% 3.3% 最高波动进攻型
DEMO.600036 招商航运 交运·港口 33 0.03% 1.6% 中低波动周期股

八、数据库设计

8.1 Prisma Schema

项目使用 SQLite 作为数据库,通过 Prisma ORM 访问。当前 Schema 定义了 UserPost 两个模型,作为扩展基础------模板项目预留了用户系统和内容管理的能力,KLine Studio 的核心业务暂未使用它们,但保留了完整的数据库基础设施。
#mermaid-svg-XR33TtetZIgjzRME{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-XR33TtetZIgjzRME .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-XR33TtetZIgjzRME .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-XR33TtetZIgjzRME .error-icon{fill:#552222;}#mermaid-svg-XR33TtetZIgjzRME .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-XR33TtetZIgjzRME .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-XR33TtetZIgjzRME .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-XR33TtetZIgjzRME .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-XR33TtetZIgjzRME .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-XR33TtetZIgjzRME .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-XR33TtetZIgjzRME .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-XR33TtetZIgjzRME .marker{fill:#333333;stroke:#333333;}#mermaid-svg-XR33TtetZIgjzRME .marker.cross{stroke:#333333;}#mermaid-svg-XR33TtetZIgjzRME svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-XR33TtetZIgjzRME p{margin:0;}#mermaid-svg-XR33TtetZIgjzRME .entityBox{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-XR33TtetZIgjzRME .relationshipLabelBox{fill:hsl(80, 100%, 96.2745098039%);opacity:0.7;background-color:hsl(80, 100%, 96.2745098039%);}#mermaid-svg-XR33TtetZIgjzRME .relationshipLabelBox rect{opacity:0.5;}#mermaid-svg-XR33TtetZIgjzRME .labelBkg{background-color:rgba(248.6666666666, 255, 235.9999999999, 0.5);}#mermaid-svg-XR33TtetZIgjzRME .edgeLabel .label{fill:#9370DB;font-size:14px;}#mermaid-svg-XR33TtetZIgjzRME .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-XR33TtetZIgjzRME .edge-pattern-dashed{stroke-dasharray:8,8;}#mermaid-svg-XR33TtetZIgjzRME .node rect,#mermaid-svg-XR33TtetZIgjzRME .node circle,#mermaid-svg-XR33TtetZIgjzRME .node ellipse,#mermaid-svg-XR33TtetZIgjzRME .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-XR33TtetZIgjzRME .relationshipLine{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-XR33TtetZIgjzRME .marker{fill:none!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-XR33TtetZIgjzRME .edgeLabel{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-XR33TtetZIgjzRME .edgeLabel .label rect{fill:rgba(232,232,232, 0.8);}#mermaid-svg-XR33TtetZIgjzRME .edgeLabel .label text{fill:#333;}#mermaid-svg-XR33TtetZIgjzRME :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} authorId
User
String
id
PK
String
email
UK
String
name
DateTime
createdAt
DateTime
updatedAt
Post
String
id
PK
String
title
String
content
Boolean
published
String
authorId
FK
DateTime
createdAt
DateTime
updatedAt

8.2 数据库连接管理

src/lib/db.ts 使用全局单例模式管理 PrismaClient 实例,防止开发模式下热模块重载(HMR)反复创建连接导致连接池耗尽:

typescript 复制代码
const globalForPrisma = globalThis as unknown as {
  prisma: PrismaClient | undefined
}

export const db =
  globalForPrisma.prisma ??
  new PrismaClient({ log: ['query'] })

if (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = db

8.3 数据库文件路径

开发环境下,DATABASE_URL 指向 file:/home/z/my-project/db/custom.db。部署时由 start.sh 动态设置,默认指向打包产物内的 /app/db/custom.db


相关推荐
正经教主12 小时前
【FDE系列】阶段2:Day 28:FastAPI 入门 — 把你的函数变成 API 服务
人工智能·python·fde
李航198312 小时前
用 DeepDraw 几何引擎开发建筑设计软件(十):推挤工具
python·3d
VXbishe13 小时前
【课程设计】基于SpringBoot的乡村政务服务系统的设计与实现-计算机毕设77011
javascript·vue.js·spring boot·python·php·课程设计·政务
名字还没想好☜13 小时前
Python sqlite3 实战:事务提交、参数化防注入、WAL 并发与 row_factory 取字典
后端·python·编程语言
志尊宝13 小时前
Vue3 零基础每日笔记(037):动手封装 useMouse 与 useWindowSize——事件监听的标准模板
前端·javascript·vue.js·笔记·html5
shmily麻瓜小菜鸡13 小时前
TDD(测试驱动开发)详解
开发语言·javascript·typescript·node.js·ecmascript
论文复现现场13 小时前
ComfyUI 怎么同时调用 4 张/8 张 RTX 4090?AI 视频批量生成的多实例队列与 Python 调度方案
人工智能·python·comfyui·rtx4090
泡海椒14 小时前
评分系统最佳实践:JQuick-Java实现权重、阈值动态配置评分
java·人工智能·python
weixin1997010801614 小时前
《二手ERP对接的对账机制:按日巡检 + 自动补偿,消灭“幽灵订单“》(附Python源码)
python
m0_5474866614 小时前
《Python数据分析与实践》全套PPT课件(杭州电子科技大学)
python·数据分析