diff --git a/src/api/base/store/sysStoreApi.js b/src/api/base/store/sysStoreApi.js
new file mode 100644
index 0000000..90e25ab
--- /dev/null
+++ b/src/api/base/store/sysStoreApi.js
@@ -0,0 +1,28 @@
+import { baseRequest } from '@/utils/request'
+
+const request = (url, ...arg) => baseRequest(`/base/store/` + url, ...arg)
+
+/**
+ * 仓库Api接口管理器
+ *
+ * @author Luck
+ * @date 2024/07/25 13:42
+ **/
+export default {
+ // 获取仓库分页
+ page(data) {
+ return request('page', data, 'get')
+ },
+ // 提交仓库表单 edit为true时为编辑,默认为新增
+ sysStoreSubmitForm(data, edit = false) {
+ return request(edit ? 'edit' : 'add', data)
+ },
+ // 删除仓库
+ sysStoreDelete(data) {
+ return request('delete', data)
+ },
+ // 获取仓库详情
+ sysStoreDetail(data) {
+ return request('detail', data, 'get')
+ }
+}
diff --git a/src/api/base/unit/unitApi.js b/src/api/base/unit/unitApi.js
new file mode 100644
index 0000000..9275952
--- /dev/null
+++ b/src/api/base/unit/unitApi.js
@@ -0,0 +1,28 @@
+import { baseRequest } from '@/utils/request'
+
+const request = (url, ...arg) => baseRequest(`/base/sysunit/` + url, ...arg)
+
+/**
+ * 单位Api接口管理器
+ *
+ * @author Luck
+ * @date 2024/07/23 11:36
+ **/
+export default {
+ // 获取单位分页
+ sysUnitPage(data) {
+ return request('page', data, 'get')
+ },
+ // 提交单位表单 edit为true时为编辑,默认为新增
+ sysUnitSubmitForm(data, edit = false) {
+ return request(edit ? 'edit' : 'add', data)
+ },
+ // 删除单位
+ sysUnitDelete(data) {
+ return request('delete', data)
+ },
+ // 获取单位详情
+ sysUnitDetail(data) {
+ return request('detail', data, 'get')
+ }
+}
diff --git a/src/api/base/unit/unitGroupsApi.js b/src/api/base/unit/unitGroupsApi.js
new file mode 100644
index 0000000..753c0ef
--- /dev/null
+++ b/src/api/base/unit/unitGroupsApi.js
@@ -0,0 +1,32 @@
+import { baseRequest } from '@/utils/request'
+
+const request = (url, ...arg) => baseRequest(`/base/sysunitgroup/` + url, ...arg)
+
+/**
+ * 单位组Api接口管理器
+ *
+ * @author Luck
+ * @date 2024/07/26 10:46
+ **/
+export default {
+ // 获取单位组分页
+ sysUnitGroupPage(data) {
+ return request('page', data, 'get')
+ },
+ // 提交单位组表单 edit为true时为编辑,默认为新增
+ sysUnitGroupSubmitForm(data, edit = false) {
+ return request(edit ? 'edit' : 'add', data)
+ },
+ // 删除单位组
+ sysUnitGroupDelete(data) {
+ return request('delete', data)
+ },
+ // 获取单位组详情
+ sysUnitGroupDetail(data) {
+ return request('detail', data, 'get')
+ },
+ // 单位组列表
+ sysUnitGroupList(data) {
+ return request('list', data, 'get')
+ },
+}
diff --git a/src/components/CardTitle/index.vue b/src/components/CardTitle/index.vue
new file mode 100644
index 0000000..8902be5
--- /dev/null
+++ b/src/components/CardTitle/index.vue
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
diff --git a/src/components/FounderForm/index.vue b/src/components/FounderForm/index.vue
new file mode 100644
index 0000000..c6338c3
--- /dev/null
+++ b/src/components/FounderForm/index.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/src/hook/useFormHandler.js b/src/hook/useFormHandler.js
new file mode 100644
index 0000000..9d3511f
--- /dev/null
+++ b/src/hook/useFormHandler.js
@@ -0,0 +1,75 @@
+import { useRoute, useRouter } from 'vue-router'
+import { cloneDeep } from 'lodash-es'
+import useTabs from '@/utils/useTabs'
+
+export default function useFormHandler(formItems, api) {
+ const state = reactive({
+ PAGE_TYPE: ''
+ })
+
+ let formData = reactive({})
+ const submitLoading = ref(false)
+ const formRefs = ref([])
+ const route = useRoute()
+ const router = useRouter()
+
+ const initializeFormData = (formItems, formData) => {
+ formItems.forEach((item) => {
+ formData[item.name] = item.defaultValue || ''
+ })
+ }
+
+ const onSubmit = async (params) => {
+ Promise.all(formRefs.value.map((form) => form.validate()))
+ .then(() => {
+ submitLoading.value = true
+ let formDataParam = params.isDeep ? cloneDeep(params) : cloneDeep(formData)
+
+ if (route.query.id) {
+ formDataParam = { ...formDataParam, id: route.query.id }
+ }
+ api
+ .submitForm(formDataParam, route.query.id)
+ .then(() => {
+ router.go(-1)
+ useTabs.close()
+ })
+ .finally(() => {
+ submitLoading.value = false
+ })
+ })
+ .catch((error) => {
+ console.error('Validation error:', error)
+ })
+ }
+
+ const handleBack = () => {
+ router.replace('/basicData/publicAccount')
+ useTabs.close()
+ }
+
+ const fetchData = async (pageType) => {
+ initializeFormData(formItems, formData)
+ if (pageType && pageType !== 'ADD') {
+ try {
+ const res = await api.getDetail({ id: route.query.id })
+ for (let key in formData) {
+ if (res[key] !== undefined) {
+ formData[key] = res[key]
+ }
+ }
+ } catch (error) {
+ console.error('API request failed:', error)
+ }
+ }
+ }
+
+ return {
+ formData,
+ submitLoading,
+ formRefs,
+ onSubmit,
+ handleBack,
+ fetchData
+ }
+}
diff --git a/src/hook/useNavigation.js b/src/hook/useNavigation.js
new file mode 100644
index 0000000..994d522
--- /dev/null
+++ b/src/hook/useNavigation.js
@@ -0,0 +1,25 @@
+import { useRouter } from 'vue-router'
+
+/**
+ * 封装路由跳转的 Hook
+ */
+export function useNavigation() {
+ // 创建 router 实例
+ const router = useRouter()
+
+ /**
+ * 跳转到指定的路由
+ * @param {string|object} to - 目标路由的路径或路由对象
+ * @param {object} params - 跳转所需的参数
+ */
+ const navigateTo = (to, params) => {
+ router.push({
+ path: to,
+ query: params
+ })
+ }
+
+ return {
+ navigateTo
+ }
+}
diff --git a/src/hook/useTableManagement.js b/src/hook/useTableManagement.js
new file mode 100644
index 0000000..b628b21
--- /dev/null
+++ b/src/hook/useTableManagement.js
@@ -0,0 +1,112 @@
+import { cloneDeep } from 'lodash-es'
+import { hasPerm } from '@/utils/permission'
+import { useRouter } from 'vue-router'
+import useTabs from '@/utils/useTabs'
+
+/**
+ * 列表页面表格信息 hook 封装(数据操作)
+ * @param apiModule 调用接口
+ * @param tableColumns 表格头部信息
+ * @returns {{searchFormRef: Ref>, toolConfig: {columnSetting: boolean, striped: boolean, refresh: boolean, height: boolean}, searchFormState: Ref>, tableRef: Ref>, selectedRowKeys: Ref>, columns: Ref>, options: {rowSelection: {onChange: options.rowSelection.onChange}, alert: {show: boolean, clear: options.alert.clear}}, reset: reset, loadData: (function(*): *), deleteBatchRecords: deleteBatchRecords, deleteRecord: deleteRecord}}
+ */
+export function useTableManagement(apiModule = {}, tableColumns, hasPermData) {
+ const searchFormState = ref({})
+ const searchFormRef = ref({})
+ const tableRef = ref(null)
+ const selectedRowKeys = ref([])
+ const router = useRouter()
+
+ // 动态列配置
+ const columns = ref(tableColumns)
+
+ const toolConfig = { refresh: true, height: true, columnSetting: true, striped: false }
+
+ // 根据权限添加操作列
+ if (hasPerm(hasPermData)) {
+ // 判断columns 是否有操作
+ const columnsFilter = columns.value.filter((item) => item.dataIndex === 'action')
+ if (columnsFilter.length === 0)
+ columns.value.push({
+ title: '操作',
+ dataIndex: 'action',
+ align: 'center',
+ width: 200,
+ fixed: 'right',
+ max_width: 100
+ })
+ }
+
+ // 加载数据
+ const loadData = (parameter) => {
+ const searchFormParam = cloneDeep(searchFormState.value)
+ return apiModule.page(Object.assign(parameter, searchFormParam)).then((data) => {
+ return data
+ })
+ }
+
+ // 重置
+ const reset = () => {
+ if (tableRef.value) {
+ tableRef.value.resetFields()
+ tableRef.value.refresh(true)
+ }
+ }
+
+ // 删除
+ const deleteRecord = (record) => {
+ let params = [{ id: record.id }]
+ apiModule.delete(params).then(() => {
+ if (tableRef.value) {
+ tableRef.value.refresh(true)
+ }
+ })
+ }
+
+ // 批量删除
+ const deleteBatchRecords = (params) => {
+ apiModule.delete(params).then(() => {
+ if (tableRef.value) {
+ tableRef.value.clearRefreshSelected()
+ }
+ })
+ }
+
+ // 选择配置
+ const options = {
+ alert: {
+ show: true,
+ clear: () => {
+ selectedRowKeys.value = []
+ }
+ },
+ rowSelection: {
+ onChange: (selectedRowKey, selectedRows) => {
+ selectedRowKeys.value = selectedRowKey
+ }
+ }
+ }
+
+ // 页面跳转
+ const navigateTo = (to, params) => {
+ router.push({
+ path: to,
+ query: params
+ })
+ }
+
+ // 返回Hook的值
+ return {
+ searchFormState,
+ searchFormRef,
+ tableRef,
+ selectedRowKeys,
+ columns,
+ loadData,
+ reset,
+ deleteRecord,
+ deleteBatchRecords,
+ options,
+ toolConfig,
+ navigateTo
+ }
+}
diff --git a/src/views/basicData/brand/detail/index.vue b/src/views/basicData/brand/detail/index.vue
new file mode 100644
index 0000000..f0327f2
--- /dev/null
+++ b/src/views/basicData/brand/detail/index.vue
@@ -0,0 +1,168 @@
+
+
+
+ 保存
+
+
+
+
+
+
+
+
+ 新增域名
+
+
+
+
+
+
+
+
+ 删除
+
+
+
+
+
+
+
diff --git a/src/views/basicData/brand/index.vue b/src/views/basicData/brand/index.vue
new file mode 100644
index 0000000..382a0dd
--- /dev/null
+++ b/src/views/basicData/brand/index.vue
@@ -0,0 +1,165 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 查询
+ 重置
+
+
+
+
+
+
+
+
+
+
+
+ 新增
+
+
+
+
+
+
+
+
+
+
+ 查看
+
+ 编辑
+
+
+ 删除
+
+
+
+
+
+
+
+
+
diff --git a/src/views/basicData/client/detail/index.vue b/src/views/basicData/client/detail/index.vue
new file mode 100644
index 0000000..a9be07b
--- /dev/null
+++ b/src/views/basicData/client/detail/index.vue
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/src/views/basicData/client/index.vue b/src/views/basicData/client/index.vue
new file mode 100644
index 0000000..138dc0b
--- /dev/null
+++ b/src/views/basicData/client/index.vue
@@ -0,0 +1,277 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 查询
+ 重置
+
+
+
+
+
+
+
+
+
+
分类
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 新增
+
+
+
+
+
+
+
+
+
+ {{ $TOOL.dictTypeData('OFFICIAL_ACCOUNT_TYPE', record.type) }}
+
+
+
+ 查看
+
+ 编辑
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/basicData/employee/detail/index.vue b/src/views/basicData/employee/detail/index.vue
new file mode 100644
index 0000000..a9be07b
--- /dev/null
+++ b/src/views/basicData/employee/detail/index.vue
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/src/views/basicData/employee/index.vue b/src/views/basicData/employee/index.vue
new file mode 100644
index 0000000..d3044ac
--- /dev/null
+++ b/src/views/basicData/employee/index.vue
@@ -0,0 +1,187 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 查询
+ 重置
+
+ {{ advanced ? '收起' : '展开' }}
+
+
+
+
+
+
+
+
+
+
+ 新增
+
+
+
+
+
+
+ {{ $TOOL.dictTypeData('GENDER', record.gender) }}
+
+
+ {{ $TOOL.dictTypeData('COMMON_STATUS', record.enabledState) }}
+
+
+
+ 编辑
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/basicData/materiel/detail/index.vue b/src/views/basicData/materiel/detail/index.vue
new file mode 100644
index 0000000..a9be07b
--- /dev/null
+++ b/src/views/basicData/materiel/detail/index.vue
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/src/views/basicData/materiel/index.vue b/src/views/basicData/materiel/index.vue
new file mode 100644
index 0000000..3d1f5b6
--- /dev/null
+++ b/src/views/basicData/materiel/index.vue
@@ -0,0 +1,341 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 查询
+ 重置
+
+ {{ advanced ? '收起' : '展开' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 新增
+
+
+
+
+
+
+ {{ $TOOL.dictTypeData('COMMON_STATUS', record.enabledState) }}
+
+
+ {{ $TOOL.dictTypeData('YES_NO', record.batchManage) }}
+
+
+ {{ $TOOL.dictTypeData('COMMON_STATUS', record.promoteEnabledState) }}
+
+
+
+ 编辑
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/basicData/publicAccount/detail/index.vue b/src/views/basicData/publicAccount/detail/index.vue
new file mode 100644
index 0000000..007da15
--- /dev/null
+++ b/src/views/basicData/publicAccount/detail/index.vue
@@ -0,0 +1,152 @@
+
+
+
+ 保存
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/basicData/publicAccount/index.vue b/src/views/basicData/publicAccount/index.vue
new file mode 100644
index 0000000..0459fe1
--- /dev/null
+++ b/src/views/basicData/publicAccount/index.vue
@@ -0,0 +1,171 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 查询
+ 重置
+
+
+
+
+
+
+
+
+
+
+
+ 新增
+
+
+
+
+
+
+
+
+
+ {{ $TOOL.dictTypeData('OFFICIAL_ACCOUNT_TYPE', record.type) }}
+
+
+
+ 查看
+
+ 编辑
+
+
+ 删除
+
+
+
+
+
+
+
+
+
diff --git a/src/views/basicData/stash/detail/index.vue b/src/views/basicData/stash/detail/index.vue
new file mode 100644
index 0000000..ebd2d0d
--- /dev/null
+++ b/src/views/basicData/stash/detail/index.vue
@@ -0,0 +1,200 @@
+
+
+
+ 保存
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/basicData/stash/index.vue b/src/views/basicData/stash/index.vue
new file mode 100644
index 0000000..801bc9f
--- /dev/null
+++ b/src/views/basicData/stash/index.vue
@@ -0,0 +1,168 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 查询
+ 重置
+
+
+
+
+
+
+
+
+
+
+
+ 新增
+
+
+
+
+
+
+
+
+
+
+ 查看
+
+ 编辑
+
+
+ 删除
+
+
+
+
+
+
+
+
+
diff --git a/src/views/basicData/unit/columns/unitColumns.js b/src/views/basicData/unit/columns/unitColumns.js
new file mode 100644
index 0000000..6c62a3c
--- /dev/null
+++ b/src/views/basicData/unit/columns/unitColumns.js
@@ -0,0 +1,54 @@
+export const unitColumns = [
+ {
+ title: '编码',
+ dataIndex: 'number',
+ width: 150,
+ resizable: true,
+ align: 'center'
+ },
+ {
+ title: '名称',
+ dataIndex: 'name',
+ width: 150,
+ resizable: true,
+ align: 'center'
+ },
+ {
+ title: '可用状态',
+ dataIndex: 'enabledState',
+ width: 150,
+ resizable: true,
+ align: 'center'
+ },
+ {
+ title: '换算率',
+ dataIndex: 'rate',
+ width: 200,
+ resizable: true,
+ align: 'center'
+ },
+ {
+ title: '是否基本单位',
+ dataIndex: 'isBase',
+ width: 80,
+ resizable: true,
+ align: 'center'
+ }
+]
+
+export const unitGroupColumns = [
+ {
+ title: '名称',
+ dataIndex: 'name',
+ width: 180,
+ resizable: true,
+ align: 'center'
+ },
+ {
+ title: '状态',
+ dataIndex: 'enabledState',
+ width: 80,
+ resizable: true,
+ align: 'center'
+ }
+]
diff --git a/src/views/basicData/unit/detail/UnitGroupForm.vue b/src/views/basicData/unit/detail/UnitGroupForm.vue
new file mode 100644
index 0000000..3579cb5
--- /dev/null
+++ b/src/views/basicData/unit/detail/UnitGroupForm.vue
@@ -0,0 +1,91 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关闭
+ 保存
+
+
+
+
+