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

chore(admin): update

上级 6d1921de
<!doctype html>
<html lang="zh-CN">
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="https://zws-imgs-pub.ezijing.com/pc/base/favicon.ico" />
......@@ -8,7 +8,7 @@
</head>
<body>
<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>
</body>
</html>
......@@ -6,8 +6,17 @@ export function getUser() {
}
// 获取菜单
export function getMenu() {
return axios.post("/api/system/power/getMenuList");
export async function getMenuList(params) {
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
......
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 { Modal, Drawer, Tree, Button, Spin, Space, Input, Image } from "antd";
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 $, { event } from "jquery";
import $ from "jquery";
import baike from "@/assets/images/editor/icon-baike.png";
import { getChapterTopic, expandReadInfo } from "../utils/request";
import TopicItem from "../practice/components/topicItem";
......
......@@ -91,7 +91,6 @@ import PracticeSettingModal from "./practice/index";
import PreviewModal from "./components/preview";
import HistoryModal from "./history/";
import $ from "jquery";
import "./index.less";
......@@ -285,35 +284,24 @@ const WangEditorCustomer = (props, ref) => {
const listenNodeStyle = (path) => {
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;
if (path[1] === 0) {
node = children[path[0]];
if (node.children.length > 0) {
const elem = editor.toDOMNode(node); // 返回 HTMLElement
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));
setSelectionSize(parseInt(getNodeFontSize(node)));
} else {
node = children[path[0]].children[0];
if (node.fontSize) {
setSelectionSize(parseInt(node.fontSize));
} else {
const elem = editor.toDOMNode(node); // 返回 HTMLElement
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));
setSelectionSize(parseInt(getNodeFontSize(node)));
}
}
} else {
......@@ -321,16 +309,7 @@ const WangEditorCustomer = (props, ref) => {
if (node.fontSize) {
setSelectionSize(parseInt(node.fontSize));
} else {
const elem = editor.toDOMNode(node); // 返回 HTMLElement
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));
setSelectionSize(parseInt(getNodeFontSize(node)));
}
}
};
......
......@@ -6,7 +6,6 @@ import {
SlateNode,
} from "@wangeditor/editor";
import { h } from "snabbdom";
import $ from "jquery";
import iconExpand from "@/assets/images/editor/icon_expand_read.png";
import iconClose from "@/assets/images/icon_chapter_close.png";
import { findNodeWithParent } from "../utils/setting";
......
......@@ -6,7 +6,6 @@ import {
SlateNode,
} from "@wangeditor/editor";
import { h } from "snabbdom";
import $ from "jquery";
import iconExpand from "@/assets/images/editor/icon_expand_tips.png";
import iconExpandT from "@/assets/images/editor/icon_expand_editor.png";
......
......@@ -429,8 +429,6 @@ const parseImageHtml = (domElem, children, editor) => {
const imgUrl = domElem.getAttribute("data-imgUrl") || "";
const imgDescript = domElem.getAttribute("data-imgDescript") || "";
const title = domElem.getAttribute("data-title") || "";
const $elem = $(domElem);
// 生成“附件”元素(按照此前约定的数据结构)
const myResume = {
type: "chapterImage",
......@@ -438,8 +436,8 @@ const parseImageHtml = (domElem, children, editor) => {
imgUrl,
imgDescript,
style: {
width: getStyleValue($elem, "width"),
height: getStyleValue($elem, "height"),
width: getStyleValue(domElem, "width"),
height: getStyleValue(domElem, "height"),
},
children: [{ text: "" }], // void node 必须有 children ,其中有一个空字符串,重要!!!
};
......
......@@ -2,7 +2,6 @@ import { DomEditor, SlateTransforms, SlateEditor } from "@wangeditor/editor";
import { h } from "snabbdom";
import iconClose from "@/assets/images/icon_chapter_close.png";
import { delChapterTopic } from "../utils/request";
import $ from "jquery";
import "../utils/iconfont";
import { hexToRgb } from "@/utils/common";
import { findNodeWithParent } from "../utils/setting";
......
import axios from "@/utils/request.js";
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;
}
};
import axios, { notifySuccess } from "@/utils/axios";
// 书籍名称下拉列表
const bookNameList = async (obj) => {
const res = await axios.post("book/teacher/getListAll", 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 response = await axios.post(path, params);
if (notify) notifySuccess(response.message);
return response.data;
};
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 qs from "qs";
import { get } from "lodash-es";
import { message } from "antd";
// 获取题目列表
const getTopicList = async (obj) => {
try {
const res = await axios.post("/book/question/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 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,
};
import axios from "@/utils/axios";
const post = async (path, params) => (await axios.post(path, params)).data;
export const getTopicList = (params) => post("/book/question/getList", params);
export const getTopicTypeList = (params) => post("/book/question/type/getList", params);
export const addChapterTopic = (params) => post("/book/chapter/question/add", params);
export const getChapterTopic = (params) => post("/book/chapter/question/getQuestionList", params);
export const delChapterTopic = (params) => post("/book/chapter/question/removeQuestion", params);
export const addChapterTooltip = (params) => post("/book/bubble/add", params);
export const delChapterTooltip = (params) => post("/book/bubble/removeBubble", params);
export const addExpandRead = (params) => post("/book/extend/add", params);
export const delExpandRead = (params) => post("/book/extend/removeExtend", params);
export const expandReadInfo = (params) => post("/book/extend/info", params);
export const addGallery = (params) => post("/book/gallery/add", params);
export const delGallery = (params) => post("/book/gallery/removeGallery", params);
export const getRecordInfo = (params) => post("/book/teacher/section/getRecordInfo", params);
export const getRecordList = (params) => post("/book/teacher/section/getRecordList", params);
......@@ -49,7 +49,7 @@ import Breadcrumb from './components/breadcrumb'
import './index.less'
import logo from '@/assets/images/logo.png'
import { getMenuList, checkSSOLogin } from './request'
import { getMenuList, checkSSOLogin } from '@/api/base'
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";
// @ts-expect-error The legacy workspace does not install the qs declaration package.
import qs from "qs";
import request from "@/utils/request.js";
import axios, { notifySuccess } from "@/utils/axios";
import type { AdminQuery } from "./query";
......@@ -30,46 +26,21 @@ export interface AdminListResult {
type ApiParams = Record<string, unknown>;
async function getPayload<T>(url: string, params: ApiParams): Promise<T | false> {
try {
const response = await request.post(url, qs.stringify(params));
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 getPayload<T>(url: string, params: ApiParams): Promise<T> {
const response = await axios.post(url, params);
return response.data as T;
}
async function mutate(url: string, params: ApiParams): Promise<boolean> {
try {
const response = await request.post(url, qs.stringify(params));
const body = response.data as { code?: number; message?: string };
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;
}
const response = await axios.post(url, params);
notifySuccess(response.message);
return true;
}
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", {
...params,
});
if (data === false) return false;
return { rows: data.list ?? [], total: data.total ?? 0 };
}
......
......@@ -32,12 +32,8 @@ export function useAdminList() {
setError(null);
try {
const result: AdminListResult | false = await getAdminList(query);
const result: AdminListResult = await getAdminList(query);
if (currentRequest !== requestId.current) return;
if (result === false) {
setError(new Error("数据获取失败!"));
return;
}
setRows(result.rows);
setTotal(result.total);
} catch (reason) {
......
......@@ -45,7 +45,7 @@ export default function AdminListView() {
useEffect(() => {
let active = true;
void getRoleOptions().then((result) => {
if (active && result !== false) setRoles(result);
if (active) setRoles(result);
});
return () => {
active = false;
......@@ -54,7 +54,6 @@ export default function AdminListView() {
const handleEdit = async (id: number) => {
const admin = await getAdminInfo(id);
if (admin === false) return;
setSelectedId(id);
setIsAdd(false);
setInitialAdmin({
......
import { message } from "antd";
// @ts-expect-error The legacy workspace does not install the qs declaration package.
import qs from "qs";
import request from "@/utils/request.js";
import axios, { notifySuccess } from "@/utils/axios";
import type { RoleQuery } from "./query";
......@@ -29,43 +25,21 @@ export interface RoleListResult {
type ApiParams = Record<string, unknown>;
async function getPayload<T>(url: string, params: ApiParams): Promise<T | false> {
try {
const response = await request.post(url, qs.stringify(params));
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 getPayload<T>(url: string, params: ApiParams): Promise<T> {
const response = await axios.post(url, params);
return response.data as T;
}
async function mutate(url: string, params: ApiParams) {
try {
const response = await request.post(url, qs.stringify(params));
const body = response.data as { code?: number; message?: string };
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;
}
const response = await axios.post(url, params);
notifySuccess(response.message);
return true;
}
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", {
...params,
});
if (data === false) return false;
return { rows: data.list ?? [], total: data.total ?? 0 };
}
......
......@@ -31,12 +31,8 @@ export function useRoleList() {
setLoading(true);
setError(null);
try {
const result: RoleListResult | false = await getRoleList(query);
const result: RoleListResult = await getRoleList(query);
if (currentRequest !== requestId.current) return;
if (result === false) {
setError(new Error("数据获取失败!"));
return;
}
setRows(result.rows);
setTotal(result.total);
} catch (reason) {
......
......@@ -47,7 +47,7 @@ export default function RoleListView() {
useEffect(() => {
let active = true;
void getAllPermissions().then((result) => {
if (active && result !== false) {
if (active) {
setPermissionTree(convertToAntdTreeData(result) as PermissionTreeNode[]);
}
});
......@@ -58,7 +58,6 @@ export default function RoleListView() {
const handleEdit = async (id: number) => {
const role = await getRoleInfo(id);
if (role === false) return;
setSelectedId(id);
setIsAdd(false);
setInitialRole({
......@@ -94,7 +93,7 @@ export default function RoleListView() {
setSelectedId(id);
setPermissionOpen(true);
const result = await getRolePermissionIds(id);
setCheckedKeys(result === false ? [] : result);
setCheckedKeys(result);
};
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 { Form, Input, Button, Space, Row, Col, Drawer } from "antd";
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 UploadImage from "@/components/uploadImage";
......@@ -39,10 +39,8 @@ const UserInfo = () => {
};
const submitForm = async (obj) => {
const updatedData = await changeInfo({ ...obj });
if (updatedData) {
await fetchData();
}
await changeInfo({ ...obj });
await fetchData();
};
return (
......
import { message } from 'antd'
import qs from 'qs'
import axios from '@/utils/request'
import axios, { notifySuccess } from '@/utils/axios'
export type AdsenseRow = {
id: number
......@@ -15,29 +12,13 @@ export type AdsenseListResult = {
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> {
const response = await axios.post('/ad/position/getList', qs.stringify(query))
const envelope = response.data as ApiEnvelope<{ list?: AdsenseRow[]; total?: number }>
if (envelope.code !== 200) {
const error = new Error(getMessage(envelope))
message.error(error.message)
throw error
}
const response = await axios.post('/ad/position/getList', query)
const data = response.data as { list?: AdsenseRow[]; total?: number }
return {
rows: envelope.data?.list ?? [],
total: envelope.data?.total ?? 0,
rows: data.list ?? [],
total: data.total ?? 0,
}
}
......@@ -48,18 +29,7 @@ export async function changePositionStatus({
id: number
status: '0' | '1'
}): Promise<boolean> {
try {
const response = await axios.post('/ad/position/changeStatus', qs.stringify({ id, status }))
const envelope = response.data as ApiEnvelope<unknown>
if (envelope.code !== 200) {
message.error(getMessage(envelope))
return false
}
message.success(getMessage(envelope))
return true
} catch {
return false
}
const response = await axios.post('/ad/position/changeStatus', { id, status })
notifySuccess(response.message)
return true
}
import { message } from "antd";
// @ts-expect-error The legacy workspace does not install the qs declaration package.
import qs from "qs";
import request from "@/utils/request.js";
import axios, { notifySuccess } from "@/utils/axios";
import type { AdvertQuery } from "./query";
......@@ -29,42 +25,21 @@ export interface AdvertListResult {
}
type ApiParams = Record<string, unknown>;
type ApiBody<T> = { code?: number; data?: T; message?: string };
async function getPayload<T>(url: string, params: ApiParams): Promise<T | false> {
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 getPayload<T>(url: string, params: ApiParams): Promise<T> {
const response = await axios.post(url, params);
return response.data as T;
}
async function mutate(url: string, params: ApiParams) {
try {
const response = await request.post(url, qs.stringify(params));
const body = response.data as ApiBody<unknown>;
const text = body?.message ?? "数据获取失败!";
if (body?.code === 200) {
message.success(text);
return true;
}
message.error(text);
return false;
} catch {
return false;
}
const response = await axios.post(url, params);
notifySuccess(response.message);
return true;
}
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", {
...query,
});
if (data === false) return false;
return { rows: data.list ?? [], total: data.total ?? 0 };
}
......@@ -88,8 +63,7 @@ export function changeAdvertStatus(id: number, status: "0" | "1") {
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", {});
if (!result) return false;
return (result.list ?? []) as AdvertPosition[];
}
......@@ -32,12 +32,8 @@ export function useAdvertList() {
setLoading(true);
setError(null);
try {
const result: AdvertListResult | false = await getAdvertList(query);
const result: AdvertListResult = await getAdvertList(query);
if (currentRequest !== requestId.current) return;
if (result === false) {
setError(new Error("数据获取失败!"));
return;
}
setRows(result.rows);
setTotal(result.total);
} catch (reason) {
......
......@@ -43,7 +43,7 @@ export default function AdvertListView() {
useEffect(() => {
let active = true;
void getAdvertPositions().then((result) => {
if (active && result !== false) setPositions(result);
if (active) setPositions(result);
});
return () => {
active = false;
......@@ -57,7 +57,6 @@ export default function AdvertListView() {
const handleEdit = async (id: number) => {
const advert = await getAdvertInfo(id);
if (advert === false) return;
setSelectedId(advert.id);
setIsAdd(false);
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";
import { useNavigate } from "react-router";
import { checkSSOLogin } from "../request/sso";
import { checkSSOLogin } from "@/api/base";
import { login } from "../api";
import "./LoginView.less";
import loginBtn from "@/assets/images/loginBtn.png";
......@@ -33,7 +34,6 @@ import Icon20 from "@/assets/login/20.png";
import Icon21 from "@/assets/login/21.png";
import Icon22 from "@/assets/login/22.png";
import Icon23 from "@/assets/login/23.png";
import { login } from "../request/login";
import logo from "@/assets/images/icon_logo_login.png";
import { RotateVerify } from "../../../utils/captcha";
......
import { message } from "antd";
import request from "@/utils/request";
import axios from "@/utils/axios";
import type { AuditQuery } from "./query";
async function post(path: string, data: Record<string, unknown>) {
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) return { data: response.data.data, msg: response.data.message || "" };
message.error(response.data?.message || "数据获取失败!");
} catch {}
return false;
const response = await axios.post(path, data);
return { data: response.data, msg: response.message || "" };
}
export const getAuditList = async (query: AuditQuery) => (await post("/book/teacher/getList/examine", query))?.data || false;
export const getExamineList = async (id: string | number) => (await post("/book/teacher/getExamineList", { id }))?.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;
export const addExamine = (data: Record<string, unknown>) => post("/book/examine/add", data);
import React, { useEffect, useState, useRef, useImperativeHandle, forwardRef } from "react";
import { Modal, Drawer, Tree, Spin, Space, Button, Input, Image } from "antd";
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 "@/common/wangeditor-customer/utils/iconfont";
import {
......
import { message } from "antd";
import request from "@/utils/request";
import axios, { notifySuccess } from "@/utils/axios";
import type { ClassifyQuery } from "./query";
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 {}
return false;
const response = await axios.post(path, data);
if (notify) notifySuccess(response.message);
return response.data;
}
export const getClassifyList = (query: ClassifyQuery) => post("/book/category/getList", query);
export const addCategory = (data: Record<string, unknown>) =>
......
import { message } from "antd";
import request from "@/utils/request";
import axios, { notifySuccess } from "@/utils/axios";
import type { DiscussionQuery } from "./query";
async function post(path: string, data: Record<string, unknown>, notify = false) {
try {
const r = (await request.post(
path,
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;
const response = await axios.post(path, data);
if (notify) notifySuccess(response.message);
return response.data;
}
export const getDiscussionList = (q: DiscussionQuery) =>
post("/comment/comment/getAllCommentList", q);
......
import { message } from "antd";
import qs from "qs";
import request from "@/utils/request";
import axios, { notifySuccess } from "@/utils/axios";
import type { LabelQuery } from "./query";
async function post(path: string, data: Record<string, unknown>, notify = false) {
try {
const response = (await request.post(path, qs.stringify(data))) 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;
const response = await axios.post(path, data);
if (notify) notifySuccess(response.message);
return response.data;
}
export const getLabelList = (query: LabelQuery) => post("/book/label/getList", query);
export const getAllBooks = () => post("/book/label/getAllBooks", {});
......
import { message } from "antd";
// @ts-expect-error The legacy workspace does not install the qs declaration package.
import qs from "qs";
import request from "@/utils/request.js";
import legacyAxios from "@/utils/axios";
import { notifySuccess } from "@/utils/axios";
import axios from "@/utils/axios";
import type { ManagementQuery } from "./query";
......@@ -35,35 +31,15 @@ export interface ImportBookValues {
}
type ApiParams = Record<string, unknown>;
type ApiBody<T> = { code?: number; data?: T; message?: string };
async function getPayload<T>(url: string, params: ApiParams): Promise<T | false> {
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 getPayload<T>(url: string, params: ApiParams): Promise<T> {
const response = await axios.post(url, params);
return response.data as T;
}
async function mutate(url: string, params: ApiParams) {
try {
const response = await request.post(url, qs.stringify(params));
const body = response.data as ApiBody<unknown>;
const text = body?.message ?? "数据获取失败!";
if (body?.code === 200) {
message.success(text);
return true;
}
message.error(text);
return false;
} catch {
return false;
}
const response = await axios.post(url, params);
notifySuccess(response.message);
return true;
}
export async function getManagementList(
......@@ -73,7 +49,6 @@ export async function getManagementList(
"/book/teacher/getList",
{ ...query },
);
if (data === false) return false;
return { rows: data.list ?? [], total: data.total ?? 0 };
}
......@@ -83,15 +58,15 @@ export function deleteManagementBook(id: number) {
// 编辑页仍沿用旧接口封装的返回值形状;保留在管理模块中,避免页面反向依赖旧目录。
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) {
return legacyAxios.post("/api/book/teacher/add", params);
return axios.post("/api/book/teacher/add", params);
}
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) {
......@@ -103,19 +78,9 @@ export function releaseManagementBook(id: number, releaseMess?: string) {
}
export async function importManagementBook(values: ImportBookValues) {
try {
const response = await request.post("/book/teacher/import", values, {
headers: { "Content-Type": "multipart/form-data" },
});
const body = response.data as ApiBody<unknown>;
const text = body?.message ?? "数据获取失败!";
if (body?.code === 200) {
message.success(text);
return true;
}
message.error(text);
return false;
} catch {
return false;
}
const response = await axios.post("/book/teacher/import", values, {
headers: { "Content-Type": "multipart/form-data" },
});
notifySuccess(response.message);
return true;
}
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) {
......@@ -54,3 +61,26 @@ export function getTagList(params) {
export function bindTag(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";
import { Form, Button, Space, Input } from "antd";
import { setTreeChapter } from "@/store/modules/user";
import { useDispatch } from "react-redux";
import { chapterEdit, chapterAdd, sectionAdd } from "../request";
import { chapterEdit, chapterAdd, sectionAdd } from "../api";
const EditChapterTitle = (props) => {
const {
......
......@@ -25,7 +25,7 @@ import {
findTreeToIndex,
findNodeById,
} from "@/utils/common";
import { getAllList, getInfoByChapterId, sectionEdit, chapterDel, dragOrder } from "./request";
import { getAllList, getInfoByChapterId, sectionEdit, chapterDel, dragOrder } from "./api";
import "./index.less";
const Examine = () => {
......@@ -333,14 +333,14 @@ const Examine = () => {
{ key: "2", label: "添加子节" },
{ key: "7", label: "关联知识图谱" },
{ key: "5", label: "设置编者" },
{
key: "6",
label: "一键AI",
children: [
{ key: "61", label: "一键AI创作课件", disabled: true },
{ key: "62", label: "一键AI创作教案", disabled: true },
],
},
// {
// key: "6",
// label: "一键AI",
// children: [
// { key: "61", label: "一键AI创作课件", disabled: true },
// { key: "62", label: "一键AI创作教案", disabled: true },
// ],
// },
{ key: "3", 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() {
setLoading(true);
setError(null);
try {
const result: ManagementListResult | false = await getManagementList(query);
const result: ManagementListResult = await getManagementList(query);
if (currentRequest !== requestId.current) return;
if (result === false) {
setError(new Error("数据获取失败!"));
return;
}
setRows(result.rows);
setTotal(result.total);
} catch (reason) {
......
......@@ -68,7 +68,7 @@ export default function ManagementListView() {
setExporting(true);
try {
const result = await exportManagementBook(selectedId);
if (result === false || !result.name) return;
if (!result.name) return;
await exportHtmlToWord(result.name, result.content ?? "", EXPORT_REMOVE_SELECTORS);
} catch (error) {
console.error("导出Word失败", error);
......
import { message } from "antd";
// @ts-expect-error The legacy workspace does not install the qs declaration package.
import qs from "qs";
import request from "@/utils/request.js";
import axios, { notifySuccess } from "@/utils/axios";
import type { OrdersQuery } from "./query";
......@@ -56,27 +52,17 @@ export interface SalesStatisticsResult {
income: number | string;
}
type ApiBody<T> = { code?: number; data?: T; message?: string };
type ApiParams = Record<string, unknown>;
async function getPayload<T>(url: string, params?: ApiParams): Promise<T | false> {
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 getPayload<T>(url: string, params?: ApiParams): Promise<T> {
const response = await axios.post(url, params);
return response.data as T;
}
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", {
...query,
});
if (data === false) return false;
return { rows: data.list ?? [], total: data.total ?? 0 };
}
......@@ -85,17 +71,7 @@ export function getSalesStatistics() {
}
export async function refundOrder(id: number, refund_reason?: string) {
try {
const response = await request.post("/order/refund", qs.stringify({ id, refund_reason }));
const body = response.data as ApiBody<unknown>;
const text = body?.message ?? "数据获取失败!";
if (body?.code === 200) {
message.success(text);
return true;
}
message.error(text);
return false;
} catch {
return false;
}
const response = await axios.post("/order/refund", { id, refund_reason });
notifySuccess(response.message);
return true;
}
......@@ -32,12 +32,8 @@ export function useOrdersList() {
setLoading(true);
setError(null);
try {
const result: OrdersListResult | false = await getOrders(query);
const result: OrdersListResult = await getOrders(query);
if (currentRequest !== requestId.current) return;
if (result === false) {
setError(new Error("数据获取失败!"));
return;
}
setRows(result.rows);
setTotal(result.total);
} catch (reason) {
......
......@@ -13,8 +13,7 @@ export default function SalesStatisticsView() {
setLoading(true);
setError(null);
const result = await getSalesStatistics();
if (result === false) setError(new Error("数据获取失败!"));
else setData(result);
setData(result);
setLoading(false);
}, []);
......
import { message } from "antd";
import request from "@/utils/request";
import axios, { notifySuccess } from "@/utils/axios";
import type { QuestionBankQuery } from "./query";
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 {}
return false;
const response = await axios.post(path, data);
if (notify) notifySuccess(response.message);
return response.data;
}
export const getQuestionList = (query: QuestionBankQuery) => post("/book/question/getList", query);
......@@ -27,14 +17,10 @@ export const getQuestionTypes = () => post("/book/question/type/getList", { page
export const getBookNames = () => post("book/teacher/getListAll");
export const getAliOssToken = () => post("/common/OssUpload/getUploadToken");
export async function importQuestions(file: File) {
try {
const form = new FormData();
form.append("file", file);
const response = (await request.post("/book/question/import", form, {
headers: { "Content-Type": "multipart/form-data" },
})) as { data?: { code?: number; data?: any; message?: string } };
if (response.data?.code === 200) return { msg: response.data.message, data: response.data.data };
message.error(response.data?.message || "数据获取失败!");
} catch {}
return false;
const form = new FormData();
form.append("file", file);
const response = await axios.post("/book/question/import", form, {
headers: { "Content-Type": "multipart/form-data" },
});
return { msg: response.message, data: response.data };
}
import { message } from "antd";
import request from "@/utils/request";
import axios, { notifySuccess } from "@/utils/axios";
import type { SaleDiscussionQuery, SaleQuery } from "./query";
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 {}
return false;
const response = await axios.post(path, data);
if (notify) notifySuccess(response.message);
return response.data;
}
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);
......@@ -22,10 +22,10 @@ export const editBook = (data: Record<string, unknown>) =>
export const getCommentInfo = (data: Record<string, unknown>) =>
post("/comment/comment/getCommentInfo", data);
export const commentDel = async (data: Record<string, unknown>) => {
const result = await post("/comment/comment/del", data, true);
return result !== false;
await post("/comment/comment/del", data, true);
return true;
};
export const commentReply = async (data: Record<string, unknown>) => {
const result = await post("/comment/comment/reply", data, true);
return result !== false;
await post("/comment/comment/reply", data, true);
return true;
};
import { message } from "antd";
// @ts-expect-error The legacy workspace does not install the qs declaration package.
import qs from "qs";
import request from "@/utils/request.js";
import axios, { notifySuccess } from "@/utils/axios";
import type { MemberLevelQuery } from "./query";
......@@ -30,46 +26,24 @@ export interface MemberLevelSystemConfig {
type ApiParams = Record<string, unknown>;
async function getPayload<T>(url: string, params: ApiParams): Promise<T | false> {
try {
const response = await request.post(url, qs.stringify(params));
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 getPayload<T>(url: string, params: ApiParams): Promise<T> {
const response = await axios.post(url, params);
return response.data as T;
}
async function mutate(url: string, params: ApiParams) {
try {
const response = await request.post(url, qs.stringify(params));
const body = response.data as { code?: number; message?: string };
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;
}
const response = await axios.post(url, params);
notifySuccess(response.message);
return true;
}
export async function getMemberLevelList(
params: MemberLevelQuery,
): Promise<MemberLevelListResult | false> {
): Promise<MemberLevelListResult> {
const data = await getPayload<{ list?: MemberLevelRow[]; total?: number }>(
"/members/grade/getList",
{ ...params },
);
if (data === false) return false;
return { rows: data.list ?? [], total: data.total ?? 0 };
}
......
......@@ -33,12 +33,8 @@ export function useMemberLevelList() {
setLoading(true);
setError(null);
try {
const result: MemberLevelListResult | false = await getMemberLevelList(query);
const result: MemberLevelListResult = await getMemberLevelList(query);
if (currentRequest !== requestId.current) return;
if (result === false) {
setError(new Error("数据获取失败!"));
return;
}
setRows(result.rows);
setTotal(result.total);
} catch (reason) {
......
......@@ -42,7 +42,7 @@ export default function MemberLevelListView() {
const loadValidity = useCallback(async () => {
const config = await getMemberLevelSystem();
if (config !== false) setValidityValue(config.set_value);
setValidityValue(config.set_value);
}, []);
useEffect(() => {
......@@ -51,7 +51,6 @@ export default function MemberLevelListView() {
const handleEdit = async (id: number) => {
const level = await getMemberLevelInfo(id);
if (level === false) return;
setSelectedId(level.id);
setIsAdd(false);
setInitialValues({
......
import { message } from "antd";
import request from "@/utils/request";
import axios, { notifySuccess } from "@/utils/axios";
import type { MemberQuery } from "./query";
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 {
return false;
}
return false;
const response = await axios.post(path, data);
if (notify) notifySuccess(response.message);
return response.data;
}
export const getMemberList = (query: MemberQuery) => post("/members/members/getList", query);
......@@ -28,8 +14,16 @@ export const addMember = (data: Record<string, unknown>) =>
export const editMember = (data: Record<string, unknown>) =>
post("/members/members/edit", data, 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) =>
post("/members/members/getIntegralRecordList", { id });
export const getCouponRecords = (id: string | number) =>
post("/members/members/getCouponList", { id });
export type MemberRecordQuery = {
id: string | number;
page: number;
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 { useLocation } from "react-router";
import PaginationCom from "@/common/Pagination";
import { getCouponRecords, getIntegralRecords, getOrders } from "../api";
import type { ColumnsType } from "antd/es/table";
import { AppList } from "@/components/AppList";
import {
getCouponRecords,
getIntegralRecords,
getOrders,
type MemberRecordQuery,
} from "../api";
type RecordRow = Record<string, any>;
const records = {
1: {
......@@ -54,45 +62,52 @@ const records = {
{ 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 }) {
const [rows, setRows] = useState<any[]>([]);
const [total, setTotal] = useState(type === 2 ? 4 : 0);
const [rows, setRows] = useState<RecordRow[]>([]);
const [total, setTotal] = useState(0);
const [page, setPage] = useState(1);
const [pageSize, setPageSize] = useState(type === 2 ? 2 : 10);
const [pageSize, setPageSize] = useState(10);
const [loading, setLoading] = useState(true);
const [error, setError] = useState<Error | null>(null);
const init = async () => {
setLoading(true);
const result: any = await records[type].load(id);
if (result) {
setError(null);
try {
const result = await records[type].load({ id, page, page_size: pageSize });
setRows(result.list || []);
setTotal(result.total || 0);
} catch (reason) {
setError(reason instanceof Error ? reason : new Error("记录加载失败"));
} finally {
setLoading(false);
}
setLoading(false);
};
useEffect(() => {
void init();
}, [id, type]);
}, [id, type, page, pageSize]);
return (
<div>
<Table
columns={records[type].columns as any}
rowKey={(row: any) => row.ID || row.id}
dataSource={rows}
loading={loading}
pagination={false}
scroll={type === 3 ? { y: 600, x: true } : undefined}
/>
<br />
<PaginationCom
total={total}
page_size={pageSize}
setpage_size={setPageSize}
page={page}
setPage={setPage}
init={init}
/>
</div>
<AppList<RecordRow>
rowKey={(row) => row.ID || row.id || `${row.coupon_id}-${row.create_time}`}
columns={records[type].columns}
data={{ rows, total, loading, error }}
pagination={{
page,
pageSize,
pageSizeOptions: [10, 20, 30, 40],
onChange: setPage,
onPageSizeChange: (nextPageSize) => {
setPage(1);
setPageSize(nextPageSize);
},
}}
onRetry={init}
tableProps={{ scroll: type === 3 ? { y: 600, x: true } : undefined }}
/>
);
}
export default function MemberDetailView() {
......@@ -111,7 +126,7 @@ export default function MemberDetailView() {
onChange={(value) => setCurrent(value as 1 | 2 | 3)}
style={{ marginBottom: 20 }}
/>
{id ? <RecordTable type={current} id={id} /> : null}
{id ? <RecordTable key={current} type={current} id={id} /> : null}
</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 axios from "@/utils/axios";
import legacyRequest from "@/utils/request";
import type { CouponQuery } from "./query";
......@@ -61,37 +60,17 @@ export function addCouponRecord(data: object) {
}
async function legacyPost(path: string, data: object) {
try {
const response = (await legacyRequest.post(
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;
}
const response = await axios.post(path, data);
return { payload: response.data, message: response.message };
}
export async function getCouponConfig() {
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" }) {
const result = await legacyPost("/system/config/couponEdit", data);
if (!result) {
return false;
}
message.success(result.message);
return true;
}
import axios from '@/utils/request.js';
import qs from "qs";
import axios from "@/utils/axios";
import { message } from "antd";
import { get } from "lodash-es";
// 获取列表
const getList = async (obj) => {
try {
const res = await axios.post("/system/app/help/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;
}
export const getList = async (obj) => {
const res = await axios.post("/system/app/help/getList", obj);
return res.data;
};
// 添加帮助
const addHelp = async (obj) => {
try {
const res = await axios.post("/system/app/help/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;
}
export const addHelp = async (obj) => {
const res = await axios.post("/system/app/help/add", obj);
message.success(res.message);
return true;
};
// 获取帮助详情
const HelpInfo = async (obj) => {
try {
const res = await axios.post("/system/app/help/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 error;
}
export const HelpInfo = async (obj) => {
const res = await axios.post("/system/app/help/getInfoById", obj);
return res.data;
};
// 修改
const editHelp = async (obj) => {
try {
const res = await axios.post("/system/app/help/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 error;
}
export const editHelp = async (obj) => {
const res = await axios.post("/system/app/help/edit", obj);
message.success(res.message);
return res.data;
};
// 修改
const editPreview = async (obj) => {
try {
const res = await axios.post("/system/app/help/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) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return error;
}
export const editPreview = async (obj) => {
const res = await axios.post("/system/app/help/edit", obj);
return res.data;
};
// 删除
const delHelp = async (obj) => {
try {
const res = await axios.post("/system/app/help/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;
}
export const delHelp = async (obj) => {
const res = await axios.post("/system/app/help/del", obj);
message.success(res.message);
return true;
};
export { getList, addHelp, HelpInfo, editHelp, delHelp, editPreview };
import { message } from "antd";
// @ts-expect-error The legacy workspace does not install the qs declaration package.
import qs from "qs";
import request from "@/utils/request.js";
import axios, { notifySuccess } from "@/utils/axios";
export interface PersonalizedSettings {
teacher_divide?: string | number;
......@@ -10,37 +6,13 @@ export interface PersonalizedSettings {
comments_need_approval?: "" | "0" | "1";
}
type ApiBody<T> = {
code?: number;
data?: T;
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 getPersonalizedSettings(): Promise<PersonalizedSettings> {
const response = await axios.post("/system/config/getSystem");
return response.data ?? {};
}
export async function savePersonalizedSettings(values: PersonalizedSettings) {
try {
const response = await request.post("/system/config/systemEdit", qs.stringify(values));
const body = response.data as ApiBody<unknown>;
const text = body?.message ?? "数据获取失败!";
if (body?.code === 200) {
message.success(text);
return true;
}
message.error(text);
return false;
} catch {
return false;
}
const response = await axios.post("/system/config/systemEdit", values);
notifySuccess(response.message);
return true;
}
......@@ -14,7 +14,7 @@ export default function PersonalizedSettingsView() {
const load = useCallback(async () => {
setLoading(true);
const result = await getPersonalizedSettings();
if (result !== false) setValues(result);
setValues(result);
setLoading(false);
}, []);
......
import { message } from "antd";
// @ts-expect-error The legacy workspace does not install the qs declaration package.
import qs from "qs";
import request from "@/utils/request.js";
import axios, { notifySuccess } from "@/utils/axios";
export interface PointSettings {
integral_switch?: string | number;
......@@ -32,79 +29,36 @@ interface RechargeResult {
err?: RechargeMessageGroup;
}
type ApiBody<T> = {
code?: number;
data?: T;
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 getPointSettings(): Promise<PointSettings> {
const response = await axios.post("/system/config/getIntegral");
return response.data ?? {};
}
export async function setPointSwitch(integralSwitch: "0" | "1") {
try {
const response = await request.post(
"/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;
}
await axios.post("/system/config/integralSet", { integral_switch: integralSwitch });
return true;
}
export async function savePointSettings(values: PointSettingsFormValues) {
try {
const response = await request.post("/system/config/integralEdit", qs.stringify(values));
const body = response.data as ApiBody<unknown>;
const text = body?.message ?? "数据获取失败!";
if (body?.code === 200) {
message.success(text);
return true;
}
message.error(text);
return false;
} catch {
return false;
}
const response = await axios.post("/system/config/integralEdit", values);
notifySuccess(response.message);
return true;
}
export async function rechargePoints(values: RechargeFormValues) {
try {
const response = await request.post("/members/integral/add", qs.stringify(values));
const body = response.data as ApiBody<RechargeResult>;
if (body?.code === 3000) {
message.warning("优惠券已过期");
return true;
}
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);
}
const response = await axios.post("/members/integral/add", values);
const data = response.data as RechargeResult;
const success = data?.suc ?? {};
const failure = data?.err ?? {};
if (failure.msg === " 手机号:" && success.title && !success.title.includes("充值成功(0)")) {
if (success.msg !== "") message.success(`${success.msg}充值成功`, 10);
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() {
const load = useCallback(async () => {
setLoading(true);
const result = await getPointSettings();
if (result !== false) {
setSettings(result);
setIntegralEnabled(String(result.integral_switch) !== "0");
}
setSettings(result);
setIntegralEnabled(String(result.integral_switch) !== "0");
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 {
findTreeToIndex,
findNodeById,
} 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";
const Examine = () => {
......
import { message } from 'antd'
import { get } from 'lodash-es'
import qs from 'qs'
import axios from '@/utils/request.js'
import axios, { notifySuccess } from '@/utils/axios'
async function request(
path: string,
payload: Record<string, unknown>,
{ success = false, returnData = false }: { success?: boolean; returnData?: boolean } = {},
) {
try {
const response = await axios.post(path, qs.stringify(payload))
const code = get(response, 'data.code', 0)
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
}
const response = await axios.post(path, payload)
if (success) notifySuccess(response.message)
return returnData ? response.data : true
}
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 qs from "qs";
import { Modal, notification } from "antd";
import { message, Modal, notification } from "antd";
import { ADMIN_LOGIN_PATH, normalizeAdminApiPath } from "@/utils/adminPaths.js";
// import { sm4 as Sm4js } from 'evit-gm-crypt'
// const sm4 = new Sm4js({
// key: 'XDXDXU_ZIJING_01',
// mode: 'cbc',
// iv: 'IVIVIV_ZHIXUE_01',
// cipherType: 'base64'
// })
export interface ApiResponse<T = unknown> {
code: number;
message?: string;
data: T;
}
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() {
return window.localStorage.getItem("kiwi.token") ? window.localStorage.getItem("kiwi.token") : "";
function getToken(): string {
return window.localStorage.getItem("kiwi.token") ?? "";
}
function showLoginModal() {
function showLoginModal(): void {
Modal.warning({
title: "登录状态已过期,请重新登录",
onOk() {
......@@ -26,86 +38,95 @@ function showLoginModal() {
});
}
// 排序
function alphabeticalSort(a, b) {
function alphabeticalSort(a: string, b: string): number {
return a.localeCompare(b);
}
const httpRequest = axios.create({
baseURL: import.meta.env.VITE_API_PREFIX,
function serializeSignValue(value: unknown): string {
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,
});
// 请求拦截器
httpRequest.interceptors.request.use(
(config) => {
(config: InternalAxiosRequestConfig) => {
config.url = normalizeAdminApiPath(config.url);
const token = getToken();
// 应用设置
const appId = "TzEU5jPk2tu80266";
const appSecret = "0a006048a4480481b18fef1405120b83";
const timestamp = Math.floor(Date.now() / 1000);
const requestData = getSignData(config.data);
const signData = {
...config.data,
...requestData,
appId,
appSecret,
timestamp,
token,
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 });
const salt = "&4F6g4Y6b5L4R9";
const sign = md5(md5(signStr + salt));
const defaultHeaders = {
config.headers.set({
Authorization: token,
AppId: appId,
AppSecret: appSecret,
Timestamp: timestamp,
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;
},
(error) => {
return Promise.reject(error);
},
(error: unknown) => Promise.reject(error),
);
// 响应拦截器
httpRequest.interceptors.response.use(
(response) => {
(response: AxiosResponse<ApiResponse>) => {
const { data } = response;
if (data.code === 401 || data.code === 403) {
if (location.pathname !== ADMIN_LOGIN_PATH) {
showLoginModal();
}
if (location.pathname !== ADMIN_LOGIN_PATH) showLoginModal();
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 || "请求错误" });
return Promise.reject(data);
}
return data;
},
(error) => {
(error: { response?: AxiosResponse<ApiResponse> }) => {
if (error.response) {
const { status, data = {} } = error.response;
const { status, data } = error.response;
if (status === 401 || status === 403) {
showLoginModal();
} else {
notification.error({ message: data.message || "请求错误" });
console.error(`${status}: ${data.message}`);
notification.error({ message: data?.message || "请求错误" });
console.error(`${status}: ${data?.message}`);
}
} else {
console.log(error);
......@@ -114,4 +135,4 @@ httpRequest.interceptors.response.use(
},
);
export default httpRequest;
export default httpRequest as ApiClient;
import $ from "jquery";
import axios from "@/utils/request.js";
import qs from "qs";
import axios from "@/utils/axios";
import { message } from "antd";
let RotateVerify; // 声明 RotateVerify 变量
......@@ -79,15 +78,16 @@ let RotateVerify; // 声明 RotateVerify 变量
axios
.post(
this.settings.initUrl,
qs.stringify({
{
drag_wrap: this.$slideDragWrap.width(),
drag_btn: this.$slideDragBtn.width(),
}),
},
{ resolveBusinessError: true },
)
.then((res) => {
const code = res.data.code;
const data = res.data.data;
const msg = res.data.message;
const code = res.code;
const data = res.data;
const msg = res.message;
if (code === 200) {
this.randRot = data.rand_rot;
this.code = data.code;
......@@ -193,9 +193,9 @@ let RotateVerify; // 声明 RotateVerify 变量
_this.settings.verifyParam.disLf = _this.disLf;
axios
.post(_this.settings.verifyUrl, _this.settings.verifyParam)
.post(_this.settings.verifyUrl, _this.settings.verifyParam, { resolveBusinessError: true })
.then(function (res) {
if (res.data.code === 200) {
if (res.code === 200) {
_this.$slideDragBtn.addClass("control-btn-suc");
_this.controlBorWrap.addClass("control-bor-suc");
_this.statusBg.fadeIn();
......@@ -307,9 +307,9 @@ let RotateVerify; // 声明 RotateVerify 变量
_this.settings.verifyParam.disLf = _this.disLf;
axios
.post(_this.settings.verifyUrl, _this.settings.verifyParam)
.post(_this.settings.verifyUrl, _this.settings.verifyParam, { resolveBusinessError: true })
.then(function (res) {
if (res.data.code === 200) {
if (res.code === 200) {
_this.verifyState = true;
_this.$slideDragBtn.addClass("control-btn-suc");
_this.controlBorWrap.addClass("control-bor-suc");
......
import { asBlob } from "html-docx-js-typescript";
import { saveAs } from "file-saver";
import $ from "jquery";
/**
* 将图片 URL 转为 base64 Data URI
......@@ -100,7 +99,7 @@ export async function exportHtmlToWord(name, htmlString, removeSelectors = []) {
const doc = parser.parseFromString(htmlString, "text/html");
if (removeSelectors.length) {
$(doc.body).find(removeSelectors.join(", ")).remove();
doc.body.querySelectorAll(removeSelectors.join(", ")).forEach((element) => element.remove());
}
// 将所有图片转为 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 人 到此讨论。请谨慎行事。
请先完成此评论的编辑!
请 注册 或者 后发表评论