first commit
This commit is contained in:
0
code/system/code_template/web/__init__.py
Normal file
0
code/system/code_template/web/__init__.py
Normal file
48
code/system/code_template/web/api_template.py
Normal file
48
code/system/code_template/web/api_template.py
Normal 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 }});
|
||||
}};
|
||||
'''
|
||||
84
code/system/code_template/web/data_template.py
Normal file
84
code/system/code_template/web/data_template.py
Normal 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
|
||||
72
code/system/code_template/web/drawer_template.py
Normal file
72
code/system/code_template/web/drawer_template.py
Normal 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>'''
|
||||
190
code/system/code_template/web/index_template.py
Normal file
190
code/system/code_template/web/index_template.py
Normal 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>'''
|
||||
Reference in New Issue
Block a user