diff --git a/Makefile b/Makefile index bb46e980..16f3c9be 100644 --- a/Makefile +++ b/Makefile @@ -9,7 +9,7 @@ VERSION := $(shell grep 'const VERSION =' share/const.go |awk '{print $$4}' |sed TESTFOLDER := $(shell $(GO) list ./... | grep -vE 'examples|tests*|config') TESTTAGS ?= "" -# 运行单元测试 +# Unit Test .PHONY: test test: echo "mode: count" > coverage.out @@ -79,7 +79,7 @@ tools: go install golang.org/x/lint/golint; \ go install github.com/client9/misspell/cmd/misspell; -# 编译测试用插件 +# make plugin .PHONY: plugin plugin: rm -rf $(HOME)/data/gou-unit/plugins @@ -91,172 +91,36 @@ plugin: ls -l $(HOME)/data/gou-unit/plugins ls -l $(HOME)/data/gou-unit/logs $(HOME)/data/gou-unit/plugins/user.so 2>&1 || true + +# make plugin-mac +.PHONY: plugin-mac plugin-mac: rm -rf ./tests/plugins/user/dist rm -rf ./tests/plugins/user.so go build -o ./tests/plugins/user.so ./tests/plugins/user chmod +x ./tests/plugins/user.so -# 编译静态文件 -.PHONY: static -static: - git clone git@github.com:YaoApp/xiang-saas-ui-kxy .tmp/ui - cd .tmp/ui && yarn install && yarn build - rm -rf ui - mv .tmp/ui/dist ui - rm -rf .tmp/ui -# 将静态文件打包到命令工具 -.PHONY: bindata -bindata: gen-bindata fmt -# 将静态文件打包到命令工具 -.PHONY: gen-bindata -gen-bindata: +# make pack +.PHONY: pack +pack: mkdir -p .tmp/data cp -r ui .tmp/data/ cp -r xiang .tmp/data/ go-bindata -fs -pkg data -o data/bindata.go -prefix ".tmp/data/" .tmp/data/... rm -rf .tmp/data -# 编译可执行文件 -.PHONY: xiang -xiang: bindata - - if [ ! -z "${XIANG_DOMAIN}" ]; then \ - mv share/const.go share/const.go.bak; \ - sed "s/*.iqka.com/$(XIANG_DOMAIN)/g" share/const.go.bak > share/const.go; \ - fi; - -# GOOS=linux GOARCH=amd64 go build -v -o .tmp/xiang-linux-amd64 -# GOOS=linux GOARCH=arm GOARM=7 go build -v -o .tmp/xiang-linux-arm -# GOOS=linux GOARCH=arm64 GOARM=7 go build -v -o .tmp/xiang-linux-arm64 - GOOS=darwin GOARCH=amd64 go build -v -o .tmp/xiang-darwin-amd64 - mkdir -p dist/bin - mv .tmp/xiang-*-* dist/bin/ - chmod +x dist/bin/xiang-*-* - - if [ ! -z "${XIANG_DOMAIN}" ]; then \ - rm share/const.go; \ - mv share/const.go.bak share/const.go; \ - fi; - -.PHONY: release -release: clean - mkdir -p dist/release - git clone git@github.com:YaoApp/yao.git dist/release - git clone git@github.com:YaoApp/kun.git dist/kun - git clone git@github.com:YaoApp/xun.git dist/xun - git clone git@github.com:YaoApp/gou.git dist/gou - -# UI制品 - git clone git@github.com:YaoApp/xiang-ui .tmp/ui - sed -ie "s/url('\/icon/url('\/xiang\/icon/g" .tmp/ui/public/icon/md_icon.css - cd .tmp/ui && cnpm install && npm run build - rm -rf dist/release/ui - mv .tmp/ui/dist dist/release/ui - -# 静态文件打包 - mkdir -p .tmp/data - cp -r dist/release/ui .tmp/data/ - cp -r dist/release/xiang .tmp/data/ - go-bindata -fs -pkg data -o dist/release/data/bindata.go -prefix ".tmp/data/" .tmp/data/... - rm -rf .tmp/data - rm -rf .tmp/ui - -# 制品 - if [ ! -z "${XIANG_DOMAIN}" ]; then \ - mv dist/release/share/const.go dist/release/share/const.go.bak; \ - sed "s/*.iqka.com/$(XIANG_DOMAIN)/g" dist/release/share/const.go.bak > dist/release/share/const.go; \ - fi; - -# cd dist/release && CGO_ENABLED=1 CC=x86_64-linux-musl-gcc CGO_LDFLAGS="-static" GOOS=linux GOARCH=amd64 go build -v -o ../../.tmp/xiang-${VERSION}-linux-amd64 -# cd dist/release && GOOS=linux GOARCH=arm GOARM=7 go build -v -o ../../.tmp/xiang-${VERSION}-linux-arm -# cd dist/release && GOOS=linux GOARCH=arm64 GOARM=7 go build -v -o ../../.tmp/xiang-${VERSION}-linux-arm64 - cd dist/release && CGO_ENABLED=1 GOOS=darwin GOARCH=amd64 go build -v -o ../../.tmp/xiang-${VERSION}-darwin-amd64 -# cd dist/release && GOOS=windows GOARCH=386 go build -v -o ../../.tmp/xiang-${VERSION}-windows-386 - - rm -rf dist/release - mkdir -p dist/release - mv .tmp/xiang-*-* dist/release/ - chmod +x dist/release/xiang-*-* - -.PHONY: hi -hi: - echo ${VERSION} - -.PHONY: arm -arm: clean - mkdir -p dist/release - git clone git@github.com:YaoApp/yao.git dist/release - git clone git@github.com:YaoApp/kun.git dist/kun - git clone git@github.com:YaoApp/xun.git dist/xun - git clone git@github.com:YaoApp/gou.git dist/gou - -# UI制品 - git clone git@github.com:YaoApp/xiang-ui.git .tmp/ui - sed -ie "s/url('\/icon/url('\/xiang\/icon/g" .tmp/ui/public/icon/md_icon.css - cd .tmp/ui && cnpm install && npm run build - rm -rf dist/release/ui - mv .tmp/ui/dist dist/release/ui - -# 静态文件打包 - mkdir -p .tmp/data - cp -r dist/release/ui .tmp/data/ - cp -r dist/release/xiang .tmp/data/ - go-bindata -fs -pkg data -o dist/release/data/bindata.go -prefix ".tmp/data/" .tmp/data/... - rm -rf .tmp/data - rm -rf .tmp/ui - -# 制品 - mkdir -p dist - cd dist/release && CC=arm-linux-gnueabi-gcc CXX=arm-linux-gnueabi-g++ CGO_ENABLED=1 GOOS=linux GOARCH=arm GOARM=7 go build -v -o ../../.tmp/xiang-${VERSION}-linux-arm - - rm -rf dist/release - mkdir -p dist/release - mv .tmp/xiang-*-* dist/release/ - chmod +x dist/release/xiang-*-* - -.PHONY: linux -linux: clean - mkdir -p dist/release - git clone git@github.com:YaoApp/yao.git dist/release - git clone git@github.com:YaoApp/kun.git dist/kun - git clone git@github.com:YaoApp/xun.git dist/xun - git clone git@github.com:YaoApp/gou.git dist/gou - -# UI制品 - git clone git@github.com:YaoApp/xiang-ui.git .tmp/ui - sed -ie "s/url('\/icon/url('\/xiang\/icon/g" .tmp/ui/public/icon/md_icon.css - cd .tmp/ui && cnpm install && npm run build - rm -rf dist/release/ui - mv .tmp/ui/dist dist/release/ui - -# 静态文件打包 - mkdir -p .tmp/data - cp -r dist/release/ui .tmp/data/ - cp -r dist/release/xiang .tmp/data/ - go-bindata -fs -pkg data -o dist/release/data/bindata.go -prefix ".tmp/data/" .tmp/data/... - rm -rf .tmp/data - rm -rf .tmp/ui - -# 制品 - mkdir -p dist - cd dist/release && CGO_ENABLED=1 CGO_LDFLAGS="-static" GOOS=linux GOARCH=amd64 go build -v -o ../../.tmp/xiang-${VERSION}-linux-amd64 - - rm -rf dist/release - mkdir -p dist/release - mv .tmp/xiang-*-* dist/release/ - chmod +x dist/release/xiang-*-* +# make artifacts-linux .PHONY: artifacts-linux artifacts-linux: clean mkdir -p dist/release -# UI制品 +# Building UI sed -ie "s/url('\/icon/url('\/xiang\/icon/g" ../ui/public/icon/md_icon.css cd ../ui && npm install && npm run build -# 静态文件打包 +# Packing mkdir -p .tmp/data cp -r ../ui/dist .tmp/data/ui cp -r xiang .tmp/data/ @@ -264,7 +128,7 @@ artifacts-linux: clean rm -rf .tmp/data rm -rf .tmp/ui -# 制品 +# Making artifacts mkdir -p dist CGO_ENABLED=1 CGO_LDFLAGS="-static" GOOS=linux GOARCH=amd64 go build -v -o dist/yao-${VERSION}-linux-amd64 CGO_ENABLED=1 CGO_LDFLAGS="-static" GOOS=linux GOARCH=arm64 CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++ go build -v -o dist/yao-${VERSION}-linux-arm64 @@ -275,15 +139,16 @@ artifacts-linux: clean ls -l dist/release/ dist/release/yao-${VERSION}-linux-amd64 version +# make artifacts-macos .PHONY: artifacts-macos artifacts-macos: clean mkdir -p dist/release -# UI制品 +# Building UI sed -ie "s/url('\/icon/url('\/xiang\/icon/g" ../ui/public/icon/md_icon.css cd ../ui && npm install && npm run build -# 静态文件打包 +# Packing mkdir -p .tmp/data cp -r ../ui/dist .tmp/data/ui cp -r xiang .tmp/data/ @@ -291,7 +156,7 @@ artifacts-macos: clean rm -rf .tmp/data rm -rf .tmp/ui -# 制品 +# Making artifacts mkdir -p dist CGO_ENABLED=1 CGO_ENABLED=1 GOOS=darwin GOARCH=amd64 go build -v -o dist/yao-${VERSION}-darwin-amd64 CGO_ENABLED=1 CGO_ENABLED=1 GOOS=darwin GOARCH=arm64 go build -v -o dist/yao-${VERSION}-darwin-arm64 @@ -302,21 +167,14 @@ artifacts-macos: clean ls -l dist/release/ dist/release/yao-${VERSION}-darwin-amd64 version -.PHONY: win32 -win32: bindata - GOOS=windows GOARCH=386 go build -v -o .tmp/xiang-windows-386 - mkdir -p dist/bin - mv .tmp/xiang-*-* dist/bin/ - chmod +x dist/bin/xiang-*-* - - +# make clean .PHONY: clean clean: rm -rf ./tmp rm -rf .tmp rm -rf dist - +# make migrate ( for unit test) .PHONY: migrate migrate: $(GO) test -tags $(TESTTAGS) -run TestCommandMigrate$ \ No newline at end of file diff --git a/README.md b/README.md index 0d7ae216..78d79f0b 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,9 @@ Yao 是一款 **Go** 语言驱动的低代码应用引擎,通过编写 JSON 描述即可快速制作 **API 接口**,**数据管理系统** ,**命令行工具** 等应用程序,应用可以运行在本地、云端和物联网设备上。 +官方网站: [https://yaoapps.com](https://yaoapps.com) +文档地址: [https://yaoapps.com/doc](https://yaoapps.com/doc) + ## 介绍 Yao 基于 **flow-based** 编程思想,采用 **Go** 语言开发,支持多种方式扩展数据流处理器。这使得 Yao 具有极好的**通用性**,大部分场景下可以代替编程语言, 在复用性和编码效率上是传统编程语言的 **10 倍**;应用性能和资源占比上优于 **PHP**, **JAVA** 等语言。 @@ -25,16 +28,20 @@ Yao 的名字源于汉字**爻(yáo)**,是构成八卦的基本符号。八卦 ## 起步 -**注意:开始前需要了解 JSON、RESTFulAPI、关系型数据库的基本概念和常识,并可以使用常见终端命令。如需处理非常复杂的业务逻辑,则需要掌握 JavaScript 语言。** +**注意** -我们准备了一个在线开发调试环境,帮助您快速上手体验。**在线开发环境仅做体验使用, 数据每小时重置** , 在实际开发中,请在本地安装 Yao 进行开发调试,具体参考 [安装调试](/a.介绍/b.安装调试.mdx) 章节的文档。如果您的应用开发完成,需要在生产环境部署,请参考 [部署](/e.部署.mdx) 章节文档。 +- 开始前需要了解 JSON、RESTFul API、关系型数据库的基本概念和常识,并可以使用常见终端命令。 +- 如需处理非常复杂的业务逻辑,则需要掌握 JavaScript 语言。\* - +在终端下运行脚本: ( MacOS / Linux ) + +```bash +curl -fsSL https://website.yaoapps.com/install.sh | bash +``` + +[Windows 开发者请参考安装调试章节](https://yaoapps.com/doc/a.%E4%BB%8B%E7%BB%8D/b.%E5%AE%89%E8%A3%85%E8%B0%83%E8%AF%95) ### 第一步: 创建项目 @@ -46,104 +53,17 @@ cd /data/crm # 进入项目目录 yao init # 运行初始化程序 ``` -命令运行成功后,将创建 `app.json文件` , `db目录`, `ui目录` 和 `data目录` +命令运行成功后,将创建 `app.json文件` , `db`, `ui` , `data` 等目录 ```bash ├── data # 用于存放应用产生的文件,如图片,PDF等 ├── db # 用于存放 SQLite 数据库文件 -│ └── xiang.db +│ └── yao.db └── ui # 静态文件服务器文件目录,可以放置自定义前端制品,该目录下文件可通过 http://host:port/文件名称 访问。 └── app.json # 应用配置文件, 用来定义应用名称等 ``` -### 第二步: 创建数据模型 - -设计一张数据表 customer,用于存放客户资料数据。数据表结构如下: - -| 字段 | 类型 | 长度/参数 | 默认值 | 说明 | -| ---------- | ---------- | -------------------------- | ------- | ------------------------- | -| id | ID | | | 数据表 ID | -| channel_id | bigInteger | | | 客户来源 | -| name | string | 80 | | 客户姓名 | -| company | string | 200 | | 公司名称 | -| gender | integer | | 0 | 性别 0, 未知,1 男,2,女 | -| birthday | date | | | 生日 | -| desc | text | | | 简历 | -| status | enum | ["enabled"], ["disabled"], | enabled | 状态 | - -创建数据表对应的 `JSON 描述文件` : - -在项目 `models` 目录下 (例如: `/data/crm/models`),创建数据模型描述文件 `customer.mod.json` - -```json -{ - "name": "客户", - "table": { "name": "customer", "comment": "客户表" }, - "columns": [ - { "label": "ID", "name": "id", "type": "ID", "comment": "ID" }, - { - "label": "来源", - "name": "channel_id", - "type": "bigInteger", - "comment": "客户来源", - "nullable": true, - "index": true - }, - { - "label": "姓名", - "name": "name", - "type": "string", - "length": 80, - "comment": "客户姓名", - "nullable": true, - "index": true - }, - { - "label": "公司", - "name": "company", - "type": "string", - "length": 200, - "comment": "公司全称", - "nullable": true, - "index": true - }, - { - "label": "性别", - "name": "gender", - "type": "integer", - "comment": "性别", - "default": 0, - "index": true - }, - { - "label": "生日", - "name": "birthday", - "type": "date", - "comment": "性别", - "nullable": true, - "index": true - }, - { - "label": "介绍", - "name": "desc", - "type": "text", - "comment": "介绍", - "nullable": true - }, - { - "label": "状态", - "name": "status", - "type": "enum", - "default": "enabled", - "option": ["enabled", "disabled"], - "comment": "状态 enabled 开启, disabled 关闭", - "index": true - } - ], - "option": { "timestamps": true, "soft_deletes": true }, - "values": [{ "id": 1, "name": "莉莉", "company": "yaoapps.com" }] -} -``` +### 第二步: 创建数据表 使用 `yao migrate` 命令创建数据表,打开命令行终端,**在项目根录下运行**: @@ -151,77 +71,13 @@ yao init # 运行初始化程序 yao migrate ``` -**技巧: 调试过程中,需要频繁检查数据。可以使用 `yao run` 命令查询数据。例如:在命令行终端中运行 `yao run models.customer.find 1` 即可查询 `customer` 数据表 ID=1 的数据。** +初始化菜单 -### 第三步: 编写管理界面 - -在项目 `tables` 目录下 (例如: `/data/crm/models`),创建数据表格描述文件 `customer.tab.json` - -```json -{ - "name": "客户", - "version": "1.0.0", - "decription": "客户管理数据表格", - "bind": { - "model": "customer" - }, - "columns": {}, - "filters": { - "关键词": { "@": "filter.关键词", "in": ["where.name.match"] }, - "排序": { "@": "filter.排序" } - }, - "list": { - "primary": "id", - "layout": { - "columns": [ - { "name": "ID", "width": 80 }, - { "name": "公司", "width": 200 }, - { "name": "姓名", "width": 100 }, - { "name": "性别", "width": 80 }, - { "name": "生日", "width": 100 }, - { "name": "来源", "width": 80 }, - { "name": "状态", "width": 140 }, - { "name": "更新时间", "width": 160 } - ], - "filters": [{ "name": "关键词" }, { "name": "来源", "width": 3 }] - }, - "actions": { - "create": { - "type": "button", - "props": { "label": "添加客户", "icon": "fas fa-plus" } - }, - "pagination": {} - } - }, - "edit": { - "primary": "id", - "layout": { - "fieldset": [ - { - "columns": [ - { "name": "姓名", "width": 12 }, - { "name": "性别", "width": 3 }, - { "name": "生日", "width": 3 }, - { "name": "来源", "width": 3 }, - { "name": "状态", "width": 3 }, - { "name": "公司", "width": 24 }, - { "name": "介绍", "width": 24 } - ] - } - ] - }, - "actions": { - "cancel": {}, - "save": { "@": "action.保存" }, - "delete": { "@": "action.删除" } - } - } -} +```bash +yao run flows.setmenu ``` -**注意:由于该项目诞生之初主要是为了提高团队内部生产力,在约定俗成的写法描述下,并没有做细粒度的抛错处理,所以开发者可能会在编写 JSON 调试界面的过程当中遇到界面为空的情况。处置方式请查阅组件文档。** - -**启动服务** +### 第三步: 启动服务 打开命令行终端,**在项目根录下运行**: @@ -232,7 +88,3 @@ yao start 1. 打开浏览器, 访问 `https://127.0.0.1:5099/xiang/login/admin`, 2. 输入默认用户名: `xiang@iqka.com`, 密码: `A123456p+` - -3. 成功登录后,在地址栏输入 `https://127.0.0.1:5099/xiang/table/customer` - -4. 建议将 `/xiang/table/customer` 路由添加为菜单项。 diff --git a/build/arm.sh b/build/arm.sh deleted file mode 100755 index 935a35c3..00000000 --- a/build/arm.sh +++ /dev/null @@ -1,6 +0,0 @@ -# /bin/bash -go clean --cache -CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++ \ - CGO_ENABLED=1 GOOS=linux GOARCH=arm64 \ - go build -ldflags="-extldflags=-static" -v -o ./yao-arm64 - diff --git a/debug.sh b/debug.sh deleted file mode 100755 index 05463cbd..00000000 --- a/debug.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -make clean -make xiang -VERSION=$(go run . version) -rm -rf ../xiang-spec/xiang/* -cp dist/bin/xiang-* ../xiang-spec/xiang/ -rm -f ~/Code/bin/xiang -rm -f ~/Code/bin/yao -ln -s ~/Code/yao/xiang-spec/xiang/xiang-darwin-amd64 ~/Code/bin/xiang -ln -s ~/Code/yao/xiang-spec/xiang/xiang-darwin-amd64 ~/Code/bin/yao - -make clean \ No newline at end of file diff --git a/docs/assets/engine.png b/docs/assets/engine.png deleted file mode 100644 index b3d0e2e6..00000000 Binary files a/docs/assets/engine.png and /dev/null differ diff --git a/release.sh b/release.sh deleted file mode 100755 index 4021e4bb..00000000 --- a/release.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash - -repace() { - echo $1 - sed -E "$1" /data/release/ui/install.sh > /data/release/ui/install.sh.new -} - -# 关闭代理 -all_proxy="" -http_proxy="" -https_proxy="" - -VERSION=$(go run . version) -ssh max@demo-crm.iqka.com mkdir -p /data/demo-crm/ui/releases/$VERSION/ -ssh max@demo-crm.iqka.com "echo {\\\"version\\\":\\\"$VERSION\\\"} > /data/demo-crm/ui/releases/latest.json" -scp ~/Code/bin/xiang-$VERSION-linux-amd64 max@demo-crm.iqka.com:/data/demo-crm/ui/releases/$VERSION/yao-$VERSION-linux-amd64 -scp ~/Code/bin/xiang-$VERSION-darwin-amd64 max@demo-crm.iqka.com:/data/demo-crm/ui/releases/$VERSION/yao-$VERSION-darwin-amd64 -# scp ~/Code/bin/xiang-$VERSION-windows-386 max@demo-crm.iqka.com:/data/demo-crm/ui/releases/$VERSION/yao-$VERSION-windows-386 - -repace "s/[0-9]+\.[0-9]+\.[0-9]+/$VERSION/g" -scp ~/Code/yao/xiang/shell/install.sh.new max@demo-crm.iqka.com:/data/demo-crm/ui/releases/$VERSION/install.sh -rm ~/Code/yao/xiang/shell/install.sh.new - diff --git a/spec.sh b/spec.sh deleted file mode 100755 index ee8b8800..00000000 --- a/spec.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash - -repace() { - echo $1 - sed -E "$1" ~/Code/yao/xiang-spec/README.md > ~/Code/yao/xiang-spec/README.new.md - rm ~/Code/yao/xiang-spec/README.md - mv ~/Code/yao/xiang-spec/README.new.md ~/Code/yao/xiang-spec/README.md -} - -make release -VERSION=$(go run . version) -rm -rf ../xiang-spec/xiang/* -cp dist/release/xiang-* ~/Code/bin/ -rm -f ~/Code/bin/xiang -rm -f ~/Code/bin/yao -ln -s ~/Code/bin/xiang-$VERSION-darwin-amd64 ~/Code/bin/xiang -ln -s ~/Code/bin/xiang-$VERSION-darwin-amd64 ~/Code/bin/yao - -# 更新 README.md 中的版本 -# repace "s/\[[0-9]+\.[0-9]+\.[0-9]+\]/[$VERSION]/g" -# repace "s/\-[0-9]+\.[0-9]+\.[0-9]+\-/-$VERSION-/g" -# repace "s/Version\:[0-9]+\.[0-9]+\.[0-9]+/Version:$VERSION/g" - -make clean \ No newline at end of file