Commit 0bc5a1fc authored by wuhao's avatar wuhao 🎯

laosd

parent a31a3320
......@@ -109,11 +109,18 @@ export default [
path: "/work/dobustrain/:id",
component: "./dobustrain",
},
{
name: "成绩管理",
path: "/work/rebustrain/:id",
component: "./rebustrain",
},
{
name: "我的实训",
path: "/work/mybustrain",
component: "./mybustrain",
},
],
},
{
......
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -102,14 +102,14 @@ const AutoTable = (props) => {
fieldProps: {
...it?.fieldProps,
options: [...it.options],
dropdownMatchSelectWidth: 200,
popupMatchSelectWidth: 200,
},
};
} else if (it.options) {
options = {
fieldProps: {
...it?.fieldProps,
dropdownMatchSelectWidth: 200,
popupMatchSelectWidth: 200,
showSearch: true,
},
params: paramconfig[curkey],
......
......@@ -74,6 +74,7 @@ export default function DraggableDialog({
loading={loading}
loadingPosition="start"
startIcon={<SendOutlined />}
disabled={dialogprops?.disabled}
onClick={() => {
formRef?.current?.submit();
}}
......
......@@ -117,7 +117,7 @@ const EditTable = (props) => {
recordCreatorProps={false}
size={size}
onSubmit={(params) => {
console.log(params, 'onSubmit');
// console.log(params, 'onSubmit');
}}
onSizeChange={(size) => {
localStorage.setItem('size', size); //设置全局表格规格缓存
......
......@@ -456,7 +456,7 @@ function NolinkSelect({ item, colProps }) {
return (
<>
<ProFormSelect
fieldProps={{ ...item.fieldProps, dropdownMatchSelectWidth: 200 }}
fieldProps={{ ...item.fieldProps, popupMatchSelectWidth: 200 }}
formItemProps={item.formItemProps}
name={item.key ?? item.dataIndex}
colProps={item.colProps ?? colProps}
......@@ -1333,71 +1333,65 @@ function TableSelect({ item, value, onChange, params = {} }) {
const [activetab, setactivetab] = useState(1);
const actionRef = useRef();
const menu = (selectedRows) => (
<Menu
style={{ width: 160 }}
items={
selectedRows.length > 0
? selectedRows.map((it) => ({
key: it[rowKey],
label: (
<div
className="spread"
onClick={(e) => {
e.stopPropagation();
let key = it[rowKey];
setchooses((s) => {
let news = [...s];
if (s.includes(key)) {
news = news.filter((it) => {
return it != key;
});
} else {
news.push(key);
}
return news;
const items =
value?.length > 0
? value?.map?.((it) => ({
key: it[rowKey],
label: (
<div
className="spread"
onClick={(e) => {
e.stopPropagation();
let key = it[rowKey];
setchooses((s) => {
let news = [...s];
if (s.includes(key)) {
news = news.filter((it) => {
return it != key;
});
}}
>
<span
style={{
color: chooses.includes(it[rowKey])
? "#1890ff"
: "#333333",
transition: "all 0.4s",
userSelect: "none",
}}
>
{it[item.rowName]}
</span>
<CloseOutlined
onClick={(e) => {
e.stopPropagation();
let newvalue = value.filter(
(its) => its[rowKey] != it[rowKey]
);
onChange(newvalue);
setchooses((s) => {
let news = [...s];
news = news.filter((its) => {
return its != it[rowKey];
});
return news;
});
}}
/>
</div>
),
}))
: [
{
key: -1,
label: "请先选择",
},
]
}
/>
);
} else {
news.push(key);
}
return news;
});
}}
>
<span
style={{
color: chooses.includes(it[rowKey]) ? "#1890ff" : "#333333",
transition: "all 0.4s",
userSelect: "none",
paddingRight:12
}}
>
{it[item.rowName??"name"]}
</span>
<CloseOutlined
style={{color:"red"}}
onClick={(e) => {
e.stopPropagation();
let newvalue = value.filter(
(its) => its[rowKey] != it[rowKey]
);
onChange(newvalue);
setchooses((s) => {
let news = [...s];
news = news.filter((its) => {
return its != it[rowKey];
});
return news;
});
}}
/>
</div>
),
}))
: [
{
key: -1,
label: "请先选择",
},
];
useDidUpdateEffect(() => {
onChange(null);
......@@ -1508,7 +1502,11 @@ function TableSelect({ item, value, onChange, params = {} }) {
<Tabs
tabBarExtraContent={
<div className="center">
<Dropdown menu={menu(value ?? [])}>
<Dropdown
menu={{
items,
}}
>
<a>
已选择{value?.length ?? 0}<DownOutlined />
</a>
......
......@@ -86,7 +86,7 @@ let FormRender = memo(({ fields = [], colProps, proformRef }) => {
function InitForm({
formRef,
onFinish = (vals, extra) => {
console.log(vals, extra);
//console.log(vals, extra);
},
formKey,
params = {},
......@@ -97,8 +97,9 @@ function InitForm({
fields,
colProps = { xs: 24, sm: 24, md: 12, lg: 12, xl: 12, xxl: 12 },
onValuesChange = (changedValues, allValues) => {
console.log(changedValues, allValues);
//console.log(changedValues, allValues);
},
disabled
}) {
let proformRef = useRef();
proformRef = formRef ?? proformRef;
......@@ -115,11 +116,11 @@ function InitForm({
? submitter
: {
render: (props, doms) => {
console.log("submitterProps", props);
return [
<Button
type="reset"
key="rest"
disabled={disabled}
onClick={() => props.form?.resetFields()}
>
重置
......@@ -128,6 +129,7 @@ function InitForm({
type="submit"
key="submit"
variant="contained"
disabled={disabled}
onClick={(e) => {
e.preventDefault();
return props.form?.submit?.();
......
......@@ -49,7 +49,7 @@ export default function ShopProductCard({
copy,
publish,
authorized,
tauthorized
tauthorized,
}) {
const {
trainName,
......@@ -174,9 +174,7 @@ export default function ShopProductCard({
<Tooltip placement="bottom-start" title={"协作教师"}>
<IconButton
onClick={() => {
if (ifs) {
tauthorized(product);
}
tauthorized(product, ifs);
}}
>
<GroupIcon
......@@ -191,7 +189,7 @@ export default function ShopProductCard({
<Tooltip placement="bottom-start" title={"成绩管理"}>
<IconButton
onClick={() => {
publish(product, { type: 3 });
history.push("/work/rebustrain/" + product.id);
}}
>
<IconFont
......@@ -318,9 +316,7 @@ export default function ShopProductCard({
alignItems={"center"}
sx={{ cursor: "pointer" }}
onClick={() => {
if (ifs) {
authorized(product);
}
authorized(product, ifs);
}}
>
<IconFont
......
......@@ -51,6 +51,7 @@ function TreeRender({
maxWidth,
style,
submitKey,
disabled,
}) {
const [search, setsearch] = useState("");
const [savetitle, setsavetitle] = useState(null);
......@@ -178,51 +179,60 @@ function TreeRender({
<span style={{ marginRight: 6 }}>{title}</span>
<div className="center" style={{ gap: 8 }}>
{item.key && item.key != "00000000" && (
<Tooltip
title="编辑"
onClick={(e) => {
e.stopPropagation();
setsavetitle(null);
if (true) {
setModal({
visible: true,
closable: true,
title: "修改节点名称",
okText: "修改",
cancelText: "取消",
placeholder: item.title,
key: item.key,
});
}
}}
>
<div className="bgs">
<BorderColorIcon style={{ color: "#1890ff", fontSize: 14 }} />
<Tooltip title="编辑">
<div
className="bgs"
onClick={(e) => {
if (disabled) return;
e.stopPropagation();
setsavetitle(null);
if (true) {
setModal({
visible: true,
closable: true,
title: "修改节点名称",
okText: "修改",
cancelText: "取消",
placeholder: item.title,
key: item.key,
});
}
}}
>
<BorderColorIcon
style={{
color: disabled ? "grey" : "#1890ff",
fontSize: 14,
}}
/>
</div>
</Tooltip>
)}
{item.key && item.key != "00000000" && item.children && (
<Tooltip title="新增">
<div className="bgs">
<div
className="bgs"
onClick={(e) => {
if (disabled) return;
e.stopPropagation();
setsavetitle(null);
if (true) {
setModal({
visible: true,
closable: true,
title: "新增子结构",
okText: "新增",
cancelText: "取消",
placeholder: item.title,
key: item.key,
});
}
}}
>
<AddIcon
disabled={false}
onClick={(e) => {
e.stopPropagation();
setsavetitle(null);
if (true) {
setModal({
visible: true,
closable: true,
title: "新增子结构",
okText: "新增",
cancelText: "取消",
placeholder: item.title,
key: item.key,
});
}
}}
style={{
color: `${true ? "green" : ""}`,
color: disabled ? "grey" : "green",
fontSize: 20,
}}
/>
......@@ -236,7 +246,8 @@ function TreeRender({
title="是否删除该节点?"
okText="删除"
cancelText="取消"
onConfirm={() => {
disabled={disabled}
onConfirm={(e) => {
doFetch({ url: deleteurl, params: { id: item.key } }).then(
(res) => {
if (res.code == "0000") {
......@@ -250,7 +261,7 @@ function TreeRender({
<Tooltip title="删除" placement="bottom">
<div className="bgs">
<HorizontalRuleIcon
style={{ color: "red", fontSize: 16 }}
style={{ color: disabled ? "grey" : "red", fontSize: 16 }}
/>
</div>
</Tooltip>
......@@ -334,11 +345,17 @@ function TreeRender({
>
<Typography variant="h6">课程目录</Typography>
<IconButton
disabled={disabled}
onClick={() => {
setDrawer({ open: true });
}}
>
<AddIcon style={{ fontSize: 20, color: colors.blue[600] }}></AddIcon>
<AddIcon
style={{
fontSize: 20,
color: disabled ? colors.grey[600] : colors.blue[600],
}}
></AddIcon>
</IconButton>
<Modal
......@@ -502,7 +519,6 @@ function TreeRender({
showIcon
showLine
onSelect={(selectedKeys, e) => {
// //console.log(selectedKeys);
onselected?.(selectedKeys, e, alldata);
}}
autoExpandParent={autoExpandParent}
......
......@@ -630,4 +630,22 @@ h4 {
width: auto!important;
}
}
}
\ No newline at end of file
}
.lightblue {
> td:first-child {
position: relative;
&::before {
position: absolute;
top: 0;
bottom: 0;
left: 0;
width: 3px;
height: 48%;
margin: auto;
background-color: #ff4800;
border-radius: 0 3px 3px 0;
content: '';
}
}
}
......@@ -119,7 +119,6 @@ export default function AccountPopover() {
setOpen(null);
if (path === "/user/login") {
doFetch({ url: "/system/logout", params: {} }).then((res) => {
console.log(res);
if (res?.code === "0000") {
path && navigate(path);
}
......
......@@ -91,6 +91,7 @@ export default function Searchbar() {
let { data, loading } = useRequest(
async () => {
if(!open) return;
let res = await doFetch({
url: "/system/searchAll",
params: { ...search },
......
......@@ -13,9 +13,6 @@ export default function UserPage() {
setValue(newValue);
};
const location = useLocation();
console.log("====================================");
console.log(location.pathname);
console.log("====================================");
const data = React.useMemo(() => {
const currouteconfig = navConfig?.filter((it, i) => {
......
......@@ -3,7 +3,8 @@ import MuiAlert from "@mui/material/Alert";
import CssBaseline from "@mui/material/CssBaseline";
import Slide from "@mui/material/Slide";
import Snackbar from "@mui/material/Snackbar";
import { Outlet,useModel } from "@umijs/max";
import * as Sentry from "@sentry/react";
import { Outlet, useModel } from "@umijs/max";
import React from "react";
import ThemeProvider from "./theme";
......@@ -33,6 +34,24 @@ import ThemeProvider from "./theme";
</div> */
}
Sentry.init({
dsn: "http://38a2decfe9214e639164d2ca6ef92a67@iot-dev.nangaoyun.com:9000/9",
integrations: [new Sentry.BrowserTracing(), new Sentry.Replay()],
enabled: process.env.NODE_ENV !== "development",
// Set tracesSampleRate to 1.0 to capture 100%
// of transactions for performance monitoring.
// We recommend adjusting this value in production
tracesSampleRate: 1.0,
// Capture Replay for 10% of all sessions,
// plus for 100% of sessions with an error
replaysSessionSampleRate: 0.1,
replaysOnErrorSampleRate: 1.0,
});
Sentry.configureScope(function (scope) {
scope.setLevel("error");
});
const Alert = React.forwardRef(function Alert(props, ref) {
return <MuiAlert elevation={6} ref={ref} variant="filled" {...props} />;
});
......@@ -66,7 +85,7 @@ function App() {
severity={message?.type}
onClose={handleClose}
{...message.alert}
sx={{color:"#f9f9f9"}}
sx={{ color: "#f9f9f9" }}
>
{message?.title ? <AlertTitle>{message?.title}</AlertTitle> : null}
{message?.content}
......
......@@ -62,7 +62,7 @@ function Lessons() {
});
};
const authorized = (row) => {
const authorized = (row, ifs) => {
doFetch({
url: "/trainStudent/queryRelationStudent",
params: { trainId: row?.id },
......@@ -74,12 +74,13 @@ function Lessons() {
defaultFormValue: { ...row },
studentIdList: res?.data?.dataList,
title: "授权",
disabled: !ifs,
});
}
});
};
const tauthorized = (row) => {
const tauthorized = (row, ifs) => {
doFetch({
url: "/busTrainTeacher/queryRelationTeacher",
params: { trainId: row?.id },
......@@ -91,6 +92,7 @@ function Lessons() {
defaultFormValue: { ...row },
teacherIdList: res?.data?.dataList,
title: "协作教师",
disabled: !ifs,
});
}
});
......@@ -163,7 +165,6 @@ function Lessons() {
fields={columns}
defaultFormValue={dialogprops?.defaultFormValue}
onValuesChange={async (changedValues, allValues, formRef) => {
console.log(changedValues);
if (Object.keys(changedValues)[0] === "courseId") {
let id = Object.values(changedValues)?.[0] ?? null;
let res = await doFetch({
......@@ -171,15 +172,8 @@ function Lessons() {
params: { id },
});
let pic = res?.data?.data?.pic ?? [];
console.log(pic);
formRef?.current?.setFieldsValue({
pic: [
{
uid: "1655501390426017792",
url: "https://ng-website.oss-cn-hangzhou.aliyuncs.com/2023/05/08/1655501389482299392Bl6w2X.jpg",
name: "a1.jpg",
},
],
pic,
});
}
}}
......@@ -210,7 +204,7 @@ function Lessons() {
fields={[
{
rowKey: "id",
rowName: "id",
rowName: "name",
valueType: "FormSelectList",
dataIndex: "teacherIdList",
colProps: {
......@@ -269,7 +263,7 @@ function Lessons() {
fields={[
{
rowKey: "id",
rowName: "id",
rowName: "name",
valueType: "FormSelectList",
dataIndex: "studentIdList",
colProps: {
......@@ -372,7 +366,6 @@ function Lessons() {
} else {
news = [...news, val];
}
console.log(news);
return {
...s,
typeList: news,
......
......@@ -50,6 +50,11 @@ function Dolessons() {
);
}, []);
const ifs = useMemo(() => {
let { type } = lessonDetail ?? {};
return !(type === 1 || type === 3);
}, [lessonDetail]);
const checkCourse = (val) => {
if (val.length) {
doFetch({
......@@ -70,6 +75,7 @@ function Dolessons() {
<PremButton
btn={{
size: "small",
disabled: ifs,
variant: "text",
onClick: () => {
setDrawer((v) => ({
......@@ -89,6 +95,7 @@ function Dolessons() {
return (
<PremButton
pop={{
disabled: ifs,
title: "是否删除该实验?",
okText: "确认",
cancelText: "取消",
......@@ -100,6 +107,7 @@ function Dolessons() {
},
}}
btn={{
disabled: ifs,
size: "small",
color: "error",
}}
......@@ -112,6 +120,7 @@ function Dolessons() {
return (
<PremButton
pop={{
disabled: ifs,
title: "是否删除该实验?",
okText: "确认",
cancelText: "取消",
......@@ -125,6 +134,7 @@ function Dolessons() {
btn={{
size: "small",
color: "error",
disabled: ifs,
}}
>
删除
......@@ -233,6 +243,7 @@ function Dolessons() {
saveurl="/busTrainCatalogue/saveOrUpdateCatalogue"
deleteurl="/busTrainCatalogue/deleteCatalogue"
submitKey="catalogue"
disabled={ifs}
params={{
trainId: params?.id,
}}
......@@ -270,6 +281,7 @@ function Dolessons() {
}
});
}}
disabled={ifs}
/>
</Box>
</Grid>
......@@ -534,6 +546,7 @@ function Dolessons() {
</PremButton>
<PremButton
btn={{
disabled:ifs,
variant: "contained",
onClick: addHandel,
}}
......
......@@ -178,7 +178,7 @@ function Lessons() {
fields={[
{
rowKey: "id",
rowName: "id",
rowName: "name",
valueType: "FormSelectList",
dataIndex: "teacherIdList",
colProps: {
......
......@@ -196,7 +196,7 @@ function Lessons() {
fields={[
{
rowKey: "id",
rowName: "id",
rowName: "name",
valueType: "FormSelectList",
dataIndex: "studentIdList",
colProps: {
......
import AutoTable from "@/components/AutoTable";
import DraggableDialog from "@/components/DraggableDialog";
import InitForm from "@/components/InitForm";
import PremButton from "@/components/PremButton";
import { doFetch } from "@/utils/doFetch";
import { Box, Container, Stack, Typography } from "@mui/material";
import { useParams } from "@umijs/max";
import { useAsyncEffect, useRequest } from "ahooks";
import { message, Segmented, Tabs } from "antd";
import { useEffect, useMemo, useState } from "react";
import { history } from "umi";
import "./index.less";
function Dolessons() {
const params = useParams();
const [lessonDetail, setlessonDetail] = useState(null),
[drawer, setDrawer] = useState({
open: false,
}),
[type, settype] = useState("1"),
[active, setactive] = useState();
const { runAsync, loading } = useRequest(doFetch, {
manual: true,
onSuccess: (res, parames) => {
if (res?.code == "0000") {
handleClose();
message.success("操作成功");
}
},
});
useEffect(() => {
doFetch({ url: "/busTrain/detail", params: { id: params?.id } }).then(
(res) => {
if (res.code === "0000") {
setlessonDetail(res?.data?.data);
}
}
);
}, []);
const list = useRequest(
async () => {
let res = await doFetch({
url: "/busTrainExperiment/list",
params: { trainId: params?.id },
});
setactive(res?.data?.dataList?.[0]?.id ?? null);
return res?.data?.dataList;
},
{
debounceWait: 400,
}
);
const ifs = useMemo(() => {
let { type } = lessonDetail ?? {};
return !(type === 1 || type === 3);
}, [lessonDetail]);
const edit = (text, row, _, action) => {
return (
<PremButton
btn={{
size: "small",
disabled: ifs,
variant: "text",
onClick: () => {
setDrawer((v) => ({
open: true,
defaultFormValue: { ...row },
title: "编辑",
}));
},
}}
>
编辑
</PremButton>
);
};
const remove = (text, row, _, action) => {
return (
<PremButton
pop={{
disabled: ifs,
title: "是否删除该实验?",
okText: "确认",
cancelText: "取消",
onConfirm: async () => {
await runAsync({
url: "/busTrainExperiment/remove",
params: { id: row?.id },
});
},
}}
btn={{
disabled: ifs,
size: "small",
color: "error",
}}
>
删除
</PremButton>
);
};
const experimentColumns = useMemo(() => {
let col = [
{ title: "学生姓名", dataIndex: "studentName", key: "studentName" },
{ title: "学生账号", dataIndex: "studentAccount", key: "studentAccount" },
{ title: "分数", dataIndex: "score", key: "score", hideInSearch: true },
{
title: "提交时间",
dataIndex: "finishTime",
key: "finishTime",
hideInSearch: true,
},
{
title: "批阅时间",
dataIndex: "reviewTime",
key: "reviewTime",
hideInSearch: true,
},
{
title: "批阅状态",
dataIndex: "reviewTypeName",
key: "reviewType",
valueType: "select",
options: [
{
label: "待批阅",
value: "1",
},
{
label: "已批阅",
value: "2",
},
],
},
];
return col;
}, []);
const items = useMemo(() => {
return list?.data?.map((it, i) => ({
key: it?.id,
label: it?.experimentName,
children: (
<Box boxShadow={"0 0 18px #f0f0f0"} borderRadius={2}>
<AutoTable
rerendered={it?.id === active}
columns={[
...experimentColumns,
{
title: "操作",
valueType: "option",
width: 180,
render: (text, row, _, action) => [
edit(text, row, _, action),
remove(text, row, _, action),
],
},
]}
path="/studentExperiment/queryPageByExperiment"
extraparams={{
experimentId: it?.id,
type,
}}
/>
</Box>
),
}));
}, [list]);
const addHandel = (val) => {
if (active === "1") {
// 预览
} else if (active === "2") {
// 添加实验
setDrawer({ open: true, title: "添加实验" });
} else {
// 添加问题
setDrawer({ open: true, title: "添加问题" });
}
};
const handleClose = () => {
setDrawer((s) => ({
...s,
open: false,
}));
};
const [semlist, setsemlist] = useState();
useAsyncEffect(async () => {
if (!active) return;
let res = await doFetch({
url: "/studentExperiment/queryScoreStatistics",
params: { experimentId: active },
});
let resdata = res?.data?.data;
setsemlist([
{
value: "1",
label: `待提交(${resdata?.submitNum})`,
},
{
value: "2",
label: `已提交(${resdata?.notSubmitNum})`,
},
]);
}, [active]);
return (
<Container maxWidth={false}>
<DraggableDialog
handleClose={handleClose}
dialogprops={drawer}
loading={loading}
maxWidth={drawer?.maxWidth ?? "sm"}
>
{active === "2" ? (
<InitForm
defaultFormValue={drawer?.defaultFormValue ?? null}
fields={[
{
title: "实验",
dataIndex: "id",
key: "id",
valueType: "select",
options: {
path: "/busTrainExperiment/selection",
params: { trainId: params?.id },
},
formItemProps: {
rules: [
{
required: true,
message: "此项为必填项",
},
],
},
},
{
title: "权重(%)",
dataIndex: "weight",
key: "weight",
valueType: "digit",
formItemProps: {
rules: [
{
required: true,
message: "此项为必填项",
},
],
},
},
{
title: "考试时间(分钟)",
dataIndex: "testTime",
key: "testTime",
valueType: "digit",
formItemProps: {
rules: [
{
required: true,
message: "此项为必填项",
},
],
},
},
{
title: "截止时间",
dataIndex: "deadline",
key: "deadline",
valueType: "date",
formItemProps: {
rules: [
{
required: true,
message: "此项为必填项",
},
],
},
},
]}
onFinish={(val, extra) => {
let postdata;
switch (drawer?.title) {
case "添加实验":
postdata = {
...val,
trainId: params?.id,
};
break;
case "编辑":
postdata = {
...val,
id: drawer?.defaultFormValue?.id,
trainId: params?.id,
};
default:
break;
}
runAsync({
url: "/busTrainExperiment/update",
params: postdata,
});
}}
onValuesChange={(curval, vals, formRef) => {
if (Object.keys(curval)[0] === "id") {
doFetch({
url: "/busTrainExperiment/detail",
params: { id: Object.values(curval)[0] },
}).then((res) => {
formRef?.current?.setFieldsValue({
weight: res?.data?.data?.weight,
});
});
}
}}
></InitForm>
) : (
<InitForm
defaultFormValue={drawer?.defaultFormValue ?? null}
fields={[
{
title: "问题内容",
dataIndex: "question",
key: "question",
valueType: "textarea",
},
{
title: "参考答案",
dataIndex: "answer",
key: "answer",
valueType: "textarea",
},
]}
onFinish={(val, extra) => {
let postdata;
switch (drawer?.title) {
case "添加问题":
postdata = {
...val,
trainId: params?.id,
};
break;
case "编辑":
postdata = {
...val,
id: drawer?.defaultFormValue?.id,
trainId: params?.id,
};
default:
break;
}
runAsync({
url: "/busTrainQuestion/saveOrUpdate",
params: postdata,
});
}}
></InitForm>
)}
</DraggableDialog>
<Box
display={"flex"}
justifyContent={"space-between"}
alignItems={"center"}
sx={{ mb: 2.5 }}
mt={0}
>
<Typography variant="h5">
{lessonDetail?.trainName ?? "暂无名称"}
</Typography>
<Stack spacing={2} direction="row">
<PremButton
btn={{
variant: "outlined",
onClick: (e) => {
e.stopPropagation();
history.back();
},
}}
>
返回
</PremButton>
</Stack>
</Box>
<Box>
<Tabs
activeKey={active}
onChange={setactive}
items={items}
tabPosition="top"
tabBarExtraContent={
<Segmented
value={type}
onChange={(val) => {
settype(val);
}}
options={semlist}
/>
}
/>
</Box>
</Container>
);
}
export default Dolessons;
.white {
.ant-pro-card {
background-color: #f6f6f6 !important;
}
.ant-table-tbody,td {
background-color: #f9f9f9 !important;
}
}
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment