【应用】基于 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 定义了 User 和 Post 两个模型,作为扩展基础------模板项目预留了用户系统和内容管理的能力,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。


相关推荐
垂钓的小鱼15 小时前
2026集合竞价数据从哪里来?6 种获取渠道对比
金融
东莞市云毅网络有限公司6 小时前
AI 引用句逐条回指原文:让回答可回溯的校验实现
python·数据清洗·rag·企业知识库·文档解析
数字融合8 小时前
透明化视频三维矿山井下照明重建技术
人工智能·python·数码相机
yi0118 小时前
LeetCode 219:存在重复元素 II——哈希表记录“最近一次出现的位置”
数据结构·人工智能·笔记·python·算法·leetcode·哈希表
程序员Sunday9 小时前
JavaScript 事件循环面试题,宏任务与微任务怎么执行|Sunday面试指南
开发语言·javascript·面试·校招·事件循环·程序员sunday
Marst Code10 小时前
上位机开发日记 · 第 2 篇 · 架构先行:六层分层与边界
python
默_笙10 小时前
🌊 向量库和 ES 都查不出"关系",我只好给奶茶建了一张人脉网
前端·javascript
李日华大战鸡红10 小时前
FOC状态空间方程模型推导(学习记录)
python·学习·线性代数
思无邪6611 小时前
用 AI 做 JS 逆向:从抓包到复现的完整方法论
开发语言·javascript·人工智能
梦帮科技12 小时前
【3.0修订版】跨链中继与事件编排:Relayer 监听、多签验证与故障自愈
web安全·金融·区块链·密码学·智能合约·安全架构·信任链