修复安装市场应用时各种错误

This commit is contained in:
jingrow 2025-04-23 01:39:54 +08:00
parent 70e2158dd6
commit 776679c000
2 changed files with 216 additions and 295 deletions

View File

@ -35,89 +35,64 @@ export default {
data() { data() {
return { return {
show: true, show: true,
currentApp: null, installPending: false
retryCount: 0
}; };
}, },
resources: {
// API
checkAppInstallable() {
return {
url: 'jcloud.api.site.check_app_installable',
params: {
name: this.site,
app: this.currentApp
},
auto: false
};
}
},
computed: { computed: {
$site() { $site() {
return getCachedDocumentResource('Site', this.site); return getCachedDocumentResource('Site', this.site);
}, },
listOptions() { listOptions() {
const handleInstall = async row => { const handleInstall = async row => {
if (this.$site.installApp.loading) return; //
if (this.$site.installApp.loading || this.installPending) return;
// 便使 // app
this.currentApp = row.app; if (!row || !row.app) {
this.retryCount = 0 toast.error('无效的应用信息');
return;
}
// //
console.log('=== 安装应用调试信息 ==='); this.installPending = true;
console.log('站点名称:', this.site);
console.log('应用ID:', this.currentApp);
console.log('站点对象:', this.$site);
console.log('站点plan:', this.$site.pg?.plan);
console.log('=== 调试信息结束 ===');
try { try {
// 2 //
let checkResult = null; const checkResource = createResource({
let apiCalled = false; url: 'jcloud.api.site.check_app_installable',
params: {
name: this.site,
app: row.app
},
auto: true
});
while (!checkResult && this.retryCount < 3) { //
console.log(`正在调用check_app_installable API... (尝试 ${this.retryCount + 1}/3)`); await new Promise(resolve => {
apiCalled = true; const unwatch = this.$watch(
() => !checkResource.loading,
isNotLoading => {
if (isNotLoading) {
unwatch();
resolve();
}
},
{ immediate: true }
);
});
await this.$resources.checkAppInstallable.submit(); //
const checkResult = checkResource.data;
console.log('API调用完成状态:', { // API
loading: this.$resources.checkAppInstallable.loading,
error: this.$resources.checkAppInstallable.error
});
//
checkResult = this.$resources.checkAppInstallable.data;
console.log('API返回结果:', checkResult);
// null500ms
if (!checkResult && this.retryCount < 2) {
this.retryCount++;
console.log(`API返回null将在500ms后重试(${this.retryCount}/2)...`);
await new Promise(resolve => setTimeout(resolve, 500));
} else {
break;
}
}
//
if (!checkResult) { if (!checkResult) {
console.error('API返回结果无效已达到最大重试次数');
toast.error('应用安装权限验证失败,安装已取消'); toast.error('应用安装权限验证失败,安装已取消');
this.installPending = false;
return; return;
} }
// //
console.log('应用可安装?', checkResult.installable); if (!checkResult.installable) {
console.log('required_plan_level:', checkResult.required_plan_level);
console.log('current_plan_level:', checkResult.current_plan_level);
// 退
if (checkResult.installable !== true) {
console.log('应用不可安装,显示错误信息');
const subscriptionTypeMap = { const subscriptionTypeMap = {
2: 'Pro', 2: 'Pro',
3: 'Business', 3: 'Business',
@ -129,50 +104,36 @@ export default {
`Level ${checkResult.required_plan_level}`; `Level ${checkResult.required_plan_level}`;
toast.error(`无法安装此应用,需要${requiredPlan}或更高级别的站点计划。请先升级您的站点计划。`); toast.error(`无法安装此应用,需要${requiredPlan}或更高级别的站点计划。请先升级您的站点计划。`);
this.installPending = false;
return; return;
} }
// //
console.log('应用可安装,开始安装流程');
await toast.promise( await toast.promise(
this.$site.installApp.submit({ this.$site.installApp.submit({ app: row.app })
app: row.app .then(jobId => {
}),
{
loading: '正在创建安装任务...',
success: jobId => {
console.log('安装任务创建成功jobId:', jobId);
this.$emit('installed'); this.$emit('installed');
this.show = false; this.show = false;
return jobId;
try { }),
if (jobId) { {
router.push({ loading: '正在创建安装任务...',
name: 'Site Job', success: () => '应用安装任务已创建',
params: {
name: this.site,
id: String(jobId)
}
}).catch(err => {
console.error('导航到作业页面失败:', err);
});
}
} catch (err) {
console.error('处理作业ID时出错:', err);
}
return '应用安装任务已创建';
},
error: e => { error: e => {
console.error('安装过程中出错:', e); //
return getToastErrorMessage(e); const errorMessage = e?.message || e?.messages?.[0] || e?.exc_info?.exception || '安装任务创建失败';
//
return typeof errorMessage === 'string' ? errorMessage : '安装任务创建失败,请稍后重试';
} }
} }
); );
} catch (error) { } catch (error) {
console.error('检查应用安装权限失败:', error);
toast.error('无法验证安装权限,安装已取消'); toast.error('无法验证安装权限,安装已取消');
} finally {
//
this.installPending = false;
} }
}; };
@ -211,12 +172,10 @@ export default {
align: 'right', align: 'right',
type: 'Button', type: 'Button',
width: '5rem', width: '5rem',
Button({ row }) { Button: function({ row }) {
return { return {
label: '安装', label: '安装',
onClick: () => { onClick: () => handleInstall(row)
handleInstall(row);
}
}; };
} }
} }

View File

@ -2428,62 +2428,24 @@ def check_app_installable(name, app):
"current_plan_level": 1-5, # 当前站点计划等级 "current_plan_level": 1-5, # 当前站点计划等级
} }
""" """
try: site = jingrow.get_pg("Site", name)
print(f"check_app_installable被调用: name={name}, app={app}")
site = jingrow.get_pg("Site", name) # 获取应用的subscription_level
print(f"获取到站点: {site.name}, plan={site.plan}") app_subscription_level = jingrow.db.get_value(
"Marketplace App", app, "subscription_level") or "1"
app_subscription_level = int(app_subscription_level)
# 获取应用的subscription_level # 获取站点的plan_level
app_subscription_level = jingrow.db.get_value( site_plan_level = 1
"Marketplace App", app, "subscription_level") if site.plan:
print(f"应用{app}的subscription_level={app_subscription_level}") site_plan_level = jingrow.db.get_value(
"Site Plan", site.plan, "plan_level") or "1"
site_plan_level = int(site_plan_level)
# 确保subscription_level是有效值 installable = site_plan_level >= app_subscription_level
if app_subscription_level is None or app_subscription_level == "":
app_subscription_level = 1
print(f"应用{app}的subscription_level为空使用默认值1")
else:
try:
app_subscription_level = int(app_subscription_level)
print(f"应用{app}的subscription_level转换为整数: {app_subscription_level}")
except (ValueError, TypeError) as e:
print(f"转换subscription_level出错: {e}, 使用默认值1")
app_subscription_level = 1
# 获取站点的plan_level return {
site_plan_level = 1 "installable": installable,
if site.plan: "required_plan_level": app_subscription_level,
plan_level = jingrow.db.get_value( "current_plan_level": site_plan_level
"Site Plan", site.plan, "plan_level") }
print(f"站点plan={site.plan}, plan_level={plan_level}")
if plan_level is not None and plan_level != "":
try:
site_plan_level = int(plan_level)
print(f"站点plan_level转换为整数: {site_plan_level}")
except (ValueError, TypeError) as e:
print(f"转换plan_level出错: {e}, 使用默认值1")
else:
print(f"站点没有plan信息使用默认plan_level=1")
installable = site_plan_level >= app_subscription_level
print(f"安装条件判断: {site_plan_level} >= {app_subscription_level} = {installable}")
result = {
"installable": installable,
"required_plan_level": app_subscription_level,
"current_plan_level": site_plan_level
}
print(f"返回结果: {result}")
return result
except Exception as e:
print(f"check_app_installable出现异常: {e}")
# 发生异常时返回默认值,确保前端收到有效响应
return {
"installable": False,
"required_plan_level": 1,
"current_plan_level": 1,
"error": str(e)
}