Browse Source

fix

main
cobb 4 years ago
parent
commit
7b0ae93980
  1. 40
      main.go
  2. 18
      package-lock.json
  3. 2
      package.json
  4. 2
      src/App.vue
  5. 209
      src/components/HelloWorld.vue
  6. 89
      src/components/preview/previewCodeDialg.vue
  7. 21
      src/tmp.js

40
main.go

@ -13,7 +13,45 @@ var (
func main() { func main() {
pflag.Parse() pflag.Parse()
res, err := parser.ParseSqlFormat(*input,
s := `
CREATE TABLE IF NOT EXISTS gb_service_people (
id int(10) NOT NULL AUTO_INCREMENT,
name varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '名字',
avatar varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '头像',
description varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '描述',
show_status int(1) DEFAULT NULL COMMENT '显示状态1->显示2->不显示',
duty_date varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '值班时间数组,每周天数 1,2,3,4,5,6,7',
type_id int(11) NOT NULL COMMENT '分类ID',
type_name varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '分类名称',
sort int(5) NULL DEFAULT 1 COMMENT '排序',
create_time int(11) NULL DEFAULT 0 COMMENT '创建时间',
update_time int(11) NULL DEFAULT 0 COMMENT '更新时间',
PRIMARY KEY (id) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '服务保障人员信息' ROW_FORMAT = Compact;
CREATE TABLE IF NOT EXISTS gb_service_message (
id int(10) NOT NULL AUTO_INCREMENT,
people_id bigint(20) DEFAULT NULL COMMENT '关联的服务人员id',
commenter varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '留言者名字',
commenter_contact varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '留言者联系方式',
comment text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '留言内容',
status int(1) DEFAULT NULL COMMENT '显示状态1->显示2->不显示',
create_time int(11) NULL DEFAULT 0 COMMENT '创建时间',
update_time int(11) NULL DEFAULT 0 COMMENT '更新时间',
PRIMARY KEY (id) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '服务保障留言信息' ROW_FORMAT = Compact;
CREATE TABLE IF NOT EXISTS gb_service_type (
id bigint(20) NOT NULL AUTO_INCREMENT,
name varchar(64) DEFAULT NULL COMMENT '分类名称',
sort int(11) DEFAULT NULL COMMENT '排序',
icon varchar(255) DEFAULT NULL COMMENT '图标',
description text DEFAULT NULL COMMENT '描述',
PRIMARY KEY (id)
) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8mb4 COMMENT = '服务保障分类';
`
res, err := parser.ParseSqlFormat(s,
parser.WithGormType(), parser.WithGormType(),
parser.WithJsonTag(), parser.WithJsonTag(),
) )

18
package-lock.json

@ -3548,6 +3548,12 @@
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true "dev": true
}, },
"highlight.js": {
"version": "10.7.3",
"resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz",
"integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==",
"dev": true
},
"supports-color": { "supports-color": {
"version": "7.2.0", "version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
@ -6347,10 +6353,9 @@
"dev": true "dev": true
}, },
"highlight.js": { "highlight.js": {
"version": "10.7.3",
"resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz",
"integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==",
"dev": true
"version": "11.5.0",
"resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.5.0.tgz",
"integrity": "sha512-SM6WDj5/C+VfIY8pZ6yW6Xa0Fm1tniYVYWYW1Q/DcMnISZFrC3aQAZZZFAAZtybKNrGId3p/DNbFTtcTXXgYBw=="
}, },
"hmac-drbg": { "hmac-drbg": {
"version": "1.0.1", "version": "1.0.1",
@ -7629,6 +7634,11 @@
"object-visit": "^1.0.0" "object-visit": "^1.0.0"
} }
}, },
"marked": {
"version": "4.0.12",
"resolved": "https://registry.npmjs.org/marked/-/marked-4.0.12.tgz",
"integrity": "sha512-hgibXWrEDNBWgGiK18j/4lkS6ihTe9sxtV4Q1OQppb/0zzyPSzoFANBa5MfsG/zgsWklmNnhm0XACZOH/0HBiQ=="
},
"md5.js": { "md5.js": {
"version": "1.3.5", "version": "1.3.5",
"resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",

2
package.json

@ -12,6 +12,8 @@
"codemirror": "^5.61.0", "codemirror": "^5.61.0",
"core-js": "^3.6.5", "core-js": "^3.6.5",
"element-ui": "^2.15.1", "element-ui": "^2.15.1",
"highlight.js": "^11.5.0",
"marked": "^4.0.12",
"script-loader": "^0.7.2", "script-loader": "^0.7.2",
"shelljs": "^0.8.5", "shelljs": "^0.8.5",
"sql-ddl-to-json-schema": "^4.0.4", "sql-ddl-to-json-schema": "^4.0.4",

2
src/App.vue

@ -5,7 +5,7 @@
</template> </template>
<script> <script>
import HelloWorld from './components/HelloWorld.vue'
import HelloWorld from '@/components/HelloWorld.vue'
export default { export default {

209
src/components/HelloWorld.vue

@ -10,17 +10,6 @@
> >
</el-input> </el-input>
<div style="margin: 20px 0"></div> <div style="margin: 20px 0"></div>
<vue-json-editor
v-model="schema"
:showBtns="true"
:mode="'text'"
lang="zh"
@json-change="onJsonChange"
@json-save="onJsonSave"
@has-error="onError"
/>
<br />
<div style="margin: 20px 0"></div>
<el-row> <el-row>
<el-col :span="24"> <el-col :span="24">
<s-json-schema-editor <s-json-schema-editor
@ -34,13 +23,25 @@
</el-col> </el-col>
</el-row> </el-row>
<div style="margin: 20px 0"></div> <div style="margin: 20px 0"></div>
<el-row>
<vue-json-editor
v-model="schema"
:showBtns="false"
:mode="'text'"
lang="zh"
@json-change="onJsonChange"
@json-save="onJsonSave"
@has-error="onError"
/>
<br />
</el-row>
<div style="margin: 20px 0"></div>
<el-row> <el-row>
<el-input <el-input
type="textarea" type="textarea"
:rows="16" :rows="16"
placeholder="请输入内容"
@change="sqlchange"
:autosize="{ minRows: 8, maxRows: 16 }" :autosize="{ minRows: 8, maxRows: 16 }"
:key="schemaKey"
v-model="output" v-model="output"
> >
</el-input> </el-input>
@ -51,6 +52,36 @@
<script> <script>
import vueJsonEditor from "vue-json-editor"; import vueJsonEditor from "vue-json-editor";
import { Parser } from "sql-ddl-to-json-schema"; import { Parser } from "sql-ddl-to-json-schema";
// model
function toCamelCase(str) {
var regExp = /[-_]\w/gi;
return titleCase(
str.replace(regExp, function (match) {
return match.charAt(1).toUpperCase();
})
);
}
function titleCase(str) {
const newStr = str.slice(0, 1).toUpperCase() + str.slice(1);
return newStr;
}
function lowerCase(str) {
const newStr = str.slice(0, 1).toLowerCase() + str.slice(1);
return newStr;
}
function typeMap(str) {
const kv = {
integer: "int64",
string: "string",
number: "float64",
};
return kv[str];
}
export default { export default {
name: "HelloWorld", name: "HelloWorld",
components: { vueJsonEditor }, components: { vueJsonEditor },
@ -85,73 +116,117 @@ export default {
}, },
onJsonSave(value) { onJsonSave(value) {
this.schemaKey = Date.now(); this.schemaKey = Date.now();
this.jsonformat = value;
this.schema = Object.assign({}, this.jsonformat);
this.schema = Object.assign({}, value);
}, },
sqlchange(v) { sqlchange(v) {
// 1. sql json schema
const parser = new Parser("mysql"); const parser = new Parser("mysql");
const options = { useRef: false }; const options = { useRef: false };
parser.feed(v); parser.feed(v);
const doc = parser.toJsonSchemaArray(options); const doc = parser.toJsonSchemaArray(options);
// 2. json schema
const ob = JSON.parse(JSON.stringify(doc[0])); const ob = JSON.parse(JSON.stringify(doc[0]));
this.schema = Object.assign({}, ob); this.schema = Object.assign({}, ob);
//
this.schemaKey = Date.now(); this.schemaKey = Date.now();
}, },
onError(value) { onError(value) {
console.log("json错误了value:", value);
},
checkJson() {
if (this.hasJsonFlag == false) {
alert("json验证失败");
return false;
} else {
alert("json验证成功");
return true;
}
console.log("json渲染错误了value:", value);
}, },
onSchemaChange(v) { onSchemaChange(v) {
this.schema = JSON.stringify(v, null, 2); this.schema = JSON.stringify(v, null, 2);
//
this.handleObjectOutput(v); this.handleObjectOutput(v);
this.schemaKey = Date.now();
}, },
handleObjectOutput(v) {
function toCamelCase(str) {
var regExp = /[-_]\w/gi;
return titleCase(
str.replace(regExp, function (match) {
return match.charAt(1).toUpperCase();
})
);
}
handleServiceOutput(v) {
const properties = v.properties;
const tableName = toCamelCase(v.title);
var primary = ``;
Object.keys(properties).forEach(function (key) {
const o = properties[key];
const skey = toCamelCase(key);
if (Object.prototype.hasOwnProperty.call(o, "$comment")) {
primary = skey;
}
});
var primaryLower = lowerCase(primary);
const serviceOutput = `
package service
import (
"Carp/internal/app/model"
"Carp/internal/app/schema"
"Carp/pkg/errors"
"Carp/pkg/utils/excelize"
"context"
"encoding/json"
function titleCase(str) {
const newStr = str.slice(0, 1).toUpperCase() + str.slice(1);
return newStr;
"github.com/google/wire"
)
var ${tableName}ServiceSet = wire.NewSet(wire.Struct(new(${tableName}Service), "*"))
type ${tableName}Service struct {
${tableName} *model.${tableName}Repo
}
func (a *${tableName}Service) Get${tableName}List(ctx context.Context, req *model.${tableName}ReqParams) (interface{}, error) {
var l []*model.
cnt, err := a.${tableName}.Q().Filter(req).List(ctx, &l)
if err != nil {
return nil, errors.WithStack(err)
}
if req.Export {
rst, _ := excelize.Excelize(l,
excelize.ColumnFilter("create_time", excelize.FilterTimestamp),
)
return rst, nil
}
pagination := &schema.PaginationResult{
Count: cnt,
List: l,
PageNum: req.PageNum,
PageSize: req.PageSize,
}
return pagination, nil
} }
function lowerCase(str) {
const newStr = str.slice(0, 1).toLowerCase() + str.slice(1);
return newStr;
}
func (a *${tableName}Service) Get${tableName}Detail(ctx context.Context, ${primaryLower} int64) (interface{}, error) {
var o model.${tableName}
err := a.${tableName}.Q().${primary}(${primaryLower}).One(ctx, &o)
if err != nil {
return nil, err
}
return o, nil
}
function typeMap(str) {
const kv = {
integer: "int64",
string: "string",
number: "float64",
};
return kv[str];
}
func (a *${tableName}Service) Del${tableName}One(ctx context.Context, ${primaryLower} ...int64) error {
var l []model.${tableName}
_, err := a.${tableName}.Q().${primary}In(${primaryLower}...).List(ctx, &l)
if err != nil {
return err
}
for _, d := range l {
a.${tableName}.Delete(ctx, d.${primary})
}
return nil
}
// const si = this.sqlinput;
// console.log("si:", si);
// var gorminfo = ``;
// var process = spawn(`jsongen -i "${si}"`);
// process.stdout.on("data", (data) => {
// gorminfo = data;
// });
// console.log("gorminfo: ", gorminfo);
func (a *${tableName}Service) Create${tableName}(ctx context.Context, r *model.${tableName}) error {
if r.${primary} == 0 {
_, err := a.${tableName}.Create(ctx, r)
if err != nil {
return err
}
return nil
}
return a.${tableName}.Save(ctx, r, a.${tableName}.Q().${primary}(r.${primary}))
}
`;
return serviceOutput
},
handleObjectOutput(v) {
const requires = v.required; const requires = v.required;
const properties = v.properties; const properties = v.properties;
const tableName = toCamelCase(v.title); const tableName = toCamelCase(v.title);
@ -313,6 +388,10 @@ export default {
func (opt *${tableNameLower}Q) Filter(para *${tableName}ReqParams) *${tableNameLower}Q { func (opt *${tableNameLower}Q) Filter(para *${tableName}ReqParams) *${tableNameLower}Q {
if para != nil { if para != nil {
opt.Select(para.Fields...) opt.Select(para.Fields...)
if para.Export {
para.PageNum = 1
para.PageSize = 10000
}
opt.Pagination(para) opt.Pagination(para)
if para.Query != nil { if para.Query != nil {
`; `;
@ -323,7 +402,9 @@ export default {
Object.keys(properties).forEach(function (key) { Object.keys(properties).forEach(function (key) {
const o = properties[key]; const o = properties[key];
const skey = toCamelCase(key); const skey = toCamelCase(key);
const tableKey = `${tableName}` + toCamelCase(key);
const type = typeMap(o.type); const type = typeMap(o.type);
//
if ( if (
Object.prototype.hasOwnProperty.call(o, "enum") && Object.prototype.hasOwnProperty.call(o, "enum") &&
o.enum.length > 0 o.enum.length > 0
@ -331,7 +412,7 @@ export default {
const enumlist = o.enum; const enumlist = o.enum;
const enumdesc = o.enumDesc; const enumdesc = o.enumDesc;
var enumbegin = ` var enumbegin = `
type ${skey} ${type}
type ${tableKey} ${type}
const ( const (
`; `;
var enumcenter = ``; var enumcenter = ``;
@ -339,14 +420,14 @@ export default {
enumdesc.split("\n").forEach(function (value, index) { enumdesc.split("\n").forEach(function (value, index) {
const v = enumlist[index]; const v = enumlist[index];
var s = ` var s = `
${skey}${value} ${skey} = ${v} \n
${tableKey}${value} ${skey} = ${v} \n
`; `;
var f = ` var f = `
func (g ${skey}) ${value}() bool {
return g == ${skey}${value}
func (g ${tableKey}) ${value}() bool {
return g == ${tableKey}${value}
} \n } \n
func (obj *${tableName}Repo) ${value}(ctx context.Context, id int64) error { func (obj *${tableName}Repo) ${value}(ctx context.Context, id int64) error {
return obj.Updates(ctx, &${tableName}{${skey}: ${skey}${value}}, obj.Q().${primary}(id))
return obj.Updates(ctx, &${tableName}{${skey}: ${tableKey}${value}}, obj.Q().${primary}(id))
} \n } \n
`; `;
console.log(value); console.log(value);
@ -463,5 +544,3 @@ export default {
}; };
</script> </script>
<style>
</style>

89
src/components/preview/previewCodeDialg.vue

@ -0,0 +1,89 @@
<template>
<div class="previewCode">
<el-tabs v-model="activeName">
<el-tab-pane
v-for="(item, key) in previewCode"
:key="key"
:label="key"
:name="key"
>
<div :id="key" class="tab-info" />
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
import marked from "marked";
import hljs from "highlight.js";
import "highlight.js/styles/atelier-plateau-light.css";
export default {
name: "PreviewCode",
props: {
previewCode: {
type: Object,
default: {},
},
},
data() {
return {
activeName: "",
};
},
mounted() {
marked.setOptions({
renderer: new marked.Renderer(),
highlight: function (code) {
return hljs.highlightAuto(code).value;
},
pedantic: false,
gfm: true,
tables: true,
breaks: false,
sanitize: false,
smartLists: true,
smartypants: false,
xhtml: false,
});
for (const key in this.previewCode) {
if (this.activeName === "") {
this.activeName = key;
}
document.getElementById(key).innerHTML = marked(props.previewCode[key]);
}
},
methods: {
selectText() {
const element = document.getElementById(this.activeName);
if (document.body.createTextRange) {
const range = document.body.createTextRange();
range.moveToElementText(element);
range.select();
} else if (window.getSelection) {
const selection = window.getSelection();
const range = document.createRange();
range.selectNodeContents(element);
selection.removeAllRanges();
selection.addRange(range);
} else {
alert("none");
}
},
copy() {
this.$emit("OnCopy", this.activeName);
},
},
};
</script>
<style lang="scss">
.previewCode {
.tab-info {
height: 50vh;
background: #fff;
padding: 0 20px;
overflow-y: scroll;
}
}
</style>

21
src/tmp.js

@ -0,0 +1,21 @@
func (a *$1Service) Get$2List(ctx context.Context, req *model.Gb$2ReqParams) (interface{}, error) {
var l []*model.Gb$2
cnt, err := a.$2.Q().Filter(req).List(ctx, &l)
if err != nil {
return nil, errors.WithStack(err)
}
if req.Export {
rst, _ := excelize.Excelize(l,
excelize.ColumnFilter(\"create_time\ excelize.FilterTimestamp),
)
return rst, nil
}
pagination := &schema.PaginationResult{
Count: cnt,
List: l,
PageNum: req.PageNum,
PageSize: req.PageSize,
}
return pagination, nil
}
Loading…
Cancel
Save