Files
Agent-n8n/doc/notion文档资料/智能开发/附件项目/index.html

341 lines
11 KiB
HTML
Raw Normal View History

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="./assets/font-awesome/css/all.min.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>GemDesign</title>
<script src="./assets/javascript/vue.global.js"></script>
<style>
* {
margin: 0;
padding: 0;
font-size: 14px;
}
body {
height: 100vh;
margin: 0; /* 去掉默认的边距 */
padding: 0; /* 去掉默认的内边距 */
display: flex; /* 使用 flexbox 布局 */
flex-direction: column; /* 垂直排列内容 */
min-height: 100vh; /* 确保 body 至少占满视口高度 */
font-size: 14px;
}
body #app{
height: 100%;
}
.iframePC {
width: 100%; /* 设置 iframe 宽度为 100% */
border: none; /* 去掉边框 */
height: 100%;
}
.ai-tag {
width: 208px;
height: 40px;
padding-right: 12px;
border-radius: 6px;
background: #171313;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
position: fixed;
right: 20px;
bottom: 28px;
z-index: 9999;
}
.ai-tag .custom-text-prefix {
font-weight: 400;
font-size: 12px;
line-height: 24px;
font-family: Source Han Sans CN, Source Han Sans CN;
text-align: left;
font-style: normal;
color: #ADB5C1;
text-transform: none;
line-height: 38px;
}
.ai-tag .custom-text-sufix {
font-weight: 700;
font-size: 12px;
line-height: 24px;
font-family: Source Han Sans CN, Source Han Sans CN;
text-align: left;
font-style: normal;
color: #FFFFFF;
text-transform: none;
line-height: 38px;
}
.ai-tag img.img-logo {
width: 22px;
margin: 0 6px;
}
.ai-tag img.ai-tag-close {
width: 8px;
position: absolute;
top: 6px;
right: 6px;
object-fit: none;
}
</style>
<style>
/* app样式 */
.preview-suitable-app{
height: 100%;
width: 100%;
display: flex;
align-items: center;
justify-content: center;
}
.preview-suitable-content-app{
height: calc(100% - 12px);
display: flex;
align-items: center;
justify-content: center;
}
.app-border{
position: relative;
border-radius: 30px 30px 30px 30px;
border: 4px solid rgb(51, 51, 51);
overflow:hidden;
}
.preview-suitable-app iframe{
height: 100%;
width: 100%;
border: none; /* 去掉边框 */
}
.preview-web{
width: 100%;
height: 100%;
display: flex;
justify-content:center;
align-items: center;
overflow: hidden;
}
.preview-web iframe{
flex-shrink: 0
}
</style>
<style>
/* 页面顶部样式 */
.w-70px{
width: 70px;
}
.w-140px{
width: 140px;
}
.w-260px{
width: 260px;
}
.h-28px{
height: 28px;
}
.h-48px{
height: 48px;
}
.h-40px{
height: 40px;
}
.h-32px{
height: 32px;
}
.page-top{
color: #333333;
}
.appName{
font-size: 16px;
margin-right: 30px;
}
.previewList{
width: 140px;
overflow: hidden !important;
text-overflow: ellipsis;
white-space: nowrap;
}
.previewList .first-option {
position: relative;
}
.previewList .first-option:after {
content: '';
width: 100%;
height: 1px;
position: absolute;
bottom: -3px;
left: 0;
background-color: #dbdbdb;
}
.previewList .option-item:hover {
background-color: #3C8EFF;
}
.previewList .option-item.selected {
background-color: #3C8EFF;
}
/* 全局下拉框样式重置 */
select.previewList {
padding: 5px 11px;
}
select.previewList option {
margin-bottom: 5px;
}
/* 禁用焦点样式 */
select option:focus {
outline: none !important;
background-color: transparent !important;
}
select.previewList option:checked,
select.previewList option:checked:focus {
}
.tool-right {
display: flex;
align-items: center;
gap: 16px;
margin-right: 20px;
}
.ml-16px {
margin-left: 16px;
}
.ml-10px {
margin-left: 10px;
}
.mr-10px {
margin-right: 10px;
}
.page{
height: calc(100% - 48px);
}
.page.preview{
height: 100%;
}
.page-content{
background: #F2F3F6;
}
/* 页面列表 */
.page-left{
font-size: 12px;
line-height: 16px;
color: #333333;
}
.tree-menu {
height: calc( 100% - 40px) ;
overflow: auto;
}
.tip {
position: fixed;
bottom: 30px;
left: 50%;
transform: translateX(-50%);
width: 410px;
height: 46px;
display: flex;
align-items: center;
justify-content: center;
background: #FFFFFF;
box-shadow: 0px 0px 20px 0px rgba(163,170,190,0.3);
border-radius: 200px 200px 200px 200px;
font-size: 14px;
color: #3D3D3D;
gap: 10px;
}
</style>
<script src="./assets/css/tailwindcss.css"></script>
<script src="./assets/javascript/tool.js"></script>
<script src="./assets/javascript/initData.js"></script>
</head>
<body>
<div id="app">
<div class="page-top" v-if="!isPreview">
<div class="flex justify-between items-center border-b h-48px">
<div class="flex items-center">
<h1 class="appName ml-16px font-bold">{{appName}}</h1>
<p style="line-height: 16px;">当前页面:{{pageName}}</p>
</div>
<div class="flex items-center">
<span class="mr-[8px] text-[#666666]">尺寸:</span>
<select class="mr-[8px] rounded previewList w-140px h-28px outline-none bg-[#F3F3F3] pl-[7px] pr-[11px] text-[13px]" v-model="previewSize">
<option :class="`option-item w-[140px] text-[13px] h-[26px] mb-[5px] px-[6px] hover:bg-[#0000000a] ${!index && 'first-option' || ''} ${'selected'&& previewSize === opt.value||'' }`" v-for="(opt, index) in previewSizeOptions" :key="opt.value" :value="opt.value" :w="opt.w" :h="opt.h">{{opt.label}}</option>
</select>
<input type="text" @change="changeAutoSize" :disabled="!(previewSize==='auto')" v-model="previewSizeW" class="rounded text-center outline-none w-70px h-28px bg-[#F3F3F3]">
<span>×</span>
<input type="text" @bur="changeAutoSize" :disabled="!(previewSize==='auto')" v-model="previewSizeH" class="rounded text-center outline-none w-70px h-28px bg-[#F3F3F3]">
</div>
<div class="tool-right">
<img @click="toPreview" src="./assets/img/show.png" alt="">
<img @click="changeCurrentIndex(-1)" :src="currentIndex === 0 ? './assets/img/left-not.png' : './assets/img/left-on.png'" alt="">
<img @click="changeCurrentIndex(1)" :src="currentIndex === pageList.length - 1 ? './assets/img/right-not.png': './assets/img/right-on.png'" alt="">
</div>
</div>
</div>
<div :class="['page', 'flex', {'preview': isPreview || !appName}]">
<div class="page-left flex-[0_0_197px] border-r" v-if="!isPreview && appName">
<div class="border-b h-40px flex items-center">
<h2 class="ml-12px px-4 font-black">页面列表</h2>
</div>
<div class="tree-menu px-[10px] pt-[10px]">
<tree-node
v-for="(node, index) in treeData"
:key="node.id"
:node="node"
@node-click="handleChangePage"
:selectId="pageUuid" >
</tree-node>
</div>
</div>
<div class="page-content" :style="{width:!isPreview && appName ? 'calc(100vw - 197px)': '100%', padding: appName && !isPreview ? '5px' : '', background:pageType === 'app'?'#ffffff':'#F2F3F6'}">
<div v-if="pageType === 'app'" class="preview-suitable-app">
<div class="preview-suitable-content-app">
<div class="app-border">
<div :style="{width:previewSizeW+'px',height:previewSizeH+'px'}">
<template v-if="isHtml">
<iframe @load="loadHtmlIframe" id="iframeApp" style="border: none;"></iframe>
</template>
<template v-else>
<iframe id="vueIframeApp" style="border: none;" :src="url" @load="vueIfameloaded"></iframe>
</template>
</div>
</div>
</div>
</div>
<div v-else class="preview-web">
<template v-if="isHtml">
<iframe id="iframe" @load="loadHtmlIframe" :style="{width:previewSizeW+'px',height:previewSizeH+'px'}" class="iframePC" style="border: none;"></iframe>
</template>
<template v-else>
<iframe id="vueIframeWeb" :style="{width:previewSizeW+'px',height:previewSizeH+'px'}" :src="url" @load="vueIfameloaded"></iframe>></iframe>
</template>
</div>
<div class="ai-tag">
<span class="custom-text-prefix">Designed by</span>
<img id="dynamicLogo" class="img-logo" src="./assets/img/ai-tag-design-img.png"/>
<span id="dynamicText" class="custom-text-sufix">GemDesign</span>
<img class="ai-tag-close" src="./assets/img/ai-tag-close.png"/>
</div>
</div>
</div>
<div v-if="isPreview && isShowTip" class="tip">
<p>按Esc键显示操作面板</p>
<img src="./assets/img/left-esc.png" alt="">
<img src="./assets/img/right-esc.png" alt="">
<p>可切换页面</p>
</div>
</div>
<script src="./assets/javascript/index.js"></script>
<script>
window.addEventListener('load', function() {
document.querySelector('.ai-tag img.ai-tag-close')?.addEventListener('click', (e) => {
e.stopPropagation()
document.querySelector('.ai-tag').style.display = 'none'
})
document.querySelector('.ai-tag')?.addEventListener('click', () => {
window.open(`${window.location.origin}/#/?ci=fx`)
})
});
</script>
</body>
</html>