diff --git a/.gitignore b/.gitignore index 4ca0a30..ffb6042 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ output/ +test/ 后端学习/本地记录.md diff --git a/后端学习/测试.md b/后端学习/测试.md new file mode 100644 index 0000000..18451cc --- /dev/null +++ b/后端学习/测试.md @@ -0,0 +1,3 @@ +测试 + +小明今天15岁了,它是天水小学上学。 \ No newline at end of file diff --git a/杂项/Docker指南.md b/杂项/Docker指南.md index e7dc15a..9f318b9 100644 --- a/杂项/Docker指南.md +++ b/杂项/Docker指南.md @@ -725,6 +725,12 @@ net start winnat +- **windows下部署,端口安全问题** + +Windows 对低端口(<1024)的特殊保护,非管理员或没有对应防火墙放行的进程,可能被系统直接拦截或拒绝绑定。因此这种需要手动在防火墙开个入站规则(类似linux云服务器的设置开放端口),或者干脆用一个高端口(>1024)来映射。 + + + - **构建镜像失败** ```text diff --git a/杂项/JavaWeb——前端.md b/杂项/JavaWeb——前端.md index cdc4115..23686b1 100644 --- a/杂项/JavaWeb——前端.md +++ b/杂项/JavaWeb——前端.md @@ -1292,3 +1292,30 @@ server { ``` root 要指定静态文件根目录,如果是docker部署,一定要写**容器内**的位置;`index.html` 这个文件是`/usr/share/nginx/html`目录下的。 + + + +**坑点:** + +如果要上传文件,可能会报413错误:单次请求的 整体 body 大小超限(默认1MB) + +若后端需要解析比较耗时,还可能报503错误:超时间限制(默认60秒) + +业务涉及 **大文件上传** 或 **长时间任务**,务必调整这些配置!如: + +```nginx +location /api/ { + proxy_pass http://ai-rag-knowledge-app:8095; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + + client_max_body_size 50M; # 允许上传 50MB + # 添加代理超时设置(单位:秒) + proxy_connect_timeout 3600s; + proxy_send_timeout 3600s; + proxy_read_timeout 3600s; + } +``` + diff --git a/杂项/linux服务器.md b/杂项/linux服务器.md index 38b3b14..2bb969e 100644 --- a/杂项/linux服务器.md +++ b/杂项/linux服务器.md @@ -69,8 +69,6 @@ DNS解析:可能需等待几分钟生效 head -n 100 文件名 ``` - - - **touch** 新建文本文件,如touch /home/hello.py 将在home 文件夹下新建hello.py - **ls** 列出所有文件,但默认只是显示出最基础的文件和文件夹,如果需要更详细的信息,则使用ls -la,这将列出包括隐藏文件在内的所有文件和文件夹,并且给出对应的权限、大小和日期等信息。 @@ -199,6 +197,8 @@ DNS解析:可能需等待几分钟生效 lsof -i :80 #查看 80 端口上的进程,或者判断80端口是否被占用! ``` + `netstat -ano | findstr :8080`这是windows cmd下检查端口占用的命令 + - **usermode** 修改用户账户信息的命令 ```text @@ -1215,7 +1215,7 @@ nano docker-compose.yml #创建并编辑文件 ``` -```text +```yml services: qbittorrent: image: linuxserver/qbittorrent @@ -1239,6 +1239,19 @@ services: ``` +有个bug!qBittorrent 登录遇到 **unauthorized**的解决方法: + +1、先停止容器docker compose down + +2、进入配置文件夹config,编辑qBittorrent.conf在文末加上: + +```text +WebUI\HostHeaderValidation=false +WebUI\CSRFProtection=false +``` + +3.如果还是进不去,在地址后端添加'/' + ## 内网穿透 diff --git a/科研/小论文.md b/科研/小论文.md index 7c7df44..519a101 100644 --- a/科研/小论文.md +++ b/科研/小论文.md @@ -391,9 +391,7 @@ AI对结构预测不准, 特征 - - - +为什么要等随机网络稳定?这里其实是一个假设,稳定下来:RWP 在足够长时间后满足 Birkhoff 点态遍历定理,节点的取样分布趋于稳态,并且对每个时刻都是同分布!!!然后可以应用那个结论。 diff --git a/科研/草稿.md b/科研/草稿.md index 6ffdcb1..cd2ea1e 100644 --- a/科研/草稿.md +++ b/科研/草稿.md @@ -1,54 +1,98 @@ -**平滑(Smoothing)** - 在时间序列分析中,“平滑”指的是用一种加权平均的方法,将原始序列中的随机波动(噪声)滤掉,突出其潜在的趋势和周期成分。指数平滑尤为典型:它对所有历史观测值 XtX_t 施加指数衰减的权重,使得离当前越近的数据权重越大、越远的数据权重越小,从而得到一条更为“平滑”的序列 StS_t。 +### 收缩矩阵的逐次特征值提取方法 -- **单指数平滑(SES)** +#### 1. 初始矩阵性质 +对于实对称矩阵 $A \in \mathbb{R}^{N \times N}$,当满足: +- 非对角元素 $a_{ij}$ 独立同分布 +- 均值 $\mathbb{E}[a_{ij}] = \mu$ +- 方差 $\text{Var}(a_{ij}) = \sigma^2$ +- 对角元素 $a_{ii} = 0$ - St=α Xt+(1−α) St−1,0<α<1 S_t = \alpha\,X_t + (1-\alpha)\,S_{t-1},\quad 0<\alpha<1 +其最大特征值 $\lambda_1$ 服从高斯分布: +$$ +\mathbb{E}[\lambda_1] (N-1)\mu + \frac{\sigma^2}{\mu}, \quad \text{Var}(\lambda_1) = 2\sigma^2 +$$ - 其中,StS_t 是时刻 tt 的平滑值,α\alpha(平滑系数)控制新旧信息的权重比例。 +#### 2. 收缩操作定义 +通过秩一修正实现矩阵收缩: +$$ +A^{(k+1)} = A^{(k)} - \lambda_k u_k u_k^T +$$ +其中: +- $\lambda_k$ 为当前矩阵 $A^{(k)}$ 的最大特征值 +- $u_k$ 为对应特征向量(单位范数) +- 初始条件 $A^{(1)} = A$ -- **双指数平滑(Holt)** - 在 SES 的基础上,再引入一个“趋势分量” TtT_t: +#### 3. 特征值递推关系 +第 $k$ 大特征值可通过收缩矩阵提取: +$$ +\lambda_k(A) = \lambda_1(A^{(k)}) +$$ - {Lt=α Xt+(1−α)(Lt−1+Tt−1)Tt=β (Lt−Lt−1)+(1−β) Tt−1\begin{cases} L_t = \alpha\,X_t + (1-\alpha)(L_{t-1}+T_{t-1}) \\[6pt] T_t = \beta\,(L_t - L_{t-1}) + (1-\beta)\,T_{t-1} \end{cases} +若收缩后矩阵 $A^{(k)}$ 保持: +- 非对角元素均值 $\mu_k$ +- 方差 $\sigma_k^2$ - 这里 LtL_t 是“平滑后的水平(level)”,TtT_t 是“平滑后的趋势(trend)”,β\beta 是趋势平滑系数。 +则特征值统计量满足: +$$ +\begin{cases} +\mathbb{E}[\lambda_k] = (N-k)\mu_k + \frac{\sigma_k^2}{\mu_k} \\ +\text{Var}(\lambda_k) = 2\sigma_k^2 +\end{cases} +$$ -- **三指数平滑(Holt–Winters)** - 进一步加入季节性分量 StS_t: +#### 4. 实现步骤 +1. **初始化**:设 $A^{(1)} = A$,$k=1$ +2. **迭代过程**: + ```python + while k <= K: + # 计算当前最大特征对 + λ, u = eigsh(A^{(k)}, k=1) + + # 记录统计量 + λ_sequence[k] = λ + + # 执行收缩 + A^{(k+1)} = A^{(k)} - λ * u @ u.T + + # 验证新矩阵性质 + μ_k = np.mean(A^{(k+1)}[off_diag]) + σ²_k = np.var(A^{(k+1)}[off_diag]) + + k += 1 - {Lt=α (Xt/St−m)+(1−α)(Lt−1+Tt−1)Tt=β (Lt−Lt−1)+(1−β) Tt−1St=γ (Xt/Lt)+(1−γ) St−m\begin{cases} L_t = \alpha\,(X_t/S_{t-m}) + (1-\alpha)(L_{t-1}+T_{t-1}) \\[4pt] T_t = \beta\,(L_t - L_{t-1}) + (1-\beta)\,T_{t-1} \\[4pt] S_t = \gamma\,(X_t/L_t) + (1-\gamma)\,S_{t-m} \end{cases} +$\sigma_1$. - 其中 mm 是季节周期长度,γ\gamma 是季节平滑系数。 ------- -**预测逻辑** - 指数平滑系列方法的核心假设是“未来的值可以用当前估计的水平、趋势、季节性分量线性组合”来近似。 -1. **单指数平滑** 预测: - X^t+1=St \hat X_{t+1} = S_t +您说得对,在奇异值分解(SVD)中,通常用 **u** 和 **v** 来表示左右奇异向量。以下是修正后的Markdown格式表示: - 即,预测值等于最后一个时刻的平滑值。 +对于随机网络矩阵 `A`,设奇异值从大到小依次为 `{\sigma _1},{\sigma _2}, \ldots ,{\sigma _n}`,对应的左、右奇异向量分别为 ${u}_1, {u}_2, \ldots, {u}_n$ 和 ${v}_1, {v}_2, \ldots,{v}_n$。 -2. **双指数平滑** 预测: +或者更紧凑地表示为: + `A = \sum_{i=1}^n \sigma_i \mathbf{u}_i \mathbf{v}_i^\top` - X^t+h=Lt+h Tt \hat X_{t+h} = L_t + h \, T_t +需要其他数学符号表示或格式调整可以随时告诉我! - 意味着:水平分量加上 hh 倍的趋势分量。 -3. **三指数平滑** 预测: - X^t+h=(Lt+h Tt)×St+h−m⌊(h−1)/m⌋ \hat X_{t+h} = \bigl(L_t + h\,T_t\bigr)\times S_{t+h-m\lfloor (h-1)/m\rfloor} - 即在双平滑的结果上,再乘以对应的季节系数。 -整体来看,指数平滑的预测逻辑就是: -- **水平分量(Level)** 反映序列的基准水平; -- **趋势分量(Trend)** 反映序列的线性增长或下降趋势; -- **季节分量(Seasonality)** 反映序列的周期波动; -- 将它们按照简单的线性公式“拼装”起来,就得到对未来点的估计。 -这种结构使得指数平滑既简单易算,又能灵活捕捉不同的时序特征。 +不必大动干戈,只要把“等号”换成“近似”等价写法,或显式加上误差项,就足够严谨。下面给出两种常见做法,你任选其一即可—— + +| 写法 | 建议格式 | 说明 | +| -------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | +| **近似号写法** | E[σ1]≈(N−1)μ+v+σ2μ,Var⁡[σ1]≈2σ2E[\sigma_1]\approx (N-1)\mu+v+\dfrac{\sigma^2}{\mu},\qquad \operatorname{Var}[\sigma_1]\approx 2\sigma^2 | 直接用 “≈” 表明这是 N→∞N\to\infty 的主导项;与前面“可在 O(1/N)O(1/\sqrt N) 范围内逼近高斯”完全呼应。 | +| **误差项写法** | E[σ1]=(N−1)μ+v+σ2μ+O ⁣(1N),Var⁡[σ1]=2σ2+O ⁣(1N)E[\sigma_1]=(N-1)\mu+v+\dfrac{\sigma^2}{\mu}+O\!\left(\tfrac{1}{N}\right),\qquad \operatorname{Var}[\sigma_1]=2\sigma^2+O\!\left(\tfrac{1}{N}\right) | 把小量显式写成 O(1/N)O(1/N)。这样保留等号,同时说明误差级别,更“硬核”一些。 | + +> **为什么推荐修改?** +> +> - 你的正文已经说“在 O(1/N)O(1/\sqrt N) 的范围内可被高斯分布逼近”,说明后续公式仅是渐近主项。直接用 “=” 容易让读者误以为 **完全等于** 主项。 +> - 只要在公式里加 “≈” 或 “+O(\cdot)” 就能避免歧义,而且和引用的 F & K 定理保持一致。 + +其余内容(条件、符号、文字描述)都没问题,不必再改。 + +$\approx$ diff --git a/项目/拼团交易系统.md b/项目/拼团交易系统.md index e19eb57..0a79716 100644 --- a/项目/拼团交易系统.md +++ b/项目/拼团交易系统.md @@ -1,6 +1,6 @@ # 拼团交易系统 -## 系统启动说明 +## 系统备忘录 本系统涉及微信和支付宝的回调。 @@ -1467,7 +1467,7 @@ if (openid != null) { -### 独占锁和无锁化场景 +### 独占锁和无锁化场景(防超卖) #### 独占锁 @@ -1789,3 +1789,42 @@ output { 打开 Kibana:浏览器访问 `http://localhost:5601`,新建 索引模式(如 `app-log-*`),即可在 Discover/Visualize 中查看与分析日志。 + + +### 防止重复下单 + +**外部交易单号设计** + +- **统一跟踪**:对接小商城时,将外部交易单号(`out_trade_no`)与小商城下单时生成的 `order_id` 保持一致,方便全链路追踪。 +- **内部独立**:拼团系统内部仍保留自己的 `order_id`,互不冲突。 + +在高并发支付场景中,确保同一用户对同一商品/活动只生成一条待支付订单,常用以下两种思路: + +#### 业务维度复合唯一索引 + 冲突捕获重试 + +1. **查询未支付订单** + - 在创建订单时,先根据业务维度(如 `userId + goodId + activityId`)查询“已下单但未支付”的订单; + - 若存在,则直接返回该订单,避免二次创建。 +2. **复合唯一索引约束** + - 在订单表中对业务维度字段(`userId`、`goodId`、`activityId` 等)添加**复合唯一索引**; + - 高并发下若出现并行插入,后续请求因违反唯一约束抛出异常; + - 捕获异常后,再次查询并返回已创建的订单,实现幂等。 +3. **分布式锁保障(可选)** + - 针对同一用户加分布式锁(例如 `lock:userId:{userId}`),确保只有**首个请求能获取锁**并创建订单; + - 后续请求等待锁释放或直接返回“订单处理中”,随后再次查询订单状态。 + +#### 幂等 Key 模式 + +1. **生成幂等 Key** + - 前端进入支付流程时调用接口(`GET /api/idempotency-key`),后端生成全局唯一 ID(UUID 或雪花 ID)返回给前端; + - 或者外部系统(如小商城)传来唯一的外部交易单号(`out_trade_no`),**天生作为幂等Key。** + - 前端将该 Key 存入内存、LocalStorage 或隐藏表单字段,直至支付完成或过期。 +2. **请求携带幂等 Key** + - 用户点击“下单”时,调用 `/create_pay_order` 接口,需在请求体中附带 `idempotencyKey`; + - 服务端根据该 Key 判断:若数据库中已有相同 `idempotency_key`,直接返回该订单,否则创建新订单。 +3. **数据库持久化 & 唯一约束** + - 在订单表中新增 `idempotency_key` 列,并对其增加唯一索引; + - 双重保障:前端重复发送同一 Key,也仅能插入一条记录,彻底避免重复下单。 + + +