update.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. <template>
  2. <div>
  3. <div :style="{background: '#fafafa', padding: '5px 20px', lineHeight: '34px'}" class="footer-between">
  4. <div>
  5. <span style="color: #F56C6C;" @click="questionVisible = true" class="footer-menu"><i class="iconfont iconx-yiwen"></i>常见问题</span>
  6. <span @click="mianVisible = true" class="footer-menu"><i class="iconfont iconx-mianze-01"></i>免责声明</span>
  7. <a href="https://www.xingyousoft.com"><span class="footer-menu"><i class="iconfont iconx-wangzhi"></i>官网</span></a>
  8. </div>
  9. <div>
  10. <span v-if="linkList.length > 0" class="footer-menu" style="padding: 0;cursor:default;"><i class="iconfont iconx-lianjie"></i>应用推荐:</span>
  11. <a v-for="(item, key) in linkList" :key="key" @click="openUrl(item.url)"><span class="footer-menu">{{item.title}}</span></a>
  12. </div>
  13. <div style="cursor:pointer;position: relative;font-size: 13px;" >
  14. <el-popover placement="bottom" width="200" trigger="click" popper-class="wei-dialog">
  15. <a slot="reference"><span class="footer-menu"><i class="iconfont iconx-qiyeweixin"></i>客服</span></a>
  16. <div class="api">
  17. <img src="../assets/image/qrcode.png" style="width: 100%;"/>
  18. </div>
  19. </el-popover>
  20. <span @click="updateSoft()">
  21. <el-badge is-dot v-if="isUpdate">
  22. <i class="el-icon-refresh-right" style="font-size: 20px;"></i>
  23. </el-badge>
  24. 版本:v{{softInfo.version}}
  25. </span>
  26. </div>
  27. </div>
  28. <!-- 下载进度 -->
  29. <el-dialog title="软件更新" :visible.sync="isShow" width="400px" :show-close="false">
  30. <div style="text-align: center;">
  31. <div class="demo-Circle-custom" style="margin-bottom: 10px;">
  32. 文件大小:<i>{{$utils.handleSize(Number(softInfo.totalSize))}}</i>
  33. </div>
  34. <el-progress :text-inside="true" :stroke-width="30" :percentage="Number(softInfo.percent)"></el-progress>
  35. <div>
  36. <el-button type="primary" style="margin-top: 30px;" @click="isShow = false">后台下载</el-button>
  37. </div>
  38. </div>
  39. </el-dialog>
  40. <!-- 下载完成 -->
  41. <el-dialog title="下载完成,是否退出并安装" :visible.sync="isFinished" width="400px" :close-on-click-modal="false">
  42. <p>文件下载位置{{softdownloadDir}}</p>
  43. <span slot="footer" class="dialog-footer">
  44. <el-button @click="isFinished = false">取 消</el-button>
  45. <el-button type="primary" @click="execSoft()">确 定</el-button>
  46. </span>
  47. </el-dialog>
  48. <!-- 免责声明 -->
  49. <el-dialog title="免责声明" :visible.sync="mianVisible" width="700px" :close-on-click-modal="false" :close-on-press-escape="false" :show-close="false">
  50. <div style="color: #666; font-size: 14px; line-height: 1.5;">
  51. <p>所有使用{{softInfo.softName}}的用户(以下简称用户)在使用{{softInfo.softName}}(以下简称本软件)前必须阅读并同意本声明中的条款。否则,无权使用本软件。</p>
  52. <p class="mian-title">1、法律合规性:</p>
  53. <p>用户必须确保在使用本软件时,严格遵守国家及地方的法律法规,包括但不限于《中华人民共和国计算机信息网络国际联网管理暂行规定》等相关规定。
  54. 不得利用本软件非法访问或使用任何网站、系统或数据,以免触犯法律,导致法律责任。</p>
  55. <p class="mian-title">2、使用风险与后果:</p>
  56. <p>用户需自行承担因使用本软件而产生的所有风险和后果,包括但不限于下载失败、数据丢失、网站账号被封禁等。本软件不对任何因使用本软件而导致的直接或间接损失负责。<p>
  57. <p class="mian-title">3、合理使用与道德约束:</p>
  58. <p>用户从自己的网店或网址中提取图片、视频,不得用于任何违法、不道德或侵犯他人权益的目的。在使用过程中,应控制访问频率,避免对目标网站服务器造成过大负荷,影响网站正常运营,请用户自觉遵守他人的知识产权,不要使用未经授权的图片、商标等。</p>
  59. <p class="mian-title">4、免责条款:</p>
  60. <p>在任何情况下,本软件开发商均不对因使用本软件而产生的任何损失承担责任,包括但不限于直接经济损失、商誉损失、数据丢失等。</p>
  61. </div>
  62. <div slot="footer" class="dialog-footer-center">
  63. <el-button @click="mianVisible = false;">同意并使用</el-button>
  64. </div>
  65. </el-dialog>
  66. <!-- 常见问题 -->
  67. <el-dialog title="常见问题" :visible.sync="questionVisible" width="700px" :close-on-click-modal="false" :close-on-press-escape="false" :show-close="false">
  68. <el-collapse accordion>
  69. <el-collapse-item title="1、阿里巴巴下载时生成验证码拦截文件夹或文件夹内容为空" name="1">
  70. <div>点击软件右上角菜单按钮,选择软件设置-账号登录,点击阿里巴巴账号,浏览器打开后登录阿里巴巴账号,登录完成后关闭浏览器即可正常使用。</div>
  71. </el-collapse-item>
  72. <el-collapse-item title="2、网络图片访问异常 -1 或 -2" name="2">
  73. <div>网页中可能存在网络图片无法加载的情况,会过滤掉无法下载的图片</div>
  74. </el-collapse-item>
  75. <el-collapse-item title="3、账号登陆后,下载任务显示处理中没反应" name="3">
  76. <div>查看任务栏是否关闭该浏览器 <img style="width: 20px;" src="../assets/image/chromium.png" />,如未关闭请关闭浏览器后重新下载。</div>
  77. </el-collapse-item>
  78. <el-collapse-item title="4、关闭浏览器后,下载任务显示处理中仍没反应" name="4">
  79. <div>可能出现官网拦截,出现请拖动滑块还原拼图的情况,点击软件右上角菜单按钮,选择软件设置-账号登录,点击对应的淘宝/天猫账号,浏览器打开后手动拖动还原拼图拦截,完成后关闭浏览器即可正常使用。</div>
  80. </el-collapse-item>
  81. <el-collapse-item title="5、下载任务显示验证码拦截,请手动验证或者下载文件夹内容为空" name="5">
  82. <div>点击软件右上角菜单按钮,选择软件设置-登录淘宝/天猫账号,浏览器打开后点击首页任意商品链接,手动拖动滑块验证一下,完成后关闭浏览器即可正常使用。</div>
  83. </el-collapse-item>
  84. <el-collapse-item title="6、淘宝/天猫下载任务提示成功但下载文件夹内容为空" name="6">
  85. <div>长时间访问淘宝/天猫平台,可能触发了平台的人机验证,可以通过软件设置->账号登录->打开网页后跳转到首页,随机打开一个商品详情页手动解除一下验证,然后清理缓存重新下载或者换个账号登录重新下载即可</div>
  86. </el-collapse-item>
  87. <el-collapse-item title="7、下载完成后,打开文件夹如何保持图片顺序" name="7">
  88. <div>在下载完成后的文件夹中,鼠标右击空白位置,选择排序方式-日期-递增。</div>
  89. </el-collapse-item>
  90. <el-collapse-item title="8、下载的评论图片数量少" name="8">
  91. <div>默认只下载商品首屏展示的评论图片,不下载后续更多页的评论图。</div>
  92. </el-collapse-item>
  93. <el-collapse-item title="9、报错:权限受限,请以管理员权限运行软件" name="9">
  94. <div>软件权限受系统限制无法运行,需要退出软件,鼠标右击软件图标以管理员权限运行一下。</div>
  95. </el-collapse-item>
  96. <!-- <el-collapse-item title="10、为什么每次打开软件,需要重新登录平台账号" name="10">
  97. <div>为了考虑安全性,软件在退出后会清空所有的缓存和账号信息,因此每次重新打开软件需要要求用户重新登录各个平台账号。</div>
  98. </el-collapse-item> -->
  99. </el-collapse>
  100. <div slot="footer" class="dialog-footer-center">
  101. <el-button @click="questionVisible = false;">关闭</el-button>
  102. </div>
  103. </el-dialog>
  104. </div>
  105. </template>
  106. <script>
  107. import os from 'os'
  108. import fs from 'fs'
  109. import request from 'request'
  110. import { ipcRenderer } from 'electron'
  111. import pjson from '/package.json'
  112. export default {
  113. name: "updateRef",
  114. data(){
  115. return {
  116. mianVisible: false,
  117. questionVisible: false,
  118. softInfo: {
  119. softName: pjson.softInfo.softName,
  120. version: pjson.version,
  121. name: pjson.softInfo.downloadName,
  122. percent: 0,
  123. downloadedSize: 0,
  124. totalSize: 0
  125. },
  126. softdownloadDir: os.userInfo().homedir+"\\Downloads", // 下载路径
  127. isShow: this.showDowload,
  128. isFinished: this.dowloadFinish,
  129. isUpdate: false,
  130. linkList: [], // 友情链接
  131. softdownloadPath: '',
  132. }
  133. },
  134. props: {
  135. showDowload: {
  136. type: Boolean,
  137. required: true,
  138. default: false
  139. },
  140. dowloadFinish: {
  141. type: Boolean,
  142. required: true,
  143. default: false
  144. },
  145. },
  146. mounted() {
  147. // 友情连接
  148. this.$http.post(this.$api.target + '/api/api/m_position_list', { group_id: pjson.softInfo.linkId }).then((response) => {
  149. if (!response.data.error) {
  150. this.linkList = response.data.result.list;
  151. }
  152. })
  153. },
  154. methods: {
  155. // 打开浏览器
  156. openUrl(url){
  157. const { shell } = require('electron');
  158. shell.openExternal(url);
  159. },
  160. // 检查更新
  161. updateSoft(flag){ // flag 软件打开时检测是否更新,true则静默不弹出最新版本提示
  162. if(Number(this.softInfo.percent) > 0){
  163. this.isShow = true;
  164. }else{
  165. this.$http.defaults.headers.post['Content-Type'] = 'application/json;charset=UTF-8';
  166. this.$http.get(pjson.softInfo.downloadPrefix + '/' + pjson.name + "/version.json?"+Math.random()).then((response) => {
  167. let getResult = response.data || {};
  168. let currentVersion = this.softInfo.version.split('.');
  169. let updateVersion = getResult.v.split('.');
  170. currentVersion.map((item, index) => {
  171. currentVersion[index] = Number(item);
  172. })
  173. updateVersion.map((item, index) => {
  174. updateVersion[index] = Number(item);
  175. })
  176. let result1 = updateVersion[0] > currentVersion[0];
  177. let result2 = (updateVersion[0] == currentVersion[0]) && (updateVersion[1] > currentVersion[1]);
  178. let result3 = (updateVersion[0] == currentVersion[0]) && (updateVersion[1] == currentVersion[1]) && (updateVersion[2] > currentVersion[2]);
  179. let result4 = (updateVersion[0] == currentVersion[0]) && (updateVersion[1] == currentVersion[1]) && (updateVersion[2] == currentVersion[2]) && (updateVersion[3] > currentVersion[3]);
  180. if(result1 || result2 || result3 || result4){
  181. this.isUpdate = true;
  182. let updateContent = getResult.c || '';
  183. let html = '<div>检测到有新版本v'+getResult.v+',是否更新最新版本?</div><div>'+updateContent+'</div>';
  184. this.$confirm(html, '应用更新', {
  185. dangerouslyUseHTMLString: true,
  186. confirmButtonText: '立即更新',
  187. type: 'warning'
  188. }).then(() => {
  189. this.softdownloadPath = this.softdownloadDir+'/'+ pjson.name + '_XY.exe';
  190. this.downloadFile(pjson.softInfo.downloadPrefix + '/' + pjson.name + '/' + pjson.name + "_XY.exe", this.softdownloadPath);
  191. }).catch(() => {
  192. });
  193. }else{
  194. this.isUpdate = false;
  195. if(!flag){
  196. this.$message({message: '当前已经是最新版本',type: 'success', center: true});
  197. }
  198. }
  199. }).catch(function(error){
  200. console.log(error);
  201. });
  202. }
  203. },
  204. // 下载文件
  205. downloadFile(file_url, targetPath){
  206. let _this = this;
  207. let received_bytes = 0;
  208. let total_bytes = 0;
  209. let isError = false;
  210. let req = request({
  211. method: 'GET', uri: file_url, strictSSL: false
  212. });
  213. let out = fs.createWriteStream(targetPath);
  214. req.pipe(out);
  215. req.on('response', function ( data ) {
  216. total_bytes = parseInt(data.headers['content-length']);
  217. const status = data.statusCode
  218. if (status < 200 || status >= 300) {
  219. _this.$message({showClose: true,message: '网络异常,请稍后重试!',type: 'warning'});
  220. isError = true;
  221. }else if(isNaN(total_bytes)){
  222. _this.$message({showClose: true,message: '网络异常,请稍后重试!',type: 'warning'});
  223. isError = true;
  224. }else{
  225. _this.isShow = true;
  226. isError = false;
  227. }
  228. });
  229. req.on('data', function(chunk) {
  230. received_bytes += chunk.length;
  231. _this.showProgress(received_bytes, total_bytes);
  232. });
  233. req.on('end', function() {
  234. if(!isError){
  235. _this.softInfo.percent = 100;
  236. setTimeout(()=>{
  237. _this.isFinished = true;
  238. _this.isShow = false;
  239. _this.softInfo.percent = 0;
  240. }, 1000)
  241. }else{
  242. _this.isFinished = false;
  243. _this.softInfo.percent = 0;
  244. if(fs.existsSync(targetPath)){
  245. fs.unlinkSync(targetPath);
  246. }
  247. }
  248. });
  249. },
  250. // 显示进度
  251. showProgress(received, total){
  252. let percentage = (received * 100) / total;
  253. let temp = percentage - this.softInfo.percent;
  254. if(Number(temp) > 1.5){
  255. this.softInfo.percent = Number(percentage).toFixed(2);
  256. }
  257. this.softInfo.downloadedSize = Number(received);
  258. this.softInfo.totalSize = Number(total);
  259. // console.log(percentage + "% | " + received + " bytes out of " + total + " bytes.");
  260. },
  261. // 安装
  262. execSoft(){
  263. const exec = require('child_process').exec;
  264. exec(this.softdownloadPath, (err, data) => {
  265. if (err) {
  266. throw err;
  267. } else { // 完成
  268. this.isFinished = false;
  269. }
  270. });
  271. }
  272. },
  273. }
  274. </script>
  275. <style>
  276. .wei-dialog{
  277. padding: 0 !important;
  278. }
  279. .mian-title{
  280. color: #333;
  281. font-weight: 600;
  282. padding: 9px 0;
  283. }
  284. .el-collapse-item__header{
  285. font-weight: 600 !important;
  286. font-size: 14px !important;
  287. }
  288. </style>