news 2026/9/19 2:31:05

RSMA安全传输:预编码优化与NOMA/SDMA对比仿真

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
RSMA安全传输:预编码优化与NOMA/SDMA对比仿真

简介:面向无线通信安全研究的论文复现资料,围绕速率分割多址接入(RSMA)的安全传输预编码优化展开系统阐述。内容将RSMA与NOMA、SDMA统一于下行广播模型中,详细介绍用户消息拆分、公共流与私有流预编码设计、连续干扰消除过程,以及基于WMMSE的迭代优化算法,并配有中文逐行注释的MATLAB代码,可直接运行复现论文实验。压缩包内含1个PDF文件,共756KB,涵盖系统模型、仿真参数配置、安全速率与误码率评估、公共流功率最大化及动态权重调整等关键内容,代码中包括信道随机生成、预编码迭代更新和安全速率收敛曲线绘制等完整流程,便于读者对照理解。资料已有289人学习,适合通信工程专业研究生、科研人员和无线安全领域工程师参考,可快速掌握RSMA预编码优化与安全传输仿真方法。

1. RSMA 安全传输框架解决的问题

速率分割多址接入(RSMA)在安全传输上的反直觉结论是:把一部分信息放进所有接收端都检测得到的公共流里,反而能提升系统的保密速率。传统直觉是保密信息应该尽量藏进私有流,但私有流一旦被窃听者用串行干扰消除(SIC)解析出来就完全暴露;RSMA 让公共流承载所有合法用户共同需要的信息,公共流在合法接收端可被共享,在窃听端却成了解码私有流时无法甩掉的干扰层。再加上 NOMA 的功率域复用和 SDMA 的空间隔离,预编码优化的目标就变成“让合法方向的公共流足够强、私有流足够准,让窃听方向的波形尽可能乱”。这套安全传输框架面向 5G/6G 物理层算法、预编码设计、MIMO 系统仿真和物理层安全的从业者,也能够作为多址接入技术对比的入门素材,后续内容会从系统模型、安全速率公式、可运行 MATLAB 代码到参数调优依次展开。

2. RSMA 预编码优化与安全速率模型

2.1 RSMA 发射信号与 NOMA、SDMA 的结构差异

RSMA 的思想是把每个用户的信息拆成公共部分和私有部分。公共部分编码成公共流 s_c,被所有合法用户共同解码;私有部分编码成私有流 s_i,只给对应用户。发射端有 Nt 根天线、两个单天线合法用户和一个单天线窃听者时,发射信号可以写成:

x = sqrt(β·P)·w_c·s_c + sqrt(α_1·P)·w_1·s_1 + sqrt(α_2·P)·w_2·s_2

其中 β 是公共流功率占比,α_1、α_2 是两个私有流的功率占比,满足 β + α_1 + α_2 = 1;w_c、w_1、w_2 是对应的预编码向量。这个式子同时保留了 NOMA 的功率自由度(β、α_1、α_2 可调)和 SDMA 的空间自由度(w_c、w_1、w_2 方向可调),所以 RSMA 在数学结构上是 NOMA 和 SDMA 的推广形式。NOMA 的发射信号通常写成多个用户消息在同一预编码方向上做功率叠加,靠功率差区分用户;SDMA 则用互相正交或近似正交的预编码向量把用户隔离开,不做同方向功率复用。RSMA 多出来的公共流恰恰是安全传输最有价值的部分。

公共流在接收端的处理顺序是:所有合法用户先解调 s_c,从接收信号中减去它,再解自己的私有流 s_i。这个过程意味着公共流对每个合法用户都贡献一份共享速率,而窃听者在解自己的私有流之前,也必须先处理公共流。如果窃听者没有可靠的 SIC 顺序,公共流就会成为它解码私有流时的干扰源。预编码优化的目标就是放大这种不对称性:让公共流在窃听者方向不要形成清晰的可解码星座,或者让窃听者即使解出公共流,也得不到完整的私有信息。

维度NOMASDMARSMA
发射结构同一方向上功率叠加空间方向隔离公共流 + 私有流,功率与空间同时复用
解码顺序固定 SIC,按功率排序各用户直接解自己的流先解公共流再解私有流
安全风险点强用户功率高,窃听者先解强信号信道相关时波束隔离失效公共流占比太低时失去掩护效果
预编码自由度几乎只有功率分配只有空间方向功率占比与空间方向都可优化

从表格可以看到,NOMA 的安全脆弱点在于强用户消息的功率大,窃听者很容易优先解出强用户的私有流;SDMA 的安全脆弱点在于用户间信道相关时空间隔离不彻底,波束方向出现泄漏。RSMA 把一部分信息放进公共流后,即使窃听者解出公共流,私有流仍然受到功率域的掩护,这是前两种多址方式不具备的结构特性。

2.2 安全速率表达式与预编码优化目标

安全速率是合法用户可达速率与窃听者可达速率的差。合法用户 1 解公共流时的信干噪比(SINR)为:

γ_c1 = β·P·|h_1^H w_c|² / (α_1·P·|h_1^H w_1|² + α_2·P·|h_1^H w_2|² + σ²)

解完公共流并做 SIC 之后,用户 1 解私有流 s_1 的 SINR 为:

γ_p1 = α_1·P·|h_1^H w_1|² / (α_2·P·|h_1^H w_2|² + σ²)

用户 2 的表达式与用户 1 对称。窃听者的对应 SINR 记作 η_c、η_p1、η_p2,安全速率写为:

R_sec = [ min(log2(1+γ_c1), log2(1+γ_c2)) ? log2(1+η_c) ]⁺ + [ log2(1+γ_p1) ? log2(1+η_p1) ]⁺ + [ log2(1+γ_p2) ? log2(1+η_p2) ]⁺

其中 [x]⁺ 表示取 x 和 0 中的较大者。公共流的安全速率由两个合法用户中较差的那个决定,因为公共信息必须被所有合法用户都正确解码;窃听者的公共流速率则按它实际能解出的能力计算。这个公式说明,预编码优化的目标不是简单地提高信噪比,而是同时拉大合法用户和窃听者之间的 SINR 差距。如果只做最大比发送(MRT)预编码,合法用户的方向增益最大,但信号也可能向窃听者方向泄漏;如果只做追零(ZF)预编码,窃听方向可以被零陷,但合法用户的信噪比也会损失。RSMA 的做法是在两者之间留出公共流这个缓冲层。

2.2.1 两级预编码设计流程

常见的设计方案是“固定方向 + 搜索功率分配”。方向设计上,私有流 w_1 和 w_2 分别指向两个合法用户的信道方向,公共流 w_c 指向两个用户信道的合成方向,这样公共流能同时被两个用户接收;功率分配上,用网格搜索枚举 β 和 α 的组合,选择使安全速率最大的那组参数。这种两级做法不是全局最优,但实现简单、仿真稳定,工程上已经有足够参考价值。

w_1 = h_1 / ||h_1|| w_2 = h_2 / ||h_2|| w_c = h_1/||h_1|| + h_2/||h_2|| 归一化后作为公共方向

得到方向后,安全速率只依赖 β、α_1、α_3 三个功率变量,约束 β + α_1 + α_2 = 1。代码实现中可以让 α_1 = α_2 = (1?β)/2,把三维搜索降成一维搜索,降低计算量同时保留 RSMA 最核心的趋势。

2.3 安全速率公式中的预编码耦合

安全速率公式里有两个关键耦合点。第一个是公共流和私有流在合法用户处的干扰耦合,公共流的功率越大,私有流的 SINR 越低;第二个是公共流在窃听者处的“掩护”作用,公共流功率大时,窃听者解私有流受到的干扰也越大。这两个耦合方向相反,预编码优化的效果直接决定系统落在哪个工作点。若公共流预编码方向和私有流方向接近,合法用户做 SIC 后私有流干扰很小,但窃听者也更容易从公共流中提取信息;若公共流方向和私有流方向拉开,合法用户 SIC 的效果变差,但窃听者的解码难度更高。这种耦合在 NOMA 和 SDMA 中都不存在,是 RSMA 安全传输框架独有的设计自由度,也是后续仿真中观察安全速率随功率占比变化的内在原因。

3. 可运行的 RSMA、NOMA、SDMA 安全速率仿真代码

3.1 仿真环境与公平性设置

下面给出的 MATLAB 代码是一个最小可运行版本:发射天线 Nt=4,两个合法用户和一个窃听者都是单天线,蒙特卡洛次数 MC=2000,信噪比从 0 dB 扫到 20 dB。为了公平对比,三种多址方案使用相同的随机信道集合,并且统一采用 MRT 预编码方向。NOMA 和 SDMA 本身可以用 ZF 或更复杂的预编码,但那样会引入额外增益,难以区分“多址方式”和“预编码算法”各自对安全速率的影响。这里统一 MRT,对比的是信号结构本身的差异。

信道做了归一化处理,即每个用户的信道向量除以自身范数。这样做的目的是让信噪比完全由发射功率 P 和噪声功率 σ² 的比值决定,避免不同用户的信道增益差异掩盖多址方式的影响。

3.2 MATLAB 仿真代码

%% RSMA vs NOMA vs SDMA 安全速率对比 clear; clc; rng(2024); Nt = 4; % 发射天线数 MC = 2000; % 蒙特卡洛次数 SNR_dB = 0:2:20; % 信噪比范围 P = 1; % 发射功率 sigma2 = 1; % 噪声功率 R_rsma = zeros(1, length(SNR_dB)); R_noma = zeros(1, length(SNR_dB)); R_sdma = zeros(1, length(SNR_dB)); betaGrid = 0.05:0.05:0.95; % RSMA 公共流功率占比搜索范围 for iSnr = 1:length(SNR_dB) snr = db2pow(SNR_dB(iSnr)); acc_rsma = 0; acc_noma = 0; acc_sdma = 0; for mc = 1:MC % 生成并归一化信道 h1 = (randn(Nt,1) + 1j*randn(Nt,1)) / sqrt(2); h2 = (randn(Nt,1) + 1j*randn(Nt,1)) / sqrt(2); g = (randn(Nt,1) + 1j*randn(Nt,1)) / sqrt(2); h1 = h1 / norm(h1); h2 = h2 / norm(h2); g = g / norm(g); % MRT 预编码方向 w1 = h1; w2 = h2; wc = h1 + h2; wc = wc / norm(wc); %% RSMA 安全速率:网格搜索公共流占比 bestRate = -inf; for beta = betaGrid alpha1 = (1-beta)/2; % 用户1私有流功率占比 alpha2 = (1-beta)/2; % 用户2私有流功率占比 % 合法用户公共流 SINR g_c1 = beta*snr*abs(h1'*wc)^2 / ... (alpha1*snr*abs(h1'*w1)^2 + alpha2*snr*abs(h1'*w2)^2 + 1); g_c2 = beta*snr*abs(h2'*wc)^2 / ... (alpha1*snr*abs(h2'*w1)^2 + alpha2*snr*abs(h2'*w2)^2 + 1); % SIC 后私有流 SINR g_p1 = alpha1*snr*abs(h1'*w1)^2 / ... (alpha2*snr*abs(h1'*w2)^2 + 1); g_p2 = alpha2*snr*abs(h2'*w2)^2 / ... (alpha1*snr*abs(h2'*w1)^2 + 1); % 窃听者 SINR:不假设窃听者能做完美 SIC,保留全部干扰 e_c = beta*snr*abs(g'*wc)^2 / ... (alpha1*snr*abs(g'*w1)^2 + alpha2*snr*abs(g'*w2)^2 + 1); e_p1 = alpha1*snr*abs(g'*w1)^2 / ... (alpha2*snr*abs(g'*w2)^2 + 1); e_p2 = alpha2*snr*abs(g'*w2)^2 / ... (alpha1*snr*abs(g'*w1)^2 + 1); Rc = min(log2(1+g_c1), log2(1+g_c2)) - log2(1+e_c); Rp = (log2(1+g_p1) - log2(1+e_p1)) + ... (log2(1+g_p2) - log2(1+e_p2)); Rsec = max(Rc, 0) + max(Rp, 0); if Rsec > bestRate bestRate = Rsec; end end acc_rsma = acc_rsma + bestRate; %% NOMA 安全速率 bestRateNoma = -inf; for a1 = 0.50:0.05:0.95 % 强用户功率占比 a2 = 1 - a1; % 用户1为强用户,用户2先 SIC 解用户1再解自己 g_n1 = a1*snr*abs(h1'*w1)^2 / (a2*snr*abs(h1'*w2)^2 + 1); g_n2 = a2*snr*abs(h2'*w2)^2 / 1; % SIC 后无强用户干扰 e_n1 = a1*snr*abs(g'*w1)^2 / (a2*snr*abs(g'*w2)^2 + 1); e_n2 = a2*snr*abs(g'*w2)^2 / (a1*snr*abs(g'*w1)^2 + 1); RsecNoma = max(log2(1+g_n1) - log2(1+e_n1), 0) + ... max(log2(1+g_n2) - log2(1+e_n2), 0); if RsecNoma > bestRateNoma bestRateNoma = RsecNoma; end end acc_noma = acc_noma + bestRateNoma; %% SDMA 安全速率:两个私有流,无公共流 % 用投影构造正交方向,减少用户间干扰 w1_sd = h1 - h2*(h2'*h1); w1_sd = w1_sd / norm(w1_sd); w2_sd = h2 - h1*(h1'*h2); w2_sd = w2_sd / norm(w2_sd); g_s1 = snr*abs(h1'*w1_sd)^2 / (snr*abs(h1'*w2_sd)^2 + 1); g_s2 = snr*abs(h2'*w2_sd)^2 / (snr*abs(h2'*w1_sd)^2 + 1); e_s1 = snr*abs(g'*w1_sd)^2 / (snr*abs(g'*w2_sd)^2 + 1); e_s2 = snr*abs(g'*w2_sd)^2 / (snr*abs(g'*w1_sd)^2 + 1); RsecSdma = max(log2(1+g_s1) - log2(1+e_s1), 0) + ... max(log2(1+g_s2) - log2(1+e_s2), 0); acc_sdma = acc_sdma + RsecSdma; end R_rsma(iSnr) = acc_rsma / MC; R_noma(iSnr) = acc_noma / MC; R_sdma(iSnr) = acc_sdma / MC; end %% 绘图对比 plot(SNR_dB, R_rsma, 'o-', 'LineWidth', 1.5); hold on; plot(SNR_dB, R_noma, 's--', 'LineWidth', 1.5); plot(SNR_dB, R_sdma, 'd-.', 'LineWidth', 1.5); xlabel('SNR (dB)'); ylabel('安全速率 (bit/s/Hz)'); legend('RSMA', 'NOMA', 'SDMA', 'Location', 'northwest'); grid on;

3.3 代码逻辑说明

外层for iSnr循环负责扫描信噪比,内层for mc循环做蒙特卡洛平均。信道归一化是必要步骤:如果不除以范数,不同用户的路径损耗差异会让安全速率曲线的比较失真,图上的趋势不再是多址结构造成的,而是信道强弱造成的。

RSMA 的功率分配搜索放在for beta = betaGrid循环里。alpha1 = (1-beta)/2alpha2 = (1-beta)/2表示两个私有流对称分配剩余功率。合法用户公共流 SINR 的分母包含两个私有流的功率,体现的是“所有合法用户先解公共流、把私有流当干扰”的处理顺序;私有流 SINR 的分母只保留另一用户的私有流干扰,体现 SIC 成功后公共流干扰已被消除。窃听者的 SINR 公式不假设它能完美做 SIC,保守地把公共流和私有流的所有干扰都算进去,这在安全速率评估中是常用做法。

NOMA 的安全速率计算里,用户 2 的合法 SINR 分母是 1,因为用户 2 先解强用户再解自己,SIC 后没有强用户干扰。窃听者没有这个优势,它的用户 2 SINR 分母保留强用户干扰,因而 NOMA 在强用户功率占比高时,窃听者更容易先解出强用户消息,安全速率被拉低。这里的max(..., 0)对应安全速率公式中的 [x]⁺ 运算,防止出现负保密率。

SDMA 部分用投影公式构造出与另一个用户信道近似正交的方向,然后两个用户各自解码自己的私有流。SDMA 在合法用户方向做对了干扰抑制,但窃听者方向没有任何特殊设计,所以当窃听者信道与某个合法用户信道接近时,安全速率会明显下降。运行这段代码能得到三条曲线,RSMA 通常在高 SNR 下有最大安全速率,SRARA 在低 SNR 的公共流功率分配上需要通过网格搜索找准工作点。

4. 预编码优化参数的敏感性、安全翻转与工程落点

4.1 参数表与初始配置

仿真的初始参数影响结果的可解释性,下面的表格是配合上述代码的推荐设置:

参数取值设置理由
Nt4两个用户时自由度充足,又不至于让仿真过重
K2RSMA 最小演示场景,便于对照 NOMA 与 SDMA
MC2000蒙特卡洛方差足够小,曲线稳定
SNR0~20 dB覆盖 5G NR 典型中低信噪比区间
β 搜索范围0.05~0.95覆盖公共流功率占比的完整区间
β 搜索步长0.05一维搜索 19 个点,计算量可控

MC 取 2000 是经验值,低于 500 时曲线会出现明显抖动,高于 5000 时仿真时间变长但趋势变化不大。Nt=4 时,SDMA 的零空间维度够用,两个用户的方向较容易分离开,此时如果 RSMA 仍能拉开安全速率差距,说明是公共流本身在起作用,而不是空间自由度不够导致的。

4.2 公共流占比 β 的安全翻转边界

RSMA 的 β 取值直接决定公共流和私有流的功率分配。β 增大时公共流 SINR 提高,公共部分的安全速率上升;但同时私有流功率被压缩,私有部分的安全速率下降。两条曲线叠加后,系统安全速率在某个中间 β 达到峰值。这个峰值随 SNR 移动:低 SNR 时噪声功率大,公共流即使拿到较大功率也未必能解出,最优 β 偏向低值;高 SNR 时公共流解调容易,多分一点功率给公共流,可以显著提升公共部分的安全速率,最优 β 偏向高值。

安全翻转边界可以这样理解:当窃听者的公共流 SINR 超过合法用户中较差的那个时,公共流的安全速率为负值,[x]⁺运算把它截断到零。此时公共流越大,私有流功率越小,RSMA 反而没有 NOMA 好。这个翻转点在仿真中表现为曲线拐点,工程上对应的是“视线角过于集中”的信道场景。

4.3 预编码方向与功率分配的组合调整

MRT 预编码的方向只依赖合法用户的信道,没有考虑窃听者。若窃听者信道和某个合法用户信道高度相关,私有流会直接泄漏给窃听者,这时把更多功率放到公共流上,利用公共流作为干扰层,是更稳妥的策略。若窃听者信道与合法用户信道差异较大,私有流的空间隔离效果好,可以适当降低 β,把功率让给私有流。

调整时有一个工程上常用的顺序:先固定预编码方向,搜索 β 找到安全速率峰值;再把 β 固定在这个峰值,微调 w_c 的方向,让公共流在两个合法用户方向上的增益更均衡;最后验证窃听者方向上的 SINR 变化。这种先功率后方向的策略收敛快,避免陷入功率和方向的联合搜索。

4.4 低 SNR 区间的 NOMA 误区和 RSMA 优势

低 SNR 区间,NOMA 的 SIC 失败率会上升。用户 1 的强信号如果没被用户 2 正确解码,用户 2 的私有流直接暴露在高干扰下,导致整个安全速率崩塌。RSMA 的公共流也存在类似风险,但公共流是共享速率,即使某个用户解公共流失败,另一个用户仍然可以解自己的私有流,不会出现“全丢”的情况。这是 RSMA 在高要求安全场景中的结构冗余优势。实际工程落地时,可以提前把用户信道相关性、SNR 范围、窃听者假定位置放进仿真,用代码输出去选择 β 的静态默认值,再用在线监测结果做小范围修正,避免在每次调度里都跑一遍网格搜索。

5. 零空间人工噪声与鲁棒预编码技巧

5.1 让合法用户感不到噪声的 AN 设计

预编码优化的安全增益会在 CSI 存在误差时明显缩水,一个常用来补充的物理层安全手段是人工噪声(AN)。AN 的思想是发射端额外注入一个独立噪声波形,目标是压低窃听者的接收 SINR。但它不能伤到合法用户,因此需要把噪声的预编码方向设计到合法信道的零空间里。具体做法是取合法用户信道矩阵 H = [h_1, h_2]^H ∈ C^(2×Nt),构造零空间投影矩阵:

N_an = I - H^H (H H^H)^(-1) H

N_an 的每一列都满足 h_i^H · N_an = 0,人工噪声沿这个矩阵的列方向发射,合法用户根本收不到,窃听者则因为信道不在零空间内,SINR 被直接压低。发射信号变为:

x = sqrt(β·P)·w_c·s_c + sqrt(α_1·P)·w_1·s_1 + sqrt(α_2·P)·w_2·s_2 + sqrt(φ·P)·w_an·z

其中 w_an 是 N_an 的归一化列向量,φ 是 AN 的功率占比,z 是零均值单位方差的高斯噪声。由于合法用户方向不受 AN 影响,增加 φ 只会降低窃听者速率,不会改变合法用户 SINR。这个性质在仿真中很容易验证:把 φ 从 0 调到 0.3,合法安全速率几乎不变,窃听者的可达速率至少下降一档。

5.2 CSI 误差下的功率修正策略

实际系统中 h_1 和 h_2 来自信道估计,必然存在误差。设估计信道为 ĥ,真实信道为 h = ĥ + Δh,其中 Δh 的方差反映导频长度和量化精度。零空间是按 ĥ 构造的,真实信道下 h_i^H · w_an ≠ 0,部分 AN 功率会泄漏到合法用户方向,造成合法 SINR 下降。此时不能照搬理想 CSI 下的 β 最优值,而是在目标 SINR 上预留一个保护裕量。

工程做法是把 CSI 误差折算成一个等效的 SINR 损耗,再回到第四章的 β 搜索里重新查表。例如信道估计误差使合法用户 SINR 下降 1.5 dB,就把仿真中的噪声功率 σ² 调大 1.5 dB,重新搜索公共流功率占比 β 和 AN 功率占比 φ。这种“先补偿、再搜索”的顺序比直接加大 β 更稳健,因为前者针对误差来源修正模型,后者只是盲目增加公共流功率,可能会牺牲私有流速率。若零空间泄漏仍然明显,可以改用正则化追零预编码,在 AN 方向设计上给合法方向加一个小的保护余量,代价是 AN 对窃听者的压制效果会下降。

5.3 验证 AN 注入是否有效的三个步骤

第一步,固定 β 和 α,把 φ 从 0 逐步增大,观察合法用户 SINR 曲线。若合法 SINR 掉得超过 0.5 dB,说明零空间投影不准,要检查 H 是否满秩。第二步,在窃听者方向观察可达速率,φ 增大时窃听速率显著下降才算有效。第三步,把 CSI 误差加进蒙特卡洛循环,统计安全速率的累计分布函数,看高百分比处是否出现拖尾。零空间 AN 与 RSMA 公共流可以共存:公共流负责提供共享速率,AN 负责压制窃听干扰,两者功率占比按 5.1 中的公式统一在 β、α、φ 上做功率归一化搜索,得到的配置比单独使用任何一种方法都更接近实际系统的安全容量边界。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/19 2:30:38

MBP标签技术:重组蛋白纯化的高效解决方案

1. MBP标签技术概述:重组蛋白纯化的关键工具在生物制药和生命科学研究领域,重组蛋白表达与纯化一直是核心挑战。作为全球领先的生命科学解决方案提供商,Cytiva开发的MBP(麦芽糖结合蛋白)标签技术已成为解决这一难题的利…

作者头像 李华
网站建设 2026/9/19 2:30:19

循环语句在游戏性能优化中的核心应用:从测试到开发实战

最近团队在优化一款中大型手游的帧率表现,排查到某个副本玩法时,发现一个很不起眼的NPC批量刷新逻辑,居然在低端机上吃掉了将近4ms的耗时。定位到最后,问题根源就是一段三层嵌套的循环语句。这类情况在游戏项目里太常见了&#xf…

作者头像 李华
网站建设 2026/9/19 2:27:56

光纤交换机配置实战:WWN与Zoning核心解析及排障命令

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

作者头像 李华
网站建设 2026/9/19 2:27:02

Claude Code平替实测:TRAE能否取代?深度对比与选型指南

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

作者头像 李华
网站建设 2026/9/19 2:25:42

2025自建Git服务选型指南:Gitea、GitLab、Gerrit全面对比与部署实践

自建Git服务这个事,这些年问的人越来越多。尤其是2025年这个节点,团队代码资产安全、合规审计、内网隔离这些需求越来越具体,GitHub/Gitee这类托管平台虽然省事,但真到了私有化、离线部署、深度定制这些环节,还是得自己…

作者头像 李华