yuedefeng 7 роки тому
коміт
10dada75c6
5 змінених файлів з 391 додано та 0 видалено
  1. 28 0
      .gitignore
  2. 6 0
      README.md
  3. 168 0
      main.go
  4. 38 0
      regsrv.go
  5. 151 0
      utils.go

+ 28 - 0
.gitignore

@@ -0,0 +1,28 @@
+# Compiled Object files, Static and Dynamic libs (Shared Objects)
+*.o
+*.a
+*.so
+
+# Folders
+_obj
+_test
+
+# Architecture specific extensions/prefixes
+*.[568vq]
+[568vq].out
+
+*.cgo1.go
+*.cgo2.c
+_cgo_defun.c
+_cgo_gotypes.go
+_cgo_export.*
+
+_testmain.go
+
+*.exe
+*.test
+*.prof
+
+.idea
+.vscode
+*.log

+ 6 - 0
README.md

@@ -0,0 +1,6 @@
+
+
+
+ #隐藏Console窗口的打包命令:
+
+  go build  -ldflags="-H windowsgui"

+ 168 - 0
main.go

@@ -0,0 +1,168 @@
+// ofcmgr project main.go
+package main
+
+import (
+	"encoding/base64"
+	"encoding/json"
+	"log"
+	"net/http"
+	"os"
+	"os/exec"
+	"path/filepath"
+	"runtime"
+	"strings"
+	"syscall"
+)
+
+type Params struct {
+	Id     string
+	DocUrl string
+}
+
+//var httpUrl_Data string = "http://192.168.0.101:10091/api/limsdataentry/dataentrycallback"
+//var httpUrl_Report string = "http://192.168.0.101:10091/api/createreport/reporteditcallback"
+
+var httpUrl_Data string = "http://47.92.212.59:10091/api/limsdataentry/dataentrycallback"
+var httpUrl_Report string = "http://47.92.212.59:10091/api/createreport/reporteditcallback"
+var regFilePath string = "D:\\limsdoc\\petrotool.exe"
+var fileUpServer string = "weed1.labsop.cn:9333"
+var fileDownServer string = "weed1.labsop.cn:9390"
+
+func main() {
+	//创建本地目录
+	var basePath string
+	if ret, _ := PathExists("D:/"); ret {
+		basePath = "d:/limsdoc"
+	} else {
+		basePath = "c:/limsdoc"
+		regFilePath = "c:\\limsdoc\\petrotool.exe"
+	}
+	if ret, _ := PathExists(basePath); !ret {
+		CreatePath(basePath)
+	}
+
+	//生成日志文件
+	//无参数运行,创建注册表
+	var logfile string
+	if len(os.Args) <= 1 {
+		logfile = "./log.txt"
+	} else {
+		logfile = basePath+"/log.txt"
+	}
+
+	file, err := os.OpenFile(logfile, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0666)
+	defer file.Close()
+	if err != nil {
+		panic("打开文件错误")
+	}
+	log.SetOutput(file)
+	log.SetFlags(log.Lmicroseconds | log.Ldate)
+
+	log.Println(os.Args)
+	//无参数运行,创建注册表
+	if len(os.Args) <= 1 {
+		file, err := exec.LookPath(os.Args[0])
+		if err != nil {
+			return
+		}
+		path, err := filepath.Abs(file)
+		if runtime.GOOS == "windows" {
+			path = strings.Replace(path, "\\", "/", -1)
+		}
+		if _, err := Copy(path, regFilePath); err == nil {
+			log.Println("文件解压成功")
+			log.Println("")
+			//写注册表
+			registerOp(regFilePath)
+		} else {
+			log.Println("文件解压失败")
+			log.Println("安装失败,请通过右键,以管理员的身份运行,重试安装!")
+		}
+
+		log.Println("")
+		log.Println("")
+		log.Println("***安装成功后,当前位置的安装文件[petrotool.exe] 和 日志文件[log.txt]已无用,可直接删除***")
+
+		/*fmt.Println("")
+		fmt.Println("")
+		fmt.Println("请按回车键[ENTER]退出......")
+		var ret string
+		fmt.Scanln(&ret)*/
+		return
+	}
+
+	params := getParams(os.Args[1])
+	log.Println(params)
+	retUrlByte, err := base64.RawURLEncoding.DecodeString(params["furl"])
+	retUrl := string(retUrlByte)
+	log.Println("retUrl = ", retUrl)
+	log.Println("retUrl err = ", err)
+	fileNameByte, err := base64.RawURLEncoding.DecodeString(params["fname"])
+	fileName := string(fileNameByte)
+	log.Println("fileName = ", fileName)
+	log.Println("fileName err = ", err)
+
+	docType := params["doctype"]
+	entityId := params["id"]
+	action := params["act"]
+
+	if action == "edit" {
+		//localFileName := entityId + "_" + fileName
+		_dir := basePath + "/" + docType
+		//下载文件到本地目录
+		var downloadUrl string
+		if strings.Contains(retUrl, "http://") {
+			downloadUrl = retUrl
+		} else {
+			downloadUrl = "http://" + retUrl
+		}
+		log.Println("downloadUrl=", downloadUrl)
+		DownloadFile(downloadUrl, fileName, _dir)
+		if strings.Contains(runtime.GOOS, "windows") {
+			cmd := exec.Command("CMD", "/c", _dir+"/"+fileName)
+			cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
+			err := cmd.Start()
+			log.Println("打开文档: err = ", err)
+		}
+	} else if action == "up" {
+		token := params["token"]
+		//先上传文件
+		//localFileName := entityId + "_" + fileName
+		docPath := basePath + "/" + docType + "/" + fileName
+		retDocUrl, _ := uploadFile(docPath, fileUpServer, fileDownServer)
+		params := Params{
+			Id:     entityId,
+			DocUrl: retDocUrl,
+		}
+		//再post调用接口,告诉服务器
+		jsonByte, _ := json.Marshal(params)
+		if docType == "data" {
+			upfileRequest(httpUrl_Data, string(jsonByte), token)
+		} else if docType == "report" {
+			upfileRequest(httpUrl_Report, string(jsonByte), token)
+		}
+	} else if action == "cancel" {
+		log.Println("取消操作: 准备备份文件-", fileName)
+		localFile := basePath + "/" + docType + "/" + fileName
+		_dirCancel := basePath + "/cancel"
+		distFile := _dirCancel + "/" + docType + "_" + fileName
+		if ret, _ := PathExists(_dirCancel); !ret {
+			CreatePath(_dirCancel)
+		}
+		err := os.Rename(localFile, distFile)
+		log.Println("备份文件err=", err)
+	}
+
+}
+
+func upfileRequest(url string, params string, token string) {
+	client := &http.Client{}
+	req, err := http.NewRequest("POST", url, strings.NewReader(params))
+	req.Header.Add("Content-Type", "application/json")
+	req.Header.Add("Authorization", "Bearer "+token)
+	resp, err := client.Do(req)
+	if err != nil {
+		log.Println("err= ", err)
+	}
+	log.Println("resp= ", resp)
+}

+ 38 - 0
regsrv.go

@@ -0,0 +1,38 @@
+// ofcmgr project doc.go
+
+/*
+ofcmgr document
+*/
+package main
+
+import (
+	"github.com/golang/sys/windows/registry"
+	"log"
+)
+
+func registerOp(srcPath string) {
+	key, exists, err := registry.CreateKey(registry.CLASSES_ROOT, "petrotool", registry.ALL_ACCESS)
+	if err != nil {
+		log.Println(err)
+		log.Println("安装失败,请通过右键,以管理员的身份运行,重试安装!")
+		return
+	}
+	defer key.Close()
+
+	if exists {
+		log.Println("键已存在")
+		return
+	} else {
+		log.Println("新建注册表键")
+		key.SetStringValue("", "dashooProtocol")
+		key.SetStringValue("URL Protocol", srcPath)
+
+		key1, _, _ := registry.CreateKey(registry.CLASSES_ROOT, "petrotool\\DefaultIcon", registry.ALL_ACCESS)
+		key2, _, _ := registry.CreateKey(registry.CLASSES_ROOT, "petrotool\\shell\\open\\command", registry.ALL_ACCESS)
+
+		key1.SetStringValue("", srcPath + ",1")
+		key2.SetStringValue("", "\""+ srcPath +"\" \"%1\"")
+		log.Println("安装成功")
+	}
+
+}

+ 151 - 0
utils.go

@@ -0,0 +1,151 @@
+package main
+
+import (
+	"bufio"
+	"fmt"
+	"io"
+	"io/ioutil"
+	"log"
+	"net/http"
+	"net/url"
+	"os"
+	"path"
+	"strings"
+	"time"
+
+	. "github.com/linxGnu/goseaweedfs"
+)
+
+// 判断文件夹是否存在
+func PathExists(path string) (bool, error) {
+	_, err := os.Stat(path)
+	if err == nil {
+		return true, nil
+	}
+	if os.IsNotExist(err) {
+		return false, nil
+	}
+	return false, err
+}
+
+func CreatePath(path string) (bool, error) {
+	exist, err := PathExists(path)
+	if err != nil {
+		return false, err
+	}
+
+	if exist {
+		return true, nil
+	} else {
+		// 创建文件夹
+		err := os.Mkdir(path, os.ModePerm)
+		if err != nil {
+			return false, err
+		} else {
+			return true, err
+		}
+	}
+}
+
+func DownloadFile(durl string, destFileName string, filePath string) {
+	uri, err := url.ParseRequestURI(durl)
+	if err != nil {
+		panic("网址错误")
+	}
+
+	var filename string
+	if destFileName == "" {
+		filename = path.Base(uri.Path)
+	} else {
+		filename = filePath + "/" + destFileName
+		CreatePath(filePath)
+	}
+	log.Println("[*] Filename " + filename)
+
+	client := http.DefaultClient
+	client.Timeout = time.Second * 60 //设置超时时间
+	resp, err := client.Get(durl)
+	if err != nil {
+		log.Println("[*] download error:", err)
+		panic(err)
+	}
+	if resp.ContentLength <= 0 {
+		log.Println("[*] Destination server does not support breakpoint download.")
+	}
+	raw := resp.Body
+	defer raw.Close()
+
+	file, err := os.Create(filename)
+	defer file.Close()
+	writer := bufio.NewWriter(file)
+	defer writer.Flush()
+	body, err := ioutil.ReadAll(raw)
+	writer.Write(body)
+	if err != nil {
+		panic(err)
+	}
+}
+
+func uploadFile(DocFilePath string, fileUpServer string, fileDownServer string) (string, error) {
+	//6. 上传文件到文件服务器
+	//DocFilePath := utils.Cfg.MustValue("file", "docDir") + entrustId + "/" + tmpDocName
+	var sw *Seaweed
+	var filer []string
+	if _filer := os.Getenv("GOSWFS_FILER_URL"); _filer != "" {
+		filer = []string{_filer}
+	}
+	sw = NewSeaweed("http", fileUpServer, filer, 2*1024*1024, 5*time.Minute)
+	_, _, fID, err := sw.UploadFile(DocFilePath, "", "")
+	log.Println("FID = ", fID)
+	log.Println("err = ", err)
+	retDocUrl := fileDownServer + "/" + fID
+	//6.1 删除本地文件,释放空间
+	os.Remove(DocFilePath)
+
+	//7. 保存住报告URL(由controller层调用生成或修改生成报告记录)
+	return retDocUrl, err
+}
+
+//参数字符串拆分
+func getParams(params string) map[string]string {
+	m := make(map[string]string)
+	params = strings.Replace(params, "petrotool://", "", -1)
+	params = strings.Replace(params, "/", "", -1)
+	paramAry := strings.Split(params, "&")
+	for _, v := range paramAry {
+		kv := strings.Split(v, "=")
+		m[kv[0]] = kv[1]
+	}
+	return m
+}
+
+func Copy(src, dst string) (int64, error) {
+	sourceFileStat, err := os.Stat(src)
+	if err != nil {
+		return 0, err
+	}
+
+	if !sourceFileStat.Mode().IsRegular() {
+		return 0, fmt.Errorf("%s is not a regular file", src)
+	}
+
+	source, err := os.Open(src)
+	if err != nil {
+		return 0, err
+	}
+	defer source.Close()
+
+	if ret, _ := PathExists(dst); !ret {
+		os.Remove(dst)
+	}
+
+	destination, err := os.Create(dst)
+	if err != nil {
+		return 0, err
+	}
+
+	defer destination.Close()
+	nBytes, err := io.Copy(destination, source)
+	return nBytes, err
+}
+