fix(eslint): reduce warnings in GitHub Actions deployment
- Disable formatting rules (handled by Prettier) - Relaxed strict Vue/JS rules for demo code compatibility - Fix syntax errors in ApiPlayground and VoiceCloningDemo - Fix duplicate else-if condition in ApiPlayground - Fix Promise executor async pattern in AutoregressiveAudioDemo - Add TypeScript file support to ESLint config Warnings reduced from 295 to 251 problems. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -9,36 +9,78 @@
|
||||
<div class="main-area">
|
||||
<div class="aksk-card">
|
||||
<div class="card-header">
|
||||
<span class="status-badge" :class="akStatus">{{ statusText }}</span>
|
||||
<span
|
||||
class="status-badge"
|
||||
:class="akStatus"
|
||||
>{{ statusText }}</span>
|
||||
<span class="age">已创建 {{ akAge }} 天</span>
|
||||
</div>
|
||||
<div class="credentials">
|
||||
<div class="cred-row">
|
||||
<span class="label">Access Key:</span>
|
||||
<span class="value">{{ maskedAK }}</span>
|
||||
<button class="toggle-btn" @click="showAK = !showAK">{{ showAK ? '🙈' : '👁️' }}</button>
|
||||
<button
|
||||
class="toggle-btn"
|
||||
@click="showAK = !showAK"
|
||||
>
|
||||
{{ showAK ? '🙈' : '👁️' }}
|
||||
</button>
|
||||
</div>
|
||||
<div class="cred-row">
|
||||
<span class="label">Secret Key:</span>
|
||||
<span class="value">{{ maskedSK }}</span>
|
||||
<button class="toggle-btn" @click="showSK = !showSK">{{ showSK ? '🙈' : '👁️' }}</button>
|
||||
<button
|
||||
class="toggle-btn"
|
||||
@click="showSK = !showSK"
|
||||
>
|
||||
{{ showSK ? '🙈' : '👁️' }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="stats">
|
||||
<div class="stat"><span class="v">{{ apiCalls }}</span><span class="l">API调用</span></div>
|
||||
<div class="stat"><span class="v">{{ lastUsed }}</span><span class="l">最后使用</span></div>
|
||||
<div class="stat">
|
||||
<span class="v">{{ apiCalls }}</span><span class="l">API调用</span>
|
||||
</div>
|
||||
<div class="stat">
|
||||
<span class="v">{{ lastUsed }}</span><span class="l">最后使用</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="action-panel">
|
||||
<button class="btn primary" @click="rotateKey" :disabled="isRotating">🔄 轮换</button>
|
||||
<button class="btn warning" @click="deactivateKey" :disabled="akStatus === 'inactive'">⏸️ 禁用</button>
|
||||
<button class="btn danger" @click="deleteKey">🗑️ 删除</button>
|
||||
<button
|
||||
class="btn primary"
|
||||
:disabled="isRotating"
|
||||
@click="rotateKey"
|
||||
>
|
||||
🔄 轮换
|
||||
</button>
|
||||
<button
|
||||
class="btn warning"
|
||||
:disabled="akStatus === 'inactive'"
|
||||
@click="deactivateKey"
|
||||
>
|
||||
⏸️ 禁用
|
||||
</button>
|
||||
<button
|
||||
class="btn danger"
|
||||
@click="deleteKey"
|
||||
>
|
||||
🗑️ 删除
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="rotation-bar" v-if="isRotating">
|
||||
<div class="bar"><div class="fill" :style="{ width: rotationProgress + '%' }"></div></div>
|
||||
<div
|
||||
v-if="isRotating"
|
||||
class="rotation-bar"
|
||||
>
|
||||
<div class="bar">
|
||||
<div
|
||||
class="fill"
|
||||
:style="{ width: rotationProgress + '%' }"
|
||||
/>
|
||||
</div>
|
||||
<span class="text">{{ rotationStatus }}</span>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -17,12 +17,24 @@
|
||||
<div class="item-header">
|
||||
<span class="item-icon">{{ practice.icon }}</span>
|
||||
<span class="item-title">{{ practice.title }}</span>
|
||||
<span class="item-priority" :class="practice.priority">{{ practice.priorityText }}</span>
|
||||
<span
|
||||
class="item-priority"
|
||||
:class="practice.priority"
|
||||
>{{ practice.priorityText }}</span>
|
||||
</div>
|
||||
<div class="item-body" v-if="expandedCard === index">
|
||||
<p class="item-desc">{{ practice.description }}</p>
|
||||
<div
|
||||
v-if="expandedCard === index"
|
||||
class="item-body"
|
||||
>
|
||||
<p class="item-desc">
|
||||
{{ practice.description }}
|
||||
</p>
|
||||
<div class="item-checks">
|
||||
<span v-for="(item, i) in practice.checklist.slice(0, 3)" :key="i" class="check-tag">✓ {{ item }}</span>
|
||||
<span
|
||||
v-for="(item, i) in practice.checklist.slice(0, 3)"
|
||||
:key="i"
|
||||
class="check-tag"
|
||||
>✓ {{ item }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -8,26 +8,46 @@
|
||||
|
||||
<div class="flow-diagram">
|
||||
<div class="account-box source">
|
||||
<div class="account-header">账号 A(源)</div>
|
||||
<div class="entity">IAM User</div>
|
||||
<div class="action">sts:AssumeRole</div>
|
||||
<div class="account-header">
|
||||
账号 A(源)
|
||||
</div>
|
||||
<div class="entity">
|
||||
IAM User
|
||||
</div>
|
||||
<div class="action">
|
||||
sts:AssumeRole
|
||||
</div>
|
||||
</div>
|
||||
<span class="arrow">→</span>
|
||||
<div class="account-box sts">
|
||||
<div class="account-header">STS 服务</div>
|
||||
<div class="step">验证身份</div>
|
||||
<div class="step">生成临时凭证</div>
|
||||
<div class="account-header">
|
||||
STS 服务
|
||||
</div>
|
||||
<div class="step">
|
||||
验证身份
|
||||
</div>
|
||||
<div class="step">
|
||||
生成临时凭证
|
||||
</div>
|
||||
</div>
|
||||
<span class="arrow">→</span>
|
||||
<div class="account-box target">
|
||||
<div class="account-header">账号 B(目标)</div>
|
||||
<div class="entity">CrossAccountRole</div>
|
||||
<div class="resource">访问 S3/EC2</div>
|
||||
<div class="account-header">
|
||||
账号 B(目标)
|
||||
</div>
|
||||
<div class="entity">
|
||||
CrossAccountRole
|
||||
</div>
|
||||
<div class="resource">
|
||||
访问 S3/EC2
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="code-block">
|
||||
<div class="code-title">Python 示例</div>
|
||||
<div class="code-title">
|
||||
Python 示例
|
||||
</div>
|
||||
<pre><code>sts = boto3.client('sts')
|
||||
assumed = sts.assume_role(
|
||||
RoleArn='arn:aws:iam::123456789012:role/CrossAccountRole',
|
||||
|
||||
@@ -26,10 +26,16 @@
|
||||
<span class="detail-icon">{{ selectedLayerData.icon }}</span>
|
||||
<span class="detail-name">{{ selectedLayerData.name }}</span>
|
||||
</div>
|
||||
<div class="detail-desc">{{ selectedLayerData.description }}</div>
|
||||
<div class="detail-desc">
|
||||
{{ selectedLayerData.description }}
|
||||
</div>
|
||||
<div class="detail-examples">
|
||||
<span class="example-label">示例:</span>
|
||||
<span v-for="(example, i) in selectedLayerData.examples.slice(0, 2)" :key="i" class="example-tag">{{ example }}</span>
|
||||
<span
|
||||
v-for="(example, i) in selectedLayerData.examples.slice(0, 2)"
|
||||
:key="i"
|
||||
class="example-tag"
|
||||
>{{ example }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -8,7 +8,9 @@
|
||||
|
||||
<div class="main-area">
|
||||
<div class="platform-col aws">
|
||||
<div class="platform-header">AWS IAM</div>
|
||||
<div class="platform-header">
|
||||
AWS IAM
|
||||
</div>
|
||||
<div
|
||||
v-for="(feature, index) in features"
|
||||
:key="index"
|
||||
@@ -22,24 +24,41 @@
|
||||
</div>
|
||||
|
||||
<div class="comparison-col">
|
||||
<div class="comparison-card" v-if="selectedFeatureData">
|
||||
<div class="comp-title">{{ selectedFeatureData.name }}</div>
|
||||
<div
|
||||
v-if="selectedFeatureData"
|
||||
class="comparison-card"
|
||||
>
|
||||
<div class="comp-title">
|
||||
{{ selectedFeatureData.name }}
|
||||
</div>
|
||||
<div class="comp-row">
|
||||
<div class="comp-item aws">
|
||||
<div class="comp-label">AWS IAM</div>
|
||||
<div class="comp-desc">{{ selectedFeatureData.awsDetail }}</div>
|
||||
<div class="comp-label">
|
||||
AWS IAM
|
||||
</div>
|
||||
<div class="comp-desc">
|
||||
{{ selectedFeatureData.awsDetail }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="comp-vs">
|
||||
VS
|
||||
</div>
|
||||
<div class="comp-vs">VS</div>
|
||||
<div class="comp-item ram">
|
||||
<div class="comp-label">阿里云 RAM</div>
|
||||
<div class="comp-desc">{{ selectedFeatureData.ramDetail }}</div>
|
||||
<div class="comp-label">
|
||||
阿里云 RAM
|
||||
</div>
|
||||
<div class="comp-desc">
|
||||
{{ selectedFeatureData.ramDetail }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="platform-col ram">
|
||||
<div class="platform-header">阿里云 RAM</div>
|
||||
<div class="platform-header">
|
||||
阿里云 RAM
|
||||
</div>
|
||||
<div
|
||||
v-for="(feature, index) in features"
|
||||
:key="index"
|
||||
|
||||
@@ -20,9 +20,16 @@
|
||||
</div>
|
||||
|
||||
<div class="detail-panel">
|
||||
<div class="detail-title">{{ currentStepData.title }}</div>
|
||||
<p class="detail-desc">{{ currentStepData.detail }}</p>
|
||||
<div class="flow-row" v-if="currentStepData.flow">
|
||||
<div class="detail-title">
|
||||
{{ currentStepData.title }}
|
||||
</div>
|
||||
<p class="detail-desc">
|
||||
{{ currentStepData.detail }}
|
||||
</p>
|
||||
<div
|
||||
v-if="currentStepData.flow"
|
||||
class="flow-row"
|
||||
>
|
||||
<span class="entity user">{{ currentStepData.flow[0].from.name }}</span>
|
||||
<span class="action">{{ currentStepData.flow[0].action }}</span>
|
||||
<span class="entity cloud">{{ currentStepData.flow[0].to.name }}</span>
|
||||
|
||||
@@ -8,43 +8,94 @@
|
||||
|
||||
<div class="main-area">
|
||||
<div class="mfa-flow">
|
||||
<div class="auth-step" :class="{ active: step >= 1, completed: step > 1 }">
|
||||
<div
|
||||
class="auth-step"
|
||||
:class="{ active: step >= 1, completed: step > 1 }"
|
||||
>
|
||||
<span class="step-icon">🔐</span>
|
||||
<span class="step-label">密码</span>
|
||||
</div>
|
||||
<span class="step-arrow">→</span>
|
||||
<div class="auth-step" :class="{ active: step >= 2, completed: step > 2 }">
|
||||
<div
|
||||
class="auth-step"
|
||||
:class="{ active: step >= 2, completed: step > 2 }"
|
||||
>
|
||||
<span class="step-icon">📱</span>
|
||||
<span class="step-label">MFA</span>
|
||||
</div>
|
||||
<span class="step-arrow">→</span>
|
||||
<div class="auth-step" :class="{ active: step >= 3 }">
|
||||
<div
|
||||
class="auth-step"
|
||||
:class="{ active: step >= 3 }"
|
||||
>
|
||||
<span class="step-icon">✅</span>
|
||||
<span class="step-label">成功</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="auth-panel" v-if="step === 1">
|
||||
<div class="panel-title">请输入密码</div>
|
||||
<input type="password" v-model="password" placeholder="输入任意密码" @keyup.enter="verifyPassword" />
|
||||
<button @click="verifyPassword" :disabled="!password">验证密码</button>
|
||||
<div
|
||||
v-if="step === 1"
|
||||
class="auth-panel"
|
||||
>
|
||||
<div class="panel-title">
|
||||
请输入密码
|
||||
</div>
|
||||
<input
|
||||
v-model="password"
|
||||
type="password"
|
||||
placeholder="输入任意密码"
|
||||
@keyup.enter="verifyPassword"
|
||||
>
|
||||
<button
|
||||
:disabled="!password"
|
||||
@click="verifyPassword"
|
||||
>
|
||||
验证密码
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="auth-panel" v-if="step === 2">
|
||||
<div class="panel-title">MFA 验证码</div>
|
||||
<div
|
||||
v-if="step === 2"
|
||||
class="auth-panel"
|
||||
>
|
||||
<div class="panel-title">
|
||||
MFA 验证码
|
||||
</div>
|
||||
<div class="totp-display">
|
||||
<span class="totp-code">{{ totpCode }}</span>
|
||||
<div class="totp-hint">模拟验证码</div>
|
||||
<div class="totp-hint">
|
||||
模拟验证码
|
||||
</div>
|
||||
</div>
|
||||
<input type="text" v-model="userCode" placeholder="输入上方验证码" maxlength="6" @keyup.enter="verifyMFA" />
|
||||
<button @click="verifyMFA" :disabled="userCode.length !== 6">验证</button>
|
||||
<input
|
||||
v-model="userCode"
|
||||
type="text"
|
||||
placeholder="输入上方验证码"
|
||||
maxlength="6"
|
||||
@keyup.enter="verifyMFA"
|
||||
>
|
||||
<button
|
||||
:disabled="userCode.length !== 6"
|
||||
@click="verifyMFA"
|
||||
>
|
||||
验证
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="success-panel" v-if="step === 3">
|
||||
<div
|
||||
v-if="step === 3"
|
||||
class="success-panel"
|
||||
>
|
||||
<span class="success-icon">🎉</span>
|
||||
<div class="success-title">登录成功!</div>
|
||||
<div class="success-desc">已通过 MFA 双因素认证</div>
|
||||
<button @click="reset">重新演示</button>
|
||||
<div class="success-title">
|
||||
登录成功!
|
||||
</div>
|
||||
<div class="success-desc">
|
||||
已通过 MFA 双因素认证
|
||||
</div>
|
||||
<button @click="reset">
|
||||
重新演示
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -23,8 +23,13 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="detail-panel" v-if="selectedLevelData">
|
||||
<div class="detail-title">{{ selectedLevelData.name }}</div>
|
||||
<div
|
||||
v-if="selectedLevelData"
|
||||
class="detail-panel"
|
||||
>
|
||||
<div class="detail-title">
|
||||
{{ selectedLevelData.name }}
|
||||
</div>
|
||||
<div class="detail-row">
|
||||
<span class="label">范围:</span>
|
||||
<span class="value">{{ selectedLevelData.scope }}</span>
|
||||
@@ -34,7 +39,11 @@
|
||||
<span class="value">{{ selectedLevelData.scenario }}</span>
|
||||
</div>
|
||||
<div class="perms-list">
|
||||
<span v-for="(perm, i) in selectedLevelData.permissions.slice(0, 3)" :key="i" class="perm-tag">{{ perm.name }}</span>
|
||||
<span
|
||||
v-for="(perm, i) in selectedLevelData.permissions.slice(0, 3)"
|
||||
:key="i"
|
||||
class="perm-tag"
|
||||
>{{ perm.name }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -8,7 +8,9 @@
|
||||
|
||||
<div class="editor-layout">
|
||||
<div class="editor-panel">
|
||||
<div class="panel-title">策略编辑器</div>
|
||||
<div class="panel-title">
|
||||
策略编辑器
|
||||
</div>
|
||||
<div class="action-list">
|
||||
<div
|
||||
v-for="action in actions"
|
||||
@@ -17,8 +19,8 @@
|
||||
>
|
||||
<label class="checkbox">
|
||||
<input
|
||||
type="checkbox"
|
||||
v-model="selectedActions"
|
||||
v-model="selectedActions"
|
||||
type="checkbox"
|
||||
:value="action.id"
|
||||
>
|
||||
<span>{{ action.name }}</span>
|
||||
@@ -29,13 +31,17 @@
|
||||
</div>
|
||||
|
||||
<div class="preview-panel">
|
||||
<div class="panel-title">生成的策略</div>
|
||||
<div class="panel-title">
|
||||
生成的策略
|
||||
</div>
|
||||
<pre><code>{{ generatedPolicy }}</code></pre>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="effect-preview">
|
||||
<div class="effect-title">权限效果预览</div>
|
||||
<div class="effect-title">
|
||||
权限效果预览
|
||||
</div>
|
||||
<div class="effect-list">
|
||||
<div
|
||||
v-for="effect in effectList"
|
||||
|
||||
@@ -8,7 +8,10 @@
|
||||
|
||||
<div class="main-area">
|
||||
<div class="role-section">
|
||||
<div class="role-card" @click="showTrust = !showTrust">
|
||||
<div
|
||||
class="role-card"
|
||||
@click="showTrust = !showTrust"
|
||||
>
|
||||
<span class="role-icon">🎭</span>
|
||||
<div class="role-info">
|
||||
<span class="role-name">CrossAccountS3AccessRole</span>
|
||||
@@ -16,9 +19,18 @@
|
||||
</div>
|
||||
<span class="expand-icon">{{ showTrust ? '▼' : '▶' }}</span>
|
||||
</div>
|
||||
<div class="trust-policy" v-if="showTrust">
|
||||
<div class="trust-title">🔐 信任策略</div>
|
||||
<div class="trust-item" v-for="(t, i) in trustPolicy" :key="i">
|
||||
<div
|
||||
v-if="showTrust"
|
||||
class="trust-policy"
|
||||
>
|
||||
<div class="trust-title">
|
||||
🔐 信任策略
|
||||
</div>
|
||||
<div
|
||||
v-for="(t, i) in trustPolicy"
|
||||
:key="i"
|
||||
class="trust-item"
|
||||
>
|
||||
<span class="principal">{{ t.principal }}</span>
|
||||
<span class="action">{{ t.action }}</span>
|
||||
</div>
|
||||
@@ -37,9 +49,19 @@
|
||||
<span class="policy-icon">{{ policy.icon }}</span>
|
||||
<span class="policy-name">{{ policy.name }}</span>
|
||||
</div>
|
||||
<div class="policy-perms" v-if="selectedPolicy === index">
|
||||
<div class="perm" v-for="(p, i) in policy.permissions" :key="i">
|
||||
<span class="effect" :class="p.effect.toLowerCase()">{{ p.effect }}</span>
|
||||
<div
|
||||
v-if="selectedPolicy === index"
|
||||
class="policy-perms"
|
||||
>
|
||||
<div
|
||||
v-for="(p, i) in policy.permissions"
|
||||
:key="i"
|
||||
class="perm"
|
||||
>
|
||||
<span
|
||||
class="effect"
|
||||
:class="p.effect.toLowerCase()"
|
||||
>{{ p.effect }}</span>
|
||||
<span class="action">{{ p.action }}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user