feat: 版本号管理机制(VERSION文件+git哈希,部署/启动/UI/health均展示) + 平台账号管理(accounts表CRUD,资产所属账号候选联动,重命名同步引用)
This commit is contained in:
+32
-1
@@ -8,6 +8,7 @@ const store = reactive({
|
||||
view: 'dashboard',
|
||||
assets: [],
|
||||
providers: [],
|
||||
accounts: [],
|
||||
subdomains: [],
|
||||
siteCerts: [],
|
||||
overview: {},
|
||||
@@ -23,6 +24,7 @@ const store = reactive({
|
||||
error: '',
|
||||
assetModal: { show: false, editing: null, form: null },
|
||||
providerModal: { show: false, editing: null, form: null },
|
||||
accountModal: { show: false, editing: null, form: null },
|
||||
});
|
||||
|
||||
function applyDark() {
|
||||
@@ -78,13 +80,14 @@ async function loadAssets() {
|
||||
store.assets = await Api.get('/assets?' + params.toString());
|
||||
}
|
||||
async function loadProviders() { store.providers = await Api.get('/providers'); }
|
||||
async function loadAccounts() { store.accounts = await Api.get('/accounts'); }
|
||||
async function loadSubdomains() { store.subdomains = await Api.get('/subdomains'); }
|
||||
async function loadSiteCerts() { store.siteCerts = await Api.get('/site-certs'); }
|
||||
async function loadOverview() { store.overview = await Api.get('/stats/overview'); }
|
||||
async function loadExpiring() { store.expiring = await Api.get('/stats/expiring?days=30'); }
|
||||
async function loadAll() {
|
||||
store.loading = true; store.error = '';
|
||||
try { await Promise.all([loadAssets(), loadProviders(), loadSubdomains(), loadSiteCerts(), loadOverview(), loadExpiring()]); }
|
||||
try { await Promise.all([loadAssets(), loadProviders(), loadAccounts(), loadSubdomains(), loadSiteCerts(), loadOverview(), loadExpiring()]); }
|
||||
catch (e) { store.error = e.message; } finally { store.loading = false; }
|
||||
}
|
||||
|
||||
@@ -162,6 +165,34 @@ async function deleteProvider(p) {
|
||||
catch (e) { store.error = e.message; }
|
||||
}
|
||||
|
||||
/* ---------------- 账号操作 ---------------- */
|
||||
function openAccountCreate(platform) {
|
||||
store.accountModal = { show: true, editing: null, form: { name: '', platform: platform || '', remark: '' } };
|
||||
}
|
||||
function openAccountEdit(a) {
|
||||
store.accountModal = { show: true, editing: a.id, form: { name: a.name, platform: a.platform || '', remark: a.remark || '' } };
|
||||
}
|
||||
async function saveAccount() {
|
||||
store.error = '';
|
||||
const f = store.accountModal.form;
|
||||
const payload = { name: f.name, platform: f.platform || null, remark: f.remark || null };
|
||||
try {
|
||||
if (store.accountModal.editing) await Api.put('/accounts/' + store.accountModal.editing, payload);
|
||||
else await Api.post('/accounts', payload);
|
||||
store.accountModal.show = false;
|
||||
// 重命名会同步更新资产端引用,需一并刷新资产
|
||||
await Promise.all([loadAccounts(), loadAssets()]);
|
||||
} catch (e) { store.error = e.message; }
|
||||
}
|
||||
async function deleteAccount(a) {
|
||||
let msg = '确认删除账号「' + a.name + '」?';
|
||||
if (a.asset_count) msg += '\n有 ' + a.asset_count + ' 个资产引用该账号(资产中已填的账号名不受影响)。';
|
||||
if (!confirm(msg)) return;
|
||||
store.error = '';
|
||||
try { await Api.del('/accounts/' + a.id); await loadAccounts(); }
|
||||
catch (e) { store.error = e.message; }
|
||||
}
|
||||
|
||||
/* ---------------- 服务器监控 ---------------- */
|
||||
async function viewServer(a) {
|
||||
try {
|
||||
|
||||
Reference in New Issue
Block a user