Prechádzať zdrojové kódy

v0.1.14 测试版提交

laiguoran 6 rokov pred
rodič
commit
d7213ba56b

+ 1 - 0
.gitignore

@@ -3,6 +3,7 @@
 dist/
 build/*
 !build/icons
+!build/nsisfile
 coverage
 node_modules/
 npm-debug.log

BIN
build/icons/setup.ico


BIN
build/icons/smartcost.ico


BIN
build/icons/uninst.ico


+ 8 - 0
build/nsisfile/installer.nsh

@@ -0,0 +1,8 @@
+!macro preInit
+	SetRegView 64
+	WriteRegExpandStr HKLM "${INSTALL_REGISTRY_KEY}" InstallLocation "$PROGRAMFILES\${PRODUCT_FILENAME}"
+	WriteRegExpandStr HKCU "${INSTALL_REGISTRY_KEY}" InstallLocation "$PROGRAMFILES\${PRODUCT_FILENAME}"
+	SetRegView 32
+	WriteRegExpandStr HKLM "${INSTALL_REGISTRY_KEY}" InstallLocation "$PROGRAMFILES\${PRODUCT_FILENAME}"
+	WriteRegExpandStr HKCU "${INSTALL_REGISTRY_KEY}" InstallLocation "$PROGRAMFILES\${PRODUCT_FILENAME}"
+!macroend

+ 11 - 0
build/nsisfile/installer.nsi

@@ -0,0 +1,11 @@
+# ====================== 自定义宏 产品信息==============================
+!define PRODUCT_NAME           		"纵横Z+造价工作平台"
+!define PRODUCT_PATHNAME           	"纵横Z+造价工作平台"     #安装卸载项用到的KEY
+!define INSTALL_APPEND_PATH         "纵横Z+造价工作平台"     #安装路径追加的名称
+!define INSTALL_DEFALT_SETUPPATH    "纵横Z+造价工作平台"     #默认生成的安装路径
+!define EXE_NAME               		"纵横Z+造价工作平台.exe"
+!define PRODUCT_VERSION        		"0.1.10.0"
+!define PRODUCT_PUBLISHER      		"珠海纵横软件有限公司"
+!define PRODUCT_LEGAL          		"Copyright (C) 2018 珠海纵横软件有限公司"
+!define INSTALL_OUTPUT_NAME    		"纵横Z+造价工作平台_setup_0.1.10.exe"
+

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 1 - 1
data/sc_software.json


+ 13 - 3
package.json

@@ -1,8 +1,8 @@
 {
   "name": "startup",
-  "version": "0.1.6",
+  "version": "0.1.14",
   "author": "珠海纵横软件有限公司",
-  "description": "启动器",
+  "description": "纵横Z+ 造价工作平台",
   "license": null,
   "main": "./dist/electron/main.js",
   "scripts": {
@@ -23,8 +23,9 @@
     "rebuild-ffi": "cd ./node_modules/ffi/ && node-gyp rebuild --target=2.0.2 --arch=ia32 --target_arch=ia32 --dist-url=https://atom.io/download/electron && cd ../ref && node-gyp rebuild --target=2.0.2 --arch=ia32 --target_arch=ia32 --dist-url=https://atom.io/download/electron "
   },
   "build": {
-    "productName": "纵横启动器",
+    "productName": "纵横Z+造价工作平台",
     "appId": "org.smartcost.startup",
+    "copyright": "Copyright © 2018 珠海纵横软件有限公司",
     "directories": {
       "output": "build"
     },
@@ -45,6 +46,15 @@
       ],
       "artifactName": "${productName}_setup_${version}.${ext}"
     },
+    "nsis": {
+      "oneClick": false,
+      "perMachine": true,
+      "include": "build/nsisfile/installer.nsh",
+      "guid": "startup",
+      "installerIcon": "build/icons/setup.ico",
+      "uninstallerIcon": "build/icons/uninst.ico",
+      "createDesktopShortcut": true
+    },
     "extraResources": [
       {
         "from": "data",

+ 1 - 1
src/index.ejs

@@ -2,7 +2,7 @@
 <html>
   <head>
     <meta charset="utf-8">
-    <title>startup</title>
+    <title>纵横Z+ 造价工作平台</title>
     <% if (htmlWebpackPlugin.options.nodeModules) { %>
       <!-- Add `node_modules/` to global paths so `require` works properly in development -->
       <script>

+ 2 - 2
src/main/index.js

@@ -38,8 +38,8 @@ function initialize () {
      * Initial window options
      */
     const windowOptions = {
-      // width: 900,
-      width: 1450,
+      width: 900,
+      // width: 1450,
       height: 564,
       minWidth: 900,
       minHeight: 564,

+ 36 - 29
src/main/main-process/downloads.js

@@ -76,37 +76,44 @@ const downloads = function (win) {
     download(win, downloadpath, options)
       .then(function (dl) {
         try {
+          // 判断下载的是安装包 or 压缩包
           let zippath = path.join(__appPath, folderpath)
           let zipname = info.savepath
-          let exename = ''
-          fs.createReadStream(path.join(zippath, zipname))
-            .on('error', function (error) {
-              throw error
-            })
-            .pipe(new compressing.zip.UncompressStream())
-            .on('error', function (error) {
-              throw error
-            })
-            .on('finish', function () {
-              // 完成后删除zip压缩包
-              fs.unlinkSync(path.join(zippath, zipname))
-              console.log('ok')
-              win.webContents.send('downloadsuccess', {id: args.id, savepath: path.join(zippath, exename), index: args.index})
-            })
-            .on('entry', function (header, stream, next) {
-              stream.on('end', next)
-              // header.type => file | directory
-              // header.name => path name
-              exename = header.name
-              if (header.type === 'file') {
-                stream.pipe(fs.createWriteStream(path.join(zippath, header.name)))
-              } else { // directory
-                mkdirp(path.join(zippath, header.name), err => {
-                  if (err) throw err
-                  stream.resume()
-                })
-              }
-            })
+          let suffix = zipname.substring(zipname.lastIndexOf('.') + 1, zipname.length)
+          if (suffix === 'exe') {
+            console.log('ok')
+            win.webContents.send('downloadsuccess', {id: args.id, savepath: path.join(zippath, zipname), index: args.index})
+          } else {
+            let exename = ''
+            fs.createReadStream(path.join(zippath, zipname))
+              .on('error', function (error) {
+                throw error
+              })
+              .pipe(new compressing.zip.UncompressStream())
+              .on('error', function (error) {
+                throw error
+              })
+              .on('finish', function () {
+                // 完成后删除zip压缩包
+                fs.unlinkSync(path.join(zippath, zipname))
+                console.log('ok')
+                win.webContents.send('downloadsuccess', {id: args.id, savepath: path.join(zippath, exename), index: args.index})
+              })
+              .on('entry', function (header, stream, next) {
+                stream.on('end', next)
+                // header.type => file | directory
+                // header.name => path name
+                exename = header.name
+                if (header.type === 'file') {
+                  stream.pipe(fs.createWriteStream(path.join(zippath, header.name)))
+                } else { // directory
+                  mkdirp(path.join(zippath, header.name), err => {
+                    if (err) throw err
+                    stream.resume()
+                  })
+                }
+              })
+          }
         } catch (err) {
           console.log(err)
         }

BIN
src/renderer/assets/font/pingfang.ttf


+ 56 - 5
src/renderer/assets/global.css

@@ -1,7 +1,12 @@
 @charset "utf-8";
 /*样式初始化*/
+@font-face {
+    font-family: 'pingfang SC';
+    src:url('font/pingfang.ttf') format('truetype');
+}
 body{
-  font-size:12px !important;
+    font-family:-apple-system, BlinkMacSystemFont, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft Yahei', '微软雅黑', sans-serif;
+    font-size:12px !important;
 }
 #app {
   overflow: hidden;
@@ -458,10 +463,8 @@ body{
   color: #888;
 }
 .details .details-title .w-25 {
-  font-size: 16px;
-  color: #333;
+  width: 62%!important;
   font-weight: 500;
-  width: 35%!important;
 }
 .details .w-25 {
   font-size: 16px;
@@ -479,7 +482,7 @@ body{
   border-color: #28a745 !important;
 }
 .modal-body {
-  max-height: 300px;
+  max-height: 280px;
   overflow-y: auto;
 }
 .btn-secondary {
@@ -531,4 +534,52 @@ body{
   border-bottom: 1px solid #e9ecef !important;
   border-top: 1px solid #e9ecef !important;
   font-size: 12px !important;
+}
+.freewrap{
+  background:#eee5df;
+  margin:0 15px 15px 15px;
+  border-radius: 3px;
+}
+.freewrap .col{
+  padding:0;
+}
+.free-title{
+  padding:10px 15px;
+  font-size: 18px;
+  border-radius: 3px 3px 0 0;
+}
+.free-content{
+  position:relative;
+  background:#fff;
+  padding:15px;
+  margin:0 15px 15px;
+  height:90px;
+  border:2px solid #fff;
+  border-radius: 3px;
+}
+.free-content:hover{
+  border:2px solid rgba(255,101,5,0.2);
+}
+.free-content:hover .btn-white{
+  background:#ff6501;
+  color:#fff;
+  border:1px solid #ff6501;
+}
+.freewrap .col:first-child{
+  margin-left: 15px;
+}
+.freewrap .col:last-child{
+  margin-right: 15px;
+}
+.freewrap .col:first-child .free-content{
+  margin-right: 0;
+}
+.free-right{
+  position:absolute;
+  right:15px;
+  bottom:10px;
+}
+
+.header i{
+  cursor:pointer;
 }

BIN
src/renderer/assets/img/logo.jpg


BIN
src/renderer/assets/img/logo.png


BIN
src/renderer/assets/img/mainlogo.png


+ 9 - 4
src/renderer/components/StartUpPage.vue

@@ -5,13 +5,13 @@
         <div class="" v-show="iconShow">
           <span class="header-return webkit-drag">
             <a @click="goURL">
-            <i class="fas fa-angle-left" style="vertical-align: text-top"></i>
+            <i class="fas fa-angle-left" style="vertical-align: text-top;cursor: pointer"></i>
             </a>
           </span>
         </div>
-        <div v-if="iconShow" class="p-2"><img src="../assets/img/logo.jpg" width="30" height="30"></div>
-        <div class="pt-2 pb-2 pr-2" v-else ><img src="../assets/img/logo.jpg" width="30" height="30"></div>
-        <div class="p-2"><h5 class="mt-1">纵横启动器 <span class="version-name">版本:V{{ version }}</span></h5></div>
+        <div v-if="iconShow" class="p-2"><img src="../assets/img/logo.png" width="30" height="30"></div>
+        <div class="pt-2 pb-2 pr-2" v-else ><img src="../assets/img/logo.png" width="30" height="30"></div>
+        <div class="p-2"><h5 class="mt-1">纵横Z+ 造价工作平台 <span class="version-name">版本:V{{ version }}</span></h5></div>
         <div class="ml-auto p-2 pt-3 webkit-drag">
           <div class="d-flex flex-wrap">
             <div class="">
@@ -115,6 +115,11 @@
         let downinfo = this.$db.read().get('sc_download').find({ status: 5 }).value()
         if (downinfo !== undefined) {
           this.$db.read().get('sc_download').updateById(downinfo.id, { show: true, start: true, pause: false, resume: false }).write()
+        } else {
+          let downinfo2 = this.$db.read().get('sc_download').find({ status: 1 }).value()
+          if (downinfo2 !== undefined) {
+            this.$db.read().get('sc_download').updateById(downinfo2.id, { status: 5, show: true, start: true, pause: false, resume: false }).write()
+          }
         }
         this.$db.read().get('sc_download').updateWhere({ status: 3 }, { status: 2 }).write()
       }

+ 4 - 4
src/renderer/components/StartUpPage/DownloadHeader.vue

@@ -85,7 +85,6 @@
           info2.show = true
           info2.status = 5
           this.$db.read().get('sc_download').getById(info2.id).assign(info2).write()
-          // let index = this.downloads.length - this.$db.read().get('sc_download').filter({ status: 6 }).size().value()
           let index = this.downloads.findIndex(function (item) {
             return item.id === info2.id
           })
@@ -166,7 +165,6 @@
               let index2 = this.downloads.findIndex(function (item) {
                 return item.id === info2.id
               })
-              console.log('info2:' + index2)
               this.downloads.splice(index2, 1, info2)
               // this.operationDownload('start', info2.id, index)
             }
@@ -174,7 +172,6 @@
           info.delete = true
           info.status = 6
           this.$db.read().get('sc_download').getById(id).assign(info).write()
-          console.log('info:' + index)
           this.downloads.splice(index, 1, info)
           // this.$db.read().get('sc_download').removeById(id).write()
           // this.downloads.splice(index, 1)
@@ -227,7 +224,10 @@
             info.show = true
             info.status = 5
             this.$db.read().get('sc_download').getById(info.id).assign(info).write()
-            this.operationDownload('start', info.id, this.downloads.length - 1)
+            let index = this.downloads.findIndex(function (item) {
+              return item.id === info.id
+            })
+            this.operationDownload('start', info.id, index)
           }
         }
       },

+ 62 - 0
src/renderer/components/StartUpPage/SoftwareList.vue

@@ -1,5 +1,40 @@
 <template>
   <div class="software-list pt-3">
+    <div class="freewrap">
+      <div class="free-title"><img src="../../assets/img/mainlogo.png" class="mr-2">纵横造价免费网络版</div>
+      <div class="row">
+        <div class="col">
+          <div class="media free-content">
+            <img class="mr-3" :src="getProductImg(7)" width="60" height="60" alt="公路造价(增值税)">
+            <div class="media-body clearfix">
+              <div class="free-right">
+                <button @click="downloadSoftware(9)" class="btn btn-white btn-sm"><i class="fas fa-download mr-2"></i>立即下载</button>
+              </div>
+              <div class="software-body">
+                <div class="software-bodyleft">
+                  <h5 class="software-title mb-1">纵横公路工程造价管理系统</h5>
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+        <div class="col">
+          <div class="media free-content">
+            <img class="mr-3" :src="getProductImg(8)" width="60" height="60" alt="公路造价(增值税)">
+            <div class="media-body clearfix">
+              <div class="free-right">
+                <button @click="downloadSoftware(313)" class="btn btn-white btn-sm"><i class="fas fa-download mr-2"></i>立即下载</button>
+              </div>
+              <div class="software-body">
+                <div class="software-bodyleft">
+                  <h5 class="software-title mb-1">广东公路造价编审系统</h5>
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
     <el-row type="flex" justify="center" v-for="software in softwarelist" :key="software.product_id">
       <el-col :span="24" class="software-item">
         <router-link :to="{ name: 'software-detail', params: { pid: software.product_id }}">
@@ -40,6 +75,33 @@
     created () {
       let softwarejson = path.join('data/sc_software.json')
       this.softwarelist = fs.readJsonSync(softwarejson).sc_product
+    },
+    methods: {
+      getProductImg (pid) {
+        let pinfo = this.softwarelist.find(function (item) {
+          return item.product_id === pid
+        })
+        return pinfo.src
+      },
+      downloadSoftware (downID) {
+        // 先判断是否已在下载列表中,再加入列表中
+        let softwarejson = path.join('data/sc_software.json')
+        let downlist = fs.readJsonSync(softwarejson).sc_down
+        let info = downlist.find(function (item) {
+          return item.down_id === downID
+        })
+        let downloaditem = this.$db.read().get('sc_download').find({ down_id: downID, version: info.version, delete: false }).value()
+        if (!downloaditem) {
+          this.$emit('softwareDownload', downID)
+        } else {
+          this.$message({
+            showClose: true,
+            message: info.fulltitle + '已存在下载列中',
+            iconClass: '',
+            type: 'warning'
+          })
+        }
+      }
     }
   }
 </script>

+ 4 - 4
src/renderer/components/StartUpPage/SoftwareStartup.vue

@@ -1,9 +1,9 @@
 <template>
   <div class="software-startup software-wrap" v-loading="loading" element-loading-text="正在获取本地数据中,请稍候...">
     <div class="software-left">
-      <div class="open-left">
-        <span><i class="fas fa-chevron-left"></i></span>
-      </div>
+      <!--<div class="open-left">-->
+        <!--<span><i class="fas fa-chevron-left"></i></span>-->
+      <!--</div>-->
       <div class="local-software">
         <router-link v-for="product in productlist" :key="product.id" :to="{ name: 'software-startup-detail', params: { productid: product.id } }">
         <div class="software media" :class="[products.id === product.id ? 'active' : '']">
@@ -150,7 +150,7 @@
       fetchData () {
         let pid = this.$route.params.productid === undefined ? this.$db.read().get('sc_productData').last().value().id : this.$route.params.productid
         this.products = this.$db.read().get('sc_productData').getById(pid).value()
-        let plist = this.$db.read().get('sc_productData').filter({ isshow: true }).orderBy('orders', 'asc').value()
+        let plist = this.$db.read().get('sc_productData').filter({ isshow: true }).orderBy(['orders', 'product_id'], ['asc', 'asc']).value()
         for (let i in plist) {
           plist[i]['pnum'] = this.$db.read().get('sc_exeData').filter({ pid: plist[i].id }).size().value()
         }

+ 6 - 5
src/renderer/components/StartUpPage/SoftwareStartupDetail.vue

@@ -20,11 +20,11 @@
               <el-dialog
                       title="软件更新"
                       :visible.sync="dialogVisible"
-                      width="60%">
+                      width="55%">
                 <div class="modal-body" v-html="productVer"></div>
                 <span slot="footer" class="dialog-footer">
-                  <el-button class="btn btn-sm btn-primary btn-blue" @click="downloadbtn(did, version)">下载更新</el-button>
-                  <el-button class="btn btn-sm btn-secondary" @click="ignorebtn(prid, did)">忽略该版本</el-button>
+                  <button class="btn btn-sm btn-primary btn-blue" @click="downloadbtn(did, version)">下载更新</button>&nbsp;&nbsp;
+                  <button class="btn btn-sm btn-secondary" @click="ignorebtn(prid, doid)">忽略该版本</button>
                 </span>
               </el-dialog>
             </div>
@@ -34,7 +34,7 @@
               <div class="d-inline-block" v-if="exe.keyNumber !== ''">锁号:{{ exe.keyNumber }}</div>
             </div>
             <div class="w-25 d-inline-block">{{ exe.fileVersion }}</div>
-            <div class="d-inline-block">{{ exe.fileDescription }}</div>
+            <div class="inline-block">{{ exe.fileDescription }}</div>
             <div class="software-stitle">{{ exe.path }}</div>
           </div>
         </el-tab-pane>
@@ -120,7 +120,7 @@
               cancelButtonText: '取消',
               type: 'error'
             }).then(() => {
-              self.$electron.ipcRenderer.send('updateInstall')
+              self.$parent.clickbtn('auto')
             }).catch(() => {
             })
           } else {
@@ -160,6 +160,7 @@
         let addhtml = '<p>当前版本:<b>' + info.product_version + '</b>&nbsp;&nbsp;|&nbsp;&nbsp;升级版本:<b>' + info.show_updateVersion + '</b></p>'
         this.productVer = addhtml + scdowninfo.versionDesc
         this.dialogVisible = true
+        this.doid = info.id
         this.did = info.down_id
         this.version = scdowninfo.version
         this.prid = info.pid

+ 4 - 3
src/renderer/components/StartUpPage/SoftwareUpdate.vue

@@ -8,7 +8,9 @@
             :close-on-click-modal=false
             :close-on-press-escape=false
             >
-      <el-progress :percentage="uploadPercent"></el-progress>
+      <div class="modal-body" style="text-align: center;">
+        <el-progress :percentage="uploadPercent"></el-progress>
+      </div>
     </el-dialog>
   </div>
 </template>
@@ -19,7 +21,6 @@
     mixins: [mixin],
     created () {
       this.$electron.ipcRenderer.send('checkForUpdate')
-
       this.$electron.ipcRenderer.on('msgBox', (event, status) => {
         if (status === 2) {
           this.openUpdateDialog()
@@ -40,7 +41,7 @@
       openUpdateDialog () {
         this.$confirm('1.添加版本更新功能<br>' +
           '2:修复部分已知bug<br>' +
-          '3:内容页样式更新', 'V0.1.5版本更新提示', {
+          '3:内容页样式更新', '版本更新提示', {
           confirmButtonText: '马上更新',
           cancelButtonText: '稍后再说',
           center: true,