修复安装市场应用时各种错误
This commit is contained in:
parent
70e2158dd6
commit
776679c000
@ -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);
|
|
||||||
|
|
||||||
// 如果返回结果为null且未达到最大重试次数,等待500ms后重试
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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)
|
|
||||||
}
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user