Commit 5fceed1f by guomingpang

feat:考试模块新增答题详情,merge master

parents 4a8eb900 27d81322
...@@ -20,7 +20,8 @@ interface FetchParams { ...@@ -20,7 +20,8 @@ interface FetchParams {
} }
interface FetchOptions { interface FetchOptions {
requestType: string // 请求类型 form为表单类型 json为json类型,默认json类型 requestType: string, // 请求类型 form为表单类型 json为json类型,默认json类型
reject: boolean,
} }
interface HeadersType{ interface HeadersType{
storeId?:any, storeId?:any,
...@@ -33,7 +34,7 @@ class Axios { ...@@ -33,7 +34,7 @@ class Axios {
method: string, method: string,
url: string, url: string,
params: any, params: any,
options: FetchOptions = { requestType: 'json' } options: FetchOptions = { requestType: 'json', reject: false }
): Promise<any> { ): Promise<any> {
const _url = `${url}?storeId=${User.getStoreId()}&token=${User.getToken()}&storeUserId=${User.getStoreUserId()}&userId=${User.getUserId()}`; const _url = `${url}?storeId=${User.getStoreId()}&token=${User.getToken()}&storeUserId=${User.getStoreUserId()}&userId=${User.getUserId()}`;
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
...@@ -86,8 +87,9 @@ class Axios { ...@@ -86,8 +87,9 @@ class Axios {
const { message: ResMessage, success, resultMsg, resultCode } = response.data; const { message: ResMessage, success, resultMsg, resultCode } = response.data;
if (success || resultCode === 0) { if (success || resultCode === 0) {
return response; return response;
} } else if (!options.reject) {
message.error(ResMessage || resultMsg); message.error(ResMessage || resultMsg);
}
return Promise.reject(response.data); return Promise.reject(response.data);
}, (error): AxiosPromise => { }, (error): AxiosPromise => {
const requestStatus = error.request.status const requestStatus = error.request.status
......
import React, { useEffect, useState } from 'react';
import { Empty, ConfigProvider, Table } from 'antd';
function XMTable(props) {
const [empty, setEmpty] = useState(props.renderEmpty || {});
const [data, setData] = useState({});
useEffect(() => {
setEmpty(props.renderEmpty || {})
setData(props);
}, [props]);
// 自定义表格空状态
function customizeRenderEmpty() {
return (
<Empty
image={empty.image || Empty.PRESENTED_IMAGE_SIMPLE}
imageStyle={{
height: 150,
}}
description={empty.description}
></Empty>
);
};
return (
<ConfigProvider className="xm-table-component" renderEmpty={customizeRenderEmpty}>
<Table
{...data}
/>
</ConfigProvider>
)
}
export default XMTable;
\ No newline at end of file
.xm-table-component {
}
\ No newline at end of file
/* /*
* @Author: wufan * @Author: wufan
* @Date: 2020-11-26 14:48:57 * @Date: 2020-11-26 14:48:57
* @Last Modified by: mikey.zhaopeng * @Last Modified by: chenshu
* @Last Modified time: 2020-11-26 14:52:02 * @Last Modified time: 2021-06-03 15:21:09
*/ */
import SearchBar from './SearchBar.tsx'; import SearchBar from './SearchBar.tsx';
...@@ -10,6 +10,7 @@ import PageControl from './PageControl.tsx'; ...@@ -10,6 +10,7 @@ import PageControl from './PageControl.tsx';
import CheckBox from './CheckBox.tsx'; import CheckBox from './CheckBox.tsx';
import CropperModal from './CropperModal.tsx'; import CropperModal from './CropperModal.tsx';
import ImgCutModalNew from './ImgCutModalNew'; import ImgCutModalNew from './ImgCutModalNew';
import XMTable from './XMTable';
export { export {
...@@ -17,5 +18,6 @@ export { ...@@ -17,5 +18,6 @@ export {
PageControl, PageControl,
CheckBox, CheckBox,
CropperModal, CropperModal,
ImgCutModalNew ImgCutModalNew,
XMTable,
} }
\ No newline at end of file
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* @Author: Michael * @Author: Michael
* @Date: 2017-09-08 17:38:18 * @Date: 2017-09-08 17:38:18
* @Last Modified by: chenshu * @Last Modified by: chenshu
* @Last Modified time: 2020-08-31 14:55:30 * @Last Modified time: 2021-06-04 18:19:23
*/ */
@import './variables.less'; @import './variables.less';
...@@ -602,7 +602,7 @@ td.ant-table-column-sort { ...@@ -602,7 +602,7 @@ td.ant-table-column-sort {
background: none; background: none;
} }
.ant-modal-content .ant-table-thead > tr > th { .ant-modal-content .ant-table-thead > tr > th {
padding: 9px 24px; padding: 9px 24px !important;
} }
.ant-modal-content tr > td { .ant-modal-content tr > td {
...@@ -766,11 +766,12 @@ td.ant-table-column-sort { ...@@ -766,11 +766,12 @@ td.ant-table-column-sort {
} }
} }
.ant-table-column-title {
flex: initial !important;
}
// 排序小三角 // 排序小三角
.ant-table-column-sorter { .ant-table-column-sorter {
margin-left: 2px !important; margin-left: 8px !important;
}
.ant-table-column-sorter-full {
margin-top: -0.32rem !important;
} }
/* /*
* @Author: zhujian * @Author: zhujian
* @Date: 2018-10-10 20:49:11 * @Date: 2018-10-10 20:49:11
* @Last Modified by: zhujiapeng * @Last Modified by: chenshu
* @Last Modified time: 2020-11-16 17:02:11 * @Last Modified time: 2021-06-03 16:42:22
*/ */
// import './s.less' // import './s.less'
...@@ -42,6 +42,7 @@ class DefaultIcon extends React.Component { ...@@ -42,6 +42,7 @@ class DefaultIcon extends React.Component {
preserveAspectRatio: 'xMidYMid slice' preserveAspectRatio: 'xMidYMid slice'
} }
} }
console.log(defaultOptions, this.props, 777777)
return ( return (
<div style={this.props.style} className="DefaultIcon" key="icon"> <div style={this.props.style} className="DefaultIcon" key="icon">
<Lottie <Lottie
......
...@@ -12,6 +12,7 @@ import { Input, Button, Tree } from "antd"; ...@@ -12,6 +12,7 @@ import { Input, Button, Tree } from "antd";
import "./Classification.less"; import "./Classification.less";
import User from "@/common/js/user"; import User from "@/common/js/user";
import KnowledgeAPI from "@/data-source/knowledge/request-api"; import KnowledgeAPI from "@/data-source/knowledge/request-api";
import Bus from "@/core/bus";
const { Search } = Input; const { Search } = Input;
const { DirectoryTree } = Tree; const { DirectoryTree } = Tree;
...@@ -31,6 +32,11 @@ class Classification extends Component { ...@@ -31,6 +32,11 @@ class Classification extends Component {
componentDidMount() { componentDidMount() {
this.queryCategoryTree(); this.queryCategoryTree();
Bus.bind('knowledgeCategoryTree', this.queryCategoryTree)
}
componentWillUnmount() {
Bus.unbind('knowledgeCategoryTree', this.queryCategoryTree)
} }
shouldComponentUpdate = (nextProps, nextState) => { shouldComponentUpdate = (nextProps, nextState) => {
......
...@@ -7,17 +7,19 @@ ...@@ -7,17 +7,19 @@
* @Copyright: © 2020 杭州杰竞科技有限公司 版权所有 * @Copyright: © 2020 杭州杰竞科技有限公司 版权所有
*/ */
import React from "react" import React from "react";
import { Table, Modal, message, Tooltip, Switch, Dropdown, Button } from "antd" import { Modal, message, Tooltip, Switch, Dropdown, Button } from "antd";
import { Route, withRouter } from "react-router-dom" import { Route, withRouter } from "react-router-dom";
import { PageControl } from "@/components" import Lottie from 'react-lottie';
import { LIVE_SHARE_MAP } from "@/common/constants/academic/cloudClass" import { PageControl, XMTable } from "@/components";
import { appId, shareUrl, LIVE_SHARE } from "@/domains/course-domain/constants" import { LIVE_SHARE_MAP } from "@/common/constants/academic/cloudClass";
import ScanFileModal from "../../resource-disk/modal/ScanFileModal" import { appId, shareUrl, LIVE_SHARE } from "@/domains/course-domain/constants";
import WatchData from "./WatchData" import ScanFileModal from "../../resource-disk/modal/ScanFileModal";
import KnowledgeAPI from "@/data-source/knowledge/request-api" import WatchData from "./WatchData";
import ENUM from "../ENUM.js" import KnowledgeAPI from "@/data-source/knowledge/request-api";
import "./KnowledgeBaseList.less" import ENUM from "../ENUM.js";
import * as nodata from '../../lottie/nodata/data.json';
import "./KnowledgeBaseList.less";
const DEFAULT_SIZE_UNIT = 1000 * 1000 // 将B转换成M const DEFAULT_SIZE_UNIT = 1000 * 1000 // 将B转换成M
const { confirm } = Modal const { confirm } = Modal
...@@ -127,8 +129,7 @@ class KnowledgeBaseList extends React.Component { ...@@ -127,8 +129,7 @@ class KnowledgeBaseList extends React.Component {
// 预览文件 // 预览文件
handleScanFile = (folder) => { handleScanFile = (folder) => {
console.log(folder) const { folderFormat, folderSize, ossUrl } = folder;
const { folderFormat, folderSize, ossUrl } = folder
switch (folderFormat) { switch (folderFormat) {
case "PDF": case "PDF":
window.open(ossUrl, "_blank") window.open(ossUrl, "_blank")
...@@ -403,7 +404,6 @@ class KnowledgeBaseList extends React.Component { ...@@ -403,7 +404,6 @@ class KnowledgeBaseList extends React.Component {
width: 160, width: 160,
fixed: "right", fixed: "right",
render: (val, record, index) => { render: (val, record, index) => {
console.log(this.props.categoryId)
return this.props.categoryId === "0" ? ( return this.props.categoryId === "0" ? (
<div className='operate'> <div className='operate'>
<div className='operate__item' onClick={() => this.handleDelete(record)}> <div className='operate__item' onClick={() => this.handleDelete(record)}>
...@@ -451,9 +451,8 @@ class KnowledgeBaseList extends React.Component { ...@@ -451,9 +451,8 @@ class KnowledgeBaseList extends React.Component {
// 前往上课数据页面 // 前往上课数据页面
handleLinkToClassData = (item) => { handleLinkToClassData = (item) => {
const { match } = this.props const { match } = this.props;
console.log(item) localStorage.setItem("WatchData_CourseName", item.name);
localStorage.setItem("WatchData_CourseName", item.name)
window.RCHistory.push({ window.RCHistory.push({
// pathname: `${match.url}/course-data?type=${item.courseType}&id=${item.liveCourseId}`, // pathname: `${match.url}/course-data?type=${item.courseType}&id=${item.liveCourseId}`,
pathname: `${match.url}/course-data?type=${item.type}&id=${item.id}` pathname: `${match.url}/course-data?type=${item.type}&id=${item.id}`
...@@ -467,9 +466,13 @@ class KnowledgeBaseList extends React.Component { ...@@ -467,9 +466,13 @@ class KnowledgeBaseList extends React.Component {
} }
KnowledgeAPI.delKnowledge(params).then((res) => { KnowledgeAPI.delKnowledge(params).then((res) => {
if (res.success) { if (res.success) {
message.success("移出成功") const { onChange, updateCategoryTree, selectedRowKeys, onSelectChange } = this.props;
this.props.onChange() message.success("移出成功");
this.props.updateCategoryTree() onChange();
updateCategoryTree();
if (selectedRowKeys.includes(item.id)) {
onSelectChange(_.reject(selectedRowKeys, value => value === item.id));
}
} }
}) })
} }
...@@ -484,19 +487,45 @@ class KnowledgeBaseList extends React.Component { ...@@ -484,19 +487,45 @@ class KnowledgeBaseList extends React.Component {
} }
render() { render() {
const { dataSource = [], totalCount, query, match } = this.props const { dataSource = [], totalCount, query, match, selectedRowKeys, onSelectChange } = this.props;
const { current, size } = query const { current, size } = query;
const rowSelection = {
selectedRowKeys,
preserveSelectedRowKeys: true,
onChange: onSelectChange,
}
const defaultOptions = {
loop: true,
autoplay: true,
animationData: nodata,
rendererSettings: {
preserveAspectRatio: 'xMidYMid slice'
}
}
return ( return (
<div className='knowledge-base-list'> <div className="knowledge-base-list">
<Table <XMTable
rowKey={(record) => record.id} rowKey={(record) => record.id}
size='middle' rowSelection={rowSelection}
size="middle"
dataSource={dataSource} dataSource={dataSource}
columns={this.parseColumns()} columns={this.parseColumns()}
pagination={false} pagination={false}
scroll={{ x: 900 }} scroll={{ x: 900 }}
bordered bordered
className='knowledge-list-table' className="knowledge-list-table"
renderEmpty={{
image: <div style={{ marginTop: 24 }}>
<Lottie
options={defaultOptions}
height={150}
width={150}
isStopped={false}
isPaused={false}
/>
</div>,
description: <span style={{ display: 'block', paddingBottom: 24 }}>暂无数据</span>
}}
/> />
<div className='box-footer'> <div className='box-footer'>
......
...@@ -9,19 +9,27 @@ ...@@ -9,19 +9,27 @@
import React, { useState, useEffect } from "react"; import React, { useState, useEffect } from "react";
import { Button, Menu, Dropdown,message } from "antd"; import { Button, Menu, Dropdown,message, Modal } from "antd";
import SelectPrepareFileModal from "@/modules/prepare-lesson/modal/SelectPrepareFileModal"; import SelectPrepareFileModal from "@/modules/prepare-lesson/modal/SelectPrepareFileModal";
import { DownOutlined } from "@ant-design/icons"; import { DownOutlined } from "@ant-design/icons";
import AddCourse from "../modal/AddCourse"; import AddCourse from "../modal/AddCourse";
import User from "@/common/js/user"; import User from "@/common/js/user";
import Service from "@/common/js/service";
import KnowledgeAPI from "@/data-source/knowledge/request-api"; import KnowledgeAPI from "@/data-source/knowledge/request-api";
import MoveModal from '../../teach-tool/modal/MoveModal';
import Bus from "@/core/bus";
import './KnowledgeBaseOpt.less';
export default function KnowledgeBaseOpt({ export default function KnowledgeBaseOpt({
categoryId, categoryId,
selectedRowKeys,
updateCategoryTree, updateCategoryTree,
onChange, onChange,
onChangeKeys,
}) { }) {
const [modal, setModal] = useState(null); const [modal, setModal] = useState(null);
const [openMoveModal, setOpenMoveModal] = useState(false);
const [data, setData] = useState([]);
const menu = ( const menu = (
<Menu> <Menu>
...@@ -34,6 +42,40 @@ export default function KnowledgeBaseOpt({ ...@@ -34,6 +42,40 @@ export default function KnowledgeBaseOpt({
</Menu> </Menu>
); );
useEffect(() => {
queryCategoryTree();
}, []);
useEffect(() => {
clearSelect();
}, [categoryId])
// 查询分类树
function queryCategoryTree() {
let query = {
storeId: User.getStoreId(),
withCount: true,
};
KnowledgeAPI.getCategoryTree(query).then((res) => {
const { categoryList = [] } = res.result;
let list = renderTreeNodes(categoryList);
setData(list);
});
}
function renderTreeNodes(data) {
let newTreeData = data.map((item) => {
item.title = item.categoryName;
item.value = item.id;
item.key = item.id;
if (item.sonCategoryList) {
item.children = renderTreeNodes(item.sonCategoryList);
}
return item;
});
return newTreeData;
};
function handAddCourse() { function handAddCourse() {
let modal = ( let modal = (
<AddCourse <AddCourse
...@@ -86,16 +128,127 @@ export default function KnowledgeBaseOpt({ ...@@ -86,16 +128,127 @@ export default function KnowledgeBaseOpt({
setModal(modal); setModal(modal);
} }
function batchMove() {
if (_.isEmpty(selectedRowKeys)) {
message.warning('请先选择要移动的知识');
return null;
}
setOpenMoveModal(true);
}
function batchMoveRemote(categoryId) {
const data = {
categoryId,
ids: selectedRowKeys,
storeId: User.getStoreId(),
};
Service.Hades('public/hades/batchMoveKnowledgeCategory', data, { reject: true }).then((res) => {
if (res.success) {
message.success('移动成功');
onChange();
Bus.trigger('knowledgeCategoryTree');
clearSelect();
} else {
message.error('移动失败');
}
}).catch(() => {
message.error('移动失败');
})
}
function batchDelete() {
if (_.isEmpty(selectedRowKeys)) {
message.warning('请先选择要删除的知识');
return null;
}
Modal.confirm({
title: "确定要删除知识吗?",
content: "删除后,不可恢复。",
icon: (
<span className="icon iconfont default-confirm-icon">&#xe839; </span>
),
okText: "删除",
cancelText: "取消",
onOk: () => {
const data = {
ids: selectedRowKeys,
storeId: User.getStoreId(),
};
Service.Hades('public/hades/batchDelKnowledge', data, { reject: true }).then((res) => {
if (res.success) {
message.success('删除成功');
onChange();
Bus.trigger('knowledgeCategoryTree');
clearSelect();
} else {
message.error('删除失败');
}
}).catch(() => {
message.error('删除失败');
})
},
})
}
function onSelectPaper(keys) {
if (keys.length > 50) {
message.warning('最多只能选择50个知识');
return null;
}
onChangeKeys(keys);
};
function clearSelect() {
onChangeKeys([]);
}
return ( return (
<div className="video-course-opt"> <div className="knowledge-course-opt">
<Dropdown overlay={menu}> {_.isEmpty(selectedRowKeys) ?
<Button type="primary" className="mr12"> (categoryId !== '0' && <Dropdown overlay={menu}>
<Button type="primary" className="mr8">
添加知识 添加知识
<DownOutlined /> <DownOutlined />
</Button> </Button>
</Dropdown> </Dropdown>)
: <div className="select-container">
<span className="con">
<div>
<span className="icon iconfont tip">&#xe6f2;</span>
<span className="text">已选择{selectedRowKeys.length}</span>
</div>
<div>
<span className="clear" onClick={clearSelect}>清空</span>
</div>
</span>
</div>
}
<Button
className="mr8"
onClick={() => {
batchMove();
}}
>批量移动</Button>
<Button
onClick={() => {
batchDelete();
}}
>批量删除</Button>
{modal} {modal}
{openMoveModal &&
<MoveModal
visible={openMoveModal}
title="知识"
data={data}
categoryId={categoryId}
length={selectedRowKeys.length}
onCancel={() => setOpenMoveModal(false)}
onOk={(categoryId) => {
batchMoveRemote(categoryId);
setOpenMoveModal(false);
}}
/>
}
</div> </div>
); );
} }
.knowledge-course-opt {
display: flex;
.select-container{
margin-right: 24px;
.con{
background: #E9EFFF;
border-radius: 4px;
padding: 3px 16px;
display: inline-flex;
align-items: center;
justify-content: space-between;
.tip{
font-size:14px;
color:#2966FF;
margin-right:8px;
}
.text{
font-size:14px;
color:#666;
margin-right:30px;
}
.clear{
color:#5289FA;
font-size:14px;
}
}
}
}
\ No newline at end of file
...@@ -6,12 +6,12 @@ ...@@ -6,12 +6,12 @@
* @LastEditTime: 2021-05-30 20:36:42 * @LastEditTime: 2021-05-30 20:36:42
* @Copyright: © 2020 杭州杰竞科技有限公司 版权所有 * @Copyright: © 2020 杭州杰竞科技有限公司 版权所有
*/ */
import React from "react" import React from "react";
import { message } from 'antd'
import KnowledgeBaseFilter from "./components/KnowledgeBaseFilter" import KnowledgeBaseFilter from "./components/KnowledgeBaseFilter";
import KnowledgeBaseOpt from "./components/KnowledgeBaseOpt" import KnowledgeBaseOpt from "./components/KnowledgeBaseOpt";
import KnowledgeBaseList from "./components/KnowledgeBaseList" import KnowledgeBaseList from "./components/KnowledgeBaseList";
import Classification from "./components/Classification" import Classification from "./components/Classification";
import KnowledgeAPI from "@/data-source/knowledge/request-api" import KnowledgeAPI from "@/data-source/knowledge/request-api"
import User from "@/common/js/user" import User from "@/common/js/user"
...@@ -28,9 +28,10 @@ export default class KnowledgeBase extends React.Component { ...@@ -28,9 +28,10 @@ export default class KnowledgeBase extends React.Component {
}, },
dataSource: [], // 知识库列表 dataSource: [], // 知识库列表
totalCount: 0, // 知识库数据总条数 totalCount: 0, // 知识库数据总条数
categoryId: "0", categoryId: '0',
updateCategoryFlag: false updateCategoryFlag: false,
} selectedRowKeys: [],
};
} }
componentWillMount() { componentWillMount() {
...@@ -73,8 +74,23 @@ export default class KnowledgeBase extends React.Component { ...@@ -73,8 +74,23 @@ export default class KnowledgeBase extends React.Component {
}) })
} }
onSelectChange = (selectedRowKeys) => {
if (selectedRowKeys.length > 50) {
message.warning('最多只能选择50个题目');
}
const list = _.filter(selectedRowKeys, (item, index) => index < 50);
this.setState({ selectedRowKeys: list });
};
render() { render() {
const { dataSource, totalCount, query, categoryId, updateCategoryFlag } = this.state const {
dataSource,
totalCount,
query,
categoryId,
updateCategoryFlag,
selectedRowKeys,
} = this.state;
return ( return (
<div className='page'> <div className='page'>
<div className='content-header'>知识库</div> <div className='content-header'>知识库</div>
...@@ -92,13 +108,19 @@ export default class KnowledgeBase extends React.Component { ...@@ -92,13 +108,19 @@ export default class KnowledgeBase extends React.Component {
<KnowledgeBaseFilter onChange={this.handleFetchScheduleList} /> <KnowledgeBaseFilter onChange={this.handleFetchScheduleList} />
{/* 操作模块 */} {/* 操作模块 */}
{categoryId !== "0" && ( <KnowledgeBaseOpt
<KnowledgeBaseOpt onChange={this.handleFetchScheduleList} updateCategoryTree={this.updateCategoryTree} categoryId={categoryId} /> onChange={this.handleFetchScheduleList}
)} updateCategoryTree={this.updateCategoryTree}
categoryId={categoryId}
selectedRowKeys={selectedRowKeys}
onChangeKeys={(keys) => this.setState({ selectedRowKeys: keys })}
/>
{/* 知识库列表模块 */} {/* 知识库列表模块 */}
<KnowledgeBaseList <KnowledgeBaseList
query={query} query={query}
selectedRowKeys={selectedRowKeys}
onSelectChange={this.onSelectChange}
categoryId={categoryId} categoryId={categoryId}
dataSource={dataSource} dataSource={dataSource}
totalCount={totalCount} totalCount={totalCount}
......
{"v":"5.6.10","fr":25,"ip":0,"op":15,"w":150,"h":150,"nm":"暂无数据","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"“ͼ²ã 3”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":8,"s":[3]},{"t":15,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[123.75,80,0],"to":[0,0.333,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[123.75,82,0],"to":[0,0,0],"ti":[0,0.333,0]},{"t":15,"s":[123.75,80,0]}],"ix":2},"a":{"a":0,"k":[118.75,69,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.808,0.723],[1.642,0.918],[0.866,-1.592],[-0.185,-1.123],[0.476,0.336],[-1.841,5.854],[0,0],[-3.308,-2.342],[-1.001,-0.292],[-1.233,-0.708],[-2.019,0.209],[0,0],[-0.111,0.001],[0,0],[0.513,-0.054],[1.414,0.81],[0.393,0.493],[0,0]],"o":[[1.554,-1.391],[-1.52,-0.85],[-0.488,0.897],[-0.51,-0.223],[-2.655,-1.881],[0,0],[-2.014,6.404],[0.909,0.644],[0.578,1.249],[1.722,0.987],[0,0],[0.713,-0.094],[0,0],[-0.278,0.002],[-1.731,0.179],[-0.552,-0.316],[0,0],[1.298,0.059]],"v":[[3.289,4.496],[2.478,-0.925],[-2.043,0.214],[-2.471,3.342],[-3.96,2.502],[-5.26,-9.022],[-6.691,-9.472],[-4.827,3.726],[-1.912,5.14],[0.848,8.225],[6.41,9.263],[6.665,9.233],[8.705,8.925],[8.695,7.425],[6.256,7.772],[1.594,6.923],[0.172,5.684],[0.009,5.468]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-0.425,0.781],[-0.843,-0.471],[0.712,-0.638],[1.189,0.184],[0,0]],"o":[[0.433,-0.795],[0.812,0.454],[-0.606,0.542],[0,0],[-0.346,-1.065]],"v":[[-0.726,0.931],[1.746,0.384],[2.289,3.378],[-0.566,3.905],[-0.806,3.864]],"c":true},"ix":2},"nm":"路径 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"合并路径 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.160783999574,0.4,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[117.553,68.449],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":25,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"“ͼ²ã 4”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":8,"s":[-3]},{"t":15,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[24.25,54,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":8,"s":[24.25,56,0],"to":[0,0,0],"ti":[0,0,0]},{"t":15,"s":[24.25,54,0]}],"ix":2},"a":{"a":0,"k":[19.25,40,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.019,0.253],[1.917,-1.382],[-2.171,-1.066],[-0.403,-0.11],[1.677,-0.515],[3.419,4.224],[0,0],[-4.62,1.419],[-0.594,1.728],[-1.342,0.905],[-0.674,1.186],[0,0],[0.788,-0.532],[1.011,-0.044],[0,0]],"o":[[-0.19,-2.542],[-1.866,1.345],[0.37,0.182],[-0.496,1.177],[-3.984,1.224],[0,0],[3.778,4.667],[2.27,-0.697],[1.477,0.066],[1.009,-0.681],[0,0],[-0.569,1.003],[-0.914,0.617],[0,0],[0.014,-0.248]],"v":[[4.925,-1.62],[0.914,-4.526],[1.966,-0.049],[3.129,0.389],[-0.134,3.055],[-11.181,-1.387],[-12.347,-0.443],[0.306,4.488],[4.643,0.624],[9.007,-0.607],[12.347,-4.486],[11.043,-5.227],[8.168,-1.851],[5.208,-0.874],[4.933,-0.869]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.259,0.127],[-0.735,0.53],[-0.117,-1.561],[0,0],[0,0]],"o":[[-1.302,-0.64],[0.705,-0.508],[0,0],[0,0],[-0.282,-0.082]],"v":[[2.627,-1.395],[1.791,-3.309],[3.429,-1.508],[3.44,-1.294],[3.44,-1.081]],"c":true},"ix":2},"nm":"路径 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"合并路径 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.160783999574,0.4,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[19.39,39.878],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":25,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"左手指","parent":17,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[70,64,0],"ix":2},"a":{"a":0,"k":[70,64,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-0.156,0.62],[0.483,0.121]],"o":[[0,0],[0,0],[0,0],[0.638,0.051],[0.121,-0.483],[0,0]],"v":[[2.094,-0.974],[-3.053,-1.183],[-3.053,0.761],[1.557,1.132],[2.931,0.146],[2.277,-0.948]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.901961023667,0.917646998985,0.956862984452,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[42.98,31.334],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-0.155,0.698],[0.556,0.124]],"o":[[0,0],[0,0],[0,0],[0.713,0.043],[0.123,-0.555],[0,0]],"v":[[3.161,-1.091],[-4.255,-1.342],[-4.255,0.875],[2.623,1.298],[4.132,0.163],[3.35,-1.067]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.901961023667,0.917646998985,0.956862984452,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[45.045,27.826],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.883,-0.016],[2.122,-0.362],[0,0],[0,0],[-0.111,0.682],[0.61,0.1]],"o":[[-1.979,-0.166],[-1.053,0.02],[0,0],[0,0],[0.69,0.02],[0.1,-0.61],[0,0]],"v":[[4.088,-1.116],[-0.205,-1.34],[-4.968,-0.767],[-5.199,1.084],[3.698,1.336],[5.099,0.181],[4.176,-1.105]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.901961023667,0.917646998985,0.956862984452,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[45.704,25.613],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-0.226,0.623],[0.424,0.153]],"o":[[0,0],[0,0],[0,0],[0.661,0.048],[0.154,-0.424],[0,0]],"v":[[2.546,-0.951],[-3.213,-1.163],[-3.437,0.737],[1.784,1.115],[3.283,0.143],[2.794,-0.903]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.901961023667,0.917646998985,0.956862984452,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[44.227,29.62],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":25,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"“ͼ²ã 5”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[75,75,0],"ix":2},"a":{"a":0,"k":[70,64,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-54.606,-0.5],[-54.606,0.5],[-70,0.5],[-70,-0.5]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[70,-0.5],[70,0.5],[-44.949,0.5],[-44.949,-0.5]],"c":true},"ix":2},"nm":"路径 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"合并路径 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.627450980392,0.670587995941,0.792156982422,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[70,127],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":25,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"右手指","parent":14,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[70,64,0],"ix":2},"a":{"a":0,"k":[70,64,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0.155,0.621],[-0.483,0.121]],"o":[[0,0],[0,0],[0,0],[-0.637,0.051],[-0.121,-0.483],[0,0]],"v":[[-2.093,-0.975],[3.052,-1.183],[3.052,0.761],[-1.557,1.132],[-2.931,0.146],[-2.276,-0.948]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.901961023667,0.917646998985,0.956862984452,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[96.834,37.498],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0.226,0.623],[-0.424,0.154]],"o":[[0,0],[0,0],[0,0],[-0.661,0.048],[-0.154,-0.424],[0,0]],"v":[[-2.546,-0.951],[3.214,-1.163],[3.438,0.737],[-1.784,1.115],[-3.283,0.143],[-2.794,-0.903]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.901961023667,0.917646998985,0.956862984452,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[95.587,35.783],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0.155,0.698],[-0.555,0.124]],"o":[[0,0],[0,0],[0,0],[-0.714,0.044],[-0.124,-0.556],[0,0]],"v":[[-3.161,-1.091],[4.255,-1.342],[4.255,0.875],[-2.623,1.298],[-4.131,0.163],[-3.35,-1.067]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.901961023667,0.917646998985,0.956862984452,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[94.769,33.989],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.883,-0.017],[-2.122,-0.362],[0,0],[0,0],[0.111,0.682],[-0.61,0.1]],"o":[[1.979,-0.166],[1.054,0.019],[0,0],[0,0],[-0.69,0.02],[-0.101,-0.61],[0,0]],"v":[[-4.088,-1.116],[0.205,-1.34],[4.968,-0.767],[5.199,1.083],[-3.698,1.336],[-5.099,0.18],[-4.175,-1.105]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.901961023667,0.917646998985,0.956862984452,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[94.11,31.777],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":25,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"“ͼ²ã 48”轮廓","parent":9,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[70,64,0],"ix":2},"a":{"a":0,"k":[70,64,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-5.689,-18.652],[10.033,-16.722],[5.689,18.652],[-10.033,16.722]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.694117647059,0.729411764706,0.815686334348,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[91.893,24.285],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":25,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"“ͼ²ã 49”轮廓","parent":9,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[70,64,0],"ix":2},"a":{"a":0,"k":[70,64,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[3.691,-4.534],[-12.312,-6.499],[-3.691,4.534],[12.312,6.499]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.607843137255,0.658823529412,0.792156922583,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[93.891,47.471],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":25,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"“ͼ²ã 50”轮廓","parent":9,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[70,64,0],"ix":2},"a":{"a":0,"k":[70,64,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-14.627,-6.783],[25.66,-1.837],[14.627,6.783],[-25.66,1.837]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.768627510819,0.803921628466,0.89019613827,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[56.2,42.843],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":25,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"“ͼ²ã 51”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[75,75,0],"to":[0,0.167,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[75,76,0],"to":[0,0,0],"ti":[0,0.167,0]},{"t":15,"s":[75,75,0]}],"ix":2},"a":{"a":0,"k":[70,64,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-17.972,-20.16],[22.316,-15.214],[17.972,20.16],[-22.316,15.214]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980451995,0.87450986376,0.937254961799,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[63.888,20.846],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":25,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"“ͼ²ã 19”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[75,75,0],"ix":2},"a":{"a":0,"k":[70,64,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.271,0.046],[0.041,-0.32],[0,0],[0.726,-0.123],[0.18,-1.133]],"o":[[0.136,-0.86],[0.213,-0.036],[0,0],[0.099,-0.768],[-0.669,0.113],[0,0]],"v":[[-0.464,1.074],[0.181,-0.242],[0.362,0.055],[1.077,0.146],[0.061,-0.951],[-1.176,0.962]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.627450980392,0.670587995941,0.792156982422,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[80.263,64.503],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.359,0.468],[0.645,1.872],[1.532,-0.707],[-0.645,-1.872]],"o":[[1.359,-0.468],[-0.645,-1.872],[-1.532,0.707],[0.645,1.872]],"v":[[1.172,3.536],[2.186,-1.159],[-1.049,-3.297],[-2.186,0.885]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.901961023667,0.917646998985,0.956862984452,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[57.317,64.496],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.389,-0.372],[-0.513,1.912],[1.665,0.271],[0.513,-1.913]],"o":[[1.39,0.372],[0.513,-1.912],[-1.666,-0.271],[-0.512,1.912]],"v":[[-1.083,3.404],[2.384,0.077],[0.897,-3.505],[-2.385,-0.673]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.901961023667,0.917646998985,0.956862984452,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[79.965,65.696],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.128,-0.005],[-3.873,1.111],[0.103,-2.213],[-0.757,-0.113],[0.771,-0.132],[0.98,1.684],[-0.001,0.572],[1.726,1.747],[6.681,-5.072],[0.381,-0.913],[-3.94,-3.922]],"o":[[3.051,0.126],[-0.022,0.161],[-0.02,0.446],[1.017,0.152],[2.721,-6.542],[-1.372,-2.357],[0.003,-1.796],[-5.799,-5.871],[-1.277,0.97],[-0.473,1.134],[4.044,4.025]],"v":[[-0.915,10.382],[9.47,8.906],[9.284,12.467],[12.224,11.854],[12.593,12.281],[15.204,-0.058],[12.646,-2.246],[11.347,-7.042],[-10.513,-3.838],[-15.527,-3.838],[-12.244,6.689]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.345097979377,0.388234994926,0.509803981407,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[68.065,50.644],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.802,0.229],[-0.051,-0.075],[0,0],[1.023,-0.293],[1.208,-0.605]],"o":[[1.157,-0.58],[0.647,-0.187],[0,0],[-0.376,-0.552],[-0.869,0.249],[0,0]],"v":[[-2.17,1.235],[0.77,0.02],[1.793,-0.068],[2.618,-0.632],[0.494,-0.942],[-2.618,0.34]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.356862984452,0.4,0.521568986481,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[68.406,70.31],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.836,-0.321],[0,0],[-0.775,1.492]],"o":[[-1.049,2.021],[0,0],[-1.054,-0.185],[0,0]],"v":[[-0.14,-1.868],[1.017,1.868],[1.189,0.883],[0.748,-1.407]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.356862984452,0.4,0.521568986481,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[65.041,66.483],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 6","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.5,-1],[-0.5,1],[0.5,1],[0.5,-1]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.356862984452,0.4,0.521568986481,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[71.025,64.955],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 7","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.5,-1],[-0.5,1],[0.5,1],[0.5,-1]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.356862984452,0.4,0.521568986481,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[61.665,64.751],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 8","np":2,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.154,-0.014],[0.53,-6.061],[0,0],[6.061,0.53],[-0.425,5.576],[-0.006,0.246],[-0.144,3.325],[-5.828,-0.252]],"o":[[6.061,0.53],[0,0],[-0.53,6.061],[-5.571,-0.487],[0.023,-0.297],[0.027,-1.062],[0.253,-5.828],[0.155,0.007]],"v":[[0.827,-14.325],[10.841,-2.391],[10.276,4.064],[-1.658,14.078],[-10.946,3.134],[-10.902,2.319],[-10.646,-4.261],[0.363,-14.356]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.901961023667,0.917646998985,0.956862984452,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[68.453,64.246],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 9","np":2,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-2.985,-0.157],[-0.468,-0.002],[0,0],[-1.744,0.353]],"o":[[0,0],[0,0],[0,0],[2.286,2.387],[0.472,0.025],[0,0],[1.811,-0.006],[0,0]],"v":[[7.657,-4.716],[-6.267,-3.715],[-7.554,-1.104],[-7.657,0.86],[0.25,4.676],[1.661,4.716],[1.857,4.716],[7.19,4.176]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.345097979377,0.388234994926,0.509803981407,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[70.191,76.259],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 10","np":2,"cix":2,"bm":0,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-0.189,-0.198]],"o":[[0,0],[0,0],[0.185,0.213],[0,0]],"v":[[0.332,-0.982],[-0.332,0.366],[-0.332,0.366],[0.229,0.982]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[62.305,76.137],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 11","np":4,"cix":2,"bm":0,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-0.807,0.244],[0,0]],"o":[[0,0],[0,0],[0.822,-0.167],[0,0],[0,0]],"v":[[1.202,-1.178],[-1.133,-0.51],[-1.221,1.178],[1.221,0.562],[1.221,0.54]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.803921987496,0.83529399797,0.917646998985,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[78.603,79.258],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 12","np":4,"cix":2,"bm":0,"ix":12,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[3.833,0.201],[0.288,2.993],[0,0],[0,0]],"o":[[0,0],[0,0],[-0.6,2.946],[-3.832,-0.2],[0,0],[0,0],[0,0]],"v":[[7.83,-8.639],[7.149,4.343],[7.096,4.341],[-0.617,9.223],[-7.777,3.562],[-7.83,3.558],[-7.15,-9.424]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.890196018593,0.909803981407,0.960784014534,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[70.195,76.793],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 13","np":2,"cix":2,"bm":0,"ix":13,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":25,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"“ͼ²ã 29”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[75,75,0],"ix":2},"a":{"a":0,"k":[70,64,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.033,0],[0,0],[-0.033,0]],"o":[[0,0],[0.033,0],[0.033,0]],"v":[[0.098,0],[-0.098,0],[0,0]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.890196018593,0.909803981407,0.960784014534,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[71.95,80.975],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":25,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"“ͼ²ã 30”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[75,75,0],"ix":2},"a":{"a":0,"k":[70,64,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[0,-0.011],[0,0.011],[0,0.011]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.803921987496,0.83529399797,0.917646998985,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[79.824,79.809],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":25,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"“ͼ²ã 31”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[75,75,0],"ix":2},"a":{"a":0,"k":[70,64,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[0,0]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[17.755,-5.095],[17.755,-5.095]],"c":true},"ix":2},"nm":"路径 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"合并路径 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[61.973,76.503],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":25,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"右手","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":8,"s":[0.8]},{"t":15,"s":[0]}],"ix":10},"p":{"a":0,"k":[80,104,0],"ix":2},"a":{"a":0,"k":[75,93,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.363,-1.963],[0,0],[0.089,1.455],[0.509,-0.628],[4.921,0.937],[-0.98,-2.534]],"o":[[0,0],[0.287,-2.233],[-0.299,-4.93],[-0.57,0.703],[-0.537,3.229],[0.686,1.773]],"v":[[-2.824,7.262],[5.211,3.476],[5.51,-2.056],[3.175,-6.634],[-5.062,-6.985],[-4.397,1.658]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.901961023667,0.917646998985,0.956862984452,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[95.307,37.855],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.761,0.945],[7.061,18.159],[4.766,7.205],[0,0],[-1.12,-5.562],[-2.039,-2.273]],"o":[[2.682,-3.329],[-1.853,-4.762],[0,0],[2.38,8.191],[1.903,9.452],[4.143,4.618]],"v":[[8.405,18.667],[5.345,-4.285],[-4.581,-22.235],[-12.405,-17.936],[-7.155,2.695],[-2.092,17.617]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.901961023667,0.917646998985,0.956862984452,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[104.448,62.585],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[9.286,-4.952],[-9.714,4.048],[-9.286,4.952],[9.714,-4.048]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.627450980392,0.670587995941,0.792156982422,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[94,95],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.021,4.028],[-2.245,4.31],[0,0],[0,0],[0,0]],"o":[[-3.02,-4.027],[0,0],[0,0],[0,0],[-6.421,0.015]],"v":[[-14.117,6.429],[-15.28,-6.077],[7.05,-12.464],[17.525,3.664],[0.047,12.449]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.803921987496,0.83529399797,0.917646998985,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[88.232,86.117],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":25,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"“ͼ²ã 37”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[75,75,0],"ix":2},"a":{"a":0,"k":[70,64,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.209,-3.826],[0,0],[3.827,-2.209],[0,0],[2.209,3.826],[-3.826,2.209],[0,0]],"o":[[0,0],[2.209,3.826],[0,0],[-3.826,2.21],[-2.21,-3.826],[0,0],[3.827,-2.21]],"v":[[15.156,-8.75],[15.156,-8.75],[12.227,2.178],[-4.227,11.678],[-15.155,8.75],[-12.227,-2.178],[4.227,-11.678]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.901961023667,0.917646998985,0.956862984452,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[99.866,82],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":25,"st":0,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"“ͼ²ã 38”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[75,75,0],"ix":2},"a":{"a":0,"k":[70,64,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.998,-5.958],[0.002,6.042],[0.998,5.958],[-0.002,-6.042]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.627450980392,0.670587995941,0.792156982422,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[44.5,98],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.676,-7.603],[-0.535,-12.483],[0,0],[1.08,1.565],[1.377,0.564],[4.334,-0.046]],"o":[[0.788,8.85],[0,0],[3.759,-21.617],[-4.256,-6.903],[-9.69,-3.967],[-4.844,0.053]],"v":[[-24.994,-6.65],[-23.011,25.35],[20.573,25.35],[24.591,-9.424],[12.034,-21.383],[-10.572,-22.275]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.803921987496,0.83529399797,0.917646998985,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[68.783,101.65],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":25,"st":0,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"左手","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":8,"s":[-0.5]},{"t":15,"s":[0]}],"ix":10},"p":{"a":0,"k":[67,101.5,0],"ix":2},"a":{"a":0,"k":[62,90.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.279,4.31],[0,0],[0,0],[0,0],[-3.099,4.732]],"o":[[0,0],[0,0],[0,0],[6.077,1.722],[3.099,-4.732]],"v":[[15.434,-4.26],[-6.924,-15.541],[-17.713,2.205],[0.439,13.819],[14.204,9.304]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.803921987496,0.83529399797,0.917646998985,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[48.461,84.181],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.315,-1.178],[0,0],[-1.412,-0.353],[0.379,0.714],[-2.785,4.163],[2.715,0.088]],"o":[[0,0],[1.379,0.841],[4.796,1.198],[-0.424,-0.799],[-3.848,-1.746],[-1.9,-0.061]],"v":[[-6.584,-4.27],[-6.355,3.017],[-2.169,4.808],[3.042,4.249],[6.584,-3.194],[-3.261,-5.945]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.901961023667,0.917646998985,0.956862984452,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[45.355,30.694],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.393,0.139],[-8.35,18.359],[-2.045,6.623],[0,0],[3.281,-5.075],[-0.048,-3.278]],"o":[[4.908,-0.488],[2.094,-4.604],[0,0],[-6.072,7.033],[-5.575,8.624],[0.098,6.656]],"v":[[-6.045,20.992],[8.301,-0.607],[14.51,-17.449],[6.56,-21.13],[-7.469,-2.968],[-14.462,12.212]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.901961023667,0.917646998985,0.956862984452,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[32.44,54.841],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[3.599,3.19],[2.427,2.713],[-2.316,2.072],[-0.467,0.227],[-3.535,-2.681],[0,0]],"o":[[-7.055,-5.685],[-2.2,-1.948],[-2.072,-2.316],[0.387,-0.347],[3.989,-1.942],[0,0],[0,0]],"v":[[8.994,15.528],[-6.988,2.218],[-13.928,-4.774],[-13.487,-12.721],[-12.199,-13.586],[0.067,-12.382],[16.001,-0.297]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.901961023667,0.917646998985,0.956862984452,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[35.276,78.253],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":25,"st":0,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"形状图层 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[171,33,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[39.318,53.689],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"矩形路径 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.960784373564,0.972549079446,0.984313785329,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-49.341,25.345],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"矩形 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":25,"st":0,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"形状图层 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[76,75,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[39.318,53.689],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"矩形路径 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.960784373564,0.972549079446,0.984313785329,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-44.878,24.026],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"矩形 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":25,"st":0,"bm":0}],"markers":[]}
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
{"v":"5.6.10","fr":25,"ip":0,"op":15,"w":150,"h":150,"nm":"提示性添加","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"“ͼ²ã 3”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[75,78.5,0],"ix":2},"a":{"a":0,"k":[70,60.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.135,0.204],[-0.096,0.017],[0,0],[0,0],[0,-0.132],[0,0],[0,0],[0,0],[0.155,0.189],[0.238,-0.004],[0,0],[0.205,-0.315],[0.105,-0.523]],"o":[[0.091,-0.463],[0.138,-0.207],[0,0],[0,0],[0.012,0.013],[0,0],[0,0],[0,0],[0,-0.24],[-0.153,-0.191],[0,0],[-0.345,0.058],[-0.208,0.318],[0,0]],"v":[[-0.465,1.011],[-0.107,0.008],[0.245,-0.28],[0.32,-0.287],[0.407,-0.262],[0.452,-0.057],[0.446,0.041],[1.163,0.113],[1.172,-0.057],[0.962,-0.72],[0.32,-1.007],[0.126,-0.99],[-0.709,-0.386],[-1.172,0.87]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.627450980392,0.670587995941,0.792156982422,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[99.144,51.033],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.435,-0.439],[-0.585,1.913],[1.655,0.401],[0.585,-1.913]],"o":[[1.339,0.409],[0.585,-1.913],[-1.684,-0.306],[-0.585,1.913]],"v":[[-1.221,3.376],[2.368,0.187],[0.979,-3.479],[-2.368,-0.739]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.901961023667,0.917646998985,0.956862984452,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[98.876,52.156],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-12.039,1.757],[0.261,-2.221],[-0.794,-0.138],[0.757,-0.082],[0.93,1.749],[-0.051,0.507],[1.769,2.423],[9.323,-4.156],[0.389,-0.927],[-4.348,-5.617]],"o":[[-0.058,0.191],[-0.021,0.412],[0.985,0.197],[2.997,-5.358],[-1.261,-2.372],[0.019,-1.772],[-4.091,-5.433],[-1.564,0.672],[-0.542,1.089],[2.853,4.009]],"v":[[9.828,8.262],[9.474,11.814],[12.465,11.264],[12.856,11.697],[15.91,1.024],[13.296,-1.03],[12.235,-6.792],[-9.438,-5.68],[-13.946,-6.326],[-12.492,4.993]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.345097979377,0.388234994926,0.509803981407,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[86.79,38.693],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.606,0.001],[-0.185,0.031],[0,0],[-0.565,0.672],[0,0],[0.552,-0.095],[0,0],[0,0],[0.134,0],[0.467,0.28]],"o":[[0.606,0.366],[0.192,0],[0,0],[0.77,-0.129],[0,0],[-0.417,0.492],[0,0],[0,0],[-0.132,0.022],[-0.423,-0.001],[0,0]],"v":[[-2.242,0.408],[-0.4,0.944],[0.165,0.896],[0.166,0.896],[2.242,-0.3],[1.478,-0.945],[-0.001,-0.09],[-0.014,-0.088],[-0.001,-0.09],[-0.4,-0.056],[-1.726,-0.448]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.356862984452,0.4,0.521568986481,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[85.605,57.104],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.004,-0.599],[-0.312,-0.315],[-0.497,-0.117],[0,0],[0.124,0.129],[0.005,0.243],[-0.356,0.639]],"o":[[-0.395,0.721],[-0.005,0.446],[0.31,0.317],[0,0],[-0.381,-0.089],[-0.121,-0.131],[-0.004,-0.321],[0,0]],"v":[[-0.329,-1.889],[-0.958,0.063],[-0.492,1.263],[0.735,1.889],[0.963,0.915],[0.224,0.565],[0.042,0.063],[0.546,-1.406]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.356862984452,0.4,0.521568986481,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[83.296,52.6],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.509,-0.992],[-0.491,1.001],[0.509,0.992],[0.491,-1.001]],"c":false},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.356862984452,0.4,0.521568986481,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[89.058,51.27],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 6","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.509,-0.992],[-0.491,1.001],[0.509,0.992],[0.491,-1.001]],"c":false},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.356862984452,0.4,0.521568986481,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[79.713,50.713],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 7","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.095,-0.029],[0.703,-6.059],[0,0],[6.06,0.702],[-0.652,5.552],[0.037,0.221],[-0.171,3.294],[-5.831,-0.423]],"o":[[6.06,0.703],[0,0],[-0.702,6.059],[-5.552,-0.651],[-0.008,-0.316],[0.102,-1.015],[0.423,-5.831],[0.191,0.059]],"v":[[1.315,-14.281],[10.954,-2.028],[10.135,4.415],[-2.118,14.053],[-11.005,2.761],[-10.963,1.937],[-10.525,-4.621],[0.809,-14.331]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.901961023667,0.917646998985,0.956862984452,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[87.342,50.332],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 8","np":2,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-2.889,-0.253],[-2.768,0.662],[0,0],[0,0]],"o":[[2.082,2.592],[2.89,0.253],[0,0],[0,0],[0,0]],"v":[[-7.869,0.178],[-0.903,4.107],[7.052,3.433],[7.869,-4.36],[-6.451,-3.606]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.345097979377,0.388234994926,0.509803981407,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[88.662,62.504],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 9","np":2,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[3.885,0.34],[0.21,3.331],[0,0]],"o":[[0,0],[-0.677,3.153],[-3.885,-0.34],[0,0],[0,0]],"v":[[7.951,-7.558],[6.992,3.401],[-0.985,8.525],[-7.951,2.093],[-6.992,-8.865]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.890196018593,0.909803981407,0.960784014534,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[88.621,64.098],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 10","np":2,"cix":2,"bm":0,"ix":10,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":25,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"“ͼ²ã 14”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[32.75,47.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":8,"s":[32.75,45.5,0],"to":[0,0,0],"ti":[0,0,0]},{"t":15,"s":[32.75,47.5,0]}],"ix":2},"a":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[24.75,25,0],"to":[0,0,0],"ti":[0,0,0]},{"t":15,"s":[24.75,25,0]}],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.8,0],[0,-0.8],[0,0],[0,0],[0,-0.8],[0.8,0],[0,0],[0,0],[0.8,0],[0,0.8],[0,0],[0,0],[0,0.8],[-0.8,0],[0,0],[0,0]],"o":[[0.8,0],[0,0],[0,0],[0.8,0],[0,0.8],[0,0],[0,0],[0,0.8],[-0.8,0],[0,0],[0,0],[-0.8,0],[0,-0.8],[0,0],[0,0],[0,-0.8]],"v":[[0,-6],[1.5,-4.5],[1.5,-1.5],[4.5,-1.5],[6,0],[4.5,1.5],[1.5,1.5],[1.5,4.5],[0,6],[-1.5,4.5],[-1.5,1.5],[-4.5,1.5],[-6,0],[-4.5,-1.5],[-1.5,-1.5],[-1.5,-4.5]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[25,25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.6,0],[0,0],[0,-0.6],[0,0],[0.6,0],[0,0],[0,0.6],[0,0]],"o":[[0,0],[0.6,0],[0,0],[0,0.6],[0,0],[-0.6,0],[0,0],[0,-0.6]],"v":[[-17.5,-10],[17.5,-10],[18.5,-9],[18.5,9],[17.5,10],[-17.5,10],[-18.5,9],[-18.5,-9]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.160783999574,0.4,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[25.5,25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.6,0],[0,0],[0,-0.6],[0,0],[0.6,0],[0,0],[0,0.6],[0,0]],"o":[[0,0],[0.6,0],[0,0],[0,0.6],[0,0],[-0.6,0],[0,0],[0,-0.6]],"v":[[-17.5,-10],[17.5,-10],[18.5,-9],[18.5,9],[17.5,10],[-17.5,10],[-18.5,9],[-18.5,-9]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.64313695571,0.839215985466,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[22.5,25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":-2,"op":25,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"“ͼ²ã 17”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[75,78.5,0],"ix":2},"a":{"a":0,"k":[70,60.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[2.908,5.4],[-1.992,-5.801],[-2.908,-5.4],[1.992,5.801]],"c":false},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.627450980392,0.670587995941,0.792156982422,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[103.964,94.418],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.699,-1.5],[-5,-11.699],[0,0],[0,0],[-2.801,2.2]],"o":[[2.5,2.2],[0,0],[0,0],[-0.801,-4.399],[4.8,-3.7]],"v":[[1.35,-13.5],[12.65,7.3],[-4.75,15.2],[-11.85,-1.5],[-8.85,-11.5]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.803921987496,0.83529399797,0.917646998985,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[110.164,85.418],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-3.1,-0.899],[0.6,-1.101],[0,0],[19.5,-1.199],[5.4,-0.3],[1.5,0],[0,0],[0,0.6],[-0.5,0.1],[-1.9,1.2],[-3.5,0.3],[-6,1.7]],"o":[[6.2,1.9],[0,0],[-2.101,3.399],[-5,0.301],[-2.7,0.2],[0,0],[-0.6,0],[0,-0.5],[0.4,-1.3],[1.1,-0.7],[5.9,-1.7],[8.8,-2.7]],"v":[[19.1,-8.101],[24.501,0.7],[24.3,1],[0.3,7.899],[-15.4,8.8],[-21.8,9],[-24.3,9],[-25.3,8],[-24.4,7],[-21.2,2.5],[-14.4,1.1],[3.4,-4]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.901961023667,0.917646998985,0.956862984452,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[103.314,111.818],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.1,0.101],[0,0],[-2,-4],[-0.699,-1.399],[-1.2,-3.601],[4.101,-1.7],[0,0],[1.6,3.8],[0.1,0.1],[0.5,1.3],[2.3,4.8],[-3.7,1.8]],"o":[[0,0],[4.2,-1.8],[2.4,4.7],[0.601,1.3],[1.4,4.2],[0,0],[-3.8,1.6],[-0.101,-0.101],[-1.3,-3.6],[-0.6,-1.4],[-1.801,-3.7],[0.101,-0.1]],"v":[[-7.05,-15.55],[-7.05,-15.55],[3.95,-11.55],[8.45,-2.35],[11.15,5.05],[6.45,15.65],[6.35,15.751],[-3.45,11.751],[-3.65,11.35],[-6.35,4.05],[-10.75,-5.249],[-7.35,-15.35]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.901961023667,0.917646998985,0.956862984452,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[116.564,101.268],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":25,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"“ͼ²ã 21”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[75,78.5,0],"ix":2},"a":{"a":0,"k":[70,60.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-70,0.5],[-55.8,0.5],[-55.8,-0.5],[-70,-0.5]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-47.8,0.5],[70,0.5],[70,-0.5],[-47.8,-0.5]],"c":true},"ix":2},"nm":"路径 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"合并路径 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.627450980392,0.670587995941,0.792156982422,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[70,118],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":25,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"“ͼ²ã 22”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[75,78.5,0],"ix":2},"a":{"a":0,"k":[70,60.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-2.101,0.5],[0,0],[-2.4,-2],[2.9,-2.9],[0,0],[0,0],[0,0],[-1.8,5.399],[0,0],[-1.7,1.3],[-5.2,0.101]],"o":[[0,0],[1.7,-0.601],[0,0],[10.4,2.4],[1,0.9],[0,0],[0,0],[0,0],[-1.1,-21.9],[0,0],[0.9,-2.4],[1.7,-1.3],[0,0]],"v":[[-7.25,-26.7],[-3.55,-24.999],[2.15,-26.7],[3.849,-26.3],[23.15,-19.6],[20.349,-13.999],[15.849,26.8],[-22.95,26.8],[-23.05,23.8],[-21.95,-17.2],[-21.85,-17.4],[-17.95,-24.7],[-7.55,-26.8]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.803921987496,0.83529399797,0.917646998985,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[88.25,91.4],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":25,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"“ͼ²ã 23”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":8,"s":[2]},{"t":15,"s":[0]}],"ix":10},"p":{"a":0,"k":[89,92.75,0],"ix":2},"a":{"a":0,"k":[84,74.75,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.5,2.4],[4.4,-2.6],[4.6,-4.2],[0,0],[0,0],[0.6,4.199]],"o":[[-7.2,-0.1],[-4.3,2.6],[0,0],[0,0],[2,-3.6],[-0.601,-4.301]],"v":[[12.05,-16.251],[-5.35,-12.55],[-18.75,-2.35],[-8.75,16.35],[16.05,5.549],[18.15,-6.15]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.752940996955,0.788234994926,0.882353001015,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[70.25,81.05],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1,0.5],[0,0],[-0.5,-1],[0,0],[1,-0.5],[0.5,1],[0,0]],"o":[[0,0],[0.9,-0.6],[0,0],[0.6,0.9],[-0.9,0.6],[0,0],[-0.6,-0.9]],"v":[[-3.3,-5.55],[-3.3,-5.55],[-0.6,-4.85],[4,2.85],[3.3,5.55],[0.6,4.85],[-4,-2.85]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.901961023667,0.917646998985,0.956862984452,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[31.961,50.51],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.1,0],[0,0],[-1.1,-0.8],[0,0],[0.8,-1.1],[0.1,-0.2],[0,0],[0.9,0.5],[0,0],[-0.6,1.2]],"o":[[0,0],[0.8,-1.1],[0,0],[1.1,0.8],[-0.1,0.1],[0,0],[-0.8,0.7],[0,0],[-1.1,-0.7],[-0.2,-0.2]],"v":[[-6.2,1.15],[-1.3,-5.35],[2.1,-5.85],[5.5,-3.25],[6,0.15],[5.7,0.55],[-0.2,5.849],[-3,6.15],[-5.3,4.75],[-6.2,1.45]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.901961023667,0.917646998985,0.956862984452,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[31.661,57.31],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-3.2,-2.5],[0,0],[0.9,0.6],[1.2,-1.3],[-0.8,-2]],"o":[[0,0],[-0.2,-6],[-1.3,-0.8],[-0.9,1],[0.7,2.301]],"v":[[-1.1,8.1],[7.8,5.2],[6.2,-4.6],[-1.9,-6.8],[-7,1]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.901961023667,0.917646998985,0.956862984452,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[31.761,60.16],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[4.5,0.7],[3.8,13.6],[0.6,3.1],[0,0],[0,0],[0,0]],"o":[[-16,10.601],[-4.8,-0.7],[-1.5,-5.2],[0,0],[0,0],[0,0],[0,0]],"v":[[23.5,2.55],[-7.2,17.45],[-20.4,-1.75],[-23.5,-14.25],[-14,-18.15],[-4.5,-0.05],[11.6,-10.05]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.901961023667,0.917646998985,0.956862984452,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[53.5,82.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":25,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"“ͼ²ã 27”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[75,78.5,0],"ix":2},"a":{"a":0,"k":[70,60.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,1.399],[0,0],[-1.3,0],[0,-1.3],[0,0],[1.3,0]],"o":[[0,0],[0,-1.3],[1.3,0],[0,0],[0,1.3],[-1.3,0]],"v":[[-2.4,3.601],[-2.4,-3.6],[0,-6],[2.4,-3.6],[2.4,3.601],[0,6]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.737254961799,0.768626972273,0.858824008119,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[34.961,60.359],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":25,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"“ͼ²ã 29”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[75,78.5,0],"ix":2},"a":{"a":0,"k":[70,60.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.6,0],[0,0],[0,-0.6],[0,0],[-0.6,0],[0,0],[0,0.6],[0,0]],"o":[[0,0],[-0.6,0],[0,0],[0,0.6],[0,0],[0.6,0],[0,0],[0,-0.6]],"v":[[19,-21],[-19,-21],[-20,-20],[-20,20],[-19,21],[19,21],[20,20],[20,-20]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.960784014534,0.968626972273,0.984314024682,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[109,44],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":25,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"“ͼ²ã 30”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[75,78.5,0],"ix":2},"a":{"a":0,"k":[70,60.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.6,0],[0,0],[0,-0.6],[0,0],[-0.6,0],[0,0],[0,0.6],[0,0]],"o":[[0,0],[-0.6,0],[0,0],[0,0.6],[0,0],[0.6,0],[0,0],[0,-0.6]],"v":[[19,-24],[-19,-24],[-20,-23],[-20,23],[-19,24],[19,24],[20,23],[20,-23]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.960784014534,0.968626972273,0.984314024682,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[52,24],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":25,"st":0,"bm":0}],"markers":[]}
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
/* /*
* @Author: yuananting * @Author: yuananting
* @Date: 2021-02-23 18:28:50 * @Date: 2021-02-23 18:28:50
* @LastEditors: fusanqiasng * @LastEditors: yuananting
* @LastEditTime: 2021-05-21 17:57:59 * @LastEditTime: 2021-06-02 14:25:06
* @Description: 助学工具-课程分类 * @Description: 助学工具-课程分类
* @Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有 * @Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有
*/ */
...@@ -153,9 +153,7 @@ class CourseCategoryManage extends Component { ...@@ -153,9 +153,7 @@ class CourseCategoryManage extends Component {
<Space className='title-opts' size={16}> <Space className='title-opts' size={16}>
<span <span
onClick={() => { onClick={() => {
let nodesCount = 0 const { originTreeData } = this.state;
const { originTreeData } = this.state
console.log('orororo', originTreeData)
if ( if (
(item.categoryLevel === 0 && originTreeData.length >= 29) || (item.categoryLevel === 0 && originTreeData.length >= 29) ||
(item.categoryLevel > 0 && this.getRelatedNodes(item.parentId).length >= 30) (item.categoryLevel > 0 && this.getRelatedNodes(item.parentId).length >= 30)
...@@ -343,8 +341,10 @@ class CourseCategoryManage extends Component { ...@@ -343,8 +341,10 @@ class CourseCategoryManage extends Component {
let dragNodes = [] let dragNodes = []
dragNodes.push(dragNode.id) dragNodes.push(dragNode.id)
if (dragNode.parentId != 0) { if (dragNode.parentId !== "0") {
dragNodes = dragNodes.concat(this.getParentDragNodesLevel(this.state.treeMap[dragNode.parentId])) dragNodes = dragNodes.concat(
this.getParentDragNodesLevel(this.state.treeMap[dragNode.parentId])
);
} }
return dragNodes return dragNodes
} }
...@@ -365,14 +365,24 @@ class CourseCategoryManage extends Component { ...@@ -365,14 +365,24 @@ class CourseCategoryManage extends Component {
// 拖拽 // 拖拽
onDrop = (info) => { onDrop = (info) => {
if (this.state.categoryName) { // 带搜索时的分类树不允许拖拽
return // 不允许其他节点拖拽到未分类中
// 不允许其他节点拖拽到未分类之前
if (
this.state.categoryName ||
(info.node.categoryName === "未分类" && info.dropPosition === 0) ||
(info.node.categoryName === "未分类" &&
info.dropToGap &&
info.dropPosition === -1)
) {
return;
} }
// 未分类不可以拖拽 // 未分类不可以拖拽
if (info.dragNode.categoryName === '未分类' && info.dragNode.categoryLevel === 0) return message.info('未分类”为默认分类暂不支持移动') if (
info.dragNode.categoryName === "未分类" &&
// 不允许其他节点拖拽到未分类之前 info.dragNode.categoryLevel === 0
if (info.node.categoryName === '未分类' && info.dropToGap && info.dropPosition === -1) return )
return message.info("“未分类”为默认分类暂不支持移动");
let targetParentId = info.dropToGap ? info.node.parentId : info.node.id let targetParentId = info.dropToGap ? info.node.parentId : info.node.id
let relatedNodes = this.getRelatedNodes(targetParentId) let relatedNodes = this.getRelatedNodes(targetParentId)
...@@ -383,8 +393,7 @@ class CourseCategoryManage extends Component { ...@@ -383,8 +393,7 @@ class CourseCategoryManage extends Component {
let nodesArr = this.getDragNodesLevel(this.state.treeMap[info.dragNode.id]) let nodesArr = this.getDragNodesLevel(this.state.treeMap[info.dragNode.id])
let parentArr = this.getParentDragNodesLevel(this.state.treeMap[targetParentId]) let parentArr = this.getParentDragNodesLevel(this.state.treeMap[targetParentId])
if (nodesArr.length + parentArr.length > 4) { if (nodesArr.length + parentArr.length > 4) {
console.log(nodesArr.length, parentArr.length) return message.info("最多支持5级分类");
return message.info('最多支持5级分类')
} }
} }
if (relatedNodes && relatedNodes.length >= 30) { if (relatedNodes && relatedNodes.length >= 30) {
......
...@@ -44,7 +44,7 @@ ...@@ -44,7 +44,7 @@
white-space: nowrap; white-space: nowrap;
} }
.ant-tree-node-content-wrapper.ant-tree-node-selected { .ant-tree-node-content-wrapper.ant-tree-node-selected {
color: #666666; color: #2966FF;
} }
} }
.ant-tree-treenode-selected:hover::before, .ant-tree-treenode-selected:hover::before,
......
.examPage{ .examPage{
padding-bottom: 50px; padding-bottom: 50px;
.box { .box {
padding-bottom: 40px!important; padding-bottom: 66px!important;
} }
.ant-form-item{ .ant-form-item{
margin-bottom: 24px !important;
&:last-child{ &:last-child{
margin-bottom: 0px !important; margin-bottom: 0px !important;
} }
} }
.form{ .form{
margin-top: 12px; margin-top: 24px;
margin-bottom: 32px;
width: 1000px; width: 1000px;
.title{ .title{
position: relative;
padding-left: 28px;
font-size: 16px; font-size: 16px;
font-family: PingFangSC-Medium, PingFang SC; font-family: PingFangSC-Medium, PingFang SC;
font-weight: bold; font-weight: bold;
color: #333333; color: #333333;
line-height: 22px; line-height: 22px;
margin-bottom: 8px; margin-bottom: 24px;
&.first {
&::before{
width:4px;
height:12px;
content:'';
background-image: linear-gradient(#2966FF 83.5%, #0ACCA4 16.5%);
display:inline-block;
position: absolute;
left:16px;
top:6px;
}
}
} }
} }
......
import React, { useState, useRef, useEffect, useContext } from 'react' import React, { useState, useRef, useEffect, useContext } from 'react'
import Breadcrumbs from "@/components/Breadcrumbs"; import Breadcrumbs from "@/components/Breadcrumbs";
import { Form, Alert, Input, Button, InputNumber, DatePicker, Switch, Radio, message, Modal } from 'antd'; import { Form, Alert, Input, Button, InputNumber, DatePicker, Switch, Radio, message, Modal, Tooltip } from 'antd';
import { Route, withRouter } from 'react-router-dom'; import { Route, withRouter } from 'react-router-dom';
import User from "@/common/js/user"; import User from "@/common/js/user";
import moment from 'moment' import moment from 'moment'
...@@ -36,20 +36,27 @@ function AddExam(props: any) { ...@@ -36,20 +36,27 @@ function AddExam(props: any) {
const [getData, setGetData] = useState(false); const [getData, setGetData] = useState(false);
const [preview, setPreview] = useState(false); const [preview, setPreview] = useState(false);
const [examTotal, setExamTotal] = useState(0); const [examTotal, setExamTotal] = useState(0);
const timer = useRef({});
const request = useRef(false); const request = useRef(false);
const { match } = props; const { match } = props;
const [examDuration, setExamDuration] = useState(undefined); const [examDuration, setExamDuration] = useState(undefined);
useEffect(() => { useEffect(() => {
if (props.type === 'edit') { switch (props.type) {
queryExamDetail() case "copy": // 考试列表-复制考试进入
case "edit": // 考试列表-编辑考试进入
queryExamDetail();
break;
case "organizeExam": // 试卷列表-组织考试进入
case "newPaperToAddExam": // 组卷页面-新建保存试卷并组织考试
case "editPaperToAddExam": // 组卷页面-编辑保存试卷并组织考试
setGetData(true);
setPaperInfo(props.paperInfo);
break;
} }
}, []) }, [])
useEffect(() => { useEffect(() => {
console.log(paperInfo)
setPaperId(paperInfo.paperId) setPaperId(paperInfo.paperId)
setPassRate(paperInfo.passRate) setPassRate(paperInfo.passRate)
...@@ -75,9 +82,9 @@ function AddExam(props: any) { ...@@ -75,9 +82,9 @@ function AddExam(props: any) {
const { result } = res const { result } = res
setPaperInfo(result.examPaper) setPaperInfo(result.examPaper)
setPaperId(result.examPaper.paperId) setPaperId(result.examPaper.paperId)
setStartTime(result.examStartTime) setStartTime(props.type === 'edit' ? result.examStartTime : '')
setExamEndTime(result.examEndTime) setExamEndTime(props.type === 'edit' ? result.examEndTime : '')
setExamName(result.examName) setExamName(props.type === 'edit' ? result.examName : `${result.examName}(复制)`)
setPassRate(result.passRate * 100) setPassRate(result.passRate * 100)
setNeedPhone(result.needPhone) setNeedPhone(result.needPhone)
setExamDesc(result.examDesc) setExamDesc(result.examDesc)
...@@ -125,6 +132,11 @@ function AddExam(props: any) { ...@@ -125,6 +132,11 @@ function AddExam(props: any) {
return return
} }
if (param.examName && param.examName.length > 40) {
message.warning('考试名称最多40字');
return
}
if (!paperId) { if (!paperId) {
message.warning('请选择试卷'); message.warning('请选择试卷');
return return
...@@ -174,8 +186,19 @@ function AddExam(props: any) { ...@@ -174,8 +186,19 @@ function AddExam(props: any) {
Service.Hades(props.type === 'edit' ? 'public/hades/editExam' : "public/hades/createExam", param).then((res) => { Service.Hades(props.type === 'edit' ? 'public/hades/editExam' : "public/hades/createExam", param).then((res) => {
message.success(props.type === 'edit' ? '编辑成功' : '创建成功'); message.success(props.type === 'edit' ? '编辑成功' : '创建成功');
switch (props.type) {
case "organizeExam": // 试卷列表-组织考试进入
case "newPaperToAddExam": // 组卷保存组织考试
case "editPaperToAddExam":
window.RCHistory.push("/examination-manage-index")
break;
case "add":
case "edit": // 考试列表-新建或编辑
case "copy": // 考试列表-新建或编辑
props.freshList() props.freshList()
props.history.goBack(); props.history.goBack();
break;
}
}) })
} }
...@@ -222,14 +245,30 @@ function AddExam(props: any) { ...@@ -222,14 +245,30 @@ function AddExam(props: any) {
cancelText: '留在本页', cancelText: '留在本页',
icon: <span className="icon iconfont default-confirm-icon">&#xe6f4;</span>, icon: <span className="icon iconfont default-confirm-icon">&#xe6f4;</span>,
onOk: () => { onOk: () => {
props.history.goBack(); window.RCHistory.push("/examination-manage-index")
} }
}) })
} }
let title = '';
switch (props.type) {
case 'add':
case "organizeExam":
case "newPaperToAddExam":
case "editPaperToAddExam":
title = '新建考试';
break;
case 'edit':
title = '编辑考试';
break;
case 'copy':
title = '复制考试';
break;
default:
break;
}
return <div className="page examPage"> return <div className="page examPage">
<Breadcrumbs navList={props.type === 'edit' ? "编辑考试" : "新建考试"} goBack={handleGoBack} /> <Breadcrumbs navList={title} goBack={handleGoBack} />
<div className="box"> <div className="box">
<div className="show-tips"> <div className="show-tips">
...@@ -242,8 +281,8 @@ function AddExam(props: any) { ...@@ -242,8 +281,8 @@ function AddExam(props: any) {
layout="horizontal" layout="horizontal"
> >
<Form.Item label="考试名称" <Form.Item label="考试名称"
validateStatus={(check && !examName) ? 'error' : ''} validateStatus={(check && (!examName ? '请输入考试名称' : (examName.length > 40) && '考试名称最多40字')) ? 'error' : ''}
help={check && !examName && '请选择课程'} help={check && (!examName ? '请输入考试名称' : (examName.length > 40) && '考试名称最多40字')}
required> required>
<Input placeholder='请输入考试名称(40字以内)' maxLength={40} value={examName} onChange={(e) => { <Input placeholder='请输入考试名称(40字以内)' maxLength={40} value={examName} onChange={(e) => {
...@@ -296,11 +335,18 @@ function AddExam(props: any) { ...@@ -296,11 +335,18 @@ function AddExam(props: any) {
<Form.Item label="及格线" <Form.Item
label={<div>
<span>及格线</span>
<Tooltip title="默认为选中试卷所设置的及格线,可修改">
<span className="icon iconfont" style={{ color: '#BFBFBF', marginLeft: 4 }}>&#xe61d;</span>
</Tooltip>
</div>}
style={{ marginTop: 24 }} style={{ marginTop: 24 }}
validateStatus={(check && !passRate) ? 'error' : ''} validateStatus={(check && !passRate) ? 'error' : ''}
help={check && !passRate && '请输入及格线'} help={check && !passRate && '请输入及格线'}
required> required
>
<InputNumber value={passRate} min={0} max={100} onChange={(value: any) => { setPassRate(parseInt(value)) }} style={{ width: 100 }} /> <InputNumber value={passRate} min={0} max={100} onChange={(value: any) => { setPassRate(parseInt(value)) }} style={{ width: 100 }} />
<span style={{ marginLeft: 4 }}>% <span style={{ marginLeft: 4 }}>%
</span> </span>
...@@ -314,10 +360,11 @@ function AddExam(props: any) { ...@@ -314,10 +360,11 @@ function AddExam(props: any) {
required> required>
<RangePicker <RangePicker
style={{ width: 320 }} style={{ width: 320 }}
showTime={{ defaultValue: [moment().add(5, 'minutes'), moment().add(5, 'minutes')] }}
ranges={{ ranges={{
'近七天': [moment(), moment().add(6, 'day').endOf('day')], '近七天': [moment().add(5, 'minute'), moment().add(6, 'day').endOf('day')],
'近1个月': [moment(), moment().add(1, 'month').endOf('day')], '近1个月': [moment().add(5, 'minute'), moment().add(1, 'month').endOf('day')],
'近3个月': [moment(), moment().add(3, 'month').endOf('day')], '近3个月': [moment().add(5, 'minute'), moment().add(3, 'month').endOf('day')],
}} }}
disabledDate={disabledDate} disabledDate={disabledDate}
value={[ value={[
...@@ -325,7 +372,6 @@ function AddExam(props: any) { ...@@ -325,7 +372,6 @@ function AddExam(props: any) {
examEndTime ? moment(Number(examEndTime)) : null examEndTime ? moment(Number(examEndTime)) : null
]} ]}
disabledTime={disabledRangeTime} disabledTime={disabledRangeTime}
showTime
format="YYYY/MM/DD HH:mm" format="YYYY/MM/DD HH:mm"
onChange={(date: any) => { onChange={(date: any) => {
setStartTime(date && date[0]?.valueOf()); setStartTime(date && date[0]?.valueOf());
...@@ -350,7 +396,7 @@ function AddExam(props: any) { ...@@ -350,7 +396,7 @@ function AddExam(props: any) {
help={check && (desclen > 1000) && '最多只能输入1000个字'} help={check && (desclen > 1000) && '最多只能输入1000个字'}
> >
{ {
(getData || (props.type !== 'edit')) && <GraphicsEditor (getData || (props.type === 'add')) && <GraphicsEditor
maxLimit={1000} maxLimit={1000}
isIntro={true} isIntro={true}
detail={{ detail={{
......
...@@ -39,11 +39,10 @@ function DataAnalysic(props: any) { ...@@ -39,11 +39,10 @@ function DataAnalysic(props: any) {
<Breadcrumbs navList={"考试数据"} goBack={props.history.goBack} /> <Breadcrumbs navList={"考试数据"} goBack={props.history.goBack} />
<div className="box"> <div className="box">
<div className="titleBox "> <div className="titleBox ">
<span className='tips'></span>
考试名称:{examDetail.examName} 考试名称:{examDetail.examName}
</div> </div>
</div> </div>
<div className="box"> <div className="box" style={{ paddingTop: 0 }}>
<Tabs activeKey={selectKey} onChange={(key: any) => { <Tabs activeKey={selectKey} onChange={(key: any) => {
setSelectKey(key) setSelectKey(key)
}}> }}>
......
...@@ -207,7 +207,6 @@ function ExamData(props: any) { ...@@ -207,7 +207,6 @@ function ExamData(props: any) {
return <div className="rr"> return <div className="rr">
<a <a
target="_blank"
download download
id="load-play-back-excel" id="load-play-back-excel"
style={{ position: "absolute", left: "-10000px" }} style={{ position: "absolute", left: "-10000px" }}
......
import React, { useState, useRef, useEffect, useContext } from 'react'; import React, { useState, useRef, useEffect, useContext } from 'react';
import { Input, Select, DatePicker, Tooltip, Button, Table, Dropdown, Menu, Modal } from 'antd'; import { Input, Select, DatePicker, Tooltip, Button, Table, Dropdown, Menu, Modal } from 'antd';
import Lottie from 'react-lottie';
import TeacherSelect from '@/modules/common/TeacherSelect'; import TeacherSelect from '@/modules/common/TeacherSelect';
import { Route, withRouter } from 'react-router-dom'; import { Route, withRouter } from 'react-router-dom';
import Service from '@/common/js/service'; import Service from '@/common/js/service';
import moment from 'moment'; import moment from 'moment';
import { PageControl } from '@/components'; import { PageControl, XMTable } from '@/components';
import AddExam from './AddExam'; import AddExam from './AddExam';
import User from '@/common/js/user'; import User from '@/common/js/user';
import { XMContext } from '@/store/context'; import { XMContext } from '@/store/context';
import ExamShareModal from './ExamShareModal'; import ExamShareModal from './ExamShareModal';
import DataAnalysic from './DataAnalysic'; import DataAnalysic from './DataAnalysic';
import PreviewModal from './PreviewModal';
import * as nodata from '../../lottie/nodata/data.json';
import './index.less'; import './index.less';
const { RangePicker } = DatePicker; const { RangePicker } = DatePicker;
const { Search } = Input; const { Search } = Input;
...@@ -53,6 +56,8 @@ function ExaminationManager(props: any) { ...@@ -53,6 +56,8 @@ function ExaminationManager(props: any) {
const [order, setOrder] = useState(sortStatus.type); const [order, setOrder] = useState(sortStatus.type);
const [modal, setModal] = useState(null); const [modal, setModal] = useState(null);
const [questionCntSort, setQuestionCntSort] = useState(sortState); const [questionCntSort, setQuestionCntSort] = useState(sortState);
const [openPreviewModal, setOpenPreviewModal] = useState(false);
const [info, setInfo] = useState({ examDuration: 0 });
const queryRef = useRef({}); const queryRef = useRef({});
const orderEnum = { const orderEnum = {
...@@ -65,8 +70,8 @@ function ExaminationManager(props: any) { ...@@ -65,8 +70,8 @@ function ExaminationManager(props: any) {
descend: 'PASS_CNT_DESC', descend: 'PASS_CNT_DESC',
}, },
examCreateTime: { examCreateTime: {
ascend: 'EXAM_START_TIME_ASC', ascend: 'CREATED_ASC',
descend: 'EXAM_START_TIME_DESC', descend: 'CREATED_DESC',
}, },
}; };
...@@ -147,6 +152,7 @@ function ExaminationManager(props: any) { ...@@ -147,6 +152,7 @@ function ExaminationManager(props: any) {
title: '操作', title: '操作',
fixed: fixStr.right, fixed: fixStr.right,
dataIndex: 'operate', dataIndex: 'operate',
width: 150,
render: (text: any, record: any) => ( render: (text: any, record: any) => (
<div className='table_operate'> <div className='table_operate'>
{ctx.xmState?.userPermission?.SeeExamData() && [ {ctx.xmState?.userPermission?.SeeExamData() && [
...@@ -160,10 +166,7 @@ function ExaminationManager(props: any) { ...@@ -160,10 +166,7 @@ function ExaminationManager(props: any) {
}}> }}>
数据 数据
</div>, </div>,
<span className='operate__item split' key={'split-1'}> <span className='operate__item split'> | </span>,
{' '}
|{' '}
</span>,
]} ]}
<div <div
...@@ -174,22 +177,27 @@ function ExaminationManager(props: any) { ...@@ -174,22 +177,27 @@ function ExaminationManager(props: any) {
}}> }}>
分享 分享
</div> </div>
<span className='operate__item split'> | </span>
{((ctx.xmState?.userPermission?.AddExam() && moment().valueOf() < record.examStartTime) ||
(ctx.xmState?.userPermission?.DelExam() && moment().valueOf() + 30 * 60 * 1000 < record.examStartTime)) && [
<span className='operate__item split' key={'split-2'}>
{' '}
|{' '}
</span>,
<Dropdown overlay={getOpe(record)}> <Dropdown overlay={getOpe(record)}>
<span className='more'>更多</span> <span className='more'>更多</span>
</Dropdown>, </Dropdown>
]}
</div> </div>
), ),
}, },
]; ];
function queryExamDetail(examId: string) {
Service.Hades('public/hades/queryExamDetail', {
examId,
tenantId: User.getStoreId(),
userId: User.getStoreUserId(),
source: 0,
}).then((res) => {
setInfo(res.result);
setOpenPreviewModal(true);
});
}
function shareModal(record: any) { function shareModal(record: any) {
const modal = ( const modal = (
<ExamShareModal <ExamShareModal
...@@ -205,8 +213,15 @@ function ExaminationManager(props: any) { ...@@ -205,8 +213,15 @@ function ExaminationManager(props: any) {
function getOpe(item: any) { function getOpe(item: any) {
return ( return (
<Menu> <Menu>
<Menu.Item
key='1'
onClick={() => {
queryExamDetail(item.examId);
}}>
预览
</Menu.Item>
{ctx.xmState?.userPermission?.AddExam() && moment().valueOf() < item.examStartTime && ( {ctx.xmState?.userPermission?.AddExam() && moment().valueOf() < item.examStartTime && (
<Menu.Item key='0'> <Menu.Item key='2'>
<span <span
onClick={() => { onClick={() => {
if (moment().valueOf() + 5 * 60 * 1000 > item.examStartTime) { if (moment().valueOf() + 5 * 60 * 1000 > item.examStartTime) {
...@@ -225,8 +240,13 @@ function ExaminationManager(props: any) { ...@@ -225,8 +240,13 @@ function ExaminationManager(props: any) {
</Menu.Item> </Menu.Item>
)} )}
{ctx.xmState?.userPermission?.DelExam() && moment().valueOf() + 30 * 60 * 1000 < item.examStartTime && ( {ctx.xmState?.userPermission?.AddExam() && (
<Menu.Item key='1'> <Menu.Item key='3' onClick={() => props.history.push(`${match.url}/copy/${item.examId}`)}>
复制
</Menu.Item>
)}
{ctx.xmState?.userPermission?.DelExam() && (moment().valueOf() + 30 * 60 * 1000 < item.examStartTime || moment().valueOf() > item.examEndTime) && (
<Menu.Item key='4'>
<span <span
onClick={() => { onClick={() => {
deleteExam(item); deleteExam(item);
...@@ -288,12 +308,19 @@ function ExaminationManager(props: any) { ...@@ -288,12 +308,19 @@ function ExaminationManager(props: any) {
function onChange(pagination: any, filters: any, sorter: any, extra: any) { function onChange(pagination: any, filters: any, sorter: any, extra: any) {
setfield(sorter.field); setfield(sorter.field);
setOrder(sorter.order); setOrder(sorter.order);
console.log(sorter.field, sorter.order, (orderEnum as any)[sorter.field]);
let _query: any = { ...queryRef.current }; let _query: any = { ...queryRef.current };
_query.order = (orderEnum as any)[sorter.field][sorter.order] || 'EXAM_START_TIME_DESC'; _query.order = (orderEnum as any)[sorter.field][sorter.order] || 'EXAM_START_TIME_DESC';
setQuery(_query); setQuery(_query);
} }
const defaultOptions = {
loop: true,
autoplay: true,
animationData: nodata,
rendererSettings: {
preserveAspectRatio: 'xMidYMid slice',
},
};
return ( return (
<div className='page examination-manager'> <div className='page examination-manager'>
<div className='content-header'>考试</div> <div className='content-header'>考试</div>
...@@ -407,7 +434,7 @@ function ExaminationManager(props: any) { ...@@ -407,7 +434,7 @@ function ExaminationManager(props: any) {
)} )}
<div className='content'> <div className='content'>
<Table <XMTable
bordered bordered
size='small' size='small'
columns={columns} columns={columns}
...@@ -415,8 +442,15 @@ function ExaminationManager(props: any) { ...@@ -415,8 +442,15 @@ function ExaminationManager(props: any) {
scroll={{ x: 1150 }} scroll={{ x: 1150 }}
onChange={onChange} onChange={onChange}
pagination={false} pagination={false}
rowKey={(record) => record.examId} style={{ margin: '0px 0 16px' }}
style={{ margin: '0px 0 16px' }}></Table> renderEmpty={{
image: (
<div style={{ marginTop: 24 }}>
<Lottie options={defaultOptions} height={150} width={150} isStopped={false} isPaused={false} />
</div>
),
description: <span style={{ display: 'block', paddingBottom: 24 }}>暂无数据</span>,
}}></XMTable>
{total > 0 && ( {total > 0 && (
<PageControl <PageControl
size='small' size='small'
...@@ -425,7 +459,6 @@ function ExaminationManager(props: any) { ...@@ -425,7 +459,6 @@ function ExaminationManager(props: any) {
total={total} total={total}
onShowSizeChange={onShowSizeChange} onShowSizeChange={onShowSizeChange}
toPage={(page: any) => { toPage={(page: any) => {
console.log(page);
let _query: any = { ...queryRef.current }; let _query: any = { ...queryRef.current };
_query.current = page + 1; _query.current = page + 1;
setQuery(_query); setQuery(_query);
...@@ -434,11 +467,20 @@ function ExaminationManager(props: any) { ...@@ -434,11 +467,20 @@ function ExaminationManager(props: any) {
)} )}
</div> </div>
</div> </div>
{openPreviewModal && (
<PreviewModal
info={{ ...info, examDuration: (info.examDuration || 0) / 60000 }}
onClose={() => {
setOpenPreviewModal(false);
}}
/>
)}
<Route <Route
path={`${match.url}/add`} path={`${match.url}/add`}
render={() => { render={() => {
return ( return (
<AddExam <AddExam
type='add'
freshList={() => { freshList={() => {
let _query: any = { ...queryRef.current }; let _query: any = { ...queryRef.current };
if (_query.current != 1) { if (_query.current != 1) {
...@@ -465,6 +507,19 @@ function ExaminationManager(props: any) { ...@@ -465,6 +507,19 @@ function ExaminationManager(props: any) {
); );
}} }}
/> />
<Route
path={`${match.url}/copy/:id`}
render={() => {
return (
<AddExam
type='copy'
freshList={() => {
getList();
}}
/>
);
}}
/>
<Route <Route
path={`${match.url}/analysic/:id`} path={`${match.url}/analysic/:id`}
......
...@@ -123,6 +123,7 @@ ...@@ -123,6 +123,7 @@
border-radius: 4px; border-radius: 4px;
padding: 14px; padding: 14px;
padding-bottom: 8px; padding-bottom: 8px;
padding-right: 0;
.item{ .item{
margin-bottom: 8px; margin-bottom: 8px;
.name{ .name{
......
...@@ -33,18 +33,18 @@ function PreviewModal(props: any) { ...@@ -33,18 +33,18 @@ function PreviewModal(props: any) {
<div className="phone"> <div className="phone">
<div className="content"> <div className="content">
<div className="topContent"> <div className="topContent">
<div className="title" style={{ fontSize: props.info.examName.length > 24 ? 13 : 22 ,marginTop:props.info.examName.length > 24?44:20}}>{props.info.examName || ' '}</div> <div className="title" style={{ fontSize: props.info.examName.length > 24 ? 13 : 22 ,marginTop: 20 }}>{(props.info.examName.length > 40 ? props.info.examName.substring(0, 40) : props.info.examName) || ' '}</div>
{ {
props.info.examStartTime && <div className="time">{moment(props.info.examStartTime).format("YYYY-MM-DD HH:mm")}~{moment(props.info.examEndTime).format("YYYY-MM-DD HH:mm")}</div> props.info.examStartTime && <div className="time">{moment(props.info.examStartTime).format("YYYY-MM-DD HH:mm")}~{moment(props.info.examEndTime).format("YYYY-MM-DD HH:mm")}</div>
} }
<div className="rule"> <div className="rule">
<div className="item"> <div className="item">
<div className="num">{props.info.totalScore || 0}</div> <div className="num">{props.info.totalScore || (props.info.examPaper || {}).totalScore || 0}</div>
<div className="text">总分 <span className="dw" style={{color:'#999'}}>(分)</span></div> <div className="text">总分 <span className="dw" style={{color:'#999'}}>(分)</span></div>
</div> </div>
<div className="item"> <div className="item">
<div className="num">{props.info.examTotal || 0}</div> <div className="num">{props.info.examTotal || (props.info.examPaper || {}).questionCnt || 0}</div>
<div className="text">总题数<span className="dw" style={{color:'#999'}} >(道)</span></div> <div className="text">总题数<span className="dw" style={{color:'#999'}} >(道)</span></div>
</div> </div>
<div className="item"> <div className="item">
......
.dataAnalysic{ .dataAnalysic{
.titleBox{ .titleBox{
position: relative;
padding-left: 28px;
font-size: 19px; font-size: 19px;
font-family: PingFangSC-Medium, PingFang SC; font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500; font-weight: 500;
color: #333333; color: #333333;
line-height: 26px; line-height: 26px;
background: #FFFFFF; background: #FFFFFF;
// padding: 20px 24px; &::before{
// margin-bottom: 8px; width:4px;
.tips{ height:12px;
width: 4px; content:'';
height: 16px; background-image: linear-gradient(#2966FF 83.5%, #0ACCA4 16.5%);
background: #336DFF; display:inline-block;
display: inline-block; position: absolute;
margin-right: 4px; left:16px;
top:7px;
} }
} }
.ant-tabs-content-holder {
margin-top: 8px;
}
} }
\ No newline at end of file
...@@ -13,4 +13,12 @@ ...@@ -13,4 +13,12 @@
.ant-table-column-sorter { .ant-table-column-sorter {
margin-top: 0px !important; margin-top: 0px !important;
} }
.ant-table tbody tr {
&:nth-child(even) {
background: #fff;
}
&:nth-child(odd) {
background: #fafafa;
}
}
} }
\ No newline at end of file
import React from 'react';
import { Modal, TreeSelect } from 'antd';
import './MoveModal.less';
class MoveModal extends React.Component {
constructor(props) {
super(props);
this.state = {
categoryId: undefined,
};
}
handleChangeCatalogList = (value, label) => {
this.setState({ categoryId: value, categoryName: label[0] });
};
filterData = (data, id) => {
let newTreeData = data.map((item) => {
item.disabled = id === item.id;
if (item.children) {
item.children = this.filterData(item.children, id);
}
return item;
});
return newTreeData;
}
render() {
const { visible, title, onCancel, onOk, data, length, categoryId: id } = this.props;
const { categoryId } = this.state;
const moveData = this.filterData(data, id);
return (
<Modal
title={`移动${title}`}
visible={visible}
onCancel={onCancel}
maskClosable={false}
className="common-move-modal"
onOk={() => onOk(categoryId)}
>
<div className="tip">
<span className="icon iconfont">&#xe6f2;</span>
<span className="text">已选择<span style={{ color: '#2966FF' }}>{length}</span>{title},移动后,原有分类将移除此{title}</span>
</div>
<div className="move-item" id="move-item">
<span className="label">选择分类:</span>
<TreeSelect
showSearch
treeNodeFilterProp="title"
getPopupContainer={() => document.querySelector('#move-item')}
style={{ width: 240 }}
treeData={moveData}
placeholder="请选择分类"
allowClear
value={categoryId}
onChange={(value, label) => {
this.handleChangeCatalogList(value, label);
}}
/>
</div>
</Modal>
)
}
}
export default MoveModal;
\ No newline at end of file
.common-move-modal {
.tip {
display: flex;
align-items: center;
margin-bottom: 16px;
.iconfont {
font-size: 14px;
color: #BFBFBF;
margin-right: 8px;
}
.text {
color: #999;
font-size: 14px;
}
}
.move-item {
.label {
color: #333;
}
}
.ant-select-tree .ant-select-tree-node-content-wrapper.ant-select-tree-node-selected {
background: rgba(41, 102, 255, 0.06);
}
}
\ No newline at end of file
/* /*
* @Author: yuananting * @Author: yuananting
* @Date: 2021-03-27 16:15:13 * @Date: 2021-03-27 16:15:13
* @LastEditors: wufan * @LastEditors: yuananting
* @LastEditTime: 2021-05-30 16:56:15 * @LastEditTime: 2021-06-01 17:07:30
* @Description: 助学工具-新建/复制/编辑试卷 * @Description: 助学工具-新建/复制/编辑试卷
* @Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有 * @Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有
*/ */
...@@ -20,7 +20,9 @@ import { ...@@ -20,7 +20,9 @@ import {
Modal, Modal,
Spin, Spin,
} from "antd"; } from "antd";
import Lottie from 'react-lottie';
import { PlusOutlined } from "@ant-design/icons"; import { PlusOutlined } from "@ant-design/icons";
import { XMTable } from "@/components";
import ShowTips from "@/components/ShowTips"; import ShowTips from "@/components/ShowTips";
import Breadcrumbs from "@/components/Breadcrumbs"; import Breadcrumbs from "@/components/Breadcrumbs";
import "./OperatePaper.less"; import "./OperatePaper.less";
...@@ -29,6 +31,9 @@ import PaperPreviewModal from "./modal/PreviewPaperModal"; ...@@ -29,6 +31,9 @@ import PaperPreviewModal from "./modal/PreviewPaperModal";
import User from "@/common/js/user"; import User from "@/common/js/user";
import AidToolService from "@/domains/aid-tool-domain/AidToolService"; import AidToolService from "@/domains/aid-tool-domain/AidToolService";
import Bus from "@/core/bus"; import Bus from "@/core/bus";
import { Route, withRouter } from "react-router-dom";
import * as paperEmpty from '../../lottie/paperEmpty/data.json';
import AddExam from "@/modules/teach-tool/examination-manager/AddExam";
const questionTypeEnum = { const questionTypeEnum = {
SINGLE_CHOICE: "单选题", SINGLE_CHOICE: "单选题",
...@@ -127,11 +132,10 @@ class OperatePaper extends Component { ...@@ -127,11 +132,10 @@ class OperatePaper extends Component {
const { paperName, passRate } = result; const { paperName, passRate } = result;
this.setState( this.setState(
{ {
selectQuestionList: result.questionList.sort( selectQuestionList: result.questionList,
(a, b) => b.updateTime - a.updateTime
),
formData: { formData: {
...result, ...result,
paperId: getParameterByName("paperId"),
paperName: paperName:
currentOperate === "copy" ? paperName + "(复制)" : paperName, currentOperate === "copy" ? paperName + "(复制)" : paperName,
}, },
...@@ -147,19 +151,6 @@ class OperatePaper extends Component { ...@@ -147,19 +151,6 @@ class OperatePaper extends Component {
); );
}; };
// 自定义表格空状态
customizeRenderEmpty = () => {
return (
<Empty
image="https://image.xiaomaiketang.com/xm/emptyTable.png"
imageStyle={{
height: 100,
}}
description={"请在左上角添加题目"}
></Empty>
);
};
setFormData = (list, sorter) => { setFormData = (list, sorter) => {
const { formData } = this.state; const { formData } = this.state;
const _selectQuestionList = [...list]; const _selectQuestionList = [...list];
...@@ -222,11 +213,6 @@ class OperatePaper extends Component { ...@@ -222,11 +213,6 @@ class OperatePaper extends Component {
case "descend": case "descend":
currentQuestionList = sortedTableData.reverse(); currentQuestionList = sortedTableData.reverse();
break; break;
case "default":
currentQuestionList = _selectQuestionList.sort(
(a, b) => b.updateTime - a.updateTime
);
break;
default: default:
currentQuestionList = _selectQuestionList; currentQuestionList = _selectQuestionList;
break; break;
...@@ -261,7 +247,7 @@ class OperatePaper extends Component { ...@@ -261,7 +247,7 @@ class OperatePaper extends Component {
getSelectedQuestion={this.state.selectQuestionList} getSelectedQuestion={this.state.selectQuestionList}
setSelectedQuestion={(list) => { setSelectedQuestion={(list) => {
this.setState({ selectQuestionModal: null }, () => { this.setState({ selectQuestionModal: null }, () => {
this.setFormData(list.sort((a, b) => b.updateTime - a.updateTime)); this.setFormData(list);
}); });
}} }}
close={() => { close={() => {
...@@ -329,18 +315,24 @@ class OperatePaper extends Component { ...@@ -329,18 +315,24 @@ class OperatePaper extends Component {
if (this.checkExist(paperName)) { if (this.checkExist(paperName)) {
return "该试卷名称已存在"; return "该试卷名称已存在";
} }
if (paperName && paperName.length > 40) {
return "试卷名称最多40字";
}
}; };
// 保存试卷 // 保存试卷
savePaper = async () => { savePaper = (saveType) => {
this.setState({ check: true }); this.setState({ check: true });
const { selectQuestionList, formData, currentOperate } = this.state; const { selectQuestionList, formData, currentOperate } = this.state;
const categoryId = getParameterByName("categoryId"); const categoryId = getParameterByName("categoryId");
const { match } = this.props;
let questionList = []; let questionList = [];
if ( if (
!formData.passRate || !formData.passRate ||
!formData.paperName || !formData.paperName ||
this.checkExist(formData.paperName) this.checkExist(formData.paperName) ||
(formData.paperName && formData.paperName.length > 40)
) { ) {
return; return;
} }
...@@ -370,6 +362,13 @@ class OperatePaper extends Component { ...@@ -370,6 +362,13 @@ class OperatePaper extends Component {
AidToolService.createPaper(this.state.formData) AidToolService.createPaper(this.state.formData)
.then((res) => { .then((res) => {
if (res.success) { if (res.success) {
if (saveType === "saveToAddExam") {
this.setState({formData:{ ...formData, paperId: res.result}},() => {
window.RCHistory.push({
pathname: `${match.url}/exam-operate-page`,
});
})
} else {
message.success( message.success(
currentOperate === "new" ? "新建成功" : "复制成功" currentOperate === "new" ? "新建成功" : "复制成功"
); );
...@@ -383,6 +382,7 @@ class OperatePaper extends Component { ...@@ -383,6 +382,7 @@ class OperatePaper extends Component {
); );
Bus.trigger("queryCategoryTree", "remain"); Bus.trigger("queryCategoryTree", "remain");
} }
}
}) })
.catch((e) => { .catch((e) => {
window.RCHistory.push({ window.RCHistory.push({
...@@ -402,6 +402,11 @@ class OperatePaper extends Component { ...@@ -402,6 +402,11 @@ class OperatePaper extends Component {
}) })
.then((res) => { .then((res) => {
if (res.success) { if (res.success) {
if (saveType === "saveToAddExam") {
window.RCHistory.push({
pathname: `${match.url}/exam-operate-page`,
});
} else {
message.success("编辑成功"); message.success("编辑成功");
window.RCHistory.push({ window.RCHistory.push({
pathname: `/paper-manage-index?categoryId=${categoryId}`, pathname: `/paper-manage-index?categoryId=${categoryId}`,
...@@ -412,6 +417,7 @@ class OperatePaper extends Component { ...@@ -412,6 +417,7 @@ class OperatePaper extends Component {
selectQuestionList.length selectQuestionList.length
); );
} }
}
}) })
.catch((e) => { .catch((e) => {
window.RCHistory.push({ window.RCHistory.push({
...@@ -461,6 +467,8 @@ class OperatePaper extends Component { ...@@ -461,6 +467,8 @@ class OperatePaper extends Component {
"categoryId" "categoryId"
)}`, )}`,
}); });
Bus.trigger("queryCategoryTree", "remain");
Bus.trigger("queryPaperPageList", getParameterByName("categoryId"), 0);
}, },
}); });
}; };
...@@ -469,7 +477,7 @@ class OperatePaper extends Component { ...@@ -469,7 +477,7 @@ class OperatePaper extends Component {
sortByQuestionType = (pagination, filters, sorter) => { sortByQuestionType = (pagination, filters, sorter) => {
const { columnKey, order } = sorter; const { columnKey, order } = sorter;
if (columnKey === "questionType") { if (columnKey === "questionType") {
this.setFormData(this.state.selectQuestionList, order || "default"); this.setFormData(this.state.selectQuestionList, order);
} }
}; };
...@@ -681,6 +689,7 @@ class OperatePaper extends Component { ...@@ -681,6 +689,7 @@ class OperatePaper extends Component {
formData, formData,
loading, loading,
check, check,
currentOperate,
} = this.state; } = this.state;
const { const {
singleChoiceCnt, singleChoiceCnt,
...@@ -699,21 +708,35 @@ class OperatePaper extends Component { ...@@ -699,21 +708,35 @@ class OperatePaper extends Component {
questionCnt, questionCnt,
totalScore, totalScore,
} = formData; } = formData;
const { match } = this.props;
const defaultOptions = {
loop: true,
autoplay: true,
animationData: paperEmpty,
rendererSettings: {
preserveAspectRatio: 'xMidYMid slice'
}
}
return ( return (
<div>
<div className="page operate-paper-page"> <div className="page operate-paper-page">
<Breadcrumbs navList={currentNav} goBack={() => this.handleGoBack()} /> <Breadcrumbs
navList={currentNav}
goBack={() => this.handleGoBack()}
/>
<Spin spinning={loading}> <Spin spinning={loading}>
<div className="box"> <div className="box">
<div className="show-tips"> <div className="show-tips">
<ShowTips message="请遵守国家相关规定,切勿上传低俗色情、暴力恐怖、谣言诈骗、侵权盗版等相关内容,小麦企学院保有依据国家规定及平台规则进行处理的权利" /> <ShowTips message="请遵守国家相关规定,切勿上传低俗色情、暴力恐怖、谣言诈骗、侵权盗版等相关内容,小麦企学院保有依据国家规定及平台规则进行处理的权利" />
</div> </div>
<Form ref={this.formRef} style={{ marginTop: 24, marginBottom: '85px' }}> <Form ref={this.formRef} style={{ marginTop: 24 }}>
<Form.Item <Form.Item
name="paperName" name="paperName"
label="试卷名称:" label="试卷名称:"
required required
validateStatus={this.validatePaperName(paperName) ? "error" : ""} validateStatus={
this.validatePaperName(paperName) ? "error" : ""
}
help={this.validatePaperName(paperName)} help={this.validatePaperName(paperName)}
> >
<Input <Input
...@@ -776,8 +799,12 @@ class OperatePaper extends Component { ...@@ -776,8 +799,12 @@ class OperatePaper extends Component {
自选题目 自选题目
</Button> </Button>
{questionCnt > 0 && ( {questionCnt > 0 && (
<div className="paper-info-tip" style={{ margin: "0 auto 12px" }}> <div
总计<span>{totalScore}</span>分,共<span>{questionCnt}</span> className="paper-info-tip"
style={{ margin: "0 auto 12px" }}
>
总计<span>{totalScore}</span>分,共
<span>{questionCnt}</span>
题。{" "} 题。{" "}
{singleChoiceCnt > 0 && {singleChoiceCnt > 0 &&
`单选题${singleChoiceCnt}题,共${singleChoiceScore}分;`} `单选题${singleChoiceCnt}题,共${singleChoiceScore}分;`}
...@@ -791,23 +818,35 @@ class OperatePaper extends Component { ...@@ -791,23 +818,35 @@ class OperatePaper extends Component {
</div> </div>
)} )}
<ConfigProvider renderEmpty={this.customizeRenderEmpty}> <XMTable
<Table
className="table-style" className="table-style"
scroll={{ y: 350 }} scroll={{ y: 350 }}
columns={this.parseColumns()} columns={this.parseColumns()}
dataSource={selectQuestionList} dataSource={selectQuestionList}
pagination={false} pagination={false}
onChange={this.sortByQuestionType} onChange={this.sortByQuestionType}
selections={false} renderEmpty={{
image: <div style={{ marginTop: 24 }}>
<Lottie
options={defaultOptions}
height={150}
width={150}
isStopped={false}
isPaused={false}
/>
</div>,
description: <span style={{ display: 'block', paddingBottom: 24 }}>请在左上角添加题目</span>
}}
/> />
</ConfigProvider>
</Form> </Form>
</div> </div>
<div className="footer shrink-footer"> <div className="footer">
<Button onClick={this.handleGoBack}>取消</Button> <Button onClick={this.handleGoBack}>取消</Button>
<Button onClick={this.previewPaper}>预览</Button> <Button onClick={this.previewPaper}>预览</Button>
<Button type="primary" onClick={this.savePaper}> <Button onClick={() => this.savePaper("saveToAddExam")}>
保存并组织考试
</Button>
<Button type="primary" onClick={() => this.savePaper()}>
保存 保存
</Button> </Button>
</div> </div>
...@@ -815,8 +854,24 @@ class OperatePaper extends Component { ...@@ -815,8 +854,24 @@ class OperatePaper extends Component {
{selectQuestionModal} {selectQuestionModal}
{paperPreviewModal} {paperPreviewModal}
</div> </div>
<Route
path={`${match.url}/exam-operate-page`}
render={() => {
return (
<AddExam
paperInfo={formData}
type={
currentOperate === "edit"
? "editPaperToAddExam"
: "newPaperToAddExam"
}
/>
);
}}
/>
</div>
); );
} }
} }
export default OperatePaper; export default withRouter(OperatePaper);
.operate-paper-page { .operate-paper-page {
.box { .box {
margin-bottom: 52px !important; margin-bottom: 52px !important;
.ant-form-item {
margin-bottom: 24px !important;
}
.table-style { .table-style {
border: 1px solid #f0f0f0 !important; border: 1px solid #f0f0f0 !important;
} }
...@@ -12,7 +15,6 @@ ...@@ -12,7 +15,6 @@
margin-left: 12px; margin-left: 12px;
} }
.choose-btn { .choose-btn {
margin-top: 8px;
margin-bottom: 12px; margin-bottom: 12px;
} }
.paper-info-tip { .paper-info-tip {
...@@ -60,12 +62,16 @@ ...@@ -60,12 +62,16 @@
} }
} }
.ant-table tbody tr { .ant-table tbody tr {
&:last-child { &:nth-child(even) {
background: #fff;
}
&:nth-child(odd) {
background: #fafafa;
}
td { td {
border-bottom: none!important; border-bottom: none!important;
} }
} }
}
.ant-table-thead>tr>th:not(:last-child):not(.ant-table-selection-column):not(.ant-table-row-expand-icon-cell):not([colspan]) { .ant-table-thead>tr>th:not(:last-child):not(.ant-table-selection-column):not(.ant-table-row-expand-icon-cell):not([colspan]) {
&::before { &::before {
......
...@@ -2,13 +2,12 @@ ...@@ -2,13 +2,12 @@
* @Author: yuananting * @Author: yuananting
* @Date: 2021-02-25 11:23:47 * @Date: 2021-02-25 11:23:47
* @LastEditors: yuananting * @LastEditors: yuananting
* @LastEditTime: 2021-05-20 11:37:40 * @LastEditTime: 2021-06-03 17:13:30
* @Description: 助学工具-题库-试卷列表数据 * @Description: 助学工具-题库-试卷列表数据
* @Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有 * @Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有
*/ */
import React, { Component } from "react"; import React, { Component } from "react";
import { import {
Table,
Dropdown, Dropdown,
Row, Row,
Input, Input,
...@@ -20,14 +19,19 @@ import { ...@@ -20,14 +19,19 @@ import {
ConfigProvider, ConfigProvider,
Empty, Empty,
} from "antd"; } from "antd";
import { PageControl } from "@/components"; import Lottie from 'react-lottie';
import { PageControl, XMTable } from "@/components";
import "./PaperList.less"; import "./PaperList.less";
import { Route, withRouter } from "react-router-dom"; import { Route, withRouter } from "react-router-dom";
import OperatePaper from "@/modules/teach-tool/paper-manage/OperatePaper"; import OperatePaper from "@/modules/teach-tool/paper-manage/OperatePaper";
import AddExam from "@/modules/teach-tool/examination-manager/AddExam";
import User from "@/common/js/user"; import User from "@/common/js/user";
import AidToolService from "@/domains/aid-tool-domain/AidToolService"; import AidToolService from "@/domains/aid-tool-domain/AidToolService";
import Service from "@/common/js/service";
import _ from "underscore"; import _ from "underscore";
import PaperPreviewModal from "../modal/PreviewPaperModal"; import PaperPreviewModal from "../modal/PreviewPaperModal";
import MoveModal from '../../modal/MoveModal';
import * as nodata from '../../../lottie/nodata/data.json';
import Bus from "@/core/bus"; import Bus from "@/core/bus";
const { Search } = Input; const { Search } = Input;
...@@ -49,14 +53,18 @@ class PaperList extends Component { ...@@ -49,14 +53,18 @@ class PaperList extends Component {
dataSource: [], dataSource: [],
paperPreviewModal: null, // 试卷预览模态框 paperPreviewModal: null, // 试卷预览模态框
loading: false, loading: false,
selectedPaperKeys: [],
paperInfo: {}, // 选择的某份试卷用于组织考试
}; };
} }
componentDidMount() { componentDidMount() {
this.queryPaperPageList(); this.queryPaperPageList();
this.queryCategoryTree();
Bus.bind("queryPaperPageList", (selectedCategoryId, count) => { Bus.bind("queryPaperPageList", (selectedCategoryId, count) => {
selectedCategoryId = selectedCategoryId =
selectedCategoryId === "null" ? null : selectedCategoryId; selectedCategoryId === "null" ? null : selectedCategoryId;
this.clearSelect();
this.setState({ loading: true }); this.setState({ loading: true });
if (count >= 100) { if (count >= 100) {
setTimeout(() => { setTimeout(() => {
...@@ -72,6 +80,35 @@ class PaperList extends Component { ...@@ -72,6 +80,35 @@ class PaperList extends Component {
Bus.unbind("queryPaperPageList", this.queryPaperPageList); Bus.unbind("queryPaperPageList", this.queryPaperPageList);
} }
// 查询分类树
queryCategoryTree = () => {
let query = {
bizType: 'PAPER',
count: true,
source: 0,
userId: User.getStoreUserId(),
tenantId: User.getStoreId(),
};
AidToolService.queryCategoryTree(query).then((res) => {
const { categoryList = [] } = res.result;
let list = this.renderTreeNodes(categoryList);
this.setState({ paperData: list });
});
}
renderTreeNodes = (data) => {
let newTreeData = data.map((item) => {
item.title = item.categoryName;
item.value = item.id;
item.key = item.id;
if (item.sonCategoryList) {
item.children = this.renderTreeNodes(item.sonCategoryList);
}
return item;
});
return newTreeData;
};
// 初始化列表查询 // 初始化列表查询
InitSearch = (categoryId) => { InitSearch = (categoryId) => {
const _query = { const _query = {
...@@ -88,7 +125,6 @@ class PaperList extends Component { ...@@ -88,7 +125,6 @@ class PaperList extends Component {
// 查询试卷列表 // 查询试卷列表
queryPaperPageList = async () => { queryPaperPageList = async () => {
const res = await AidToolService.queryPaperPageList(this.state.query); const res = await AidToolService.queryPaperPageList(this.state.query);
Bus.trigger("queryCategoryTree", "remain");
const { records = [], total = 0 } = res.result; const { records = [], total = 0 } = res.result;
this.setState({ dataSource: records, total, loading: false }); this.setState({ dataSource: records, total, loading: false });
}; };
...@@ -140,6 +176,20 @@ class PaperList extends Component { ...@@ -140,6 +176,20 @@ class PaperList extends Component {
} }
}; };
organizeExam = (record) => {
const { match } = this.props;
this.setState(
{
paperInfo: record,
},
() => {
window.RCHistory.push({
pathname: `${match.url}/exam-operate-page`,
});
}
);
};
// 删除试卷 // 删除试卷
deletePaper = (record) => { deletePaper = (record) => {
let params = { let params = {
...@@ -151,16 +201,23 @@ class PaperList extends Component { ...@@ -151,16 +201,23 @@ class PaperList extends Component {
AidToolService.deletePaper(params).then((res) => { AidToolService.deletePaper(params).then((res) => {
if (res.success) { if (res.success) {
message.success("删除成功"); message.success("删除成功");
const { query, total } = this.state; const { query, total, selectedPaperKeys } = this.state;
const { size, current } = query; const { size, current } = query;
const _query = query; const _query = query;
let data = {};
if (total / size < current) { if (total / size < current) {
if (total % size === 1) { if (total % size === 1) {
_query.current = 1; _query.current = 1;
} }
} }
this.setState({ query: _query }, () => { data.query = _query;
if (selectedPaperKeys.includes(record.paperId)) {
data.selectedPaperKeys = _.reject(selectedPaperKeys, item => item === record.paperId);
}
this.setState(data, () => {
this.queryPaperPageList(); this.queryPaperPageList();
Bus.trigger("queryCategoryTree", "remain");
}); });
} }
}); });
...@@ -193,19 +250,6 @@ class PaperList extends Component { ...@@ -193,19 +250,6 @@ class PaperList extends Component {
} }
}; };
// 自定义表格空状态
customizeRenderEmpty = () => {
return (
<Empty
image="https://image.xiaomaiketang.com/xm/emptyTable.png"
imageStyle={{
height: 100,
}}
description={"还没有试卷"}
></Empty>
);
};
// 表头设置 // 表头设置
parseColumns = () => { parseColumns = () => {
const columns = [ const columns = [
...@@ -346,6 +390,9 @@ class PaperList extends Component { ...@@ -346,6 +390,9 @@ class PaperList extends Component {
<Menu.Item key="edit"> <Menu.Item key="edit">
<span onClick={() => this.editPaper(item)}>编辑</span> <span onClick={() => this.editPaper(item)}>编辑</span>
</Menu.Item> </Menu.Item>
<Menu.Item key="organizeExam">
<span onClick={() => this.organizeExam(item)}>组织考试</span>
</Menu.Item>
<Menu.Item key="del"> <Menu.Item key="del">
<span onClick={() => this.confirmDeletePaper(item)}>删除</span> <span onClick={() => this.confirmDeletePaper(item)}>删除</span>
</Menu.Item> </Menu.Item>
...@@ -370,6 +417,108 @@ class PaperList extends Component { ...@@ -370,6 +417,108 @@ class PaperList extends Component {
this.props.onSelect(selectedRows[0] || {}); this.props.onSelect(selectedRows[0] || {});
}; };
batchMove = () => {
const { selectedPaperKeys } = this.state;
if (_.isEmpty(selectedPaperKeys)) {
message.warning('请先选择要移动的试卷');
return null;
}
this.setState({ openMoveModal: true });
}
batchMoveRemote = (categoryId) => {
const { selectedPaperKeys, query } = this.state;
const data = {
categoryId,
paperId: selectedPaperKeys,
source: 0,
tenantId: User.getStoreId(),
userId: User.getUserId(),
};
Service.Hades('public/hades/batchMovePaperCategory', data, { reject: true }).then((res) => {
if (res.success) {
message.success('移动成功');
this.setState(
{
query: {
...query,
current: 1,
},
},
() => {
this.queryPaperPageList();
}
);
Bus.trigger("queryCategoryTree", "remain");
this.clearSelect();
} else {
message.error('移动失败');
}
}).catch(() => {
message.error('移动失败');
})
}
batchDelete = () => {
const { selectedPaperKeys, query } = this.state;
if (_.isEmpty(selectedPaperKeys)) {
message.warning('请先选择要删除的试卷');
return null;
}
Modal.confirm({
title: "确定要删除试卷吗?",
content: "删除后,不可恢复。",
icon: (
<span className="icon iconfont default-confirm-icon">&#xe839; </span>
),
okText: "删除",
cancelText: "取消",
onOk: () => {
const data = {
paperId: selectedPaperKeys,
source: 0,
tenantId: User.getStoreId(),
userId: User.getUserId(),
};
Service.Hades('public/hades/batchDeletePaper', data, { reject: true }).then((res) => {
if (res.success) {
message.success('删除成功');
this.setState(
{
query: {
...query,
current: 1,
},
},
() => {
this.queryPaperPageList();
}
);
Bus.trigger("queryCategoryTree", "remain");
this.clearSelect();
} else {
message.error('删除失败');
}
}).catch(() => {
message.error('删除失败');
})
},
})
}
onSelectPaper = (selectedPaperKeys) => {
if (selectedPaperKeys.length > 50) {
const extraLength = selectedPaperKeys.length - 50;
selectedPaperKeys.splice(selectedPaperKeys.length - extraLength, extraLength);
message.warning('最多只能选择50个试卷');
}
this.setState({ selectedPaperKeys });
};
clearSelect = () => {
this.setState({ selectedPaperKeys: [] });
}
render() { render() {
const { const {
dataSource = [], dataSource = [],
...@@ -378,8 +527,17 @@ class PaperList extends Component { ...@@ -378,8 +527,17 @@ class PaperList extends Component {
paperPreviewModal, paperPreviewModal,
selectedRowKeys, selectedRowKeys,
loading, loading,
selectedPaperKeys,
openMoveModal,
paperData,
paperInfo,
} = this.state; } = this.state;
const { current, size, categoryId, paperName } = query; const { current, size, categoryId, paperName } = query;
const paperRowSelection = {
selectedRowKeys: selectedPaperKeys,
preserveSelectedRowKeys: true,
onChange: this.onSelectPaper,
}
const rowSelection = { const rowSelection = {
type: "radio", type: "radio",
selectedRowKeys, selectedRowKeys,
...@@ -389,6 +547,14 @@ class PaperList extends Component { ...@@ -389,6 +547,14 @@ class PaperList extends Component {
User.getUserRole() User.getUserRole()
); );
const { match } = this.props; const { match } = this.props;
const defaultOptions = {
loop: true,
autoplay: true,
animationData: nodata,
rendererSettings: {
preserveAspectRatio: 'xMidYMid slice'
}
}
return ( return (
<div className={"paper-list " + this.props.type}> <div className={"paper-list " + this.props.type}>
<div className="paper-list-filter"> <div className="paper-list-filter">
...@@ -418,9 +584,12 @@ class PaperList extends Component { ...@@ -418,9 +584,12 @@ class PaperList extends Component {
</div> </div>
</Row> </Row>
</div> </div>
{this.props.type !== "modal-select" && isPermiss && categoryId && ( {this.props.type !== "modal-select" && isPermiss && (
<Button <div className="select-box">
{_.isEmpty(selectedPaperKeys) ?
(!!categoryId && <Button
type="primary" type="primary"
className="mr8"
onClick={() => { onClick={() => {
window.RCHistory.push({ window.RCHistory.push({
pathname: `${match.url}/paper-operate-page?type=new&categoryId=${categoryId}`, pathname: `${match.url}/paper-operate-page?type=new&categoryId=${categoryId}`,
...@@ -428,25 +597,61 @@ class PaperList extends Component { ...@@ -428,25 +597,61 @@ class PaperList extends Component {
}} }}
> >
新建试卷 新建试卷
</Button> </Button>)
: <div className="select-container">
<span className="con">
<div>
<span className="icon iconfont tip">&#xe6f2;</span>
<span className="text">已选择{selectedPaperKeys.length}</span>
</div>
<div>
<span className="clear" onClick={this.clearSelect}>清空</span>
</div>
</span>
</div>
}
<Button
className="mr8"
onClick={() => {
this.batchMove();
}}
>批量移动</Button>
<Button
onClick={() => {
this.batchDelete();
}}
>批量删除</Button>
</div>
)} )}
<div className="paper-list-content"> <div className="paper-list-content">
<ConfigProvider renderEmpty={this.customizeRenderEmpty}>
{this.props.type !== "modal-select" ? ( {this.props.type !== "modal-select" ? (
<Table <XMTable
rowKey={(record) => record.id} rowKey={(record) => record.paperId}
rowSelection={paperRowSelection}
dataSource={dataSource} dataSource={dataSource}
columns={this.parseColumns()} columns={this.parseColumns()}
pagination={false} pagination={false}
bordered bordered
loading={loading} loading={loading}
renderEmpty={{
image: <div style={{ marginTop: 24 }}>
<Lottie
options={defaultOptions}
height={150}
width={150}
isStopped={false}
isPaused={false}
/>
</div>,
description: <span style={{ display: 'block', paddingBottom: 24 }}>还没有试卷</span>
}}
/> />
) : ( ) : (
<Table <XMTable
rowKey={(record) => record.id} rowKey={(record) => record.paperId}
dataSource={dataSource} dataSource={dataSource}
size={this.props.type == "modal-select"?'small':'middle'} size={this.props.type == "modal-select" ? "small" : "middle"}
rowKey={(item) => { rowKey={(item) => {
return item.paperId; return item.paperId;
}} }}
...@@ -454,9 +659,20 @@ class PaperList extends Component { ...@@ -454,9 +659,20 @@ class PaperList extends Component {
columns={this.parseColumns()} columns={this.parseColumns()}
pagination={false} pagination={false}
bordered bordered
renderEmpty={{
image: <div style={{ marginTop: 24 }}>
<Lottie
options={defaultOptions}
height={150}
width={150}
isStopped={false}
isPaused={false}
/>
</div>,
description: <span style={{ display: 'block', paddingBottom: 24 }}>暂无数据</span>
}}
/> />
)} )}
</ConfigProvider>
{total > 0 && ( {total > 0 && (
<div className="box-footer"> <div className="box-footer">
...@@ -464,7 +680,7 @@ class PaperList extends Component { ...@@ -464,7 +680,7 @@ class PaperList extends Component {
current={current - 1} current={current - 1}
pageSize={size} pageSize={size}
total={total} total={total}
size={this.props.type == "modal-select"?'small':'middle'} size={this.props.type == "modal-select" ? "small" : "middle"}
toPage={(page) => { toPage={(page) => {
const _query = { ...query, current: page + 1 }; const _query = { ...query, current: page + 1 };
this.setState({ query: _query }, () => this.setState({ query: _query }, () =>
...@@ -477,11 +693,36 @@ class PaperList extends Component { ...@@ -477,11 +693,36 @@ class PaperList extends Component {
</div> </div>
)} )}
{paperPreviewModal} {paperPreviewModal}
{openMoveModal &&
<MoveModal
visible={openMoveModal}
title="试卷"
data={paperData}
categoryId={query.categoryId}
length={selectedRowKeys.length}
onCancel={() => this.setState({ openMoveModal: false })}
onOk={(categoryId) => {
this.batchMoveRemote(categoryId);
this.setState({ openMoveModal: false });
}}
/>
}
</div> </div>
<Route <Route
path={`${match.url}/paper-operate-page`} path={`${match.url}/paper-operate-page`}
component={OperatePaper} component={OperatePaper}
/> />
<Route
path={`${match.url}/exam-operate-page`}
render={() => {
return (
<AddExam
paperInfo={paperInfo}
type="organizeExam"
/>
);
}}
/>
</div> </div>
); );
} }
......
.paper-list { .paper-list {
.select-box {
display: flex;
align-items: center;
.select-container{
margin-right: 24px;
.con{
background: #E9EFFF;
border-radius: 4px;
padding: 3px 16px;
display: inline-flex;
align-items: center;
justify-content: space-between;
.tip{
font-size:14px;
color:#2966FF;
margin-right:8px;
}
.text{
font-size:14px;
color:#666;
margin-right:30px;
}
.clear{
color:#5289FA;
font-size:14px;
}
}
}
}
.ant-radio-wrapper{ .ant-radio-wrapper{
left: -10px; left: -10px;
} }
...@@ -45,7 +74,7 @@ ...@@ -45,7 +74,7 @@
} }
.paper-list-content { .paper-list-content {
position: relative; position: relative;
margin-top: 16px; margin-top: 12px;
.empty-list-tip { .empty-list-tip {
color: #2966FF; color: #2966FF;
cursor: pointer; cursor: pointer;
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* @Author: yuananting * @Author: yuananting
* @Date: 2021-02-25 11:23:47 * @Date: 2021-02-25 11:23:47
* @LastEditors: yuananting * @LastEditors: yuananting
* @LastEditTime: 2021-05-20 11:43:21 * @LastEditTime: 2021-05-30 18:17:05
* @Description: 助学工具-新建试卷-选择题目列表 * @Description: 助学工具-新建试卷-选择题目列表
* @Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有 * @Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有
*/ */
...@@ -16,6 +16,7 @@ import { ...@@ -16,6 +16,7 @@ import {
Select, Select,
Tooltip, Tooltip,
message, message,
DatePicker,
} from "antd"; } from "antd";
import { PageControl } from "@/components"; import { PageControl } from "@/components";
import "./SelectQuestionList.less"; import "./SelectQuestionList.less";
...@@ -23,8 +24,10 @@ import User from "@/common/js/user"; ...@@ -23,8 +24,10 @@ import User from "@/common/js/user";
import AidToolService from "@/domains/aid-tool-domain/AidToolService"; import AidToolService from "@/domains/aid-tool-domain/AidToolService";
import _ from "underscore"; import _ from "underscore";
import Bus from "@/core/bus"; import Bus from "@/core/bus";
import moment from 'moment';
const { Search } = Input; const { Search } = Input;
const { RangePicker } = DatePicker;
const questionTypeEnum = { const questionTypeEnum = {
SINGLE_CHOICE: "单选题", SINGLE_CHOICE: "单选题",
...@@ -68,12 +71,15 @@ class SelectQuestionList extends Component { ...@@ -68,12 +71,15 @@ class SelectQuestionList extends Component {
categoryId: null, // 当前题库分类Id categoryId: null, // 当前题库分类Id
questionName: null, // 题目名称 questionName: null, // 题目名称
questionType: null, // 题目类型 questionType: null, // 题目类型
updateDateStart: null,
updateDateEnd: null,
source: 0, source: 0,
tenantId: User.getStoreId(), tenantId: User.getStoreId(),
userId: User.getStoreUserId(), userId: User.getStoreUserId(),
}, },
dataSource: [], dataSource: [],
selectQuestionKeys: [], selectQuestionKeys: [],
expandFilter: false,
}; };
} }
...@@ -98,6 +104,8 @@ class SelectQuestionList extends Component { ...@@ -98,6 +104,8 @@ class SelectQuestionList extends Component {
order: "UPDATED_DESC", // 排序规则 order: "UPDATED_DESC", // 排序规则
questionName: null, // 题目名称 questionName: null, // 题目名称
questionType: null, // 题目类型 questionType: null, // 题目类型
updateDateStart: null,
updateDateEnd: null,
}; };
this.setState({ query: _query }, () => { this.setState({ query: _query }, () => {
this.queryQuestionPageListWithContent(); this.queryQuestionPageListWithContent();
...@@ -134,6 +142,8 @@ class SelectQuestionList extends Component { ...@@ -134,6 +142,8 @@ class SelectQuestionList extends Component {
order: "UPDATED_DESC", // 排序规则 order: "UPDATED_DESC", // 排序规则
questionName: null, // 题目名称 questionName: null, // 题目名称
questionType: null, // 题目类型 questionType: null, // 题目类型
updateDateStart: null,
updateDateEnd: null,
}; };
this.setState({ query: _query }, () => { this.setState({ query: _query }, () => {
this.queryQuestionPageListWithContent(); this.queryQuestionPageListWithContent();
...@@ -144,6 +154,14 @@ class SelectQuestionList extends Component { ...@@ -144,6 +154,14 @@ class SelectQuestionList extends Component {
parseColumns = () => { parseColumns = () => {
const columns = [ const columns = [
{ {
title: "题型",
key: "questionTypeEnum",
dataIndex: "questionTypeEnum",
render: (val) => {
return questionTypeEnum[val];
},
},
{
title: "题目", title: "题目",
key: "questionStem", key: "questionStem",
dataIndex: "questionStem", dataIndex: "questionStem",
...@@ -170,14 +188,6 @@ class SelectQuestionList extends Component { ...@@ -170,14 +188,6 @@ class SelectQuestionList extends Component {
}, },
}, },
{ {
title: "题型",
key: "questionTypeEnum",
dataIndex: "questionTypeEnum",
render: (val) => {
return questionTypeEnum[val];
},
},
{
title: "正确率", title: "正确率",
key: "accuracy", key: "accuracy",
dataIndex: "accuracy", dataIndex: "accuracy",
...@@ -215,11 +225,23 @@ class SelectQuestionList extends Component { ...@@ -215,11 +225,23 @@ class SelectQuestionList extends Component {
// 改变搜索条件 // 改变搜索条件
handleChangeQuery = (searchType, value) => { handleChangeQuery = (searchType, value) => {
const _query = this.state.query;
switch (searchType) {
case "questionName":
_query.questionName = value;
break;
case "updatedTime":
_query.updateDateStart = value && value[0]?.startOf('day').valueOf();
_query.updateDateEnd = value && value[1]?.endOf('day').valueOf();
break;
case "questionType":
_query.questionType = value;
break
}
this.setState( this.setState(
{ {
query: { query: {
...this.state.query, ..._query,
[searchType]: value || null,
current: 1, current: 1,
}, },
}, },
...@@ -281,6 +303,7 @@ class SelectQuestionList extends Component { ...@@ -281,6 +303,7 @@ class SelectQuestionList extends Component {
total, total,
query, query,
selectQuestionKeys = [], selectQuestionKeys = [],
expandFilter,
} = this.state; } = this.state;
const { current, size, questionName, questionType } = query; const { current, size, questionName, questionType } = query;
const rowSelection = { const rowSelection = {
...@@ -364,6 +387,17 @@ class SelectQuestionList extends Component { ...@@ -364,6 +387,17 @@ class SelectQuestionList extends Component {
})} })}
</Select> </Select>
</div> </div>
<div className="search-condition__item">
<span className="search-label">更新时间:</span>
<RangePicker
value={[
query.updateDateStart ? moment(Number(query.updateDateStart)) : null,
query.updateDateEnd ? moment(Number(query.updateDateEnd)) : null
]}
onChange={(value) => {
this.handleChangeQuery("updatedTime", value)
}} />
</div>
</div> </div>
<div className="reset-fold-area"> <div className="reset-fold-area">
......
...@@ -2,19 +2,22 @@ ...@@ -2,19 +2,22 @@
.select-question-filter { .select-question-filter {
position: relative; position: relative;
.search-condition { .search-condition {
width: calc(100% - 80px); width: calc(100% - 20px);
display: flex; display: flex;
align-items: center; align-items: center;
flex-wrap: wrap; flex-wrap: wrap;
&__item { &__item {
margin-right: 3%; margin-right: 3%;
width: 30%;
margin-bottom: 16px; margin-bottom: 16px;
display: flex;
.search-label { .search-label {
vertical-align: middle; vertical-align: middle;
display: inline-block; display: inline-block;
height: 32px; height: 32px;
line-height: 32px; line-height: 32px;
flex-shrink: 0;
} }
} }
} }
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* @Author: yuananting * @Author: yuananting
* @Date: 2021-03-27 11:15:03 * @Date: 2021-03-27 11:15:03
* @LastEditors: yuananting * @LastEditors: yuananting
* @LastEditTime: 2021-04-15 13:22:10 * @LastEditTime: 2021-06-01 17:28:21
* @Description: 助学工具-试卷-预览试卷 * @Description: 助学工具-试卷-预览试卷
* @Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有 * @Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有
*/ */
...@@ -284,7 +284,7 @@ class PreviewPaperModal extends Component { ...@@ -284,7 +284,7 @@ class PreviewPaperModal extends Component {
footer={null} footer={null}
onCancel={this.props.close} onCancel={this.props.close}
> >
{paperName && <div className="paper-title">{paperName}</div>} {paperName && <div className="paper-title">{paperName.length > 40 ? paperName.substring(0, 40) : paperName}</div>}
{questionList && questionList.length > 0 ? ( {questionList && questionList.length > 0 ? (
<div className="question-list-box"> <div className="question-list-box">
{_.map(questionList, (questionItem, questionIndex) => { {_.map(questionList, (questionItem, questionIndex) => {
......
...@@ -2,23 +2,30 @@ ...@@ -2,23 +2,30 @@
* @Author: yuananting * @Author: yuananting
* @Date: 2021-02-25 11:23:47 * @Date: 2021-02-25 11:23:47
* @LastEditors: yuananting * @LastEditors: yuananting
* @LastEditTime: 2021-05-20 11:35:07 * @LastEditTime: 2021-06-03 17:12:01
* @Description: 助学工具-题库-题目列表数据 * @Description: 助学工具-题库-题目列表数据
* @Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有 * @Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有
*/ */
import React, { Component } from 'react'; import React, { Component } from 'react';
import { Table, ConfigProvider, Empty, Row, Input, Select, Tooltip, Space, Button, Modal, message } from 'antd'; import { Table, ConfigProvider, Empty, Row, Input, Select, Tooltip, Space, Button, Modal, message, Menu, Dropdown, DatePicker } from 'antd';
import { PageControl } from '@/components'; import Lottie from 'react-lottie';
import './QuestionList.less'; import _ from 'underscore';
import { Route, withRouter } from 'react-router-dom';
import { DownOutlined } from '@ant-design/icons';
import { PageControl, XMTable } from '@/components';
import User from '@/common/js/user'; import User from '@/common/js/user';
import AidToolService from '@/domains/aid-tool-domain/AidToolService'; import AidToolService from '@/domains/aid-tool-domain/AidToolService';
import _ from 'underscore';
import PreviewQuestionModal from '../modal/PreviewQuestionModal'; import PreviewQuestionModal from '../modal/PreviewQuestionModal';
import BatchImportQuestionModal from '../modal/BatchImportQuestionModal'; import BatchImportQuestionModal from '../modal/BatchImportQuestionModal';
import { Route, withRouter } from 'react-router-dom';
import OperateQuestion from '../OperateQuestion'; import OperateQuestion from '../OperateQuestion';
import Bus from '@/core/bus'; import Bus from '@/core/bus';
import moment from 'moment';
import Service from '@/common/js/service';
import MoveModal from '../../modal/MoveModal';
import * as nodata from '../../../lottie/nodata/data.json';
import './QuestionList.less';
const { RangePicker } = DatePicker;
const { Search } = Input; const { Search } = Input;
const questionTypeEnum = { const questionTypeEnum = {
...@@ -70,12 +77,15 @@ class QuestionList extends Component { ...@@ -70,12 +77,15 @@ class QuestionList extends Component {
dataSource: [], // 题库列表 dataSource: [], // 题库列表
previewQuestionModal: null, // 题目预览模态框 previewQuestionModal: null, // 题目预览模态框
batchImportQuestionModal: null, // 批量导入模态框 batchImportQuestionModal: null, // 批量导入模态框
selectedRowKeys: [],
}; };
} }
componentDidMount() { componentDidMount() {
this.queryQuestionPageList(); this.queryQuestionPageList();
this.queryCategoryTree();
Bus.bind('queryQuestionPageList', (selectedCategoryId) => { Bus.bind('queryQuestionPageList', (selectedCategoryId) => {
selectedCategoryId = selectedCategoryId === 'null' ? null : selectedCategoryId; selectedCategoryId = selectedCategoryId === 'null' ? null : selectedCategoryId;
this.clearSelect();
this.InitSearch(selectedCategoryId); this.InitSearch(selectedCategoryId);
}); });
} }
...@@ -84,6 +94,35 @@ class QuestionList extends Component { ...@@ -84,6 +94,35 @@ class QuestionList extends Component {
Bus.unbind('queryQuestionPageList', this.queryQuestionPageList); Bus.unbind('queryQuestionPageList', this.queryQuestionPageList);
} }
// 查询分类树
queryCategoryTree = () => {
let query = {
bizType: 'QUESTION',
count: true,
source: 0,
userId: User.getStoreUserId(),
tenantId: User.getStoreId(),
};
AidToolService.queryCategoryTree(query).then((res) => {
const { categoryList = [] } = res.result;
let list = this.renderTreeNodes(categoryList);
this.setState({ questionData: list });
});
};
renderTreeNodes = (data) => {
let newTreeData = data.map((item) => {
item.title = item.categoryName;
item.value = item.id;
item.key = item.id;
if (item.sonCategoryList) {
item.children = this.renderTreeNodes(item.sonCategoryList);
}
return item;
});
return newTreeData;
};
// 初始化列表查询 // 初始化列表查询
InitSearch = (categoryId) => { InitSearch = (categoryId) => {
const _query = { const _query = {
...@@ -124,6 +163,8 @@ class QuestionList extends Component { ...@@ -124,6 +163,8 @@ class QuestionList extends Component {
order: 'UPDATED_DESC', // 排序规则 order: 'UPDATED_DESC', // 排序规则
questionName: null, // 题目名称 questionName: null, // 题目名称
questionType: null, // 题目类型 questionType: null, // 题目类型
updateDateStart: null,
updateDateEnd: null,
}; };
this.setState({ query: _query }, () => { this.setState({ query: _query }, () => {
this.queryQuestionPageList(); this.queryQuestionPageList();
...@@ -138,36 +179,6 @@ class QuestionList extends Component { ...@@ -138,36 +179,6 @@ class QuestionList extends Component {
}); });
}; };
// 自定义表格空状态
customizeRenderEmpty = () => {
const { categoryId } = this.state.query;
return (
<Empty
image='https://image.xiaomaiketang.com/xm/emptyTable.png'
imageStyle={{
height: 100,
}}
description={
<span>
<span>还没有题目</span>
{['CloudManager', 'StoreManager'].includes(User.getUserRole()) && categoryId && (
<span>
,快去
<span
className='empty-list-tip'
onClick={() => {
this.handleCreateQuestion();
}}>
新建一个
</span>
吧!
</span>
)}
</span>
}></Empty>
);
};
// 排序 // 排序
handleChangeTable = (pagination, filters, sorter) => { handleChangeTable = (pagination, filters, sorter) => {
const { columnKey, order } = sorter; const { columnKey, order } = sorter;
...@@ -195,6 +206,15 @@ class QuestionList extends Component { ...@@ -195,6 +206,15 @@ class QuestionList extends Component {
const isPermiss = ['CloudManager', 'StoreManager'].includes(User.getUserRole()); const isPermiss = ['CloudManager', 'StoreManager'].includes(User.getUserRole());
const columns = [ const columns = [
{ {
title: '题型',
key: 'questionTypeEnum',
dataIndex: 'questionTypeEnum',
width: '16%',
render: (val) => {
return questionTypeEnum[val];
},
},
{
title: '题目', title: '题目',
key: 'questionStem', key: 'questionStem',
dataIndex: 'questionStem', dataIndex: 'questionStem',
...@@ -231,15 +251,6 @@ class QuestionList extends Component { ...@@ -231,15 +251,6 @@ class QuestionList extends Component {
}, },
}, },
{ {
title: '题型',
key: 'questionTypeEnum',
dataIndex: 'questionTypeEnum',
width: '16%',
render: (val) => {
return questionTypeEnum[val];
},
},
{
title: '正确率', title: '正确率',
key: 'accuracy', key: 'accuracy',
dataIndex: 'accuracy', dataIndex: 'accuracy',
...@@ -351,15 +362,20 @@ class QuestionList extends Component { ...@@ -351,15 +362,20 @@ class QuestionList extends Component {
AidToolService.deleteQuestion(params).then((res) => { AidToolService.deleteQuestion(params).then((res) => {
if (res.success) { if (res.success) {
message.success('删除成功'); message.success('删除成功');
const { query, total } = this.state; const { query, total, selectedRowKeys } = this.state;
const { size, current } = query; const { size, current } = query;
const _query = query; const _query = query;
let data = {};
if (total / size < current) { if (total / size < current) {
if (total % size === 1) { if (total % size === 1) {
_query.current = 1; _query.current = 1;
} }
} }
this.setState({ query: _query }, () => { data.query = _query;
if (selectedRowKeys.includes(record.id)) {
data.selectedRowKeys = _.reject(selectedRowKeys, (item) => item === record.id);
}
this.setState(data, () => {
this.queryQuestionPageList(); this.queryQuestionPageList();
Bus.trigger('queryCategoryTree', 'remain'); Bus.trigger('queryCategoryTree', 'remain');
}); });
...@@ -392,10 +408,155 @@ class QuestionList extends Component { ...@@ -392,10 +408,155 @@ class QuestionList extends Component {
this.setState({ batchImportQuestionModal: m }); this.setState({ batchImportQuestionModal: m });
}; };
onSelectChange = (selectedRowKeys) => {
if (selectedRowKeys.length > 50) {
const extraLength = selectedRowKeys.length - 50;
selectedRowKeys.splice(selectedRowKeys.length - extraLength, extraLength);
message.warning('最多只能选择50个题目');
}
this.setState({ selectedRowKeys });
};
/**
* 设置【更多操作】选项
*/
setMoreOperationOption() {
return (
<Menu>
<Menu.Item key='2'>
<div
key='import'
onClick={() => {
this.batchMove();
}}>
批量移动
</div>
</Menu.Item>
<Menu.Item key='1'>
<div
key='import'
onClick={() => {
this.batchDelete();
}}>
批量删除
</div>
</Menu.Item>
</Menu>
);
}
batchMove = () => {
const { selectedRowKeys } = this.state;
if (_.isEmpty(selectedRowKeys)) {
message.warning('请先选择要移动的题目');
return null;
}
this.setState({ openMoveModal: true });
};
batchMoveRemote = (categoryId) => {
const { selectedRowKeys, query } = this.state;
const data = {
categoryId,
id: selectedRowKeys,
source: 0,
tenantId: User.getStoreId(),
userId: User.getUserId(),
};
Service.Hades('public/hades/batchMoveQuestion', data, { reject: true })
.then((res) => {
if (res.success) {
message.success('移动成功');
Bus.trigger('queryCategoryTree', 'remain');
this.clearSelect();
this.setState(
{
query: {
...query,
current: 1,
},
},
() => {
this.queryQuestionPageList();
}
);
} else {
message.error('移动失败');
}
})
.catch(() => {
message.error('移动失败');
});
};
batchDelete = () => {
const { selectedRowKeys, query } = this.state;
if (_.isEmpty(selectedRowKeys)) {
message.warning('请先选择要删除的题目');
return null;
}
Modal.confirm({
title: '确定要删除题目吗?',
content: '删除后,不可恢复。',
icon: <span className='icon iconfont default-confirm-icon'>&#xe839; </span>,
okText: '删除',
cancelText: '取消',
onOk: () => {
const data = {
id: selectedRowKeys,
source: 0,
tenantId: User.getStoreId(),
userId: User.getUserId(),
};
Service.Hades('public/hades/batchDeleteQuestion', data, { reject: true })
.then((res) => {
if (res.success) {
message.success('删除成功');
Bus.trigger('queryCategoryTree', 'remain');
this.clearSelect();
this.setState(
{
query: {
...query,
current: 1,
},
},
() => {
this.queryQuestionPageList();
}
);
} else {
message.error('删除失败');
}
})
.catch(() => {
message.error('删除失败');
});
},
});
};
clearSelect = () => {
this.setState({ selectedRowKeys: [] });
};
render() { render() {
const { dataSource = [], total, query, previewQuestionModal, batchImportQuestionModal } = this.state; const { dataSource = [], total, query, previewQuestionModal, batchImportQuestionModal, selectedRowKeys, openMoveModal, questionData } = this.state;
const { current, size, categoryId, questionName, questionType } = query; const { current, size, categoryId, questionName, questionType } = query;
const { match } = this.props; const { match } = this.props;
const rowSelection = {
selectedRowKeys,
preserveSelectedRowKeys: true,
onChange: this.onSelectChange,
};
const defaultOptions = {
loop: true,
autoplay: true,
animationData: nodata,
rendererSettings: {
preserveAspectRatio: 'xMidYMid slice',
},
};
return ( return (
<div className='question-list'> <div className='question-list'>
<div className='question-list-filter'> <div className='question-list-filter'>
...@@ -406,7 +567,7 @@ class QuestionList extends Component { ...@@ -406,7 +567,7 @@ class QuestionList extends Component {
<Search <Search
placeholder='搜索题目名称' placeholder='搜索题目名称'
value={questionName} value={questionName}
style={{ width: 178 }} style={{ width: '100%' }}
onChange={(e) => { onChange={(e) => {
this.handleChangeQuery('questionName', e.target.value); this.handleChangeQuery('questionName', e.target.value);
}} }}
...@@ -422,7 +583,7 @@ class QuestionList extends Component { ...@@ -422,7 +583,7 @@ class QuestionList extends Component {
<Select <Select
placeholder='请选择题目类型' placeholder='请选择题目类型'
value={questionType} value={questionType}
style={{ width: 178 }} style={{ width: '100%' }}
showSearch showSearch
allowClear allowClear
filterOption={(inputVal, option) => option.props.children.includes(inputVal)} filterOption={(inputVal, option) => option.props.children.includes(inputVal)}
...@@ -443,6 +604,21 @@ class QuestionList extends Component { ...@@ -443,6 +604,21 @@ class QuestionList extends Component {
})} })}
</Select> </Select>
</div> </div>
<div className='search-condition__item'>
<span className='search-label'>更新时间:</span>
<RangePicker
value={query.updateDateStart ? [moment(query.updateDateStart), moment(query.updateDateEnd)] : null}
style={{ width: '100%' }}
format={'YYYY-MM-DD'}
onChange={(dates) => {
const _query = _.clone(query);
_query.updateDateStart = dates ? dates[0].startOf('day').valueOf() : null;
_query.updateDateEnd = dates ? dates[1].endOf('day').valueOf() : null;
_query.current = 0;
this.setState({ query: _query }, () => this.queryQuestionPageList());
}}
/>
</div>
</div> </div>
<div className='reset-fold-area'> <div className='reset-fold-area'>
...@@ -454,25 +630,82 @@ class QuestionList extends Component { ...@@ -454,25 +630,82 @@ class QuestionList extends Component {
</div> </div>
</Row> </Row>
</div> </div>
{['CloudManager', 'StoreManager'].includes(User.getUserRole()) && categoryId && ( {['CloudManager', 'StoreManager'].includes(User.getUserRole()) && (
<Space size={16}> <Space size={8}>
<Button type='primary' onClick={this.handleCreateQuestion}> {_.isEmpty(selectedRowKeys) ? (
!!categoryId && [
<Button key='1' type='primary' onClick={this.handleCreateQuestion}>
新建题目 新建题目
</Button>,
<Button key='2' onClick={this.batchImportQuestion}>
批量导入
</Button>,
]
) : (
<div className='select-container'>
<span className='con'>
<div>
<span className='icon iconfont tip'>&#xe6f2;</span>
<span className='text'>已选择{selectedRowKeys.length}</span>
</div>
<div>
<span className='clear' onClick={this.clearSelect}>
清空
</span>
</div>
</span>
</div>
)}
{!!categoryId ? (
<Dropdown overlay={this.setMoreOperationOption()}>
<Button id='more_operate'>
更多操作
<DownOutlined />
</Button> </Button>
<Button onClick={this.batchImportQuestion}>批量导入</Button> </Dropdown>
) : (
<Space size={8}>
<Button onClick={() => this.batchMove()}>批量移动</Button>
<Button onClick={() => this.batchDelete()}>批量删除</Button>
</Space>
)}
</Space> </Space>
)} )}
<div className='question-list-content'> <div className='question-list-content'>
<ConfigProvider renderEmpty={this.customizeRenderEmpty}> <XMTable
<Table
rowKey={(record) => record.id} rowKey={(record) => record.id}
dataSource={dataSource} dataSource={dataSource}
columns={this.parseColumns()} columns={this.parseColumns()}
pagination={false} pagination={false}
bordered bordered
onChange={this.handleChangeTable} onChange={this.handleChangeTable}
rowSelection={rowSelection}
renderEmpty={{
image: (
<div style={{ marginTop: 24 }}>
<Lottie options={defaultOptions} height={150} width={150} isStopped={false} isPaused={false} />
</div>
),
description: (
<span style={{ display: 'block', paddingBottom: 24 }}>
<span>还没有题目</span>
{['CloudManager', 'StoreManager'].includes(User.getUserRole()) && categoryId && (
<span>
,快去
<span
className='empty-list-tip'
onClick={() => {
this.handleCreateQuestion();
}}>
新建一个
</span>
吧!
</span>
)}
</span>
),
}}
/> />
</ConfigProvider>
{total > 0 && ( {total > 0 && (
<div className='box-footer'> <div className='box-footer'>
<PageControl <PageControl
...@@ -490,6 +723,20 @@ class QuestionList extends Component { ...@@ -490,6 +723,20 @@ class QuestionList extends Component {
)} )}
{previewQuestionModal} {previewQuestionModal}
{batchImportQuestionModal} {batchImportQuestionModal}
{openMoveModal && (
<MoveModal
visible={openMoveModal}
title='题目'
data={questionData}
categoryId={query.categoryId}
length={selectedRowKeys.length}
onCancel={() => this.setState({ openMoveModal: false })}
onOk={(categoryId) => {
this.batchMoveRemote(categoryId);
this.setState({ openMoveModal: false });
}}
/>
)}
</div> </div>
<Route path={`${match.url}/question-operate-page`} component={OperateQuestion} /> <Route path={`${match.url}/question-operate-page`} component={OperateQuestion} />
</div> </div>
......
...@@ -8,13 +8,16 @@ ...@@ -8,13 +8,16 @@
flex-wrap: wrap; flex-wrap: wrap;
&__item { &__item {
display: flex;
margin-right: 3%; margin-right: 3%;
margin-bottom: 16px; margin-bottom: 16px;
width: 30%;
.search-label { .search-label {
vertical-align: middle; vertical-align: middle;
display: inline-block; display: inline-block;
height: 32px; height: 32px;
line-height: 32px; line-height: 32px;
flex-shrink: 0;
} }
} }
} }
...@@ -37,12 +40,37 @@ ...@@ -37,12 +40,37 @@
} }
} }
} }
.select-container{
.con {
background: #E9EFFF;
border-radius: 4px;
padding: 3px 16px;
display: inline-flex;
align-items: center;
justify-content: space-between;
.tip {
font-size: 14px;
color: #2966FF;
margin-right: 8px;
}
.text {
font-size: 14px;
color: #666;
margin-right: 30px;
}
.clear {
color: #5289FA;
font-size: 14px;
}
}
}
.data-icon { .data-icon {
cursor: pointer; cursor: pointer;
} }
.question-list-content { .question-list-content {
position: relative; position: relative;
margin-top: 16px; margin-top: 12px;
.empty-list-tip { .empty-list-tip {
color: #2966FF; color: #2966FF;
cursor: pointer; cursor: pointer;
......
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