diff --git a/backend/app/dto/response/app.go b/backend/app/dto/response/app.go
index 3b4d35212..afbad742a 100644
--- a/backend/app/dto/response/app.go
+++ b/backend/app/dto/response/app.go
@@ -1,7 +1,6 @@
package response
import (
- "github.com/1Panel-dev/1Panel/backend/app/dto"
"github.com/1Panel-dev/1Panel/backend/app/dto/request"
"time"
@@ -14,9 +13,8 @@ type AppRes struct {
}
type AppUpdateRes struct {
- CanUpdate bool `json:"canUpdate"`
- AppStoreLastModified int `json:"appStoreLastModified"`
- List dto.AppList `json:"list"`
+ CanUpdate bool `json:"canUpdate"`
+ AppStoreLastModified int `json:"appStoreLastModified"`
}
type AppDTO struct {
diff --git a/backend/app/service/app.go b/backend/app/service/app.go
index f47df4886..05feb5001 100644
--- a/backend/app/service/app.go
+++ b/backend/app/service/app.go
@@ -356,39 +356,6 @@ func (a AppService) Install(ctx context.Context, req request.AppInstallCreate) (
return
}
-func (a AppService) GetAppUpdate() (*response.AppUpdateRes, error) {
- res := &response.AppUpdateRes{
- CanUpdate: false,
- }
- setting, err := NewISettingService().GetSettingInfo()
- if err != nil {
- return nil, err
- }
- versionUrl := fmt.Sprintf("%s/%s/1panel.json", global.CONF.System.AppRepo, global.CONF.System.Mode)
- versionRes, err := http.Get(versionUrl)
- if err != nil {
- return nil, err
- }
- defer versionRes.Body.Close()
- body, err := io.ReadAll(versionRes.Body)
- if err != nil {
- return nil, err
- }
- list := &dto.AppList{}
- if err = json.Unmarshal(body, list); err != nil {
- return nil, err
- }
- res.AppStoreLastModified = list.LastModified
- res.List = *list
-
- appStoreLastModified, _ := strconv.Atoi(setting.AppStoreLastModified)
- if setting.AppStoreLastModified == "" || list.LastModified > appStoreLastModified {
- res.CanUpdate = true
- return res, err
- }
- return res, nil
-}
-
func (a AppService) SyncAppListFromLocal() {
fileOp := files.NewFileOp()
localAppDir := constant.LocalAppResourceDir
@@ -659,6 +626,56 @@ func (a AppService) SyncAppListFromLocal() {
tx.Commit()
global.LOG.Infof("sync local apps success")
}
+
+func (a AppService) GetAppUpdate() (*response.AppUpdateRes, error) {
+ res := &response.AppUpdateRes{
+ CanUpdate: false,
+ }
+ setting, err := NewISettingService().GetSettingInfo()
+ if err != nil {
+ return nil, err
+ }
+ versionUrl := fmt.Sprintf("%s/%s/1panel.json.version.txt", global.CONF.System.AppRepo, global.CONF.System.Mode)
+ versionRes, err := http.Get(versionUrl)
+ if err != nil {
+ return nil, err
+ }
+ defer versionRes.Body.Close()
+ body, err := io.ReadAll(versionRes.Body)
+ if err != nil {
+ return nil, err
+ }
+ lastModifiedStr := string(body)
+
+ lastModified, err := strconv.Atoi(lastModifiedStr)
+ if err != nil {
+ return nil, err
+ }
+ appStoreLastModified, _ := strconv.Atoi(setting.AppStoreLastModified)
+ if setting.AppStoreLastModified == "" || lastModified != appStoreLastModified {
+ res.CanUpdate = true
+ return res, err
+ }
+ return res, nil
+}
+
+func getAppFromRepo(downloadPath string) error {
+ downloadUrl := downloadPath
+ global.LOG.Infof("download file from %s", downloadUrl)
+ fileOp := files.NewFileOp()
+ packagePath := path.Join(constant.ResourceDir, path.Base(downloadUrl))
+ if err := fileOp.DownloadFile(downloadUrl, packagePath); err != nil {
+ return err
+ }
+ if err := fileOp.Decompress(packagePath, constant.ResourceDir, files.Zip); err != nil {
+ return err
+ }
+ defer func() {
+ _ = fileOp.DeleteFile(packagePath)
+ }()
+ return nil
+}
+
func (a AppService) SyncAppListFromRemote() error {
updateRes, err := a.GetAppUpdate()
if err != nil {
@@ -667,10 +684,22 @@ func (a AppService) SyncAppListFromRemote() error {
if !updateRes.CanUpdate {
return nil
}
+ if err = getAppFromRepo(fmt.Sprintf("%s/%s/1panel.json.zip", global.CONF.System.AppRepo, global.CONF.System.Mode)); err != nil {
+ return err
+ }
+ listFile := path.Join(constant.ResourceDir, "1panel.json")
+ content, err := os.ReadFile(listFile)
+ if err != nil {
+ return err
+ }
+ list := &dto.AppList{}
+ if err := json.Unmarshal(content, list); err != nil {
+ return err
+ }
+
var (
tags []*model.Tag
appTags []*model.AppTag
- list = updateRes.List
oldAppIds []uint
)
for _, t := range list.Extra.Tags {
diff --git a/frontend/src/lang/modules/en.ts b/frontend/src/lang/modules/en.ts
index 804dda0e1..d699c7f73 100644
--- a/frontend/src/lang/modules/en.ts
+++ b/frontend/src/lang/modules/en.ts
@@ -1155,6 +1155,8 @@ const message = {
editComposeHelper: 'Editing the compose file may cause the software installation to fail',
composeNullErr: 'compose cannot be empty',
takeDown: 'TakeDown',
+ allReadyInstalled: 'Installed',
+ installHelper: 'Configuring image acceleration can solve the problem of image pull failure',
},
website: {
website: 'Website',
diff --git a/frontend/src/lang/modules/zh.ts b/frontend/src/lang/modules/zh.ts
index be223e66b..3e9143923 100644
--- a/frontend/src/lang/modules/zh.ts
+++ b/frontend/src/lang/modules/zh.ts
@@ -1140,12 +1140,13 @@ const message = {
allowPortHelper: '允许外部端口访问会放开防火墙端口,php运行环境请勿放开',
appInstallWarn: '应用默认不放开外部访问端口,可以在高级设置中选择放开',
upgradeStart: '开始升级!请稍后刷新页面',
- toFolder: '打开安装目录',
+ toFolder: '进入安装目录',
editCompose: '编辑 compose 文件',
editComposeHelper: '编辑 compose 文件可能导致软件安装失败',
composeNullErr: 'compose 不能为空',
takeDown: '已废弃',
allReadyInstalled: '已安装',
+ installHelper: '配置镜像加速可以解决镜像拉取失败的问题',
},
website: {
website: '网站',
diff --git a/frontend/src/views/app-store/installed/index.vue b/frontend/src/views/app-store/installed/index.vue
index 596a84013..727965911 100644
--- a/frontend/src/views/app-store/installed/index.vue
+++ b/frontend/src/views/app-store/installed/index.vue
@@ -55,6 +55,21 @@
+
+
+
+ {{ $t('app.installHelper') }}
+
+ {{ $t('firewall.quickJump') }}
+
+
+
+
{
return row.status.includes('Err') || row.status.includes('Error');
};
+const quickJump = () => {
+ router.push({ name: 'ContainerSetting' });
+};
+
onMounted(() => {
const path = router.currentRoute.value.path;
if (path == '/apps/upgrade') {