VS.NET2005 CrystalReport PrintMode

VS.NET2005 CrystalReport的打印模式分为Pdf和ActiveX两种,打印模式的设置在CrystalReportViewer.PrintMode 属性中。

1、PDF模式的打印需在服务端及客户端安装pdf格式阅读器。

2、ActiveX模式:ActiveX 打印控件允许使用者将报表直接打印至本机打印机。使用ActiiveX模式需要在Web.config的<configuration>节中添加如下配置信息:

<configSections>
    <sectionGroup name="businessObjects">
      <sectionGroup name="crystalReports">
        <section name="printControl" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, Custom=null" />
      </sectionGroup>
    </sectionGroup>
  </configSections>
  <businessObjects>
    <crystalReports>
      <printControl>
        <add key="url" value="http://localhost:5760/web/PrintControl.cab" />
      </printControl>
    </crystalReports>
  </businessObjects>

PrintControl.cab 档案可以从 Business Objects 技术支持网站下载取得,并可以将 cab 档案放在 本地Web 服务器虚拟目录中,以供 URL 存取之用。

PrintControl.cab 档案的下载地址:http://support.businessobjects.com/CRforVS2005/PrintControl.cab

可以将PrintControl.cab 档案显示在页面上,在Web页面Html中加入如下代码:

<object id="CrystalPrintControl" classid="CLSID:BAEE131D-290A-4541-A50A-8936F159563A" codebase="http://127.0.0.1/rpt/PrintControl.cab" #Version="10,2,0,1078" viewastext></object>

#Version是版本号,如果你是其他的版本将版本号修改一下即可。

可以看到它是一个CrystalReport的一个打印控件。

把这个插件arview2.cab直接放在这个页面相同的文件夹里就是下面的写法

<object id="arv" codebase="arview2.cab #version=2.4.1.1283" width="100%" classid="clsid:8569D715-FF88-44BA-8D1D-AD3E59543DDE" viewastext style="height: 100%">
    <param name="_ExtentX" value="26141">
    <param name="_ExtentY" value="11959">
   </object>


下面转自csdn论坛

在服务器上装上
1、CRRedist2005_x86.msi
2、CRREdist2005_x86_chs.msi
3、CrystalReports10_NET_EmbeddedInstall.msi(序列号:A6860-0900000-U70005X)  

注册表的PrintJobLimit:0,不然会有使用限制。

下载PrintControl.cab
建个.html
<html>
<object   id= "CrystalPrintControl "   classid= "CLSID:BAEE131D-290A-4541-A50A-8936F159563A "   codebase= "http://192.168.0.1/PrintControl.cab "   #Version= "10,2,0,1078 "   viewastext> </object>
</html>

客户端第一次打印时调用一下,安装ActiveX控件~

<template> <div id="EIdrDiseaseProgressNoteList"> <Row justify="end"> <Col> 当前:{{ mappingData.printMode[printMode] }} <Button class="qimeng-button yiyan-margin-right-sm" type="primary-outline" shape="circle" @click="printModeChange" >切换</Button > <Button class="qimeng-button" type="primary-outline" shape="circle" :id="handPricePrintId" v-print="print" >打印</Button > </Col> </Row> <div :id="`${print.id}`" class="preview-container"> <div class="page-header"> <img class="hospital-name" :src="pageHeaderImgUrl" /> <div class="record-title">病程记录</div> <Row justify="space-between" class="dividing-line"> <Col>姓名: {{ patientName }}</Col> <Col>病区: {{ patientSdeptName }}{{ patientWdeptName }}</Col> <Col>床号: {{ patientAdmissionBed }}</Col> <Col>住院号: {{ patientAdNum }}</Col> </Row> <div class="record-title" style=""> {{ mappingData.printMode[printMode] }} </div> </div> <table> <!-- 页眉 --> <!-- 占位,给页眉留出位置 --> <thead> <tr> <td><div class="page-header-space"></div></td> </tr> </thead> <!-- start: 正文 --> <tbody> <tr> <td> <div class="page" v-if="printModeIsDaily"> <!-- 内容 - 所有记录连续显示 --> <div v-for="(entry, entryIndex) in progressNoteList" :key="entryIndex" > <Row :gutter="5"> <Col v-if="entry.cfsj" class="entry-content"> <span>{{ entry.cfsj }}</span></Col > <Col v-if="entry.bcjlmc" class="entry-content"> <span> {{ entry.bcjlmc }}</span> </Col> </Row> <div v-if="entry.hzjbqk"> <div class="entry-content"> {{ entry.hzjbqk }} </div> </div> <!-- <div v-if="entry.zyzd" class="prescription"> <div class="medicine-list">中医诊断:{{ entry.zyzd }}</div> </div> <div v-if="entry.xyzd" class="prescription"> <div class="medicine-list">西医诊断:{{ entry.xyzd }}</div> </div> --> <Row justify="end" v-if="entry.ysqm"> <Col class="signature-span"> <span>医师签名:</span> </Col> <Col> <div class="image-value-wrapper"> <img class="img" :src="entry.ysqm" /></div ></Col> </Row> </div> </div> <div class="page" v-if="printModeIsFirst"> <!-- 内容 - 所有记录连续显示 --> <div class="entry-content"> <span>记录时间:{{ firstProgressNote.jlsj }}</span> </div> <div class="entry-content"> 患者{{ firstProgressNote.hzxm }},{{ firstProgressNote.xb }},{{ firstProgressNote.nl }},{{ firstProgressNote.xb }},{{ firstProgressNote.dz }}人,因“{{ firstProgressNote.zs }}”入院,由门诊拟“ {{ firstProgressNote.zd }}”于{{ firstProgressNote.rysj }}入院。 </div> <div class="entry-content"> <span>一.病历特点: </span> </div> <div class="entry-content"> {{ firstProgressNote.zkjc1 }} </div> <div class="entry-content"> 【查体】<span>{{ firstProgressNote.zkjc2 }}</span> </div> <div class="entry-content"> <span>【辅助检查】{{ firstProgressNote.fzjc }}</span> </div> <div class="entry-content"> <span> 二.拟诊讨论:(列出主要诊断依据及鉴别诊断) </span> </div> <div class="entry-content"> 1.中医辨证辨病依据:{{ firstProgressNote.zybzbbyj }} </div> <div class="entry-content"> 2.中医鉴别诊断:{{ firstProgressNote.zyjbzd }} </div> <div class="entry-content"> 3.西医诊断依据:{{ firstProgressNote.xybzbbyj }} </div> <div class="entry-content"> 4.西医鉴别诊断:{{ firstProgressNote.xyjbzd }} </div> <div class="entry-content"> <span> 【初步诊断】 </span> </div> <div class="entry-content"> 中医诊断:{{ firstProgressNote.zyzd }} </div> <div class="entry-content"> 西医诊断:{{ firstProgressNote.xyzd }} </div> <div class="entry-content"> <span> 【诊疗计划】 </span> </div> <div class="entry-content"> 1、{{ firstProgressNote.zlfa1 }} </div> <div class="entry-content"> 2、{{ firstProgressNote.zlfa2 }} </div> <div class="entry-content"> 3、{{ firstProgressNote.zlfa3 }} </div> <div class="entry-content"> 4、{{ firstProgressNote.zlfa4 }} </div> <div class="entry-content"> 5、{{ firstProgressNote.zlfa5 }} </div> <Row justify="end" v-if="firstProgressNote.ysqm"> <Col class="signature-span"> <span>医师签名:</span> </Col> <Col> <div class="image-value-wrapper"> <img class="img" :src="firstProgressNote.ysqm" /></div ></Col> </Row> </div> </td> </tr> </tbody> </table> </div> </div> </template> <script> import Print from "vue-print-nb"; import { logger, YiyanCommonConstants, YiyanMessageUtil, YiyanTimeUtil, YiyanUserInfoService, } from "yiyan-web-classlibrary"; import api from "../../../api/yiyan-modules-api/yiyan-disease-progress-note-list-api"; /** 日常病程记录 */ const DAILY_MODE = 1; /** 首次病程记录 */ const FIRST_MODE = 2; export default { directives: { Print, }, props: { patientName: { type: String, }, // 患者编号 patientNum: { type: [String, Number], }, // 患者病区名称 patientWdeptName: { type: String, }, // 患者床位号 patientAdmissionBed: { type: String, }, // 患者专科名称 patientSdeptName: { type: String, }, patientAdNum: { type: String, }, emrId: { type: Number, }, }, computed: { printModeIsDaily() { return this.printMode == DAILY_MODE; }, printModeIsFirst() { return this.printMode == FIRST_MODE; }, }, data() { return { print: { id: "YiyanDiseaseProgressNoteListPrintId", preview: false, popTitle: "龙港中医院病程记录", }, handPricePrintId: "handPricePrintId", // 病程记录列表 progressNoteList: [], // 首次病程记录 firstProgressNote: {}, mappingData: { printMode: { 1: "日常病程记录", 2: "首次病程记录", }, }, // printMode: DAILY_MODE, printMode: FIRST_MODE, baseUserInfo: {}, // 页眉url // pageHeaderImgUrl: // "http://172.30.2.120:50201/autoupdate/fdfs/download?path=M00/00/3B/rB4Cfmjaf2SAUIE0AAAm5v_soYo917.png&name=龙港中医院(1).png", pageHeaderImgUrl: "https://yiyan-dev-pub.obs.cn-east-3.myhuaweicloud.com/B11-USER-AUTOGRAPH/1478/%E6%B2%88%E6%B4%81.jpg", }; }, methods: { /** * 根据emrId获取病程信息 * * @returns * @author kangdongliang */ async getProgressNote() { this.progressNoteList = []; const result = await api.getProgressNote(this.emrId); if (result.code != YiyanCommonConstants.SUCCESS_CODE) { YiyanMessageUtil.warning("获取病程信息失败!", result.msg); logger.info("KK-------获取病程信息失败!", result); return; } this.progressNoteList = result.data.dailyProgressNoteList.map((item) => { item.cfsj = item.cfsj ? YiyanTimeUtil.transferTimeFormat(item.cfsj, "yyyy-MM-DD HH:mm") : ""; return item; }); this.firstProgressNote = result.data.initialProgressNote; }, /** * 获取页眉图片 * * @returns * @author kangdongliang */ async getPageHeaderImg() { this.firstProgressNote = {}; const result = await api.getPageHeaderImg(this.baseUserInfo.user.orgId); if (result.code != YiyanCommonConstants.SUCCESS_CODE) { logger.info("KK-------病程记录获取页眉图片失败!", result); return; } if ( result.data && result.data.recordStatus == YiyanCommonConstants.STATUS_IN_USE ) { this.pageHeaderImgUrl = result.data.filePath; } }, /** * 切换病程模式 * * @returns * @author kangdongliang */ printModeChange() { if (this.printModeIsDaily) { this.printMode = FIRST_MODE; return; } if (this.printModeIsFirst) { this.printMode = DAILY_MODE; return; } }, }, async mounted() { this.baseUserInfo = await YiyanUserInfoService.getUserInfo(); await this.getPageHeaderImg(); await this.getProgressNote(); }, }; </script> <style lang="less" scoped> .preview-container { height: 100%; width: 100%; overflow-y: auto; overflow-x: hidden; background: white; padding: 0 10px; padding-bottom: 20px; font-family: "SimSun", "宋体", serif; text-align: justify; /* 两端对齐 */ line-height: 1.5; /* 设置行高以改善可读性 */ word-wrap: break-word; /* 允许长单词换行 */ font-size: 16px; } /* 页眉 */ .page-header { text-align: center; width: 100%; box-sizing: border-box; display: block; align-items: center; .dividing-line { border-bottom: 2px solid #333; } height: 135px !important; } // 记录区样式 .hospital-name { margin-bottom: 10px; width: 160px; height: 32px; } .record-title { font-size: 18px; font-weight: bold; } .entry-content { text-indent: 2em; margin: 5px 0; text-align: justify; } .medicine-list { margin: 5px 0; } .image-value-wrapper { width: 100px; height: 40px; .img { width: 100%; height: 100%; vertical-align: middle; } } .signature-span { display: flex; align-items: end; } // 记录区样式 /* 打印样式 */ @media print { body { background: white; counter-reset: pageNumber; /* 在body中重置计数器 */ } @page { size: A4; margin-bottom: 2.2cm; counter-increment: pageNumber; /* 每页计数器值 +1 */ @bottom-center { content: "第" counter(pageNumber) "页"; /* 返回计数器的当前值的字符串 */ font-family: "SimSun", "宋体", serif; } @top-center { height: 0; } } .page { padding: 0; margin: 0; height: 100%; } .page-header-space { height: 135px; width: 100%; max-width: 210mm; } /* 打印时页眉固定在每页顶部 */ .page-header { position: fixed; top: 0; left: 0; text-align: center; height: 135px; /* 明确定义高度 */ z-index: 1000; max-width: 210mm; } .preview-container { max-width: 210mm; } } </style> 在提供的打印样式代码中,第一页页眉和后续页页眉高度不一致
最新发布
11-12
<think> 我们面对的问题:在使用vue-print-nb插件进行打印时,第一页的页眉高度和后续页的页眉高度不一致。 根据引用内容,我们知道vue-print-nb是一个用于Vue的打印插件,但它可能对CSS的支持有限(如引用[1]提到不能打印一些CSS3样式)。此外,引用[3]提到在设置打印样式时需要注意一些事项。 分析问题:页眉高度不一致通常是由于打印分页导致的,可能是由于第一页的页眉使用了不同的样式(比如上边距)而后续页使用了默认的页眉样式。 解决方案思路: 1. 使用CSS的打印媒体查询(@media print)来调整打印样式。 2. 特别注意页眉元素在分页时的表现,可以使用CSS的page-break属性来控制分页。 3. 在打印样式中,使用@page规则来设置页面边距,特别是第一页和其他页的边距设置。 但是,@page规则中有一个伪类:first可以用于设置第一页的样式,:left和:right可以设置左右页面(当双面打印时),但通常我们无法直接为后续页设置一个统一规则(除了第一页以外的页面)。 因此,我们可以尝试: - 使用@page :first 来设置第一页的样式,包括页眉区域。 - 使用@page 设置所有其他页的样式。 然而,在标准CSS中,我们无法直接设置“除第一页之外”的页面的页眉高度,但我们可以通过设置第一页的特殊样式,然后其他页面使用统一的样式。 步骤: 1. 在打印样式中,为第一页单独设置页眉高度,其他页面设置另一个高度。 2. 确保页眉元素在打印时是固定的,可能需要使用position: fixed(但注意打印时fixed元素会在每一页重复)。 但是,根据引用[1]中提到的,vue-print-nb不能打印一些CSS3样式,所以我们需要谨慎使用。 另一种思路:不使用页眉元素,而是将页眉设计在内容区域,然后通过控制每页的内容来模拟页眉。但这需要复杂的内容分页控制。 考虑到vue-print-nb插件的工作原理,它实际上是将要打印区域的内容按照打印样式渲染,然后调用浏览器的打印功能。因此,我们可以使用CSS的@page规则。 具体CSS代码示例: ```css /* 设置所有页面的页边距,包括页眉位置 */ @page { margin-top: 100px; /* 这个上边距会影响到页眉的位置 */ } /* 设置第一页的上边距 */ @page :first { margin-top: 50px; /* 第一页的上边距设置小一点,那么页眉就会高一点?注意:这里调整的是整个页面的上边距,而不是页眉元素的高度 */ } ``` 但是,这里注意:我们调整的是整个页面的上边距,而不是单独的页眉元素。所以如果我们的页眉是放在内容区域顶部的一个元素,那么第一页的这个元素会距离页面顶部50px,而其他页的页眉元素距离页面顶部100px。这样就会导致第一页的页眉位置和其他页不同。 然而,我们的需求是页眉高度不一致,也就是页眉元素在页面上的垂直位置不一致。所以我们可以通过设置不同的上边距来调整。 但是,如果页眉是使用position: fixed固定在页面顶部的,那么我们需要调整固定定位的top值。但是,在打印时,固定定位的元素会在每一页都出现,并且相对于每一页的页面顶部定位。 因此,我们可以这样写: ```css @media print { .header { position: fixed; top: 0; left: 0; width: 100%; } /* 第一页的页眉需要调整 */ @page :first { margin-top: 50px; /* 设置第一页的上边距,这样内容(包括固定定位的页眉)会整体下移,但固定定位的页眉仍然在页面顶部(0位置),所以看起来页眉离内容顶部的距离变大了? */ } @page { margin-top: 100px; } } ``` 但是,这样设置后,固定定位的页眉并不会因为@page的margin-top而改变位置,因为固定定位是相对于页面视口的。所以,我们需要调整固定定位元素的位置: 我们可以为第一页的页眉设置一个特定的类,然后通过CSS选择器来改变它的位置。然而,我们无法在CSS中直接选择第一页上的固定元素(因为固定元素在每一页都存在)。因此,我们可能需要将第一页的页眉和其他页的页眉用不同的元素表示,或者通过脚本在打印时动态修改。 考虑到vue-print-nb的局限性,我们可能无法完美解决。引用[1]提到,如果有更好的解决办法请留言,说明这个问题可能没有非常成熟的方案。 替代方案:使用一个隐藏的iframe来打印,这样可以完全控制打印样式,但实现复杂。 因此,我们尝试一个更简单的方案:不使用固定定位的页眉,而是将页眉作为内容的一部分,然后通过分页控制,在每一页的内容顶部都放置一个页眉。这样我们可以通过CSS控制每一页的页眉高度一致。但需要确保分页时页眉不会被截断,并且在每一页都重复。 如何实现每一页重复页眉? 我们可以使用表格的thead,或者使用CSS属性: ```css @media print { .page-break { page-break-before: always; } .header { /* 作为内容的一部分,在每一页开始处放置一个.header */ /* 但这样需要在每一页的内容开始处都添加一个.header,可以通过循环生成 */ } } ``` 但是,这需要我们在内容结构上做调整,将内容分成多个页面块,每个块开始之前加一个页眉。这样,我们可以控制每个块的页眉高度一致。 考虑到时间,我们可能更希望用一个简单的方法。 根据引用[3],在vue3-print-nb中,打印id需要放在单独的一个div上,否则样式会错乱。所以我们可以确保打印区域是一个独立的div。 因此,我建议: 1. 调整页眉的样式,避免使用固定定位(fixed),而是使用相对定位或静态定位,将页眉作为内容的一部分。 2. 然后使用分页控制,确保每一页的内容都包含一个页眉,并且每个页眉的高度相同。 例如,我们可以这样设计内容结构: ```html <div id="printArea"> <div class="page"> <div class="header">页眉</div> <div class="content">第一页内容...</div> </div> <div class="page"> <div class="header">页眉</div> <div class="content">第二页内容...</div> </div> <!-- 更多页 --> </div> ``` 然后,在CSS中设置: ```css .page { page-break-after: always; /* 每一页之后分页 */ } .header { height: 50px; /* 固定高度 */ } ``` 这样,每一页的页眉高度就一致了。但是需要手动分页,并且内容需要按页组织。 如果内容不能预先分页,那么可能需要使用JavaScript动态分页(计算内容高度,然后分割成多个页面),这比较复杂。 结论:根据引用内容,vue-print-nb对打印样式的支持有限,因此我们可能需要调整打印内容的结构,使用分页块来确保每一页都有相同高度的页眉区域。 如果用户希望保持现有的内容结构(即不手动分页),那么可能无法完美解决。但是,我们可以尝试使用@page规则来调整第一页和其他页的上边距,使得页眉位置看起来一致,前提是页眉不是固定定位。 具体做法: 1. 移除页眉的固定定位,让它成为打印内容区域的一部分,位于内容的最顶部。 2. 然后通过设置@page的margin-top为0(因为页眉已经在内容区域了,所以不需要页面的上边距),然后通过内容区域的上内边距来模拟页眉的高度。 3. 但是这样,页眉会在每一页都出现吗?不会,因为只有内容顶部有一个页眉。所以我们需要在分页时,在每一页的内容顶部都插入一个页眉,这又回到了手动分页。 所以,我建议采用手动分页的方式,并确保每一页都有相同的页眉结构。 因此,代码调整如下: 在Vue模板中,将打印内容按照分页组织: ```html <div id="printContent"> <div v-for="(page, index) in pages" :key="index" class="page"> <div class="header">这是页眉</div> <div class="page-content"> <!-- 当前页的内容 --> {{ page.content }} </div> </div> </div> ``` 在CSS中: ```css @media print { .page { page-break-after: always; } .header { height: 100px; /* 固定高度 */ } } ``` 这样,每一页的页眉高度就一致了。 但这样需要将内容分割成多个页面(pages数组),这可以通过一个函数在内容变化时动态分页(根据内容高度和页面高度计算分页点)。 由于时间有限,且问题重点在样式,这里不展开动态分页的代码。 如果用户希望避免手动分页,那么可能无法解决第一页和后续页页眉高度不一致的问题,因为vue-print-nb的局限性。 因此,我建议采用手动分页的方式,并固定每一页的页眉。 如果用户不能接受手动分页,那么可以尝试以下CSS方案(但效果可能有限): ```css @media print { /* 设置第一页的上边距和页眉高度 */ @page :first { margin-top: 100px; } @page { margin-top: 100px; /* 其他页面也设置相同的上边距 */ } /* 假设页眉是固定定位 */ .header { position: fixed; top: 0; left: 0; width: 100%; height: 100px; /* 固定高度 */ } } ``` 这样,第一页和其他页的页眉都会固定在页面顶部,并且由于页面设置了上边距,内容不会覆盖页眉。但是,固定定位在打印时可能会出现问题,特别是不同浏览器支持度不同。 综上,最可靠的方案还是将页眉作为内容的一部分,并使用分页块(.page)来组织。 请根据实际需求选择方案。 </think> 针对使用 `vue-print-nb` 时出现的第一页页眉与后续页页眉高度不一致问题,以下是完整的解决方案: ### 问题原因分析 1. **浏览器打印机制差异**:浏览器在打印时会将内容分页,第一页和后续页可能应用不同的默认边距 2. **CSS 继承特性**:后续页的页眉可能继承父容器样式,而第一页受 `@page` 规则影响更大 3. **插件渲染限制**:`vue-print-nb` 对 CSS3 打印样式的支持有限(参考引用[1]) ### 解决方案 在打印样式中添加以下 CSS 规则(需放在 `@media print` 媒体查询中): ```css /* 统一所有页面的页眉高度 */ @page { margin-top: 100px; /* 控制页眉位置 */ } /* 第一页特殊处理(可选) */ @page :first { margin-top: 100px; /* 与@page保持一致 */ } .header { position: fixed; top: 0; height: 50px; /* 固定高度 */ width: 100%; } ``` ### Vue 组件实现示例 ```vue <template> <div> <!-- 打印区域 --> <div id="printArea"> <!-- 页眉 --> <div class="header">统一高度的页眉内容</div> <!-- 正文内容 --> <div v-for="(item,index) in 50" :key="index"> 正文行 {{ item }} </div> </div> <!-- 打印按钮 --> <button v-print="printConfig">打印</button> </div> </template> <script> export default { data() { return { printConfig: { id: "printArea", popTitle: "文档标题", extraCss: ` @media print { @page { margin-top: 100px; } .header { position: fixed; top: 0; height: 50px; border-bottom: 1px solid #000; } } ` } }; } }; </script> <style scoped> /* 屏幕样式 */ .header { display: none; /* 屏幕不显示 */ } @media print { /* 打印时显示固定页眉 */ .header { display: block !important; } /* 防止正文覆盖页眉 */ body { padding-top: 60px; } } </style> ``` ### 关键技巧说明 1. **`@page` 规则**:统一设置所有页面的打印边距 2. **`position: fixed`**:确保页眉在每页重复出现 3. **`top: 0`**:固定到页面顶部 4. **媒体查询隔离**:使用 `@media print` 隔离打印样式 5. **`v-print` 配置**:通过 `extraCss` 注入打印专属样式 ### 调试建议(参考引用[3]) 1. 浏览器打印预览中使用 **Ctrl+Shift+P** 打开打印预览调试 2. 在打印样式中添加临时边框辅助调试: ```css .header { border: 1px solid red; } ``` 3. 调整 `margin-top` 值时以 **5px** 为增量微调 4. 使用 `page-break-inside: avoid;` 防止内容被分割 > **注意**:如果使用 Element UI 等组件库,需注意其样式可能影响打印效果(参考引用[1]),建议打印时使用原生 HTML 元素
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值