diff --git a/web/src/views/system/dictionary/api.ts b/web/src/views/system/dictionary/api.ts
new file mode 100644
index 0000000..cf1cebd
--- /dev/null
+++ b/web/src/views/system/dictionary/api.ts
@@ -0,0 +1,41 @@
+import { request } from '/@/utils/service';
+import { PageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud';
+
+export const apiPrefix = '/api/system/dictionary/';
+export function GetList(query: PageQuery) {
+ return request({
+ url: apiPrefix,
+ method: 'get',
+ data: query,
+ });
+}
+export function GetObj(id: InfoReq) {
+ return request({
+ url: apiPrefix + id,
+ method: 'get',
+ });
+}
+
+export function AddObj(obj: AddReq) {
+ return request({
+ url: apiPrefix,
+ method: 'post',
+ data: obj,
+ });
+}
+
+export function UpdateObj(obj: EditReq) {
+ return request({
+ url: apiPrefix + obj.id + '/',
+ method: 'put',
+ data: obj,
+ });
+}
+
+export function DelObj(id: DelReq) {
+ return request({
+ url: apiPrefix + id + '/',
+ method: 'delete',
+ data: { id },
+ });
+}
diff --git a/web/src/views/system/dictionary/crud.tsx b/web/src/views/system/dictionary/crud.tsx
new file mode 100644
index 0000000..687b003
--- /dev/null
+++ b/web/src/views/system/dictionary/crud.tsx
@@ -0,0 +1,178 @@
+import * as api from './api';
+import { dict, PageQuery, AddReq, DelReq, EditReq, CrudExpose, CrudOptions } from '@fast-crud/fast-crud';
+import { dictionary } from '/@/utils/dictionary';
+
+interface CreateCrudOptionsTypes {
+ crudOptions: CrudOptions;
+}
+
+export const createCrudOptions = function ({ crudExpose, subDictRef }: { crudExpose: CrudExpose; subDictRef: any }): CreateCrudOptionsTypes {
+ const pageRequest = async (query: PageQuery) => {
+ return await api.GetList(query);
+ };
+ const editRequest = async ({ form, row }: EditReq) => {
+ form.id = row.id;
+ return await api.UpdateObj(form);
+ };
+ const delRequest = async ({ row }: DelReq) => {
+ return await api.DelObj(row.id);
+ };
+ const addRequest = async ({ form }: AddReq) => {
+ return await api.AddObj(form);
+ };
+ return {
+ crudOptions: {
+ request: {
+ pageRequest,
+ addRequest,
+ editRequest,
+ delRequest,
+ },
+ rowHandle: {
+ width: 360,
+ buttons: {
+ custom: {
+ text: '字典配置',
+ type: 'success',
+ tooltip: {
+ placement: 'top',
+ content: '字典配置',
+ },
+ //@ts-ignore
+ click: (opts: any) => {
+ subDictRef.value.drawer = true;
+ },
+ },
+ },
+ },
+ columns: {
+ _index: {
+ title: '序号',
+ form: { show: false },
+ column: {
+ //type: 'index',
+ align: 'center',
+ width: '70px',
+ columnSetDisabled: true, //禁止在列设置中选择
+ formatter: (context) => {
+ //计算序号,你可以自定义计算规则,此处为翻页累加
+ let index = context.index ?? 1;
+ let pagination = crudExpose.crudBinding.value.pagination;
+ return ((pagination.currentPage ?? 1) - 1) * pagination.pageSize + index + 1;
+ },
+ },
+ },
+ search: {
+ title: '关键词',
+ column: {
+ show: false,
+ },
+ search: {
+ show: true,
+ component: {
+ props: {
+ clearable: true,
+ },
+ placeholder: '请输入关键词',
+ },
+ },
+ form: {
+ show: false,
+ component: {
+ props: {
+ clearable: true,
+ },
+ },
+ },
+ },
+ label: {
+ title: '字典名称',
+ search: {
+ show: true,
+ component: {
+ props: {
+ clearable: true,
+ },
+ },
+ },
+ type: 'input',
+ form: {
+ rules: [
+ // 表单校验规则
+ { required: true, message: '字典名称必填项' },
+ ],
+ component: {
+ props: {
+ clearable: true,
+ },
+ placeholder: '请输入字典名称',
+ },
+ },
+ },
+ value: {
+ title: '字典编号',
+ search: {
+ disabled: true,
+ component: {
+ props: {
+ clearable: true,
+ },
+ },
+ },
+ type: 'input',
+ form: {
+ rules: [
+ // 表单校验规则
+ { required: true, message: '字典编号必填项' },
+ ],
+ component: {
+ props: {
+ clearable: true,
+ },
+ placeholder: '请输入字典编号',
+ },
+ helper: {
+ render(h) {
+ return ;
+ },
+ },
+ },
+ },
+ status: {
+ title: '状态',
+ width: 90,
+ search: {
+ show: true,
+ },
+ type: 'dict-radio',
+ dict: dict({
+ data: dictionary('button_status_bool'),
+ }),
+ component: {
+ props: {
+ options: [],
+ },
+ },
+ form: {
+ rules: [
+ // 表单校验规则
+ { required: true, message: '状态必填项' },
+ ],
+ value: true,
+ component: {
+ placeholder: '请选择状态',
+ },
+ },
+ },
+ sort: {
+ title: '排序',
+ width: 90,
+ type: 'number',
+ form: {
+ value: 1,
+ },
+ },
+ },
+ },
+ };
+};
diff --git a/web/src/views/system/dictionary/index.vue b/web/src/views/system/dictionary/index.vue
new file mode 100644
index 0000000..dd0af7a
--- /dev/null
+++ b/web/src/views/system/dictionary/index.vue
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
diff --git a/web/src/views/system/dictionary/subDict/api.ts b/web/src/views/system/dictionary/subDict/api.ts
new file mode 100644
index 0000000..cf1cebd
--- /dev/null
+++ b/web/src/views/system/dictionary/subDict/api.ts
@@ -0,0 +1,41 @@
+import { request } from '/@/utils/service';
+import { PageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud';
+
+export const apiPrefix = '/api/system/dictionary/';
+export function GetList(query: PageQuery) {
+ return request({
+ url: apiPrefix,
+ method: 'get',
+ data: query,
+ });
+}
+export function GetObj(id: InfoReq) {
+ return request({
+ url: apiPrefix + id,
+ method: 'get',
+ });
+}
+
+export function AddObj(obj: AddReq) {
+ return request({
+ url: apiPrefix,
+ method: 'post',
+ data: obj,
+ });
+}
+
+export function UpdateObj(obj: EditReq) {
+ return request({
+ url: apiPrefix + obj.id + '/',
+ method: 'put',
+ data: obj,
+ });
+}
+
+export function DelObj(id: DelReq) {
+ return request({
+ url: apiPrefix + id + '/',
+ method: 'delete',
+ data: { id },
+ });
+}
diff --git a/web/src/views/system/dictionary/subDict/crud.tsx b/web/src/views/system/dictionary/subDict/crud.tsx
new file mode 100644
index 0000000..13c2506
--- /dev/null
+++ b/web/src/views/system/dictionary/subDict/crud.tsx
@@ -0,0 +1,276 @@
+import * as api from './api';
+import { dict, PageQuery, AddReq, DelReq, EditReq, CrudExpose, CrudOptions } from '@fast-crud/fast-crud';
+import { request } from '/@/utils/service';
+import { dictionary } from '/@/utils/dictionary';
+interface CreateCrudOptionsTypes {
+ crudOptions: CrudOptions;
+}
+
+export const createCrudOptions = function ({ crudExpose }: { crudExpose: CrudExpose }): CreateCrudOptionsTypes {
+ const pageRequest = async (query: PageQuery) => {
+ return await api.GetList(query);
+ };
+ const editRequest = async ({ form, row }: EditReq) => {
+ form.id = row.id;
+ return await api.UpdateObj(form);
+ };
+ const delRequest = async ({ row }: DelReq) => {
+ return await api.DelObj(row.id);
+ };
+ const addRequest = async ({ form }: AddReq) => {
+ return await api.AddObj(form);
+ };
+ return {
+ crudOptions: {
+ request: {
+ pageRequest,
+ addRequest,
+ editRequest,
+ delRequest,
+ },
+ columns: {
+ _index: {
+ title: '序号',
+ form: { show: false },
+ column: {
+ //type: 'index',
+ align: 'center',
+ width: '70px',
+ columnSetDisabled: true, //禁止在列设置中选择
+ formatter: (context) => {
+ //计算序号,你可以自定义计算规则,此处为翻页累加
+ let index = context.index ?? 1;
+ let pagination = crudExpose.crudBinding.value.pagination;
+ return ((pagination.currentPage ?? 1) - 1) * pagination.pageSize + index + 1;
+ },
+ },
+ },
+ label: {
+ title: '名称',
+ search: {
+ disabled: false,
+ component: {
+ props: {
+ clearable: true,
+ },
+ },
+ },
+ type: 'input',
+ form: {
+ rules: [
+ // 表单校验规则
+ { required: true, message: '名称必填项' },
+ ],
+ component: {
+ props: {
+ clearable: true,
+ },
+ placeholder: '请输入名称',
+ },
+ },
+ },
+ type: {
+ title: '数据值类型',
+ type: 'dict-select',
+ search: {
+ disabled: true,
+ component: {
+ props: {
+ clearable: true,
+ },
+ },
+ },
+ show: false,
+ dict: dict({
+ data: [
+ { label: 'text', value: 0 },
+ { label: 'number', value: 1 },
+ { label: 'date', value: 2 },
+ { label: 'datetime', value: 3 },
+ { label: 'time', value: 4 },
+ { label: 'file', value: 5 },
+ { label: 'boolean', value: 6 },
+ { label: 'images', value: 7 },
+ ],
+ }),
+ form: {
+ rules: [
+ // 表单校验规则
+ { required: true, message: '数据值类型必填项' },
+ ],
+ value: 0,
+ component: {
+ props: {
+ clearable: true,
+ },
+ placeholder: '请选择数据值类型',
+ },
+ /* valueChange(key, value, form, { getColumn, mode, component, immediate, getComponent }) {
+ const template = vm.getEditFormTemplate('value')
+ // 选择框重新选择后,情况value值
+ if (!immediate) {
+ form.value = undefined
+ }
+ if (value === 0) {
+ template.component.name = 'el-input'
+ } else if (value === 1) {
+ template.component.name = 'el-input-number'
+ } else if (value === 2) {
+ template.component.name = 'el-date-picker'
+ template.component.props = {
+ type: 'date',
+ valueFormat: 'yyyy-MM-dd'
+ }
+ } else if (value === 3) {
+ template.component.name = 'el-date-picker'
+ template.component.props = {
+ type: 'datetime',
+ valueFormat: 'yyyy-MM-dd HH:mm:ss'
+ }
+ } else if (value === 4) {
+ template.component.name = 'el-time-picker'
+ template.component.props = {
+ pickerOptions: {
+ arrowControl: true
+ },
+ valueFormat: 'HH:mm:ss'
+ }
+ } else if (value === 5) {
+ template.component.name = 'd2p-file-uploader'
+ template.component.props = { elProps: { listType: 'text' } }
+ } else if (value === 6) {
+ template.component.name = 'dict-switch'
+ template.component.value = true
+ template.component.props = {
+ dict: {
+ data: [
+ { label: '是', value: 'true' },
+ { label: '否', value: 'false' }
+ ]
+ }
+ }
+ } else if (value === 7) {
+ template.component.name = 'd2p-cropper-uploader'
+ template.component.props = { accept: '.png,.jpeg,.jpg,.ico,.bmp,.gif', cropper: { viewMode: 1 } }
+ }
+ }, */
+ },
+ },
+ value: {
+ title: '数据值',
+ search: {
+ disabled: true,
+ component: {
+ props: {
+ clearable: true,
+ },
+ },
+ },
+ view: {
+ component: { props: { height: 100, width: 100 } },
+ },
+ /* // 提交时,处理数据
+ valueResolve(row: any, col: any) {
+ const value = row[col.key]
+ const type = row.type
+ if (type === 5 || type === 7) {
+ if (value != null) {
+ if (value.length >= 0) {
+ if (value instanceof Array) {
+ row[col.key] = value.toString()
+ } else {
+ row[col.key] = value
+ }
+ } else {
+ row[col.key] = null
+ }
+ }
+ } else {
+ row[col.key] = value
+ }
+ },
+ // 接收时,处理数据
+ valueBuilder(row: any, col: any) {
+ const value = row[col.key]
+ const type = row.type
+ if (type === 5 || type === 7) {
+ if (value != null && value) {
+ row[col.key] = value.split(',')
+ }
+ } else {
+ row[col.key] = value
+ }
+ }, */
+ type: 'input',
+ form: {
+ rules: [
+ // 表单校验规则
+ { required: true, message: '数据值必填项' },
+ ],
+ component: {
+ props: {
+ clearable: true,
+ },
+ placeholder: '请输入数据值',
+ },
+ },
+ },
+ status: {
+ title: '状态',
+ width: 80,
+ search: {
+ disabled: false,
+ },
+ type: 'dict-radio',
+ dict: dict({
+ data: dictionary('button_status_bool'),
+ }),
+ form: {
+ value: true,
+ rules: [
+ // 表单校验规则
+ { required: true, message: '状态必填项' },
+ ],
+ },
+ },
+ sort: {
+ title: '排序',
+ width: 70,
+ type: 'number',
+ form: {
+ value: 1,
+ component: {},
+ rules: [
+ // 表单校验规则
+ { required: true, message: '排序必填项' },
+ ],
+ },
+ },
+ color: {
+ title: '标签颜色',
+ width: 90,
+ search: {
+ disabled: true,
+ },
+ type: 'dict-select',
+ dict: dict({
+ data: [
+ { label: 'success', value: 'success', color: 'success' },
+ { label: 'primary', value: 'primary', color: 'primary' },
+ { label: 'info', value: 'info', color: 'info' },
+ { label: 'danger', value: 'danger', color: 'danger' },
+ { label: 'warning', value: 'warning', color: 'warning' },
+ ],
+ }),
+ form: {
+ component: {
+ props: {
+ clearable: true,
+ },
+ },
+ },
+ },
+ },
+ },
+ };
+};
diff --git a/web/src/views/system/dictionary/subDict/index.vue b/web/src/views/system/dictionary/subDict/index.vue
new file mode 100644
index 0000000..ba09c46
--- /dev/null
+++ b/web/src/views/system/dictionary/subDict/index.vue
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+