diff --git a/backend/system/management/commands/gen_menu_json.py b/backend/system/management/commands/gen_menu_json.py index bde3b36..197b589 100644 --- a/backend/system/management/commands/gen_menu_json.py +++ b/backend/system/management/commands/gen_menu_json.py @@ -55,8 +55,8 @@ def gen_menu(app_name, model_name, parent_menu_name, creator='admin'): {"name": "Edit", "title": "common.edit", "auth_code": f"{app_name}:{model_lower}:edit"}, {"name": "Delete", "title": "common.delete", "auth_code": f"{app_name}:{model_lower}:delete"}, {"name": "Query", "title": "common.query", "auth_code": f"{app_name}:{model_lower}:query"}, - {"name": "Query", "title": "common.query", "auth_code": f"{app_name}:{model_lower}:import"}, - {"name": "Query", "title": "common.query", "auth_code": f"{app_name}:{model_lower}:export"}, + {"name": "import", "title": "common.import", "auth_code": f"{app_name}:{model_lower}:import"}, + {"name": "export", "title": "common.export", "auth_code": f"{app_name}:{model_lower}:export"}, ] for idx, btn in enumerate(buttons): btn_meta = MenuMeta.objects.create( diff --git a/backend/system/management/commands/generate_crud.py b/backend/system/management/commands/generate_crud.py index 409be34..c5c7fe9 100644 --- a/backend/system/management/commands/generate_crud.py +++ b/backend/system/management/commands/generate_crud.py @@ -4,7 +4,7 @@ """ 自动生成 CRUD 代码的 Django 管理命令 使用方法: python manage.py generate_crud -例如: python manage.py generate_crud system Dept +例如: python manage.py generate_crud system Dept --frontend """ import os diff --git a/backend/system/urls.py b/backend/system/urls.py index 84e8a93..e161ed5 100644 --- a/backend/system/urls.py +++ b/backend/system/urls.py @@ -14,6 +14,7 @@ router.register(r'post', views.PostViewSet) router.register(r'user', views.UserViewSet) router.register(r'login_log', views.LoginLogViewSet) router.register(r'config', views.ConfigViewSet) +router.register(r'city_area', views.CityAreaViewSet) urlpatterns = [ path('', include(router.urls)), diff --git a/backend/system/views/__init__.py b/backend/system/views/__init__.py index aaa2e4d..772fc11 100644 --- a/backend/system/views/__init__.py +++ b/backend/system/views/__init__.py @@ -9,6 +9,7 @@ __all__ = [ 'UserViewSet', 'ConfigViewSet', 'LoginLogViewSet', + 'CityAreaViewSet', ] from system.views.dict_data import DictDataViewSet @@ -20,4 +21,5 @@ from system.views.dept import DeptViewSet from system.views.post import PostViewSet from system.views.login_log import LoginLogViewSet from system.views.config import ConfigViewSet -from system.views.user import * \ No newline at end of file +from system.views.user import * +from system.views.city_area import CityAreaViewSet \ No newline at end of file diff --git a/backend/system/views/city_area.py b/backend/system/views/city_area.py new file mode 100644 index 0000000..342e96b --- /dev/null +++ b/backend/system/views/city_area.py @@ -0,0 +1,33 @@ +from system.models import CityArea +from utils.serializers import CustomModelSerializer +from utils.custom_model_viewSet import CustomModelViewSet +from django_filters import rest_framework as filters + + +class CityAreaSerializer(CustomModelSerializer): + """ + 省市区 序列化器 + """ + class Meta: + model = CityArea + fields = '__all__' + read_only_fields = ['id', 'create_time', 'update_time'] + + +class CityAreaFilter(filters.FilterSet): + + class Meta: + model = CityArea + fields = ['id', 'remark', 'creator', 'modifier', 'is_deleted', 'prov_id', 'prov_name', 'city_id', 'city_name', 'area_id', 'area_name'] + + +class CityAreaViewSet(CustomModelViewSet): + """ + 省市区 视图集 + """ + queryset = CityArea.objects.filter(is_deleted=False).order_by('-id') + serializer_class = CityAreaSerializer + filterset_class = CityAreaFilter + search_fields = ['name'] # 根据实际字段调整 + ordering_fields = ['create_time', 'id'] + ordering = ['-create_time'] diff --git a/web/apps/web-antd/src/locales/langs/en-US/system.json b/web/apps/web-antd/src/locales/langs/en-US/system.json index 222238f..b0ec66d 100644 --- a/web/apps/web-antd/src/locales/langs/en-US/system.json +++ b/web/apps/web-antd/src/locales/langs/en-US/system.json @@ -100,14 +100,18 @@ "name": "User", "title": "User Management" }, - "login_log": { + "login_log": { "name": "login log", "title": "login log" }, - "config": { + "config": { "name": "System Config", "title": "System Config" }, + "city_area": { + "name": "Area Information", + "title": "Area Information" + }, "status": "Status", "remark": "Remarks", "creator": "creator", diff --git a/web/apps/web-antd/src/locales/langs/zh-CN/system.json b/web/apps/web-antd/src/locales/langs/zh-CN/system.json index 56d494d..635387e 100644 --- a/web/apps/web-antd/src/locales/langs/zh-CN/system.json +++ b/web/apps/web-antd/src/locales/langs/zh-CN/system.json @@ -109,6 +109,10 @@ "name": "系统配置", "title": "系统配置" }, + "city_area": { + "name": "地区信息", + "title": "地区信息" + }, "status": "状态", "remark": "备注", "creator": "创建人", diff --git a/web/apps/web-antd/src/models/system/city_area.ts b/web/apps/web-antd/src/models/system/city_area.ts new file mode 100644 index 0000000..52d02eb --- /dev/null +++ b/web/apps/web-antd/src/models/system/city_area.ts @@ -0,0 +1,25 @@ +import { BaseModel } from '#/models/base'; + +export namespace SystemCityAreaApi { + export interface SystemCityArea { + id: number; + remark: string; + creator: string; + modifier: string; + update_time: string; + create_time: string; + is_deleted: boolean; + prov_id: number; + prov_name: string; + city_id: number; + city_name: string; + area_id: number; + area_name: string; + } +} + +export class SystemCityAreaModel extends BaseModel { + constructor() { + super('/system/city_area/'); + } +} diff --git a/web/apps/web-antd/src/views/system/city_area/data.ts b/web/apps/web-antd/src/views/system/city_area/data.ts new file mode 100644 index 0000000..6908ca1 --- /dev/null +++ b/web/apps/web-antd/src/views/system/city_area/data.ts @@ -0,0 +1,141 @@ +import type { VxeTableGridOptions } from '@vben/plugins/vxe-table'; + +import type { VbenFormSchema } from '#/adapter/form'; +import type { SystemCityAreaApi } from '#/models/system/city_area'; + +import { z } from '#/adapter/form'; +import { $t } from '#/locales'; + +/** + * 获取编辑表单的字段配置 + */ +export function useSchema(): VbenFormSchema[] { + return [ + { + component: 'InputNumber', + fieldName: 'prov_id', + label: '省id', + }, + { + component: 'Input', + fieldName: 'prov_name', + label: '省', + rules: z + .string() + .min(1, $t('ui.formRules.required', ['省'])) + .max(100, $t('ui.formRules.maxLength', ['省', 100])), + }, + { + component: 'InputNumber', + fieldName: 'city_id', + label: '市id', + }, + { + component: 'Input', + fieldName: 'city_name', + label: '市', + rules: z + .string() + .min(1, $t('ui.formRules.required', ['市'])) + .max(100, $t('ui.formRules.maxLength', ['市', 100])), + }, + { + component: 'InputNumber', + fieldName: 'area_id', + label: '区id', + }, + { + component: 'Input', + fieldName: 'area_name', + label: '区', + rules: z + .string() + .min(1, $t('ui.formRules.required', ['区'])) + .max(100, $t('ui.formRules.maxLength', ['区', 100])), + }, + { + component: 'Input', + fieldName: 'remark', + label: '备注', + rules: z + .string() + .min(1, $t('ui.formRules.required', ['备注'])) + .max(100, $t('ui.formRules.maxLength', ['备注', 100])), + }, + ]; +} + +/** + * 获取编辑表单的字段配置 + */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + component: 'InputNumber', + fieldName: 'prov_id', + label: '省id', + }, + { + component: 'Input', + fieldName: 'prov_name', + label: '省', + }, + { + component: 'InputNumber', + fieldName: 'city_id', + label: '市id', + }, + { + component: 'Input', + fieldName: 'city_name', + label: '市', + }, + { + component: 'InputNumber', + fieldName: 'area_id', + label: '区id', + }, + { + component: 'Input', + fieldName: 'area_name', + label: '区', + }, + ]; +} + +/** + * 获取表格列配置 + * @description 使用函数的形式返回列数据而不是直接export一个Array常量,是为了响应语言切换时重新翻译表头 + */ +export function useColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'id', + title: 'ID', + }, + { + field: 'prov_id', + title: '省id', + }, + { + field: 'prov_name', + title: '省', + }, + { + field: 'city_id', + title: '市id', + }, + { + field: 'city_name', + title: '市', + }, + { + field: 'area_id', + title: '区id', + }, + { + field: 'area_name', + title: '区', + }, + ]; +} diff --git a/web/apps/web-antd/src/views/system/city_area/list.vue b/web/apps/web-antd/src/views/system/city_area/list.vue new file mode 100644 index 0000000..ffd8fe5 --- /dev/null +++ b/web/apps/web-antd/src/views/system/city_area/list.vue @@ -0,0 +1,68 @@ + + + diff --git a/web/apps/web-antd/src/views/system/city_area/modules/form.vue b/web/apps/web-antd/src/views/system/city_area/modules/form.vue new file mode 100644 index 0000000..d5165f0 --- /dev/null +++ b/web/apps/web-antd/src/views/system/city_area/modules/form.vue @@ -0,0 +1,79 @@ + + + + diff --git a/web/packages/locales/src/langs/en-US/common.json b/web/packages/locales/src/langs/en-US/common.json index 08c20f7..ed6380e 100644 --- a/web/packages/locales/src/langs/en-US/common.json +++ b/web/packages/locales/src/langs/en-US/common.json @@ -14,6 +14,8 @@ "search": "Search", "enabled": "Enabled", "disabled": "Disabled", + "import": "import", + "export": "export", "edit": "Edit", "delete": "Delete", "create": "Create", diff --git a/web/packages/locales/src/langs/zh-CN/common.json b/web/packages/locales/src/langs/zh-CN/common.json index 6b3cad5..8b447bb 100644 --- a/web/packages/locales/src/langs/zh-CN/common.json +++ b/web/packages/locales/src/langs/zh-CN/common.json @@ -14,6 +14,8 @@ "search": "搜索", "enabled": "已启用", "disabled": "已禁用", + "import": "导入", + "export": "导出", "edit": "修改", "delete": "删除", "create": "新增",