vue view code gen

This commit is contained in:
21世纪小八路
2023-03-31 23:36:54 +08:00
parent cbfc8cb06e
commit 822c45c81e
22 changed files with 949 additions and 198 deletions

View File

@@ -4,6 +4,22 @@
<TargetFramework>net7.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<None Remove="CrudTemplete\Vue\Api.tpl" />
<None Remove="CrudTemplete\Vue\DetailConfig.tpl" />
<None Remove="CrudTemplete\Vue\FormSchema.tpl" />
<None Remove="CrudTemplete\Vue\Index.tpl" />
<None Remove="CrudTemplete\Vue\Model.tpl" />
<None Remove="CrudTemplete\Vue\PageRouter.tpl" />
<None Remove="CrudTemplete\Vue\PageRouterIndex.tpl" />
<None Remove="CrudTemplete\Vue\Router.tpl" />
<None Remove="CrudTemplete\Vue\SearchField.tpl" />
<None Remove="CrudTemplete\Vue\Service.tpl" />
<None Remove="CrudTemplete\Vue\Store.tpl" />
<None Remove="CrudTemplete\Vue\StoreModulesIndex.tpl" />
<None Remove="CrudTemplete\Vue\TableConfig.tpl" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="CrudTemplete\Controllers\Controller.tpl" />
<EmbeddedResource Include="CrudTemplete\DbModel\Model.tpl" />
@@ -15,6 +31,19 @@
<EmbeddedResource Include="CrudTemplete\View\Details.tpl" />
<EmbeddedResource Include="CrudTemplete\View\Edit.tpl" />
<EmbeddedResource Include="CrudTemplete\View\Index.tpl" />
<EmbeddedResource Include="CrudTemplete\Vue\Api.tpl" />
<EmbeddedResource Include="CrudTemplete\Vue\DetailConfig.tpl" />
<EmbeddedResource Include="CrudTemplete\Vue\FormSchema.tpl" />
<EmbeddedResource Include="CrudTemplete\Vue\Index.tpl" />
<EmbeddedResource Include="CrudTemplete\Vue\Model.tpl" />
<EmbeddedResource Include="CrudTemplete\Vue\PageRouter.tpl" />
<EmbeddedResource Include="CrudTemplete\Vue\PageRouterIndex.tpl" />
<EmbeddedResource Include="CrudTemplete\Vue\Router.tpl" />
<EmbeddedResource Include="CrudTemplete\Vue\SearchField.tpl" />
<EmbeddedResource Include="CrudTemplete\Vue\Service.tpl" />
<EmbeddedResource Include="CrudTemplete\Vue\Store.tpl" />
<EmbeddedResource Include="CrudTemplete\Vue\StoreModulesIndex.tpl" />
<EmbeddedResource Include="CrudTemplete\Vue\TableConfig.tpl" />
</ItemGroup>
<ItemGroup>

View File

@@ -0,0 +1,4 @@
import { API_PROXY_PREFIX } from "../api";
export const GetPageListUrl: string = `${API_PROXY_PREFIX}/{{ModelClassName}}/GetPageList`;

View File

@@ -0,0 +1,19 @@
import { IData } from "@/components/data-detail-display";
import { FieldTypeEnum } from "@/components/data-detail-display/enum";
const detailConfig: { title: string; dataField: string; fields: Array<IData> } = {
title: "详情",
dataField: "",
fields: [
{% for field in ModelFields %}
{% if field.DbColumnName contains 'Image' or field.DbColumnName contains 'image' or field.DbColumnName contains 'thumbnail' or field.DbColumnName contains 'Thumbnail' %}
{ label: "{{field.ColumnDescription}}", key: "{{field.DbColumnName}}",type:FieldTypeEnum.PICTURE },
{% else %}
{ label: "{{field.ColumnDescription}}", key: "{{field.DbColumnName}}" },
{% endif %}
{% endfor %}
],
};
//IData
export default detailConfig;

View File

@@ -0,0 +1,112 @@
import { ControlTypeEnum, validateTriggerEnum, validateTypeEnum, } from "@/components/coreshop-form/enum";
import { IFormSchema } from "@/components/coreshop-form/type";
const formSchema: IFormSchema = {
saveDataSourceKey: "{{ModelClassName}}/DoCreate",
editDataSourceKey: "{{ModelClassName}}/DoEdit",
queryDataSourceKey: "{{ModelClassName}}/GetEdit",
filter: null,
labelCol: { span: 3 },
fieldValueModel: "model",
fields: [
{% for field in ModelFields %}
{% if field.DbColumnName contains 'Image' or field.DbColumnName contains 'image' or field.DbColumnName contains 'thumbnail' or field.DbColumnName contains 'Thumbnail' %}
{
key: "{{field.DbColumnName}}",
name: "{{field.ColumnDescription}}",
value: "",
placeholder: "请上传{{field.ColumnDescription}}",
type: ControlTypeEnum.FILE,
},
{% elsif field.DataType == 'nvarchar' %}
{
key: "{{field.DbColumnName}}",
name: "{{field.ColumnDescription}}",
value: "",
placeholder: "请输入{{field.ColumnDescription}}",
type: ControlTypeEnum.STRING,
config: {
rules: [
{
required: true,
message: "{{field.ColumnDescription}}不能为空",
trigger: validateTriggerEnum.blur,
type: validateTypeEnum.string,
},
],
},
},
{% elsif field.DataType == 'int' or field.DataType == 'bigint' %}
{
key: "{{field.DbColumnName}}",
name: "{{field.ColumnDescription}}",
placeholder: "请输入{{field.ColumnDescription}}",
type: ControlTypeEnum.NUMBER,
value: 1000,
config: {
rules: [
{
required: true,
message: "{{field.ColumnDescription}}不能为空",
trigger: validateTriggerEnum.blur,
type: validateTypeEnum.number,
},
],
},
},
{% elsif field.DataType == 'datetime' %}
{
key: "{{field.DbColumnName}}",
name: "请选择{{field.ColumnDescription}}",
placeholder: "请选择{{field.ColumnDescription}}",
type: ControlTypeEnum.DATE_PICKER,
},
{% elsif field.DataType == 'bit' %}
{
key: "{{field.DbColumnName}}",
name: "{{field.ColumnDescription}}",
value: false,
placeholder: "{{field.ColumnDescription}}",
type: ControlTypeEnum.SWITCH,
config: {
rules: [
{
required: true,
message: "{{field.ColumnDescription}}",
trigger: validateTriggerEnum.blur,
type: validateTypeEnum.boolean
},
],
checkedLabel: "是",
unCheckedLabel: "否",
},
},
{% else %}
{
key: "{{field.DbColumnName}}",
name: "{{field.ColumnDescription}}",
value: "",
placeholder: "请输入{{field.ColumnDescription}}",
type: ControlTypeEnum.STRING,
config: {
rules: [
{
required: true,
message: "{{field.ColumnDescription}}不能为空",
trigger: validateTriggerEnum.blur,
type: validateTypeEnum.string,
},
],
},
},
{% endif %}
{% endfor %}
]}
export default formSchema;

View File

@@ -0,0 +1,205 @@
<template>
<DStandardTable
:tableConfig="tableConfig"
:dispatchKey="dispatchKey"
:dataSource="dataSourceCmp"
:searchFields="searchFields"
:span="span"
:selectedRowKeys="state.selectedRows"
:rowKey="rowKey"
:total="totalCmp"
selectedRowKeyType="checkbox"
:onSelectChange="onSelectRowChange"
@onTableRefresh="onTableRefresh($event)"
>
<template #toolbar>
<a-button type="primary" shape="round" @click="onAddData()"
>新增</a-button
>
</template>
{% for field in ModelFields %}{% if field.DbColumnName contains 'Image' or field.DbColumnName contains 'image' or field.DbColumnName contains 'thumbnail' or field.DbColumnName contains 'Thumbnail' %}
<template #{{field.DbColumnName}}="{ record }">
<Image :src="record.{{field.DbColumnName}}" :width="40" :height="40"></Image>
</template>{% endif %}{% endfor %}
<template #action="{ record }">
<a-space>
<a-button size="small" shape="round" @click="onViewDataDetail(record)"
>查看</a-button
>
<a-button
size="small"
shape="round"
type="primary"
@click="onEdit(record)"
>编辑</a-button
>
<a-button size="small" shape="round" danger @click="onDelete(record)"
>删除</a-button
>
</a-space>
</template>
</DStandardTable>
<CoreShopFormModal
:visible="state.editModalVisible"
width="50%"
:schema="state.formSchema"
:modalVisible="onEditModalVisible"
:onSuccess="onEditSuccess"
:title="state.formModalTitle"
></CoreShopFormModal>
<Modal
:visible="state.dataDetailVisible"
:onClose="onCloseDataDetailModal"
:onCancel="onCloseDataDetailModal"
:destroyOnClose="true"
:title="state.dataDetailConfig?.title"
:width="45"
height="auto"
>
<DataDetailDisplay
:data="state.dataDetailConfig.fields"
:column="2"
></DataDetailDisplay>
</Modal>
<DeleteConfirmModal
:visible="state.deleteConfirmModalVisible"
:destroyOnClose="true"
:content="state.deleteContentTip"
:onCancel="onCancelDeleteDataModal"
:onSuccess="onSuccessDeleteData"
:DeleteUrl="state.deleteDataUrl"
:params="state.deleteDataparams"
>
</DeleteConfirmModal>
</template>
<script setup lang="ts">
import DStandardTable from "@/components/table/dStandardTable.vue";
import { I{{ModelClassName}} } from "@/models/{{ModelClassName}}";
import { computed, ComputedRef, reactive } from "vue";
import { useStore } from "vuex";
import tableConfig from "./table-config";
import formSchema from "./form-schema";
import { CoreShopFormModal } from "@/components/coreshop-form";
import searchFields from "./search-field";
import { cloneDeep } from "lodash";
import { IFormSchema } from "@/components/coreshop-form/type";
import dataDetailConfig from "./detail-config";
import { DataDetailDisplay, IData } from "@/components/data-detail-display";
import { buildDataDetail } from "@/utils/build-data-detail";
import Modal from "@/components/modal";
import DeleteConfirmModal from "@/components/coreshop-modal-delete/index";
import Image from "@/components/coreshop-image";
/** 数据查询的接口 */
const dispatchKey: string = "{{ModelClassName}}/getPageList";
const span: number = 3;
const rowKey: string = "id";
// 表格刷新
let handleTableRefreshFun: Function;
const state = reactive<{
selectedRows: Array<any>;
editModalVisible: boolean;
formModalTitle: string;
formSchema: IFormSchema;
dataDetailVisible: boolean;
dataDetailConfig: {
title?: string;
fields?: Array<IData>;
};
deleteConfirmModalVisible: boolean;
deleteContentTip: string;
deleteDataUrl: string;
deleteDataparams: { [key: string]: any };
}>({
selectedRows: [],
editModalVisible: false,
formModalTitle: "编辑",
formSchema: {},
dataDetailVisible: false,
dataDetailConfig: {
title: "详情",
fields: [],
},
deleteConfirmModalVisible: false,
deleteContentTip: "确定删除?删除后将无法恢复。",
deleteDataUrl: "",
deleteDataparams: {},
});
const store = useStore();
const dataSourceCmp: ComputedRef<Array<I{{ModelClassName}}>> = computed(
() => store.state.{{ModelClassName}}.{{ModelClassName}}.{{ModelClassName}}
);
const totalCmp: ComputedRef<number> = computed(
() => store.state.{{ModelClassName}}.{{ModelClassName}}.count
);
const onTableRefresh = (fun: Function) => {
handleTableRefreshFun = fun;
};
const onAddData = () => {
state.editModalVisible = true;
state.formModalTitle = "新增";
state.formSchema = formSchema;
};
const onEdit = (data: { [key: string]: any }) => {
let editFormSchema: IFormSchema = cloneDeep(formSchema);
state.editModalVisible = true;
state.formModalTitle = "编辑";
editFormSchema.filter = { id: data.id };
state.formSchema = editFormSchema;
};
/** 查看详情 */
const onViewDataDetail = (data: { [key: string]: any }) => {
dataDetailConfig.fields = buildDataDetail(dataDetailConfig.fields, data);
state.dataDetailVisible = true;
state.dataDetailConfig = dataDetailConfig;
};
const onEditModalVisible = (visible: boolean) => {
state.editModalVisible = visible;
};
const onEditSuccess = () => {
state.editModalVisible = false;
handleTableRefreshFun && handleTableRefreshFun();
};
const onCloseDataDetailModal = () => {
state.dataDetailVisible = false;
};
//#region 删除数据模态交互
const onDelete = (data: { [key: string]: any }) => {
state.deleteConfirmModalVisible = true;
state.deleteContentTip = "确定删除?删除后将无法恢复。";
state.deleteDataUrl = "api/{{ModelClassName}}/DoDelete";
state.deleteDataparams = { id: data.id };
};
const onCancelDeleteDataModal = () => {
state.deleteConfirmModalVisible = false;
};
/** 删除数据后回调*/
const onSuccessDeleteData = () => {
store.commit("{{ModelClassName}}/deleteDataById", state.deleteDataparams.id);
};
/** 选中数据 */
const onSelectRowChange=(selectedRows:Array<number>)=>{
state.selectedRows =selectedRows;
}
//#endregion
</script>
<style lang="less" scoped>
</style>

View File

@@ -0,0 +1,49 @@

/** {{ModelDescription}} */
export interface I{{ModelClassName}}
{
{% for field in ModelFields %}
/** {{field.ColumnDescription}} */
{% if field.DataType == 'nvarchar' or field.DataType == 'varchar' or field.DataType == 'text' %}
{{field.DbColumnName}}:string;
{% elsif field.DataType == 'int' and field.IsNullable == false %}
{{field.DbColumnName}}:number;
{% elsif field.DataType == 'int' and field.IsNullable == true %}
{{field.DbColumnName}}?:number;
{% elsif field.DataType == 'bigint' and field.IsNullable == false %}
{{field.DbColumnName}}:number;
{% elsif field.DataType == 'bigint' and field.IsNullable == true %}
{{field.DbColumnName}}?:number;
{% elsif field.DataType == 'float' and field.IsNullable == false %}
{{field.DbColumnName}}:number;
{% elsif field.DataType == 'float' and field.IsNullable == true %}
{{field.DbColumnName}}?:number;
{% elsif field.DataType == 'bit' and field.IsNullable == false %}
{{field.DbColumnName}}:boolean;
{% elsif field.DataType == 'bit' and field.IsNullable == true %}
{{field.DbColumnName}}?:boolean;
{% elsif field.DataType == 'datetime' and field.IsNullable == false %}
{{field.DbColumnName}}:Date;
{% elsif field.DataType == 'datetime' and field.IsNullable == true %}
{{field.DbColumnName}}?:Date;
{% elsif field.DataType == 'date' and field.IsNullable == false %}
{{field.DbColumnName}}:Date;
{% elsif field.DataType == 'date' and field.IsNullable == true %}
{{field.DbColumnName}}?:Date;
{% elsif field.DataType == 'uniqueidentifier' and field.IsNullable == false %}
{{field.DbColumnName}}:string;
{% elsif field.DataType == 'uniqueidentifier' and field.IsNullable == true %}
{{field.DbColumnName}}?:string;
{% elsif field.DataType == 'decimal' and field.IsNullable == false %}
{{field.DbColumnName}}:number;
{% elsif field.DataType == 'decimal' and field.IsNullable == true %}
{{field.DbColumnName}}?:number;
{% elsif field.DataType == 'numeric' and field.IsNullable == false %}
{{field.DbColumnName}}:number;
{% elsif field.DataType == 'numeric' and field.IsNullable == true %}
{{field.DbColumnName}}?:number;
{% else %}
{% endif %}
{% endfor %}
}

View File

@@ -0,0 +1,13 @@
export const routers: Array<any> = [
{
path: "{{ModelClassName}}",
name: "{{ModelDescription}}",
meta: {
page: {
closable: false,
},
authority: "*",
},
component: () => import("./{{ModelClassName}}/index.vue"),
}
];

View File

@@ -0,0 +1,5 @@
import { routers } from './router';
export {
routers ,
}

View File

@@ -0,0 +1,13 @@
import { routers as {{ModelClassName}}Router } from "@/pages/{{ModelClassName}}";
const routes = [
{
path: "{{ModelClassName}}",
name: "{{ModelDescription}}管理",
meta: {
icon: FileTextOutlined,
authority: "*",
},
component: CoreshopPageView,
children: [...{{ModelClassName}}Router],
},
]

View File

@@ -0,0 +1,32 @@
import { FieldTypeEnum, ISearchField } from "@/components/searchForm";
import { markRaw } from "vue";
const searchFields: Array<ISearchField> = markRaw([
{% for field in ModelFields %}
{% if field.DataType == 'bit' %}
{
field: "{{field.DbColumnName}}",
type: FieldTypeEnum.SELECT,
placeholder: "请选择{{field.ColumnDescription}}",
options: [
{ label: "是", value: true },
{ label: "否", value: false },
],
},
{% elsif field.DataType == 'datetime' %}
{
field: "{{field.DbColumnName}}",
type: FieldTypeEnum.DATE,
placeholder: ['开始时间', '结束时间']
},
{% else %}
{
field: "{{field.DbColumnName}}",
type: FieldTypeEnum.STRING,
placeholder: "请输入{{field.ColumnDescription}}"
},
{% endif %}
{% endfor %}
])
export default searchFields;

View File

@@ -0,0 +1,8 @@
import { HttpMehtod } from "@/enum";
import { request } from "@/utils/request";
import { Observable } from "rxjs";
import { GetPageListUrl } from "./api";
export function getPageList(params: any): Observable<any> {
return request(GetPageListUrl, HttpMehtod.FORM_DATA, params)
}

View File

@@ -0,0 +1,52 @@
import { I{{ModelClassName}} } from "@/models/{{ModelClassName}}";
import * as {{ModelClassName}}Service from "@/services/{{ModelClassName}}Service";
export const Set_{{ModelClassName}}_List :string = "Set_{{ModelClassName}}_List";
interface I{{ModelClassName}}Entity {
{{ModelClassName}}?: Array<I{{ModelClassName}}>;
count: number;
}
export interface IState {
{{ModelClassName}}: I{{ModelClassName}}Entity;
}
const state = (): IState => ({
{{ModelClassName}}: {
{{ModelClassName}}: [],
count: 0,
},
});
const mutations: { [key: string]: Function } = {
[Set_{{ModelClassName}}_List](state: IState, payload: { [key: string]: any }) {
state.{{ModelClassName}}.{{ModelClassName}} = payload.data;
state.{{ModelClassName}}.count = payload.count;
},
/** */
deleteDataById(state: IState, id: number| string) {
state.{{ModelClassName}}.{{ModelClassName}}=state.{{ModelClassName}}.{{ModelClassName}}?.filter(x=>x.id!==id);
},
};
const getters: { [key: string]: Function } = {};
const actions = {
/** */
getPageList({ commit }: any, params: { [key: string]: any }) {
{{ModelClassName}}Service.getPageList(params).subscribe((res) => {
commit(Set_{{ModelClassName}}_List, res);
});
},
};
export default {
namespaced: true,
state,
mutations,
actions,
getters,
};

View File

@@ -0,0 +1,6 @@

import {{ModelClassName}} from "./{{ModelClassName}}";
export default {
{{ModelClassName}},
};

View File

@@ -0,0 +1,42 @@
import { ButtonEnum, ITableConfig } from "@/components/table";
const tableConfig: ITableConfig = {
buildInButtons: [
{
buttonKey: ButtonEnum.selectExcelExport,
dataSource: "api/{{ModelClassName}}/SelectExportExcel",
},
{
buttonKey: ButtonEnum.queryExcelExport,
dataSource: "api/{{ModelClassName}}/QueryExportExcel",
},
],
columns: [
{% for field in ModelFields %}
{% if field.DbColumnName contains 'Image' or field.DbColumnName contains 'image' or field.DbColumnName contains 'thumbnail' or field.DbColumnName contains 'Thumbnail' %}
{
title: "{{field.ColumnDescription}}",
key: "{{field.DbColumnName}}",
dataIndex: "{{field.DbColumnName}}",
slots: { customRender: "{{field.DbColumnName}}" },
width: "5%",
},{% else %}
{
title: "{{field.ColumnDescription}}",
key: "{{field.DbColumnName}}",
dataIndex: "{{field.DbColumnName}}",
},
{% endif %}
{% endfor %}
{
title: "操作",
dataIndex: "action",
key: "action",
align: "center",
width: "18%",
slots: { customRender: "action" },
},
],
};
export default tableConfig;

View File

@@ -23,7 +23,7 @@ namespace CoreCms.Net.CodeGenerator
/// <param name="tableName">表名称</param>
/// <param name="tableDescription">表说明</param>
/// <param name="columns">表字段</param>
public static byte[] CodeGenerator(string tableName, string tableDescription, List<DbColumnInfo> columns, string fileType)
public static byte[] CodeGenerator(string tableName, string tableDescription, List<DbColumnInfo> columns, string fileType, bool isVue = false)
{
//ModelClassName
//ModelName
@@ -32,7 +32,7 @@ namespace CoreCms.Net.CodeGenerator
byte[] data;
var obj = new
{
ModelCreateTime= dt,
ModelCreateTime = dt,
ModelName = tableName,
ModelDescription = tableDescription,
ModelClassName = tableName,
@@ -143,56 +143,17 @@ namespace CoreCms.Net.CodeGenerator
}
}
//CreateHtml
using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.View.Create.tpl"), Encoding.UTF8))
// 生成layUI 前端代码
if (isVue == false)
{
file = reader.ReadToEnd();
template = Template.Parse(file);
result = template.Render(Hash.FromAnonymousObject(obj));
ZipArchiveEntry entry1 = zip.CreateEntry("Html/" + tableName.ToLower().ToLower() + "/create.html");
using (StreamWriter entryStream = new StreamWriter(entry1.Open()))
{
entryStream.Write(result);
}
CodeGeneratorForLayUI(obj, tableName, zip);
}
//EditHtml
using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.View.Edit.tpl"), Encoding.UTF8))
// 生成 vue 前端代码
else
{
file = reader.ReadToEnd();
template = Template.Parse(file);
result = template.Render(Hash.FromAnonymousObject(obj));
ZipArchiveEntry entry1 = zip.CreateEntry("Html/" + tableName.ToLower().ToLower() + "/edit.html");
using (StreamWriter entryStream = new StreamWriter(entry1.Open()))
{
entryStream.Write(result);
}
CodeGeneratorForVue(obj, tableName, zip);
}
//DetailsHtml
using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.View.Details.tpl"), Encoding.UTF8))
{
file = reader.ReadToEnd();
template = Template.Parse(file);
result = template.Render(Hash.FromAnonymousObject(obj));
ZipArchiveEntry entry1 = zip.CreateEntry("Html/" + tableName.ToLower().ToLower() + "/details.html");
using (StreamWriter entryStream = new StreamWriter(entry1.Open()))
{
entryStream.Write(result);
}
}
//IndexHtml
using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.View.Index.tpl"), Encoding.UTF8))
{
file = reader.ReadToEnd();
template = Template.Parse(file);
result = template.Render(Hash.FromAnonymousObject(obj));
ZipArchiveEntry entry1 = zip.CreateEntry("Html/" + tableName.ToLower().ToLower() + "/index.html");
using (StreamWriter entryStream = new StreamWriter(entry1.Open()))
{
entryStream.Write(result);
}
}
break;
case "EntityFiles":
//Model
@@ -235,55 +196,14 @@ namespace CoreCms.Net.CodeGenerator
}
break;
case "ViewFiles":
//CreateHtml
using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.View.Create.tpl"), Encoding.UTF8))
{
file = reader.ReadToEnd();
template = Template.Parse(file);
result = template.Render(Hash.FromAnonymousObject(obj));
ZipArchiveEntry entry1 = zip.CreateEntry("Html/" + tableName.ToLower().ToLower() + "/create.html");
using (StreamWriter entryStream = new StreamWriter(entry1.Open()))
{
entryStream.Write(result);
}
}
//EditHtml
using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.View.Edit.tpl"), Encoding.UTF8))
{
file = reader.ReadToEnd();
template = Template.Parse(file);
result = template.Render(Hash.FromAnonymousObject(obj));
ZipArchiveEntry entry1 = zip.CreateEntry("Html/" + tableName.ToLower().ToLower() + "/edit.html");
using (StreamWriter entryStream = new StreamWriter(entry1.Open()))
{
entryStream.Write(result);
}
}
//DetailsHtml
using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.View.Details.tpl"), Encoding.UTF8))
if (isVue == false)
{
file = reader.ReadToEnd();
template = Template.Parse(file);
result = template.Render(Hash.FromAnonymousObject(obj));
ZipArchiveEntry entry1 = zip.CreateEntry("Html/" + tableName.ToLower().ToLower() + "/details.html");
using (StreamWriter entryStream = new StreamWriter(entry1.Open()))
{
entryStream.Write(result);
}
CodeGeneratorForLayUI(obj, tableName, zip);
}
//IndexHtml
using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.View.Index.tpl"), Encoding.UTF8))
else
{
file = reader.ReadToEnd();
template = Template.Parse(file);
result = template.Render(Hash.FromAnonymousObject(obj));
ZipArchiveEntry entry1 = zip.CreateEntry("Html/" + tableName.ToLower().ToLower() + "/index.html");
using (StreamWriter entryStream = new StreamWriter(entry1.Open()))
{
entryStream.Write(result);
}
CodeGeneratorForVue(obj, tableName, zip);
}
break;
case "InterFaceFiles":
@@ -325,7 +245,7 @@ namespace CoreCms.Net.CodeGenerator
/// <param name="tableName">表名称</param>
/// <param name="tableDescription">表说明</param>
/// <param name="columns">表字段</param>
public static byte[] CodeGeneratorAll(List<DbTableInfoAndColumns> dbModels, string fileType)
public static byte[] CodeGeneratorAll(List<DbTableInfoAndColumns> dbModels, string fileType, bool isVue = false)
{
//ModelClassName
//ModelName
@@ -446,55 +366,14 @@ namespace CoreCms.Net.CodeGenerator
}
}
//CreateHtml
using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.View.Create.tpl"), Encoding.UTF8))
// 生成
if (isVue == false)
{
file = reader.ReadToEnd();
template = Template.Parse(file);
result = template.Render(Hash.FromAnonymousObject(obj));
ZipArchiveEntry entry1 = zip.CreateEntry("Html/" + item.Name.ToLower().ToLower() + "/create.html");
using (StreamWriter entryStream = new StreamWriter(entry1.Open()))
{
entryStream.Write(result);
}
CodeGeneratorForLayUI(obj, item.Name, zip);
}
//EditHtml
using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.View.Edit.tpl"), Encoding.UTF8))
else
{
file = reader.ReadToEnd();
template = Template.Parse(file);
result = template.Render(Hash.FromAnonymousObject(obj));
ZipArchiveEntry entry1 = zip.CreateEntry("Html/" + item.Name.ToLower().ToLower() + "/edit.html");
using (StreamWriter entryStream = new StreamWriter(entry1.Open()))
{
entryStream.Write(result);
}
}
//DetailsHtml
using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.View.Details.tpl"), Encoding.UTF8))
{
file = reader.ReadToEnd();
template = Template.Parse(file);
result = template.Render(Hash.FromAnonymousObject(obj));
ZipArchiveEntry entry1 = zip.CreateEntry("Html/" + item.Name.ToLower().ToLower() + "/details.html");
using (StreamWriter entryStream = new StreamWriter(entry1.Open()))
{
entryStream.Write(result);
}
}
//IndexHtml
using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.View.Index.tpl"), Encoding.UTF8))
{
file = reader.ReadToEnd();
template = Template.Parse(file);
result = template.Render(Hash.FromAnonymousObject(obj));
ZipArchiveEntry entry1 = zip.CreateEntry("Html/" + item.Name.ToLower().ToLower() + "/index.html");
using (StreamWriter entryStream = new StreamWriter(entry1.Open()))
{
entryStream.Write(result);
}
CodeGeneratorForVue(obj, item.Name, zip);
}
break;
case "EntityFiles":
@@ -538,55 +417,14 @@ namespace CoreCms.Net.CodeGenerator
}
break;
case "ViewFiles":
//CreateHtml
using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.View.Create.tpl"), Encoding.UTF8))
{
file = reader.ReadToEnd();
template = Template.Parse(file);
result = template.Render(Hash.FromAnonymousObject(obj));
ZipArchiveEntry entry1 = zip.CreateEntry("Html/" + item.Name.ToLower().ToLower() + "/create.html");
using (StreamWriter entryStream = new StreamWriter(entry1.Open()))
{
entryStream.Write(result);
}
}
//EditHtml
using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.View.Edit.tpl"), Encoding.UTF8))
{
file = reader.ReadToEnd();
template = Template.Parse(file);
result = template.Render(Hash.FromAnonymousObject(obj));
ZipArchiveEntry entry1 = zip.CreateEntry("Html/" + item.Name.ToLower().ToLower() + "/edit.html");
using (StreamWriter entryStream = new StreamWriter(entry1.Open()))
{
entryStream.Write(result);
}
}
//DetailsHtml
using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.View.Details.tpl"), Encoding.UTF8))
if (isVue == false)
{
file = reader.ReadToEnd();
template = Template.Parse(file);
result = template.Render(Hash.FromAnonymousObject(obj));
ZipArchiveEntry entry1 = zip.CreateEntry("Html/" + item.Name.ToLower().ToLower() + "/details.html");
using (StreamWriter entryStream = new StreamWriter(entry1.Open()))
{
entryStream.Write(result);
}
CodeGeneratorForLayUI(obj, item.Name, zip);
}
//IndexHtml
using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.View.Index.tpl"), Encoding.UTF8))
else
{
file = reader.ReadToEnd();
template = Template.Parse(file);
result = template.Render(Hash.FromAnonymousObject(obj));
ZipArchiveEntry entry1 = zip.CreateEntry("Html/" + item.Name.ToLower().ToLower() + "/index.html");
using (StreamWriter entryStream = new StreamWriter(entry1.Open()))
{
entryStream.Write(result);
}
CodeGeneratorForVue(obj, item.Name, zip);
}
break;
case "InterFaceFiles":
@@ -625,5 +463,271 @@ namespace CoreCms.Net.CodeGenerator
return data;
}
public static void CodeGeneratorForLayUI(object obj, string tableName, ZipArchive zip)
{
var assembly = IntrospectionExtensions.GetTypeInfo(typeof(GeneratorCodeHelper)).Assembly;
string file;
string result;
Template template;
//CreateHtml
using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.View.Create.tpl"), Encoding.UTF8))
{
file = reader.ReadToEnd();
template = Template.Parse(file);
result = template.Render(Hash.FromAnonymousObject(obj));
ZipArchiveEntry entry1 = zip.CreateEntry("Html/" + tableName.ToLower().ToLower() + "/create.html");
using (StreamWriter entryStream = new StreamWriter(entry1.Open()))
{
entryStream.Write(result);
}
}
//EditHtml
using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.View.Edit.tpl"), Encoding.UTF8))
{
file = reader.ReadToEnd();
template = Template.Parse(file);
result = template.Render(Hash.FromAnonymousObject(obj));
ZipArchiveEntry entry1 = zip.CreateEntry("Html/" + tableName.ToLower().ToLower() + "/edit.html");
using (StreamWriter entryStream = new StreamWriter(entry1.Open()))
{
entryStream.Write(result);
}
}
//DetailsHtml
using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.View.Details.tpl"), Encoding.UTF8))
{
file = reader.ReadToEnd();
template = Template.Parse(file);
result = template.Render(Hash.FromAnonymousObject(obj));
ZipArchiveEntry entry1 = zip.CreateEntry("Html/" + tableName.ToLower().ToLower() + "/details.html");
using (StreamWriter entryStream = new StreamWriter(entry1.Open()))
{
entryStream.Write(result);
}
}
//IndexHtml
using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.View.Index.tpl"), Encoding.UTF8))
{
file = reader.ReadToEnd();
template = Template.Parse(file);
result = template.Render(Hash.FromAnonymousObject(obj));
ZipArchiveEntry entry1 = zip.CreateEntry("Html/" + tableName.ToLower().ToLower() + "/index.html");
using (StreamWriter entryStream = new StreamWriter(entry1.Open()))
{
entryStream.Write(result);
}
}
}
// 生成vue 前端代码
public static void CodeGeneratorForVue(object obj, string tableName, ZipArchive zip)
{
// 前端页面
var assembly = IntrospectionExtensions.GetTypeInfo(typeof(GeneratorCodeHelper)).Assembly;
string file;
string result;
Template template;
//CreateHtml
using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.Vue.Index.tpl"), Encoding.UTF8))
{
file = reader.ReadToEnd();
template = Template.Parse(file);
result = template.Render(Hash.FromAnonymousObject(obj));
ZipArchiveEntry entry1 = zip.CreateEntry("pages/" + tableName + "/" + tableName + "/index.vue");
using (StreamWriter entryStream = new StreamWriter(entry1.Open()))
{
entryStream.Write(result);
}
}
// 创建页面路由
using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.Vue.PageRouter.tpl"), Encoding.UTF8))
{
file = reader.ReadToEnd();
template = Template.Parse(file);
result = template.Render(Hash.FromAnonymousObject(obj));
ZipArchiveEntry entry1 = zip.CreateEntry("pages/" + tableName + "/router.ts");
using (StreamWriter entryStream = new StreamWriter(entry1.Open()))
{
entryStream.Write(result);
}
}
// 导出页面路由
using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.Vue.PageRouterIndex.tpl"), Encoding.UTF8))
{
file = reader.ReadToEnd();
template = Template.Parse(file);
result = template.Render(Hash.FromAnonymousObject(obj));
ZipArchiveEntry entry1 = zip.CreateEntry("pages/" + tableName + "/index.ts");
using (StreamWriter entryStream = new StreamWriter(entry1.Open()))
{
entryStream.Write(result);
}
}
// 创建路由
using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.Vue.Router.tpl"), Encoding.UTF8))
{
file = reader.ReadToEnd();
template = Template.Parse(file);
result = template.Render(Hash.FromAnonymousObject(obj));
ZipArchiveEntry entry1 = zip.CreateEntry("router.ts");
using (StreamWriter entryStream = new StreamWriter(entry1.Open()))
{
entryStream.Write(result);
}
}
// 前端接口模型
using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.Vue.Model.tpl"), Encoding.UTF8))
{
file = reader.ReadToEnd();
template = Template.Parse(file);
result = template.Render(Hash.FromAnonymousObject(obj));
ZipArchiveEntry entry1 = zip.CreateEntry("models/" + tableName + "/index.ts");
using (StreamWriter entryStream = new StreamWriter(entry1.Open()))
{
entryStream.Write(result);
}
}
// 前端服务(Service)
using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.Vue.Service.tpl"), Encoding.UTF8))
{
file = reader.ReadToEnd();
template = Template.Parse(file);
result = template.Render(Hash.FromAnonymousObject(obj));
ZipArchiveEntry entry1 = zip.CreateEntry("services/" + tableName + "Service/index.ts");
using (StreamWriter entryStream = new StreamWriter(entry1.Open()))
{
entryStream.Write(result);
}
}
// 前端 服务端调用的API 地址
using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.Vue.Api.tpl"), Encoding.UTF8))
{
file = reader.ReadToEnd();
template = Template.Parse(file);
result = template.Render(Hash.FromAnonymousObject(obj));
ZipArchiveEntry entry1 = zip.CreateEntry("services/" + tableName + "Service/api.ts");
using (StreamWriter entryStream = new StreamWriter(entry1.Open()))
{
entryStream.Write(result);
}
}
// 前端 数据状态
using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.Vue.Store.tpl"), Encoding.UTF8))
{
file = reader.ReadToEnd();
template = Template.Parse(file);
result = template.Render(Hash.FromAnonymousObject(obj));
ZipArchiveEntry entry1 = zip.CreateEntry("store/modules/" + tableName + "/index.ts");
using (StreamWriter entryStream = new StreamWriter(entry1.Open()))
{
entryStream.Write(result);
}
}
// 前端 数据状态管理默认导出index
using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.Vue.StoreModulesIndex.tpl"), Encoding.UTF8))
{
file = reader.ReadToEnd();
template = Template.Parse(file);
result = template.Render(Hash.FromAnonymousObject(obj));
ZipArchiveEntry entry1 = zip.CreateEntry("store/modules/index.ts");
using (StreamWriter entryStream = new StreamWriter(entry1.Open()))
{
entryStream.Write(result);
}
}
// 创建数据表达配置
using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.Vue.FormSchema.tpl"), Encoding.UTF8))
{
file = reader.ReadToEnd();
template = Template.Parse(file);
result = template.Render(Hash.FromAnonymousObject(obj));
ZipArchiveEntry entry1 = zip.CreateEntry("pages/" + tableName + "/" + tableName + "/form-schema.ts");
using (StreamWriter entryStream = new StreamWriter(entry1.Open()))
{
entryStream.Write(result);
}
}
// 创建查看详情配置
using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.Vue.DetailConfig.tpl"), Encoding.UTF8))
{
file = reader.ReadToEnd();
template = Template.Parse(file);
result = template.Render(Hash.FromAnonymousObject(obj));
ZipArchiveEntry entry1 = zip.CreateEntry("pages/" + tableName + "/" + tableName + "/detail-config.ts");
using (StreamWriter entryStream = new StreamWriter(entry1.Open()))
{
entryStream.Write(result);
}
}
// 创建表格搜索字段配置
using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.Vue.SearchField.tpl"), Encoding.UTF8))
{
file = reader.ReadToEnd();
template = Template.Parse(file);
result = template.Render(Hash.FromAnonymousObject(obj));
ZipArchiveEntry entry1 = zip.CreateEntry("pages/" + tableName + "/" + tableName + "/search-field.ts");
using (StreamWriter entryStream = new StreamWriter(entry1.Open()))
{
entryStream.Write(result);
}
}
// 创建表格字段配置
using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.Vue.TableConfig.tpl"), Encoding.UTF8))
{
file = reader.ReadToEnd();
template = Template.Parse(file);
result = template.Render(Hash.FromAnonymousObject(obj));
ZipArchiveEntry entry1 = zip.CreateEntry("pages/" + tableName + "/" + tableName + "/table-config.ts");
using (StreamWriter entryStream = new StreamWriter(entry1.Open()))
{
entryStream.Write(result);
}
}
}
public static void CodeGeneratorForInterFaceFiles(object obj, string tableName, ZipArchive zip)
{
var assembly = IntrospectionExtensions.GetTypeInfo(typeof(GeneratorCodeHelper)).Assembly;
string file;
string result;
Template template;
//IRespository
using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.Repositories.IRepository.tpl"), Encoding.UTF8))
{
file = reader.ReadToEnd();
template = Template.Parse(file);
result = template.Render(Hash.FromAnonymousObject(obj));
ZipArchiveEntry entry3 = zip.CreateEntry("IRepository/I" + tableName + "Repository.cs");
using (StreamWriter entryStream = new StreamWriter(entry3.Open()))
{
entryStream.Write(result);
}
}
//Respository
using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.Repositories.Repository.tpl"), Encoding.UTF8))
{
file = reader.ReadToEnd();
template = Template.Parse(file);
result = template.Render(Hash.FromAnonymousObject(obj));
ZipArchiveEntry entry1 = zip.CreateEntry("Repository/" + tableName + "Repository.cs");
using (StreamWriter entryStream = new StreamWriter(entry1.Open()))
{
entryStream.Write(result);
}
}
}
}
}