animeic-cd 1 年之前
當前提交
3f14598b84
共有 10 個文件被更改,包括 356 次插入0 次删除
  1. 0 0
      config.json
  2. 1 0
      data/readme.md
  3. 19 0
      go.mod
  4. 64 0
      go.sum
  5. 122 0
      main.go
  6. 44 0
      utils/download.go
  7. 22 0
      utils/model.go
  8. 46 0
      utils/readFile.go
  9. 31 0
      utils/version.go
  10. 7 0
      utils/zip.go

+ 0 - 0
config.json


+ 1 - 0
data/readme.md

@@ -0,0 +1 @@
+# 解压的应用文件

+ 19 - 0
go.mod

@@ -0,0 +1,19 @@
+module cr-launcher
+
+go 1.21.4
+
+require (
+	github.com/fatih/color v1.16.0
+	github.com/vbauerster/mpb/v8 v8.7.0
+)
+
+require (
+	github.com/VividCortex/ewma v1.2.0 // indirect
+	github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d // indirect
+	github.com/mattn/go-colorable v0.1.13 // indirect
+	github.com/mattn/go-isatty v0.0.20 // indirect
+	github.com/mattn/go-runewidth v0.0.15 // indirect
+	github.com/rivo/uniseg v0.4.4 // indirect
+	go.mongodb.org/mongo-driver v1.13.1
+	golang.org/x/sys v0.14.0 // indirect
+)

+ 64 - 0
go.sum

@@ -0,0 +1,64 @@
+github.com/VividCortex/ewma v1.2.0 h1:f58SaIzcDXrSy3kWaHNvuJgJ3Nmz59Zji6XoJR/q1ow=
+github.com/VividCortex/ewma v1.2.0/go.mod h1:nz4BbCtbLyFDeC9SUHbtcT5644juEuWfUAUnGx7j5l4=
+github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d h1:licZJFw2RwpHMqeKTCYkitsPqHNxTmd4SNR5r94FGM8=
+github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=
+github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=
+github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
+github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
+github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
+github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
+github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
+github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
+github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U=
+github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
+github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
+github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
+github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis=
+github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
+github.com/vbauerster/mpb/v8 v8.7.0 h1:n2LTGyol7qqNBcLQn8FL5Bga2O8CGF75OOYsJVFsfMg=
+github.com/vbauerster/mpb/v8 v8.7.0/go.mod h1:0RgdqeTpu6cDbdWeSaDvEvfgm9O598rBnRZ09HKaV0k=
+github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
+github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4=
+github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM=
+github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
+github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
+go.mongodb.org/mongo-driver v1.13.1 h1:YIc7HTYsKndGK4RFzJ3covLz1byri52x0IoMB0Pt/vk=
+go.mongodb.org/mongo-driver v1.13.1/go.mod h1:wcDf1JBCXy2mOW0bWHwO/IOYqdca1MPCwDtFu/Z9+eo=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q=
+golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
+golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

+ 122 - 0
main.go

@@ -0,0 +1,122 @@
+package main
+
+import (
+	"cr-launcher/utils"
+	"fmt"
+	"math/rand"
+	"os/exec"
+	"time"
+
+	"github.com/fatih/color"
+	"github.com/vbauerster/mpb/v8"
+	"github.com/vbauerster/mpb/v8/decor"
+)
+
+func main() {
+
+	// fmt.Println("xxxxxxxxxxxxx")
+	// http 获取版本信息
+	// 比较远程版本与本地版本
+	// http下载文件,更新版本信息
+
+	// 解压
+	// err := utils.WriteConfig(&utils.Config{
+	// 	Version: "2.0.0",
+	// 	Url:     "http://www.baidu.com",
+	// })
+	// fmt.Println(err)
+	// fmt.Println(config)
+	// fmt.Println(path.Base("http://www.dddfd.com/windows.zip"))
+	version, err := utils.GetLatest("http://127.0.0.1:8085/cr/version/latest")
+	config, _ := utils.ReadConfig()
+	if config == nil {
+		// fmt.Println(err)
+		fmt.Println("配置文件错误")
+		return
+	}
+	// 服务器最新版本有变动 更新
+	if version.Version != config.Version {
+		// todo
+		fmt.Println("更新")
+	}
+	// 运行应用程序
+	cmd := exec.Command("data/cr.exe")
+	data, err := cmd.Output()
+	if err != nil {
+		fmt.Println(err)
+		fmt.Println("启动失败")
+		return
+	}
+	fmt.Println(data)
+	fmt.Println("启动成功")
+
+	fmt.Println(err)
+	fmt.Println(config)
+
+	// to support color in Windows following both options are required
+	p := mpb.New(
+		mpb.WithOutput(color.Output),
+		mpb.WithAutoRefresh(),
+	)
+
+	red, green := color.New(color.FgRed), color.New(color.FgGreen)
+
+	fmt.Println("应用更新中...")
+	task := "windows.zip"
+	queue := make([]*mpb.Bar, 2)
+	queue[0] = p.AddBar(rand.Int63n(201)+100,
+		mpb.PrependDecorators(
+			decor.Name(task, decor.WC{C: decor.DindentRight | decor.DextraSpace}),
+			decor.Name("下载中:", decor.WCSyncSpaceR),
+			decor.CountersNoUnit("%d / %d", decor.WCSyncWidth),
+		),
+		mpb.AppendDecorators(
+			decor.OnComplete(decor.Percentage(decor.WC{W: 5}), "done"),
+		),
+	)
+	queue[1] = p.AddBar(rand.Int63n(101)+100,
+		mpb.BarQueueAfter(queue[0]), // this bar is queued
+		mpb.BarFillerClearOnComplete(),
+		mpb.PrependDecorators(
+			decor.Name(task, decor.WC{C: decor.DindentRight | decor.DextraSpace}),
+			decor.OnCompleteMeta(
+				decor.OnComplete(
+					decor.Meta(decor.Name("安装中:", decor.WCSyncSpaceR), toMetaFunc(red)),
+					"更新完成!",
+				),
+				toMetaFunc(green),
+			),
+			decor.OnComplete(decor.EwmaETA(decor.ET_STYLE_MMSS, 0, decor.WCSyncWidth), ""),
+		),
+		mpb.AppendDecorators(
+			decor.OnComplete(decor.Percentage(decor.WC{W: 5}), ""),
+		),
+	)
+
+	go func() {
+		for _, b := range queue {
+			complete(b)
+		}
+	}()
+
+	p.Wait()
+
+}
+
+func complete(bar *mpb.Bar) {
+	max := 100 * time.Millisecond
+	for !bar.Completed() {
+		// start variable is solely for EWMA calculation
+		// EWMA's unit of measure is an iteration's duration
+		start := time.Now()
+		time.Sleep(time.Duration(rand.Intn(10)+1) * max / 10)
+		// we need to call EwmaIncrement to fulfill ewma decorator's contract
+		bar.EwmaIncrInt64(rand.Int63n(5)+1, time.Since(start))
+	}
+}
+
+func toMetaFunc(c *color.Color) func(string) string {
+	return func(s string) string {
+		return c.Sprint(s)
+	}
+}

+ 44 - 0
utils/download.go

@@ -0,0 +1,44 @@
+package utils
+
+import (
+	"bufio"
+	"errors"
+	"fmt"
+	"io"
+	"net/http"
+	"os"
+	"path"
+)
+
+// http 获取版本信息
+// http下载
+// var appPath = "data"
+
+func DownloadZip(url string) error {
+	res, err := http.Get(url)
+	ext := path.Ext(url)
+	if ext != ".zip" {
+		return errors.New("非zip文件")
+	}
+	fileName := path.Base(url)
+	if err != nil {
+		fmt.Println(err)
+		return errors.New("get下载失败")
+	}
+	defer res.Body.Close()
+
+	reader := bufio.NewReader(res.Body)
+	file, err := os.Create(fileName)
+	if err != nil {
+		fmt.Println(err)
+		return errors.New("创建文件失败")
+	}
+
+	writer := bufio.NewWriter(file)
+	_, err = io.Copy(writer, reader)
+	if err != nil {
+		fmt.Println(err)
+		return errors.New("下载文件失败")
+	}
+	return nil
+}

+ 22 - 0
utils/model.go

@@ -0,0 +1,22 @@
+package utils
+
+import (
+	"time"
+
+	"go.mongodb.org/mongo-driver/bson/primitive"
+)
+
+// 版本管理
+type Versions struct {
+	Id       primitive.ObjectID `bson:"_id,omitempty" json:"_id"`
+	UserId   primitive.ObjectID `bson:"userId,omitempty" json:"userId"`
+	UserName string             `bson:"userName,omitempty" json:"userName"`
+
+	Name    string `bson:"name,omitempty" json:"name"`       // 名字
+	Size    string `bson:"size,omitempty" json:"size"`       // 大小 2000M
+	Url     string `bson:"url,omitempty" json:"url"`         // 安装包地址
+	Version string `bson:"version,omitempty" json:"version"` // 版本 1.0.0
+
+	CreateTime time.Time `bson:"createTime,omitempty" json:"createTime"`
+	UpdateTime time.Time `bson:"updateTime,omitempty" json:"updateTime"`
+}

+ 46 - 0
utils/readFile.go

@@ -0,0 +1,46 @@
+package utils
+
+import (
+	"bufio"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"os"
+)
+
+var ConfigPath = "config.json"
+
+type Config struct {
+	Version string
+	Url     string
+}
+
+func ReadConfig() (*Config, error) {
+	conf, err := os.Open(ConfigPath)
+	if err != nil {
+		fmt.Println(err)
+		return nil, errors.New("打开文件失败")
+	}
+	reader := bufio.NewReader(conf)
+	decoder := json.NewDecoder(reader)
+	config := &Config{}
+	err = decoder.Decode(config)
+	if err != nil {
+		return nil, errors.New("解析失败")
+	}
+	return config, nil
+}
+
+func WriteConfig(config *Config) error {
+	data, err := json.MarshalIndent(config, "", "  ")
+	if err != nil {
+		fmt.Println(err)
+		return errors.New("json marshal err")
+	}
+	err = os.WriteFile(ConfigPath, data, 0777)
+	if err != nil {
+		fmt.Println(err)
+		return errors.New("写入配置文件出错")
+	}
+	return nil
+}

+ 31 - 0
utils/version.go

@@ -0,0 +1,31 @@
+package utils
+
+import (
+	"encoding/json"
+	"errors"
+	"fmt"
+	"io"
+	"net/http"
+)
+
+func GetLatest(url string) (*Versions, error) {
+	res, err := http.Get(url)
+	if err != nil {
+		fmt.Println(err)
+		return nil, errors.New("get下载失败")
+	}
+	defer res.Body.Close()
+	body, err := io.ReadAll(res.Body)
+	if err != nil {
+		fmt.Println(err)
+		return nil, errors.New("version读取失败")
+	}
+	version := &Versions{}
+	err = json.Unmarshal(body, version)
+	if err != nil {
+		fmt.Println(err)
+		return nil, errors.New("unmarshal数据失败")
+	}
+
+	return version, nil
+}

+ 7 - 0
utils/zip.go

@@ -0,0 +1,7 @@
+package utils
+
+// 解压文件
+
+func Unzip(fileName string) error {
+	return nil
+}