Skip to content

Commit 143a48e

Browse files
committed
升级2.1.0
1 parent c412b50 commit 143a48e

File tree

30 files changed

+1471
-29
lines changed

30 files changed

+1471
-29
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "apidoc",
3-
"version": "2.0.11",
3+
"version": "2.1.0",
44
"private": true,
55
"scripts": {
66
"serve": "vue-cli-service serve",

public/config.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,8 @@ const config = {
8181
"apiPage.mdDetail.title": "{name} 字段的说明",
8282
"apiPage.debug.mock.reload": "更新Mock",
8383
"apiPage.debug.excute": "执行 Excute",
84+
"apiPage.debug.selectFile": "Select File",
85+
"apiPage.debug.selectFiles": "Select Files",
8486
"layout.menu.reload": "更新菜单",
8587
"layout.menu.openAll": "展开全部",
8688
"layout.menu.hideAll": "收起全部",
@@ -111,6 +113,25 @@ const config = {
111113
"apiPage.debug.event.clearParam": "清除请求参数",
112114
"apiPage.debug.event.handleParam": "处理请求参数",
113115
"apiPage.debug.event.ajax": "发送请求",
116+
117+
"generator.title": "代码生成",
118+
"generator.apps.title": "应用/版本",
119+
"generator.group.title": "分组",
120+
"generator.table.field": "字段名",
121+
"generator.table.desc": "注释",
122+
"generator.table.type": "类型",
123+
"generator.table.length": "长度",
124+
"generator.table.default": "默认值",
125+
"generator.table.notNull": "非Null",
126+
"generator.table.autoAdd": "自增",
127+
"generator.table.mainKey": "主键",
128+
"generator.model.name": "模型名",
129+
"generator.table.name": "表名",
130+
"generator.table.comment": "表注释",
131+
"generator.model.name.placeholder": "请输入模型文件名",
132+
"generator.table.name.placeholder": "请输入表名",
133+
"generator.table.row.error": "第{rows}行,字段名、类型必填",
134+
"generator.submitSuccess": "生成成功",
114135
},
115136
},
116137
],

public/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<meta name="viewport" content="width=device-width,initial-scale=1.0">
77
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
88
<title><%= htmlWebpackPlugin.options.title %></title>
9-
<link rel="stylesheet" href="./icon/iconfont.css?t=<%= VUE_APP_VERSION %>">
9+
<link rel="stylesheet" href="./icon/iconfont.css?v=<%= VUE_APP_VERSION %>">
1010
<script src="./config.js?v=<%= VUE_APP_VERSION %>"></script>
1111
</head>
1212
<body>

src/api/apis.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ const Apis: ApiOptionState = {
2424
url: "/apidoc/verifyAuth",
2525
method: "post",
2626
},
27+
GENERATOR: {
28+
url: "/apidoc/generator",
29+
method: "post",
30+
},
2731
};
2832

2933
export default Apis;

src/api/index.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import Axios from "@/utils/http/index";
2-
import { HttpResponse, CheckAuthState, CheckAuthResponse } from "./interface";
2+
import { HttpResponse, CheckAuthState, CheckAuthResponse, GeneratorParams } from "./interface";
33
import { ConfigInfo, GetConfigState } from "./interface/config";
44
import { GetApiDataState, ApiDataInfo } from "./interface/apiData";
55
import { MdMenuItem, GetMdMenusState, GetMdDetailState, MdDetail } from "./interface/markdown";
@@ -49,3 +49,12 @@ export const checkAuth = (params: CheckAuthState): Promise<HttpResponse<CheckAut
4949
},
5050
});
5151
};
52+
53+
export const generator = (params: GeneratorParams): Promise<HttpResponse<boolean>> => {
54+
return Axios(Apis.GENERATOR.url, {
55+
method: Apis.GENERATOR.method,
56+
data: {
57+
...params,
58+
},
59+
});
60+
};

src/api/interface/config.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { FormItemType } from "@/components/DataForm/interface";
2+
import { InputRuleItem } from "@/utils/interface";
23

34
export interface GetConfigState {
45
lang?: string;
@@ -102,6 +103,12 @@ export interface ConfigGeneratorItemTableItem {
102103
namespace?: string;
103104
model_tpl?: string;
104105
columns?: ConfigGeneratorItemTableColumn[];
106+
default_values?: ObjectType[];
107+
path?: string;
108+
template?: string;
109+
desc?: string;
110+
model_rules?: InputRuleItem[];
111+
table_rules?: InputRuleItem[];
105112
}
106113

107114
export interface ConfigGeneratorItemTableColumn {

src/api/interface/index.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,8 @@ export interface CheckAuthState {
4646
export interface CheckAuthResponse {
4747
token: string;
4848
}
49+
50+
export interface GeneratorParams {
51+
form: ObjectType;
52+
tables: any;
53+
}

src/components/DataForm/DataForm.ts

Lines changed: 235 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,235 @@
1+
import { defineComponent, h, PropType, ref, UnwrapRef, reactive, toRaw, watch } from "vue";
2+
import {
3+
Button,
4+
Modal,
5+
Alert,
6+
Select,
7+
Space,
8+
Form as AForm,
9+
Input,
10+
Dropdown,
11+
Menu,
12+
Checkbox,
13+
TreeSelect,
14+
} from "ant-design-vue";
15+
import { FormItemType } from "./interface";
16+
import { ValidateErrorEntity, Rule } from "ant-design-vue/lib/form/interface";
17+
import "./dataForm.less";
18+
import AppSelect from "../AppSelect";
19+
20+
function renderItemInput(item: FormItemType, _vm: any) {
21+
let inputProps: any = {
22+
...item.props,
23+
value: _vm.formData[item.field],
24+
};
25+
let inputCom: any = Input;
26+
switch (item.type) {
27+
case "select":
28+
inputCom = Select;
29+
inputProps.onChange = (value: string) => {
30+
_vm.formData[item.field] = value;
31+
item.onChange && item.onChange(value);
32+
};
33+
break;
34+
case "group-select":
35+
inputCom = TreeSelect;
36+
inputProps.onChange = (value: string) => {
37+
_vm.formData[item.field] = value;
38+
item.onChange && item.onChange(value);
39+
};
40+
break;
41+
case "app-select":
42+
inputCom = AppSelect;
43+
inputProps.style = {
44+
width: "100%",
45+
};
46+
inputProps.showLock = false;
47+
inputProps.onChange = (appKey: string) => {
48+
_vm.formData[item.field] = appKey;
49+
item.onChange && item.onChange(appKey);
50+
};
51+
break;
52+
default:
53+
inputProps.onInput = (e: any) => {
54+
_vm.formData[item.field] = e.target.value;
55+
};
56+
break;
57+
}
58+
59+
return h(inputCom, inputProps);
60+
}
61+
62+
function renderItemLabel(item: FormItemType) {
63+
let colon = item.colon !== false ? "colon" : "";
64+
return h(
65+
"div",
66+
{
67+
class: ["data-form-item_title", colon],
68+
},
69+
[item.title]
70+
);
71+
}
72+
73+
function renderItemContent(item: FormItemType, _vm: any) {
74+
return h(
75+
"div",
76+
{
77+
style: { width: item.titleWidth },
78+
class: "data-form-item-content",
79+
},
80+
[renderItemInput(item, _vm)]
81+
);
82+
}
83+
84+
function renderFormItems(layout: string, items: FormItemType[], _vm: any) {
85+
return items
86+
? items.map((item) => {
87+
const formItemProps: any = {
88+
name: item.field,
89+
style: item.style ? item.style : {},
90+
class: ["data-form-item", item.class],
91+
};
92+
if (layout === "grid") {
93+
// grid模式下每个单元格所占格
94+
if (item.colspan) {
95+
let itemColspan = "";
96+
formItemProps.style["gridColumn"] = "span " + item.colspan;
97+
}
98+
if (item.rowspan && item.rowspan > 1) {
99+
formItemProps.style["gridRow"] = "span " + item.rowspan;
100+
}
101+
}
102+
let wrapperProps = {
103+
class: ["data-form-item-wrapper", item.align],
104+
};
105+
let formItemContent = renderItemContent(item, _vm);
106+
107+
return h(AForm.Item, formItemProps, {
108+
label() {
109+
return renderItemLabel(item);
110+
},
111+
default() {
112+
return h("div", wrapperProps, [formItemContent]);
113+
},
114+
});
115+
})
116+
: [];
117+
}
118+
119+
function handleFormRules(items: FormItemType[]) {
120+
let rules: any = {};
121+
if (items && items.length) {
122+
for (let i = 0; i < items.length; i++) {
123+
const item = items[i];
124+
if (item.rules && item.rules.length) {
125+
rules[item.field] = item.rules;
126+
}
127+
}
128+
}
129+
return rules;
130+
}
131+
132+
export default defineComponent({
133+
components: {},
134+
props: {
135+
layout: {
136+
type: String as PropType<string>,
137+
default: "grid",
138+
},
139+
items: {
140+
type: Array as PropType<FormItemType[]>,
141+
default: () => {
142+
return [];
143+
},
144+
},
145+
colspan: {
146+
type: Number as PropType<number>,
147+
default: 1,
148+
},
149+
data: Object as PropType<ObjectType>,
150+
rules: {
151+
type: Object as PropType<Rule[]>,
152+
default: () => {
153+
return {};
154+
},
155+
},
156+
},
157+
setup(props) {
158+
const formRef = ref();
159+
let formData: UnwrapRef<any> = reactive({});
160+
if (props.data) {
161+
formData = reactive(props.data);
162+
}
163+
const itemsRules = handleFormRules(props.items);
164+
const formRules = { ...props.rules, ...itemsRules };
165+
166+
watch(
167+
() => props.data,
168+
(v) => {
169+
if (v) {
170+
for (const key in v) {
171+
formData[key] = v[key];
172+
}
173+
}
174+
}
175+
);
176+
177+
const onSubmit = () => {
178+
return new Promise((resolve, reject) => {
179+
formRef.value
180+
.validate()
181+
.then(() => {
182+
console.log("values", formData, toRaw(formData));
183+
resolve(formData);
184+
})
185+
.catch((error: ValidateErrorEntity<any>) => {
186+
console.log("error", error);
187+
reject(error);
188+
});
189+
});
190+
};
191+
192+
const getData = () => {
193+
return toRaw(formData);
194+
};
195+
196+
return {
197+
formRef,
198+
formData,
199+
onSubmit,
200+
getData,
201+
formRules,
202+
};
203+
},
204+
render() {
205+
// eslint-disable-next-line @typescript-eslint/no-this-alias
206+
const that: any = this;
207+
const { items, layout, formData, colspan, formRules } = this;
208+
209+
let formStyle: any = {};
210+
if (layout === "grid") {
211+
let formColnumStyle = "";
212+
for (let i = 0; i < colspan; i++) {
213+
formColnumStyle += " 1fr";
214+
}
215+
formStyle["grid-template-columns"] = formColnumStyle;
216+
}
217+
console.log(formRules);
218+
219+
return h(
220+
AForm,
221+
{
222+
ref: "formRef",
223+
class: ["data-form", layout],
224+
model: formData,
225+
style: formStyle,
226+
rules: formRules,
227+
},
228+
{
229+
default() {
230+
return renderFormItems(layout, items, that);
231+
},
232+
}
233+
);
234+
},
235+
});

src/components/DataForm/dataForm.less

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
.data-form{
2+
&.grid{
3+
display: grid;
4+
grid-template-columns: 1fr;
5+
grid-template-rows: auto;
6+
}
7+
.data-form-item{
8+
padding:5px;
9+
margin-bottom: 0px;
10+
.data-form-item_title{
11+
display: inline-block;
12+
text-align: right;
13+
line-height: 32px;
14+
}
15+
}
16+
.ant-form-item-label{
17+
width: 90px;
18+
}
19+
.ant-form-item .app-select_select{
20+
width: 100%;
21+
}
22+
}

src/components/DataForm/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import DataForm from "./DataForm";
2+
3+
export default DataForm;

src/components/DataForm/interface.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
export interface FormItemType {
2+
title: string;
3+
field: string;
4+
type: FormItemTypes;
5+
style?: string;
6+
class?: string;
7+
colspan?: number;
8+
rowspan?: number;
9+
align?: string;
10+
titleWidth?: number;
11+
colon?: boolean;
12+
onChange?: (appKey: string) => void;
13+
props?: ObjectType;
14+
rules?: any;
15+
}
16+
17+
export type FormItemTypes = "input" | "select" | "app-select" | "group-select" | "number";

0 commit comments

Comments
 (0)