first commit

This commit is contained in:
lihansani
2026-07-13 15:37:05 +08:00
commit 8b11aa2efc
299 changed files with 206339 additions and 0 deletions

View File

@@ -0,0 +1,48 @@
def generator_api(api_info):
return f'''import {{ defHttp }} from '/@/utils/http/axios';
enum DeptApi {{
prefix = '/api/{'generator'}/{api_info.code}',
}}
/**
* 获取list
*/
export const getList = (params) => {{
return defHttp.get({{ url: DeptApi.prefix, params }});
}};
/**
* 保存或更新
*/
export const createOrUpdate = (params, isUpdate) => {{
if (isUpdate) {{
return defHttp.put({{ url: DeptApi.prefix + '/' + params.id, params }});
}} else {{
return defHttp.post({{ url: DeptApi.prefix, params }});
}}
}};
/**
* 导入
*/
export const importData = (params) => {{
return defHttp.post({{ url: DeptApi.prefix + '/all/import', params }});
}};
/**
* 导出
*/
export const exportData = () => {{
return defHttp.get(
{{ url: DeptApi.prefix + '/all/export', responseType: 'blob' }},
{{ isReturnNativeResponse: true }},
);
}};
/**
* 删除
*/
export const deleteItem = (id) => {{
return defHttp.delete({{ url: DeptApi.prefix + '/' + id }});
}};
'''

View File

@@ -0,0 +1,84 @@
import json
import re
# 自定义函数用于处理布尔值转换
def bool_to_str(val):
if isinstance(val, bool):
return str(val).lower() # 将布尔值转换为小写字符串
raise TypeError("Object of type %s is not JSON serializable" % type(val))
# Custom JSON decoder to convert boolean strings to boolean values
def custom_json_decoder(data):
for key, value in data.items():
if value == 'true':
data[key] = True
elif value == 'false':
data[key] = False
return data
def generator_data(data_info):
head_txt = f'''
import {{ BasicColumn }} from '/@/components/Table';
import {{ FormSchema }} from '/@/components/Table';
'''
column_schemas = ''
table_info = json.loads(data_info.table_info)
column_info = table_info.get('columnInfo')
for item in column_info:
column_schema = f'''
{{
title: '{item['column_name']}',
dataIndex: '{item['field_name']}',
width: '{item['width']}',
fixed: '{item['freeze']}',
align: '{item['align']}',
auth: ['{data_info.code + ':' + item['field_name']}'],
resizable: {str(item['resizable']).lower()},
}},
'''
column_schemas = column_schemas + column_schema
column_txt = f'''export const columns: BasicColumn[] = [
{column_schemas}
]
'''
search_schemas = ''
table_info = json.loads(data_info.table_info)
search_info = table_info.get('searchInfo')
for item in search_info:
search_schema = f'''
{{
label: '{item['column_name']}',
field: '{item['field_name']}',
component: 'Input',
colProps: {{ span: 6 }},
}},
'''
search_schemas = search_schemas + search_schema
search_txt = f'''export const searchFormSchema: FormSchema[] = [
{search_schemas}
];
'''
form_info = json.loads(data_info.form_info).get('schemas')
for item in form_info:
item.pop('key')
item.pop('icon')
id_dict = {
'field': 'id',
'label': 'id',
'component': 'Input',
'show': False,
}
form_info.insert(0, id_dict)
json_str = json.dumps(form_info, ensure_ascii=False, indent=2, default=bool_to_str)
js_object = re.sub(r'"\b(\w+)\b":', r'\1:', json_str)
form_schemas = js_object.replace('"', "'")
form_txt = f'''export const formSchema: FormSchema[] = {form_schemas}'''
return head_txt + column_txt + search_txt + form_txt

View File

@@ -0,0 +1,72 @@
def generator_drawer(drawer_info):
return f'''<template>
<BasicDrawer
v-bind="$attrs"
@register="registerDrawer"
showFooter
:title="getTitle"
width="50%"
@ok="handleSubmit"
>
<BasicForm @register="registerForm" />
</BasicDrawer>
</template>
<script lang="ts">
import {{ defineComponent, ref, computed, unref }} from 'vue';
import {{ BasicForm, useForm }} from '/@/components/Form/index';
import {{ BasicDrawer, useDrawerInner }} from '/@/components/Drawer';
import {{ createOrUpdate }} from './api';
import {{ formSchema }} from './data';
import {{ useI18n }} from '/@/hooks/web/useI18n';
export default defineComponent({{
name: '{drawer_info.code}Drawer',
components: {{ BasicDrawer, BasicForm }},
emits: ['success', 'register'],
setup(_, {{ emit }}) {{
const isUpdate = ref(true);
const {{ t }} = useI18n();
const [registerForm, {{ resetFields, setFieldsValue, validate }}] = useForm({{
labelWidth: 100,
schemas: formSchema,
showActionButtonGroup: false,
}});
const [registerDrawer, {{ setDrawerProps, closeDrawer }}] = useDrawerInner(async (data) => {{
await resetFields();
setDrawerProps({{ confirmLoading: false }});
isUpdate.value = !!data?.isUpdate;
if (unref(isUpdate)) {{
await setFieldsValue({{
...data.record,
}});
}}
}});
const getTitle = computed(() =>
!unref(isUpdate) ? t('common.addText') : t('common.updateText'),
);
async function handleSubmit() {{
try {{
const values = await validate();
setDrawerProps({{ confirmLoading: true }});
await createOrUpdate(values, unref(isUpdate));
closeDrawer();
emit('success');
}} finally {{
setDrawerProps({{ confirmLoading: false }});
}}
}}
return {{
registerDrawer,
registerForm,
getTitle,
handleSubmit,
}};
}},
}});
</script>'''

View File

@@ -0,0 +1,190 @@
def generator_index(index_info):
return f'''<template>
<div>
<BasicTable @register="registerTable">
<template #tableTitle>
<Space style="height: 40px">
<a-button
type="primary"
v-auth="['{index_info.code}:add']"
preIcon="ant-design:plus-outlined"
@click="handleCreate"
>
{{{{ t('common.addText') }}}}
</a-button>
<a-button
type="error"
v-auth="['{index_info.code}:delete']"
preIcon="ant-design:delete-outlined"
@click="handleBulkDelete"
>
{{{{ t('common.delText') }}}}
</a-button>
<BasicUpload
:maxSize="20"
:maxNumber="1"
@change="handleChange"
class="my-5"
type="warning"
:text="t('common.importText')"
v-auth="['{index_info.code}:update']"
/>
<a-button
type="success"
v-auth="['{index_info.code}:update']"
preIcon="carbon:cloud-download"
@click="handleExportData"
>
{{{{ t('common.exportText') }}}}
</a-button>
</Space>
</template>
<template #bodyCell="{{ column, record }}">
<template v-if="column.key === 'action'">
<TableAction
:actions="[
{{
type: 'button',
icon: 'clarity:note-edit-line',
color: 'primary',
auth: ['{index_info.code}:update'],
onClick: handleEdit.bind(null, record),
}},
{{
icon: 'ant-design:delete-outlined',
type: 'button',
color: 'error',
placement: 'left',
auth: ['{index_info.code}:delete'],
popConfirm: {{
title: t('common.delHintText'),
confirm: handleDelete.bind(null, record.id),
}},
}},
]"
/>
</template>
</template>
</BasicTable>
<Drawer @register="registerDrawer" @success="handleSuccess" />
</div>
</template>
<script lang="ts">
import {{ defineComponent }} from 'vue';
import {{ BasicTable, useTable, TableAction }} from '/@/components/Table';
import {{ usePermission }} from '/@/hooks/web/usePermission';
import {{ useDrawer }} from '/@/components/Drawer';
import Drawer from './drawer.vue';
import {{ Space }} from 'ant-design-vue';
import {{ BasicUpload }} from '/@/components/Upload';
import {{ deleteItem, getList, exportData, importData }} from './api';
import {{ columns, searchFormSchema }} from './data';
import {{ message }} from 'ant-design-vue';
import {{ useMessage }} from '/@/hooks/web/useMessage';
import {{ downloadByData }} from '/@/utils/file/download';
import {{ useI18n }} from '/@/hooks/web/useI18n';
export default defineComponent({{
name: '{index_info.code}',
components: {{ BasicTable, Drawer, TableAction, BasicUpload, Space }},
setup() {{
const {{ t }} = useI18n();
const [registerDrawer, {{ openDrawer }}] = useDrawer();
const {{ createConfirm }} = useMessage();
const {{ hasPermission }} = usePermission();
const [registerTable, {{ reload, getSelectRows }}] = useTable({{
api: getList,
columns,
formConfig: {{
labelWidth: 80,
schemas: searchFormSchema,
}},
useSearchForm: true,
showTableSetting: true,
tableSetting: {{ fullScreen: true }},
bordered: true,
showIndexColumn: false,
rowSelection: {{
type: 'checkbox',
}},
actionColumn: {{
width: 150,
title: t('common.operationText'),
dataIndex: 'action',
fixed: undefined,
}},
}});
function handleCreate() {{
openDrawer(true, {{
isUpdate: false,
}});
}}
function handleEdit(record: Recordable) {{
openDrawer(true, {{
record,
isUpdate: true,
}});
}}
async function handleDelete(id: number) {{
await deleteItem(id);
message.success(t('common.successText'));
await reload();
}}
function handleBulkDelete() {{
if (getSelectRows().length == 0) {{
message.warning(t('common.batchDelHintText'));
}} else {{
createConfirm({{
iconType: 'warning',
title: t('common.hintText'),
content: t('common.delHintText'),
async onOk() {{
for (const item of getSelectRows()) {{
await deleteItem(item.id);
}}
message.success(t('common.successText'));
await reload();
}},
}});
}}
}}
async function handleChange(list: string[]) {{
console.log(list[0]);
await importData({{ path: list[0] }});
message.success('导入成功');
await reload();
}}
async function handleExportData() {{
const response = await exportData();
await downloadByData(response.data, '{index_info.name}.xlsx');
}}
function handleSuccess() {{
message.success(t('common.successText'));
reload();
}}
return {{
registerTable,
registerDrawer,
handleCreate,
handleEdit,
handleDelete,
handleSuccess,
hasPermission,
handleBulkDelete,
getSelectRows,
handleExportData,
handleChange,
t,
}};
}},
}});
</script>'''