From 1262776376bbfb9bb6fc86a1d93ed9b1b6b41726 Mon Sep 17 00:00:00 2001 From: wang_yp <357754663@qq.com> Date: Fri, 21 Mar 2025 17:01:20 +0800 Subject: [PATCH] fix(staff) --- src/components/layout/layout.tsx | 15 ++++- src/components/layout/layout_config.tsx | 1 + src/pages/sku/cat/config.tsx | 40 +++++++++++++ src/pages/sku/cat/index.tsx | 75 +++++++++++++++++++++-- src/pages/sku/sku/config.tsx | 58 ++++++++++++++++++ src/pages/sku/sku/index.tsx | 76 ++++++++++++++++++++++++ src/pages/sku/spec/config.tsx | 40 +++++++++++++ src/pages/sku/spec/index.tsx | 75 +++++++++++++++++++++-- src/pages/sku/tag/config.tsx | 42 +++++++++++++ src/pages/sku/tag/index.tsx | 76 ++++++++++++++++++++++++ src/router/routers/sku_router.tsx | 12 +++- src/service/config.ts | 19 +++++- src/static/favicon.png | Bin 0 -> 20348 bytes src/store/index.ts | 10 +++- src/store/sku.ts | 13 ++++ src/store/skuCat.ts | 13 ++++ src/store/skuSpec.ts | 13 ++++ src/store/tag.ts | 13 ++++ 18 files changed, 575 insertions(+), 16 deletions(-) create mode 100644 src/pages/sku/cat/config.tsx create mode 100644 src/pages/sku/sku/config.tsx create mode 100644 src/pages/sku/sku/index.tsx create mode 100644 src/pages/sku/spec/config.tsx create mode 100644 src/pages/sku/tag/config.tsx create mode 100644 src/pages/sku/tag/index.tsx create mode 100644 src/static/favicon.png create mode 100644 src/store/sku.ts create mode 100644 src/store/skuCat.ts create mode 100644 src/store/skuSpec.ts create mode 100644 src/store/tag.ts diff --git a/src/components/layout/layout.tsx b/src/components/layout/layout.tsx index 43cf849..581cb8e 100644 --- a/src/components/layout/layout.tsx +++ b/src/components/layout/layout.tsx @@ -3,12 +3,21 @@ import "./layout.less"; import { inject, observer } from "mobx-react"; import { Store } from "antd/es/form/interface"; import { useEffect, useState } from "react"; -import { Avatar, Breadcrumb, Layout, Menu, MenuProps, theme } from "antd"; +import { + Avatar, + Breadcrumb, + Layout, + Menu, + MenuProps, + theme, + Image, +} from "antd"; import { UserOutlined } from "@ant-design/icons"; import Sider from "antd/es/layout/Sider"; import { items } from "./layout_config"; import { Dropdown } from "antd/lib"; import { Outlet, useNavigate } from "react-router"; +import logo from "@/static/favicon.png"; const LayOut = (props: Store) => { const { usrStore } = props; const [collapsed, setCollapsed] = useState(false); @@ -45,7 +54,9 @@ const LayOut = (props: Store) => { return (
-
logo
+
+ {/* */} +
} /> diff --git a/src/components/layout/layout_config.tsx b/src/components/layout/layout_config.tsx index baf51eb..059437a 100644 --- a/src/components/layout/layout_config.tsx +++ b/src/components/layout/layout_config.tsx @@ -34,6 +34,7 @@ export const items: ItemType[] = [ { key: "/sku/cat", label: `商品分类` }, { key: "/sku/spec", label: `商品规格` }, { key: "/sku/brand", label: `商品品牌` }, + { key: "/sku/tag", label: `标签管理` }, ], }, { diff --git a/src/pages/sku/cat/config.tsx b/src/pages/sku/cat/config.tsx new file mode 100644 index 0000000..75d2da9 --- /dev/null +++ b/src/pages/sku/cat/config.tsx @@ -0,0 +1,40 @@ +import { FormType } from "@/components/form/interface"; +import { UserDataType } from "@/model/userModel"; +import { ColumnsType } from "antd/lib/table"; +export const formConfig = [ + { + type: FormType.input, + label: "商品分类名称", + name: "name", + value: "", + rules: [{ required: true, message: "商品分类名称不能为空!" }], + }, + { + type: FormType.input, + label: "描述", + name: "remark", + value: "", + }, + { + type: FormType.inputNumber, + label: "排序", + name: "sort", + value: "1", + }, +]; + +export const columns: ColumnsType = [ + { + title: "商品分类名称", + dataIndex: "name", + fixed: "left", + }, + { + title: "描述", + dataIndex: "remark", + }, + { + title: "排序", + dataIndex: "sort", + }, +]; diff --git a/src/pages/sku/cat/index.tsx b/src/pages/sku/cat/index.tsx index fc0a703..f1719df 100644 --- a/src/pages/sku/cat/index.tsx +++ b/src/pages/sku/cat/index.tsx @@ -1,9 +1,76 @@ -const Cat = () => { +import React from "react"; +import { Button, Space, Modal, FormInstance } from "antd"; +import { Store } from "antd/lib/form/interface"; +import { inject, observer } from "mobx-react"; +import { useEffect, useState } from "react"; +import { columns, formConfig } from "./config"; +import BTable from "@/components/b_table"; +import SimpleForm from "@/components/form/simple_form"; +const SkuCat = (props: Store) => { + const { skuCatStore } = props; + const [isModalOpen, setIsModalOpen] = useState(false); + const formRef = React.useRef(null); + const [userId, setId] = useState(null); + const [record, setRecord] = useState(null); + + // 获取列表数据 + useEffect(() => { + skuCatStore.getlist(); + }, [skuCatStore]); + return ( -
- cat +
+ + + { + skuCatStore.deleteItem(record); + }} + editCallback={(record) => { + setIsModalOpen(true); + formRef.current?.setFieldsValue(record); + setRecord(record); + setId(record.id); + }} + /> + + formRef.current?.resetFields()} + onOk={() => formRef.current?.submit()} + okText="确定" + cancelText="取消" + onCancel={() => { + setId(null); + setRecord(null); + setIsModalOpen(false); + }} + > + { + skuCatStore.add(formRef.current?.getFieldsValue()) + setIsModalOpen(false); + }} + createCallback={() => { + formRef.current?.setFieldsValue(record); + }} + formDatas={formConfig as any} + > + +
); }; -export default Cat; +export default inject("skuCatStore")(observer(SkuCat)); diff --git a/src/pages/sku/sku/config.tsx b/src/pages/sku/sku/config.tsx new file mode 100644 index 0000000..688a374 --- /dev/null +++ b/src/pages/sku/sku/config.tsx @@ -0,0 +1,58 @@ +import { FormType } from "@/components/form/interface"; +import { UserDataType } from "@/model/userModel"; +import { ColumnsType } from "antd/lib/table"; +export const formConfig = [ + { + type: FormType.input, + label: "商品名称", + name: "tag_name", + value: "", + rules: [{ required: true, message: "标签名称不能为空!" }], + }, + { + type: FormType.input, + label: "标签描述", + name: "tag_desc", + value: "", + rules: [{ required: true, message: "城市编码不能为空" }], + }, + { + type: FormType.input, + label: "标签排序", + name: "tag_sort", + value: "1", + rules: [{ required: true, message: "标签排序不能为空" }], + }, +]; + +export const columns: ColumnsType = [ + { + title: "商品名称", + dataIndex: "sku_name", + fixed: "left", + }, + { + title: "库存", + dataIndex: "sku_stock", + }, + { + title: "商品分类", + dataIndex: "sku_cat_identity", + }, + { + title: "品牌", + dataIndex: "sku_brand_identity", + }, + { + title: "缩略图", + dataIndex: "sku_thumb", + }, + { + title: "商品介绍", + dataIndex: "sku_desc", + }, + { + title: "所属城市", + dataIndex: "city_identity", + }, +]; diff --git a/src/pages/sku/sku/index.tsx b/src/pages/sku/sku/index.tsx new file mode 100644 index 0000000..895cd0a --- /dev/null +++ b/src/pages/sku/sku/index.tsx @@ -0,0 +1,76 @@ +import React from "react"; +import { Button, Space, Modal, FormInstance } from "antd"; +import { Store } from "antd/lib/form/interface"; +import { inject, observer } from "mobx-react"; +import { useEffect, useState } from "react"; +import { columns, formConfig } from "./config"; +import BTable from "@/components/b_table"; +import SimpleForm from "@/components/form/simple_form"; +const Sku = (props: Store) => { + const { skuStore } = props; + const [isModalOpen, setIsModalOpen] = useState(false); + const formRef = React.useRef(null); + const [userId, setId] = useState(null); + const [record, setRecord] = useState(null); + + // 获取列表数据 + useEffect(() => { + skuStore.getlist(); + }, [skuStore]); + + return ( +
+ + + { + skuStore.deleteItem(record); + }} + editCallback={(record) => { + setIsModalOpen(true); + formRef.current?.setFieldsValue(record); + setRecord(record); + setId(record.id); + }} + /> + + formRef.current?.resetFields()} + onOk={() => formRef.current?.submit()} + okText="确定" + cancelText="取消" + onCancel={() => { + setId(null); + setRecord(null); + setIsModalOpen(false); + }} + > + { + skuStore.add(formRef.current?.getFieldsValue()) + setIsModalOpen(false); + }} + createCallback={() => { + formRef.current?.setFieldsValue(record); + }} + formDatas={formConfig as any} + > + + +
+ ); +}; + +export default inject("skuStore")(observer(Sku)); diff --git a/src/pages/sku/spec/config.tsx b/src/pages/sku/spec/config.tsx new file mode 100644 index 0000000..a57121a --- /dev/null +++ b/src/pages/sku/spec/config.tsx @@ -0,0 +1,40 @@ +import { FormType } from "@/components/form/interface"; +import { UserDataType } from "@/model/userModel"; +import { ColumnsType } from "antd/lib/table"; +export const formConfig = [ + { + type: FormType.input, + label: "规格名称", + name: "spec_name", + value: "", + rules: [{ required: true, message: "规格名称不能为空!" }], + }, + { + type: FormType.input, + label: "规格描述", + name: "spec_remark", + value: "", + }, + { + type: FormType.inputNumber, + label: "规格排序", + name: "spec_sort", + value: "1", + }, +]; + +export const columns: ColumnsType = [ + { + title: "规格名称", + dataIndex: "spec_name", + fixed: "left", + }, + { + title: "规格描述", + dataIndex: "spec_remark", + }, + { + title: "规格排序", + dataIndex: "spec_sort", + }, +]; diff --git a/src/pages/sku/spec/index.tsx b/src/pages/sku/spec/index.tsx index 1fb3d29..15c5ba8 100644 --- a/src/pages/sku/spec/index.tsx +++ b/src/pages/sku/spec/index.tsx @@ -1,9 +1,76 @@ -const Spec = () => { +import React from "react"; +import { Button, Space, Modal, FormInstance } from "antd"; +import { Store } from "antd/lib/form/interface"; +import { inject, observer } from "mobx-react"; +import { useEffect, useState } from "react"; +import { columns, formConfig } from "./config"; +import BTable from "@/components/b_table"; +import SimpleForm from "@/components/form/simple_form"; +const SkuSpec = (props: Store) => { + const { skuSpecStore } = props; + const [isModalOpen, setIsModalOpen] = useState(false); + const formRef = React.useRef(null); + const [userId, setId] = useState(null); + const [record, setRecord] = useState(null); + + // 获取列表数据 + useEffect(() => { + skuSpecStore.getlist(); + }, [skuSpecStore]); + return ( -
- cat +
+ + + { + skuSpecStore.deleteItem(record); + }} + editCallback={(record) => { + setIsModalOpen(true); + formRef.current?.setFieldsValue(record); + setRecord(record); + setId(record.id); + }} + /> + + formRef.current?.resetFields()} + onOk={() => formRef.current?.submit()} + okText="确定" + cancelText="取消" + onCancel={() => { + setId(null); + setRecord(null); + setIsModalOpen(false); + }} + > + { + skuSpecStore.add(formRef.current?.getFieldsValue()) + setIsModalOpen(false); + }} + createCallback={() => { + formRef.current?.setFieldsValue(record); + }} + formDatas={formConfig as any} + > + +
); }; -export default Spec; +export default inject("skuSpecStore")(observer(SkuSpec)); diff --git a/src/pages/sku/tag/config.tsx b/src/pages/sku/tag/config.tsx new file mode 100644 index 0000000..ce08d20 --- /dev/null +++ b/src/pages/sku/tag/config.tsx @@ -0,0 +1,42 @@ +import { FormType } from "@/components/form/interface"; +import { UserDataType } from "@/model/userModel"; +import { ColumnsType } from "antd/lib/table"; +export const formConfig = [ + { + type: FormType.input, + label: "标签名称", + name: "tag_name", + value: "", + rules: [{ required: true, message: "标签名称不能为空!" }], + }, + { + type: FormType.input, + label: "标签描述", + name: "tag_desc", + value: "", + rules: [{ required: true, message: "城市编码不能为空" }], + }, + { + type: FormType.input, + label: "标签排序", + name: "tag_sort", + value: "1", + rules: [{ required: true, message: "标签排序不能为空" }], + }, +]; + +export const columns: ColumnsType = [ + { + title: "标签名称", + dataIndex: "tag_name", + fixed: "left", + }, + { + title: "标签描述", + dataIndex: "tag_desc", + }, + { + title: "标签排序", + dataIndex: "tag_sort", + }, +]; diff --git a/src/pages/sku/tag/index.tsx b/src/pages/sku/tag/index.tsx new file mode 100644 index 0000000..92bc067 --- /dev/null +++ b/src/pages/sku/tag/index.tsx @@ -0,0 +1,76 @@ +import React from "react"; +import { Button, Space, Modal, FormInstance } from "antd"; +import { Store } from "antd/lib/form/interface"; +import { inject, observer } from "mobx-react"; +import { useEffect, useState } from "react"; +import { columns, formConfig } from "./config"; +import BTable from "@/components/b_table"; +import SimpleForm from "@/components/form/simple_form"; +const Tag = (props: Store) => { + const { tagStore } = props; + const [isModalOpen, setIsModalOpen] = useState(false); + const formRef = React.useRef(null); + const [userId, setId] = useState(null); + const [record, setRecord] = useState(null); + + // 获取列表数据 + useEffect(() => { + tagStore.getlist(); + }, [tagStore]); + + return ( +
+ + + { + tagStore.deleteItem(record); + }} + editCallback={(record) => { + setIsModalOpen(true); + formRef.current?.setFieldsValue(record); + setRecord(record); + setId(record.id); + }} + /> + + formRef.current?.resetFields()} + onOk={() => formRef.current?.submit()} + okText="确定" + cancelText="取消" + onCancel={() => { + setId(null); + setRecord(null); + setIsModalOpen(false); + }} + > + { + tagStore.add(formRef.current?.getFieldsValue()) + setIsModalOpen(false); + }} + createCallback={() => { + formRef.current?.setFieldsValue(record); + }} + formDatas={formConfig as any} + > + + +
+ ); +}; + +export default inject("tagStore")(observer(Tag)); diff --git a/src/router/routers/sku_router.tsx b/src/router/routers/sku_router.tsx index 215bbf7..47ecf10 100644 --- a/src/router/routers/sku_router.tsx +++ b/src/router/routers/sku_router.tsx @@ -1,4 +1,3 @@ -import Menu from "@/pages/rbac/menu"; export const sku = [ { path: "/sku", @@ -9,7 +8,9 @@ export const sku = [ { path: "/sku/list", index: true, - element: , + lazy: async () => ({ + Component: (await import("@/pages/sku/sku")).default, + }), }, { path: "/sku/cat", @@ -32,6 +33,13 @@ export const sku = [ Component: (await import("@/pages/sku/brand")).default, }), }, + { + path: "/sku/tag", + index: true, + lazy: async () => ({ + Component: (await import("@/pages/sku/tag")).default, + }), + }, ], }, ]; diff --git a/src/service/config.ts b/src/service/config.ts index eea0a70..9ab5805 100644 --- a/src/service/config.ts +++ b/src/service/config.ts @@ -15,14 +15,14 @@ class CityConfig { } -class Skuconfig { +class SkuConfig { static ADD: string = "/sku"; static EDIT: string = "/sku"; static LIST: string = "/sku/list"; static DELETE: string = "/sku"; } -class SkuCatconfig { +class SkuCatConfig { static ADD: string = "/skuCat"; static EDIT: string = "/skuCat"; static LIST: string = "/skuCat/list"; @@ -36,4 +36,17 @@ class Orderconfig { static DELETE: string = "/order"; } -export { UserConfig, CityConfig, SkuCatconfig, Skuconfig, Orderconfig }; \ No newline at end of file +class TagConfig { + static ADD: string = "/tag"; + static EDIT: string = "/tag"; + static LIST: string = "/tag/list"; + static DELETE: string = "/tag"; +} + +class SpecConfig { + static ADD: string = "/skuSpec"; + static EDIT: string = "/skuSpec"; + static LIST: string = "/skuSpec/list"; + static DELETE: string = "/skuSpec"; +} +export { UserConfig, CityConfig, SkuCatConfig, SkuConfig, Orderconfig, TagConfig, SpecConfig }; \ No newline at end of file diff --git a/src/static/favicon.png b/src/static/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..311a0645468e99d3930ef6c708aed7d611d145eb GIT binary patch literal 20348 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 { + constructor() { + super(SkuConfig) + makeObservable(this, {}) + } +} +const skuStore = new SkuStore(); +export default skuStore; \ No newline at end of file diff --git a/src/store/skuCat.ts b/src/store/skuCat.ts new file mode 100644 index 0000000..ec37c5d --- /dev/null +++ b/src/store/skuCat.ts @@ -0,0 +1,13 @@ +import { makeObservable } from "mobx"; +import BaseStore from "./baseStore"; +import { UserDataType } from "@/model/userModel"; +import { SkuCatConfig } from "@/service/config"; + +class SkuCatStore extends BaseStore { + constructor() { + super(SkuCatConfig) + makeObservable(this, {}) + } +} +const skuCatStore = new SkuCatStore(); +export default skuCatStore; \ No newline at end of file diff --git a/src/store/skuSpec.ts b/src/store/skuSpec.ts new file mode 100644 index 0000000..e81bcc2 --- /dev/null +++ b/src/store/skuSpec.ts @@ -0,0 +1,13 @@ +import { makeObservable } from "mobx"; +import BaseStore from "./baseStore"; +import { UserDataType } from "@/model/userModel"; +import { SpecConfig } from "@/service/config"; + +class SkuSpecStore extends BaseStore { + constructor() { + super(SpecConfig) + makeObservable(this, {}) + } +} +const skuSpecStore = new SkuSpecStore(); +export default skuSpecStore; \ No newline at end of file diff --git a/src/store/tag.ts b/src/store/tag.ts new file mode 100644 index 0000000..3e1d3d1 --- /dev/null +++ b/src/store/tag.ts @@ -0,0 +1,13 @@ +import { makeObservable } from "mobx"; +import BaseStore from "./baseStore"; +import { UserDataType } from "@/model/userModel"; +import { TagConfig } from "@/service/config"; + +class TagStore extends BaseStore { + constructor() { + super(TagConfig) + makeObservable(this, {}) + } +} +const tagStore = new TagStore(); +export default tagStore; \ No newline at end of file