diff --git a/MongoDB/create_collections.js b/MongoDB/create_collections.js index 3d60b54..2640ae1 100644 --- a/MongoDB/create_collections.js +++ b/MongoDB/create_collections.js @@ -88,4 +88,14 @@ if (!db.getCollectionNames().includes("site_users")) { } db.site_users.createIndex({ username: 1 }, { unique: true, name: "idx_username", background: true }); +// 12. yuheng_cloud_register_records(宇恒云 POST /register 本地留痕:username、password) +if (!db.getCollectionNames().includes("yuheng_cloud_register_records")) { + db.createCollection("yuheng_cloud_register_records"); + print("已创建集合: yuheng_cloud_register_records"); +} +db.yuheng_cloud_register_records.createIndex( + { created_at: -1 }, + { name: "idx_created_at", background: true } +); + print("集合与索引处理完成。"); diff --git a/admin/src/api/admin.js b/admin/src/api/admin.js index cdbabf2..f4f3995 100644 --- a/admin/src/api/admin.js +++ b/admin/src/api/admin.js @@ -28,6 +28,11 @@ export const createUser = (data) => request.post('/admin/users', data) export const updateUser = (id, data) => request.put(`/admin/users/${id}`, data) export const deleteUser = (id) => request.delete(`/admin/users/${id}`) +// 宇恒云账号(POST 云端 /register + 本地 Mongo 仅记 username/password) +export const createYuhengCloudAccount = (data) => + request.post('/admin/yuheng-cloud-accounts', data, { timeout: 60000 }) +export const listYuhengCloudAccounts = (params) => request.get('/admin/yuheng-cloud-accounts', { params }) + // 工作空间 export const getWorkspaces = (params) => request.get('/admin/workspaces', { params }) @@ -46,6 +51,10 @@ export const updatePaymentConfig = (data) => request.put('/admin/payment-config' export const getOfficialSite = () => request.get('/admin/system/official-site') export const setOfficialSite = (siteId) => request.put('/admin/system/official-site', { site_id: siteId }) +/** 分片上传临时目录清理:保留时长、扫描间隔(需 site:manage) */ +export const getChunkUploadCleanup = () => request.get('/admin/system/chunk-upload-cleanup') +export const updateChunkUploadCleanup = (data) => request.put('/admin/system/chunk-upload-cleanup', data) + // 站点管理 export const getSites = () => request.get('/admin/sites') export const getSiteById = (id) => request.get(`/admin/sites/${id}`) @@ -79,8 +88,33 @@ export const uploadSiteAsset = (siteId, file, opts = {}) => { if (opts.folder != null) form.append('folder', opts.folder) form.append('downloadable', opts.downloadable ? 'true' : 'false') if (opts.preserveFilename) form.append('preserve_filename', 'true') - return request.post(`/admin/sites/${siteId}/assets`, form, { headers: { 'Content-Type': 'multipart/form-data' } }) + // 大文件上传:timeout 0 = Axios 不设置请求超时(仍可能受浏览器/系统/代理断开影响) + // 超大文件请用分片 API(见 uploadSiteAssetWithResume) + return request.post(`/admin/sites/${siteId}/assets`, form, { + headers: { 'Content-Type': 'multipart/form-data' }, + timeout: 0 + }) } + +/** 分片上传:创建会话(断点续传) */ +export const initMultipartUpload = (siteId, body) => + request.post(`/admin/sites/${siteId}/assets/init-multipart`, body, { timeout: 60000 }) + +export const getMultipartUploadStatus = (siteId, uploadId) => + request.get(`/admin/sites/${siteId}/assets/multipart/${uploadId}/status`, { timeout: 60000 }) + +export const putMultipartChunk = (siteId, uploadId, chunkIndex, blob) => + request.put(`/admin/sites/${siteId}/assets/multipart/${uploadId}/chunk/${chunkIndex}`, blob, { + headers: { 'Content-Type': 'application/octet-stream' }, + timeout: 180000 + }) + +export const completeMultipartUpload = (siteId, uploadId) => + request.post(`/admin/sites/${siteId}/assets/multipart/${uploadId}/complete`, {}, { timeout: 600000 }) + +export const abortMultipartUpload = (siteId, uploadId) => + request.delete(`/admin/sites/${siteId}/assets/multipart/${uploadId}`, { timeout: 60000 }) + export const createSiteFolder = (siteId, path) => request.post(`/admin/sites/${siteId}/folders`, { path }) export const deleteSiteAsset = (siteId, id) => request.delete(`/admin/sites/${siteId}/assets/${id}`) diff --git a/admin/src/layouts/AdminLayout.vue b/admin/src/layouts/AdminLayout.vue index 32f1830..a840e65 100644 --- a/admin/src/layouts/AdminLayout.vue +++ b/admin/src/layouts/AdminLayout.vue @@ -43,7 +43,7 @@ + + diff --git a/admin/src/views/settings/YuhengCloudAccountManage.vue b/admin/src/views/settings/YuhengCloudAccountManage.vue new file mode 100644 index 0000000..4c9377a --- /dev/null +++ b/admin/src/views/settings/YuhengCloudAccountManage.vue @@ -0,0 +1,154 @@ + + + + + 宇恒云账号管理 + + + 调用云端 + POST /register(默认 + http://www.cloud.yuxindazhineng.com:3001/register,可通过环境变量 + YH_CLOUD_REGISTER_URL 覆盖)。成功后在 Mongo 集合 + yuheng_cloud_register_records 写入一条记录,仅保存账号与密码;邮箱仅用于提交云端。 + + + + + + + + + + + + + + 提交注册 + + + + + + + + + + + {{ row._showPwd ? row.password : '••••••••' }} + + {{ row._showPwd ? '隐藏' : '显示' }} + + + + + + + + + + + + + diff --git a/admin/src/views/sites/ModuleUpload.vue b/admin/src/views/sites/ModuleUpload.vue index 953576a..fd29814 100644 --- a/admin/src/views/sites/ModuleUpload.vue +++ b/admin/src/views/sites/ModuleUpload.vue @@ -43,7 +43,8 @@
+ 调用云端 + POST /register(默认 + http://www.cloud.yuxindazhineng.com:3001/register,可通过环境变量 + YH_CLOUD_REGISTER_URL 覆盖)。成功后在 Mongo 集合 + yuheng_cloud_register_records 写入一条记录,仅保存账号与密码;邮箱仅用于提交云端。 +
POST /register
http://www.cloud.yuxindazhineng.com:3001/register
YH_CLOUD_REGISTER_URL
yuheng_cloud_register_records