提交 d180e973 authored 作者: 王鹏飞's avatar 王鹏飞

chore(admin): update

上级 6d1921de
<!doctype html> <!doctype html>
<html lang="zh-CN"> <html lang="zh-CN">
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="https://zws-imgs-pub.ezijing.com/pc/base/favicon.ico" /> <link rel="icon" type="image/svg+xml" href="https://zws-imgs-pub.ezijing.com/pc/base/favicon.ico" />
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
</head> </head>
<body> <body>
<div id="root"></div> <div id="root"></div>
<script src="%BASE_URL%formula-editor/dist/formula-editor.min.js"></script> <script src="/formula-editor/dist/formula-editor.min.js"></script>
<script type="module" src="/src/main.jsx"></script> <script type="module" src="/src/main.jsx"></script>
</body> </body>
</html> </html>
...@@ -6,8 +6,17 @@ export function getUser() { ...@@ -6,8 +6,17 @@ export function getUser() {
} }
// 获取菜单 // 获取菜单
export function getMenu() { export async function getMenuList(params) {
return axios.post("/api/system/power/getMenuList"); const response = await axios.post("/api/system/power/getMenuList", params);
return {
data: response.data,
operation_permissions_list: response.operation_permissions_list ?? [],
};
}
// 检查当前是否存在可用的 SSO 登录态;未登录时后端返回 { run: "login" }。
export async function checkSSOLogin() {
return (await axios.post("/api/user/checkSsoLogin")).data;
} }
// 获取STSToken // 获取STSToken
......
import React, { useState, useEffect, useRef } from "react";
import { Pagination, Space, InputNumber, Button, Select } from "antd";
import { LeftOutlined, RightOutlined } from "@ant-design/icons";
import "./index.less";
const PaginationCom = (props) => {
const {
total,
page = 1,
page_size = 10,
setpage_size = () => {},
filterObj = {},
setPage = () => {},
init = () => {},
} = props;
const isFirstRender = useRef(true); // 使用 useRef 创建一个标志位
const pageItemRender = (page, type, originalElement) => {
if (type === "prev") {
return (
<Button
disabled={page === 1}
type="default"
icon={<LeftOutlined style={{ width: 10 }} />}
></Button>
);
}
if (type === "next") {
return (
<Button
disabled={total / page_size >= page}
type="default"
icon={<RightOutlined style={{ width: 10 }} />}
></Button>
);
}
return originalElement;
};
const [jumpSize, setJumpSize] = useState(1);
const [maxSize, setMaxSize] = useState(1);
useEffect(() => {
if (total) {
setMaxSize(Math.ceil(total / page_size));
}
if (page) {
setJumpSize(page);
}
}, [total, page]);
useEffect(() => {
// console.log('page', page, filterObj)
// 在第一次渲染时不执行 init 函数
// if (!isFirstRender.current) {
let obj = { ...filterObj };
for (const key in obj) {
if (!obj[key]) {
delete obj[key];
}
}
init(obj);
// } else {
// isFirstRender.current = false;
// }
}, [page, page_size]);
return (
<div
className="pagination"
style={{
display: "flex",
justifyContent: "space-between",
alignItems: "center",
paddingBottom: 10,
}}
>
<Space>
<span>共{total}条数据</span>
<Select
defaultValue={page_size}
options={[
{
label: "10条/页",
value: 10,
},
{
label: "20条/页",
value: 20,
},
{
label: "30条/页",
value: 30,
},
{
label: "40条/页",
value: 40,
},
]}
onChange={(val) => {
setPage(1);
setpage_size(val);
}}
/>
</Space>
<div style={{ display: "flex", justifyContent: "flex-end", alignItems: "center" }}>
<Space>
<Pagination
current={page}
total={total}
showSizeChanger={false} // 隐藏每页条数选择框
pageSize={page_size}
showQuickJumper={false}
onChange={(val) => {
setPage(val);
if (document.querySelector(".ant-table-body")) {
document.querySelector(".ant-table-body").scrollTo({
top: 0,
behavior: "smooth",
});
}
}}
itemRender={pageItemRender}
></Pagination>
<Space>
<span>前往</span>
<InputNumber
className="aa"
autoComplete="off"
value={jumpSize}
controls={false}
onPressEnter={(ev) => {
let val = ev.target.value;
let reg = /^\d+$/;
if (!reg.test(val)) {
return;
}
if (!val || val < 1) {
setPage(1);
setJumpSize(1);
return;
}
if (val >= maxSize) {
setPage(maxSize);
setJumpSize(maxSize);
return;
}
setPage(val);
setJumpSize(val);
}}
style={{ width: 50 }}
/>
<span>页</span>
</Space>
</Space>
</div>
</div>
);
};
export default PaginationCom;
.pagination .ant-pagination .ant-pagination-item-active {
background-color: #aa1941;
a {
color: #ffffffb2 !important;
}
}
import axios from "@/utils/request.js";
import qs from "qs";
import { get } from "lodash-es";
import { message } from "antd";
// 菜单列表
const getMenuList = async (obj) => {
try {
const res = await axios.post("/system/power/getMenuList", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
export { getMenuList };
import React, { useEffect, useState, useRef, useImperativeHandle, forwardRef } from "react"; import React, { useEffect, useState, useRef, useImperativeHandle, forwardRef } from "react";
import { Modal, Drawer, Tree, Button, Spin, Space, Input, Image } from "antd"; import { Modal, Drawer, Tree, Button, Spin, Space, Input, Image } from "antd";
import { LeftOutlined, RightOutlined } from "@ant-design/icons"; import { LeftOutlined, RightOutlined } from "@ant-design/icons";
import { getInfoByChapterId } from "@/modules/books/management/chapters/request"; import { getInfoByChapterId } from "@/modules/books/management/chapters/api";
import { get } from "lodash-es"; import { get } from "lodash-es";
import $, { event } from "jquery"; import $ from "jquery";
import baike from "@/assets/images/editor/icon-baike.png"; import baike from "@/assets/images/editor/icon-baike.png";
import { getChapterTopic, expandReadInfo } from "../utils/request"; import { getChapterTopic, expandReadInfo } from "../utils/request";
import TopicItem from "../practice/components/topicItem"; import TopicItem from "../practice/components/topicItem";
......
...@@ -91,7 +91,6 @@ import PracticeSettingModal from "./practice/index"; ...@@ -91,7 +91,6 @@ import PracticeSettingModal from "./practice/index";
import PreviewModal from "./components/preview"; import PreviewModal from "./components/preview";
import HistoryModal from "./history/"; import HistoryModal from "./history/";
import $ from "jquery";
import "./index.less"; import "./index.less";
...@@ -285,35 +284,24 @@ const WangEditorCustomer = (props, ref) => { ...@@ -285,35 +284,24 @@ const WangEditorCustomer = (props, ref) => {
const listenNodeStyle = (path) => { const listenNodeStyle = (path) => {
const children = editor.children; const children = editor.children;
const getNodeFontSize = (targetNode) => {
const element = editor.toDOMNode(targetNode);
const textElement = element.querySelector("[data-slate-string='true']");
const parentNode = editor.getParentNode(targetNode);
const fallbackElement = parentNode ? editor.toDOMNode(parentNode) : element;
return window.getComputedStyle(textElement || fallbackElement).fontSize;
};
let node = null; let node = null;
if (path[1] === 0) { if (path[1] === 0) {
node = children[path[0]]; node = children[path[0]];
if (node.children.length > 0) { if (node.children.length > 0) {
const elem = editor.toDOMNode(node); // 返回 HTMLElement setSelectionSize(parseInt(getNodeFontSize(node)));
let fontSize = 18;
if ($(elem).find("[data-slate-string='true']")) {
fontSize = $(elem).find("[data-slate-string='true']").css("fontSize");
} else {
const parentNode = editor.getParentNode(node); // 返回 node 或者 null
const elemParent = editor.toDOMNode(parentNode); // 返回 HTMLElement
fontSize = $(elemParent).css("fontSize");
}
setSelectionSize(parseInt(fontSize));
} else { } else {
node = children[path[0]].children[0]; node = children[path[0]].children[0];
if (node.fontSize) { if (node.fontSize) {
setSelectionSize(parseInt(node.fontSize)); setSelectionSize(parseInt(node.fontSize));
} else { } else {
const elem = editor.toDOMNode(node); // 返回 HTMLElement setSelectionSize(parseInt(getNodeFontSize(node)));
let fontSize = 18;
if ($(elem).find("[data-slate-string='true']")) {
fontSize = $(elem).find("[data-slate-string='true']").css("fontSize");
} else {
const parentNode = editor.getParentNode(node); // 返回 node 或者 null
const elemParent = editor.toDOMNode(parentNode); // 返回 HTMLElement
fontSize = $(elemParent).css("fontSize");
}
setSelectionSize(parseInt(fontSize));
} }
} }
} else { } else {
...@@ -321,16 +309,7 @@ const WangEditorCustomer = (props, ref) => { ...@@ -321,16 +309,7 @@ const WangEditorCustomer = (props, ref) => {
if (node.fontSize) { if (node.fontSize) {
setSelectionSize(parseInt(node.fontSize)); setSelectionSize(parseInt(node.fontSize));
} else { } else {
const elem = editor.toDOMNode(node); // 返回 HTMLElement setSelectionSize(parseInt(getNodeFontSize(node)));
let fontSize = 18;
if ($(elem).find("[data-slate-string='true']")) {
fontSize = $(elem).find("[data-slate-string='true']").css("fontSize");
} else {
const parentNode = editor.getParentNode(node); // 返回 node 或者 null
const elemParent = editor.toDOMNode(parentNode); // 返回 HTMLElement
fontSize = $(elemParent).css("fontSize");
}
setSelectionSize(parseInt(fontSize));
} }
} }
}; };
......
...@@ -6,7 +6,6 @@ import { ...@@ -6,7 +6,6 @@ import {
SlateNode, SlateNode,
} from "@wangeditor/editor"; } from "@wangeditor/editor";
import { h } from "snabbdom"; import { h } from "snabbdom";
import $ from "jquery";
import iconExpand from "@/assets/images/editor/icon_expand_read.png"; import iconExpand from "@/assets/images/editor/icon_expand_read.png";
import iconClose from "@/assets/images/icon_chapter_close.png"; import iconClose from "@/assets/images/icon_chapter_close.png";
import { findNodeWithParent } from "../utils/setting"; import { findNodeWithParent } from "../utils/setting";
......
...@@ -6,7 +6,6 @@ import { ...@@ -6,7 +6,6 @@ import {
SlateNode, SlateNode,
} from "@wangeditor/editor"; } from "@wangeditor/editor";
import { h } from "snabbdom"; import { h } from "snabbdom";
import $ from "jquery";
import iconExpand from "@/assets/images/editor/icon_expand_tips.png"; import iconExpand from "@/assets/images/editor/icon_expand_tips.png";
import iconExpandT from "@/assets/images/editor/icon_expand_editor.png"; import iconExpandT from "@/assets/images/editor/icon_expand_editor.png";
......
...@@ -429,8 +429,6 @@ const parseImageHtml = (domElem, children, editor) => { ...@@ -429,8 +429,6 @@ const parseImageHtml = (domElem, children, editor) => {
const imgUrl = domElem.getAttribute("data-imgUrl") || ""; const imgUrl = domElem.getAttribute("data-imgUrl") || "";
const imgDescript = domElem.getAttribute("data-imgDescript") || ""; const imgDescript = domElem.getAttribute("data-imgDescript") || "";
const title = domElem.getAttribute("data-title") || ""; const title = domElem.getAttribute("data-title") || "";
const $elem = $(domElem);
// 生成“附件”元素(按照此前约定的数据结构) // 生成“附件”元素(按照此前约定的数据结构)
const myResume = { const myResume = {
type: "chapterImage", type: "chapterImage",
...@@ -438,8 +436,8 @@ const parseImageHtml = (domElem, children, editor) => { ...@@ -438,8 +436,8 @@ const parseImageHtml = (domElem, children, editor) => {
imgUrl, imgUrl,
imgDescript, imgDescript,
style: { style: {
width: getStyleValue($elem, "width"), width: getStyleValue(domElem, "width"),
height: getStyleValue($elem, "height"), height: getStyleValue(domElem, "height"),
}, },
children: [{ text: "" }], // void node 必须有 children ,其中有一个空字符串,重要!!! children: [{ text: "" }], // void node 必须有 children ,其中有一个空字符串,重要!!!
}; };
......
...@@ -2,7 +2,6 @@ import { DomEditor, SlateTransforms, SlateEditor } from "@wangeditor/editor"; ...@@ -2,7 +2,6 @@ import { DomEditor, SlateTransforms, SlateEditor } from "@wangeditor/editor";
import { h } from "snabbdom"; import { h } from "snabbdom";
import iconClose from "@/assets/images/icon_chapter_close.png"; import iconClose from "@/assets/images/icon_chapter_close.png";
import { delChapterTopic } from "../utils/request"; import { delChapterTopic } from "../utils/request";
import $ from "jquery";
import "../utils/iconfont"; import "../utils/iconfont";
import { hexToRgb } from "@/utils/common"; import { hexToRgb } from "@/utils/common";
import { findNodeWithParent } from "../utils/setting"; import { findNodeWithParent } from "../utils/setting";
......
import axios from "@/utils/request.js"; import axios, { notifySuccess } from "@/utils/axios";
import qs from "qs";
import { get } from "lodash-es";
import { message } from "antd";
// 题目列表
const getList = async (obj) => {
const res = await axios.post("/question/getList", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
};
// add
const questionAdd = async (obj) => {
const res = await axios.post("/question/add", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
message.success(msg);
return true;
} else {
message.error(msg);
return false;
}
};
// 添加题目分类
const questionAddType = async (obj) => {
const res = await axios.post("/type/add", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
message.success(msg);
return data;
} else {
message.error(msg);
return false;
}
};
// 题目分类列表
const typeAllList = async (obj) => {
const res = await axios.post("/type/getList", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
};
// 书籍名称下拉列表 const post = async (path, params, notify = false) => {
const bookNameList = async (obj) => { const response = await axios.post(path, params);
const res = await axios.post("book/teacher/getListAll", qs.stringify(obj)); if (notify) notifySuccess(response.message);
const code = get(res, "data.code", 0); return response.data;
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
}; };
export { getList, questionAdd, questionAddType, typeAllList, bookNameList };
export const getList = (params) => post("/question/getList", params);
export const questionAdd = (params) => post("/question/add", params, true);
export const questionAddType = (params) => post("/type/add", params);
export const typeAllList = (params) => post("/type/getList", params);
export const bookNameList = (params) => post("/book/teacher/getListAll", params);
import axios from "@/utils/request.js"; import axios from "@/utils/axios";
import qs from "qs";
import { get } from "lodash-es"; const post = async (path, params) => (await axios.post(path, params)).data;
import { message } from "antd";
export const getTopicList = (params) => post("/book/question/getList", params);
// 获取题目列表 export const getTopicTypeList = (params) => post("/book/question/type/getList", params);
const getTopicList = async (obj) => { export const addChapterTopic = (params) => post("/book/chapter/question/add", params);
try { export const getChapterTopic = (params) => post("/book/chapter/question/getQuestionList", params);
const res = await axios.post("/book/question/getList", qs.stringify(obj)); export const delChapterTopic = (params) => post("/book/chapter/question/removeQuestion", params);
const code = get(res, "data.code", 0); export const addChapterTooltip = (params) => post("/book/bubble/add", params);
const data = get(res, "data.data", []); export const delChapterTooltip = (params) => post("/book/bubble/removeBubble", params);
const msg = get(res, "data.message", "获取OSS令牌失败!"); export const addExpandRead = (params) => post("/book/extend/add", params);
if (code === 200) { export const delExpandRead = (params) => post("/book/extend/removeExtend", params);
return data; export const expandReadInfo = (params) => post("/book/extend/info", params);
} else { export const addGallery = (params) => post("/book/gallery/add", params);
message.error(msg); export const delGallery = (params) => post("/book/gallery/removeGallery", params);
return false; export const getRecordInfo = (params) => post("/book/teacher/section/getRecordInfo", params);
} export const getRecordList = (params) => post("/book/teacher/section/getRecordList", params);
} catch (error) {
return false;
}
};
// 获取题目分类列表
const getTopicTypeList = async (obj) => {
try {
const res = await axios.post("/book/question/type/getList", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "获取OSS令牌失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 添加练习
const addChapterTopic = async (obj) => {
try {
const res = await axios.post("/book/chapter/question/add", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "获取OSS令牌失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 添加练习
const getChapterTopic = async (obj) => {
try {
const res = await axios.post("/book/chapter/question/getQuestionList", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "获取OSS令牌失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 删除练习
const delChapterTopic = async (obj) => {
try {
const res = await axios.post("/book/chapter/question/removeQuestion", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "获取OSS令牌失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 添加气泡
const addChapterTooltip = async (obj) => {
try {
const res = await axios.post("/book/bubble/add", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "获取OSS令牌失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 删除气泡
const delChapterTooltip = async (obj) => {
try {
const res = await axios.post("/book/bubble/removeBubble", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "获取OSS令牌失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 添加扩展
const addExpandRead = async (obj) => {
try {
const res = await axios.post("/book/extend/add", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "获取OSS令牌失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 删除扩展
const delExpandRead = async (obj) => {
try {
const res = await axios.post("/book/extend/removeExtend", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "获取OSS令牌失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 扩展详情
const expandReadInfo = async (obj) => {
try {
const res = await axios.post("/book/extend/info", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "获取OSS令牌失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 删除扩展
const addGallery = async (obj) => {
try {
const res = await axios.post("/book/gallery/add", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "获取OSS令牌失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 删除画廊
const delGallery = async (obj) => {
try {
const res = await axios.post("/book/gallery/removeGallery", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "获取OSS令牌失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 保存历史详情
const getRecordInfo = async (obj) => {
try {
const res = await axios.post("/book/teacher/section/getRecordInfo", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 保存历史记录
const getRecordList = async (obj) => {
try {
const res = await axios.post("/book/teacher/section/getRecordList", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
export {
getTopicList,
getTopicTypeList,
addChapterTopic,
delChapterTopic,
getChapterTopic,
addChapterTooltip,
delChapterTooltip,
addExpandRead,
delExpandRead,
expandReadInfo,
addGallery,
delGallery,
getRecordInfo,
getRecordList,
};
...@@ -49,7 +49,7 @@ import Breadcrumb from './components/breadcrumb' ...@@ -49,7 +49,7 @@ import Breadcrumb from './components/breadcrumb'
import './index.less' import './index.less'
import logo from '@/assets/images/logo.png' import logo from '@/assets/images/logo.png'
import { getMenuList, checkSSOLogin } from './request' import { getMenuList, checkSSOLogin } from '@/api/base'
const { Header, Content, Sider } = Layout const { Header, Content, Sider } = Layout
......
import axios from "@/utils/request.js";
import qs from "qs";
import { get } from "lodash-es";
import { message } from "antd";
// 用户信息
const getUserInfo = async (obj) => {
try {
const res = await axios.post("/user/user/getUserInfo", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 退出
const loginout = async (obj) => {
try {
const res = await axios.post("/login/out", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 菜单列表
const getMenuList = async (obj) => {
try {
const res = await axios.post("/system/power/getMenuList", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const operation_permissions_list = get(res, "data.operation_permissions_list", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return { data, operation_permissions_list };
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 修改密码
const changePass = async (obj) => {
try {
const res = await axios.post("/user/user/changePass", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return true;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 修改信息
const changeInfo = async (obj) => {
try {
const res = await axios.post("/user/user/editUserInfo", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
message.success(msg);
return true;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 消息列表
const getMessageList = async (obj) => {
try {
const res = await axios.post("/message/message/getMessageList", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 获取未读消息条数
const getMessageCount = async (obj) => {
try {
const res = await axios.post("/message/message/getMessageCount", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 设置部分已读
const setRead = async (obj) => {
try {
const res = await axios.post("/message/message/setOneRead", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 设置全部已读
const setAllRead = async (obj) => {
try {
const res = await axios.post("/message/message/setRead", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
const checkSSOLogin = async (obj) => {
try {
const res = await axios.post("/user/checkSsoLogin", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (msg === "Undefined index: verify") {
message.error("请先点击按钮进行验证");
return false;
}
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
console.error(error);
let msg = get(error.response, "data.msg", "");
if (msg) {
message.error(msg);
}
return false;
}
};
export {
getUserInfo,
getMenuList,
changePass,
changeInfo,
getMessageList,
getMessageCount,
setRead,
setAllRead,
loginout,
checkSSOLogin,
};
import { message } from "antd"; import axios, { notifySuccess } from "@/utils/axios";
// @ts-expect-error The legacy workspace does not install the qs declaration package.
import qs from "qs";
import request from "@/utils/request.js";
import type { AdminQuery } from "./query"; import type { AdminQuery } from "./query";
...@@ -30,46 +26,21 @@ export interface AdminListResult { ...@@ -30,46 +26,21 @@ export interface AdminListResult {
type ApiParams = Record<string, unknown>; type ApiParams = Record<string, unknown>;
async function getPayload<T>(url: string, params: ApiParams): Promise<T | false> { async function getPayload<T>(url: string, params: ApiParams): Promise<T> {
try { const response = await axios.post(url, params);
const response = await request.post(url, qs.stringify(params)); return response.data as T;
const body = response.data as { code?: number; data?: T; message?: string };
const code = body?.code ?? 0;
const data = (body?.data ?? []) as T;
const text = body?.message ?? "数据获取失败!";
if (code === 200) return data;
message.error(text);
return false;
} catch {
return false;
}
} }
async function mutate(url: string, params: ApiParams): Promise<boolean> { async function mutate(url: string, params: ApiParams): Promise<boolean> {
try { const response = await axios.post(url, params);
const response = await request.post(url, qs.stringify(params)); notifySuccess(response.message);
const body = response.data as { code?: number; message?: string }; return true;
const code = body?.code ?? 0;
const text = body?.message ?? "数据获取失败!";
if (code === 200) {
message.success(text);
return true;
}
message.error(text);
return false;
} catch {
return false;
}
} }
export async function getAdminList(params: AdminQuery): Promise<AdminListResult | false> { export async function getAdminList(params: AdminQuery): Promise<AdminListResult> {
const data = await getPayload<{ list?: AdminRow[]; total?: number }>("/user/user/getList", { const data = await getPayload<{ list?: AdminRow[]; total?: number }>("/user/user/getList", {
...params, ...params,
}); });
if (data === false) return false;
return { rows: data.list ?? [], total: data.total ?? 0 }; return { rows: data.list ?? [], total: data.total ?? 0 };
} }
......
...@@ -32,12 +32,8 @@ export function useAdminList() { ...@@ -32,12 +32,8 @@ export function useAdminList() {
setError(null); setError(null);
try { try {
const result: AdminListResult | false = await getAdminList(query); const result: AdminListResult = await getAdminList(query);
if (currentRequest !== requestId.current) return; if (currentRequest !== requestId.current) return;
if (result === false) {
setError(new Error("数据获取失败!"));
return;
}
setRows(result.rows); setRows(result.rows);
setTotal(result.total); setTotal(result.total);
} catch (reason) { } catch (reason) {
......
...@@ -45,7 +45,7 @@ export default function AdminListView() { ...@@ -45,7 +45,7 @@ export default function AdminListView() {
useEffect(() => { useEffect(() => {
let active = true; let active = true;
void getRoleOptions().then((result) => { void getRoleOptions().then((result) => {
if (active && result !== false) setRoles(result); if (active) setRoles(result);
}); });
return () => { return () => {
active = false; active = false;
...@@ -54,7 +54,6 @@ export default function AdminListView() { ...@@ -54,7 +54,6 @@ export default function AdminListView() {
const handleEdit = async (id: number) => { const handleEdit = async (id: number) => {
const admin = await getAdminInfo(id); const admin = await getAdminInfo(id);
if (admin === false) return;
setSelectedId(id); setSelectedId(id);
setIsAdd(false); setIsAdd(false);
setInitialAdmin({ setInitialAdmin({
......
import { message } from "antd"; import axios, { notifySuccess } from "@/utils/axios";
// @ts-expect-error The legacy workspace does not install the qs declaration package.
import qs from "qs";
import request from "@/utils/request.js";
import type { RoleQuery } from "./query"; import type { RoleQuery } from "./query";
...@@ -29,43 +25,21 @@ export interface RoleListResult { ...@@ -29,43 +25,21 @@ export interface RoleListResult {
type ApiParams = Record<string, unknown>; type ApiParams = Record<string, unknown>;
async function getPayload<T>(url: string, params: ApiParams): Promise<T | false> { async function getPayload<T>(url: string, params: ApiParams): Promise<T> {
try { const response = await axios.post(url, params);
const response = await request.post(url, qs.stringify(params)); return response.data as T;
const body = response.data as { code?: number; data?: T; message?: string };
const code = body?.code ?? 0;
const data = (body?.data ?? []) as T;
const text = body?.message ?? "数据获取失败!";
if (code === 200) return data;
message.error(text);
return false;
} catch {
return false;
}
} }
async function mutate(url: string, params: ApiParams) { async function mutate(url: string, params: ApiParams) {
try { const response = await axios.post(url, params);
const response = await request.post(url, qs.stringify(params)); notifySuccess(response.message);
const body = response.data as { code?: number; message?: string }; return true;
const code = body?.code ?? 0;
const text = body?.message ?? "数据获取失败!";
if (code === 200) {
message.success(text);
return true;
}
message.error(text);
return false;
} catch {
return false;
}
} }
export async function getRoleList(params: RoleQuery): Promise<RoleListResult | false> { export async function getRoleList(params: RoleQuery): Promise<RoleListResult> {
const data = await getPayload<{ list?: RoleRow[]; total?: number }>("/user/role/getList", { const data = await getPayload<{ list?: RoleRow[]; total?: number }>("/user/role/getList", {
...params, ...params,
}); });
if (data === false) return false;
return { rows: data.list ?? [], total: data.total ?? 0 }; return { rows: data.list ?? [], total: data.total ?? 0 };
} }
......
...@@ -31,12 +31,8 @@ export function useRoleList() { ...@@ -31,12 +31,8 @@ export function useRoleList() {
setLoading(true); setLoading(true);
setError(null); setError(null);
try { try {
const result: RoleListResult | false = await getRoleList(query); const result: RoleListResult = await getRoleList(query);
if (currentRequest !== requestId.current) return; if (currentRequest !== requestId.current) return;
if (result === false) {
setError(new Error("数据获取失败!"));
return;
}
setRows(result.rows); setRows(result.rows);
setTotal(result.total); setTotal(result.total);
} catch (reason) { } catch (reason) {
......
...@@ -47,7 +47,7 @@ export default function RoleListView() { ...@@ -47,7 +47,7 @@ export default function RoleListView() {
useEffect(() => { useEffect(() => {
let active = true; let active = true;
void getAllPermissions().then((result) => { void getAllPermissions().then((result) => {
if (active && result !== false) { if (active) {
setPermissionTree(convertToAntdTreeData(result) as PermissionTreeNode[]); setPermissionTree(convertToAntdTreeData(result) as PermissionTreeNode[]);
} }
}); });
...@@ -58,7 +58,6 @@ export default function RoleListView() { ...@@ -58,7 +58,6 @@ export default function RoleListView() {
const handleEdit = async (id: number) => { const handleEdit = async (id: number) => {
const role = await getRoleInfo(id); const role = await getRoleInfo(id);
if (role === false) return;
setSelectedId(id); setSelectedId(id);
setIsAdd(false); setIsAdd(false);
setInitialRole({ setInitialRole({
...@@ -94,7 +93,7 @@ export default function RoleListView() { ...@@ -94,7 +93,7 @@ export default function RoleListView() {
setSelectedId(id); setSelectedId(id);
setPermissionOpen(true); setPermissionOpen(true);
const result = await getRolePermissionIds(id); const result = await getRolePermissionIds(id);
setCheckedKeys(result === false ? [] : result); setCheckedKeys(result);
}; };
const submitPermissions = async () => { const submitPermissions = async () => {
......
export { changePass, changeInfo, getUserInfo } from "@/layout/request"; import axios, { notifySuccess } from "@/utils/axios";
export const getUserInfo = async (params) => (await axios.post("/user/user/getUserInfo", params)).data;
export const changePass = async (params) => (await axios.post("/user/user/changePass", params)).data;
export const changeInfo = async (params) => {
const response = await axios.post("/user/user/editUserInfo", params);
notifySuccess(response.message);
return response.data;
};
import { useState, useEffect } from "react"; import { useState, useEffect } from "react";
import { Form, Input, Button, Space, Row, Col, Drawer } from "antd"; import { Form, Input, Button, Space, Row, Col, Drawer } from "antd";
import users from "@/assets/images/icon/userinfo.png"; import users from "@/assets/images/icon/userinfo.png";
import { changePass, changeInfo, getUserInfo } from "@/layout/request"; import { changePass, changeInfo, getUserInfo } from "../api";
import { useNavigate } from "react-router"; import { useNavigate } from "react-router";
import UploadImage from "@/components/uploadImage"; import UploadImage from "@/components/uploadImage";
...@@ -39,10 +39,8 @@ const UserInfo = () => { ...@@ -39,10 +39,8 @@ const UserInfo = () => {
}; };
const submitForm = async (obj) => { const submitForm = async (obj) => {
const updatedData = await changeInfo({ ...obj }); await changeInfo({ ...obj });
if (updatedData) { await fetchData();
await fetchData();
}
}; };
return ( return (
......
import { message } from 'antd' import axios, { notifySuccess } from '@/utils/axios'
import qs from 'qs'
import axios from '@/utils/request'
export type AdsenseRow = { export type AdsenseRow = {
id: number id: number
...@@ -15,29 +12,13 @@ export type AdsenseListResult = { ...@@ -15,29 +12,13 @@ export type AdsenseListResult = {
total: number total: number
} }
type ApiEnvelope<T> = {
code?: number
data?: T
message?: string
}
function getMessage(envelope: ApiEnvelope<unknown>) {
return envelope.message || '数据获取失败!'
}
export async function getPositionList(query: Record<string, unknown>): Promise<AdsenseListResult> { export async function getPositionList(query: Record<string, unknown>): Promise<AdsenseListResult> {
const response = await axios.post('/ad/position/getList', qs.stringify(query)) const response = await axios.post('/ad/position/getList', query)
const envelope = response.data as ApiEnvelope<{ list?: AdsenseRow[]; total?: number }> const data = response.data as { list?: AdsenseRow[]; total?: number }
if (envelope.code !== 200) {
const error = new Error(getMessage(envelope))
message.error(error.message)
throw error
}
return { return {
rows: envelope.data?.list ?? [], rows: data.list ?? [],
total: envelope.data?.total ?? 0, total: data.total ?? 0,
} }
} }
...@@ -48,18 +29,7 @@ export async function changePositionStatus({ ...@@ -48,18 +29,7 @@ export async function changePositionStatus({
id: number id: number
status: '0' | '1' status: '0' | '1'
}): Promise<boolean> { }): Promise<boolean> {
try { const response = await axios.post('/ad/position/changeStatus', { id, status })
const response = await axios.post('/ad/position/changeStatus', qs.stringify({ id, status })) notifySuccess(response.message)
const envelope = response.data as ApiEnvelope<unknown> return true
if (envelope.code !== 200) {
message.error(getMessage(envelope))
return false
}
message.success(getMessage(envelope))
return true
} catch {
return false
}
} }
import { message } from "antd"; import axios, { notifySuccess } from "@/utils/axios";
// @ts-expect-error The legacy workspace does not install the qs declaration package.
import qs from "qs";
import request from "@/utils/request.js";
import type { AdvertQuery } from "./query"; import type { AdvertQuery } from "./query";
...@@ -29,42 +25,21 @@ export interface AdvertListResult { ...@@ -29,42 +25,21 @@ export interface AdvertListResult {
} }
type ApiParams = Record<string, unknown>; type ApiParams = Record<string, unknown>;
type ApiBody<T> = { code?: number; data?: T; message?: string }; async function getPayload<T>(url: string, params: ApiParams): Promise<T> {
const response = await axios.post(url, params);
async function getPayload<T>(url: string, params: ApiParams): Promise<T | false> { return response.data as T;
try {
const response = await request.post(url, qs.stringify(params));
const body = response.data as ApiBody<T>;
const text = body?.message ?? "数据获取失败!";
if (body?.code === 200) return (body.data ?? []) as T;
message.error(text);
return false;
} catch {
return false;
}
} }
async function mutate(url: string, params: ApiParams) { async function mutate(url: string, params: ApiParams) {
try { const response = await axios.post(url, params);
const response = await request.post(url, qs.stringify(params)); notifySuccess(response.message);
const body = response.data as ApiBody<unknown>; return true;
const text = body?.message ?? "数据获取失败!";
if (body?.code === 200) {
message.success(text);
return true;
}
message.error(text);
return false;
} catch {
return false;
}
} }
export async function getAdvertList(query: AdvertQuery): Promise<AdvertListResult | false> { export async function getAdvertList(query: AdvertQuery): Promise<AdvertListResult> {
const data = await getPayload<{ list?: AdvertRow[]; total?: number }>("/ad/ad/getList", { const data = await getPayload<{ list?: AdvertRow[]; total?: number }>("/ad/ad/getList", {
...query, ...query,
}); });
if (data === false) return false;
return { rows: data.list ?? [], total: data.total ?? 0 }; return { rows: data.list ?? [], total: data.total ?? 0 };
} }
...@@ -88,8 +63,7 @@ export function changeAdvertStatus(id: number, status: "0" | "1") { ...@@ -88,8 +63,7 @@ export function changeAdvertStatus(id: number, status: "0" | "1") {
return mutate("/ad/ad/changeStatus", { id, status }); return mutate("/ad/ad/changeStatus", { id, status });
} }
export async function getAdvertPositions(): Promise<AdvertPosition[] | false> { export async function getAdvertPositions(): Promise<AdvertPosition[]> {
const result = await getPayload<{ list?: AdvertPosition[] }>("/ad/position/getList", {}); const result = await getPayload<{ list?: AdvertPosition[] }>("/ad/position/getList", {});
if (!result) return false;
return (result.list ?? []) as AdvertPosition[]; return (result.list ?? []) as AdvertPosition[];
} }
...@@ -32,12 +32,8 @@ export function useAdvertList() { ...@@ -32,12 +32,8 @@ export function useAdvertList() {
setLoading(true); setLoading(true);
setError(null); setError(null);
try { try {
const result: AdvertListResult | false = await getAdvertList(query); const result: AdvertListResult = await getAdvertList(query);
if (currentRequest !== requestId.current) return; if (currentRequest !== requestId.current) return;
if (result === false) {
setError(new Error("数据获取失败!"));
return;
}
setRows(result.rows); setRows(result.rows);
setTotal(result.total); setTotal(result.total);
} catch (reason) { } catch (reason) {
......
...@@ -43,7 +43,7 @@ export default function AdvertListView() { ...@@ -43,7 +43,7 @@ export default function AdvertListView() {
useEffect(() => { useEffect(() => {
let active = true; let active = true;
void getAdvertPositions().then((result) => { void getAdvertPositions().then((result) => {
if (active && result !== false) setPositions(result); if (active) setPositions(result);
}); });
return () => { return () => {
active = false; active = false;
...@@ -57,7 +57,6 @@ export default function AdvertListView() { ...@@ -57,7 +57,6 @@ export default function AdvertListView() {
const handleEdit = async (id: number) => { const handleEdit = async (id: number) => {
const advert = await getAdvertInfo(id); const advert = await getAdvertInfo(id);
if (advert === false) return;
setSelectedId(advert.id); setSelectedId(advert.id);
setIsAdd(false); setIsAdd(false);
setFormValues({ setFormValues({
......
export * from "./request/login"; import axios from "@/utils/axios";
const LOGIN_SUCCESS_MESSAGE = "OK";
export const login = async (params) => {
try {
const response = await axios.post("/user/login", params, { resolveBusinessError: true });
const data = response.data ?? {};
if (response.code === 200 && response.message === LOGIN_SUCCESS_MESSAGE && data.token) {
return { code: response.code, ...data };
}
return { code: response.code, msg: response.message || "登录失败" };
} catch (error) {
return { code: 0, msg: error?.message || "登录失败" };
}
};
const api = {
login: "/user/login",
getCode: "/user/login/verify",
};
export default api;
import axios from "@/utils/request.js";
import qs from "qs";
import api from "./login-api.js";
import { get } from "lodash-es";
import { message } from "antd";
const login = async (obj) => {
try {
const res = await axios.post(api.login, qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (msg === "Undefined index: verify") {
message.error("请先点击按钮进行验证");
return false;
}
if (code === 200) {
return {
code,
...data,
};
} else {
message.error(msg);
return {
msg,
};
}
} catch (error) {
console.error(error);
let msg = get(error.response, "data.msg", "");
if (msg) {
message.error(msg);
}
return false;
}
};
export { login };
const api = {
getCaptcha: "/users/generate_image_code", // 获取验证码 GET
sendSMS: "/docapi/users/send_sms", // 发送手机验证码
loginByPhone: "/docapi/users/phone_login", // 手机号码形式登录
loginByUsername: "/docapi/users/login", // 用户名密码登录
checkSSOLogin: "/user/checkSsoLogin", // sso 登录
};
export default api;
import axios from "@/utils/request";
import { message } from "antd";
import api from "./sso-api";
import { get } from "lodash-es";
import qs from "qs";
// 获取图形验证码
const getCaptcha = async (obj) => {
try {
const res = await axios.get(api.getCaptcha, obj);
const status = get(res, "status", 0);
const data = get(res, "data", "");
if (status === 200) {
return data;
}
} catch (error) {
console.error(error);
let msg = get(error.response, "data.msg", "");
if (msg) {
message.error(msg);
}
return false;
}
};
// 发送短信验证码
const sendSMS = async (data) => {
try {
const res = await axios.post(api.sendSMS, data);
const code = get(res, "data.code", 0);
const msg = get(res, "data.message", "发送失败");
if (code === 200) {
message.success("验证码发送成功!");
return true;
} else {
message.error(msg);
return false;
}
} catch (error) {
console.error(error);
let msg = get(error.response, "data.msg", "");
if (msg) {
message.error(msg);
}
return false;
}
};
// 用户名登录
const userNameLogin = async (obj) => {
try {
const res = await axios.post(api.loginByUsername, obj);
const code = get(res, "data.code", 0);
const msg = get(res, "data.message", "登录失败");
const data = get(res, "data.data", "");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
console.error(error);
let msg = get(error.response, "data.msg", "");
if (msg) {
message.error(msg);
}
return false;
}
};
// 手机号登录
const phoneLogin = async (obj) => {
try {
const res = await axios.post(api.loginByPhone, obj);
const code = get(res, "data.code", 0);
const msg = get(res, "data.message", "登录失败");
const data = get(res, "data.data", "");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
console.error(error);
let msg = get(error.response, "data.msg", "");
if (msg) {
message.error(msg);
}
return false;
}
};
const checkSSOLogin = async (obj) => {
try {
const res = await axios.post(api.checkSSOLogin, qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (msg === "Undefined index: verify") {
message.error("请先点击按钮进行验证");
return false;
}
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
console.error(error);
let msg = get(error.response, "data.msg", "");
if (msg) {
message.error(msg);
}
return false;
}
};
export { getCaptcha, sendSMS, userNameLogin, phoneLogin, checkSSOLogin };
...@@ -4,7 +4,8 @@ import { CloseOutlined, UserOutlined, LockOutlined } from "@ant-design/icons"; ...@@ -4,7 +4,8 @@ import { CloseOutlined, UserOutlined, LockOutlined } from "@ant-design/icons";
import { useNavigate } from "react-router"; import { useNavigate } from "react-router";
import { checkSSOLogin } from "../request/sso"; import { checkSSOLogin } from "@/api/base";
import { login } from "../api";
import "./LoginView.less"; import "./LoginView.less";
import loginBtn from "@/assets/images/loginBtn.png"; import loginBtn from "@/assets/images/loginBtn.png";
...@@ -33,7 +34,6 @@ import Icon20 from "@/assets/login/20.png"; ...@@ -33,7 +34,6 @@ import Icon20 from "@/assets/login/20.png";
import Icon21 from "@/assets/login/21.png"; import Icon21 from "@/assets/login/21.png";
import Icon22 from "@/assets/login/22.png"; import Icon22 from "@/assets/login/22.png";
import Icon23 from "@/assets/login/23.png"; import Icon23 from "@/assets/login/23.png";
import { login } from "../request/login";
import logo from "@/assets/images/icon_logo_login.png"; import logo from "@/assets/images/icon_logo_login.png";
import { RotateVerify } from "../../../utils/captcha"; import { RotateVerify } from "../../../utils/captcha";
......
import { message } from "antd"; import axios from "@/utils/axios";
import request from "@/utils/request";
import type { AuditQuery } from "./query"; import type { AuditQuery } from "./query";
async function post(path: string, data: Record<string, unknown>) { async function post(path: string, data: Record<string, unknown>) {
try { const response = await axios.post(path, data);
const response = (await request.post(path, new URLSearchParams(data as Record<string, string>).toString())) as { data?: { code?: number; data?: any; message?: string } }; return { data: response.data, msg: response.message || "" };
if (response.data?.code === 200) return { data: response.data.data, msg: response.data.message || "" };
message.error(response.data?.message || "数据获取失败!");
} catch {}
return false;
} }
export const getAuditList = async (query: AuditQuery) => (await post("/book/teacher/getList/examine", query))?.data || false; export const getAuditList = async (query: AuditQuery) => (await post("/book/teacher/getList/examine", query)).data;
export const getExamineList = async (id: string | number) => (await post("/book/teacher/getExamineList", { id }))?.data || false; export const getExamineList = async (id: string | number) => (await post("/book/teacher/getExamineList", { id })).data;
export const addExamine = (data: Record<string, unknown>) => post("/book/examine/add", data); export const addExamine = (data: Record<string, unknown>) => post("/book/examine/add", data);
import React, { useEffect, useState, useRef, useImperativeHandle, forwardRef } from "react"; import React, { useEffect, useState, useRef, useImperativeHandle, forwardRef } from "react";
import { Modal, Drawer, Tree, Spin, Space, Button, Input, Image } from "antd"; import { Modal, Drawer, Tree, Spin, Space, Button, Input, Image } from "antd";
import { CloseOutlined, LeftOutlined, BarsOutlined } from "@ant-design/icons"; import { CloseOutlined, LeftOutlined, BarsOutlined } from "@ant-design/icons";
import { getInfoByChapterId, getAllList } from "@/modules/books/management/chapters/request"; import { getInfoByChapterId, getAllList } from "@/modules/books/management/chapters/api";
import { getChapterTopic, expandReadInfo } from "@/common/wangeditor-customer/utils/request"; import { getChapterTopic, expandReadInfo } from "@/common/wangeditor-customer/utils/request";
import "@/common/wangeditor-customer/utils/iconfont"; import "@/common/wangeditor-customer/utils/iconfont";
import { import {
......
import { message } from "antd"; import axios, { notifySuccess } from "@/utils/axios";
import request from "@/utils/request";
import type { ClassifyQuery } from "./query"; import type { ClassifyQuery } from "./query";
async function post(path: string, data: Record<string, unknown>, notify = false) { async function post(path: string, data: Record<string, unknown>, notify = false) {
try { const response = await axios.post(path, data);
const response = (await request.post( if (notify) notifySuccess(response.message);
path, return response.data;
new URLSearchParams(data as Record<string, string>).toString(),
)) as { data?: { code?: number; data?: any; message?: string } };
if (response.data?.code === 200) {
if (notify) message.success(response.data.message);
return response.data.data;
}
message.error(response.data?.message || "数据获取失败!");
} catch {}
return false;
} }
export const getClassifyList = (query: ClassifyQuery) => post("/book/category/getList", query); export const getClassifyList = (query: ClassifyQuery) => post("/book/category/getList", query);
export const addCategory = (data: Record<string, unknown>) => export const addCategory = (data: Record<string, unknown>) =>
......
import { message } from "antd"; import axios, { notifySuccess } from "@/utils/axios";
import request from "@/utils/request";
import type { DiscussionQuery } from "./query"; import type { DiscussionQuery } from "./query";
async function post(path: string, data: Record<string, unknown>, notify = false) { async function post(path: string, data: Record<string, unknown>, notify = false) {
try { const response = await axios.post(path, data);
const r = (await request.post( if (notify) notifySuccess(response.message);
path, return response.data;
new URLSearchParams(data as Record<string, string>).toString(),
)) as { data?: { code?: number; data?: any; message?: string } };
if (r.data?.code === 200) {
if (notify) message.success(r.data.message);
return r.data.data;
}
message.error(r.data?.message || "数据获取失败!");
} catch {}
return false;
} }
export const getDiscussionList = (q: DiscussionQuery) => export const getDiscussionList = (q: DiscussionQuery) =>
post("/comment/comment/getAllCommentList", q); post("/comment/comment/getAllCommentList", q);
......
import { message } from "antd"; import axios, { notifySuccess } from "@/utils/axios";
import qs from "qs";
import request from "@/utils/request";
import type { LabelQuery } from "./query"; import type { LabelQuery } from "./query";
async function post(path: string, data: Record<string, unknown>, notify = false) { async function post(path: string, data: Record<string, unknown>, notify = false) {
try { const response = await axios.post(path, data);
const response = (await request.post(path, qs.stringify(data))) as { if (notify) notifySuccess(response.message);
data?: { code?: number; data?: any; message?: string }; return response.data;
};
if (response.data?.code === 200) {
if (notify) message.success(response.data.message);
return response.data.data;
}
message.error(response.data?.message || "数据获取失败!");
} catch {}
return false;
} }
export const getLabelList = (query: LabelQuery) => post("/book/label/getList", query); export const getLabelList = (query: LabelQuery) => post("/book/label/getList", query);
export const getAllBooks = () => post("/book/label/getAllBooks", {}); export const getAllBooks = () => post("/book/label/getAllBooks", {});
......
import { message } from "antd"; import { notifySuccess } from "@/utils/axios";
// @ts-expect-error The legacy workspace does not install the qs declaration package. import axios from "@/utils/axios";
import qs from "qs";
import request from "@/utils/request.js";
import legacyAxios from "@/utils/axios";
import type { ManagementQuery } from "./query"; import type { ManagementQuery } from "./query";
...@@ -35,35 +31,15 @@ export interface ImportBookValues { ...@@ -35,35 +31,15 @@ export interface ImportBookValues {
} }
type ApiParams = Record<string, unknown>; type ApiParams = Record<string, unknown>;
type ApiBody<T> = { code?: number; data?: T; message?: string }; async function getPayload<T>(url: string, params: ApiParams): Promise<T> {
const response = await axios.post(url, params);
async function getPayload<T>(url: string, params: ApiParams): Promise<T | false> { return response.data as T;
try {
const response = await request.post(url, qs.stringify(params));
const body = response.data as ApiBody<T>;
const text = body?.message ?? "数据获取失败!";
if (body?.code === 200) return (body.data ?? []) as T;
message.error(text);
return false;
} catch {
return false;
}
} }
async function mutate(url: string, params: ApiParams) { async function mutate(url: string, params: ApiParams) {
try { const response = await axios.post(url, params);
const response = await request.post(url, qs.stringify(params)); notifySuccess(response.message);
const body = response.data as ApiBody<unknown>; return true;
const text = body?.message ?? "数据获取失败!";
if (body?.code === 200) {
message.success(text);
return true;
}
message.error(text);
return false;
} catch {
return false;
}
} }
export async function getManagementList( export async function getManagementList(
...@@ -73,7 +49,6 @@ export async function getManagementList( ...@@ -73,7 +49,6 @@ export async function getManagementList(
"/book/teacher/getList", "/book/teacher/getList",
{ ...query }, { ...query },
); );
if (data === false) return false;
return { rows: data.list ?? [], total: data.total ?? 0 }; return { rows: data.list ?? [], total: data.total ?? 0 };
} }
...@@ -83,15 +58,15 @@ export function deleteManagementBook(id: number) { ...@@ -83,15 +58,15 @@ export function deleteManagementBook(id: number) {
// 编辑页仍沿用旧接口封装的返回值形状;保留在管理模块中,避免页面反向依赖旧目录。 // 编辑页仍沿用旧接口封装的返回值形状;保留在管理模块中,避免页面反向依赖旧目录。
export function getBook(params: ApiParams) { export function getBook(params: ApiParams) {
return legacyAxios.post("/api/book/teacher/getInfoById", params); return axios.post("/api/book/teacher/getInfoById", params);
} }
export function addBook(params: ApiParams) { export function addBook(params: ApiParams) {
return legacyAxios.post("/api/book/teacher/add", params); return axios.post("/api/book/teacher/add", params);
} }
export function updateBook(params: ApiParams) { export function updateBook(params: ApiParams) {
return legacyAxios.post("/api/book/teacher/edit", params); return axios.post("/api/book/teacher/edit", params);
} }
export function exportManagementBook(id: number) { export function exportManagementBook(id: number) {
...@@ -103,19 +78,9 @@ export function releaseManagementBook(id: number, releaseMess?: string) { ...@@ -103,19 +78,9 @@ export function releaseManagementBook(id: number, releaseMess?: string) {
} }
export async function importManagementBook(values: ImportBookValues) { export async function importManagementBook(values: ImportBookValues) {
try { const response = await axios.post("/book/teacher/import", values, {
const response = await request.post("/book/teacher/import", values, { headers: { "Content-Type": "multipart/form-data" },
headers: { "Content-Type": "multipart/form-data" }, });
}); notifySuccess(response.message);
const body = response.data as ApiBody<unknown>; return true;
const text = body?.message ?? "数据获取失败!";
if (body?.code === 200) {
message.success(text);
return true;
}
message.error(text);
return false;
} catch {
return false;
}
} }
import axios from "@/utils/axios"; import axios, { notifySuccess } from "@/utils/axios";
const getData = async (path, params) => (await axios.post(path, params)).data;
const mutate = async (path, params, notify = false) => {
const response = await axios.post(path, params);
if (notify) notifySuccess(response.message);
return true;
};
// 获取书籍详情 // 获取书籍详情
export function getBook(data) { export function getBook(data) {
...@@ -54,3 +61,26 @@ export function getTagList(params) { ...@@ -54,3 +61,26 @@ export function getTagList(params) {
export function bindTag(data) { export function bindTag(data) {
return axios.post("/api/resource/v1/course/course/tag-add-book", data); return axios.post("/api/resource/v1/course/course/tag-add-book", data);
} }
export const getUserInfo = (params) => getData("/user/user/getUserInfo", params);
export const getPowerByRoleId = (params) => getData("/user/role/getPowerByRoleId", params);
export const getAllList = async (params) => {
const response = await axios.post("/book/teacher/chapter/getAllList", params);
return { code: response.code, data: response.data };
};
export const chapterAdd = (params) => getData("/book/teacher/chapter/add", params);
export const getInfoById = (params) => getData("/book/teacher/chapter/getInfoById", params);
export const chapterEdit = (params) => mutate("/book/teacher/chapter/edit", params, true);
export const chapterDel = (params) => mutate("/book/teacher/chapter/del", params, true);
export const dragOrder = (params) => mutate("/book/teacher/chapter/dragOrder", params, true);
export const getInfoByChapterId = (params) => getData("/book/teacher/section/getInfoByChapterId", params);
export const sectionAdd = (params) => mutate("/book/teacher/section/add", params, true);
export const sectionEdit = (params) => mutate("/book/teacher/section/edit", params);
export const getQuestionList = (params) => getData("/book/chapter/question/getQuestionList", params);
export const questionDel = (params) => getData("/book/chapter/question/del", params);
export const questionAdd = (params) => getData("/book/chapter/question/add", params);
export const release = (params) => mutate("/book/teacher/release", params);
export const templateGetList = (params) => mutate("/book/template/getList", params);
export const templateImport = (params) => mutate("/book/template/import", params);
export const teacherImport = (params) => mutate("/book/teacher/import", params);
export const getRecordList = (params) => getData("/book/teacher/section/getRecordList", params);
...@@ -2,7 +2,7 @@ import { useState, useEffect, useRef } from "react"; ...@@ -2,7 +2,7 @@ import { useState, useEffect, useRef } from "react";
import { Form, Button, Space, Input } from "antd"; import { Form, Button, Space, Input } from "antd";
import { setTreeChapter } from "@/store/modules/user"; import { setTreeChapter } from "@/store/modules/user";
import { useDispatch } from "react-redux"; import { useDispatch } from "react-redux";
import { chapterEdit, chapterAdd, sectionAdd } from "../request"; import { chapterEdit, chapterAdd, sectionAdd } from "../api";
const EditChapterTitle = (props) => { const EditChapterTitle = (props) => {
const { const {
......
...@@ -25,7 +25,7 @@ import { ...@@ -25,7 +25,7 @@ import {
findTreeToIndex, findTreeToIndex,
findNodeById, findNodeById,
} from "@/utils/common"; } from "@/utils/common";
import { getAllList, getInfoByChapterId, sectionEdit, chapterDel, dragOrder } from "./request"; import { getAllList, getInfoByChapterId, sectionEdit, chapterDel, dragOrder } from "./api";
import "./index.less"; import "./index.less";
const Examine = () => { const Examine = () => {
...@@ -333,14 +333,14 @@ const Examine = () => { ...@@ -333,14 +333,14 @@ const Examine = () => {
{ key: "2", label: "添加子节" }, { key: "2", label: "添加子节" },
{ key: "7", label: "关联知识图谱" }, { key: "7", label: "关联知识图谱" },
{ key: "5", label: "设置编者" }, { key: "5", label: "设置编者" },
{ // {
key: "6", // key: "6",
label: "一键AI", // label: "一键AI",
children: [ // children: [
{ key: "61", label: "一键AI创作课件", disabled: true }, // { key: "61", label: "一键AI创作课件", disabled: true },
{ key: "62", label: "一键AI创作教案", disabled: true }, // { key: "62", label: "一键AI创作教案", disabled: true },
], // ],
}, // },
{ key: "3", label: "编辑" }, { key: "3", label: "编辑" },
{ key: "4", label: "删除" }, { key: "4", label: "删除" },
]; ];
......
import axios from "@/utils/request.js";
import qs from "qs";
import { get } from "lodash-es";
import { message } from "antd";
// 用户信息
const getUserInfo = async (obj) => {
try {
const res = await axios.post("/user/user/getUserInfo", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 获取角色已选权限
const getPowerByRoleId = async (obj) => {
try {
const res = await axios.post("/user/role/getPowerByRoleId", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 章节列表
const getAllList = async (obj) => {
try {
const res = await axios.post("/book/teacher/chapter/getAllList", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return {
code,
data,
};
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 添加章节
const chapterAdd = async (obj) => {
try {
const res = await axios.post("/book/teacher/chapter/add", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
// message.success('添加成功');
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 章节详情
const getInfoById = async (obj) => {
try {
const res = await axios.post("/book/teacher/chapter/getInfoById", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 修改章节
const chapterEdit = async (obj) => {
try {
const res = await axios.post("/book/teacher/chapter/edit", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
message.success(msg);
return true;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 删除章节
const chapterDel = async (obj) => {
try {
const res = await axios.post("/book/teacher/chapter/del", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
message.success(msg);
return true;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 拖拽章节排序
const dragOrder = async (obj) => {
try {
const res = await axios.post("/book/teacher/chapter/dragOrder", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
message.success(msg);
return true;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 获取章节内容
const getInfoByChapterId = async (obj) => {
try {
const res = await axios.post("/book/teacher/section/getInfoByChapterId", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 添加章节内容
const sectionAdd = async (obj) => {
try {
const res = await axios.post("/book/teacher/section/add", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
message.success(msg);
return true;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 修改章节内容
const sectionEdit = async (obj) => {
try {
const res = await axios.post("/book/teacher/section/edit", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
// message.success(msg);
return true;
} else {
message.error(msg);
return { code, msg, data };
}
} catch (error) {
return false;
}
};
// 获取章节的题库列表
const getQuestionList = async (obj) => {
try {
const res = await axios.post("/book/chapter/question/getQuestionList", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 移除课后题
const questionDel = async (obj) => {
try {
const res = await axios.post("/book/chapter/question/del", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 添加课后题
const questionAdd = async (obj) => {
try {
const res = await axios.post("/book/chapter/question/add", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 发布审核
const release = async (obj) => {
try {
const res = await axios.post("/book/teacher/release", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return true;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 模板列表
const templateGetList = async (obj) => {
try {
const res = await axios.post("/book/template/getList", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return true;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 模板导入
const templateImport = async (obj) => {
try {
const res = await axios.post("/book/template/import", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return true;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 书籍导入
const teacherImport = async (obj) => {
try {
const res = await axios.post("/book/teacher/import", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return true;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 保存历史记录
const getRecordList = async (obj) => {
try {
const res = await axios.post("/book/teacher/section/getRecordList", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
export {
getAllList,
chapterAdd,
getInfoById,
chapterEdit,
chapterDel,
dragOrder,
getInfoByChapterId,
sectionAdd,
sectionEdit,
getQuestionList,
questionDel,
questionAdd,
release,
templateGetList,
templateImport,
teacherImport,
getRecordList,
getPowerByRoleId,
getUserInfo,
};
...@@ -32,12 +32,8 @@ export function useManagementList() { ...@@ -32,12 +32,8 @@ export function useManagementList() {
setLoading(true); setLoading(true);
setError(null); setError(null);
try { try {
const result: ManagementListResult | false = await getManagementList(query); const result: ManagementListResult = await getManagementList(query);
if (currentRequest !== requestId.current) return; if (currentRequest !== requestId.current) return;
if (result === false) {
setError(new Error("数据获取失败!"));
return;
}
setRows(result.rows); setRows(result.rows);
setTotal(result.total); setTotal(result.total);
} catch (reason) { } catch (reason) {
......
...@@ -68,7 +68,7 @@ export default function ManagementListView() { ...@@ -68,7 +68,7 @@ export default function ManagementListView() {
setExporting(true); setExporting(true);
try { try {
const result = await exportManagementBook(selectedId); const result = await exportManagementBook(selectedId);
if (result === false || !result.name) return; if (!result.name) return;
await exportHtmlToWord(result.name, result.content ?? "", EXPORT_REMOVE_SELECTORS); await exportHtmlToWord(result.name, result.content ?? "", EXPORT_REMOVE_SELECTORS);
} catch (error) { } catch (error) {
console.error("导出Word失败", error); console.error("导出Word失败", error);
......
import { message } from "antd"; import axios, { notifySuccess } from "@/utils/axios";
// @ts-expect-error The legacy workspace does not install the qs declaration package.
import qs from "qs";
import request from "@/utils/request.js";
import type { OrdersQuery } from "./query"; import type { OrdersQuery } from "./query";
...@@ -56,27 +52,17 @@ export interface SalesStatisticsResult { ...@@ -56,27 +52,17 @@ export interface SalesStatisticsResult {
income: number | string; income: number | string;
} }
type ApiBody<T> = { code?: number; data?: T; message?: string };
type ApiParams = Record<string, unknown>; type ApiParams = Record<string, unknown>;
async function getPayload<T>(url: string, params?: ApiParams): Promise<T | false> { async function getPayload<T>(url: string, params?: ApiParams): Promise<T> {
try { const response = await axios.post(url, params);
const response = await request.post(url, qs.stringify(params)); return response.data as T;
const body = response.data as ApiBody<T>;
const text = body?.message ?? "数据获取失败!";
if (body?.code === 200) return (body.data ?? []) as T;
message.error(text);
return false;
} catch {
return false;
}
} }
export async function getOrders(query: OrdersQuery): Promise<OrdersListResult | false> { export async function getOrders(query: OrdersQuery): Promise<OrdersListResult> {
const data = await getPayload<{ list?: OrderRow[]; total?: number }>("/order/getOrderList", { const data = await getPayload<{ list?: OrderRow[]; total?: number }>("/order/getOrderList", {
...query, ...query,
}); });
if (data === false) return false;
return { rows: data.list ?? [], total: data.total ?? 0 }; return { rows: data.list ?? [], total: data.total ?? 0 };
} }
...@@ -85,17 +71,7 @@ export function getSalesStatistics() { ...@@ -85,17 +71,7 @@ export function getSalesStatistics() {
} }
export async function refundOrder(id: number, refund_reason?: string) { export async function refundOrder(id: number, refund_reason?: string) {
try { const response = await axios.post("/order/refund", { id, refund_reason });
const response = await request.post("/order/refund", qs.stringify({ id, refund_reason })); notifySuccess(response.message);
const body = response.data as ApiBody<unknown>; return true;
const text = body?.message ?? "数据获取失败!";
if (body?.code === 200) {
message.success(text);
return true;
}
message.error(text);
return false;
} catch {
return false;
}
} }
...@@ -32,12 +32,8 @@ export function useOrdersList() { ...@@ -32,12 +32,8 @@ export function useOrdersList() {
setLoading(true); setLoading(true);
setError(null); setError(null);
try { try {
const result: OrdersListResult | false = await getOrders(query); const result: OrdersListResult = await getOrders(query);
if (currentRequest !== requestId.current) return; if (currentRequest !== requestId.current) return;
if (result === false) {
setError(new Error("数据获取失败!"));
return;
}
setRows(result.rows); setRows(result.rows);
setTotal(result.total); setTotal(result.total);
} catch (reason) { } catch (reason) {
......
...@@ -13,8 +13,7 @@ export default function SalesStatisticsView() { ...@@ -13,8 +13,7 @@ export default function SalesStatisticsView() {
setLoading(true); setLoading(true);
setError(null); setError(null);
const result = await getSalesStatistics(); const result = await getSalesStatistics();
if (result === false) setError(new Error("数据获取失败!")); setData(result);
else setData(result);
setLoading(false); setLoading(false);
}, []); }, []);
......
import { message } from "antd"; import axios, { notifySuccess } from "@/utils/axios";
import request from "@/utils/request";
import type { QuestionBankQuery } from "./query"; import type { QuestionBankQuery } from "./query";
async function post(path: string, data: Record<string, unknown> = {}, notify = false) { async function post(path: string, data: Record<string, unknown> = {}, notify = false) {
try { const response = await axios.post(path, data);
const response = (await request.post( if (notify) notifySuccess(response.message);
path, return response.data;
new URLSearchParams(data as Record<string, string>).toString(),
)) as { data?: { code?: number; data?: any; message?: string } };
if (response.data?.code === 200) {
if (notify) message.success(response.data.message);
return response.data.data;
}
message.error(response.data?.message || "数据获取失败!");
} catch {}
return false;
} }
export const getQuestionList = (query: QuestionBankQuery) => post("/book/question/getList", query); export const getQuestionList = (query: QuestionBankQuery) => post("/book/question/getList", query);
...@@ -27,14 +17,10 @@ export const getQuestionTypes = () => post("/book/question/type/getList", { page ...@@ -27,14 +17,10 @@ export const getQuestionTypes = () => post("/book/question/type/getList", { page
export const getBookNames = () => post("book/teacher/getListAll"); export const getBookNames = () => post("book/teacher/getListAll");
export const getAliOssToken = () => post("/common/OssUpload/getUploadToken"); export const getAliOssToken = () => post("/common/OssUpload/getUploadToken");
export async function importQuestions(file: File) { export async function importQuestions(file: File) {
try { const form = new FormData();
const form = new FormData(); form.append("file", file);
form.append("file", file); const response = await axios.post("/book/question/import", form, {
const response = (await request.post("/book/question/import", form, { headers: { "Content-Type": "multipart/form-data" },
headers: { "Content-Type": "multipart/form-data" }, });
})) as { data?: { code?: number; data?: any; message?: string } }; return { msg: response.message, data: response.data };
if (response.data?.code === 200) return { msg: response.data.message, data: response.data.data };
message.error(response.data?.message || "数据获取失败!");
} catch {}
return false;
} }
import { message } from "antd"; import axios, { notifySuccess } from "@/utils/axios";
import request from "@/utils/request";
import type { SaleDiscussionQuery, SaleQuery } from "./query"; import type { SaleDiscussionQuery, SaleQuery } from "./query";
async function post(path: string, data: Record<string, unknown>, notify = false) { async function post(path: string, data: Record<string, unknown>, notify = false) {
try { const response = (await request.post(path, new URLSearchParams(data as Record<string, string>).toString())) as { data?: { code?: number; data?: any; message?: string } }; if (response.data?.code === 200) { if (notify) message.success(response.data.message); return response.data.data; } message.error(response.data?.message || "数据获取失败!"); } catch {} const response = await axios.post(path, data);
return false; if (notify) notifySuccess(response.message);
return response.data;
} }
export const getSaleList = (query: SaleQuery) => post("/book/book/getList", query); export const getSaleList = (query: SaleQuery) => post("/book/book/getList", query);
export const changeSaleStatus = (id: string | number, status: string) => post("/book/book/changeStatus", { id, status }, true); export const changeSaleStatus = (id: string | number, status: string) => post("/book/book/changeStatus", { id, status }, true);
...@@ -22,10 +22,10 @@ export const editBook = (data: Record<string, unknown>) => ...@@ -22,10 +22,10 @@ export const editBook = (data: Record<string, unknown>) =>
export const getCommentInfo = (data: Record<string, unknown>) => export const getCommentInfo = (data: Record<string, unknown>) =>
post("/comment/comment/getCommentInfo", data); post("/comment/comment/getCommentInfo", data);
export const commentDel = async (data: Record<string, unknown>) => { export const commentDel = async (data: Record<string, unknown>) => {
const result = await post("/comment/comment/del", data, true); await post("/comment/comment/del", data, true);
return result !== false; return true;
}; };
export const commentReply = async (data: Record<string, unknown>) => { export const commentReply = async (data: Record<string, unknown>) => {
const result = await post("/comment/comment/reply", data, true); await post("/comment/comment/reply", data, true);
return result !== false; return true;
}; };
import { message } from "antd"; import axios, { notifySuccess } from "@/utils/axios";
// @ts-expect-error The legacy workspace does not install the qs declaration package.
import qs from "qs";
import request from "@/utils/request.js";
import type { MemberLevelQuery } from "./query"; import type { MemberLevelQuery } from "./query";
...@@ -30,46 +26,24 @@ export interface MemberLevelSystemConfig { ...@@ -30,46 +26,24 @@ export interface MemberLevelSystemConfig {
type ApiParams = Record<string, unknown>; type ApiParams = Record<string, unknown>;
async function getPayload<T>(url: string, params: ApiParams): Promise<T | false> { async function getPayload<T>(url: string, params: ApiParams): Promise<T> {
try { const response = await axios.post(url, params);
const response = await request.post(url, qs.stringify(params)); return response.data as T;
const body = response.data as { code?: number; data?: T; message?: string };
const code = body?.code ?? 0;
const data = (body?.data ?? []) as T;
const text = body?.message ?? "数据获取失败!";
if (code === 200) return data;
message.error(text);
return false;
} catch {
return false;
}
} }
async function mutate(url: string, params: ApiParams) { async function mutate(url: string, params: ApiParams) {
try { const response = await axios.post(url, params);
const response = await request.post(url, qs.stringify(params)); notifySuccess(response.message);
const body = response.data as { code?: number; message?: string }; return true;
const code = body?.code ?? 0;
const text = body?.message ?? "数据获取失败!";
if (code === 200) {
message.success(text);
return true;
}
message.error(text);
return false;
} catch {
return false;
}
} }
export async function getMemberLevelList( export async function getMemberLevelList(
params: MemberLevelQuery, params: MemberLevelQuery,
): Promise<MemberLevelListResult | false> { ): Promise<MemberLevelListResult> {
const data = await getPayload<{ list?: MemberLevelRow[]; total?: number }>( const data = await getPayload<{ list?: MemberLevelRow[]; total?: number }>(
"/members/grade/getList", "/members/grade/getList",
{ ...params }, { ...params },
); );
if (data === false) return false;
return { rows: data.list ?? [], total: data.total ?? 0 }; return { rows: data.list ?? [], total: data.total ?? 0 };
} }
......
...@@ -33,12 +33,8 @@ export function useMemberLevelList() { ...@@ -33,12 +33,8 @@ export function useMemberLevelList() {
setLoading(true); setLoading(true);
setError(null); setError(null);
try { try {
const result: MemberLevelListResult | false = await getMemberLevelList(query); const result: MemberLevelListResult = await getMemberLevelList(query);
if (currentRequest !== requestId.current) return; if (currentRequest !== requestId.current) return;
if (result === false) {
setError(new Error("数据获取失败!"));
return;
}
setRows(result.rows); setRows(result.rows);
setTotal(result.total); setTotal(result.total);
} catch (reason) { } catch (reason) {
......
...@@ -42,7 +42,7 @@ export default function MemberLevelListView() { ...@@ -42,7 +42,7 @@ export default function MemberLevelListView() {
const loadValidity = useCallback(async () => { const loadValidity = useCallback(async () => {
const config = await getMemberLevelSystem(); const config = await getMemberLevelSystem();
if (config !== false) setValidityValue(config.set_value); setValidityValue(config.set_value);
}, []); }, []);
useEffect(() => { useEffect(() => {
...@@ -51,7 +51,6 @@ export default function MemberLevelListView() { ...@@ -51,7 +51,6 @@ export default function MemberLevelListView() {
const handleEdit = async (id: number) => { const handleEdit = async (id: number) => {
const level = await getMemberLevelInfo(id); const level = await getMemberLevelInfo(id);
if (level === false) return;
setSelectedId(level.id); setSelectedId(level.id);
setIsAdd(false); setIsAdd(false);
setInitialValues({ setInitialValues({
......
import { message } from "antd"; import axios, { notifySuccess } from "@/utils/axios";
import request from "@/utils/request";
import type { MemberQuery } from "./query"; import type { MemberQuery } from "./query";
async function post(path: string, data: Record<string, unknown>, notify = false) { async function post(path: string, data: Record<string, unknown>, notify = false) {
try { const response = await axios.post(path, data);
const response = (await request.post( if (notify) notifySuccess(response.message);
path, return response.data;
new URLSearchParams(data as Record<string, string>).toString(),
)) as {
data?: { code?: number; data?: any; message?: string };
};
if (response.data?.code === 200) {
if (notify) message.success(response.data.message);
return response.data.data;
}
message.error(response.data?.message || "数据获取失败!");
} catch {
return false;
}
return false;
} }
export const getMemberList = (query: MemberQuery) => post("/members/members/getList", query); export const getMemberList = (query: MemberQuery) => post("/members/members/getList", query);
...@@ -28,8 +14,16 @@ export const addMember = (data: Record<string, unknown>) => ...@@ -28,8 +14,16 @@ export const addMember = (data: Record<string, unknown>) =>
export const editMember = (data: Record<string, unknown>) => export const editMember = (data: Record<string, unknown>) =>
post("/members/members/edit", data, true); post("/members/members/edit", data, true);
export const deleteMember = (id: string | number) => post("/members/members/del", { id }, true); export const deleteMember = (id: string | number) => post("/members/members/del", { id }, true);
export const getOrders = (id: string | number) => post("/members/members/getOrdersList", { id });
export const getIntegralRecords = (id: string | number) => export type MemberRecordQuery = {
post("/members/members/getIntegralRecordList", { id }); id: string | number;
export const getCouponRecords = (id: string | number) => page: number;
post("/members/members/getCouponList", { id }); page_size: number;
};
export const getOrders = (query: MemberRecordQuery) =>
post("/members/members/getOrdersList", query);
export const getIntegralRecords = (query: MemberRecordQuery) =>
post("/members/members/getIntegralRecordList", query);
export const getCouponRecords = (query: MemberRecordQuery) =>
post("/members/members/getCouponList", query);
import { Segmented, Table } from "antd"; import { Segmented } from "antd";
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
import { useLocation } from "react-router"; import { useLocation } from "react-router";
import PaginationCom from "@/common/Pagination"; import type { ColumnsType } from "antd/es/table";
import { getCouponRecords, getIntegralRecords, getOrders } from "../api"; import { AppList } from "@/components/AppList";
import {
getCouponRecords,
getIntegralRecords,
getOrders,
type MemberRecordQuery,
} from "../api";
type RecordRow = Record<string, any>;
const records = { const records = {
1: { 1: {
...@@ -54,45 +62,52 @@ const records = { ...@@ -54,45 +62,52 @@ const records = {
{ title: "使用状态", dataIndex: "use_status_name" }, { title: "使用状态", dataIndex: "use_status_name" },
], ],
}, },
} as const; } as const satisfies Record<1 | 2 | 3, { load: (query: MemberRecordQuery) => Promise<any>; columns: ColumnsType<RecordRow> }>;
function RecordTable({ type, id }: { type: 1 | 2 | 3; id: string | number }) { function RecordTable({ type, id }: { type: 1 | 2 | 3; id: string | number }) {
const [rows, setRows] = useState<any[]>([]); const [rows, setRows] = useState<RecordRow[]>([]);
const [total, setTotal] = useState(type === 2 ? 4 : 0); const [total, setTotal] = useState(0);
const [page, setPage] = useState(1); const [page, setPage] = useState(1);
const [pageSize, setPageSize] = useState(type === 2 ? 2 : 10); const [pageSize, setPageSize] = useState(10);
const [loading, setLoading] = useState(true); const [loading, setLoading] = useState(true);
const [error, setError] = useState<Error | null>(null);
const init = async () => { const init = async () => {
setLoading(true); setLoading(true);
const result: any = await records[type].load(id); setError(null);
if (result) { try {
const result = await records[type].load({ id, page, page_size: pageSize });
setRows(result.list || []); setRows(result.list || []);
setTotal(result.total || 0); setTotal(result.total || 0);
} catch (reason) {
setError(reason instanceof Error ? reason : new Error("记录加载失败"));
} finally {
setLoading(false);
} }
setLoading(false);
}; };
useEffect(() => { useEffect(() => {
void init(); void init();
}, [id, type]); }, [id, type, page, pageSize]);
return ( return (
<div> <AppList<RecordRow>
<Table rowKey={(row) => row.ID || row.id || `${row.coupon_id}-${row.create_time}`}
columns={records[type].columns as any} columns={records[type].columns}
rowKey={(row: any) => row.ID || row.id} data={{ rows, total, loading, error }}
dataSource={rows} pagination={{
loading={loading} page,
pagination={false} pageSize,
scroll={type === 3 ? { y: 600, x: true } : undefined} pageSizeOptions: [10, 20, 30, 40],
/> onChange: setPage,
<br /> onPageSizeChange: (nextPageSize) => {
<PaginationCom setPage(1);
total={total} setPageSize(nextPageSize);
page_size={pageSize} },
setpage_size={setPageSize} }}
page={page} onRetry={init}
setPage={setPage} tableProps={{ scroll: type === 3 ? { y: 600, x: true } : undefined }}
init={init} />
/>
</div>
); );
} }
export default function MemberDetailView() { export default function MemberDetailView() {
...@@ -111,7 +126,7 @@ export default function MemberDetailView() { ...@@ -111,7 +126,7 @@ export default function MemberDetailView() {
onChange={(value) => setCurrent(value as 1 | 2 | 3)} onChange={(value) => setCurrent(value as 1 | 2 | 3)}
style={{ marginBottom: 20 }} style={{ marginBottom: 20 }}
/> />
{id ? <RecordTable type={current} id={id} /> : null} {id ? <RecordTable key={current} type={current} id={id} /> : null}
</div> </div>
); );
} }
export * from './request.js' import axios, { notifySuccess } from "@/utils/axios";
const getData = async (path, params) => (await axios.post(path, params)).data;
const saveData = async (path, params) => {
const response = await axios.post(path, params);
notifySuccess(response.message);
return response.data;
};
export const getList = (params) => getData("/system/version/getList", params);
export const addVersion = (params) => saveData("/system/version/add", params);
export const infoVersion = (params) => getData("/system/version/getInfoById", params);
export const editVersion = (params) => saveData("/system/version/edit", params);
export const delVersion = (params) => saveData("/system/version/del", params);
import axios from '@/utils/request.js';
import qs from "qs";
import { get } from "lodash-es";
import { message } from "antd";
// 版本列表
const getList = async (obj) => {
try {
const res = await axios.post("/system/version/getList", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 添加
const addVersion = async (obj) => {
try {
const res = await axios.post("/system/version/add", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
message.success(msg);
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 详情
const infoVersion = async (obj) => {
try {
const res = await axios.post("/system/version/getInfoById", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 修改
const editVersion = async (obj) => {
try {
const res = await axios.post("/system/version/edit", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
message.success(msg);
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 删除
const delVersion = async (obj) => {
try {
const res = await axios.post("/system/version/del", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
export { getList, addVersion, infoVersion, editVersion, delVersion };
export * from './request.js' import axios, { notifySuccess } from "@/utils/axios";
import endpoints from "./endpoints.js";
const getData = async (path, params) => (await axios.post(path, params)).data;
const mutate = async (path, params, notify = false) => {
const response = await axios.post(path, params);
if (notify) notifySuccess(response.message);
return true;
};
export const getAppList = (params) => getData(endpoints.getAppList, params);
export const addApp = (params) => mutate(endpoints.addApp, params, true);
export const getAppInfo = (params) => getData(endpoints.getAppInfo, params);
export const editApp = (params) => getData(endpoints.editApp, params);
export const changeStatus = (params) => mutate(endpoints.changeStatus, params);
export const delApp = (params) => mutate(endpoints.delApp, params, true);
import axios from "@/utils/request.js";
import qs from "qs";
import api from "./endpoints.js";
import { get } from "lodash-es";
import { message } from "antd";
// 应用管理列表
const getAppList = async (obj) => {
try {
const res = await axios.post(api.getAppList, qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 添加应用
const addApp = async (obj) => {
try {
const res = await axios.post(api.addApp, qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
message.success(msg);
return true;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 获取应用详情
const getAppInfo = async (obj) => {
try {
const res = await axios.post(api.getAppInfo, qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 应用编辑
const editApp = async (obj) => {
try {
const res = await axios.post(api.editApp, qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 启用/停用
const changeStatus = async (obj) => {
try {
const res = await axios.post(api.changeStatus, qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return true;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 删除应用
const delApp = async (obj) => {
try {
const res = await axios.post(api.delApp, qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
message.success(msg);
return true;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
export { getAppList, addApp, getAppInfo, editApp, changeStatus, delApp };
import { message } from "antd"; import { message } from "antd";
import axios from "@/utils/axios"; import axios from "@/utils/axios";
import legacyRequest from "@/utils/request";
import type { CouponQuery } from "./query"; import type { CouponQuery } from "./query";
...@@ -61,37 +60,17 @@ export function addCouponRecord(data: object) { ...@@ -61,37 +60,17 @@ export function addCouponRecord(data: object) {
} }
async function legacyPost(path: string, data: object) { async function legacyPost(path: string, data: object) {
try { const response = await axios.post(path, data);
const response = (await legacyRequest.post( return { payload: response.data, message: response.message };
path,
new URLSearchParams(data as Record<string, string>).toString(),
)) as { data?: { code?: number; data?: unknown; message?: string } };
const code = response.data?.code ?? 0;
const payload = response.data?.data ?? [];
const responseMessage = response.data?.message ?? "数据获取失败!";
if (code === 200) {
return { payload, message: responseMessage };
}
message.error(responseMessage);
return false;
} catch {
return false;
}
} }
export async function getCouponConfig() { export async function getCouponConfig() {
const result = await legacyPost("/system/config/getCoupon", {}); const result = await legacyPost("/system/config/getCoupon", {});
return result ? (result.payload as { coupon_switch?: string }) : false; return result.payload as { coupon_switch?: string };
} }
export async function setCouponConfig(data: { coupon_switch: "0" | "1" }) { export async function setCouponConfig(data: { coupon_switch: "0" | "1" }) {
const result = await legacyPost("/system/config/couponEdit", data); const result = await legacyPost("/system/config/couponEdit", data);
if (!result) {
return false;
}
message.success(result.message); message.success(result.message);
return true; return true;
} }
import axios from '@/utils/request.js'; import axios from "@/utils/axios";
import qs from "qs";
import { message } from "antd"; import { message } from "antd";
import { get } from "lodash-es";
// 获取列表 // 获取列表
const getList = async (obj) => { export const getList = async (obj) => {
try { const res = await axios.post("/system/app/help/getList", obj);
const res = await axios.post("/system/app/help/getList", qs.stringify(obj)); return res.data;
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return error;
}
}; };
// 添加帮助 // 添加帮助
const addHelp = async (obj) => { export const addHelp = async (obj) => {
try { const res = await axios.post("/system/app/help/add", obj);
const res = await axios.post("/system/app/help/add", qs.stringify(obj)); message.success(res.message);
const code = get(res, "data.code", 0); return true;
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
message.success(msg);
return true;
} else {
message.error(msg);
return false;
}
} catch (error) {
return error;
}
}; };
// 获取帮助详情 // 获取帮助详情
const HelpInfo = async (obj) => { export const HelpInfo = async (obj) => {
try { const res = await axios.post("/system/app/help/getInfoById", obj);
const res = await axios.post("/system/app/help/getInfoById", qs.stringify(obj)); return res.data;
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return error;
}
}; };
// 修改 // 修改
const editHelp = async (obj) => { export const editHelp = async (obj) => {
try { const res = await axios.post("/system/app/help/edit", obj);
const res = await axios.post("/system/app/help/edit", qs.stringify(obj)); message.success(res.message);
const code = get(res, "data.code", 0); return res.data;
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
message.success(msg);
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return error;
}
}; };
// 修改 // 修改
const editPreview = async (obj) => { export const editPreview = async (obj) => {
try { const res = await axios.post("/system/app/help/edit", obj);
const res = await axios.post("/system/app/help/edit", qs.stringify(obj)); return res.data;
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return error;
}
}; };
// 删除 // 删除
const delHelp = async (obj) => { export const delHelp = async (obj) => {
try { const res = await axios.post("/system/app/help/del", obj);
const res = await axios.post("/system/app/help/del", qs.stringify(obj)); message.success(res.message);
const code = get(res, "data.code", 0); return true;
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
message.success(msg);
return true;
} else {
message.error(msg);
return false;
}
} catch (error) {
return error;
}
}; };
export { getList, addHelp, HelpInfo, editHelp, delHelp, editPreview };
import { message } from "antd"; import axios, { notifySuccess } from "@/utils/axios";
// @ts-expect-error The legacy workspace does not install the qs declaration package.
import qs from "qs";
import request from "@/utils/request.js";
export interface PersonalizedSettings { export interface PersonalizedSettings {
teacher_divide?: string | number; teacher_divide?: string | number;
...@@ -10,37 +6,13 @@ export interface PersonalizedSettings { ...@@ -10,37 +6,13 @@ export interface PersonalizedSettings {
comments_need_approval?: "" | "0" | "1"; comments_need_approval?: "" | "0" | "1";
} }
type ApiBody<T> = { export async function getPersonalizedSettings(): Promise<PersonalizedSettings> {
code?: number; const response = await axios.post("/system/config/getSystem");
data?: T; return response.data ?? {};
message?: string;
};
export async function getPersonalizedSettings(): Promise<PersonalizedSettings | false> {
try {
const response = await request.post("/system/config/getSystem", qs.stringify(undefined));
const body = response.data as ApiBody<PersonalizedSettings>;
const text = body?.message ?? "数据获取失败!";
if (body?.code === 200) return body.data ?? {};
message.error(text);
return false;
} catch {
return false;
}
} }
export async function savePersonalizedSettings(values: PersonalizedSettings) { export async function savePersonalizedSettings(values: PersonalizedSettings) {
try { const response = await axios.post("/system/config/systemEdit", values);
const response = await request.post("/system/config/systemEdit", qs.stringify(values)); notifySuccess(response.message);
const body = response.data as ApiBody<unknown>; return true;
const text = body?.message ?? "数据获取失败!";
if (body?.code === 200) {
message.success(text);
return true;
}
message.error(text);
return false;
} catch {
return false;
}
} }
...@@ -14,7 +14,7 @@ export default function PersonalizedSettingsView() { ...@@ -14,7 +14,7 @@ export default function PersonalizedSettingsView() {
const load = useCallback(async () => { const load = useCallback(async () => {
setLoading(true); setLoading(true);
const result = await getPersonalizedSettings(); const result = await getPersonalizedSettings();
if (result !== false) setValues(result); setValues(result);
setLoading(false); setLoading(false);
}, []); }, []);
......
import { message } from "antd"; import { message } from "antd";
// @ts-expect-error The legacy workspace does not install the qs declaration package. import axios, { notifySuccess } from "@/utils/axios";
import qs from "qs";
import request from "@/utils/request.js";
export interface PointSettings { export interface PointSettings {
integral_switch?: string | number; integral_switch?: string | number;
...@@ -32,79 +29,36 @@ interface RechargeResult { ...@@ -32,79 +29,36 @@ interface RechargeResult {
err?: RechargeMessageGroup; err?: RechargeMessageGroup;
} }
type ApiBody<T> = { export async function getPointSettings(): Promise<PointSettings> {
code?: number; const response = await axios.post("/system/config/getIntegral");
data?: T; return response.data ?? {};
message?: string;
};
export async function getPointSettings(): Promise<PointSettings | false> {
try {
const response = await request.post("/system/config/getIntegral", qs.stringify(undefined));
const body = response.data as ApiBody<PointSettings>;
const text = body?.message ?? "数据获取失败!";
if (body?.code === 200) return body.data ?? {};
message.error(text);
return false;
} catch {
return false;
}
} }
export async function setPointSwitch(integralSwitch: "0" | "1") { export async function setPointSwitch(integralSwitch: "0" | "1") {
try { await axios.post("/system/config/integralSet", { integral_switch: integralSwitch });
const response = await request.post( return true;
"/system/config/integralSet",
qs.stringify({ integral_switch: integralSwitch }),
);
const body = response.data as ApiBody<unknown>;
if (body?.code === 200) return true;
message.error(body?.message ?? "数据获取失败!");
return false;
} catch {
return false;
}
} }
export async function savePointSettings(values: PointSettingsFormValues) { export async function savePointSettings(values: PointSettingsFormValues) {
try { const response = await axios.post("/system/config/integralEdit", values);
const response = await request.post("/system/config/integralEdit", qs.stringify(values)); notifySuccess(response.message);
const body = response.data as ApiBody<unknown>; return true;
const text = body?.message ?? "数据获取失败!";
if (body?.code === 200) {
message.success(text);
return true;
}
message.error(text);
return false;
} catch {
return false;
}
} }
export async function rechargePoints(values: RechargeFormValues) { export async function rechargePoints(values: RechargeFormValues) {
try { const response = await axios.post("/members/integral/add", values);
const response = await request.post("/members/integral/add", qs.stringify(values)); const data = response.data as RechargeResult;
const body = response.data as ApiBody<RechargeResult>; const success = data?.suc ?? {};
if (body?.code === 3000) { const failure = data?.err ?? {};
message.warning("优惠券已过期"); if (failure.msg === " 手机号:" && success.title && !success.title.includes("充值成功(0)")) {
return true; if (success.msg !== "") message.success(`${success.msg}充值成功`, 10);
}
const success = body?.data?.suc ?? {};
const failure = body?.data?.err ?? {};
if (failure.msg === " 手机号:" && success.title && !success.title.includes("充值成功(0)")) {
if (success.msg !== "") message.success(`${success.msg}充值成功`, 10);
return true;
}
if (success.title && !success.title.includes("充值成功(0)") && success.msg !== "") {
message.success(`${success.msg}充值成功`, 10);
}
if (failure.title && !failure.title.includes("充值失败(0)") && failure.msg !== "") {
message.error(`${failure.msg}充值失败`, 10);
}
return true; return true;
} catch {
return false;
} }
if (success.title && !success.title.includes("充值成功(0)") && success.msg !== "") {
message.success(`${success.msg}充值成功`, 10);
}
if (failure.title && !failure.title.includes("充值失败(0)") && failure.msg !== "") {
message.error(`${failure.msg}充值失败`, 10);
}
return true;
} }
...@@ -29,10 +29,8 @@ export default function PointManagementView() { ...@@ -29,10 +29,8 @@ export default function PointManagementView() {
const load = useCallback(async () => { const load = useCallback(async () => {
setLoading(true); setLoading(true);
const result = await getPointSettings(); const result = await getPointSettings();
if (result !== false) { setSettings(result);
setSettings(result); setIntegralEnabled(String(result.integral_switch) !== "0");
setIntegralEnabled(String(result.integral_switch) !== "0");
}
setLoading(false); setLoading(false);
}, []); }, []);
......
export * from './request.js' import axios, { notifySuccess } from "@/utils/axios";
const getData = async (path, params) => (await axios.post(path, params)).data;
const mutate = async (path, params, notify = false) => {
const response = await axios.post(path, params);
if (notify) notifySuccess(response.message);
return true;
};
export const getList = (params) => getData("/system/sensitive/words/getList", params);
export const addWords = (params) => mutate("/system/sensitive/words/add", params, true);
export const editWords = (params) => mutate("/system/sensitive/words/edit", params, true);
export const delWords = (params) => mutate("/system/sensitive/words/del", params);
export const infoWords = (params) => getData("/system/sensitive/words/getInfoById", params);
export const importWords = async (params) => {
const response = await axios.post("/system/sensitive/words/import", params);
return { msg: response.message, err: response.data?.err };
};
import axios from '@/utils/request.js';
import qs from "qs";
import { message } from "antd";
import { get } from "lodash-es";
// 敏感词
// 获取列表
const getList = async (obj) => {
try {
const res = await axios.post("/system/sensitive/words/getList", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return error;
}
};
// 添加
const addWords = async (obj) => {
try {
const res = await axios.post("/system/sensitive/words/add", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
message.success(msg);
return true;
} else {
message.error(msg);
return false;
}
} catch (error) {
return error;
}
};
// 修改
const editWords = async (obj) => {
try {
const res = await axios.post("/system/sensitive/words/edit", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
message.success(msg);
return true;
} else {
message.error(msg);
return false;
}
} catch (error) {
return error;
}
};
// 删除
const delWords = async (obj) => {
try {
const res = await axios.post("/system/sensitive/words/del", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
// message.success(msg)
return true;
} else {
message.error(msg);
return false;
}
} catch (error) {
return error;
}
};
// 详情
const infoWords = async (obj) => {
try {
const res = await axios.post("/system/sensitive/words/getInfoById", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
message.success(msg);
return true;
} else {
message.error(msg);
return false;
}
} catch (error) {
return error;
}
};
// 导入
const importWords = async (obj) => {
try {
const res = await axios.post("/system/sensitive/words/import", obj, {
headers: {
"Content-Type": " multipart/form-data",
},
});
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return { msg, err: data.err };
} else {
message.error(msg);
return false;
}
} catch (error) {
return error;
}
};
export { getList, addWords, importWords, editWords, delWords, infoWords };
import axios from "@/utils/request.js";
import qs from "qs";
import { get } from "lodash-es";
import { message } from "antd";
// 用户信息
const getUserInfo = async (obj) => {
try {
const res = await axios.post("/user/user/getUserInfo", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 获取角色已选权限
const getPowerByRoleId = async (obj) => {
try {
const res = await axios.post("/user/role/getPowerByRoleId", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 章节列表
const getAllList = async (obj) => {
try {
const res = await axios.post("/book/teacher/chapter/getAllList", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return {
code,
data,
};
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 添加章节
const chapterAdd = async (obj) => {
try {
const res = await axios.post("/book/teacher/chapter/add", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
// message.success('添加成功');
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 章节详情
const getInfoById = async (obj) => {
try {
const res = await axios.post("/book/teacher/chapter/getInfoById", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 修改章节
const chapterEdit = async (obj) => {
try {
const res = await axios.post("/book/teacher/chapter/edit", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
message.success(msg);
return true;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 删除章节
const chapterDel = async (obj) => {
try {
const res = await axios.post("/book/teacher/chapter/del", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
message.success(msg);
return true;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 拖拽章节排序
const dragOrder = async (obj) => {
try {
const res = await axios.post("/book/teacher/chapter/dragOrder", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
message.success(msg);
return true;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 获取章节内容
const getInfoByChapterId = async (obj) => {
try {
const res = await axios.post("/book/teacher/section/getInfoByChapterId", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 添加章节内容
const sectionAdd = async (obj) => {
try {
const res = await axios.post("/book/teacher/section/add", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
message.success(msg);
return true;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 修改章节内容
const sectionEdit = async (obj) => {
try {
const res = await axios.post("/book/teacher/section/edit", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
// message.success(msg);
return true;
} else {
message.error(msg);
return { code, msg, data };
}
} catch (error) {
return false;
}
};
// 获取章节的题库列表
const getQuestionList = async (obj) => {
try {
const res = await axios.post("/book/chapter/question/getQuestionList", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 移除课后题
const questionDel = async (obj) => {
try {
const res = await axios.post("/book/chapter/question/del", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 添加课后题
const questionAdd = async (obj) => {
try {
const res = await axios.post("/book/chapter/question/add", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 发布审核
const release = async (obj) => {
try {
const res = await axios.post("/book/teacher/release", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return true;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 模板列表
const templateGetList = async (obj) => {
try {
const res = await axios.post("/book/template/getList", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return true;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 模板导入
const templateImport = async (obj) => {
try {
const res = await axios.post("/book/template/import", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return true;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 书籍导入
const teacherImport = async (obj) => {
try {
const res = await axios.post("/book/teacher/import", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return true;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 保存历史记录
const getRecordList = async (obj) => {
try {
const res = await axios.post("/book/teacher/section/getRecordList", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
export {
getAllList,
chapterAdd,
getInfoById,
chapterEdit,
chapterDel,
dragOrder,
getInfoByChapterId,
sectionAdd,
sectionEdit,
getQuestionList,
questionDel,
questionAdd,
release,
templateGetList,
templateImport,
teacherImport,
getRecordList,
getPowerByRoleId,
getUserInfo,
};
...@@ -22,7 +22,13 @@ import { ...@@ -22,7 +22,13 @@ import {
findTreeToIndex, findTreeToIndex,
findNodeById, findNodeById,
} from "@/utils/common"; } from "@/utils/common";
import { getAllList, getInfoByChapterId, sectionEdit, chapterDel, dragOrder } from "../request"; import {
getAllList,
getInfoByChapterId,
sectionEdit,
chapterDel,
dragOrder,
} from "@/modules/books/management/chapters/api.js";
import "./StudentBookView.less"; import "./StudentBookView.less";
const Examine = () => { const Examine = () => {
......
import { message } from 'antd' import axios, { notifySuccess } from '@/utils/axios'
import { get } from 'lodash-es'
import qs from 'qs'
import axios from '@/utils/request.js'
async function request( async function request(
path: string, path: string,
payload: Record<string, unknown>, payload: Record<string, unknown>,
{ success = false, returnData = false }: { success?: boolean; returnData?: boolean } = {}, { success = false, returnData = false }: { success?: boolean; returnData?: boolean } = {},
) { ) {
try { const response = await axios.post(path, payload)
const response = await axios.post(path, qs.stringify(payload)) if (success) notifySuccess(response.message)
const code = get(response, 'data.code', 0) return returnData ? response.data : true
const data = get(response, 'data.data', [])
const text = get(response, 'data.message', '数据获取失败!')
if (code !== 200) {
message.error(text)
return false
}
if (success) message.success(text)
return returnData ? data : true
} catch {
return false
}
} }
export const getTeacherList = (payload: Record<string, unknown>) => export const getTeacherList = (payload: Record<string, unknown>) =>
......
import axios from "axios"; import axios, { type AxiosRequestConfig, type AxiosResponse, type InternalAxiosRequestConfig } from "axios";
import md5 from "js-md5"; import md5 from "js-md5";
import qs from "qs"; import { message, Modal, notification } from "antd";
import { Modal, notification } from "antd";
import { ADMIN_LOGIN_PATH, normalizeAdminApiPath } from "@/utils/adminPaths.js"; import { ADMIN_LOGIN_PATH, normalizeAdminApiPath } from "@/utils/adminPaths.js";
// import { sm4 as Sm4js } from 'evit-gm-crypt'
// const sm4 = new Sm4js({ export interface ApiResponse<T = unknown> {
// key: 'XDXDXU_ZIJING_01', code: number;
// mode: 'cbc', message?: string;
// iv: 'IVIVIV_ZHIXUE_01', data: T;
// cipherType: 'base64' }
// })
export interface ApiRequestConfig extends AxiosRequestConfig {
silentBusinessError?: boolean;
resolveBusinessError?: boolean;
}
export function notifySuccess(text?: string): void {
if (text && text !== "OK") message.success(text);
}
interface ApiClient {
get<T = any>(url: string, config?: ApiRequestConfig): Promise<ApiResponse<T>>;
post<T = any>(url: string, data?: unknown, config?: ApiRequestConfig): Promise<ApiResponse<T>>;
}
function getToken() { function getToken(): string {
return window.localStorage.getItem("kiwi.token") ? window.localStorage.getItem("kiwi.token") : ""; return window.localStorage.getItem("kiwi.token") ?? "";
} }
function showLoginModal() { function showLoginModal(): void {
Modal.warning({ Modal.warning({
title: "登录状态已过期,请重新登录", title: "登录状态已过期,请重新登录",
onOk() { onOk() {
...@@ -26,86 +38,95 @@ function showLoginModal() { ...@@ -26,86 +38,95 @@ function showLoginModal() {
}); });
} }
// 排序 function alphabeticalSort(a: string, b: string): number {
function alphabeticalSort(a, b) {
return a.localeCompare(b); return a.localeCompare(b);
} }
const httpRequest = axios.create({ function serializeSignValue(value: unknown): string {
baseURL: import.meta.env.VITE_API_PREFIX, if (value !== null && typeof value === "object") {
return JSON.stringify(value);
}
return String(value ?? "");
}
function getSignData(data: unknown): Record<string, unknown> {
if (data instanceof FormData) {
const values: Record<string, unknown> = {};
data.forEach((value, key) => {
if (value instanceof File) return;
const previous = values[key];
values[key] = previous === undefined ? value : [...(Array.isArray(previous) ? previous : [previous]), value];
});
return values;
}
return data && typeof data === "object" ? (data as Record<string, unknown>) : {};
}
const httpRequest: any = axios.create({
baseURL: (import.meta as ImportMeta & { env: { VITE_API_PREFIX?: string } }).env.VITE_API_PREFIX,
withCredentials: true, withCredentials: true,
}); });
// 请求拦截器
httpRequest.interceptors.request.use( httpRequest.interceptors.request.use(
(config) => { (config: InternalAxiosRequestConfig) => {
config.url = normalizeAdminApiPath(config.url); config.url = normalizeAdminApiPath(config.url);
const token = getToken(); const token = getToken();
// 应用设置
const appId = "TzEU5jPk2tu80266"; const appId = "TzEU5jPk2tu80266";
const appSecret = "0a006048a4480481b18fef1405120b83"; const appSecret = "0a006048a4480481b18fef1405120b83";
const timestamp = Math.floor(Date.now() / 1000); const timestamp = Math.floor(Date.now() / 1000);
const requestData = getSignData(config.data);
const signData = { const signData = {
...config.data, ...requestData,
appId, appId,
appSecret, appSecret,
timestamp, timestamp,
token, token,
url: config.url, url: config.url,
}; };
const signStr = Object.entries(signData)
.sort(([keyA], [keyB]) => alphabeticalSort(keyA, keyB))
.map(([key, value]) => `${key}=${serializeSignValue(value)}`)
.join("&");
const hash = md5 as unknown as (value: string) => string;
const sign = hash(hash(`${signStr}&4F6g4Y6b5L4R9`));
const signStr = qs.stringify(signData, { sort: alphabeticalSort }); config.headers.set({
const salt = "&4F6g4Y6b5L4R9";
const sign = md5(md5(signStr + salt));
const defaultHeaders = {
Authorization: token, Authorization: token,
AppId: appId, AppId: appId,
AppSecret: appSecret, AppSecret: appSecret,
Timestamp: timestamp, Timestamp: timestamp,
Sign: sign, Sign: sign,
}; });
config.headers = { ...config.headers, ...defaultHeaders };
// if (config.data && config.headers['Content-Type'] !== 'multipart/form-data' && import.meta.env.PROD) {
// // console.log({ ...config.data, expire: timestamp + 60 })
// config.data = { data: sm4.encrypt(JSON.stringify({ ...config.data, expire: timestamp + 60 })) }
// }
return config; return config;
}, },
(error) => { (error: unknown) => Promise.reject(error),
return Promise.reject(error);
},
); );
// 响应拦截器
httpRequest.interceptors.response.use( httpRequest.interceptors.response.use(
(response) => { (response: AxiosResponse<ApiResponse>) => {
const { data } = response; const { data } = response;
if (data.code === 401 || data.code === 403) { if (data.code === 401 || data.code === 403) {
if (location.pathname !== ADMIN_LOGIN_PATH) { if (location.pathname !== ADMIN_LOGIN_PATH) showLoginModal();
showLoginModal();
}
return Promise.reject(data); return Promise.reject(data);
} }
if (data.code !== 200 && data.code !== 0) { if (data.code !== 200) {
if (response.config.resolveBusinessError) return data;
if (response.config.silentBusinessError) return Promise.reject(data);
notification.error({ message: data.message || "请求错误" }); notification.error({ message: data.message || "请求错误" });
return Promise.reject(data); return Promise.reject(data);
} }
return data; return data;
}, },
(error) => { (error: { response?: AxiosResponse<ApiResponse> }) => {
if (error.response) { if (error.response) {
const { status, data = {} } = error.response; const { status, data } = error.response;
if (status === 401 || status === 403) { if (status === 401 || status === 403) {
showLoginModal(); showLoginModal();
} else { } else {
notification.error({ message: data.message || "请求错误" }); notification.error({ message: data?.message || "请求错误" });
console.error(`${status}: ${data.message}`); console.error(`${status}: ${data?.message}`);
} }
} else { } else {
console.log(error); console.log(error);
...@@ -114,4 +135,4 @@ httpRequest.interceptors.response.use( ...@@ -114,4 +135,4 @@ httpRequest.interceptors.response.use(
}, },
); );
export default httpRequest; export default httpRequest as ApiClient;
import $ from "jquery"; import $ from "jquery";
import axios from "@/utils/request.js"; import axios from "@/utils/axios";
import qs from "qs";
import { message } from "antd"; import { message } from "antd";
let RotateVerify; // 声明 RotateVerify 变量 let RotateVerify; // 声明 RotateVerify 变量
...@@ -79,15 +78,16 @@ let RotateVerify; // 声明 RotateVerify 变量 ...@@ -79,15 +78,16 @@ let RotateVerify; // 声明 RotateVerify 变量
axios axios
.post( .post(
this.settings.initUrl, this.settings.initUrl,
qs.stringify({ {
drag_wrap: this.$slideDragWrap.width(), drag_wrap: this.$slideDragWrap.width(),
drag_btn: this.$slideDragBtn.width(), drag_btn: this.$slideDragBtn.width(),
}), },
{ resolveBusinessError: true },
) )
.then((res) => { .then((res) => {
const code = res.data.code; const code = res.code;
const data = res.data.data; const data = res.data;
const msg = res.data.message; const msg = res.message;
if (code === 200) { if (code === 200) {
this.randRot = data.rand_rot; this.randRot = data.rand_rot;
this.code = data.code; this.code = data.code;
...@@ -193,9 +193,9 @@ let RotateVerify; // 声明 RotateVerify 变量 ...@@ -193,9 +193,9 @@ let RotateVerify; // 声明 RotateVerify 变量
_this.settings.verifyParam.disLf = _this.disLf; _this.settings.verifyParam.disLf = _this.disLf;
axios axios
.post(_this.settings.verifyUrl, _this.settings.verifyParam) .post(_this.settings.verifyUrl, _this.settings.verifyParam, { resolveBusinessError: true })
.then(function (res) { .then(function (res) {
if (res.data.code === 200) { if (res.code === 200) {
_this.$slideDragBtn.addClass("control-btn-suc"); _this.$slideDragBtn.addClass("control-btn-suc");
_this.controlBorWrap.addClass("control-bor-suc"); _this.controlBorWrap.addClass("control-bor-suc");
_this.statusBg.fadeIn(); _this.statusBg.fadeIn();
...@@ -307,9 +307,9 @@ let RotateVerify; // 声明 RotateVerify 变量 ...@@ -307,9 +307,9 @@ let RotateVerify; // 声明 RotateVerify 变量
_this.settings.verifyParam.disLf = _this.disLf; _this.settings.verifyParam.disLf = _this.disLf;
axios axios
.post(_this.settings.verifyUrl, _this.settings.verifyParam) .post(_this.settings.verifyUrl, _this.settings.verifyParam, { resolveBusinessError: true })
.then(function (res) { .then(function (res) {
if (res.data.code === 200) { if (res.code === 200) {
_this.verifyState = true; _this.verifyState = true;
_this.$slideDragBtn.addClass("control-btn-suc"); _this.$slideDragBtn.addClass("control-btn-suc");
_this.controlBorWrap.addClass("control-bor-suc"); _this.controlBorWrap.addClass("control-bor-suc");
......
/** /**
* 项目的公共方法 * 项目的公共方法
*/ */
import $ from "jquery";
/**
* 对象重新排序
* @param {*} obj
* @returns
*/
export function sortObjASCII(obj) {
let arr = Object.keys(obj).sort();
if (arr.length === 0) {
return {};
}
let sortObj = {};
for (let ii in arr) {
sortObj[arr[ii]] = obj[arr[ii]];
}
return sortObj;
}
/**
* @desc 格式化日期字符串
* @param { Nubmer} - 时间戳
* @returns { String } 格式化后的日期字符串
*/
export function formatDate(timestamp) {
// 补全为13位
let arrTimestamp = (timestamp + "").split("");
for (let start = 0; start < 13; start++) {
if (!arrTimestamp[start]) {
arrTimestamp[start] = "0";
}
}
timestamp = arrTimestamp.join("") * 1;
let minute = 1000 * 60;
let hour = minute * 60;
let day = hour * 24;
let month = day * 30;
let now = new Date().getTime();
let diffValue = now - timestamp;
// 如果本地时间反而小于变量时间
if (diffValue < 0) {
return "不久前";
}
// 计算差异时间的量级
let monthC = diffValue / month;
let weekC = diffValue / (7 * day);
let dayC = diffValue / day;
let hourC = diffValue / hour;
let minC = diffValue / minute;
// 数值补0方法
let zero = function (value) {
if (value < 10) {
return "0" + value;
}
return value;
};
// 使用
if (monthC > 4) {
// 超过1年,直接显示年月日
return (function () {
let date = new Date(timestamp);
return (
date.getFullYear() +
"年" +
zero(date.getMonth() + 1) +
"月" +
zero(date.getDate() + 1) +
"日"
);
})();
} else if (monthC >= 1) {
return parseInt(monthC) + "月前";
} else if (weekC >= 1) {
return parseInt(weekC) + "周前";
} else if (dayC >= 1) {
return parseInt(dayC) + "天前";
} else if (hourC >= 1) {
return parseInt(hourC) + "小时前";
} else if (minC >= 1) {
return parseInt(minC) + "分钟前";
}
return "刚刚";
}
/**
* 获取日期字符串
* @returns
*/
export function getDateStr() {
const date = new Date(),
year = date.getFullYear(),
month = date.getMonth() > 9 ? date.getMonth() + 1 : `0${date.getMonth() + 1}`,
day = date.getDate() + 1 > 9 ? date.getDate() + 1 : `0${date.getDate() + 1}`,
hh = date.getHours() > 9 ? date.getHours() : `0${date.getHours()}`,
mm = date.getMinutes() > 9 ? date.getMinutes() : `0${date.getMinutes()}`;
return `${year}${month}${day}${hh}${mm}`;
}
/**
* 随机生成字符串
* @param {*} len
* @returns
*/
export function randomString(len) {
const length = len || 32;
let chars = "ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz12345678",
maxPos = chars.length,
pwd = "";
for (let i = 0; i < length; i++) {
pwd += chars.charAt(Math.floor(Math.random() * maxPos));
}
return pwd;
}
// 根据id 查找树中的节点内容 // 根据id 查找树中的节点内容
export const findTreeElementByKey = (tree, key, value) => { export const findTreeElementByKey = (tree, key, value) => {
for (let i = 0; i < tree.length; i++) { for (let i = 0; i < tree.length; i++) {
const bool = !isNaN(value) const bool = !isNaN(value) ? parseFloat(tree[i][key]) === parseFloat(value) : tree[i][key] === value
? parseFloat(tree[i][key]) === parseFloat(value)
: tree[i][key] === value;
if (bool) { if (bool) {
// 找到元素 // 找到元素
return tree[i]; return tree[i]
} else if (Array.isArray(tree[i].children)) { } else if (Array.isArray(tree[i].children)) {
// 递归遍历子节点 // 递归遍历子节点
const found = findTreeElementByKey(tree[i].children, key, value); const found = findTreeElementByKey(tree[i].children, key, value)
if (found) { if (found) {
return found; return found
} }
} }
} }
return null; // 没有找到元素 return null // 没有找到元素
}; }
// 设置所有有children 的展开项
export const findParentsExpanded = (treeData, targetKey = "id") => {
const keys = [];
function traverse(nodes) {
if (!nodes) return;
for (const node of nodes) {
if (node.children) {
keys.push(node[targetKey]);
traverse(node.children);
}
}
}
traverse(treeData);
return keys;
};
// 将路由菜单转为树形菜单
export const treeRouterData = (source, id = "menuId", parentId = "pid", children = "children") => {
const cloneData = JSON.parse(JSON.stringify(source));
if (source.length === 0) return source;
return cloneData.filter((father) => {
const branchArr = cloneData.filter(
(child) => parseFloat(father[id]) === parseFloat(child[parentId]),
);
father[children] = branchArr.length > 0 ? branchArr : null;
return father[parentId] === 0;
});
};
// 将数组转换成Tree所需要的数组 // 将数组转换成Tree所需要的数组
export function convertToAntdTreeData(data, target = "label") { export function convertToAntdTreeData(data, target = 'label') {
const antdTreeData = []; const antdTreeData = []
const convertNode = (node) => { const convertNode = (node) => {
const antdTreeNode = { const antdTreeNode = {
...@@ -180,192 +31,142 @@ export function convertToAntdTreeData(data, target = "label") { ...@@ -180,192 +31,142 @@ export function convertToAntdTreeData(data, target = "label") {
key: node.id, key: node.id,
select: false, select: false,
edit: false, edit: false,
}; }
if (node.children && node.children.length > 0) { if (node.children && node.children.length > 0) {
antdTreeNode.children = node.children.map(convertNode); antdTreeNode.children = node.children.map(convertNode)
} }
return antdTreeNode; return antdTreeNode
}; }
antdTreeData.push(...data.map(convertNode)); antdTreeData.push(...data.map(convertNode))
return antdTreeData; return antdTreeData
} }
// 查找树里面的所有父级节点 // 查找树里面的所有父级节点
export const findParents = (treeData, targetKey = "id", value) => { export const findParents = (treeData, targetKey = 'id', value) => {
for (const node of treeData) { for (const node of treeData) {
if (parseFloat(node[targetKey]) === parseFloat(value)) { if (parseFloat(node[targetKey]) === parseFloat(value)) {
return []; return []
} }
if (node.children) { if (node.children) {
const parents = findParents(node.children, targetKey, value); const parents = findParents(node.children, targetKey, value)
if (parents) { if (parents) {
return [node[targetKey], ...parents]; return [node[targetKey], ...parents]
} }
} }
} }
return null; return null
}; }
export const findNodeById = (tree, targetKey = "id", targetId) => { export const findNodeById = (tree, targetKey = 'id', targetId) => {
// 递归处理树节点 // 递归处理树节点
for (const node of tree) { for (const node of tree) {
// 如果当前节点的 id 等于目标 id,返回当前节点的所有子节点的 id // 如果当前节点的 id 等于目标 id,返回当前节点的所有子节点的 id
if (node[targetKey] === targetId) { if (node[targetKey] === targetId) {
if (node.children && node.children.length) { if (node.children && node.children.length) {
return collectChildrenIds(node.children, targetKey); return collectChildrenIds(node.children, targetKey)
} }
} }
// 递归处理子节点 // 递归处理子节点
if (node.children && node.children.length > 0) { if (node.children && node.children.length > 0) {
const result = findNodeById(node.children, targetKey, targetId); const result = findNodeById(node.children, targetKey, targetId)
if (result) { if (result) {
return result; return result
} }
} }
} }
// 如果未找到目标节点,返回空数组 // 如果未找到目标节点,返回空数组
return []; return []
}; }
function collectChildrenIds(children, targetKey) { function collectChildrenIds(children, targetKey) {
// 收集子节点的 id // 收集子节点的 id
const ids = []; const ids = []
for (const child of children) { for (const child of children) {
ids.push(child[targetKey]); ids.push(child[targetKey])
// 递归处理孙子节点 // 递归处理孙子节点
if (child.children && child.children.length > 0) { if (child.children && child.children.length > 0) {
ids.push(...collectChildrenIds(child.children, targetKey)); ids.push(...collectChildrenIds(child.children, targetKey))
} }
} }
return ids; return ids
} }
// 查找树里面的所有父级节点
export const findAllParents = (tree, key, value, parents = []) => {
for (const node of tree) {
const currentKey = node[key];
const children = node.children || [];
if (currentKey === value) {
return parents.concat(currentKey);
}
if (children.length > 0) {
const result = findAllParents(children, key, value, parents.concat(currentKey));
if (result.length > 0) {
return result;
}
}
}
return [];
};
// 查找树里面的所有子级节点
export const findAllChildren = (tree, key, value) => {
for (const node of tree) {
const currentKey = node[key];
const currentChildren = (node.children || []).map((child) => child[key]);
if (currentKey === value) {
return currentChildren;
}
if (currentChildren.length > 0) {
const result = findAllChildren(node.children, key, value, currentChildren);
return result;
}
}
};
// 将树形结构转为一维数组
export const treeDataToArray = (source) => {
const res = [];
// 第二种方式
source.length &&
source.forEach((item) => {
res.push(item);
item.children && res.push(...treeDataToArray(item.children));
});
return res;
};
export const getStyleValue = (elem, styleKey) => { export const getStyleValue = (elem, styleKey) => {
let res = ""; let res = ''
const styleStr = $(elem).attr("style") || ""; // 如 'line-height: 2.5; color: red;' const styleStr = elem?.getAttribute?.('style') || elem?.attr?.('style') || '' // 如 'line-height: 2.5; color: red;'
const styleArr = styleStr.split(";"); // 如 ['line-height: 2.5', ' color: red', ''] const styleArr = styleStr.split(';') // 如 ['line-height: 2.5', ' color: red', '']
const length = styleArr.length; const length = styleArr.length
for (let i = 0; i < length; i++) { for (let i = 0; i < length; i++) {
const styleItemStr = styleArr[i]; // 如 'line-height: 2.5' const styleItemStr = styleArr[i] // 如 'line-height: 2.5'
if (styleItemStr) { if (styleItemStr) {
const arr = styleItemStr.split(":"); // ['line-height', ' 2.5'] const arr = styleItemStr.split(':') // ['line-height', ' 2.5']
if (arr[0].trim() === styleKey) { if (arr[0].trim() === styleKey) {
res = arr[1].trim(); res = arr[1].trim()
} }
} }
} }
return res; return res
}; }
// 根据id 查找树中的节点内容 // 根据id 查找树中的节点内容
export const findFirstNotHasChildren = (tree) => { export const findFirstNotHasChildren = (tree) => {
if (tree.length > 0) { if (tree.length > 0) {
if (tree[0].children && tree[0].children.length > 0) { if (tree[0].children && tree[0].children.length > 0) {
return findFirstNotHasChildren(tree[0].children); return findFirstNotHasChildren(tree[0].children)
} }
return tree[0]; return tree[0]
} }
return null; // 没有找到元素 return null // 没有找到元素
}; }
// 只返回父级, 只找上面第一层的父级 // 只返回父级, 只找上面第一层的父级
export const findParentLevelOne = (data, key = "id", value) => { export const findParentLevelOne = (data, key = 'id', value) => {
for (let i = 0; i < data.length; i++) { for (let i = 0; i < data.length; i++) {
const item = data[i]; const item = data[i]
if (item.children) { if (item.children) {
const child = item.children.find((c) => c[key] === value); const child = item.children.find((c) => c[key] === value)
if (child) { if (child) {
// 找到目标子元素,返回其父元素 // 找到目标子元素,返回其父元素
return item; return item
} else { } else {
// 递归查找子元素的子元素 // 递归查找子元素的子元素
const result = findParentLevelOne(item.children, key, value); const result = findParentLevelOne(item.children, key, value)
if (result) { if (result) {
return result; return result
} }
} }
} }
} }
// 没有找到目标子元素,返回null // 没有找到目标子元素,返回null
return null; return null
}; }
// 找所在位置 // 找所在位置
export const findTreeToIndex = (data, key, value) => { export const findTreeToIndex = (data, key, value) => {
let index = data.findIndex((item) => item[key] === value); let index = data.findIndex((item) => item[key] === value)
return index > -1 ? index : -1; return index > -1 ? index : -1
}; }
export const hexToRgb = (hex) => { export const hexToRgb = (hex) => {
// 移除前缀#符号 // 移除前缀#符号
let hexTemp = hex.replace(/^\s*#|\s*$/g, ""); let hexTemp = hex.replace(/^\s*#|\s*$/g, '')
// 将三位十六进制转为六位 // 将三位十六进制转为六位
if (hexTemp.length === 3) { if (hexTemp.length === 3) {
hexTemp = hexTemp.replace(/(.)/g, "$1$1"); hexTemp = hexTemp.replace(/(.)/g, '$1$1')
} }
// 提取R、G、B各自的十六进制表示方式 // 提取R、G、B各自的十六进制表示方式
const rgb = /^(\w{2})(\w{2})(\w{2})$/.exec(hexTemp); const rgb = /^(\w{2})(\w{2})(\w{2})$/.exec(hexTemp)
// 转为10进制并返回 // 转为10进制并返回
return rgb return rgb
...@@ -374,65 +175,64 @@ export const hexToRgb = (hex) => { ...@@ -374,65 +175,64 @@ export const hexToRgb = (hex) => {
g: parseInt(rgb[2], 16), g: parseInt(rgb[2], 16),
b: parseInt(rgb[3], 16), b: parseInt(rgb[3], 16),
} }
: null; : null
}; }
export const clacTopicText = (type, radio, checkbox, judge, fill, textarea) => { export const clacTopicText = (type, radio, checkbox, judge, fill, textarea) => {
let i = 0; let i = 0
let arr = ["一", "二", "三", "四", "五"]; let arr = ['一', '二', '三', '四', '五']
if (type === "radio") { if (type === 'radio') {
return "一"; return '一'
} }
if (type === "checkbox") { if (type === 'checkbox') {
if (radio.length > 0) { if (radio.length > 0) {
return "二"; return '二'
} else { } else {
return "一"; return '一'
} }
} }
if (type === "judge") { if (type === 'judge') {
if (radio.length > 0 && checkbox.length > 0) { if (radio.length > 0 && checkbox.length > 0) {
return "三"; return '三'
} else { } else {
if (radio.length > 0 || checkbox.length > 0) { if (radio.length > 0 || checkbox.length > 0) {
return "二"; return '二'
} else { } else {
return "一"; return '一'
} }
} }
} }
if (type === "fill") { if (type === 'fill') {
if (radio.length > 0) { if (radio.length > 0) {
i++; i++
} }
if (checkbox.length > 0) { if (checkbox.length > 0) {
i++; i++
} }
if (judge.length > 0) { if (judge.length > 0) {
i++; i++
} }
return arr[i]; return arr[i]
} }
if (type === "textarea") { if (type === 'textarea') {
if (radio.length > 0) { if (radio.length > 0) {
i++; i++
} }
if (checkbox.length > 0) { if (checkbox.length > 0) {
i++; i++
} }
if (judge.length > 0) { if (judge.length > 0) {
i++; i++
} }
if (fill.length > 0) { if (fill.length > 0) {
i++; i++
} }
return arr[i]; return arr[i]
} }
}; }
export const downloadFile = (res = "") => {
window.open(import.meta.env.VITE_API_URL + "/" + res);
};
export const downloadFile = (res = '') => {
window.open(import.meta.env.VITE_API_URL + '/' + res)
}
// 延时函数 // 延时函数
export const sleep = (time) => new Promise((resolve) => setTimeout(resolve, time)); export const sleep = (time) => new Promise((resolve) => setTimeout(resolve, time))
import { asBlob } from "html-docx-js-typescript"; import { asBlob } from "html-docx-js-typescript";
import { saveAs } from "file-saver"; import { saveAs } from "file-saver";
import $ from "jquery";
/** /**
* 将图片 URL 转为 base64 Data URI * 将图片 URL 转为 base64 Data URI
...@@ -100,7 +99,7 @@ export async function exportHtmlToWord(name, htmlString, removeSelectors = []) { ...@@ -100,7 +99,7 @@ export async function exportHtmlToWord(name, htmlString, removeSelectors = []) {
const doc = parser.parseFromString(htmlString, "text/html"); const doc = parser.parseFromString(htmlString, "text/html");
if (removeSelectors.length) { if (removeSelectors.length) {
$(doc.body).find(removeSelectors.join(", ")).remove(); doc.body.querySelectorAll(removeSelectors.join(", ")).forEach((element) => element.remove());
} }
// 将所有图片转为 base64 内嵌 // 将所有图片转为 base64 内嵌
......
/* eslint-disable */
import Axios from "axios";
import { message, Modal, notification } from "antd";
import md5 from "js-md5";
import { get } from "lodash-es";
import { sortObjASCII } from "@/utils/common.js";
import {
ADMIN_LOGIN_PATH,
normalizeAdminApiPath,
stripAdminGatewayPrefix,
} from "@/utils/adminPaths.js";
import qs from "qs";
// import { sm4 as Sm4js } from 'evit-gm-crypt'
// const sm4 = new Sm4js({
// key: 'XDXDXU_ZIJING_01',
// mode: 'cbc',
// iv: 'IVIVIV_ZHIXUE_01',
// cipherType: 'base64'
// })
let pending = []; // 存储每个ajax请求的取消函数和ajax标识
let CancelToken = Axios.CancelToken;
// 取消请求 方法
// 取消请求 方法
let cancelPending = (config) => {
pending.forEach((item) => {
item.cancel(); // 取消请求
});
pending = []; // 清空数组
};
// Axios.defaults.withCredentials = true; // 默认为false 表示跨域请求时是否需要使用凭证
const axios = Axios.create({
baseURL: import.meta.env.VITE_API_PREFIX,
timeout: 999999,
});
function getToken() {
return window.localStorage.getItem("kiwi.token") ? window.localStorage.getItem("kiwi.token") : "";
}
// 请求拦截器
axios.interceptors.request.use(
(config) => {
config.url = normalizeAdminApiPath(config.url);
// 登录流程控制中,根据本地是否存在token判断用户的登录情况
// 但是即使token存在,也有可能token是过期的,所以在每次的请求头中携带token
// 后台根据携带的token判断用户的登录情况,并返回给我们对应的状态码
// 而后我们可以在响应拦截器中,根据状态码进行一些统一的操作。
if (axios.errorNotified) {
return new Error("");
}
const token = getToken();
token && (config.headers.Authorization = token); // 请求头带上token
// 用户编码
config.headers.UserNo = window.localStorage.getItem("user_no");
// 应用设置
const appId = "TzEU5jPk2tu80266";
const appSecret = "0a006048a4480481b18fef1405120b83";
config.headers.AppId = appId;
config.headers.AppSecret = appSecret;
// 签名
var signData = qs.parse(config.data);
var timeStr = Date.parse(new Date()) / 1000;
signData.appId = appId;
signData.appSecret = appSecret;
signData.timestamp = timeStr;
let s = "";
if (config.url.indexOf(".tiangong.cn") > -1) {
s = config.url;
} else {
s = stripAdminGatewayPrefix(import.meta.env.VITE_API_URL + config.url);
}
signData.url = decodeURIComponent(s);
// signData.url = 'http: //zijing.com/index.php/user/user/getList'
signData.token = token;
// 按照ASCII码进行排序'
var dataSign = sortObjASCII(signData);
// 转换为字符串
var signStr = "";
for (var key in dataSign) {
var str = "";
if (typeof signData[key] !== "string" && signData[key].constructor !== String) {
str = JSON.stringify(signData[key]);
} else {
str = signData[key];
}
if (signStr === "") {
signStr = key + "=" + str;
} else {
signStr += "&" + key + "=" + str;
}
}
const salt = "&4F6g4Y6b5L4R9";
const sign = signStr + salt;
config.headers.Sign = md5(md5(sign)); // 加密盐
config.headers.Timestamp = timeStr; // 请求时间
// 设置后端的语言
config.headers["Accept-Language"] = window.sessionStorage.getItem("lang");
// config.headers['Cookie'] = 'SESSION-ID=9ec8565699e1b961561362f710674549'
// 判断当前请求是否设置了不显示Loading
/* if (config.headers.showLoading !== false) {
showLoading(config.headers.loadingTarget)
} */
// 在请求拦截器中,为每个请求创建一个取消令牌,并将其添加到pending数组
config.cancelToken = new CancelToken((cancel) => {
pending.push({ url: config.url, cancel });
});
// if (config.data && config.headers['Content-Type'] !== 'multipart/form-data' && import.meta.env.PROD) {
// // console.log({ ...qs.parse(config.data), expire: timeStr + 60 })
// config.data = { data: sm4.encrypt(JSON.stringify({ ...qs.parse(config.data), expire: timeStr + 60 })) }
// }
return config;
},
(error) => {
Promise.reject(error);
},
);
// 响应拦截器
axios.interceptors.response.use(
(response = {}) => {
let code = get(response, "data.code", "");
let msg = get(response, "data.message", "") || get(response, "data.msg", "");
// 代表request header中没有带token
let pathname = window.location.pathname;
if (code === 401 || code === 403) {
if (!axios.errorNotified) {
axios.errorNotified = true; // 添加标志,表示通知已经弹出
if (pathname === ADMIN_LOGIN_PATH) {
return;
}
Modal.warning({
title: "登录状态已过期,请重新登录",
// content: '请重新登录',
onOk() {
localStorage.removeItem("kiwi.gpt.token");
window.location.pathname = ADMIN_LOGIN_PATH;
},
});
cancelPending(response.config); // 取消后续请求
return Promise.reject(response);
}
}
return response;
},
(error) => {
const { response = {}, config = {} } = error;
console.error("我要的response", response, error);
const status = get(response, "status", 0);
const urlPath = get(config, "url", 0);
switch (status) {
case 401:
cancelPending(response.config); // 取消后续请求
if (!axios.errorNotified) {
axios.errorNotified = true; // 添加标志,表示通知已经弹出
Modal.warning({
title: "token过期",
content: "请重新登录",
onOk() {
localStorage.removeItem("kiwi.gpt.token");
window.location.href = ADMIN_LOGIN_PATH;
},
});
}
break;
case 403:
cancelPending(response.config); // 取消后续请求
if (!axios.errorNotified) {
axios.errorNotified = true; // 添加标志,表示通知已经弹出
Modal.warning({
title: "身份校验已过期",
content: "请重新登录",
onOk() {
localStorage.removeItem("kiwi.gpt.token");
window.location.href = ADMIN_LOGIN_PATH;
},
});
}
break;
case 404:
notification.error({
message: "Error: 404 Not Found",
description: `url: ${urlPath}, The requested URL was not found on the server.`,
});
break;
case 500:
notification.error({
message: "Error: 500",
description: `url: ${urlPath}`,
});
break;
default:
if (status) {
notification.error({
message: `Error: ${status}`,
description: `url: ${urlPath}`,
});
}
}
// return error;
return Promise.reject(error);
},
);
export default axios;
Markdown 格式
0% 或
您添加了 0 人 到此讨论。请谨慎行事。
请先完成此评论的编辑!
请 注册 或者 后发表评论