更新nuget&&添加swagger

This commit is contained in:
2026-08-09 14:47:08 +08:00 Unverified
parent 1229f3163d
commit 3c9863580b
16 changed files with 6967 additions and 38 deletions
+6
View File
@@ -1,12 +1,18 @@
{
"name": "web",
<<<<<<< Updated upstream
"version": "1.0.0",
=======
>>>>>>> Stashed changes
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "web",
<<<<<<< Updated upstream
"version": "1.0.0",
=======
>>>>>>> Stashed changes
"dependencies": {
"@capacitor/android": "^8.4.2",
"@capacitor/barcode-scanner": "^3.1.0",
-1
View File
@@ -1,7 +1,6 @@
{
"name": "web",
"private": true,
"version": "2.3.2-beta.1",
"type": "module",
"scripts": {
"dev": "vite",
+83 -1
View File
@@ -98,12 +98,18 @@ interface PageResult<T> {
pageSize: number
}
interface SwaggerDocumentationSettings {
isEnabled: boolean
}
const loading = ref(true)
const refreshing = ref(false)
const backupBusy = ref(false)
const summary = ref<Summary>()
const backups = ref<BackupArtifact[]>([])
const activeLedger = ref<'audit' | 'jobs'>('audit')
const swaggerEnabled = ref(false)
const swaggerBusy = ref(false)
const auditLoading = ref(false)
const auditRows = ref<AuditLog[]>([])
@@ -204,12 +210,36 @@ function httpStatusType(status: number) {
}
async function loadSummary() {
const [{ data: summaryData }, { data: backupData }] = await Promise.all([
const [{ data: summaryData }, { data: backupData }, { data: swaggerData }] = await Promise.all([
http.get<Summary>('/operations/summary'),
http.get<BackupArtifact[]>('/operations/backups'),
http.get<SwaggerDocumentationSettings>('/operations/swagger'),
])
summary.value = summaryData
backups.value = backupData
swaggerEnabled.value = swaggerData.isEnabled
}
async function updateSwaggerDocumentation(value: string | number | boolean) {
if (typeof value !== 'boolean') return
const isEnabled = value
swaggerBusy.value = true
try {
const { data } = await http.put<SwaggerDocumentationSettings>(
'/operations/swagger',
{ isEnabled },
)
swaggerEnabled.value = data.isEnabled
ElMessage.success(data.isEnabled ? 'Swagger 文档已开放。' : 'Swagger 文档已关闭。')
} catch (error) {
ElMessage.error(apiErrorMessage(error))
} finally {
swaggerBusy.value = false
}
}
function openSwaggerDocumentation() {
window.open('/swagger', '_blank', 'noopener')
}
async function loadAudit() {
@@ -371,6 +401,35 @@ onMounted(refreshAll)
</el-button>
</header>
<section class="swagger-panel">
<div>
<span>API DOCUMENTATION</span>
<h3>Swagger 文档</h3>
<p>
{{ swaggerEnabled
? '文档与 OpenAPI 定义当前已对外开放。'
: '文档当前关闭,访问 /swagger 将返回 404。' }}
</p>
</div>
<div class="swagger-actions">
<el-switch
:model-value="swaggerEnabled"
:loading="swaggerBusy"
active-text="已开放"
inactive-text="已关闭"
@change="updateSwaggerDocumentation"
/>
<el-button
v-if="swaggerEnabled"
type="primary"
plain
@click="openSwaggerDocumentation"
>
打开文档
</el-button>
</div>
</section>
<section class="signal-board" aria-label="系统健康链路">
<div class="signal-summary">
<span>当前值守结论</span>
@@ -670,6 +729,28 @@ onMounted(refreshAll)
padding: 4px 2px 16px;
}
.swagger-panel {
align-items: center;
background: #fff;
border: 1px solid var(--line);
border-left: 4px solid var(--signal);
display: flex;
justify-content: space-between;
gap: 18px;
padding: 18px 20px;
}
.swagger-panel span {
color: var(--signal);
font-size: 11px;
font-weight: 700;
letter-spacing: .08em;
}
.swagger-panel h3 { margin: 4px 0; }
.swagger-panel p { color: var(--muted); margin: 0; }
.swagger-actions { align-items: center; display: flex; flex-wrap: wrap; gap: 12px; }
.console-kicker,
.panel-heading span,
.signal-summary > span,
@@ -1011,6 +1092,7 @@ onMounted(refreshAll)
@media (max-width: 560px) {
.operations-console { gap: 12px; }
.console-heading { align-items: flex-start; gap: 14px; }
.swagger-panel { align-items: flex-start; flex-direction: column; }
.console-heading p { font-size: 12px; line-height: 1.5; }
.signal-track { display: block; }
.signal-node { border-bottom: 1px solid #e4e9ea; padding: 13px 12px; }
+7 -4
View File
@@ -5,9 +5,12 @@ import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
const packageJson = JSON.parse(
readFileSync(new URL('./package.json', import.meta.url), 'utf8'),
) as { version: string }
const versions = readFileSync(new URL('../versions.props', import.meta.url), 'utf8')
const frontendVersion = /<JiaowuFrontendVersion>([^<]+)<\/JiaowuFrontendVersion>/.exec(versions)?.[1]
if (!frontendVersion) {
throw new Error('versions.props 中缺少 JiaowuFrontendVersion。')
}
// https://vite.dev/config/
export default defineConfig(({ mode }) => {
@@ -16,7 +19,7 @@ export default defineConfig(({ mode }) => {
return {
define: {
__APP_VERSION__: JSON.stringify(packageJson.version),
__APP_VERSION__: JSON.stringify(frontendVersion),
},
plugins: [
vue(),