Compare commits

..

2 Commits

Author SHA1 Message Date
b3275c206e Commit on 2025/07/30 周三 21:47:44.05 2025-07-30 21:47:44 +08:00
00980ab894 移除本地记录.md 2025-07-29 09:18:02 +08:00
9 changed files with 170 additions and 83 deletions

1
.gitignore vendored
View File

@ -1,2 +1,3 @@
output/
test/
后端学习/本地记录.md

View File

@ -1,44 +0,0 @@
# 技巧
## 修改git提交日期
用git bash here打开不要cmd终端。
1.先提交本地修改
2.git rebase -i --root =》然后将需要修改的pick改为edit
3.GIT_AUTHOR_DATE="2025-04-08T18:11:42" \
GIT_COMMITTER_DATE="2025-04-08T18:11:42" \
git commit --amend --no-edit --date "2025-04-08T18:11:42"
注意这两个时间都要设置,删掉--no-edit可以编辑commit信息。
4.git rebase --continue 继续编辑下一个提交记录
5.git push --force origin master 提交修改到远程。
git rebase --abort 如果中途不想修改了,可以退出操作
git log --pretty=fuller -1 查看AuthorDate和CommitDate是否一致。
编辑远程Gitea中的活动记录
docker exec -it gitea bash
sqlite3 /data/gitea/gitea.db
SELECT id, name, created_unix FROM repository WHERE name = '你的仓库名'; =>获得仓库的id
SELECT id, repo_id, created_unix FROM action where repo_id=19; =>获得该仓库的所有action

3
后端学习/测试.md Normal file
View File

@ -0,0 +1,3 @@
测试
小明今天15岁了它是天水小学上学。

View File

@ -725,6 +725,12 @@ net start winnat
- **windows下部署端口安全问题**
Windows 对低端口(<1024的特殊保护非管理员或没有对应防火墙放行的进程可能被系统直接拦截或拒绝绑定因此这种需要手动在防火墙开个入站规则类似linux云服务器的设置开放端口或者干脆用一个高端口>1024来映射。
- **构建镜像失败**
```text

View File

@ -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;
}
```

View File

@ -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:
```
有个bugqBittorrent 登录遇到 **unauthorized**的解决方法:
1、先停止容器docker compose down
2、进入配置文件夹config编辑qBittorrent.conf在文末加上
```text
WebUI\HostHeaderValidation=false
WebUI\CSRFProtection=false
```
3.如果还是进不去,在地址后端添加'/'
## 内网穿透

View File

@ -391,9 +391,7 @@ AI对结构预测不准 特征
为什么要等随机网络稳定这里其实是一个假设稳定下来RWP 在足够长时间后满足 Birkhoff 点态遍历定理,节点的取样分布趋于稳态,并且对每个时刻都是同分布!!!然后可以应用那个结论。

View File

@ -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α)St1,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α)(Lt1+Tt1)Tt=β (LtLt1)+(1β)Tt1\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 是“平滑后的水平levelTtT_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}
$$
- **三指数平滑HoltWinters**
进一步加入季节性分量 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/Stm)+(1α)(Lt1+Tt1)Tt=β (LtLt1)+(1β)Tt1St=γ(Xt/Lt)+(1γ)Stm\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+hTt \hat X_{t+h} = L_t + h \, T_t
需要其他数学符号表示或格式调整可以随时告诉我!
意味着:水平分量加上 hh 倍的趋势分量。
3. **三指数平滑** 预测:
X^t+h=(Lt+hTt)×St+hm⌊(h1)/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]≈(N1)μ+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]=(N1)μ+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$

View File

@ -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`),后端生成全局唯一 IDUUID 或雪花 ID返回给前端
- 或者外部系统(如小商城)传来唯一的外部交易单号(`out_trade_no`**天生作为幂等Key。**
- 前端将该 Key 存入内存、LocalStorage 或隐藏表单字段,直至支付完成或过期。
2. **请求携带幂等 Key**
- 用户点击“下单”时,调用 `/create_pay_order` 接口,需在请求体中附带 `idempotencyKey`
- 服务端根据该 Key 判断:若数据库中已有相同 `idempotency_key`,直接返回该订单,否则创建新订单。
3. **数据库持久化 & 唯一约束**
- 在订单表中新增 `idempotency_key` 列,并对其增加唯一索引;
- 双重保障:前端重复发送同一 Key也仅能插入一条记录彻底避免重复下单。