Sfoglia il codice sorgente

fix(App): 移除页脚多余边距并优化样式类名

移除了 `src/App.vue` 中 footer 的 `margin-top` 样式。
更新了 `BlockNoteEditor.vue` 中容器的背景色类名,调整编辑器宽度为 100%。
统一样式表中部分间距和颜色变量命名,增强复用性。

---

feat(SearchPlatform): 调整搜索区域样式及路由参数获取方式

修改 `.padding16` 为 `.padding12` 以适配设计需求。
将按钮点击事件由 `@click.stop.prevent` 改为默认触发方式。
修正通过 `route.query` 获取路由参数的方式。
跳转至新增页面时携带 `activePlatform` 参数。

---

feat(WorkflowAdd): 新增工作流创建表单与文件上传功能

重构页面结构,引入 Element Plus 表单组件实现基础信息录入。
集成 `FileUploader` 组件支持 JSON/YAML/ZIP 文件上传。
添加 BlockNote 编辑器用于详情内容输入。
实现价格设置模块,包括支付类型选择与金额输入框。
完善上传回调逻辑,并展示相应提示消息。

---

refactor(styles): 更新全局样式变量与工具类

将 `.container-height` 的 `height` 改为 `min-height` 提升响应式兼容性。
新增多个通用内边距和间距工具类(如 `.padding8`, `.gap20`)。
增加文本颜色辅助类 `.gray999`。
微调 `.line_vertical` 尺寸使其更符合视觉规范。
清理冗余或未使用的 CSS 类,减少包体积。
zhangningning 6 giorni fa
parent
commit
67a650b882

+ 0 - 1
src/App.vue

@@ -172,7 +172,6 @@ const handleLogout = () => {
   color: #666;
   text-align: center;
   padding: 20px 0;
-  margin-top: 240px;
   
   .footer-content {
     font-size: 14px;

+ 2 - 2
src/components/BlockNoteEditor.vue

@@ -3,7 +3,7 @@
     component="BlockNoteReact" 
     :props="editorProps" 
     key="blocknote-editor" 
-    class="blocknote-container bg_color_fff"
+    class="blocknote-container"
 
   />
 </template>
@@ -49,7 +49,7 @@ watch(() => props.modelValue, (newVal) => {
   border-radius: 6px;
   padding: 12px;
   min-height: 250px;
-  margin: 16px 0;
+  width: 100%;
 }
 :deep(.blocknote-editor) {
   font-size: 16px;

+ 471 - 0
src/components/FileUploader.vue

@@ -0,0 +1,471 @@
+<template>
+  <div class="file-uploader-container">
+    <el-upload
+      ref="uploadRef"
+      :action="uploadUrl"
+      :headers="headers"
+      :method="method"
+      :multiple="multiple"
+      :data="uploadData"
+      :name="fileFieldName"
+      :with-credentials="withCredentials"
+      :show-file-list="showFileList"
+      :accept="accept"
+      :limit="limit"
+      :file-list="fileList"
+      :auto-upload="autoUpload"
+      :drag="drag"
+      :list-type="listType"
+      :before-upload="handleBeforeUpload"
+      :before-remove="handleBeforeRemove"
+      :on-success="handleSuccess"
+      :on-error="handleError"
+      :on-progress="handleProgress"
+      :on-change="handleChange"
+      :on-remove="handleRemove"
+      :on-exceed="handleExceed"
+      :on-preview="handlePreview"
+      :on-download="handleDownload"
+    >
+      <template v-if="drag">
+        <el-icon class="el-icon--upload"><upload-filled /></el-icon>
+        <div class="el-upload__text">
+          将文件拖到此处,或 <em>点击上传</em>
+        </div>
+        <template v-if="tip" class="el-upload__tip">{{ tip }}</template>
+      </template>
+      
+      <template v-else>
+        <slot name="trigger">
+          <el-button type="primary">
+            <el-icon><Plus /></el-icon>
+            <span class="ml10">{{ buttonText }}</span>
+          </el-button>
+        </slot>
+        <template v-if="tip" class="el-upload__tip">
+          <span class="ml10 gray999">{{ tip }}</span>
+        </template>
+      </template>
+      
+      <template #file-list>
+        <slot name="file-list" :file-list="fileList">
+          <el-upload-list :file-list="fileList" @remove="handleRemove">
+            <template #default="{ file }">
+              <el-upload-list-item
+                :file="file"
+                :name="fileFieldName"
+                @remove="handleRemove"
+              >
+                <template #actions>
+                  <el-button
+                    type="text"
+                    size="small"
+                    @click="handlePreview(file)"
+                  >
+                    <el-icon><zoom-in /></el-icon>
+                    预览
+                  </el-button>
+                  <el-button
+                    type="text"
+                    size="small"
+                    @click="handleDownload(file)"
+                  >
+                    <el-icon><download /></el-icon>
+                    下载
+                  </el-button>
+                  <el-button
+                    type="text"
+                    size="small"
+                    @click="handleRemove(file)"
+                  >
+                    <el-icon><delete /></el-icon>
+                    删除
+                  </el-button>
+                </template>
+              </el-upload-list-item>
+            </template>
+          </el-upload-list>
+        </slot>
+      </template>
+      
+      <!-- 上传进度条 -->
+      <template v-if="showProgress" #progress="{ file }">
+        <el-progress
+          :percentage="file.percentage"
+          :stroke-width="2"
+          :show-text="false"
+        />
+      </template>
+    </el-upload>
+    
+    <!-- 预览对话框 -->
+    <el-dialog
+      v-model="previewVisible"
+      :title="previewTitle"
+      width="80%"
+      destroy-on-close
+    >
+      <div class="preview-container">
+        <template v-if="isImageFile(currentPreviewFile)">
+          <img :src="currentPreviewFile.url" alt="预览" class="preview-image" />
+        </template>
+        
+        <template v-else-if="isTextFile(currentPreviewFile)">
+          <pre class="preview-text">{{ currentPreviewContent }}</pre>
+        </template>
+        
+        <template v-else>
+          <div class="preview-other">
+            <el-icon class="file-icon"><document /></el-icon>
+            <div class="file-info">
+              <div class="file-name">{{ currentPreviewFile.name }}</div>
+              <div class="file-size">{{ formatFileSize(currentPreviewFile.size) }}</div>
+            </div>
+          </div>
+        </template>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+import { ref, computed, watch } from 'vue'
+import { 
+  UploadFilled, 
+  ZoomIn, 
+  Download, 
+  Delete, 
+  Document,
+  Plus
+} from '@element-plus/icons-vue'
+
+// 组件属性
+const props = defineProps({
+  // 上传地址
+  uploadUrl: {
+    type: String,
+    required: true
+  },
+  // 请求头
+  headers: {
+    type: Object,
+    default: () => ({})
+  },
+  // 请求方法
+  method: {
+    type: String,
+    default: 'post'
+  },
+  // 是否支持多文件上传
+  multiple: {
+    type: Boolean,
+    default: false
+  },
+  // 上传时附带的额外参数
+  data: {
+    type: Object,
+    default: () => ({})
+  },
+  // 文件字段名
+  fileFieldName: {
+    type: String,
+    default: 'file'
+  },
+  // 是否携带凭证信息
+  withCredentials: {
+    type: Boolean,
+    default: false
+  },
+  // 是否显示已上传文件列表
+  showFileList: {
+    type: Boolean,
+    default: true
+  },
+  // 接受的文件类型
+  accept: {
+    type: String,
+    default: ''
+  },
+  // 最大允许上传文件数量
+  limit: {
+    type: Number,
+    default: 0 // 0 表示不限制
+  },
+  // 已上传的文件列表
+  modelValue: {
+    type: Array,
+    default: () => []
+  },
+  // 是否自动上传
+  autoUpload: {
+    type: Boolean,
+    default: true
+  },
+  // 是否启用拖拽上传
+  drag: {
+    type: Boolean,
+    default: false
+  },
+  // 文件列表的类型
+  listType: {
+    type: String,
+    default: 'text', // text, picture, picture-card
+    validator: (value) => ['text', 'picture', 'picture-card'].includes(value)
+  },
+  // 上传按钮文字
+  buttonText: {
+    type: String,
+    default: '点击上传'
+  },
+  // 提示文字
+  tip: {
+    type: String,
+    default: ''
+  },
+  // 最大文件大小 (MB)
+  maxSize: {
+    type: Number,
+    default: 0 // 0 表示不限制
+  },
+  // 是否显示进度条
+  showProgress: {
+    type: Boolean,
+    default: true
+  }
+})
+
+// 组件事件
+const emit = defineEmits([
+  'update:modelValue', // 文件列表更新事件
+  'before-upload', // 上传前事件
+  'before-remove', // 删除前事件
+  'success', // 上传成功事件
+  'error', // 上传失败事件
+  'progress', // 上传进度事件
+  'change', // 文件状态改变事件
+  'remove', // 文件移除事件
+  'exceed', // 文件数量超出限制事件
+  'preview', // 文件预览事件
+  'download' // 文件下载事件
+])
+
+// 内部状态
+const uploadRef = ref(null)
+const fileList = ref([...props.modelValue])
+const previewVisible = ref(false)
+const currentPreviewFile = ref(null)
+const currentPreviewContent = ref('')
+
+// 计算属性
+const uploadData = computed(() => props.data)
+const previewTitle = computed(() => currentPreviewFile.value ? `预览:${currentPreviewFile.value.name}` : '文件预览')
+
+// 监听modelValue变化,同步到内部fileList
+watch(() => props.modelValue, (newVal) => {
+  fileList.value = [...newVal]
+}, { deep: true })
+
+// 监听fileList变化,同步到modelValue
+watch(() => fileList.value, (newVal) => {
+  emit('update:modelValue', [...newVal])
+}, { deep: true })
+
+// 上传前的校验
+const handleBeforeUpload = (rawFile) => {
+  // 文件大小校验
+  if (props.maxSize > 0) {
+    const maxSizeBytes = props.maxSize * 1024 * 1024
+    if (rawFile.size > maxSizeBytes) {
+      emit('error', {
+        message: `文件大小超出限制,最大允许 ${props.maxSize}MB`
+      })
+      return false
+    }
+  }
+
+  // 调用外部before-upload钩子
+  return emit('before-upload', rawFile) !== false
+}
+
+// 上传成功处理
+const handleSuccess = (response, rawFile, uploadedFiles) => {
+  emit('success', response, rawFile, uploadedFiles)
+}
+
+// 上传失败处理
+const handleError = (error, rawFile, uploadedFiles) => {
+  emit('error', error, rawFile, uploadedFiles)
+}
+
+// 上传进度处理
+const handleProgress = (event, file, uploadedFiles) => {
+  emit('progress', event, file, uploadedFiles)
+}
+
+// 文件状态改变处理
+const handleChange = (file, fileList) => {
+  emit('change', file, fileList)
+}
+
+// 删除文件前的处理
+const handleBeforeRemove = (file, fileList) => {
+  return emit('before-remove', file, fileList) !== false
+}
+
+// 文件移除处理
+const handleRemove = (file, fileList) => {
+  emit('remove', file, fileList)
+}
+
+// 文件数量超出限制处理
+const handleExceed = (files, fileList) => {
+  emit('exceed', files, fileList)
+}
+
+// 文件预览处理
+const handlePreview = (file) => {
+  currentPreviewFile.value = file
+  
+  // 图片文件直接预览
+  if (isImageFile(file)) {
+    previewVisible.value = true
+    emit('preview', file)
+    return
+  }
+  
+  // 文本文件读取内容后预览
+  if (isTextFile(file)) {
+    if (file.url) {
+      fetch(file.url)
+        .then(response => response.text())
+        .then(text => {
+          currentPreviewContent.value = text
+          previewVisible.value = true
+          emit('preview', file)
+        })
+        .catch(error => {
+          console.error('读取文件内容失败:', error)
+          emit('error', error, file)
+        })
+    } else {
+      previewVisible.value = true
+      emit('preview', file)
+    }
+    return
+  }
+  
+  // 其他文件类型
+  previewVisible.value = true
+  emit('preview', file)
+}
+
+// 文件下载处理
+const handleDownload = (file) => {
+  emit('download', file)
+}
+
+// 辅助方法:判断是否为图片文件
+const isImageFile = (file) => {
+  return file.type.startsWith('image/') || 
+         /\.(jpg|jpeg|png|gif|bmp|webp)$/i.test(file.name)
+}
+
+// 辅助方法:判断是否为文本文件
+const isTextFile = (file) => {
+  return file.type.startsWith('text/') || 
+         /\.(txt|json|yaml|yml|xml|html|htm|css|js|ts|md|markdown)$/i.test(file.name)
+}
+
+// 辅助方法:格式化文件大小
+const formatFileSize = (size) => {
+  if (size < 1024) {
+    return `${size} B`
+  } else if (size < 1024 * 1024) {
+    return `${(size / 1024).toFixed(2)} KB`
+  } else if (size < 1024 * 1024 * 1024) {
+    return `${(size / (1024 * 1024)).toFixed(2)} MB`
+  } else {
+    return `${(size / (1024 * 1024 * 1024)).toFixed(2)} GB`
+  }
+}
+
+// 暴露方法给父组件
+defineExpose({
+  // 手动上传文件
+  submitUpload: () => uploadRef.value?.submit(),
+  // 清除文件列表
+  clearFiles: () => uploadRef.value?.clearFiles(),
+  // 撤销上传请求
+  abort: (file) => uploadRef.value?.abort(file),
+  // 获取当前文件列表
+  getFileList: () => [...fileList.value],
+  // 手动添加文件到列表
+  addFile: (file) => {
+    fileList.value.push(file)
+    return fileList.value
+  },
+  // 手动移除文件
+  removeFile: (file) => {
+    const index = fileList.value.findIndex(item => item.uid === file.uid)
+    if (index > -1) {
+      fileList.value.splice(index, 1)
+    }
+    return fileList.value
+  }
+})
+</script>
+
+<style scoped lang="scss">
+.file-uploader-container {
+  width: 100%;
+  
+  .preview-container {
+    width: 100%;
+    max-height: 60vh;
+    overflow: auto;
+    
+    .preview-image {
+      width: 100%;
+      height: auto;
+      object-fit: contain;
+    }
+    
+    .preview-text {
+      width: 100%;
+      padding: 10px;
+      background-color: #f5f5f5;
+      border-radius: 4px;
+      font-family: monospace;
+      white-space: pre-wrap;
+    }
+    
+    .preview-other {
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      padding: 40px 0;
+      
+      .file-icon {
+        font-size: 64px;
+        color: #409eff;
+        margin-right: 20px;
+      }
+      
+      .file-info {
+        text-align: left;
+        
+        .file-name {
+          font-size: 16px;
+          font-weight: 500;
+          margin-bottom: 8px;
+        }
+        
+        .file-size {
+          font-size: 14px;
+          color: #666;
+        }
+      }
+    }
+  }
+}
+</style>

+ 4 - 3
src/pages/SearchPlatform.vue

@@ -2,7 +2,7 @@
   <div class="search-platform container-height">
     <div v-if="!isChildRoute">
       <Breadcrumb />
-      <div class="padding16 bg_color_fff border_radius_16">
+      <div class="padding12 bg_color_fff border_radius_16">
         <!-- 搜索与创建区域 -->
         <div class="search-create-bar">
           <div class="search-input-container flex_1">
@@ -11,7 +11,7 @@
               :placeholder="$t('common.qingshuruyaosousuodegongzuoliu')"
               class="search-input"
             />
-            <button class="search-btn bg_color_primary" @click.stop.prevent="goSearchPlatform">
+            <button class="search-btn bg_color_primary">
               <img :src="searchIcon" alt="" class="icon-search">
               {{$t('common.shousuo')}}
             </button>
@@ -73,7 +73,7 @@
   console.log(router,route)
   import { ref, computed, reactive } from 'vue'
   //获取参数
-  const query = router.currentRoute.value.query
+  const query = route.query
   const activePlatform = ref(query.activePlatform || '')
   //获取当前路由路径
   // const currentPath = ref(router.currentRoute.value.path)
@@ -108,6 +108,7 @@
     router.push({
       path: `/search-platform/workflow-add`,
       query: {
+        activePlatform: activePlatform.value,
       }
     })
   };

+ 185 - 6
src/pages/WorkflowAdd.vue

@@ -1,13 +1,192 @@
 <template>
   <div class="workflow-add container-height">
-    <div>
-      <Breadcrumb />
-      <h1>创建新的工作流</h1>
-    </div>
-    <router-view />
+    <Breadcrumb />
+    <el-form :model="ruleForm" :rules="rules" ref="ruleFormRef" label-position="top">
+      <div class="padding16 bg_color_fff border_radius_10">
+        <div class="gap10">
+          <div class="line_vertical"></div>
+          <div class="font_size20 bold">文件上传</div>
+          <div class="gray999 font_size14">支持格式:JSON、YAML、ZIP(最大100MB)</div>
+        </div>
+        <div class="mt10">
+          <!-- 上传 -->
+          <FileUploader
+            ref="fileUploader"
+            :upload-url="uploadUrl"
+            accept=".json,.yaml,.yml,.zip"
+            :max-size="100"
+            :multiple="false"
+            :auto-upload="true"
+            :drag="true"
+            :list-type="picture-card"
+            v-model="uploadedFiles"
+            tip="请上传JSON、YAML、ZIP格式的文件,最大100MB"
+            @success="handleUploadSuccess"
+            @error="handleUploadError"
+            @progress="handleUploadProgress"
+          />
+        </div>
+      </div>
+      <div class="padding16 bg_color_fff border_radius_10 mt10">
+        <div class="gap10">
+          <div class="line_vertical"></div>
+          <div class="font_size20 bold">基本信息</div>
+        </div>
+        <div class="mt10">
+          <el-form-item label="工作流标题" prop="name">
+            <el-input v-model="ruleForm.name" placeholder="请输入工作流标题"  maxlength="50"/>
+          </el-form-item>
+          <el-form-item label="工作流类型" prop="name">
+            <el-input v-model="ruleForm.name" placeholder="请输入工作流标题"  maxlength="50" />
+          </el-form-item>
+          <el-form-item label="工作流预览">
+            <FileUploader
+              ref="fileUploader"
+              :upload-url="uploadUrl"
+              :max-size="100"
+              :multiple="true"
+              :auto-upload="true"
+              :list-type="picture-card"
+              buttonText="添加文件"
+              v-model="uploadedFiles"
+              tip="支持批量上传文件,文件格式不限,最多只能上传 5 份文件"
+              @success="handleUploadSuccess"
+              @error="handleUploadError"
+              @progress="handleUploadProgress"
+            />
+          </el-form-item>
+          <el-form-item label="详情">
+              <BlockNoteEditor v-model="editorContent" @getHtml="getHtml" :editable="true"/>
+          </el-form-item>
+        </div>
+      </div>
+      <div class="padding16 bg_color_fff border_radius_10 mt10">
+        <div class="gap10 mb20">
+          <div class="line_vertical"></div>
+          <div class="font_size20 bold">价格设置</div>
+        </div>
+       
+        <el-form-item label="付费设置" style="width: 500px">
+          <div class="gap20 mt10 mb20">
+            <div class="payType active gap10">
+              <div class="checkType"></div>
+              <div>付费(用户需付费后使用)</div>
+            </div>
+            <div class="payType gap10">
+              <div class="checkType"></div>
+              <div>付费(用户需付费后使用)</div>
+            </div>
+          </div>
+          <el-input v-model="ruleForm.name" placeholder="请输入暴米币数量"  maxlength="50" type="number">
+            <template #append>暴米币</template>
+          </el-input>
+        </el-form-item>
+      </div>
+    </el-form>
   </div>
 </template>
 
 <script setup>
-  import { ref } from 'vue'
+import { ref, onMounted, reactive } from 'vue'
+import { useRoute } from 'vue-router'
+import FileUploader from '@/components/FileUploader.vue'
+import DGTMessage from '@/utils/message'
+import BlockNoteEditor from '@/components/BlockNoteEditor.vue';
+const route = useRoute()
+
+// 从路由参数中获取 activePlatform
+const activePlatform = ref(route.query.activePlatform || '');
+
+// 上传文件列表
+const uploadedFiles = ref([])
+const uploadUrl = ref('/api/upload') // 实际项目中替换为真实的上传接口地址
+
+const editorContent = ref(
+  [
+    {
+      type: "paragraph",
+      content: [{ type: "text", text: "只读模式" }]
+    },
+    {
+    "id": "378ce968-02c2-4856-888b-c35a355aa84b",
+    "type": "codeBlock",
+    "props": {
+        "language": "text"
+    },
+    "content": [],
+    "children": []
+    }
+  ]
+);
+
+const ruleForm = reactive({
+  name: '',
+})
+// 校验规则
+const rules = reactive({
+  name: [
+    { required: true, message: '请输入工作流标题', trigger: 'blur' },
+  ],
+})
+
+
+
+onMounted(() => {
+});
+
+  // 上传成功处理
+const handleUploadSuccess = (response, rawFile, uploadedFiles) => {
+  DGTMessage.success('文件上传成功')
+  console.log('上传成功:', response)
+}
+
+// 上传失败处理
+const handleUploadError = (error, rawFile, uploadedFiles) => {
+  DGTMessage.error('文件上传失败')
+  console.error('上传失败:', error)
+}
+
+// 上传进度处理
+const handleUploadProgress = (event, file, uploadedFiles) => {
+  console.log('上传进度:', event.percent)
+};
 </script>
+<style lang="scss">
+.workflow-add{
+  .inputBg{
+    background: #F5F7FA !important;
+  }
+  .el-form-item__label{
+    font-size: 16px;
+    color: #333333;
+    font-weight: 400;
+  }
+  .el-input__wrapper {
+    background: #F5F7FA !important;
+    .el-input__inner{
+      height: 44px !important;
+      line-height: 44px !important;
+    }
+  }
+  .payType{
+    background: #EAF0FF;
+    border-radius: 8px 8px 8px 8px;
+    border: 1px solid transparent;
+    padding: 20px 16px;
+    &.active{
+      background: #EAF0FF;
+      border-color: $primary-color;
+      .checkType{
+        border-color: $primary-color;
+      }
+    }
+    .checkType{
+      width: 14px;
+      height: 14px;
+      border:4px solid transparent;
+      border-radius: 50%;
+      background-color: #ffffff;
+    }
+  }
+}
+</style>

+ 18 - 93
src/styles/index.scss

@@ -20,7 +20,7 @@ $danger-color: #e63946; // 危险色(价格、警告等)
 	}
 }
 .container-height {
-  height: calc(100vh - 60px);
+  min-height: calc(100vh - 60px);
 }
 
 
@@ -100,6 +100,9 @@ body{
 wx-image{
 	height: auto;
 }
+.padding8 {
+	padding: 8px
+}
 .padding12 {
 	padding: 12px
 }
@@ -401,7 +404,15 @@ wx-image{
 	justify-content: flex-start;
 	align-items: center;
 	gap: 10px;
-	 flex-wrap:wrap ;
+	flex-wrap:wrap ;
+}
+.gap20{
+	//水平垂直居中-首部对齐 间隙10px
+	display: flex;
+	justify-content: flex-start;
+	align-items: center;
+	gap: 20px;
+	flex-wrap:wrap ;
 }
 //课程网格布局
 .course-grid {
@@ -433,6 +444,9 @@ wx-image{
 .gray{
 	color: #666666;
 }
+.gray999{
+	color: #999999;
+}
 .link{
 	color: #007aff;
 }
@@ -515,8 +529,8 @@ wx-image{
 	line-height: 22px;
 }
 .line_vertical{
-	width: 8px;
-	height: 30px;
+	width: 6px;
+	height: 24px;
 	background-color: $primary-color;
 	border-radius: 4px;
 }
@@ -580,97 +594,8 @@ wx-image{
 	overflow: hidden;
 }
 
-
-.payment-radio {
-  width: 40px;
-  height: 40px;
-
-  .radio-circle {
-    width: 100%;
-    height: 100%;
-    border: 3px solid #ddd;
-    border-radius: 50%;
-    position: relative;
-    transition: all 0.3s;
-
-    &.checked {
-      border-color: $primary-color;
-
-      &::after {
-        content: "";
-        position: absolute;
-        top: 50%;
-        left: 50%;
-        transform: translate(-50%, -50%);
-        width: 20px;
-        height: 20px;
-        background: $primary-color;
-        border-radius: 50%;
-      }
-    }
-  }
-}
 .noData{
 	text-align: center;
 	padding: 30px 0;
 	color: #c8c7cc;
-}
-.serviceLabel{
-	background-color: #ffe8e6;
-	font-size: 25px;
-	color: #E93323;
-	border-radius: 10px;
-	padding: 5px 10px;
-	display: inline-block;
-	// margin-top: 20px;
-	&:not(:last-child){ 
-		margin-right: 10px;
-	}
-}
-
-
-.status_bar {
-    height: var(--height);
-    width: 100%;
-  }
-  .hover-view {
-	  opacity: 0.7;
-  }
-  .p_certification {
-	  width: 124px;
-	  height: 40px;
-	  display: flex;
-	  align-items: center;
-	  justify-content: center;
-	  background: #E9EFFF;
-	  border-radius: 20px;
-	  image {
-		  width: 32px;
-		  height: 32px;
-	  }
-	  view {
-		  color: #0089FF;
-		  font-size: 24px;
-		  margin-left: 4px;
-	  }
-  }
-  
-  .truncate {
-	  white-space: nowrap;
-	  /* 禁止换行 */
-	  overflow: hidden;
-	  /* 隐藏溢出内容 */
-	  text-overflow: ellipsis;
-	  /* 显示省略号 */
-  }
-.tabbar_height{
-	height: calc(120px + constant(safe-area-inset-bottom));
-	height: calc(120px + env(safe-area-inset-bottom));
-}
-.zp-empty-view,.zp-l-container{
-	background-color: #F5F7FA;
-}
-.close_img{
-	width: 32px;
-	height: 32px;
 }