Skip to content

Commit 399c8df

Browse files
committed
opt code
1 parent 1e079ba commit 399c8df

2 files changed

Lines changed: 96 additions & 9 deletions

File tree

src/components/SqlToModel.vue

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
<template>
22
<div class="json-container">
33
<div class="json-text">
4-
<el-input type="textarea" rows=2 placeholder="请输入sql创建语句"
4+
<el-input type="textarea" rows=4 placeholder="请输入sql创建语句"
55
@change="inputJson" v-model="jsonText">
66
</el-input>
77
</div>
88
<div class="show-go" v-if="goStruct !== ''">
9-
<el-input type="textarea" rows=8 placeholder="显示的GoStruct" v-model="goStruct"></el-input>
9+
<el-input type="textarea" autosize="true" placeholder="显示的GoStruct"
10+
v-model="goStruct"></el-input>
1011
</div>
1112
</div>
1213
</template>
@@ -23,7 +24,7 @@ export default {
2324
},
2425
methods: {
2526
inputJson() {
26-
sqlStrToGoTemplate(this.jsonText);
27+
this.goStruct = sqlStrToGoTemplate(this.jsonText);
2728
},
2829
},
2930
};

src/utils/go/common.js

Lines changed: 92 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,77 @@
1+
function ucFirst(val) {
2+
return val.charAt(0).toUpperCase() + val.slice(1);
3+
}
4+
5+
function dbNameToCamelCase(name) {
6+
const row = [];
7+
const re = name.split('_');
8+
re.map((val) => {
9+
row.push(ucFirst(val));
10+
});
11+
return row.join('');
12+
}
13+
14+
function containStr(name, val) {
15+
if (name.indexOf(val) >= 0) {
16+
return true;
17+
}
18+
return false;
19+
}
20+
21+
function sqlTypeToGoType(type) {
22+
let isContainUsign = false;
23+
if (containStr(type, 'unsigned')) {
24+
isContainUsign = true;
25+
}
26+
if (containStr(type, 'varchar')) {
27+
return 'string';
28+
}
29+
if (containStr(type, 'int')) {
30+
if (!isContainUsign) {
31+
return 'int64';
32+
}
33+
return 'uint64';
34+
}
35+
return 'unknown';
36+
}
37+
38+
function sqlToModel(data) {
39+
const dbName = data.tableName;
40+
const dbNameStr = dbNameToCamelCase(dbName);
41+
const packageName = 'db';
42+
const importPackages = ['context',
43+
'github.com/jinzhu/gorm',
44+
'pkg.poizon.com/golang/go-common/mysql'];
45+
let importPackageStr = '';
46+
importPackages.map((val) => {
47+
importPackageStr += `"${val}"\n`;
48+
});
49+
let columsStr = '';
50+
data.columns.map((val) => {
51+
let defaultStr = '';
52+
if (val.default !== undefined && val.default !== 'NULL') {
53+
defaultStr = `;default:${val.default}`;
54+
}
55+
columsStr += ` ${dbNameToCamelCase(val.name)} ${sqlTypeToGoType(val.type)} \`gorm:"column:${val.name}${defaultStr}" json:"${val.name}"\`\n`;
56+
});
57+
const resultStr = `
58+
package ${packageName}
59+
import (
60+
${importPackageStr}
61+
)
62+
var New${dbNameStr} ${dbNameStr}Model
63+
type ${dbNameStr}Model struct {
64+
${columsStr}
65+
}
66+
func (*${dbNameStr}Model) TableName() string {
67+
return "${dbName}"
68+
}
69+
`;
70+
console.log(resultStr);
71+
return resultStr;
72+
}
73+
74+
// 解析sql表明等基础信息
175
function sqlStrToGoTemplate(str) {
276
// CREATE TABLE `(.*)`\s\(([\d\D]*)\)\sENGINE=(.*)\sAUTO_INCREMENT=(\d+)\s(\w+)\sCHARSET=(\w+)\s(COLLATE=\w+)*
377
const regex = /CREATE TABLE `(.*)`\s\(([\d\D]*)\)\sENGINE=(.*)\sAUTO_INCREMENT=(\d+)\s(\w+)\sCHARSET=(\w+)\s(COLLATE=\w+)*/gm;
@@ -19,14 +93,16 @@ function sqlStrToGoTemplate(str) {
1993
return sqlStrColumnToEachColumn(data);
2094
}
2195

96+
// 解析sql每个字段
2297
function sqlStrColumnToEachColumn(data) {
2398
const regex = /`(.*)`\s(\w+[\((\d+)\)]*[\sunsigned\s]*)([NOT\s[NULL\s]*]*)(DEFAULT\s([\'](.*?)[\']|NULL)\s)*(AUTO_INCREMENT\s)*(COMMENT\s[\'](.*)[\'])*/gm;
24-
console.log(data);
25-
const tableName = data[1];
99+
const tableInfo = {
100+
tableName: data[1],
101+
engine: data[3],
102+
increasement: data[4],
103+
dafaultCharset: data[6],
104+
};
26105
const str = data[2];
27-
const engine = data[3];
28-
const incrasement = data[4];
29-
const dafaultCharset = data[6];
30106
const columns = [];
31107
let m;
32108
while ((m = regex.exec(str)) !== null) {
@@ -41,10 +117,20 @@ function sqlStrColumnToEachColumn(data) {
41117
});
42118
columns.push(one);
43119
}
44-
console.log(columns);
120+
const columnData = [];
121+
columns.map((column) => {
122+
columnData.push({
123+
name: column[1], type: column[2], default: column[6], comment: column[9],
124+
});
125+
});
126+
tableInfo.columns = columnData;
127+
return sqlToModel(tableInfo);
45128
}
46129

47130
export {
48131
sqlStrToGoTemplate,
49132
sqlStrColumnToEachColumn,
133+
sqlToModel,
134+
ucFirst,
135+
sqlTypeToGoType,
50136
};

0 commit comments

Comments
 (0)