|
|
@ -2,15 +2,19 @@ |
|
|
<view class="container"> |
|
|
<view class="container"> |
|
|
<uni-forms :modelValue="formData" ref="form" validate-trigger='blur'> |
|
|
<uni-forms :modelValue="formData" ref="form" validate-trigger='blur'> |
|
|
<!-- 提示词 --> |
|
|
<!-- 提示词 --> |
|
|
<view class="head"> |
|
|
<view class="promptText"> |
|
|
<view class="title">绘画提示词</view> |
|
|
<view class="head"> |
|
|
<view> |
|
|
<view class="left"> |
|
|
<uni-easyinput type="textarea" autoHeight v-model="formData.promptText" placeholder="请输入想生成画的提示词" class="promptInput" @blur="checkPrompt(formData.promptText)"></uni-easyinput> |
|
|
<view class="title">绘画关键词</view> |
|
|
</view> |
|
|
</view> |
|
|
<view class="checkPromptText" v-if="checkData.checkPrompt == false"> |
|
|
</view> |
|
|
<text>请输入提示词!</text> |
|
|
<view> |
|
|
</view> |
|
|
<uni-easyinput type="textarea" autoHeight v-model="formData.promptText" placeholder="请输入想生成画的关键词" class="promptInput" @blur="checkPrompt(formData.promptText)"></uni-easyinput> |
|
|
</view> |
|
|
</view> |
|
|
|
|
|
<view class="checkPromptText" v-if="checkData.checkPrompt == false"> |
|
|
|
|
|
<text>请输入关键词!</text> |
|
|
|
|
|
</view> |
|
|
|
|
|
</view> |
|
|
|
|
|
|
|
|
<view class="keywords"> |
|
|
<view class="keywords"> |
|
|
<view class="head"> |
|
|
<view class="head"> |
|
|
@ -66,6 +70,64 @@ |
|
|
<text>请选择画布大小!</text> |
|
|
<text>请选择画布大小!</text> |
|
|
</view> |
|
|
</view> |
|
|
</view> |
|
|
</view> |
|
|
|
|
|
<view> |
|
|
|
|
|
<view class="head"> |
|
|
|
|
|
<view class="left"> |
|
|
|
|
|
<view class="title">高级设置<uni-icons class="tip-vip-icon" custom-prefix="iconfont" type="icon-tipvip" size="14" color="#f3a73f"/></view> |
|
|
|
|
|
</view> |
|
|
|
|
|
<view class="right"> |
|
|
|
|
|
<switch :checked="advancedSetting" :color="primaryColor" style="transform:scale(0.7)" @change="openAdvancedSetting"/> |
|
|
|
|
|
</view> |
|
|
|
|
|
</view> |
|
|
|
|
|
<view class="advanced-setting" v-if="advancedSetting"> |
|
|
|
|
|
<view class="form-item"> |
|
|
|
|
|
<view class="form-label">反向词</view> |
|
|
|
|
|
<uni-easyinput type="textarea" autoHeight v-model="formData.negativePrompt" placeholder="请输入我不想生成的词" class="promptInput" ></uni-easyinput> |
|
|
|
|
|
</view> |
|
|
|
|
|
<view class="form-item"> |
|
|
|
|
|
<view class="form-label">种子(随机种子为-1)</view> |
|
|
|
|
|
<input class="uni-input" v-model="formData.seed" type="number" placeholder="请输入种子" /> |
|
|
|
|
|
</view> |
|
|
|
|
|
<view class="form-item"> |
|
|
|
|
|
<view class="form-label">生成数量</view> |
|
|
|
|
|
<uni-number-box v-model="formData.batchSize" :step="1" :min="1" :max="4" /> |
|
|
|
|
|
</view> |
|
|
|
|
|
<view class="form-item"> |
|
|
|
|
|
<view class="form-label display-flex-sb"> |
|
|
|
|
|
<view class="left-title">关键词相关性</view> |
|
|
|
|
|
<view class="right-title">{{formData.sfgScale ?? 7}}</view> |
|
|
|
|
|
</view> |
|
|
|
|
|
<slider :step="1" :min="0" :max="80" :block-size="12" :activeColor="primaryColor" |
|
|
|
|
|
@change="(e) => {this.formData.sfgScale = (e.detail.value * 0.1 + 7).toFixed(1)}" |
|
|
|
|
|
@changing="(e) => {this.formData.sfgScale = (e.detail.value * 0.1 + 7).toFixed(1)}" |
|
|
|
|
|
/> |
|
|
|
|
|
</view> |
|
|
|
|
|
<view class="form-item"> |
|
|
|
|
|
<view class="form-label display-flex-sb"> |
|
|
|
|
|
<view class="left-title">绘画步骤</view> |
|
|
|
|
|
<view class="right-title">{{formData.steps ?? 20}}</view> |
|
|
|
|
|
</view> |
|
|
|
|
|
<slider :step="1" :min="20" :max="30" :block-size="12" :activeColor="primaryColor" |
|
|
|
|
|
@change="(e) => {this.formData.steps = e.detail.value}" |
|
|
|
|
|
@changing="(e) => {this.formData.steps = e.detail.value}" |
|
|
|
|
|
/> |
|
|
|
|
|
</view> |
|
|
|
|
|
<view class="form-item"> |
|
|
|
|
|
<view class="form-label display-flex-sb"> |
|
|
|
|
|
<view class="left-title">差异强度</view> |
|
|
|
|
|
<view class="right-title">{{formData.eta ?? 0}}</view> |
|
|
|
|
|
</view> |
|
|
|
|
|
<slider :step="1" :min="0" :max="10" :block-size="12" :activeColor="primaryColor" |
|
|
|
|
|
@change="(e) => {this.formData.eta = (e.detail.value * 0.1).toFixed(1)}" |
|
|
|
|
|
@changing="(e) => {this.formData.eta = (e.detail.value * 0.1).toFixed(1)}" |
|
|
|
|
|
/> |
|
|
|
|
|
</view> |
|
|
|
|
|
<view class="form-item"> |
|
|
|
|
|
<view class="form-label">采样方法</view> |
|
|
|
|
|
<uni-data-checkbox mode="button" v-model="formData.samplerIndex" :localdata="samplerIndexArr" :selectedColor="primaryColor" :selectedTextColor="primaryColor"></uni-data-checkbox> |
|
|
|
|
|
</view> |
|
|
|
|
|
</view> |
|
|
|
|
|
</view> |
|
|
|
|
|
|
|
|
<view class="bottom"> |
|
|
<view class="bottom"> |
|
|
<view> |
|
|
<view> |
|
|
@ -89,6 +151,13 @@ |
|
|
modelName: undefined, |
|
|
modelName: undefined, |
|
|
styleName: undefined, |
|
|
styleName: undefined, |
|
|
promptText: undefined, |
|
|
promptText: undefined, |
|
|
|
|
|
negativePrompt: undefined, //反向词 |
|
|
|
|
|
seed: -1, //种子 |
|
|
|
|
|
batchSize: 1, //批量数量 |
|
|
|
|
|
sfgScale: 7, //精细度 |
|
|
|
|
|
steps: 20, //采样步骤 |
|
|
|
|
|
eta: 0, //差异强度 |
|
|
|
|
|
samplerIndex: "Euler a", //采样器 |
|
|
}, |
|
|
}, |
|
|
checkData:{ |
|
|
checkData:{ |
|
|
checkPrompt: undefined, //true填了内容;false未填内容 |
|
|
checkPrompt: undefined, //true填了内容;false未填内容 |
|
|
@ -123,7 +192,29 @@ |
|
|
width: 512 |
|
|
width: 512 |
|
|
} |
|
|
} |
|
|
], |
|
|
], |
|
|
} |
|
|
advancedSetting: false, |
|
|
|
|
|
samplerIndexArr: [ |
|
|
|
|
|
{text:"Euler a", value:"Euler a"}, |
|
|
|
|
|
{text:"Euler", value:"Euler"}, |
|
|
|
|
|
{text:"LMS", value:"LMS"}, |
|
|
|
|
|
{text:"Heun", value:"Heun"}, |
|
|
|
|
|
{text:"DPM2", value:"DPM2"}, |
|
|
|
|
|
{text:"DPM2 a", value:"DPM2 a"}, |
|
|
|
|
|
{text:"DPM++ 2S a", value:"DPM++ 2S a"}, |
|
|
|
|
|
{text:"DPM++ 2M", value:"DPM++ 2M"}, |
|
|
|
|
|
{text:"DPM++ SDE", value:"DPM++ SDE"}, |
|
|
|
|
|
{text:"DPM fast", value:"DPM fast"}, |
|
|
|
|
|
{text:"DPM adaptive", value:"DPM adaptive"}, |
|
|
|
|
|
{text:"LMS Karras", value:"LMS Karras"}, |
|
|
|
|
|
{text:"DPM2 Karras", value:"DPM2 Karras"}, |
|
|
|
|
|
{text:"DPM2 a Karras", value:"DPM2 a Karras"}, |
|
|
|
|
|
{text:"DPM++ 2S a Karras", value:"DPM++ 2S a Karras"}, |
|
|
|
|
|
{text:"DPM++ 2M Karras", value:"DPM++ 2M Karras"}, |
|
|
|
|
|
{text:"DPM++ SDE Karras", value:"DPM++ SDE Karras"}, |
|
|
|
|
|
{text:"DDIM", value:"DDIM"}, |
|
|
|
|
|
{text:"PLMS", value:"PLMS"} |
|
|
|
|
|
], |
|
|
|
|
|
} |
|
|
}, |
|
|
}, |
|
|
created() { |
|
|
created() { |
|
|
//this.base64ToPath(); |
|
|
//this.base64ToPath(); |
|
|
@ -140,6 +231,15 @@ |
|
|
this.formData.modelName = undefined; |
|
|
this.formData.modelName = undefined; |
|
|
this.formData.styleName = undefined; |
|
|
this.formData.styleName = undefined; |
|
|
this.formData.promptText = undefined; |
|
|
this.formData.promptText = undefined; |
|
|
|
|
|
this.advancedSetting = false; |
|
|
|
|
|
this.formData.sfgScale = undefined; |
|
|
|
|
|
this.formData.negativePrompt = undefined; |
|
|
|
|
|
this.formData.seed = -1; |
|
|
|
|
|
this.formData.batchSize = 1; |
|
|
|
|
|
this.formData.sfgScale = 7; |
|
|
|
|
|
this.formData.steps = 20; |
|
|
|
|
|
this.formData.eta = 0; |
|
|
|
|
|
this.formData.samplerIndex = "Euler a"; |
|
|
this.size_active = 0; |
|
|
this.size_active = 0; |
|
|
this.style_active = 0; |
|
|
this.style_active = 0; |
|
|
this.prompt_active = 0; |
|
|
this.prompt_active = 0; |
|
|
@ -147,7 +247,18 @@ |
|
|
this.checkUserCanAiPaint(); |
|
|
this.checkUserCanAiPaint(); |
|
|
}, |
|
|
}, |
|
|
methods: { |
|
|
methods: { |
|
|
|
|
|
openAdvancedSetting(e) { |
|
|
|
|
|
//TODO 判断VIP |
|
|
|
|
|
this.advancedSetting = e.detail.value; |
|
|
|
|
|
this.formData.sfgScale = undefined; |
|
|
|
|
|
this.formData.negativePrompt = undefined; |
|
|
|
|
|
this.formData.seed = -1; |
|
|
|
|
|
this.formData.batchSize = 1; |
|
|
|
|
|
this.formData.sfgScale = 7; |
|
|
|
|
|
this.formData.steps = 20; |
|
|
|
|
|
this.formData.eta = 0; |
|
|
|
|
|
this.formData.samplerIndex = `Euler a`; |
|
|
|
|
|
}, |
|
|
//翻译 |
|
|
//翻译 |
|
|
|
|
|
|
|
|
//判断是否登录 |
|
|
//判断是否登录 |
|
|
@ -226,6 +337,13 @@ |
|
|
prompt: that.formData.promptText, |
|
|
prompt: that.formData.promptText, |
|
|
modelName: that.formData.modelName, |
|
|
modelName: that.formData.modelName, |
|
|
styleName: that.formData.styleName, |
|
|
styleName: that.formData.styleName, |
|
|
|
|
|
negativePrompt: that.formData.negativePrompt, //反向词 |
|
|
|
|
|
seed: that.formData.seed, //种子 |
|
|
|
|
|
batchSize: that.formData.batchSize, //批量数量 |
|
|
|
|
|
sfgScale: that.formData.sfgScale, //精细度 |
|
|
|
|
|
steps: that.formData.steps, //采样步骤 |
|
|
|
|
|
eta: that.formData.eta, //差异强度 |
|
|
|
|
|
samplerIndex: that.formData.samplerIndex, //采样器 |
|
|
painterId: that.userInfo.id, |
|
|
painterId: that.userInfo.id, |
|
|
painterName: that.userInfo.username, |
|
|
painterName: that.userInfo.username, |
|
|
appType: 0, |
|
|
appType: 0, |
|
|
@ -394,10 +512,44 @@ |
|
|
padding: 0 10px; |
|
|
padding: 0 10px; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
.title { |
|
|
|
|
|
font-size: 28rpx; |
|
|
.head { |
|
|
line-height: 48rpx; |
|
|
display: flex; |
|
|
|
|
|
flex-direction: row; |
|
|
|
|
|
justify-content: space-between; |
|
|
|
|
|
margin-bottom: 15rpx; |
|
|
|
|
|
|
|
|
|
|
|
.left { |
|
|
|
|
|
display: flex; |
|
|
|
|
|
flex-direction: row; |
|
|
|
|
|
align-items: center; |
|
|
|
|
|
|
|
|
|
|
|
.title { |
|
|
|
|
|
font-size: 28rpx; |
|
|
|
|
|
|
|
|
|
|
|
.tip-vip-icon { |
|
|
|
|
|
margin-left: 20rpx; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.right { |
|
|
|
|
|
display: flex; |
|
|
|
|
|
flex-direction: row; |
|
|
|
|
|
align-items: center; |
|
|
|
|
|
|
|
|
|
|
|
.title { |
|
|
|
|
|
margin-right: 15rpx; |
|
|
|
|
|
font-size: 24rpx; |
|
|
|
|
|
line-height: 48rpx; |
|
|
|
|
|
color: $uni-primary; |
|
|
|
|
|
} |
|
|
|
|
|
.icon { |
|
|
|
|
|
line-height: 48rpx; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
.size { |
|
|
.size { |
|
|
width: 100%; |
|
|
width: 100%; |
|
|
|
|
|
|
|
|
@ -425,78 +577,6 @@ |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
.head { |
|
|
|
|
|
display: flex; |
|
|
|
|
|
flex-direction: row; |
|
|
|
|
|
justify-content: space-between; |
|
|
|
|
|
margin-bottom: 15rpx; |
|
|
|
|
|
|
|
|
|
|
|
.left { |
|
|
|
|
|
display: flex; |
|
|
|
|
|
flex-direction: row; |
|
|
|
|
|
align-items: center; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.right { |
|
|
|
|
|
display: flex; |
|
|
|
|
|
flex-direction: row; |
|
|
|
|
|
align-items: center; |
|
|
|
|
|
|
|
|
|
|
|
.title { |
|
|
|
|
|
margin-right: 15rpx; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.play { |
|
|
|
|
|
width: 92%; |
|
|
|
|
|
margin: 15rpx auto; |
|
|
|
|
|
|
|
|
|
|
|
.lists { |
|
|
|
|
|
display: flex; |
|
|
|
|
|
flex-direction: row; |
|
|
|
|
|
|
|
|
|
|
|
.item { |
|
|
|
|
|
background-color: #FFDEE0; |
|
|
|
|
|
padding: 10rpx 30rpx; |
|
|
|
|
|
border-radius: 10rpx; |
|
|
|
|
|
height: 30rpx; |
|
|
|
|
|
color: #F22E38; |
|
|
|
|
|
border: 1rpx solid #F22E38; |
|
|
|
|
|
margin-bottom: 10rpx; |
|
|
|
|
|
font-size: 24rpx; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.head { |
|
|
|
|
|
display: flex; |
|
|
|
|
|
flex-direction: row; |
|
|
|
|
|
justify-content: space-between; |
|
|
|
|
|
margin-bottom: 30rpx; |
|
|
|
|
|
|
|
|
|
|
|
.left { |
|
|
|
|
|
display: flex; |
|
|
|
|
|
flex-direction: row; |
|
|
|
|
|
align-items: center; |
|
|
|
|
|
|
|
|
|
|
|
.title { |
|
|
|
|
|
font-size: 28rpx; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.right { |
|
|
|
|
|
display: flex; |
|
|
|
|
|
flex-direction: row; |
|
|
|
|
|
align-items: center; |
|
|
|
|
|
|
|
|
|
|
|
.title { |
|
|
|
|
|
margin-right: 15rpx; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
.style { |
|
|
.style { |
|
|
@ -526,32 +606,6 @@ |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
.head { |
|
|
|
|
|
display: flex; |
|
|
|
|
|
flex-direction: row; |
|
|
|
|
|
justify-content: space-between; |
|
|
|
|
|
margin-bottom: 20rpx; |
|
|
|
|
|
|
|
|
|
|
|
.left { |
|
|
|
|
|
display: flex; |
|
|
|
|
|
flex-direction: row; |
|
|
|
|
|
align-items: center; |
|
|
|
|
|
|
|
|
|
|
|
.title { |
|
|
|
|
|
font-size: 28rpx; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.right { |
|
|
|
|
|
display: flex; |
|
|
|
|
|
flex-direction: row; |
|
|
|
|
|
align-items: center; |
|
|
|
|
|
|
|
|
|
|
|
.title { |
|
|
|
|
|
margin-right: 15rpx; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
.keywords { |
|
|
.keywords { |
|
|
@ -586,90 +640,6 @@ |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
.head { |
|
|
|
|
|
display: flex; |
|
|
|
|
|
flex-direction: row; |
|
|
|
|
|
justify-content: space-between; |
|
|
|
|
|
margin-bottom: 15rpx; |
|
|
|
|
|
|
|
|
|
|
|
.left { |
|
|
|
|
|
display: flex; |
|
|
|
|
|
flex-direction: row; |
|
|
|
|
|
align-items: center; |
|
|
|
|
|
|
|
|
|
|
|
.title { |
|
|
|
|
|
font-size: 28rpx; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.right { |
|
|
|
|
|
display: flex; |
|
|
|
|
|
flex-direction: row; |
|
|
|
|
|
align-items: center; |
|
|
|
|
|
|
|
|
|
|
|
.title { |
|
|
|
|
|
margin-right: 15rpx; |
|
|
|
|
|
font-size: 24rpx; |
|
|
|
|
|
line-height: 48rpx; |
|
|
|
|
|
color: $uni-primary; |
|
|
|
|
|
} |
|
|
|
|
|
.icon { |
|
|
|
|
|
line-height: 48rpx; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.btn-action { |
|
|
|
|
|
width: 90%; |
|
|
|
|
|
position: fixed; |
|
|
|
|
|
bottom: 0rpx; |
|
|
|
|
|
left: 4%; |
|
|
|
|
|
height: 120rpx; |
|
|
|
|
|
|
|
|
|
|
|
.btn-group { |
|
|
|
|
|
display: flex; |
|
|
|
|
|
flex-direction: row; |
|
|
|
|
|
justify-content: space-between; |
|
|
|
|
|
|
|
|
|
|
|
.rand { |
|
|
|
|
|
width: 40%; |
|
|
|
|
|
|
|
|
|
|
|
.u-button { |
|
|
|
|
|
height: 100rpx; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.start { |
|
|
|
|
|
width: 55%; |
|
|
|
|
|
|
|
|
|
|
|
.btn-normal { |
|
|
|
|
|
height: 100rpx; |
|
|
|
|
|
line-height: normal; |
|
|
|
|
|
font-size: 28rpx; |
|
|
|
|
|
border-radius: 50rpx; |
|
|
|
|
|
background-color: #f22e38; |
|
|
|
|
|
border: none; |
|
|
|
|
|
color: #f4f4f5; |
|
|
|
|
|
display: flex; |
|
|
|
|
|
flex-direction: column; |
|
|
|
|
|
justify-content: center; |
|
|
|
|
|
box-shadow: 3rpx 3rpx 10rpx #dd6161; |
|
|
|
|
|
|
|
|
|
|
|
.title { |
|
|
|
|
|
font-weight: bolder; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.small { |
|
|
|
|
|
font-size: 24rpx; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.btn-normal::after { |
|
|
|
|
|
border: initial; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
.styleBox{ |
|
|
.styleBox{ |
|
|
@ -724,6 +694,46 @@ |
|
|
bottom: 0; |
|
|
bottom: 0; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.advanced-setting { |
|
|
|
|
|
margin-top: 20rpx; |
|
|
|
|
|
padding-bottom: 100rpx; |
|
|
|
|
|
|
|
|
|
|
|
.form-item { |
|
|
|
|
|
|
|
|
|
|
|
input { |
|
|
|
|
|
color: rgb(51, 51, 51); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.uni-input { |
|
|
|
|
|
border: 2rpx solid $uni-border-1; |
|
|
|
|
|
border-radius: 10rpx; |
|
|
|
|
|
border-color: rgb(229, 229, 229); |
|
|
|
|
|
font-size: 28rpx; |
|
|
|
|
|
padding: 10rpx 20rpx; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.form-label { |
|
|
|
|
|
font-size: 28rpx; |
|
|
|
|
|
margin: 10rpx 0; |
|
|
|
|
|
line-height: 38rpx; |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.display-flex-sb { |
|
|
|
|
|
display: flex; |
|
|
|
|
|
justify-content: space-between; |
|
|
|
|
|
|
|
|
|
|
|
.right-title { |
|
|
|
|
|
color: $uni-primary; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
.bottom { |
|
|
.bottom { |
|
|
width: calc(100% - 40rpx); |
|
|
width: calc(100% - 40rpx); |
|
|
position: fixed; |
|
|
position: fixed; |
|
|
|