├── .editorconfig ├── .gitignore ├── build ├── Dockerfile └── bootstrap.sh ├── cmd └── main │ ├── env.go │ ├── logo.go │ ├── main.go │ └── main_win.go ├── go.mod └── ui ├── .browserslistrc ├── .editorconfig ├── .gitignore ├── README.md ├── babel.config.js ├── package-lock.json ├── package.json ├── postcss.config.js ├── public └── index.html └── src ├── App.vue ├── assets └── logo.png ├── main.js ├── main.scss ├── router.js └── views ├── Home.vue └── Logo.vue /.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | 12 | [*.go] 13 | indent_size = 4 14 | 15 | [*.md] 16 | trim_trailing_whitespace = false 17 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | #idea 2 | .idea 3 | 4 | #dist 5 | /dist 6 | 7 | #bindata 8 | *_bin*.go 9 | 10 | #golang 11 | /.go 12 | go.sum -------------------------------------------------------------------------------- /build/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM buildpack-deps:stretch 2 | 3 | #安装node环境 4 | RUN groupadd --gid 1000 node \ 5 | && useradd --uid 1000 --gid node --shell /bin/bash --create-home node 6 | 7 | ENV NODE_VERSION 10.14.2 8 | 9 | RUN ARCH= && dpkgArch="$(dpkg --print-architecture)" \ 10 | && case "${dpkgArch##*-}" in \ 11 | amd64) ARCH='x64';; \ 12 | ppc64el) ARCH='ppc64le';; \ 13 | s390x) ARCH='s390x';; \ 14 | arm64) ARCH='arm64';; \ 15 | armhf) ARCH='armv7l';; \ 16 | i386) ARCH='x86';; \ 17 | *) echo "unsupported architecture"; exit 1 ;; \ 18 | esac \ 19 | # gpg keys listed at https://github.com/nodejs/node#release-keys 20 | && set -ex \ 21 | && for key in \ 22 | 94AE36675C464D64BAFA68DD7434390BDBE9B9C5 \ 23 | FD3A5288F042B6850C66B31F09FE44734EB7990E \ 24 | 71DCFD284A79C3B38668286BC97EC7A07EDE3FC1 \ 25 | DD8F2338BAE7501E3DD5AC78C273792F7D83545D \ 26 | C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 \ 27 | B9AE9905FFD7803F25714661B63B535A4C206CA9 \ 28 | 77984A986EBC2AA786BC0F66B01FBB92821C587A \ 29 | 8FCCA13FEF1D0C2E91008E09770F7A9A5AE15600 \ 30 | 4ED778F539E3634C779C87C6D7062848A1AB005C \ 31 | A48C2BEE680E841632CD4E44F07496B3EB3C1762 \ 32 | B9E2F5981AA6E0CD28160D9FF13993A75599653C \ 33 | ; do \ 34 | gpg --batch --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys "$key" || \ 35 | gpg --batch --keyserver hkp://ipv4.pool.sks-keyservers.net --recv-keys "$key" || \ 36 | gpg --batch --keyserver hkp://pgp.mit.edu:80 --recv-keys "$key" ; \ 37 | done \ 38 | && curl -fsSLO --compressed "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-$ARCH.tar.xz" \ 39 | && curl -fsSLO --compressed "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" \ 40 | && gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc \ 41 | && grep " node-v$NODE_VERSION-linux-$ARCH.tar.xz\$" SHASUMS256.txt | sha256sum -c - \ 42 | && tar -xJf "node-v$NODE_VERSION-linux-$ARCH.tar.xz" -C /usr/local --strip-components=1 --no-same-owner \ 43 | && rm "node-v$NODE_VERSION-linux-$ARCH.tar.xz" SHASUMS256.txt.asc SHASUMS256.txt \ 44 | && ln -s /usr/local/bin/node /usr/local/bin/nodejs 45 | 46 | #安装golang环境 47 | ENV GOLANG_VERSION 1.11.4 48 | 49 | RUN set -eux; \ 50 | \ 51 | # this "case" statement is generated via "update.sh" 52 | dpkgArch="$(dpkg --print-architecture)"; \ 53 | case "${dpkgArch##*-}" in \ 54 | amd64) goRelArch='linux-amd64'; goRelSha256='fb26c30e6a04ad937bbc657a1b5bba92f80096af1e8ee6da6430c045a8db3a5b' ;; \ 55 | armhf) goRelArch='linux-armv6l'; goRelSha256='9f7a71d27fef69f654a93e265560c8d9db1a2ca3f1dcdbe5288c46facfde5821' ;; \ 56 | arm64) goRelArch='linux-arm64'; goRelSha256='b76df430ba8caff197b8558921deef782cdb20b62fa36fa93f81a8c08ab7c8e7' ;; \ 57 | i386) goRelArch='linux-386'; goRelSha256='cecd2da1849043237d5f0756a93d601db6798fa3bb27a14563d201088aa415f3' ;; \ 58 | ppc64el) goRelArch='linux-ppc64le'; goRelSha256='1f10146826acd56716b00b9188079af53823ddd79ceb6362e78e2f3aafb370ab' ;; \ 59 | s390x) goRelArch='linux-s390x'; goRelSha256='4467442dacf89eb94c5d6f9f700204cb360be82db60e6296cc2ef8d0e890cd42' ;; \ 60 | *) goRelArch='src'; goRelSha256='4cfd42720a6b1e79a8024895fa6607b69972e8e32446df76d6ce79801bbadb15'; \ 61 | echo >&2; echo >&2 "warning: current architecture ($dpkgArch) does not have a corresponding Go binary release; will be building from source"; echo >&2 ;; \ 62 | esac; \ 63 | \ 64 | url="https://golang.org/dl/go${GOLANG_VERSION}.${goRelArch}.tar.gz"; \ 65 | wget -O go.tgz "$url"; \ 66 | echo "${goRelSha256} *go.tgz" | sha256sum -c -; \ 67 | tar -C /usr/local -xzf go.tgz; \ 68 | rm go.tgz; \ 69 | \ 70 | if [ "$goRelArch" = 'src' ]; then \ 71 | echo >&2; \ 72 | echo >&2 'error: UNIMPLEMENTED'; \ 73 | echo >&2 'TODO install golang-any from jessie-backports for GOROOT_BOOTSTRAP (and uninstall after build)'; \ 74 | echo >&2; \ 75 | exit 1; \ 76 | fi; \ 77 | \ 78 | export PATH="/usr/local/go/bin:$PATH"; \ 79 | go version 80 | 81 | ENV GOPATH /go 82 | ENV PATH $GOPATH/bin:/usr/local/go/bin:$PATH 83 | 84 | RUN mkdir -p "$GOPATH/src" "$GOPATH/bin" && chmod -R 777 "$GOPATH" 85 | 86 | #go-bindata 87 | RUN go get -u github.com/jteeuwen/go-bindata/... 88 | 89 | #安装必要的构建环境 90 | RUN apt-get update && apt-get install -y --no-install-recommends \ 91 | g++ \ 92 | gcc \ 93 | libc6-dev \ 94 | make \ 95 | pkg-config \ 96 | mingw-w64 \ 97 | git \ 98 | upx \ 99 | && rm -rf /var/lib/apt/lists/* 100 | 101 | #准备针对windows的golang环境配置 102 | ENV GOOS=windows 103 | ENV CGO_ENABLED=1 104 | 105 | #构建目录准备 106 | RUN mkdir /app 107 | RUN cd /app 108 | ADD ./bootstrap.sh /usr/local/bin/ 109 | RUN chmod +x /usr/local/bin/bootstrap.sh 110 | WORKDIR /app 111 | ENTRYPOINT /usr/local/bin/bootstrap.sh 112 | -------------------------------------------------------------------------------- /build/bootstrap.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | cd /app 4 | 5 | echo -e "----------\ncleaning...\n----------" 6 | rm -rf ./dist 7 | rm -rf ./ui/dist 8 | 9 | echo -e "----------\nbuild web ui...\n----------" 10 | cd /app/ui 11 | npm ci 12 | npm run build 13 | 14 | echo -e "----------\ngenerate bin data file...\n----------" 15 | go-bindata -o bin/ui_bin.go -pkg ui -prefix ./dist ./dist/... 16 | 17 | echo -e "----------\nbuild go application...\n----------" 18 | if [ "${GOARCH}" = "386" ];then 19 | export CC=i686-w64-mingw32-gcc 20 | else 21 | export CC=x86_64-w64-mingw32-gcc 22 | fi 23 | 24 | export GOPATH=/app/.go 25 | 26 | cd /app 27 | go build \ 28 | -tags="bdebug" \ 29 | -ldflags="-H=windowsgui" \ 30 | -o dist/blink-demo.exe \ 31 | blink-demo/cmd/main 32 | 33 | echo -e "----------\ncompress executable file...\n----------" 34 | upx dist/blink-demo.exe 35 | 36 | 37 | -------------------------------------------------------------------------------- /cmd/main/env.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "log" 5 | "os" 6 | ) 7 | 8 | //把UI的地址独立出来,方便开发的时候能够指定为开发地址,方便实时刷新,默认使用内嵌资源域名(app) 9 | var uiAddress = "http://app/" 10 | 11 | func init() { 12 | //如果环境变量中指定了ui地址,则使用环境变量中的 13 | if address, exist := os.LookupEnv("BLINK_UI"); exist { 14 | log.Println("使用指定的UI地址:", address) 15 | uiAddress = address 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /cmd/main/logo.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "github.com/lxn/win" 5 | "github.com/raintean/blink" 6 | ) 7 | 8 | func showLogo() { 9 | //启动小图标 10 | //获取屏幕大小 11 | logoWin := blink.NewWebView(true, 12 | 117, 133, 13 | int(win.GetSystemMetrics(win.SM_CXSCREEN)/5*4), 14 | int(win.GetSystemMetrics(win.SM_CYSCREEN)/5)) 15 | 16 | logoWin.LoadURL(uiAddress + "index.html#/logo") 17 | logoWin.HideDockIcon() 18 | logoWin.ShowWindow() 19 | 20 | //注入打开主窗口函数 21 | logoWin.Inject("OpenMainWin", showMain) 22 | } 23 | -------------------------------------------------------------------------------- /cmd/main/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "blink-demo/ui/bin" 5 | "github.com/elazarl/go-bindata-assetfs" 6 | "github.com/raintean/blink" 7 | "log" 8 | ) 9 | 10 | func main() { 11 | //退出信号 12 | exit := make(chan bool) 13 | 14 | //启用调试模式 15 | blink.SetDebugMode(true) 16 | 17 | //初始化blink 18 | err := blink.InitBlink() 19 | if err != nil { 20 | log.Fatal(err) 21 | } 22 | 23 | //挂载嵌入资源到虚拟文件系统 24 | blink.RegisterFileSystem("app", &assetfs.AssetFS{ 25 | Asset: ui.Asset, 26 | AssetDir: ui.AssetDir, 27 | AssetInfo: ui.AssetInfo, 28 | }) 29 | 30 | //显示logo小图标 31 | showLogo() 32 | 33 | //等待退出 34 | <-exit 35 | } 36 | -------------------------------------------------------------------------------- /cmd/main/main_win.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "github.com/raintean/blink" 4 | 5 | var mainWin *blink.WebView 6 | 7 | func showMain() { 8 | if mainWin == nil { 9 | //窗口不存在,新建一个 10 | mainWin = blink.NewWebView(false, 1366, 920) 11 | mainWin.LoadURL(uiAddress + "index.html#/") 12 | mainWin.SetWindowTitle("Blink Demo") 13 | mainWin.MoveToCenter() 14 | mainWin.ShowWindow() 15 | mainWin.ToTop() 16 | 17 | //当窗口被销毁的时候,变量=nil 18 | mainWin.On("destroy", func(_ *blink.WebView) { 19 | mainWin = nil 20 | }) 21 | } else { 22 | //窗口实例存在,则提到前台 23 | mainWin.RestoreWindow() 24 | mainWin.MoveToCenter() 25 | mainWin.ToTop() 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module blink-demo 2 | 3 | require ( 4 | github.com/elazarl/go-bindata-assetfs v1.0.0 5 | github.com/lxn/win v0.0.0-20181015143721-a7f87360b10e 6 | github.com/raintean/blink v0.0.0-20181222031143-7cfbf1b6f5ee 7 | ) 8 | -------------------------------------------------------------------------------- /ui/.browserslistrc: -------------------------------------------------------------------------------- 1 | > 1% 2 | last 2 versions 3 | not ie <= 8 4 | -------------------------------------------------------------------------------- /ui/.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | 12 | [*.md] 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /ui/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | 5 | # local env files 6 | .env.local 7 | .env.*.local 8 | 9 | # Log files 10 | npm-debug.log* 11 | yarn-debug.log* 12 | yarn-error.log* 13 | 14 | # Editor directories and files 15 | .idea 16 | .vscode 17 | *.suo 18 | *.ntvs* 19 | *.njsproj 20 | *.sln 21 | *.sw* 22 | -------------------------------------------------------------------------------- /ui/README.md: -------------------------------------------------------------------------------- 1 | # ui 2 | 3 | ## Project setup 4 | ``` 5 | yarn install 6 | ``` 7 | 8 | ### Compiles and hot-reloads for development 9 | ``` 10 | yarn run serve 11 | ``` 12 | 13 | ### Compiles and minifies for production 14 | ``` 15 | yarn run build 16 | ``` 17 | 18 | ### Run your tests 19 | ``` 20 | yarn run test 21 | ``` 22 | 23 | ### Lints and fixes files 24 | ``` 25 | yarn run lint 26 | ``` 27 | 28 | ### Customize configuration 29 | See [Configuration Reference](https://cli.vuejs.org/config/). 30 | -------------------------------------------------------------------------------- /ui/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | '@vue/app' 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /ui/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ui", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "serve": "vue-cli-service serve", 7 | "build": "vue-cli-service build" 8 | }, 9 | "dependencies": { 10 | "vue": "^2.5.17", 11 | "vue-router": "^3.0.1" 12 | }, 13 | "devDependencies": { 14 | "@vue/cli-plugin-babel": "^3.2.0", 15 | "@vue/cli-service": "^3.2.0", 16 | "node-sass": "^4.9.0", 17 | "sass-loader": "^7.0.1", 18 | "vue-template-compiler": "^2.5.17" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /ui/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | autoprefixer: {} 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /ui/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | 6 | 7 |