xiao9469 发表于 昨天 09:48

强烈建议上传附件按钮只需要一个 New

上传图片/附件/音频/视频等只要涉及到上传的全部归入到【上传】按钮。


再由dz程序判断(而不是用户判断)上传的是哪种文件,自动对接目前的dz对各种文件的处理就行了。


尽量让用户不用带脑子才是王道。


X5确实已经很牛了。

Crystαl 发表于 昨天 09:49

图片和附件是不同的场景,有时候图片要作为图片特性存在,有时候需要作为非图片特性的文件存在。
       

                        视频音频等的存在是基于外链的(如果你说的是新编辑器里的,那更简单,因为这两有特殊作用,在线播放。附件里原则上是不播放而是下载的文件)
       

                        有需要不带脑子的场景,但也有很多需要带脑子的场景不是吗?不能一杆子打死
       

                        而且这个问题你发过帖子了,也都给你回复过了。何必又纠缠呢?
       

.ce-block {    margin-bottom: 20px;}.ce-block__content,.ce-toolbar__content {        /* max-width:calc(100% - 50px) */        margin-left: auto;    margin-right: auto;}.ce-paragraph {    line-height: 1.6em;    outline: none;    text-indent: 2em;    font-size: 16px;}.ce-paragraph--right {    text-align: right;}.ce-paragraph--center {    text-align: center;}.ce-paragraph--left {    text-align: left;}.ce-paragraph--justify {    text-align: justify;}.ce-paragraph-text-indent {    text-align: justify;}.ce-paragraph:empty::before{content: attr(data-placeholder);color: #707684;font-weight: normal;opacity: 0;}/** Show placeholder at the first paragraph if Editor is empty */.codex-editor--empty .ce-block:first-child .ce-paragraph:empty::before {opacity: 1;}.codex-editor--toolbox-opened .ce-block:first-child .ce-paragraph:empty::before,.codex-editor--empty .ce-block:first-child .ce-paragraph:empty:focus::before {opacity: 0;}.ce-paragraph p:first-of-type{    margin-top: 0;}.ce-paragraph p:last-of-type{    margin-bottom: 0;}.svg-icon {    width: 1em;    height: 1em;}.svg-icon path,.svg-icon polygon,.svg-icon rect {    fill: #4691f6;}.svg-icon circle {    stroke: #4691f6;    stroke-width: 1;}.inline-code {background: rgba(250, 239, 240, 0.78);color: #b44437;padding: 3px 4px;border-radius: 5px;margin: 0 1px;font-family: inherit;font-size: 0.86em;font-weight: 500;letter-spacing: 0.3px;}

拾光 发表于 昨天 09:50

在网站(尤其是 Discuz! 这类社区、内容型平台)的上传功能设计中,将文件分为「图片 / 视频 / 音频 / 附件」四类,看似存在 “附件可兼容其他类型” 的重叠,但本质是基于用户体验、技术架构、业务场景的精细化设计—— 核心目标是「降低用户操作成本、提升系统处理效率、适配不同业务需求」,其合理性和好处可从以下 6 个核心维度展开(结合 Discuz! 社区等实际场景说明):
       

                        一、「用户体验:精准匹配使用场景,降低决策成本」

       

                        普通用户上传文件时,「需求目标明确」但「技术认知有限」,分类设计本质是「替用户预设场景,减少无效选择」:
       

                        场景与功能强绑定:

       

                            

[*]上传「图片」:用户核心需求是「即时预览、插入内容」(如 Discuz! 帖子插图、头像、封面),分类后可直接关联 “预览组件 + 插入编辑器” 功能,无需用户额外操作;

[*]上传「视频 / 音频」:用户核心需求是「播放展示」(如教程视频、语音回复),分类后自动调用播放器组件,支持进度条、音量控制、时长显示,避免 “附件上传后无法直接播放” 的困惑;
[*]上传「附件」:用户核心需求是「供他人下载」(如报告文档、源码压缩包、安装包),分类后重点展示 “文件大小、下载次数、格式说明”,而非预览功能。

                  

                        降低认知负担:

       

                          非技术用户不清楚「.mp4/.jpg/.docx」的技术差异,但能理解「图片 = 插图」「视频 = 可播放」「附件 = 可下载」的场景逻辑。若仅保留 “附件” 单一分类,用户需在上传后手动选择 “是否插入内容 / 是否播放”,操作步骤增加,且易出现 “误将视频当附件上传,导致无法直接播放” 的问题。
       

                        权限与限制可视化:

       

                          不同文件类型的上传限制(大小、格式、数量)不同,分类后可明确告知用户(如 “图片最大 5MB,支持 jpg/png”“视频最大 1GB,仅支持 mp4”),避免用户上传后因格式 / 大小不符合要求而失败,提升操作成功率。
       

                        二、「技术处理:差异化适配,提升系统效率」

       

                          不同文件类型的「后端处理逻辑、资源消耗、依赖组件完全不同」,分类设计可让系统「针对性优化处理流程」,避免资源浪费:
       

                                                                                                                                文件类型
                                                核心技术处理需求
                                                单独分类的好处
                                          
                                                                                      图片
                                                缩略图生成、格式转换(jpg→webp)、水印添加、尺寸压缩、AI 鉴黄
                                                无需对非图片文件执行上述操作,减少服务器 CPU / 存储消耗(如附件无需生成缩略图)
                                          
                                                                                      视频
                                                转码(mp4/webm 适配不同浏览器)、切片(HLS/DASH 流式播放)、封面提取、时长检测、内容审核
                                                单独分配转码资源(如 FFmpeg 集群),避免与普通文件抢占带宽,提升转码效率
                                          
                                                                                      音频
                                                格式转换(mp3/aac)、时长计算、语音识别(违规检测)
                                                轻量化处理,无需占用视频转码的高配置资源
                                          
                                                                                      附件
                                                后缀校验、大小限制、病毒扫描(文档 / 压缩包)、MD5 去重
                                                仅执行基础安全校验,不做复杂处理,提升上传速度
                                          
                              
            
      
   

                        以 Discuz! 社区为例:用户上传帖子插图(图片)时,系统自动生成 3 种尺寸(缩略图 / 中等图 / 原图),并添加社区水印;上传教程视频时,系统自动转码为 mp4 格式(兼容所有浏览器),提取第 3 秒作为封面;上传插件安装包(附件)时,仅校验大小和后缀,扫描病毒后直接存储 —— 若不分类,系统需对所有文件尝试执行 “缩略图生成、转码” 等操作,不仅效率极低,还可能导致非图片文件处理失败(如给.docx 文档转码)。
       

                        三、「业务场景:适配不同使用需求,提升产品实用性」

       

                          不同文件类型的「用途、展示形式、商业价值不同」,分类设计可精准匹配业务场景:
       

                        内容展示场景:

       

                            

[*]图片 / 视频 / 音频需「嵌入内容流」(如帖子、动态、商品详情),支持即时预览 / 播放,提升内容可读性;
[*]附件需「独立下载入口」(如 Discuz! 社区的 “附件下载区”“资源帖下载按钮”),明确其 “下载用途”,避免与正文内容混淆。
                  

                        权限管控场景:

       

                            

[*]普通用户可上传图片 / 小附件(如 10MB 内文档),但上传视频 / 大附件需 VIP 权限(如 Discuz! 的付费资源帖),分类设计便于精细化控制权限;
[*]管理员可批量管理不同类型文件(如批量审核视频内容、清理过期附件、统计图片存储占用),提升运营效率。
                  

                        商业变现场景:

       

                            

[*]视频 / 音频可关联付费播放(如课程视频),附件可关联付费下载(如行业报告),分类设计便于绑定不同的变现规则(如图片免费插入,视频按次付费)。
                  

                        四、「合规与安全:差异化风险管控,降低违规风险」

       

                          不同文件类型的「合规要求、安全风险不同」,分类设计可实现「精准风控」:
       

                      
[*]1. 违规内容审核:
[*]1.1. 图片 / 视频 / 音频是违规内容(色情、暴力、版权侵权)的高发区,需强制接入 AI 审核(如图片鉴黄、视频内容检测、音频违规识别);
[*]1.2. 附件(如文档、压缩包)的风险主要是恶意代码(病毒、木马),需重点执行病毒扫描,无需接入音视频审核,降低审核成本。

[*]2.版权合规管理:
[*]2.1. 音视频需符合版权备案要求(如短视频平台的 ICP 备案),分类设计便于统计音视频数量、报备相关部门;
[*]2.2. 图片需支持版权溯源(如添加水印、记录上传者信息),附件则无需此类操作,简化合规流程。

[*]3. 安全防护:
[*]3.1. 禁止上传高危附件类型(如.exe/.bat/.js,避免恶意代码执行);
[*]3.2. 图片 / 视频 / 音频的高危格式极少(如.svg 图片可能存在 XSS 风险,可单独限制),分类设计便于设置差异化的后缀黑名单。

                           

                        五、「存储与性能:优化资源分配,降低运营成本」

       

                        不同文件类型的「体积、访问频率、存储需求不同」,分类设计可实现「精细化存储管理」:
       

                      
[*]1. 存储方案差异化:
[*]1.1. 图片 / 视频 / 音频:体积大、访问频率高,需用「对象存储(OSS)+ CDN 加速」(如阿里云 OSS、腾讯云 COS),支持多节点分发、缓存加速(如视频切片后通过 CDN 流式播放,减少卡顿);
[*]1.2. 附件:体积较小(或大体积但访问频率低),可存储在普通云存储或本地服务器,无需 CDN 加速,降低存储和带宽成本。

[*]2. 资源清理优化:
[*]2.1. 可按文件类型设置清理规则(如图片保留 3 年,视频保留 1 年,过期附件自动删除);
[*]2.2. 统计不同类型文件的存储占用(如 “视频占总存储的 70%”),便于针对性优化(如压缩图片格式、清理低访问量视频)。

                           

                        六、「扩展性:便于功能迭代,降低系统重构成本」

       

                          分类设计采用「模块化架构」,后续新增文件类型时(如 3D 模型、PPT、PDF 预览),可直接新增分类,无需重构整个上传系统:
       

                            

[*]例:Discuz! 社区后续需支持 “PDF 文档预览” 功能,可新增「文档」分类,单独开发 PDF 预览组件、格式转换逻辑,不影响现有图片 / 视频 / 附件的处理流程;
[*]若仅保留 “附件” 单一分类,新增功能时需修改所有文件的处理逻辑,易引发兼容性问题(如 PDF 预览逻辑影响原附件的下载功能)。
                  

                        总结:看似 “重叠”,实则 “精准适配”

       

                        为什么附件里仍支持上传图片 / 视频 / 音频?本质是「兼容特殊场景」—— 比如用户需要上传 “未压缩的原图(供下载)”“未转码的视频原文件(供专业用户使用)”,此时附件分类作为「通用上传通道」,满足 “无需特殊处理、仅需下载” 的需求。
       

                        这种设计的核心好处是:既通过分类满足 90% 用户的常规场景(快速上传、即时预览 / 播放、便捷下载),又通过附件兼容 10% 的特殊场景,兼顾 “易用性” 和 “灵活性” 。
       

                        对于 Discuz! 这类社区产品而言,这种设计尤为重要:一方面,普通用户发帖子时能快速上传插图、插入视频,提升发帖体验;另一方面,管理员能高效管理不同类型的内容(审核视频、清理附件、统计存储),降低运营成本;同时,还能适配付费资源、版权审核等商业和合规需求,让产品更具实用性和扩展性。
       

.ce-block {    margin-bottom: 20px;}.ce-block__content,.ce-toolbar__content {        /* max-width:calc(100% - 50px) */        margin-left: auto;    margin-right: auto;}.ce-paragraph {    line-height: 1.6em;    outline: none;    text-indent: 2em;    font-size: 16px;}.ce-paragraph--right {    text-align: right;}.ce-paragraph--center {    text-align: center;}.ce-paragraph--left {    text-align: left;}.ce-paragraph--justify {    text-align: justify;}.ce-paragraph-text-indent {    text-align: justify;}.ce-paragraph:empty::before{content: attr(data-placeholder);color: #707684;font-weight: normal;opacity: 0;}/** Show placeholder at the first paragraph if Editor is empty */.codex-editor--empty .ce-block:first-child .ce-paragraph:empty::before {opacity: 1;}.codex-editor--toolbox-opened .ce-block:first-child .ce-paragraph:empty::before,.codex-editor--empty .ce-block:first-child .ce-paragraph:empty:focus::before {opacity: 0;}.ce-paragraph p:first-of-type{    margin-top: 0;}.ce-paragraph p:last-of-type{    margin-bottom: 0;}.svg-icon {    width: 1em;    height: 1em;}.svg-icon path,.svg-icon polygon,.svg-icon rect {    fill: #4691f6;}.svg-icon circle {    stroke: #4691f6;    stroke-width: 1;}.ce-block {        margin-top: 20px;    margin-bottom: 20px;}.ce-block__content,.ce-toolbar__content {        /* max-width:calc(100% - 50px) */        margin-left: auto;    margin-right: auto;}/** * Plugin styles */.ce-header {position: relative;padding: 1px 0px 1px 15px;margin: 0;line-height: 1.25em;outline: none;margin-bottom: 10px;}.ce-header p,.ce-header div {padding: 0 !important;margin: 0 !important;}.ce-header::before {        content: "";        background-color: #155BD5;        width: 6px;        height: 100%;        position: absolute;        left: 0;        -webkit-border-radius: 3px;        -moz-border-radius: 3px;        border-radius: 3px;          background-color: #1A9BFC;    transform: translateY(-50%) rotate(15deg);}/** * Styles for Plugin icon in Toolbar */.ce-header__icon {}.ce-header::before {position: absolute;content: attr(data-placeholder);color: #707684;font-weight: normal;display: none;cursor: text;}.ce-header:empty::before {display: block;}.ce-header:empty:focus::before {display: none;}/* FontSize */h1.ce-header {    font-size: 2.0em;}h2.ce-header {    font-size: 1.7em;}h3.ce-header {    font-size: 1.4em;}h4.ce-header {    font-size: 1.15em;}h5.ce-header {    font-size: 0.95em;}h6.ce-header {    font-size: 0.8em;}/* Alignment*/.ce-header--right {text-align: right;}.ce-header--center {text-align: center;}.ce-header--left {text-align: left;}.ce-header--justify {text-align: justify;}.ce-block {    margin-bottom: 20px;}.ce-block__content,.ce-toolbar__content {        /* max-width:calc(100% - 50px) */        margin-left: auto;    margin-right: auto;}.cdx-list {        margin:0;        outline:none;        display:block;        counter-reset:item;        padding:6px;}.cdx-list__item {        line-height:1.45em;        display:block;        padding-top:8px}.cdx-list__item-children {        display:block;}.cdx-list__item {        outline:none}.cdx-list__item-content {        word-break:break-word;        white-space:pre-wrap;        grid-area:content;        padding-left:8px}.cdx-list__item:before {        counter-increment:item;        white-space:nowrap}.cdx-list-li-container {display: flex;}.cdx-list-ordered .cdx-list__item:before {        /* content:counters(item,".",numeric) "." */}.cdx-list-ordered {        list-style-type: none;        margin-left: -15px;        counter-reset:item;        font-size: 16px;}.cdx-list-unordered {        font-size: 16px;}.cdx-list-unordered .cdx-list__item:before {        content:"•"}.cdx-list-checklist .cdx-list__item:before {        content:""}.cdx-list__settings .cdx-settings-button {        width:50%}.cdx-list__checkbox {        padding-top:calc((1.45em - 1.2em) / 2);        grid-area:checkbox;        width:1.2em;        height:1.2em;        display:flex;        cursor:pointer;        font-size: 16px;}.cdx-list__checkbox svg {        opacity:0;        height:1.2em;        width:1.2em;        left:-1px;        top:-1px;        position:absolute}@media (hover:hover) {        .cdx-list__checkbox:not(.cdx-list__checkbox--no-hover):hover .cdx-list__checkbox-check svg {        opacity:1}}.cdx-list__checkbox--checked-1 {        line-height:1.45em}@media (hover:hover) {        .cdx-list__checkbox--checked-1:not(.cdx-list__checkbox--checked-1--no-hover):hover .cdx-checklist__checkbox-check {        background:#0059AB;        border-color:#0059AB}}.cdx-list__checkbox--checked-1 .cdx-list__checkbox-check {        background:#369FFF;        border-color:#369FFF}.cdx-list__checkbox--checked-1 .cdx-list__checkbox-check svg {        opacity:1}.cdx-list__checkbox--checked-1 .cdx-list__checkbox-check svg path {        stroke:#fff}.cdx-list__checkbox--checked-1 .cdx-list__checkbox-check:before {        opacity:0;        visibility:visible;        transform:scale(2.5)}.cdx-list__checkbox-check {        cursor:pointer;        display:inline-block;        position:relative;        margin:0 auto;        width:1.2em;        height:1.2em;        box-sizing:border-box;        border-radius:5px;        border:1px solid #C9C9C9;        background:#fff}.cdx-list__checkbox-check:before {        content:"";        position:absolute;        top:0;        right:0;        bottom:0;        left:0;        border-radius:100%;        background-color:#369FFF;        visibility:hidden;        pointer-events:none;        transform:scale(1);        transition:transform .4s ease-out,opacity .4s}.cdx-list__checkbox-check--disabled {        pointer-events:none}.cdx-list-start-with-field {        background:#F8F8F8;        border:1px solid rgba(226,226,229,.2);        border-radius:6px;        padding:2px;        display:grid;        grid-template-columns:auto auto 1fr;        grid-template-rows:auto}.cdx-list-start-with-field--invalid {        background:#FFECED;        border:1px solid #E13F3F}.cdx-list-start-with-field--invalid .cdx-list-start-with-field__input {        color:#e13f3f}.cdx-list-start-with-field__input {        font-size:16px;        outline:none;        font-weight:500;        font-family:inherit;        border:0;        background:transparent;        margin:0;        padding:0;        line-height:22px;        min-width:calc(100% - 10px)}.cdx-list-start-with-field__input::placeholder {        color:#797979;        font-weight:500}.ce-block {    margin-bottom: 20px;}.ce-block__content,.ce-toolbar__content {        /* max-width:calc(100% - 50px) */        margin-left: auto;    margin-right: auto;}.tc-wrap {        --color-background:#f9f9fb;        --color-text-secondary:#7b7e89;        --color-border:#e8e8eb;        --cell-size:0px;        --toolbox-icon-size:18px;        --toolbox-padding:6px;        --toolbox-aiming-field-size:calc(var(--toolbox-icon-size) + var(--toolbox-padding)*2);        border:1px solid var(--color-border);        position:relative;        height:100%;        width:100%;        margin-top:var(--toolbox-icon-size);        box-sizing:border-box;        display:grid;        grid-template-columns:calc(100% - var(--cell-size)) var(--cell-size);}.tc-wrap--readonly {        grid-template-columns:100% var(--cell-size)}.tc-wrap svg {        vertical-align:top}@media print {        .tc-wrap {        border-left-color:var(--color-border);        border-left-style:solid;        border-left-width:1px;        grid-template-columns:100% var(--cell-size)}}@media print {        .tc-wrap .tc-row:after {        display:none}}.tc-table {        position:relative;        width:100%;        height:100%;        display:grid;        font-size:14px;        line-height:1.4;}.tc-table:after {        width:calc(var(--cell-size));        height:100%;        left:calc(var(--cell-size)*-1);        top:0}.tc-table:after,.tc-table:before {        position:absolute;        content:""}.tc-table:before {        width:100%;        height:var(--toolbox-aiming-field-size);        top:calc(var(--toolbox-aiming-field-size)*-1);        left:0}.tc-table--heading .tc-row:first-child {        font-weight:600;        border-bottom:2px solid var(--color-border);}.tc-table--heading .tc-row:first-child :empty:before {        content:attr(heading);        color:var(--color-text-secondary)}.tc-table--heading .tc-row:first-child:after {        bottom:-2px;        border-bottom:2px solid var(--color-border)}.tc-add-column,.tc-add-row {        display:flex;        color:var(--color-text-secondary)}@media print {        .tc-add {        display:none}}.tc-add-column {        padding:4px 0;        justify-content:center;        border-top:1px solid var(--color-border);}@media print {        .tc-add-column {        display:none}}.tc-add-row {        height:var(--cell-size);        align-items:center;        padding-left:4px;        position:relative;}.tc-add-row:before {        content:"";        position:absolute;        right:calc(var(--cell-size)*-1);        width:var(--cell-size);        height:100%}@media print {        .tc-add-row {        display:none}}.tc-add-column,.tc-add-row {        transition:0s;        cursor:pointer;        will-change:background-color;}.tc-add-column:hover,.tc-add-row:hover {        transition:background-color .1s ease;        background-color:var(--color-background)}.tc-add-row {        margin-top:1px;}.tc-add-row:hover:before {        transition:.1s;        background-color:var(--color-background)}.tc-row {        display:grid;        grid-template-columns:repeat(auto-fit,minmax(10px,1fr));        position:relative;        border-bottom:1px solid var(--color-border);}.tc-row:after {        content:"";        pointer-events:none;        position:absolute;        width:var(--cell-size);        height:100%;        bottom:-1px;        right:calc(var(--cell-size)*-1);        border-bottom:1px solid var(--color-border)}.tc-row--selected {        background:var(--color-background)}.tc-row--selected:after {        background:var(--color-background)}.tc-cell {        border-right:1px solid var(--color-border);        padding:6px 12px;        overflow:hidden;        outline:none;        line-break:normal;}.tc-cell--selected {        background:var(--color-background)}.tc-wrap--readonly .tc-row:after {        display:none}.tc-toolbox {        --toolbox-padding:6px;        --popover-margin:30px;        --toggler-click-zone-size:30px;        --toggler-dots-color:#7b7e89;        --toggler-dots-color-hovered:#1d202b;        position:absolute;        cursor:pointer;        z-index:1;        opacity:0;        transition:opacity .1s;        will-change:left,opacity;}.tc-toolbox--column {        top:calc(var(--toggler-click-zone-size)*-1);        transform:translateX(calc(var(--toggler-click-zone-size)*-1/2));        will-change:left,opacity}.tc-toolbox--row {        left:calc(var(--popover-margin)*-1);        transform:translateY(calc(var(--toggler-click-zone-size)*-1/2));        margin-top:-1px;        will-change:top,opacity}.tc-toolbox--showed {        opacity:1}.tc-toolbox .tc-popover {        position:absolute;        top:0;        left:var(--popover-margin)}.tc-toolbox__toggler {        display:flex;        align-items:center;        justify-content:center;        width:var(--toggler-click-zone-size);        height:var(--toggler-click-zone-size);        color:var(--toggler-dots-color);        opacity:0;        transition:opacity .15s ease;        will-change:opacity;}.tc-toolbox__toggler:hover {        color:var(--toggler-dots-color-hovered)}.tc-toolbox__toggler svg {        fill:currentColor}.tc-wrap:hover .tc-toolbox__toggler {        opacity:1}.tc-settings .cdx-settings-button {        width:50%;        margin:0}.tc-popover {        --color-border:#eaeaea;        --color-background:#fff;        --color-background-hover:rgba(232,232,235,0.49);        --color-background-confirm:#e24a4a;        --color-background-confirm-hover:#d54040;        --color-text-confirm:#fff;        background:var(--color-background);        border:1px solid var(--color-border);        box-shadow:0 3px 15px -3px rgba(13,20,33,.13);        border-radius:6px;        padding:6px;        display:none;        will-change:opacity,transform;}.tc-popover--opened {        display:block;        animation:menuShowing .1s cubic-bezier(.215,.61,.355,1) forwards}.tc-popover__item {        display:flex;        align-items:center;        padding:2px 14px 2px 2px;        border-radius:5px;        cursor:pointer;        white-space:nowrap;        -webkit-user-select:none;        -moz-user-select:none;        user-select:none;}.tc-popover__item:hover {        background:var(--color-background-hover)}.tc-popover__item:not(:last-of-type) {        margin-bottom:2px}.tc-popover__item-icon {        display:inline-flex;        width:26px;        height:26px;        align-items:center;        justify-content:center;        background:var(--color-background);        border-radius:5px;        border:1px solid var(--color-border);        margin-right:8px}.tc-popover__item-label {        line-height:22px;        font-size:14px;        font-weight:500}.tc-popover__item--confirm {        background:var(--color-background-confirm);        color:var(--color-text-confirm);}.tc-popover__item--confirm:hover {        background-color:var(--color-background-confirm-hover)}.tc-popover__item--confirm .tc-popover__item-icon {        background:var(--color-background-confirm);        border-color:rgba(0,0,0,.1);}.tc-popover__item--confirm .tc-popover__item-icon svg {        transition:transform .2s ease-in;        transform:rotate(90deg) scale(1.2)}.tc-popover__item--hidden {        display:none}@keyframes menuShowing {        0% {        opacity:0;        transform:translateY(-8px) scale(.9)}70% {        opacity:1;        transform:translateY(2px)}to {        transform:translateY(0)}}.inline-code {background: rgba(250, 239, 240, 0.78);color: #b44437;padding: 3px 4px;border-radius: 5px;margin: 0 1px;font-family: inherit;font-size: 0.86em;font-weight: 500;letter-spacing: 0.3px;}
页: [1]
查看完整版本: 强烈建议上传附件按钮只需要一个 New