mirror of
https://github.com/1Panel-dev/1Panel.git
synced 2025-03-14 01:34:47 +08:00
130 lines
3.3 KiB
Vue
130 lines
3.3 KiB
Vue
<template>
|
|
<div>
|
|
<el-scrollbar height="525px" class="moz-height">
|
|
<div class="h-app-card" v-for="(app, index) in apps" :key="index">
|
|
<el-row :gutter="10">
|
|
<el-col :span="5">
|
|
<div>
|
|
<el-avatar shape="square" :size="55" :src="'data:image/png;base64,' + app.icon" />
|
|
</div>
|
|
</el-col>
|
|
<el-col :span="15">
|
|
<div class="h-app-content">
|
|
<div>
|
|
<span class="h-app-title">{{ app.name }}</span>
|
|
</div>
|
|
<div class="h-app-desc">
|
|
<span>
|
|
{{ language == 'zh' || language == 'tw' ? app.shortDescZh : app.shortDescEn }}
|
|
</span>
|
|
</div>
|
|
</div>
|
|
</el-col>
|
|
<el-col :span="2">
|
|
<el-button
|
|
class="h-app-button"
|
|
type="primary"
|
|
plain
|
|
round
|
|
size="small"
|
|
@click="goInstall(app.key)"
|
|
>
|
|
{{ $t('app.install') }}
|
|
</el-button>
|
|
</el-col>
|
|
</el-row>
|
|
<div class="h-app-divider" />
|
|
</div>
|
|
</el-scrollbar>
|
|
</div>
|
|
</template>
|
|
|
|
<script lang="ts" setup>
|
|
import { App } from '@/api/interface/app';
|
|
import { SearchApp } from '@/api/modules/app';
|
|
import { reactive, ref } from 'vue';
|
|
import { useI18n } from 'vue-i18n';
|
|
import { useRouter } from 'vue-router';
|
|
const router = useRouter();
|
|
const language = useI18n().locale.value;
|
|
|
|
let req = reactive({
|
|
name: '',
|
|
tags: [],
|
|
page: 1,
|
|
pageSize: 50,
|
|
recommend: true,
|
|
});
|
|
|
|
let loading = ref(false);
|
|
let apps = ref<App.App[]>([]);
|
|
|
|
const acceptParams = (): void => {
|
|
search(req);
|
|
};
|
|
|
|
const goInstall = (key: string) => {
|
|
router.push({ name: 'AppAll', query: { install: key } });
|
|
};
|
|
|
|
const search = async (req: App.AppReq) => {
|
|
loading.value = true;
|
|
await SearchApp(req)
|
|
.then((res) => {
|
|
apps.value = res.data.items;
|
|
})
|
|
.finally(() => {
|
|
loading.value = false;
|
|
});
|
|
};
|
|
|
|
defineExpose({
|
|
acceptParams,
|
|
});
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
.h-app-card {
|
|
cursor: pointer;
|
|
padding: 10px 15px;
|
|
margin-right: 10px;
|
|
line-height: 18px;
|
|
|
|
.h-app-content {
|
|
padding-left: 15px;
|
|
.h-app-title {
|
|
font-weight: 500;
|
|
font-size: 15px;
|
|
color: #1f2329;
|
|
}
|
|
|
|
.h-app-desc {
|
|
span {
|
|
font-weight: 400;
|
|
font-size: 12px;
|
|
color: var(--el-text-color-regular);
|
|
}
|
|
}
|
|
}
|
|
.h-app-button {
|
|
margin-top: 10px;
|
|
}
|
|
&:hover {
|
|
background-color: rgba(0, 94, 235, 0.03);
|
|
}
|
|
}
|
|
|
|
.h-app-divider {
|
|
margin-top: 13px;
|
|
border: 0;
|
|
border-top: var(--panel-border);
|
|
}
|
|
|
|
/* FOR MOZILLA */
|
|
@-moz-document url-prefix() {
|
|
.moz-height {
|
|
height: 524px;
|
|
}
|
|
}
|
|
</style>
|