Browse Source

🚀 引入vxe-table以及重新调整架构

master
wangxiang 3 years ago
parent
commit
2cb4a1f12f
  1. 6
      .env.production
  2. 8
      build/vite/plugin/styleImport.ts
  3. 1
      build/vite/plugin/theme.ts
  4. 4
      package.json
  5. 147
      src/components/AMap/src/MapDataSettingsModal.vue
  6. 2
      src/components/AMap/src/map.data.ts
  7. 96
      src/main.ts
  8. 2
      src/views/common/address/AddressModal.vue
  9. 0
      src/views/common/address/address.data.ts
  10. 0
      src/views/common/address/index.vue
  11. 4
      src/views/common/boxcard/BoxCardModal.vue
  12. 0
      src/views/common/boxcard/boxcard.data.ts
  13. 0
      src/views/common/boxcard/index.vue
  14. 2
      src/views/common/doctor/DoctorModal.vue
  15. 0
      src/views/common/doctor/doctor.data.ts
  16. 0
      src/views/common/doctor/index.vue
  17. 2
      src/views/common/hospital/HospitalModal.vue
  18. 0
      src/views/common/hospital/hospital.data.ts
  19. 0
      src/views/common/hospital/index.vue
  20. 2
      src/views/common/institution/InstitutionModal.vue
  21. 0
      src/views/common/institution/index.vue
  22. 0
      src/views/common/institution/institution.data.ts
  23. 2
      src/views/common/office/OfficeModal.vue
  24. 0
      src/views/common/office/index.vue
  25. 0
      src/views/common/office/office.data.ts
  26. 2
      src/views/common/report/ReportModal.vue
  27. 0
      src/views/common/report/index.vue
  28. 0
      src/views/common/report/report.data.ts
  29. 88
      src/views/system/area/AreaModal.vue
  30. 191
      src/views/system/area/area.data.ts
  31. 112
      src/views/system/area/index.vue
  32. 18
      yarn.lock

6
.env.production

@ -4,14 +4,14 @@ VITE_PUBLIC_PATH = /
# 本地开发代理,可以解决跨域及多地址代理 # 本地开发代理,可以解决跨域及多地址代理
# 如果接口地址匹配到,则会转发到http://localhost:3000,防止本地出现跨域问题 # 如果接口地址匹配到,则会转发到http://localhost:3000,防止本地出现跨域问题
# 可以有多个,注意多个不能换行,否则代理将会失效 # 可以有多个,注意多个不能换行,否则代理将会失效
VITE_PROXY = [["/prod-api","http://localhost:9999"],["/prod-upload","http://localhost:9999/system_proxy/system/file/upload"]] VITE_PROXY = [["/prod-api","http://192.168.3.10:9999"],["/prod-upload","http://192.168.3.10:9999/system_proxy/system/file/upload"]]
# 是否删除console.log # 是否删除console.log
VITE_DROP_CONSOLE = true VITE_DROP_CONSOLE = false
# 打包是否输出gz|br文件 # 打包是否输出gz|br文件
# 可选: gzip | brotli | none # 可选: gzip | brotli | none
# 也可以有多个, 例如 ‘gzip’|'brotli',这样会同时生成 .gz和.br文件 # 也可以有多个, 例如 ‘gzip’|'brotli',这样会同时生成 .gz和.b r文件
VITE_BUILD_COMPRESS = 'none' VITE_BUILD_COMPRESS = 'none'
# 使用compress时是否删除源文件,默认false # 使用compress时是否删除源文件,默认false

8
build/vite/plugin/styleImport.ts

@ -8,7 +8,7 @@
*/ */
import styleImport from 'vite-plugin-style-import'; import styleImport from 'vite-plugin-style-import';
import {createStyleImportPlugin} from 'vite-plugin-style-import';
export function configStyleImportPlugin() { export function configStyleImportPlugin() {
const styleImportPlugin = styleImport({ const styleImportPlugin = styleImport({
libs: [ libs: [
@ -21,6 +21,12 @@ export function configStyleImportPlugin() {
resolveStyle: (name) => { resolveStyle: (name) => {
return `ant-design-vue/es/${name}/style/index`; return `ant-design-vue/es/${name}/style/index`;
} }
},
{ // 按需加载vxe-table组件
libraryName: 'vxe-table',
esModule: true,
resolveComponent: (name) => `vxe-table/es/${name}`,
resolveStyle: (name) => `vxe-table/es/${name}/style.css`
} }
] ]
}); });

1
build/vite/plugin/theme.ts

@ -57,6 +57,7 @@ export function configThemePlugin(isBuild: boolean): Plugin[] {
path.resolve(process.cwd(), 'node_modules/ant-design-vue/dist/antd.less'), path.resolve(process.cwd(), 'node_modules/ant-design-vue/dist/antd.less'),
// path.resolve(process.cwd(), 'node_modules/ant-design-vue/dist/antd.dark.less'), // path.resolve(process.cwd(), 'node_modules/ant-design-vue/dist/antd.dark.less'),
path.resolve(process.cwd(), 'src/assets/styles/index.less'), path.resolve(process.cwd(), 'src/assets/styles/index.less'),
path.resolve(process.cwd(), 'node_modules/vxe-table/lib/style.css'),
], ],
// 过滤less(禁止在生产环境客户端控制台调用transform注入的函数处理css) // 过滤less(禁止在生产环境客户端控制台调用transform注入的函数处理css)
filter: (id) => (isBuild ? !id.endsWith('antd.less') : true), filter: (id) => (isBuild ? !id.endsWith('antd.less') : true),

4
package.json

@ -42,13 +42,15 @@
"qrcode": "1.4.4", "qrcode": "1.4.4",
"qs": "6.10.3", "qs": "6.10.3",
"resize-observer-polyfill": "1.5.1", "resize-observer-polyfill": "1.5.1",
"sortablejs": "1.14.0", "sortablejs": "^1.15.0",
"tinymce": "5.9.1", "tinymce": "5.9.1",
"vditor": "3.8.6", "vditor": "3.8.6",
"vue": "3.2.12", "vue": "3.2.12",
"vue-i18n": "9.1.7", "vue-i18n": "9.1.7",
"vue-router": "4.0.11", "vue-router": "4.0.11",
"vue-types": "4.0.3", "vue-types": "4.0.3",
"vxe-table": "^4.2.8",
"xe-utils": "^3.5.4",
"xlsx": "0.17.2" "xlsx": "0.17.2"
}, },
"devDependencies": { "devDependencies": {

147
src/components/AMap/src/MapDataSettingsModal.vue

@ -1,58 +1,125 @@
<template> <script lang="tsx" setup>
<BasicModal v-bind="$attrs" import { reactive, nextTick, ref, h } from 'vue';
defaultFullscreen
@register="registerModal"
@ok="handleSubmit"
>
<ARow>
<ACol :span="12">
<AMap :sidebarControl="false"/>
</ACol>
<ACol :span="12">
<BasicTable @register="registerTable"/>
</ACol>
</ARow>
</BasicModal>
</template>
<script lang="ts" setup>
import { reactive } from 'vue';
import { BasicModal, ModalProps, useModalInner } from '/@/components/Modal'; import { BasicModal, ModalProps, useModalInner } from '/@/components/Modal';
import { BasicTable, useTable } from '/@/components/Table';
import { Form, Select, Row, Col } from 'ant-design-vue'; import { Form, Select, Row, Col } from 'ant-design-vue';
import { AMap } from '/@/components/AMap'; import { AMap } from '/@/components/AMap';
import { formMapDataSettingsColumns } from '/@/components/AMap/src/map.data'; import { formMapDataSettingsColumns } from '/@/components/AMap/src/map.data';
import Sortable from 'sortablejs';
import { VxeGridProps } from 'vxe-table';
const VxeGridEl = ref();
const mapSettingsState = reactive({
sortable: {}
});
const gridOptions = reactive({
data: [
{
id: 10001,
name: 'Test1'
},
{
id: 10002,
name: 'Test2'
},
{
id: 10003,
name: 'Test3'
}
],
columns: [
{
width: '50px',
align: 'center',
slots: {
default ({ row }) {
return (
<span class="drag-btn">
<i class="vxe-icon--menu"/>
</span>
);
},
header ({ row }) {
return (
<vxe-tooltip content="按住后可以上下拖动排序!">
<i class="vxe-icon--question"/>
</vxe-tooltip>
);
}
}
},
{ field: 'name', title: '名称' }
],
rowConfig: {
useKey: true,
isHover: true
},
border: true,
height: 'auto',
stripe: true
} as VxeGridProps);
const AForm = Form; const AForm = Form;
const AFormItem = Form.Item; const AFormItem = Form.Item;
const ASelect = Select; const ASelect = Select;
const ARow = Row; const ARow = Row;
const ACol = Col; const ACol = Col;
const [ registerTable, { reload, getDataSource, setProps }] = useTable({
title: '地图标记点数据',
columns: formMapDataSettingsColumns,
pagination: false,
dataSource: [{
markId: '001',
markName: '标记点1'
},{
markId: '002',
markName: '标记点2'
}],
striped: false,
useSearchForm: false,
showTableSetting: false,
bordered: true,
showIndexColumn: false,
canResize: false
});
const emit = defineEmits(['success', 'register']); const emit = defineEmits(['success', 'register']);
const [registerModal, { setModalProps, closeModal }] = useModalInner(async data => { const [registerModal, { setModalProps, closeModal }] = useModalInner(data => {
const props: Partial<ModalProps> = { confirmLoading: false }; const props: Partial<ModalProps> = { confirmLoading: false };
props.title = '地图标记点数据设置弹出框'; props.title = '地图标记点数据设置弹出框';
nextTick(() => {
mapSettingsState.sortable = Sortable.create(VxeGridEl.value!.$el.querySelector('.body--wrapper>.vxe-table--body tbody'), {
handle: '.drag-btn',
onEnd: ({ newIndex, oldIndex }) => {
const currRow = gridOptions.data?.splice(oldIndex!, 1)[0];
gridOptions.data?.splice(newIndex!, 0, currRow);
},
ghostClass: 'ghostGrid'
});
});
// : // :
setModalProps(props); setModalProps(props);
}); });
function handleSubmit() {
}
</script> </script>
<template>
<BasicModal v-bind="$attrs"
defaultFullscreen
@register="registerModal"
@ok="handleSubmit"
>
<ARow>
<ACol :span="12">
<AMap :sidebarControl="false"/>
</ACol>
<ACol :span="12">
<vxe-grid ref="VxeGridEl" v-bind="gridOptions"/>
</ACol>
</ARow>
</BasicModal>
</template>
<style>
.ghostGrid {
background: white;
border: 2px solid #67C23A;
box-sizing: border-box;
font-size: 0;
content: "";
overflow: hidden;
padding: 0 !important;
position: relative;
outline: none 0;
height: 100% !important;
width: 0 !important;
float: left;
margin: 0 2px 0 2px;
}
</style>

2
src/components/AMap/src/map.data.ts

@ -232,7 +232,7 @@ export const formMutualTaskSettingColumns: BasicColumn[] = [
} }
]; ];
export const formMapDataSettingsColumns: BasicColumn[] = [ export const formMapDataSettingsColumns = [
{ {
title: '标记点ID', title: '标记点ID',
dataIndex: 'markId' dataIndex: 'markId'

96
src/main.ts

@ -14,12 +14,62 @@ import { setupGlobDirectives } from '/@/directives';
import { setupI18n } from '/@/locales/setupI18n'; import { setupI18n } from '/@/locales/setupI18n';
import { registerGlobComp } from '/@/components'; import { registerGlobComp } from '/@/components';
// 引入表格功能相对比较齐全的组件vxeTable
import XEUtils from 'xe-utils';
// 按需导入 vxeTable
import {
// 核心
VXETable,
// 功能模块
Icon,
Filter,
Menu,
Edit,
Export,
Keyboard,
Validator,
Header,
Footer,
// 可选组件
Column,
Colgroup,
Grid,
Toolbar,
Pager,
Checkbox,
CheckboxGroup,
Radio,
RadioGroup,
RadioButton,
Input,
Textarea,
Button,
Modal,
Tooltip,
Form,
FormItem,
FormGather,
Select,
Optgroup,
Option,
Switch,
List,
Pulldown,
// 表格
Table
} from 'vxe-table';
import zhCN from 'vxe-table/lib/locale/lang/zh-CN';
// 在本地开发中不引入按需? // 在本地开发中不引入按需?
// 在按需引入的本地开发中,浏览器请求的数量将增加 20% 左右。 // 在按需引入的本地开发中,浏览器请求的数量将增加 20% 左右。
// 这可能会减慢浏览器的刷新速度。 // 这可能会减慢浏览器的刷新速度。
// 所以都是在本地开发中引入,生产环境中才按需引入 // 所以都是在本地开发中引入,生产环境中才按需引入
if (import.meta.env.DEV) { if (import.meta.env.DEV) {
import('ant-design-vue/dist/antd.less'); import('ant-design-vue/dist/antd.less');
import('vxe-table/lib/style.css');
} }
async function bootstrap() { async function bootstrap() {
@ -55,6 +105,52 @@ async function bootstrap() {
window._AMapSecurityConfig = { window._AMapSecurityConfig = {
securityJsCode: 'ea9d5e2fb6383665de6c3c7b4e53c289' securityJsCode: 'ea9d5e2fb6383665de6c3c7b4e53c289'
}; };
// 按需加载的方式默认是不带国际化的,自定义国际化需要自行解析占位符 '{0}',例如:
VXETable.setup({
size: 'medium', // set default size
i18n: (key, args) => XEUtils.toFormatString(XEUtils.get(zhCN, key), args)
});
// 表格功能
app.use(Header)
.use(Footer)
.use(Icon)
.use(Filter)
.use(Edit)
.use(Menu)
.use(Export)
.use(Keyboard)
.use(Validator)
// 可选组件
.use(Column)
.use(Colgroup)
.use(Grid)
.use(Toolbar)
.use(Pager)
.use(Checkbox)
.use(CheckboxGroup)
.use(Radio)
.use(RadioGroup)
.use(RadioButton)
.use(Input)
.use(Textarea)
.use(Button)
.use(Modal)
.use(Tooltip)
.use(Form)
.use(FormItem)
.use(FormGather)
.use(Select)
.use(Optgroup)
.use(Option)
.use(Switch)
.use(List)
.use(Pulldown)
// 安装表格
.use(Table);
} }
void bootstrap(); void bootstrap();

2
src/views/institution/address/AddressModal.vue → src/views/common/address/AddressModal.vue

@ -15,7 +15,7 @@
* author entfrm开发团队-王翔 * author entfrm开发团队-王翔
*/ */
import { ref, unref } from 'vue'; import { ref, unref } from 'vue';
import { BasicForm, useForm } from '/@/components/Form/index'; import { BasicForm, useForm } from '/@/components/Form';
import { addressFormSchema } from './address.data'; import { addressFormSchema } from './address.data';
import { BasicModal, ModalProps, useModalInner } from '/@/components/Modal'; import { BasicModal, ModalProps, useModalInner } from '/@/components/Modal';
import { listAddr, addAddr, editAddr, getAddr} from '/@/api/platform/system/controller/address'; import { listAddr, addAddr, editAddr, getAddr} from '/@/api/platform/system/controller/address';

0
src/views/institution/address/address.data.ts → src/views/common/address/address.data.ts

0
src/views/institution/address/index.vue → src/views/common/address/index.vue

4
src/views/equip/boxcard/BoxCardModal.vue → src/views/common/boxcard/BoxCardModal.vue

@ -12,7 +12,7 @@
import {ref, computed, unref} from 'vue'; import {ref, computed, unref} from 'vue';
import {BasicModal, useModalInner} from '/@/components/Modal'; import {BasicModal, useModalInner} from '/@/components/Modal';
import {cardFormSchema} from './boxcard.data'; import {cardFormSchema} from './boxcard.data';
import {BasicForm, useForm} from '/@/components/Form/index'; import {BasicForm, useForm} from '/@/components/Form';
import {set} from '/@/api/platform/system/controller/boxcard'; import {set} from '/@/api/platform/system/controller/boxcard';
const isUpdate = ref(true); const isUpdate = ref(true);
// emit // emit
@ -54,4 +54,4 @@ async function handleSubmit() {
setModalProps({confirmLoading: false}); setModalProps({confirmLoading: false});
} }
} }
</script> </script>

0
src/views/equip/boxcard/boxcard.data.ts → src/views/common/boxcard/boxcard.data.ts

0
src/views/equip/boxcard/index.vue → src/views/common/boxcard/index.vue

2
src/views/institution/doctor/DoctorModal.vue → src/views/common/doctor/DoctorModal.vue

@ -15,7 +15,7 @@
* author entfrm开发团队-王翔 * author entfrm开发团队-王翔
*/ */
import { ref, unref } from 'vue'; import { ref, unref } from 'vue';
import { BasicForm, useForm } from '/@/components/Form/index'; import { BasicForm, useForm } from '/@/components/Form';
import { doctorFormSchema } from './doctor.data'; import { doctorFormSchema } from './doctor.data';
import {addDoctor, delDoctor,getDoctor,editDoctor} from '/@/api/platform/system/controller/doctor'; import {addDoctor, delDoctor,getDoctor,editDoctor} from '/@/api/platform/system/controller/doctor';
import { BasicModal, ModalProps, useModalInner } from '/@/components/Modal'; import { BasicModal, ModalProps, useModalInner } from '/@/components/Modal';

0
src/views/institution/doctor/doctor.data.ts → src/views/common/doctor/doctor.data.ts

0
src/views/institution/doctor/index.vue → src/views/common/doctor/index.vue

2
src/views/institution/hospital/HospitalModal.vue → src/views/common/hospital/HospitalModal.vue

@ -15,7 +15,7 @@
* author entfrm开发团队-王翔 * author entfrm开发团队-王翔
*/ */
import { ref, unref } from 'vue'; import { ref, unref } from 'vue';
import { BasicForm, useForm } from '/@/components/Form/index'; import { BasicForm, useForm } from '/@/components/Form';
import { hospitalFormSchema } from './hospital.data'; import { hospitalFormSchema } from './hospital.data';
import {addHospital, delHospital,getHospital,editHospital} from '/@/api/platform/system/controller/hospital'; import {addHospital, delHospital,getHospital,editHospital} from '/@/api/platform/system/controller/hospital';
import { BasicModal, ModalProps, useModalInner } from '/@/components/Modal'; import { BasicModal, ModalProps, useModalInner } from '/@/components/Modal';

0
src/views/institution/hospital/hospital.data.ts → src/views/common/hospital/hospital.data.ts

0
src/views/institution/hospital/index.vue → src/views/common/hospital/index.vue

2
src/views/institution/institution/InstitutionModal.vue → src/views/common/institution/InstitutionModal.vue

@ -15,7 +15,7 @@
* author entfrm开发团队-王翔 * author entfrm开发团队-王翔
*/ */
import { ref, unref } from 'vue'; import { ref, unref } from 'vue';
import { BasicForm, useForm } from '/@/components/Form/index'; import { BasicForm, useForm } from '/@/components/Form';
import { institutionFormSchema } from './institution.data'; import { institutionFormSchema } from './institution.data';
import {addInstitution, delInstitution,getInstitution,editInstitution} from '/@/api/platform/system/controller/institution'; import {addInstitution, delInstitution,getInstitution,editInstitution} from '/@/api/platform/system/controller/institution';
import { BasicModal, ModalProps, useModalInner } from '/@/components/Modal'; import { BasicModal, ModalProps, useModalInner } from '/@/components/Modal';

0
src/views/institution/institution/index.vue → src/views/common/institution/index.vue

0
src/views/institution/institution/institution.data.ts → src/views/common/institution/institution.data.ts

2
src/views/institution/office/OfficeModal.vue → src/views/common/office/OfficeModal.vue

@ -15,7 +15,7 @@
* author entfrm开发团队-王翔 * author entfrm开发团队-王翔
*/ */
import { ref, unref } from 'vue'; import { ref, unref } from 'vue';
import { BasicForm, useForm } from '/@/components/Form/index'; import { BasicForm, useForm } from '/@/components/Form';
import { officeFormSchema } from './office.data'; import { officeFormSchema } from './office.data';
import {addOffice, delOffice,getOffice,editOffice} from '/@/api/platform/system/controller/office'; import {addOffice, delOffice,getOffice,editOffice} from '/@/api/platform/system/controller/office';
import { BasicModal, ModalProps, useModalInner } from '/@/components/Modal'; import { BasicModal, ModalProps, useModalInner } from '/@/components/Modal';

0
src/views/institution/office/index.vue → src/views/common/office/index.vue

0
src/views/institution/office/office.data.ts → src/views/common/office/office.data.ts

2
src/views/institution/report/ReportModal.vue → src/views/common/report/ReportModal.vue

@ -15,7 +15,7 @@
* author entfrm开发团队-王翔 * author entfrm开发团队-王翔
*/ */
import { ref, unref } from 'vue'; import { ref, unref } from 'vue';
import { BasicForm, useForm } from '/@/components/Form/index'; import { BasicForm, useForm } from '/@/components/Form';
import { doctorFormSchema } from './report.data'; import { doctorFormSchema } from './report.data';
import {addReport, delReport,getReport,editReport} from '/@/api/platform/system/controller/report'; import {addReport, delReport,getReport,editReport} from '/@/api/platform/system/controller/report';
import { BasicModal, ModalProps, useModalInner } from '/@/components/Modal'; import { BasicModal, ModalProps, useModalInner } from '/@/components/Modal';

0
src/views/institution/report/index.vue → src/views/common/report/index.vue

0
src/views/institution/report/report.data.ts → src/views/common/report/report.data.ts

88
src/views/system/area/AreaModal.vue

@ -1,88 +0,0 @@
<template>
<BasicModal v-bind="$attrs"
width="720px"
@ok="handleSubmit"
@register="registerModal"
>
<BasicForm @register="registerForm"/>
</BasicModal>
</template>
<script lang="ts" setup>
/**
* 提供模板规范代码参考,请尽量保证编写代码风格跟模板规范代码一致
* 采用vben-动态表格表单封装组件编写,采用 setup 写法
* Copyright © 2020-2022 <a href="http://www.entfrm.com/">entfrm</a> All rights reserved.
* author entfrm开发团队-王翔
*/
import { ref, unref } from 'vue';
import { BasicForm, useForm } from '/@/components/Form/index';
import { formSchema } from './area.data';
import { BasicModal, ModalProps, useModalInner } from '/@/components/Modal';
import { listArea, addArea, editArea, getArea } from '/@/api/platform/system/controller/area';
import { listToTree } from '/@/utils/helper/treeHelper';
/** 通用变量统一声明区域 */
const tag = ref<Nullable<string>>('');
/** https://v3.cn.vuejs.org/api/options-data.html#emits */
const emit = defineEmits(['success', 'register']);
const [registerForm, { resetFields, setFieldsValue, updateSchema, validate, clearValidate }] = useForm({
labelWidth: 100,
schemas: formSchema,
showActionButtonGroup: false,
baseColProps: { span: 24 }
});
const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data: WindowInnerData = { _tag: '' }) => {
//
await resetFields();
await clearValidate();
//
tag.value = data._tag;
const topArea = { areaId: '0', name: '顶级区域', children: [] };
topArea.children = listToTree(await listArea());
await updateSchema({
field: 'parentId',
componentProps: {
treeData: [topArea]
}
});
const areaId = data.record?.areaId;
const props: Partial<ModalProps> = { confirmLoading: false };
// tag
switch (unref(tag)) {
case 'add':
props.title = '新增区域';
areaId && (await setFieldsValue({ parentId: areaId }));
break;
case 'edit':
props.title = '编辑区域';
await setFieldsValue(await getArea(areaId));
break;
}
// :
setModalProps(props);
});
/** 处理弹出框提交 */
async function handleSubmit() {
try {
//
const formData = await validate();
//
setModalProps({ confirmLoading: true });
// tag
switch (unref(tag)) {
case 'add':
await addArea(formData);
break;
case 'edit':
await editArea(formData);
break;
}
//
closeModal();
emit('success');
} finally {
setModalProps({ confirmLoading: false });
}
}
</script>

191
src/views/system/area/area.data.ts

@ -1,191 +0,0 @@
/**
* @program: kicc-ui
* @description:
* @author: entfrm开发团队-
* @create: 2022/4/21
*/
import { BasicColumn } from '/@/components/Table';
import { FormSchema } from '/@/components/Table';
import { h } from 'vue';
import { Tag } from 'ant-design-vue';
/** 表格列配置 */
export const columns: BasicColumn[] = [
{
title: '区域名称',
dataIndex: 'name',
align: 'left'
},
{
title: '区域编码',
dataIndex: 'code'
},
{
title: '排序',
dataIndex: 'sort'
},
{
title: '状态',
dataIndex: 'status',
width: 80,
customRender: ({record}) => {
const status = record.status;
// 采用二进制~~取反,只要为null或者0等等一些其他的空元素都会转为0
// 第一次取反会运算为-1,在后一次取反会运算为0
const enable = ~~status === 0;
const color = enable ? 'green' : 'red';
const text = enable ? '正常' : '停用';
return h(Tag, { color: color }, () => text);
}
},
{
title: '创建时间',
dataIndex: 'createTime'
}
];
/** 搜索表单配置 */
export const searchFormSchema: FormSchema[] = [
{
field: 'name',
label: '区域名称',
component: 'Input',
componentProps: {
placeholder: '请输入区域名称'
},
colProps: {span: 8}
},
{
field: 'status',
label: '状态',
component: 'Select',
componentProps: {
options: [
{ label: '正常', value: '0' },
{ label: '停用', value: '1' }
]
},
colProps: { span: 7 }
},
{
field: 'dateRange',
label: '创建时间',
component: 'RangePicker',
componentProps: {
style: { width:'100%' },
valueFormat: 'YYYY-MM-DD',
placeholder: ['开始日期','结束日期']
},
colProps: { span: 8 }
}
];
/** 表单配置 */
export const formSchema: FormSchema[] = [
{
field: 'areaId',
label: 'ID',
component: 'Input',
show: false
},
{
field: 'parentId',
label: '上级区域',
component: 'TreeSelect',
defaultValue: '0',
componentProps: {
replaceFields: {
title: 'name',
key: 'areaId',
value: 'areaId',
},
getPopupContainer: () => document.body,
}
},
{
field: 'name',
label: '区域名称',
component: 'Input',
required: true,
colProps: {
span: 12
}
},
{
field: 'code',
label: '区域代码',
component: 'Input',
required: true,
colProps: {
span: 12
}
},
{
field: 'contacts',
label: '联系人',
component: 'Input',
colProps: {
span: 12
}
},
{
field: 'phone',
label: '联系人电话',
component: 'Input',
rules: [
{
pattern: new RegExp('^1[3|4|5|6|7|8|9][0-9]\\d{8}$'),
message: '请输入正确的手机号码!',
validateTrigger: 'change'
}
],
colProps: {
span: 12
}
},
{
field: 'sort',
label: '区域排序',
component: 'InputNumber',
componentProps: {
style: { width:'100%' },
min: 0
},
required: true,
colProps: {
span: 12
}
},
{
field: 'email',
label: '邮箱',
component: 'Input',
rules: [
{
type: 'email',
message: '请输入正确的邮箱地址!',
validateTrigger: 'change'
}
],
colProps: {
span: 12
}
},
{
field: 'status',
label: '状态',
component: 'RadioGroup',
defaultValue: '0',
componentProps: {
options: [
{ label: '正常', value: '0' },
{ label: '停用', value: '1' }
]
},
required: true,
colProps: {
span: 12
}
}
];

112
src/views/system/area/index.vue

@ -1,112 +0,0 @@
<template>
<div>
<BasicTable @register="registerTable">
<template #toolbar>
<a-button v-auth="['area_add']" type="primary" @click="handleAdd()">新增区域</a-button>
<a-button type="default" @click="expandAll">展开全部</a-button>
<a-button type="default" @click="collapseAll">折叠全部</a-button>
</template>
<template #action="{ record }">
<TableAction
:actions="[
{
label: '编辑',
icon: 'fa6-regular:pen-to-square',
auth: ['area_edit'],
onClick: handleEdit.bind(null, record)
},
{
label: '新增',
icon: 'ant-design:plus-circle-outlined',
auth: ['area_add'],
onClick: handleAdd.bind(null, record)
},
{
label: '删除',
icon: 'ant-design:delete-outlined',
auth: ['area_del'],
color: 'error',
popConfirm: {
title: '是否确认删除',
confirm: handleDel.bind(null, record)
}
}
]"
/>
</template>
</BasicTable>
<AreaModal @register="registerModal" @success="handleRefreshTable" />
</div>
</template>
<script lang="ts" setup>
/**
* 提供模板规范代码参考,请尽量保证编写代码风格跟模板规范代码一致
* 采用vben-动态表格表单封装组件编写,采用 setup 写法
* Copyright © 2020-2022 <a href="http://www.entfrm.com/">entfrm</a> All rights reserved.
* author entfrm开发团队-王翔
*/
import { BasicTable, useTable, TableAction } from '/@/components/Table'
import { useModal } from '/@/components/Modal'
import AreaModal from './AreaModal.vue'
import { columns, searchFormSchema } from './area.data'
import { delArea, listArea } from '/@/api/platform/system/controller/area'
import { useMessage } from '/@/hooks/web/useMessage'
import { listToTree } from '/@/utils/helper/treeHelper'
/** 通用变量统一声明区域 */
const { createMessage } = useMessage()
const [registerModal, { openModal }] = useModal()
const [registerTable, { reload, expandAll, collapseAll }] = useTable({
title: '区域列表',
api: listArea,
rowKey: 'areaId',
columns,
formConfig: {
labelWidth: 120,
schemas: searchFormSchema,
autoSubmitOnEnter: true,
fieldMapToTime: [['dateRange', ['beginTime', 'endTime'], 'YYYY-MM-DD']]
},
isTreeTable: true,
pagination: false,
striped: false,
useSearchForm: true,
showTableSetting: true,
bordered: true,
showIndexColumn: false,
searchInfo: {
parentId: 0
},
canResize: false,
actionColumn: {
width: 250,
title: '操作',
dataIndex: 'action',
slots: { customRender: 'action' },
fixed: false
},
afterFetch: result => listToTree(result, { id: 'areaId' })
})
/** 新增按钮操作,行内新增与工具栏局域新增通用 */
function handleAdd(record?: Recordable) {
openModal(true, { _tag: 'add', record })
}
/** 编辑按钮操作,行内编辑 */
function handleEdit(record: Recordable) {
openModal(true, { _tag: 'edit', record })
}
/** 删除按钮操作,行内删除 */
async function handleDel(record: Recordable) {
await delArea(record.areaId)
createMessage.success('删除成功!')
handleRefreshTable()
}
/** 处理表格刷新 */
function handleRefreshTable() {
reload()
}
</script>

18
yarn.lock

@ -7726,10 +7726,10 @@ sort-keys@^2.0.0:
dependencies: dependencies:
is-plain-obj "^1.0.0" is-plain-obj "^1.0.0"
sortablejs@1.14.0: sortablejs@^1.15.0:
version "1.14.0" version "1.15.0"
resolved "https://registry.npmmirror.com/sortablejs/-/sortablejs-1.14.0.tgz#6d2e17ccbdb25f464734df621d4f35d4ab35b3d8" resolved "https://registry.yarnpkg.com/sortablejs/-/sortablejs-1.15.0.tgz#53230b8aa3502bb77a29e2005808ffdb4a5f7e2a"
integrity sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w== integrity sha512-bv9qgVMjUMf89wAvM6AxVvS/4MX3sPeN0+agqShejLU5z5GX4C75ow1O2e5k4L6XItUyAK3gH6AxSbXrOM5e8w==
source-map-js@^0.6.2: source-map-js@^0.6.2:
version "0.6.2" version "0.6.2"
@ -8987,6 +8987,11 @@ vue@3.2.12:
"@vue/runtime-dom" "3.2.12" "@vue/runtime-dom" "3.2.12"
"@vue/shared" "3.2.12" "@vue/shared" "3.2.12"
vxe-table@^4.2.8:
version "4.2.8"
resolved "https://registry.yarnpkg.com/vxe-table/-/vxe-table-4.2.8.tgz#4cc591d2abee43a4c4cef7c4a5a3dbaaa6a8439c"
integrity sha512-t0IwE0XHZ+FKrE0x3daqm48OJprXEzDFfZWaqX64W/32n4LcCjywL9cMtL0WwplL3IHpDoe9JfKOp9d+jYwrUA==
w3c-hr-time@^1.0.2: w3c-hr-time@^1.0.2:
version "1.0.2" version "1.0.2"
resolved "https://registry.npmmirror.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" resolved "https://registry.npmmirror.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd"
@ -9327,6 +9332,11 @@ ws@^7.4.6:
resolved "https://registry.npmmirror.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67" resolved "https://registry.npmmirror.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67"
integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A== integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==
xe-utils@^3.5.4:
version "3.5.4"
resolved "https://registry.yarnpkg.com/xe-utils/-/xe-utils-3.5.4.tgz#d4335633fede280c68c1c0c9a4c8f3a533cfd831"
integrity sha512-oH7VOgvHv34pn198dhKPVKnuEHV22Q06YpCTVnAS3JuutylmZj/rtJGvn0BxxWQ37w2LgCknoebLA4uIGXwFtw==
xlsx@0.17.2: xlsx@0.17.2:
version "0.17.2" version "0.17.2"
resolved "https://registry.npmmirror.com/xlsx/-/xlsx-0.17.2.tgz#032bcca02ca01b5ebf7da93dcb035891f2c092af" resolved "https://registry.npmmirror.com/xlsx/-/xlsx-0.17.2.tgz#032bcca02ca01b5ebf7da93dcb035891f2c092af"

Loading…
Cancel
Save