converter.vue 47 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178
  1. <template>
  2. <div class="page-converter">
  3. <div class="date-tips flex content-center justify-center py-6px">
  4. <img src="http://cn-file.17pdf.com/website/common/ic_notice.svg" class="align-middle">
  5. <div class="text-container">
  6. <span class="text">
  7. 转档后的文件支持在云端保留24小时<span v-if="userInfo.name">,<span v-if="userInfo?.subscriberType === 1">会员尊享5G容量,</span>请在24小时内下载文件至本地永久保存</span>
  8. </span>
  9. <span v-if="userInfo?.subscriberType === 1" class="vip tip">
  10. <img src="http://cn-file.17pdf.com/website/common/ic_info.svg" alt="">
  11. <div class="tip-text">
  12. 若已有文件大小超出5G,将按转档时间计算(从最近一次转档往过去推算),即保留最近的5G容量文件,超出部分文件将不再保留
  13. </div>
  14. </span>
  15. </div>
  16. </div>
  17. <h1 class="text-48px text-opacity-100 font-500 text-[#3333] mt-48px mb-10px text-center">文件转换器</h1>
  18. <h2 class="text-20px text-center text-[#666] mt-20px font-normal">PDF文件格式转换器,一键转档,支持批量转换,精准快速。</h2>
  19. <div class="text-center mb-80px">
  20. <a
  21. class="mt-20px text-[#4D4D4D] text-16px font-600 inline-flex items-center leading-22px hover:text-$btn-color-primary hover:underline"
  22. href="https://www.compdf.com/pdf-conversion-sdk?utm_source=anroidapp&utm_medium=17pdfweb&utm_campaign=pdfsdk" target="_blank">由 ComPDFKit Conversion SDK 提供技术支持
  23. <svg class="ml-8px" width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
  24. <path d="M6 12.9567L10.714 8.24261L6 3.52856" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path>
  25. </svg>
  26. </a>
  27. </div>
  28. <div class="transfer-container-wrap">
  29. <div class="index-converter w-[80%] h-700px relative top-0 left-[50%] -ml-[40%]">
  30. <div class="transfer-container absolute w-full h-auto my-0 -mx-15px bg-white pb-60px">
  31. <button type="button" class="close hidden" data-dismiss="modal" aria-label="Close">
  32. <span aria-hidden="true">×</span>
  33. </button>
  34. <div class="recharge py-0 px-[10%] h-48px mx-0 mt-24px mb-14px absolute right-0 -top-70px z-2">
  35. <span @click="handlSubmit($event, 'buy')" class="recharge-btn float-right bg-white border border-[#ff4f4f] boder-solid text-16px py-7px px-18px rounded-4px mt-4px cursor-pointer hover:bg-[#ff4f4f]">
  36. <a class="text-[#ff4f4f] no-underline leading-normal">充值</a>
  37. </span>
  38. <div class="need-volume float-right right-48px text-16px text-[#666] leading-48px mr-20px">
  39. 所需券:
  40. <span class="text-[#0dd299] text-16px" :class="{'text-red-500': requiredCoupon > userInfo?.points}">
  41. {{ requiredCoupon }}券
  42. </span>
  43. / 剩余券:
  44. <span class="text-[#0dd299] text-16px">
  45. {{ Object.keys(this.userInfo).length === 0 ? 0 : userInfo.points }}券
  46. </span>
  47. </div>
  48. </div>
  49. <div class="transfer-panel">
  50. <div>
  51. <form enctype="multipart/form-data">
  52. <input type="hidden" name="folder" value="converter/input"/>
  53. <!-- 转档框 -->
  54. <div class="file-input theme-explorer file-input-ajax-new h-380px mt-17px py-0 px-[10%]">
  55. <div class="file-preview rounded-5px w-[100%] h-[100%]">
  56. <div ref="drag" @drop="handleEvent" @dragleave="handleEvent" @dragenter="handleEvent" @dragover="handleEvent"
  57. class="file-drop-zone border border-dashed border-[#d1d1d1] rounded-4px h-[100%] text-center align-middle overflow-y-auto">
  58. <div v-show="fileList.length <= 0" class="file-drop-zone-title text-[#999] text-16px leading-[1.428571429] pt-222px cursor-default">
  59. <div></div>
  60. 点击从电脑上传文件或把文件拖到这里
  61. <p class="text-14px leading-[1.428571429]">(支持PDF to Word、PPT、Excel、TXT、JPG/PNG无限次数转换)</p>
  62. </div>
  63. <table id="table-fileinput" class="table table-hover w-[100%] max-w-[100%]">
  64. <thead v-show="fileList.length > 0">
  65. <tr class="h-40px bg-[#eee]">
  66. <th class="!w-[5.5%]"></th>
  67. <th class="!text-left w-[40.5%]">文档名</th>
  68. <th class="!w-[13%]">大小</th>
  69. <th class="!w-[13%]">所需券</th>
  70. <th class="!w-[9.5%]">转为</th>
  71. <th class="!w-[13%]">状态</th>
  72. <th class="!w-[4.5%]"></th>
  73. </tr>
  74. </thead>
  75. <tbody v-show="fileList.length > 0" class="file-preview-thumbnails cursor-default">
  76. <tr v-for="(item, index) in fileList" id="preview-1668340925733-0" :key="index" class="file-preview-frame explorer-frame kv-preview-thumb w-100px h-38px hover:bg-[#f5f5f5]" data-fileindex="0" data-template="pdf" :title="item.name">
  77. <td class="file-details-cell">{{ index+1 }}</td>
  78. <td class="file-details-cell !text-left">
  79. <div class="explorer-caption max-w-260px truncate block text-[#777]" title="test.pdf">{{ item.name }}</div>
  80. </td>
  81. <td class="file-details-cell text-[#999]">{{ getfilesize(item.size) }}</td>
  82. <td class="file-details-cell points">{{ userInfo?.subscriberType === 1 ? 0 : item.price }}</td>
  83. <td class="file-details-cell select w-106px">
  84. <select v-show="item.status !== 6" v-model="item.output" class="transfer-select appearance-none text-center min-w-90px" @change="changeOutput(item, index)" :disabled =" !changeFileFlag">
  85. <option value="png" class="text-center">PNG</option>
  86. <option value="xlsx" class="text-center">XLSX</option>
  87. <option value="pptx" class="text-center">PPTX</option>
  88. <option value="docx" class="text-center">DOCX</option>
  89. <option value="txt" class="text-center">TXT</option>
  90. <option value="jpg" class="text-center">JPG</option>
  91. </select>
  92. <span v-show="item.status == 6">{{ item.output.toUpperCase() }}</span>
  93. </td>
  94. <td class="file-details-cell state text-14px text-[#878787]" v-html="fileStatus(item, index)"></td>
  95. <!-- <td v-else class="file-details-cell state text-14px text-red-500">转换失败<img src="/converter/menu_ic_pdfconvert.png" @click="rechangeFile" /></td> -->
  96. <td class="file-actions-cell w-50px p-0">
  97. <div class="file-actions text-center">
  98. <div class="file-footer-buttons" @click="deleteFile(index)" v-if="changeFileFlag">
  99. <button type="button" class="kv-file-remove btn btn-xs btn-default bg-inherit !border-none pr-7px py-1px pl-5px text-12px leading-normal rounded-3px" title="删除文件"><i class="pdf-removeicon"></i></button>
  100. </div>
  101. </div>
  102. </td>
  103. </tr>
  104. </tbody>
  105. </table>
  106. <div class="clearfix"></div>
  107. <div class="file-preview-status text-success text-center text-[#3c763d]"></div>
  108. </div>
  109. </div>
  110. <div class="kv-upload-progress hide">
  111. <div class="progress overflow-hidden h-20px mb-20px bg-[#f5f5f5] rounded-4px ring-inset-2 ring-[rgba(0,0,0/10%)]">
  112. <div class="progress-bar progress-bar-success progress-bar-striped active w-0 bg-[#5cb85c]" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100">
  113. 0%
  114. </div>
  115. </div>
  116. </div>
  117. <div class="input-group file-caption-main w-[100%] -top-450px relative table border-separate">
  118. <div v-show="changeFileFlag" class="input-group-btn relative text-0px whitespace-nowrap !flex">
  119. <div tabindex="500" class="btn btn-file" :class="{'btn-file-left' : fileList.length > 0}" v-if="changeFileFlag">
  120. <div class="add-file" :class="{'add-file-left':(fileList.length > 0)}">
  121. {{ fileList.length > 0 ? '添加文件' : '' }}
  122. </div>
  123. <input id="fileinput-explorer" ref="file" name="file" accept=".pdf" title="上传文件" type="file" multiple=""
  124. class="absolute top-0 right-0 p-0 m-0 min-w-[100%] h-[100%] w-90px text-right opacity-0 bg-none bg-repeat bg-scroll block outline-none border-0 cursor-pointer"
  125. @change="addFile($event)" @click="handlSubmit($event, '')"/>
  126. </div>
  127. <div v-show="fileList.length > 0 && changeFileFlag" class="inline-block ml-30px bg-white border border-[#ff4f4f] boder-solid text-16px py-7px px-18px rounded-4px mt-4px cursor-pointer text-[#ff4f4f] leading-normal hover:bg-[#ff4f4f] hover:text-white"
  128. @click="deleteAllFile">清空</div>
  129. </div>
  130. </div>
  131. </div>
  132. </form>
  133. </div>
  134. <div class="transfer-btn mt-30px h-64px text-center">
  135. <div class="cursor-not-allowed inline-block">
  136. <span :class="{'disabledBtn' : !checkbox || !changeFileFlag||fileList.length === 0 }" class="btn transfer-start-btn bg-[#ff524f] text-20px py-0 px-150px rounded-4px h-60px w-386px text-white hover:bg-[#f34545]"
  137. @click="handlSubmit($event, 'change')">
  138. <a class="text-white leading-60px">{{ !changeFileFlag ? '转换中...' : '开始转换' }}</a>
  139. <span v-show="!changeFileFlag" class="loading"></span>
  140. </span>
  141. </div>
  142. <span class="hide btn btn-down small w-240px h-60px bg-[#0dd299] rounded-4px text-20px ml-15px hover:bg-[#0fc993]"><a class="leading-60px text-white">下载全部</a></span>
  143. </div>
  144. </div>
  145. <div class="transfer-remember mt-23px text-center">
  146. <div class="checkbox checkbox-danger relative block mt-10px mb-10px">
  147. <label for="remember" class="text-12px font-normal text-[#999] min-h-20px pl-20px mb-0 inline-block max-w-[100%]">
  148. <input v-model="checkbox" type="checkbox" name="remember" class="remember_pass cursor-pointer" :disabled="!changeFileFlag" :class="{'cursor-not-allowed' : !changeFileFlag }" />确保上传的文档不涉及版权问题及违法内容
  149. </label>
  150. </div>
  151. </div>
  152. </div>
  153. <div class="modal verifi-modal top-[20%!important]" d="verifiPayModal" tabindex="-1" role="dialog" aria-labelledby="verifiPayModal">
  154. <div class="modal-dialog verifi-dialog w-480px h-426px my-50px" role="document">
  155. <div class="modal-content relative bg-white rounded-6px border border-solid border-[rgba(0,0,0,0.2)] outline-0 bg-clip-padding ring-[rgba(0,0,0/50%)] ring-offseet-3px ring-9px md:ring-offset-5 md:ring-15px">
  156. <div class="">
  157. <button id="verifi-close" type="button" class="close pompt_close py-5px px-10px outline-none" data-dismiss="modal" aria-label="Close">
  158. <span aria-hidden="true">×</span>
  159. </button>
  160. </div>
  161. <div class="verifi-content text-center pt-60px px-0 pb-35px">
  162. <img src="http://cn-file.17pdf.com/website/converter/pic_trans_diomands.png"/>
  163. <p>该功能为付费套餐专属</p>
  164. <p>订阅解锁更多特权</p>
  165. <a href="javascript:;" class="now_pricing" value="0"
  166. >立即订阅</a
  167. >
  168. </div>
  169. </div>
  170. </div>
  171. </div>
  172. </div>
  173. <div class="file_num w-[100%] h-120px text-center text-white leading-120px text-30px mb-76px">
  174. 17PDF Reader,当前已转换了<span class="text-32px"> 1,859,726 </span> 个文件
  175. </div>
  176. <div id="more_type" class="pdf_converter clear w-[80%] my-0 mx-auto">
  177. <div class="package_type">
  178. <h3 class="text-24px text-[#333] font-normal mx-0 mt-0 mb-49px h-30px leading-30px">会员专享格式</h3>
  179. <ul class="flex justify-center w-[100%] min-w-340px p-0 mt-0 mb-10">
  180. <li>
  181. <a href="/converter">
  182. <img src="/converter/ic_pdf_word.png" />
  183. <span>PDF To Word</span>
  184. </a>
  185. </li>
  186. <li>
  187. <a href="/converter">
  188. <img src="/converter/ic_pdf_ppt.png"/>
  189. <span>PDF to PowerPoint</span>
  190. </a>
  191. </li>
  192. <li>
  193. <a href="/converter">
  194. <img src="/converter/ic_pdf_execl.png"/>
  195. <span>PDF to EXCEL</span>
  196. </a>
  197. </li>
  198. <li>
  199. <a href="/converter">
  200. <img src="/converter/ic_pdf_txt.png" />
  201. <span>PDF to TXT</span>
  202. </a>
  203. </li>
  204. <li>
  205. <a href="/converter">
  206. <img src="/converter/ic_pdf_picture.png" />
  207. <span>PDF to JPG/PNG</span>
  208. </a>
  209. </li>
  210. </ul>
  211. </div>
  212. </div>
  213. <div class="about_converter w-[100%] bg-[#fafafa] py-60px px-[10%] mt-102px">
  214. <h3 class="name text-24px text-[#333] font-normal mx-0 mt-0 mb-49px h-30px leading-30px">关于转档</h3>
  215. <ul class="clear p-0">
  216. <li>
  217. <img src="http://cn-file.17pdf.com/website/converter/ic_way.png" />
  218. <div class="content">
  219. <h3>如何转档</h3>
  220. <p>
  221. 进入“文件转换器”区域。点击下方“添加文件”选择添加本地目标文件,然后在“转为”栏选择转换目标格式,最后点击“开始转换”即可。
  222. </p>
  223. </div>
  224. </li>
  225. <li>
  226. <img
  227. src="http://cn-file.17pdf.com/website/converter/ic_quality.png"
  228. />
  229. <div class="content">
  230. <h3>领先品质</h3>
  231. <p>
  232. 行业领先的转换品质,经过转换的文件版面清晰、保持格式的一致,支持一键转档,批量转换,精准快速的文件格式转换,稳定的转换品质,是您处理转格式转换的首选。
  233. </p>
  234. </div>
  235. </li>
  236. <li>
  237. <img src="http://cn-file.17pdf.com/website/converter/ic_safe.png" />
  238. <div class="content">
  239. <h3>文件安全</h3>
  240. <p>
  241. 我们尊重每位用户的隐私信息和文件安全。转档后的文件仅在云端保留24小时,让您免去后顾之忧。
  242. </p>
  243. </div>
  244. </li>
  245. <li>
  246. <img src="http://cn-file.17pdf.com/website/converter/ic_more.png" />
  247. <div class="content">
  248. <h3>多平台支持</h3>
  249. <p>
  250. 文件格式转换器可以在所有计算机(Mac、Windows及Linux)上使用,也可下载App
  251. 17PDF Reader在移动端使用,让您在手机上也能轻松转档文件。
  252. </p>
  253. </div>
  254. </li>
  255. </ul>
  256. </div>
  257. <div class="converter_question px-[10%] pt-76px pb-60px text-center">
  258. <h3 class="name text-24px text-[#333] font-normal m-0 h-30px leading-30px text-left">常见问题</h3>
  259. <table class="w-[100%] p-0 bg-transparent">
  260. <tbody>
  261. <tr>
  262. <td>
  263. <h3>1. 支持哪些格式转换?</h3>
  264. <p>
  265. <span></span>支持PDF to
  266. Word、PPT、Excel、TXT、JPG/PNG无限次数转换
  267. </p>
  268. </td>
  269. <td>
  270. <h3>2. 为什么图片格式的文件转档效果不好?</h3>
  271. <p>
  272. 如原文件为图片格式或者通过扫描文档保存为PDF文件的,转档后的文件可能无法选取文字进行高亮等编辑。
  273. </p>
  274. </td>
  275. </tr>
  276. <tr>
  277. <td>
  278. <h3>3. 文件转档后出现乱码?</h3>
  279. <p>
  280. 如果是原文件就有乱码问题,先处理好文件再提交转档;如果原文件正常而转档后目标文件乱码,请联系我们处理。
  281. </p>
  282. </td>
  283. </tr>
  284. </tbody>
  285. </table>
  286. <a class="more w-auto h-30px leading-30px text-[#666] inline-block text-center mx-auto mt-48px mb-0 link:no-underline hover:(!border-[#ff4f4f] text-[#ff4f4f])" href="/question#convert">更多问题请查看帮助</a>
  287. </div>
  288. <div class="download_code fixed right-14px bottom-50px bg-white w-134px py-12px px-0 rounded-6px text-center ">
  289. <span class="large text-16px inline-block w-[100%] my-6px mx-0">下载APP</span>
  290. <img src="http://cn-file.17pdf.com/website/download/android_code.png" class="w-110px border-0 align-middle inline-block" />
  291. <span class="inline-block w-[100%] text-14px my-6px mx-0">使用更便捷</span>
  292. </div>
  293. </div>
  294. <client-only>
  295. <el-dialog :visible.sync="visiable" :close-on-click-modal="true" :close-on-press-escape="false" width="480px" append-to-body center>
  296. <div class="changepwd-tittle">
  297. <p class="text-20px text-center text-$btn-color-primary">提示</p>
  298. </div>
  299. <div class="text-16px text-[#707070] text-center my-30px">
  300. 您还未登录或注册,请先
  301. <span class="text-$btn-color-primary cursor-pointer" @click="login">登录</span>
  302. <span class="text-$btn-color-primary cursor-pointer" @click="register">注册</span>
  303. </div>
  304. </el-dialog>
  305. <el-dialog :visible.sync="noMia" width="480px" append-to-body center top = "25vh" >
  306. <div class="modal-content">
  307. <div class="less-tittle w-full h-64px leading-64px text-[20px] text-[#ff4f4f] text-center mt-[-50px] mb-30px">劵不足</div>
  308. <div class="less-content text-center mb-30px">
  309. <img src="http://cn-file.17pdf.com/website/converter/kongjianbuzu_ic.png" class="mb-26px mx-auto">
  310. <p class="text-[14px] text-[#c3c3c3]">您的劵不足,我们背不住了</p>
  311. </div>
  312. </div>
  313. </el-dialog>
  314. </client-only>
  315. </div>
  316. </template>
  317. <script>
  318. import { mapState } from 'vuex'
  319. export default {
  320. data() {
  321. return {
  322. fileList: [],
  323. uniqFileArr: [],
  324. checkbox: true,
  325. changeFileFlag: true,
  326. uploadNum: 0,
  327. getFileStatusTimer: null,
  328. changeSucesssNumTotal: 0,
  329. changeSucesssFileList: [],
  330. visiable: false,
  331. noMia:false
  332. };
  333. },
  334. middleware: "user",
  335. head() {
  336. return {
  337. title: "PDF转换器免费在线转档",
  338. meta: [
  339. {
  340. hid: "description",
  341. content: "17PDF Reader免费提供在线PDF格式转换文件转档服务,支持PDF转word,PDF转doc,PDF转PPT,PDF转png,PDF转html,PDF转epub,PDF转xls,psd转ai等。轻松拖曳,一键转档,批量转换,支持多种常用格式相互转档。先进的转换引擎,极速转换,精准度高达99.99%。",
  342. },
  343. {
  344. name: "keywords",
  345. content: "格式转换,文件转档,pdf convert,converter, word to pdf"
  346. }
  347. ]
  348. };
  349. },
  350. computed: {
  351. ...mapState([
  352. "userInfo"
  353. ]),
  354. // 所需券数
  355. requiredCoupon() {
  356. let total = 0;
  357. for (let i = 0; i < this.fileList.length; i++) {
  358. total += this.fileList[i].price;
  359. }
  360. for (const file of this.fileList) {
  361. if (file.status === 6) {
  362. total -= file.price;
  363. }
  364. }
  365. if (this.userInfo && this.userInfo.subscriberType === 1) {
  366. total = 0;
  367. }
  368. return total;
  369. }
  370. },
  371. mounted() {
  372. // console.log(this.userInfo)
  373. if (localStorage.getItem("file") !== null) {
  374. this.fileList = JSON.parse(localStorage.getItem("file"));
  375. this.changeSucesssFileList = JSON.parse(localStorage.getItem("file"));
  376. }
  377. },
  378. methods: {
  379. getUserInfo() {
  380. this.$axios.get('members/getMemberInfo').then((res)=> {
  381. if(res.code === 200) {
  382. this.$store.commit('setUser',res.result.memberInfo)
  383. }
  384. })
  385. },
  386. handlSubmit(event, type) {
  387. if (!this.$store.state.token) {
  388. event.preventDefault();
  389. this.visiable = true;
  390. return;
  391. }
  392. if (type === "buy") {
  393. this.handlerBuy("ticket");
  394. }
  395. else if (type === "change") {
  396. this.createFileMission();
  397. }
  398. // this.$store.commit('OPEN_LOGIN', true)
  399. // this.$store.commit('SET_INTERFACE', 'vip')
  400. },
  401. login() {
  402. this.visiable = false;
  403. this.$store.commit("OPEN_LOGIN", true);
  404. this.$store.commit("SET_INTERFACE", "login");
  405. },
  406. register() {
  407. this.visiable = false;
  408. this.$store.commit("OPEN_LOGIN", true);
  409. this.$store.commit("SET_INTERFACE", "register");
  410. },
  411. // 充值弹框
  412. handlerBuy(type) {
  413. this.$store.commit("OPEN_LOGIN", true);
  414. this.$store.commit("SET_INTERFACE", type);
  415. },
  416. //拖拽事件
  417. handleEvent(event) {
  418. // 阻止事件的默认行为
  419. event.preventDefault();
  420. if (event.type === 'drop') {
  421. // 文件进入并松开鼠标,文件边框恢复正常
  422. this.$refs.drag.style.background = '#fff'
  423. this.$refs.drag.style.border = "thin dashed #d1d1d1"
  424. if (!this.$store.state.token) {
  425. event.preventDefault();
  426. this.visiable = true;
  427. return;
  428. }
  429. //传递拖拽的文件,限制只能传pdf文件
  430. let dropFile = event.dataTransfer.files
  431. let newArr= [];
  432. for(var item of dropFile){
  433. if(item.type.indexOf('pdf') !== -1){
  434. newArr.push(item);
  435. }
  436. }
  437. dropFile = newArr
  438. this.addFile(dropFile)
  439. } else if (event.type === 'dragleave') {
  440. // 离开时
  441. this.$refs.drag.style.background = '#fff'
  442. this.$refs.drag.style.border = "thin dashed #d1d1d1"
  443. } else {
  444. // 进入时
  445. this.$refs.drag.style.background = '#f0f0f0'
  446. this.$refs.drag.style.border = "3px dashed #d1d1d1"
  447. }
  448. },
  449. // 添加文件
  450. async addFile(event) {
  451. let array = {}
  452. if(event.target){
  453. array = event.target.files
  454. }else{
  455. array = event
  456. }
  457. const defaultPrice = await this.getFilePrice("pdf", "docx");
  458. for (let i = 0; i < array.length; i++) {
  459. const fileObj = {
  460. name: array[i].name,
  461. size: array[i].size,
  462. price: defaultPrice,
  463. input: "pdf",
  464. output: "docx",
  465. status: 0
  466. };
  467. this.fileList.push(fileObj);
  468. this.uniqFileArr.push(array[i]);
  469. }
  470. // this.fileList,this.uniqFileArr数组去重
  471. let newArr= [];
  472. let arrName = [];
  473. // let arrStatus = []
  474. for(var item of this.fileList){
  475. // if(arrName.indexOf(item['name']) == -1 || arrStatus.indexOf(item['status']) == -1){
  476. if(arrName.indexOf(item['name']) == -1){
  477. arrName.push(item['name']);
  478. // arrStatus.push(item['status'])
  479. newArr.push(item);
  480. }
  481. }
  482. this.fileList=newArr
  483. newArr=[]
  484. arrName=[]
  485. for(var item of this.uniqFileArr){
  486. if(arrName.indexOf(item['name']) == -1 ){
  487. arrName.push(item['name']);
  488. newArr.push(item);
  489. }
  490. }
  491. this.uniqFileArr=newArr
  492. // console.log(this.uniqFileArr)
  493. if(event.target){
  494. event.target.value=''
  495. }
  496. },
  497. // 查询文件所需券数
  498. async getFilePrice(input, output) {
  499. let price = 0;
  500. await this.$axios.get(`/convertType/getConvertTypeList?input=${input}&output=${output}`).then((res) => {
  501. if (res.code === 200) {
  502. price = res.result[0].price;
  503. }
  504. });
  505. return price;
  506. },
  507. // 改变要转换的格式
  508. async changeOutput(item, index) {
  509. const price = await this.getFilePrice(item.input, item.output);
  510. this.$set(this.fileList[index], "price", price);
  511. this.$set(this.fileList[index], "output", item.output);
  512. },
  513. // 计算文件大小函数(保留两位小数),Size为字节大小
  514. getfilesize(size) {
  515. if (!size)
  516. return "";
  517. const num = 1024; // byte
  518. if (size < num) {
  519. return size + "B";
  520. }
  521. if (size < Math.pow(num, 2)) {
  522. return (size / num).toFixed(2) + "K";
  523. }
  524. if (size < Math.pow(num, 3)) {
  525. return (size / Math.pow(num, 2)).toFixed(2) + "M";
  526. }
  527. if (size < Math.pow(num, 4)) {
  528. return (size / Math.pow(num, 3)).toFixed(2) + "G";
  529. }
  530. else {
  531. return (size / Math.pow(num, 4)).toFixed(2) + "T";
  532. }
  533. },
  534. // 删除文件
  535. deleteFile(index) {
  536. this.fileList.splice(index, 1);
  537. this.uniqFileArr.splice(index - this.changeSucesssNumTotal, 1);
  538. this.changeSucesssFileList = [];
  539. localStorage.removeItem("file");
  540. this.fileList.forEach(item => {
  541. if (item.status === 6) {
  542. this.changeSucesssFileList.push(item);
  543. }
  544. });
  545. localStorage.setItem("file", JSON.stringify(this.changeSucesssFileList));
  546. },
  547. // 清空
  548. deleteAllFile() {
  549. this.fileList = [];
  550. this.uniqFileArr = [];
  551. this.changeFileStatus("all", 5);
  552. this.changeSucesssFileList = [];
  553. localStorage.removeItem("file");
  554. this.showFileBig = false
  555. },
  556. // 转档第一步,根据文件列表创建任务和插入文件信息
  557. createFileMission() {
  558. // if (this.fileList.length === 0) return
  559. const points = this.userInfo.points;
  560. if (this.requiredCoupon > points) {
  561. // alert("券数不足,请充值");
  562. this.noMia = true
  563. return;
  564. }
  565. const filterFileList = this.fileList.filter(function (item) {
  566. return item.status !== 6;
  567. });
  568. let fileArr = [];
  569. for (let i = 0; i < filterFileList.length; i++) {
  570. const file = {};
  571. file.sourceType = 0;
  572. file.size = filterFileList[i].size;
  573. file.input = "pdf";
  574. file.output = filterFileList[i].output;
  575. file.filename = filterFileList[i].name;
  576. fileArr[i] = file;
  577. }
  578. fileArr = JSON.stringify(fileArr);
  579. this.changeFileFlag = false;
  580. this.changeFileStatus("all", 1);
  581. const config = {
  582. method: "post",
  583. url: "/mission/create",
  584. headers: {
  585. "Accept": "*/*",
  586. "Content-Type": "application/json"
  587. },
  588. data: fileArr
  589. };
  590. this.$axios("/mission/create", config).then((res) => {
  591. // console.log(res)
  592. if (res.code === 200) {
  593. const missionFiles = res.result.missionFilePoJos;
  594. // console.log(missionFiles)
  595. for (let i = 0; i < missionFiles.length; i++) {
  596. this.changeFileStatus(missionFiles[i].fileName, 1);
  597. this.uploadFile(this.uniqFileArr[i], missionFiles[i].id, res.result.id);
  598. }
  599. }
  600. else {
  601. // console.log("111")
  602. this.changeFileFlag = true;
  603. this.changeFileStatus("all", 5);
  604. }
  605. });
  606. },
  607. // 修改文件状态
  608. changeFileStatus(fileName, status) {
  609. if (fileName === "all") {
  610. this.fileList.forEach(item => {
  611. if (item.status !== 6) {
  612. this.$set(item, "status", status);
  613. }
  614. });
  615. }
  616. else {
  617. this.fileList.forEach(item => {
  618. if (item.name === fileName) {
  619. this.$set(item, "status", status);
  620. }
  621. });
  622. }
  623. },
  624. // 文件状态: 0未转换,1上传中,2上传完成,3转换中,4转换成功,5转换失败,6已转档
  625. fileStatus(item, index) {
  626. switch (item.status) {
  627. case 0:
  628. this.$set(this.fileList[index], "status", 0);
  629. return "未转换";
  630. case 1:
  631. this.$set(this.fileList[index], "status", 1);
  632. return "上传中";
  633. case 2:
  634. this.$set(this.fileList[index], "status", 2);
  635. return "上传完成";
  636. case 3:
  637. this.$set(this.fileList[index], "status", 3);
  638. return "转换中";
  639. case 4:
  640. this.$set(this.fileList[index], "status", 4);
  641. return "<span style=\"color: orange\">转换成功</span>";
  642. case 5:
  643. this.$set(this.fileList[index], "status", 5);
  644. return "<span style=\"color: red\">转换失败</span>";
  645. case 6:
  646. this.$set(this.fileList[index], "status", 6);
  647. return `<a href="${item.path}" style="color: #0dd299">下载</a>`;
  648. }
  649. },
  650. // 转档第二步,上传文件
  651. uploadFile(file, id, missionId) {
  652. // console.log(file)
  653. this.uploadNum = 0;
  654. const formData = new FormData();
  655. formData.append("file", file);
  656. formData.append("missionFileId", id);
  657. const config = {
  658. headers: {
  659. "Content-Type": "multipart/form-data;boundary = " + new Date().getTime()
  660. }
  661. };
  662. this.$axios.post("/missionFile/upload", formData, config).then((res) => {
  663. // console.log('上传文件')
  664. if (res.code === 200) {
  665. this.changeFileStatus(file.name, 2);
  666. this.uploadNum++;
  667. if (this.uploadNum === this.uniqFileArr.length) {
  668. this.convertFile(file.name, missionId);
  669. }
  670. }
  671. else {
  672. this.changeFileFlag = true;
  673. console.log(file.name)
  674. this.changeFileStatus(file.name, 5);
  675. }
  676. });
  677. },
  678. // 转档第三步,开始转档
  679. convertFile(file, missionId) {
  680. const formData = new FormData();
  681. formData.append("missionId", missionId);
  682. const config = {
  683. headers: {
  684. "Content-Type": "multipart/form-data;boundary = " + new Date().getTime()
  685. }
  686. };
  687. this.$axios.post("/mission/convertFile", formData, config).then((res) => {
  688. // console.log('开始转档')
  689. if (res.code === 200) {
  690. this.changeFileStatus("all", 3);
  691. this.getFileStatusTimer = window.setInterval(() => {
  692. setTimeout(this.getFileStatus(formData, config), 0);
  693. }, 5000);
  694. }
  695. else {
  696. this.uploadNum = 0;
  697. this.changeFileStatus("all", 5);
  698. this.changeFileFlag = true;
  699. }
  700. });
  701. },
  702. // 转档最后一步,轮询文件状态和下载链接
  703. getFileStatus(formData, config) {
  704. this.$axios.post("/mission/queryFileStatus", formData, config).then((res) => {
  705. // console.log('获取文件状态')
  706. if (res.code === 200) {
  707. // 转档文件列表
  708. const getFileList = res.result[0].missionFilePoJos;
  709. // 转档成功与失败的数量
  710. let changeSucesssNum = 0;
  711. let changeErrNum = 0;
  712. for (let i = 0; i < getFileList.length; i++) {
  713. if (getFileList[i].status === 2) {
  714. this.changeFileStatus(getFileList[i].fileName, 4);
  715. console.log("200")
  716. this.fileList.forEach(item => {
  717. if (item.name === getFileList[i].fileName) {
  718. console.log("下载")
  719. this.changeFileStatus(getFileList[i].fileName, 6);
  720. this.$set(item, "path", getFileList[i].path);
  721. this.changeSucesssFileList.push(item);
  722. }
  723. });
  724. changeSucesssNum++;
  725. }
  726. else if (getFileList[i].status === 3) {
  727. this.changeFileStatus(getFileList[i].fileName, 5);
  728. changeErrNum++;
  729. }
  730. }
  731. let changeAllNum = changeSucesssNum + changeErrNum
  732. if (changeAllNum === getFileList.length) {
  733. clearInterval(this.getFileStatusTimer);
  734. this.getFileStatusTimer = null;
  735. this.changeSucesssNumTotal += changeSucesssNum;
  736. let failedFileList = getFileList.filter((val) => val.status === 3);
  737. let failedFileNameArr = failedFileList.map(val => val.fileName);
  738. let result = [];
  739. for (let i = 0; i < failedFileNameArr.length; i++) {
  740. this.uniqFileArr.forEach(item => {
  741. if (item.name === failedFileNameArr[i]) {
  742. result.push(item);
  743. }
  744. });
  745. }
  746. this.uniqFileArr = result;
  747. this.getUserInfo()
  748. }
  749. // console.log('changeSucesssFileList:', this.changeSucesssFileList)
  750. localStorage.setItem("file", JSON.stringify(this.changeSucesssFileList));
  751. }
  752. else {
  753. this.changeFileStatus("all", 5);
  754. // 多失败就关闭查询
  755. clearInterval(this.getFileStatusTimer);
  756. }
  757. this.uploadNum = 0;
  758. this.changeFileFlag = true;
  759. });
  760. }
  761. },
  762. }
  763. </script>
  764. <style lang="scss" scoped>
  765. ::v-deep body {
  766. min-width: 1200px !important;
  767. }
  768. .page-converter {
  769. .date-tips {
  770. background: linear-gradient(0deg, #fff2f6, #fff2f6),
  771. linear-gradient(90deg, snow 10.37%, rgba(255, 243, 243, 0) 91.75%),
  772. linear-gradient(90deg, #fff2f6 2.26%, rgba(255, 242, 246, 0.21) 101.41%);
  773. .text-container {
  774. display: flex;
  775. align-items: center;
  776. margin-left: 16px;
  777. img {
  778. margin-left: 8px;
  779. }
  780. }
  781. span {
  782. font-size: 14px;
  783. line-height: 24px;
  784. vertical-align: middle;
  785. }
  786. .text {
  787. display: inline-flex;
  788. align-items: center;
  789. }
  790. .tip {
  791. position: relative;
  792. font-size: 0;
  793. .tip-text {
  794. display: none;
  795. position: absolute;
  796. left: -3px;
  797. width: 258px;
  798. padding: 15px 14px 10px 10px;
  799. background: url('http://cn-file.17pdf.com/website/members/ic_tip.svg')
  800. left top no-repeat;
  801. background-size: auto 100%;
  802. font-size: 12px;
  803. line-height: 18px;
  804. color: #fff;
  805. border-radius: 4px;
  806. }
  807. &:hover .tip-text {
  808. display: block;
  809. }
  810. }
  811. }
  812. .transfer-container {
  813. .hide {
  814. display: none !important;
  815. }
  816. button {
  817. padding-right: 7px;
  818. }
  819. .close {
  820. float: right;
  821. font-size: 21px;
  822. font-weight: bold;
  823. line-height: 1;
  824. color: #000;
  825. text-shadow: 0 1px 0 #fff;
  826. opacity: 0.2;
  827. filter: alpha(opacity=20);
  828. }
  829. button.close {
  830. padding: 0;
  831. cursor: pointer;
  832. background: transparent;
  833. border: 0;
  834. -webkit-appearance: none;
  835. }
  836. button:focus {
  837. outline: none;
  838. }
  839. .close:hover,
  840. .close:focus {
  841. color: #000;
  842. text-decoration: none;
  843. cursor: pointer;
  844. opacity: 0.5;
  845. filter: alpha(opacity=50);
  846. }
  847. .recharge .recharge-btn:hover a {
  848. color: #fff;
  849. }
  850. .transfer-btn .loading {
  851. display: inline-block;
  852. border: 3px solid #fff;
  853. border-bottom: 3px solid #cccccc;
  854. height: 35px;
  855. width: 35px;
  856. border-radius: 50%;
  857. position: relative;
  858. top: 10px;
  859. left: 100px;
  860. -webkit-animation: loading 1s infinite linear;
  861. -moz-animation: loading 1s infinite linear;
  862. -o-animation: loading 1s infinite linear;
  863. animation: loading 1s infinite linear;
  864. }
  865. }
  866. .table>caption+thead>tr:first-child>th, .table>caption+thead>tr:first-child>td, .table>colgroup+thead>tr:first-child>th, .table>colgroup+thead>tr:first-child>td, .table>thead:first-child>tr:first-child>th, .table>thead:first-child>tr:first-child>td {
  867. border-top: 0;
  868. }
  869. .file-drop-zone .table thead tr th {
  870. color: #666666;
  871. text-align: center;
  872. }
  873. .table>thead>tr>th {
  874. vertical-align: bottom;
  875. border-bottom: 2px solid #ddd;
  876. }
  877. .table>thead>tr>th, .table>thead>tr>td, .table>tbody>tr>th, .table>tbody>tr>td, .table>tfoot>tr>th, .table>tfoot>tr>td {
  878. padding: 8px;
  879. line-height: 1.428571429;
  880. vertical-align: top;
  881. border-top: 1px solid #ddd;
  882. }
  883. .table th, .table td {
  884. vertical-align: middle;
  885. box-sizing: border-box;
  886. }
  887. th {
  888. text-align: left;
  889. }
  890. td, th {
  891. padding: 0;
  892. }
  893. .input-group-btn {
  894. position: relative;
  895. font-size: 0;
  896. white-space: nowrap;
  897. }
  898. .input-group-addon, .input-group-btn {
  899. white-space: nowrap;
  900. vertical-align: middle;
  901. }
  902. .input-group-addon, .input-group-btn, .input-group .form-control {
  903. display: table-cell;
  904. }
  905. .clearfix:before, .clearfix:after {
  906. content: " ";
  907. display: table;
  908. }
  909. .input-group-btn:last-child>.btn, .input-group-btn:last-child>.btn-group {
  910. z-index: 2;
  911. margin-left: -1px;
  912. }
  913. .input-group-btn:first-child>.btn, .input-group-btn:first-child>.btn-group {
  914. margin-right: -1px;
  915. }
  916. .input-group .form-control:last-child, .input-group-addon:last-child, .input-group-btn:last-child>.btn, .input-group-btn:last-child>.btn-group>.btn, .input-group-btn:last-child>.dropdown-toggle, .input-group-btn:first-child>.btn:not(:first-child), .input-group-btn:first-child>.btn-group:not(:first-child)>.btn {
  917. border-bottom-left-radius: 0;
  918. border-top-left-radius: 0;
  919. }
  920. .input-group .form-control:first-child, .input-group-addon:first-child, .input-group-btn:first-child>.btn, .input-group-btn:first-child>.btn-group>.btn, .input-group-btn:first-child>.dropdown-toggle, .input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle), .input-group-btn:last-child>.btn-group:not(:last-child)>.btn {
  921. border-bottom-right-radius: 0;
  922. border-top-right-radius: 0;
  923. }
  924. .input-group-btn>.btn {
  925. position: relative;
  926. }
  927. .btn.disabled, .btn[disabled], fieldset[disabled] .btn {
  928. cursor: not-allowed;
  929. opacity: 0.65;
  930. filter: alpha(opacity=65);
  931. -webkit-box-shadow: none;
  932. box-shadow: none;
  933. }
  934. .btn-file {
  935. position: relative;
  936. overflow: hidden;
  937. margin: 0;
  938. top: 170px;
  939. left: 50%;
  940. margin-left: -45px !important;
  941. outline: none;
  942. cursor: pointer;
  943. }
  944. .btn {
  945. display: inline-block;
  946. margin-bottom: 0;
  947. font-weight: normal;
  948. text-align: center;
  949. vertical-align: middle;
  950. touch-action: manipulation;
  951. cursor: pointer;
  952. background-image: none;
  953. border: 1px solid transparent;
  954. white-space: nowrap;
  955. border-radius: 4px;
  956. -webkit-user-select: none;
  957. -moz-user-select: none;
  958. -ms-user-select: none;
  959. user-select: none;
  960. }
  961. .btn-file .add-file {
  962. background: url(http://cn-file.17pdf.com/website/fileinput/ic_file_add.png) no-repeat;
  963. width: 90px;
  964. height: 100px;
  965. }
  966. .btn-file .add-file-left {
  967. background: url(http://cn-file.17pdf.com/website/fileinput/ic_add.png) no-repeat;
  968. width: 120px;
  969. height: 30px;
  970. margin-top: 10px;
  971. margin-left: 10px;
  972. padding-left: 38px;
  973. font-size: 16px;
  974. line-height: 30px;
  975. color: #666666;
  976. }
  977. .btn-file-left {
  978. position: relative;
  979. top: 0px;
  980. left: 20px;
  981. }
  982. .transfer-container .transfer-remember .checkbox input[type="checkbox"] {
  983. top: 3px;
  984. }
  985. .radio input[type="radio"], .radio-inline input[type="radio"], .checkbox input[type="checkbox"], .checkbox-inline input[type="checkbox"] {
  986. position: absolute;
  987. margin-left: -20px;
  988. }
  989. input[type="radio"], input[type="checkbox"] {
  990. margin: 4px 0 0;
  991. line-height: normal;
  992. }
  993. .modal {
  994. display: none;
  995. overflow: hidden;
  996. position: fixed;
  997. top: 0;
  998. right: 0;
  999. bottom: 0;
  1000. left: 0;
  1001. z-index: 1050;
  1002. -webkit-overflow-scrolling: touch;
  1003. outline: 0;
  1004. }
  1005. .file-drop-zone .table tbody tr:hover td {
  1006. background: #dfdfdf;
  1007. }
  1008. .file-drop-zone .table tbody tr td {
  1009. border-top: 0px;
  1010. }
  1011. .theme-explorer .explorer-frame td {
  1012. vertical-align: middle;
  1013. text-align: center;
  1014. }
  1015. .file-drop-zone .table tbody tr:hover td .transfer-select {
  1016. border-color: #ff4f4f;
  1017. background: url(http://cn-file.17pdf.com/website/converter/ic_trans_xiala_hover.png) no-repeat 72px 6px;
  1018. }
  1019. .file-drop-zone .table tbody tr .transfer-select {
  1020. width: 100%;
  1021. height: 22px;
  1022. border: 1px solid #dadada;
  1023. padding: 0px;
  1024. outline: none;
  1025. font-size: 14px;
  1026. color: #ff4f4f;
  1027. line-height: 22px;
  1028. // padding-left: 30px;
  1029. border-radius: 2px;
  1030. background: url(http://cn-file.17pdf.com/website/converter/ic_trans_xiala_nor.png) no-repeat 72px 6px;
  1031. }
  1032. .theme-explorer .file-actions-cell .file-actions .file-footer-buttons .pdf-removeicon:before {
  1033. content: url(https://cn-file.17pdf.com/website/converter/ic_delet_red.png) !important;
  1034. display: none;
  1035. }
  1036. .file-drop-zone .table tbody tr:hover td .file-actions .file-footer-buttons .pdf-removeicon:before {
  1037. display: block;
  1038. }
  1039. .btn.disabledBtn {
  1040. background-color: rgb(204, 204, 204);
  1041. pointer-events: none;
  1042. }
  1043. .file_num {
  1044. background: url(http://cn-file.17pdf.com/website/converter/pic_account_bg.png) repeat -10px 0px;
  1045. }
  1046. .clear {
  1047. zoom: 1;
  1048. }
  1049. .clear:after {
  1050. visibility: hidden;
  1051. display: block;
  1052. font-size: 0;
  1053. content: " ";
  1054. clear: both;
  1055. height: 0;
  1056. }
  1057. .pdf_converter .package_type h3:before,
  1058. .about_converter .name:before,
  1059. .converter_question .name:before {
  1060. content: '';
  1061. display: inline-block;
  1062. width: 5px;
  1063. height: 22px;
  1064. background: #ff4f4f;
  1065. margin-right: 10px;
  1066. margin-top: 4px;
  1067. vertical-align: top;
  1068. }
  1069. .pdf_converter .package_type ul li {
  1070. width: 120px;
  1071. list-style: none;
  1072. text-align: center;
  1073. margin-right: 30px;
  1074. cursor: pointer;
  1075. a {
  1076. display: block;
  1077. font-size: 14px;
  1078. color: #333333;
  1079. img {
  1080. display: inline-block;
  1081. width: 80px;
  1082. height: 80px;
  1083. margin-bottom: 20px;
  1084. vertical-align: middle;
  1085. }
  1086. span {
  1087. display: block;
  1088. white-space: nowrap;
  1089. transition: all .5s;
  1090. }
  1091. }
  1092. }
  1093. .about_converter ul li {
  1094. width: 50%;
  1095. float: left;
  1096. list-style: none;
  1097. margin-bottom: 85px;
  1098. img {
  1099. width: 70px;
  1100. height: 70px;
  1101. float: left;
  1102. margin: 10px 36px 0px 0px;
  1103. }
  1104. .content {
  1105. width: 330px;
  1106. float: left;
  1107. h3 {
  1108. font-size: 20px;
  1109. color: #333333;
  1110. margin: 0px 0px 10px;
  1111. font-weight: normal;
  1112. }
  1113. p {
  1114. font-size: 16px;
  1115. color: #4c4c4c;
  1116. margin: 0px !important;
  1117. }
  1118. }
  1119. }
  1120. table {
  1121. border-collapse: collapse;
  1122. border-spacing: 0;
  1123. }
  1124. .converter_question table td {
  1125. width: 50%;
  1126. vertical-align: top;
  1127. h3 {
  1128. font-size: 18px;
  1129. color: #333333;
  1130. margin: 54px 0px 14px;
  1131. font-weight: normal;
  1132. text-align: left;
  1133. }
  1134. p {
  1135. width: 75%;
  1136. font-size: 16px;
  1137. color: #4c4c4c;
  1138. text-align: left;
  1139. span {
  1140. width: 8px;
  1141. height: 8px;
  1142. display: inline-block;
  1143. border-radius: 100%;
  1144. background: #333333;
  1145. margin-right: 12px;
  1146. margin-left: 4px;
  1147. }
  1148. }
  1149. }
  1150. .converter_question .more {
  1151. border-bottom: 1px solid #999999;
  1152. }
  1153. .download_code {
  1154. box-shadow: 0px 1px 5px rgb(0 0 0 / 12%);
  1155. }
  1156. .file-details-cell.state img {
  1157. display: inline-block;
  1158. cursor: pointer;
  1159. }
  1160. }
  1161. </style>