新增车辆表及OTA权限与逻辑优化

新增车辆任务与报警表,完善实体与DbContext配置。细化OTA权限校验,增强回传会话IP安全。优化OTA上传与设置面板,调度器支持重启恢复。报警采集逻辑支持历史分段。
This commit is contained in:
2026-07-27 15:12:14 +08:00
parent bc3e9c5172
commit 1f72488a8d
20 changed files with 2392 additions and 53 deletions
@@ -13,6 +13,10 @@ const http: AxiosInstance = axios.create({
})
http.interceptors.request.use((config: InternalAxiosRequestConfig) => {
// FormData 必须由浏览器自动带 multipart boundary;清掉默认 application/json。
if (typeof FormData !== 'undefined' && config.data instanceof FormData) {
config.headers.delete('Content-Type')
}
// 双轨:优先用 localStorage 里的 token(过渡期 fallback),Cookie 会自动带;
// 后端首先看 Authorization: Bearer,没有再看 Cookie,两路任一通过即可。
const token = localStorage.getItem('simple.auth.token')
@@ -47,7 +47,6 @@ export async function uploadOtaPackage(file: File): Promise<OtaPackageInfo> {
const form = new FormData()
form.append('file', file)
const { data } = await http.post<OtaPackageInfo>('/ota/packages/upload', form, {
headers: { 'Content-Type': 'multipart/form-data' },
timeout: 300000
})
return data
@@ -116,7 +115,6 @@ export async function pushOtaCustomFile(opts: {
form.append('restartOps', JSON.stringify(opts.restartOps.length ? opts.restartOps : [-1]))
for (const f of opts.files) form.append('files', f)
const { data } = await http.post<OtaJob>('/ota/custom-file', form, {
headers: { 'Content-Type': 'multipart/form-data' },
timeout: 300000
})
return data
@@ -148,7 +148,7 @@ const auth = useAuthStore()
const canWrite = computed(() => {
if (auth.scope === 'Platform') return true
const ops = auth.effectivePermissions?.allowedOps ?? []
return ops.includes('*') || ops.some((o) => o === 'ops.ota' || o.startsWith('ops.ota.'))
return ops.includes('*') || ops.some((o) => o === 'ops.ota' || o === 'ops.ota.write' || o.startsWith('ops.ota.'))
})
// Tab 与 URL ?tab= 同步,支持深链接(旧 /config/vehicle、/config/fleet 已下线,统一进车辆运维)。
@@ -21,18 +21,10 @@
<el-form-item label="超限策略">
<el-radio-group v-model="form.overThreshold">
<el-radio value="skip">跳过该车</el-radio>
<el-radio value="confirm">仍允许需确认</el-radio>
<el-radio value="confirm">仍允许下发</el-radio>
</el-radio-group>
</el-form-item>
<h4>备份</h4>
<el-form-item label="周期 (分钟)">
<el-input-number v-model="form.backupPeriodMinutes" :min="0" :max="10080" />
</el-form-item>
<el-form-item label="备份可执行文件">
<el-switch v-model="form.backupExe" />
</el-form-item>
<h4>展示</h4>
<el-form-item label="目标版本名称">
<el-input v-model="form.newVersionName" placeholder="可选显示名" />