Commit 1f11f4b3 by guomingpang

merge: merge master代码

parents 7f7c5b3d 6fb0e402
import React, { useEffect, useState } from 'react'; import React, { useEffect, useState } from 'react';
import { Empty, ConfigProvider, Table } from 'antd'; import { Empty, ConfigProvider, Table } from 'antd';
import Lottie from 'react-lottie';
import * as nodata from '../modules/lottie/nodata/data.json';
function XMTable(props) { function XMTable(props) {
const [empty, setEmpty] = useState(props.renderEmpty || {}); const [empty, setEmpty] = useState(props.renderEmpty || {});
...@@ -12,9 +14,25 @@ function XMTable(props) { ...@@ -12,9 +14,25 @@ function XMTable(props) {
// 自定义表格空状态 // 自定义表格空状态
function customizeRenderEmpty() { function customizeRenderEmpty() {
const defaultOptions = {
loop: true,
autoplay: true,
animationData: empty.image || nodata,
rendererSettings: {
preserveAspectRatio: 'xMidYMid slice'
}
}
return ( return (
<Empty <Empty
image={empty.image || Empty.PRESENTED_IMAGE_SIMPLE} image={<div style={{ marginTop: 24 }}>
<Lottie
options={defaultOptions}
height={150}
width={150}
isStopped={false}
isPaused={false}
/>
</div>}
imageStyle={{ imageStyle={{
height: 150, height: 150,
}} }}
......
...@@ -6,9 +6,11 @@ ...@@ -6,9 +6,11 @@
import React from 'react'; import React from 'react';
import { Modal, Input, Table, message, Tooltip, Empty } from 'antd'; import { Modal, Input, Table, message, Tooltip, Empty } from 'antd';
import { XMTable } from '@/components';
import Service from '@/common/js/service'; import Service from '@/common/js/service';
import User from '@/common/js/user' import User from '@/common/js/user'
import SetEmployeeModal from "./SetEmployeeModal"; import SetEmployeeModal from "./SetEmployeeModal";
import search from '../../lottie/search/data.json';
import './ChooseMembersModal.less'; import './ChooseMembersModal.less';
import _ from 'underscore'; import _ from 'underscore';
...@@ -311,19 +313,18 @@ class ChooseMembersModal extends React.Component { ...@@ -311,19 +313,18 @@ class ChooseMembersModal extends React.Component {
enterButton={<span className="icon iconfont">&#xe832;</span>} enterButton={<span className="icon iconfont">&#xe832;</span>}
/> />
<div className='container-left-body-table'> <div className='container-left-body-table'>
<Table <XMTable
rowKey={(record) => record.enterpriseVisibleUserId} rowKey={(record) => record.enterpriseVisibleUserId}
dataSource={allUserList} dataSource={allUserList}
columns={this.selectedColumnsLeft()} columns={this.selectedColumnsLeft()}
pagination={false} pagination={false}
scroll={{ y: 290}} scroll={{ y: 290}}
// bordered={true} renderEmpty={{
locale={{ image: searchKey ? search : '',
emptyText: <div> description: <div>
<Empty image={Empty.PRESENTED_IMAGE_SIMPLE} description={false} /> <div style={{ color: '#333' }}>暂无数据</div>
<div style={{ color: '#333', marginTop: -70 }}>暂无数据</div>
<div style={{ color: '#666', padding: '0 32px', fontSize: '12px' }}>需要先将员工添加到企微可见范围后,员工才会出现在这里</div> <div style={{ color: '#666', padding: '0 32px', fontSize: '12px' }}>需要先将员工添加到企微可见范围后,员工才会出现在这里</div>
</div>, </div>
}} }}
size={'small'} size={'small'}
rowSelection={{ rowSelection={{
......
/* /*
* @Author: 吴文洁 * @Author: 吴文洁
* @Date: 2020-08-05 10:12:45 * @Date: 2020-08-05 10:12:45
* @LastEditors: Please set LastEditors * @LastEditors: yuananting
* @LastEditTime: 2021-05-27 20:13:53 * @LastEditTime: 2021-06-02 15:05:54
* @Description: 视频课-列表模块 * @Description: 视频课-列表模块
* @Copyright: 杭州杰竞科技有限公司 版权所有 * @Copyright: 杭州杰竞科技有限公司 版权所有
*/ */
...@@ -364,7 +364,7 @@ class GraphicsCourseList extends React.Component { ...@@ -364,7 +364,7 @@ class GraphicsCourseList extends React.Component {
<ShareLiveModal <ShareLiveModal
needStr={needStr} needStr={needStr}
data={shareData} data={shareData}
type="videoClass" type="graphicsClass"
title="图文课" title="图文课"
close={() => { close={() => {
this.setState({ this.setState({
......
/* /*
* @Author: 吴文洁 * @Author: 吴文洁
* @Date: 2020-06-22 14:26:37 * @Date: 2020-06-22 14:26:37
* @Last Modified by: 吴文洁 * @Last Modified by: chenshu
* @Last Modified time: 2020-07-23 09:33:02 * @Last Modified time: 2021-06-08 18:18:46
*/ */
import React, { useEffect, useState } from 'react'; import React, { useEffect, useState } from 'react';
import { Modal, Button, Table, Progress, message, Tooltip, Spin, Popconfirm } from 'antd'; import { Modal, Button, Table, Progress, message, Tooltip, Spin, Popconfirm } from 'antd';
...@@ -40,7 +40,7 @@ class ManageCoursewareModal extends React.Component { ...@@ -40,7 +40,7 @@ class ManageCoursewareModal extends React.Component {
componentDidMount() { componentDidMount() {
this.getCoursewareList(); this.getCoursewareList();
var animation = Lottie.loadAnimation({ var animation = Lottie.loadAnimation({
path: "https://image.xiaomaiketang.com/xm/MQwp2aJaxf.json", path: "https://image.xiaomaiketang.com/xm/SDBkP7mbJX.json",
name: "test", name: "test",
renderer: "svg", renderer: "svg",
loop: true, loop: true,
......
...@@ -8,8 +8,8 @@ ...@@ -8,8 +8,8 @@
.empty-image { .empty-image {
display: block; display: block;
margin: 24px auto 12px; margin: 24px auto 12px;
width:100px; width:150px;
height:100px; height:150px;
} }
.empty-button { .empty-button {
display: block; display: block;
......
...@@ -18,8 +18,6 @@ import CourseService from '@/domains/course-domain/CourseService' ...@@ -18,8 +18,6 @@ import CourseService from '@/domains/course-domain/CourseService'
import './ShareLiveModal.less' import './ShareLiveModal.less'
const DEFAULT_COVER = 'https://image.xiaomaiketang.com/xm/YNfi45JwFA.png'
class ShareLiveModal extends React.Component { class ShareLiveModal extends React.Component {
constructor(props) { constructor(props) {
super(props) super(props)
...@@ -98,27 +96,31 @@ class ShareLiveModal extends React.Component { ...@@ -98,27 +96,31 @@ class ShareLiveModal extends React.Component {
render() { render() {
const { courseDivision, data, type, title } = this.props const { courseDivision, data, type, title } = this.props
const { courseName, coverUrl = DEFAULT_COVER, scheduleVideoUrl } = data const { courseName, scheduleVideoUrl, courseMediaVOS, coverUrl } = data
const { shareUrl, showImg, time } = this.state const { shareUrl, showImg, time } = this.state
// 判断是否是默认图, 默认图不需要在URL后面增加字符串 // 判断是否是默认图, 默认图不需要在URL后面增加字符串
const isDefaultCover = coverUrl === DEFAULT_COVER let coverImgSrc = '';
switch (type) {
let coverImgSrc = coverUrl case 'liveClass': // 直播课
if (type === 'videoClass') { if (courseMediaVOS && courseMediaVOS.length > 0) {
if ((!coverUrl || isDefaultCover) && title !== '图文课' && title !== '线下课') { data.courseMediaVOS.map((item, index) => {
if (courseDivision === 'external') { if (item.contentType === 'COVER') {
coverImgSrc = 'https://image.xiaomaiketang.com/xm/mt3ZQRxGKB.png' coverImgSrc = item.mediaUrl
}
})
} else { } else {
coverImgSrc = `${scheduleVideoUrl}?x-oss-process=video/snapshot,t_0,m_fast&anystring=anystring` coverImgSrc = 'https://image.xiaomaiketang.com/xm/Yip2YtFDwH.png';
}
}
} else {
data.courseMediaVOS.map((item, index) => {
if (item.contentType === 'COVER') {
coverImgSrc = item.mediaUrl
} }
}) break;
case 'videoClass': // 视频课
coverImgSrc = coverUrl || (courseDivision === 'internal' ? `${scheduleVideoUrl}?x-oss-process=video/snapshot,t_0,m_fast&anystring=anystring` : 'https://image.xiaomaiketang.com/xm/mt3ZQRxGKB.png')
break;
case 'graphicsClass': // 图文课
coverImgSrc = coverUrl || 'https://image.xiaomaiketang.com/xm/wFnpZtp2yB.png';
break;
case 'offlineClass': // 线下课
coverImgSrc = coverUrl || 'https://image.xiaomaiketang.com/xm/pxbWKsYA87.png';
break;
} }
return ( return (
...@@ -137,7 +139,7 @@ class ShareLiveModal extends React.Component { ...@@ -137,7 +139,7 @@ class ShareLiveModal extends React.Component {
<span className='text'>{User.getStoreName()}</span> <span className='text'>{User.getStoreName()}</span>
</div> </div>
<div className='course-name-title'>{type === 'videoClass' ? `${courseName}开课啦` : `邀请你观看直播:`}</div> <div className='course-name-title'>{type === 'liveClass' ? `邀请你观看直播:` : `${courseName}开课啦`}</div>
{type === 'liveClass' && <div class='live-couse-name'>{courseName}</div>} {type === 'liveClass' && <div class='live-couse-name'>{courseName}</div>}
<Choose> <Choose>
<When condition={showImg}> <When condition={showImg}>
......
/* /*
* @Author: 吴文洁 * @Author: 吴文洁
* @Date: 2020-08-05 10:07:47 * @Date: 2020-08-05 10:07:47
* @LastEditors: wufan * @LastEditors: yuananting
* @LastEditTime: 2021-05-27 19:25:48 * @LastEditTime: 2021-06-07 15:06:26
* @Description: 线下课新增/编辑页 * @Description: 线下课新增/编辑页
* @Copyright: 杭州杰竞科技有限公司 版权所有 * @Copyright: 杭州杰竞科技有限公司 版权所有
*/ */
...@@ -518,6 +518,11 @@ class AddOfflineCourse extends React.Component { ...@@ -518,6 +518,11 @@ class AddOfflineCourse extends React.Component {
if(coverId){ if(coverId){
scheduleMediaRequests = [coverObj] scheduleMediaRequests = [coverObj]
} }
// 编辑且使用默认图时不传
if (pageType === 'edit' && coverUrl === defaultCoverUrl) {
scheduleMediaRequests = []
}
const commonParams = { const commonParams = {
categoryId, categoryId,
courseName, courseName,
......
/* /*
* @Author: 吴文洁 * @Author: 吴文洁
* @Date: 2020-08-05 10:12:45 * @Date: 2020-08-05 10:12:45
* @LastEditors: Please set LastEditors * @LastEditors: yuananting
* @LastEditTime: 2021-05-27 20:14:01 * @LastEditTime: 2021-06-02 16:15:55
* @Description: 视频课-列表模块 * @Description: 视频课-列表模块
* @Copyright: 杭州杰竞科技有限公司 版权所有 * @Copyright: 杭州杰竞科技有限公司 版权所有
*/ */
...@@ -25,7 +25,7 @@ import QRCodeModal from '../modal/QRCodeModal'; ...@@ -25,7 +25,7 @@ import QRCodeModal from '../modal/QRCodeModal';
import './OfflineCourseList.less'; import './OfflineCourseList.less';
const ENV = process.env.DEPLOY_ENV || 'dev'; const ENV = process.env.DEPLOY_ENV || 'dev';
const defaultCoverUrl = 'https://image.xiaomaiketang.com/xm/YNfi45JwFA.png'; const defaultCoverUrl = 'https://image.xiaomaiketang.com/xm/pxbWKsYA87.png';
class OfflineCourseList extends React.Component { class OfflineCourseList extends React.Component {
...@@ -358,7 +358,7 @@ class OfflineCourseList extends React.Component { ...@@ -358,7 +358,7 @@ class OfflineCourseList extends React.Component {
<ShareLiveModal <ShareLiveModal
needStr={needStr} needStr={needStr}
data={shareData} data={shareData}
type="videoClass" type="offlineClass"
title="线下课" title="线下课"
close={() => { close={() => {
this.setState({ this.setState({
......
...@@ -6,7 +6,7 @@ import Service from "@/common/js/service"; ...@@ -6,7 +6,7 @@ import Service from "@/common/js/service";
import './PreviewOfflineModal.less'; import './PreviewOfflineModal.less';
import ENUM from '@/modules/knowledge-base/ENUM'; import ENUM from '@/modules/knowledge-base/ENUM';
const defaultCoverUrl = 'https://image.xiaomaiketang.com/xm/YNfi45JwFA.png'; const defaultCoverUrl = 'https://image.xiaomaiketang.com/xm/pxbWKsYA87.png';
class PreviewOfflineModal extends React.Component { class PreviewOfflineModal extends React.Component {
......
...@@ -10,7 +10,6 @@ ...@@ -10,7 +10,6 @@
import React from "react"; import React from "react";
import { 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 Lottie from 'react-lottie';
import { PageControl, XMTable } from "@/components"; import { PageControl, XMTable } from "@/components";
import { LIVE_SHARE_MAP } from "@/common/constants/academic/cloudClass"; import { LIVE_SHARE_MAP } from "@/common/constants/academic/cloudClass";
import { appId, shareUrl, LIVE_SHARE } from "@/domains/course-domain/constants"; import { appId, shareUrl, LIVE_SHARE } from "@/domains/course-domain/constants";
...@@ -18,7 +17,6 @@ import ScanFileModal from "../../resource-disk/modal/ScanFileModal"; ...@@ -18,7 +17,6 @@ import ScanFileModal from "../../resource-disk/modal/ScanFileModal";
import WatchData from "./WatchData"; import WatchData from "./WatchData";
import KnowledgeAPI from "@/data-source/knowledge/request-api"; import KnowledgeAPI from "@/data-source/knowledge/request-api";
import ENUM from "../ENUM.js"; import ENUM from "../ENUM.js";
import * as nodata from '../../lottie/nodata/data.json';
import "./KnowledgeBaseList.less"; import "./KnowledgeBaseList.less";
const DEFAULT_SIZE_UNIT = 1000 * 1000 // 将B转换成M const DEFAULT_SIZE_UNIT = 1000 * 1000 // 将B转换成M
...@@ -494,14 +492,6 @@ class KnowledgeBaseList extends React.Component { ...@@ -494,14 +492,6 @@ class KnowledgeBaseList extends React.Component {
preserveSelectedRowKeys: true, preserveSelectedRowKeys: true,
onChange: onSelectChange, 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">
<XMTable <XMTable
...@@ -515,15 +505,6 @@ class KnowledgeBaseList extends React.Component { ...@@ -515,15 +505,6 @@ class KnowledgeBaseList extends React.Component {
bordered bordered
className="knowledge-list-table" className="knowledge-list-table"
renderEmpty={{ 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> description: <span style={{ display: 'block', paddingBottom: 24 }}>暂无数据</span>
}} }}
/> />
......
...@@ -2,8 +2,8 @@ ...@@ -2,8 +2,8 @@
* @Description: * @Description:
* @Author: zangsuyun * @Author: zangsuyun
* @Date: 2021-03-13 09:54:26 * @Date: 2021-03-13 09:54:26
* @LastEditors: fusanqiasng * @LastEditors: yuananting
* @LastEditTime: 2021-06-01 10:26:46 * @LastEditTime: 2021-06-10 19:55:24
* @Copyright: © 2020 杭州杰竞科技有限公司 版权所有 * @Copyright: © 2020 杭州杰竞科技有限公司 版权所有
*/ */
...@@ -324,7 +324,7 @@ class AddCourse extends React.Component { ...@@ -324,7 +324,7 @@ class AddCourse extends React.Component {
return <img className='course-cover' src={item.mediaUrl} alt='' />; return <img className='course-cover' src={item.mediaUrl} alt='' />;
} }
})} })}
{!hasCover && <img className='course-cover' src={'https://image.xiaomaiketang.com/xm/YNfi45JwFA.png'} alt='' />} {!hasCover && <img className='course-cover' src={'https://image.xiaomaiketang.com/xm/Yip2YtFDwH.png'} alt='' />}
<div> <div>
<Choose> <Choose>
<When condition={record.courseName.length > 17}> <When condition={record.courseName.length > 17}>
...@@ -501,8 +501,7 @@ class AddCourse extends React.Component { ...@@ -501,8 +501,7 @@ class AddCourse extends React.Component {
const { coverUrl } = record; const { coverUrl } = record;
return ( return (
<div className='record__item'> <div className='record__item'>
{/* 上传了封面的话就用上传的封面, 没有的话就取视频的第一帧 */} <img className='course-cover' src={coverUrl || 'https://image.xiaomaiketang.com/xm/wFnpZtp2yB.png'} alt='' />
<img className='course-cover' src={coverUrl || 'https://image.xiaomaiketang.com/xm/YNfi45JwFA.png'} alt='' />
<Choose> <Choose>
<When condition={record.courseName.length > 25}> <When condition={record.courseName.length > 25}>
<Tooltip title={record.courseName}> <Tooltip title={record.courseName}>
......
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
import React, { useState } from 'react'; import React, { useState } from 'react';
import { Table, Modal, message, Tooltip, Switch, Dropdown } from 'antd'; import { Table, Modal, message, Tooltip, Switch, Dropdown } from 'antd';
import { withRouter } from 'react-router-dom'; import { withRouter } from 'react-router-dom';
import { PageControl } from '@/components'; import { PageControl, XMTable } from "@/components";
import PlanService from '@/domains/plan-domain/planService'; import PlanService from '@/domains/plan-domain/planService';
import SharePlanModal from '../modal/SharePlanModal'; import SharePlanModal from '../modal/SharePlanModal';
import { LIVE_SHARE } from '@/domains/course-domain/constants'; import { LIVE_SHARE } from '@/domains/course-domain/constants';
...@@ -305,7 +305,7 @@ function PlanList(props) { ...@@ -305,7 +305,7 @@ function PlanList(props) {
} }
return ( return (
<div className='plan-list'> <div className='plan-list'>
<Table <XMTable
rowKey={(record) => record.id} rowKey={(record) => record.id}
showSorterTooltip={false} showSorterTooltip={false}
dataSource={props.planListData} dataSource={props.planListData}
...@@ -316,6 +316,9 @@ function PlanList(props) { ...@@ -316,6 +316,9 @@ function PlanList(props) {
size='middle' size='middle'
scroll={{ x: 1400 }} scroll={{ x: 1400 }}
className='plan-list-table' className='plan-list-table'
renderEmpty={{
description: <span style={{ display: 'block', paddingBottom: 24 }}>暂无数据</span>
}}
/> />
<div className='box-footer'> <div className='box-footer'>
<PageControl <PageControl
......
...@@ -16,7 +16,7 @@ import CourseService from '@/domains/course-domain/CourseService' ...@@ -16,7 +16,7 @@ import CourseService from '@/domains/course-domain/CourseService'
import './SharePlanModal.less' import './SharePlanModal.less'
const DEFAULT_COVER = 'https://image.xiaomaiketang.com/xm/YNfi45JwFA.png' const DEFAULT_COVER = 'https://image.xiaomaiketang.com/xm/rEAetaTEh3.png'
class ShareLiveModal extends React.Component { class ShareLiveModal extends React.Component {
constructor(props) { constructor(props) {
......
...@@ -304,7 +304,7 @@ class SelectOperatorModal extends React.Component { ...@@ -304,7 +304,7 @@ class SelectOperatorModal extends React.Component {
return null return null
})} })}
<If condition={!hasCover}> <If condition={!hasCover}>
<img className='course-cover' src={"https://image.xiaomaiketang.com/xm/YNfi45JwFA.png"} alt='' /> <img className='course-cover' src={"https://image.xiaomaiketang.com/xm/Yip2YtFDwH.png"} alt='' />
</If> </If>
<div> <div>
...@@ -432,8 +432,7 @@ class SelectOperatorModal extends React.Component { ...@@ -432,8 +432,7 @@ class SelectOperatorModal extends React.Component {
const { coverUrl } = record const { coverUrl } = record
return ( return (
<div className='course-info'> <div className='course-info'>
{/* 上传了封面的话就用上传的封面, 没有的话就取视频的第一帧 */} <img className='course-cover' src={coverUrl || "https://image.xiaomaiketang.com/xm/wFnpZtp2yB.png"} alt='' />
<img className='course-cover' src={coverUrl || "https://image.xiaomaiketang.com/xm/YNfi45JwFA.png"} alt='' />
<div className='course-name'>{record.courseName}</div> <div className='course-name'>{record.courseName}</div>
</div> </div>
) )
......
/* /*
* @Author: 吴文洁 * @Author: 吴文洁
* @Date: 2020-06-09 10:47:51 * @Date: 2020-06-09 10:47:51
* @Last Modified by: 吴文洁 * @Last Modified by: chenshu
* @Last Modified time: 2020-07-23 09:33:09 * @Last Modified time: 2021-06-08 18:10:25
* @Description: 文件夹列表 * @Description: 文件夹列表
*/ */
...@@ -11,12 +11,13 @@ import { Table, Menu, Dropdown, Modal, message,Tooltip } from 'antd'; ...@@ -11,12 +11,13 @@ import { Table, Menu, Dropdown, Modal, message,Tooltip } from 'antd';
import _ from 'underscore'; import _ from 'underscore';
// import * as lodash from 'lodash'; // import * as lodash from 'lodash';
import { PageControl, LottieIcon } from 'xiaomai-b-components'; import { PageControl, LottieIcon } from 'xiaomai-b-components';
import { XMTable } from '@/components';
import Service from '@/common/js/service'; import Service from '@/common/js/service';
import { formatDate } from '@/domains/basic-domain/utils'; import { formatDate } from '@/domains/basic-domain/utils';
import { FILE_TYPE_ICON_MAP, SUPPORT_FILE_TYPE_MAP, DEFAULT_SIZE_UNIT } from '@/domains/resource-disk/constants'; import { FILE_TYPE_ICON_MAP, SUPPORT_FILE_TYPE_MAP, DEFAULT_SIZE_UNIT } from '@/domains/resource-disk/constants';
import { getFileTypeByName } from '@/domains/resource-disk/utils'; import { getFileTypeByName } from '@/domains/resource-disk/utils';
import addData from '../../lottie/addData/data.json';
import search from '../../lottie/search/data.json';
import UploadProgressModal from '@/bu-components/UploadProgressModal'; import UploadProgressModal from '@/bu-components/UploadProgressModal';
import SelectPrepareFileModal from '@/bu-components/SelectPrepareFileModal'; import SelectPrepareFileModal from '@/bu-components/SelectPrepareFileModal';
import CopyFileModal from '@/bu-components/CopyFileModal'; import CopyFileModal from '@/bu-components/CopyFileModal';
...@@ -693,9 +694,11 @@ class FolderList extends React.Component { ...@@ -693,9 +694,11 @@ class FolderList extends React.Component {
</When> </When>
<Otherwise> <Otherwise>
<LottieIcon <XMTable
title={ className="add-empty"
<Choose> renderEmpty={{
image: !showResultPage ? addData : search,
description: <Choose>
<When condition={!showResultPage}> <When condition={!showResultPage}>
<input <input
multiple multiple
...@@ -709,7 +712,7 @@ class FolderList extends React.Component { ...@@ -709,7 +712,7 @@ class FolderList extends React.Component {
{ {
<Choose> <Choose>
<When condition={hasManagementAuthority}> <When condition={hasManagementAuthority}>
<div>你还没有上传文件,点击 <div className="lottie-icon-title">你还没有上传文件,点击
<Tooltip title="支持文件类型:ppt、word、excel、pdf、jpg、mp3、mp4"> <Tooltip title="支持文件类型:ppt、word、excel、pdf、jpg、mp3、mp4">
<span <span
className="upload-btn" className="upload-btn"
...@@ -729,7 +732,7 @@ class FolderList extends React.Component { ...@@ -729,7 +732,7 @@ class FolderList extends React.Component {
<div className="desc">搜索无结果</div> <div className="desc">搜索无结果</div>
</Otherwise> </Otherwise>
</Choose> </Choose>
} }}
/> />
</Otherwise> </Otherwise>
</Choose> </Choose>
......
...@@ -215,14 +215,12 @@ ...@@ -215,14 +215,12 @@
cursor: pointer; cursor: pointer;
} }
.lottie-icon { .lottie-icon-title {
&__title { color: #999;
color: #999; .upload-btn {
.upload-btn { color: #5A8EFA;
color: #5A8EFA; margin: 0 4px;
margin: 0 4px; cursor: pointer;
cursor: pointer;
}
} }
} }
// td.ant-table-column-sort{ // td.ant-table-column-sort{
...@@ -230,6 +228,11 @@ ...@@ -230,6 +228,11 @@
// } // }
} }
} }
.add-empty {
.ant-table-cell {
border: none;
}
}
} }
......
import User from '@/common/js/user'; import User from '@/common/js/user';
import React from 'react'; import React from 'react';
import Header from './Header' import Lottie from "lottie-web";
import { Modal } from "antd";
import Service from "@/common/js/service"; import Service from "@/common/js/service";
import { LIVE_SHARE } from "@/domains/course-domain/constants";
import BaseService from "@/domains/basic-domain/baseService";
import './ErrorCollege.less'; import './ErrorCollege.less';
export default class ErrorCollege extends React.Component { export default class ErrorCollege extends React.Component {
constructor(props) { constructor(props) {
super(props); super(props);
this.state = { this.state = {
menuType: true, nickName: '',
} }
} }
componentDidMount() { componentDidMount() {
this.getUserInfo();
this.getStorePermission(); this.getStorePermission();
var animation = Lottie.loadAnimation({
path: "https://image.xiaomaiketang.com/xm/AhcJZHdMZf.json",
name: "test",
renderer: "svg",
loop: true,
autoplay: true,
container: document.getElementById("lottie-box")
});
} }
getStorePermission() { getStorePermission() {
...@@ -29,17 +41,62 @@ export default class ErrorCollege extends React.Component { ...@@ -29,17 +41,62 @@ export default class ErrorCollege extends React.Component {
}); });
} }
handleMenuType() { getUserInfo() {
this.setState({ menuType: !menuType }); const param = {
storeUserId: User.getStoreUserId(),
};
BaseService.getStoreUser(param).then((res) => {
const { nickName } = res.result;
this.setState({ nickName });
});
}
handleLogoutConfirm() {
return Modal.confirm({
title: "你确定要退出登录吗?",
content: "退出后,需重新登录",
icon: (
<span className="icon iconfont default-confirm-icon">&#xe839; </span>
),
okText: "退出登录",
cancelText: "点错了",
onOk: () => {
this.handleLogout();
},
});
}
handleLogout() {
BaseService.logout({identifier:User.getIdentifier()}).then((res) => {
User.removeUserId();
User.removeToken();
User.removeEnterpriseId();
User.clearUserInfo();
const url = `${LIVE_SHARE}store/index?id=${User.getCustomerStoreId()||User.getStoreId()}&userId=${User.getUserId()}&from=work_weixin`;
window.location.href = url;
});
} }
render() { render() {
const { menuType } = this.state; const { nickName } = this.state;
return ( return (
<div className="error-college-page"> <div className="error-college-page">
<Header id="error" handleMenuType={this.handleMenuType} menuType={menuType} /> <div className="header">
<img src='https://image.xiaomaiketang.com/xm/FEdG7BMwKr.png' className="logo" alt="" />
<div className="name-box">
<img src='https://image.xiaomaiketang.com/xm/hcp6zs5HTn.png' className="avatar" alt="" />
<span className="name">{nickName}</span>
<span
className="control"
onClick={() => {
this.handleLogoutConfirm();
}}
>退出登录</span>
</div>
</div>
<div className="error-college-box"> <div className="error-college-box">
<img src="https://image.xiaomaiketang.com/xm/MQRaYkbr6J.png" className="error-college-image" /> <div id="lottie-box" className="error-college-image"></div>
<span className="error-college-tip">{User.getStoreName()}已停用</span> <span className="error-college-tip">{User.getStoreName()}已停用</span>
</div> </div>
</div> </div>
......
...@@ -2,6 +2,36 @@ ...@@ -2,6 +2,36 @@
position: relative; position: relative;
width: 100vw; width: 100vw;
height: 100vh; height: 100vh;
.header {
display: flex;
align-items: center;
height: 60px;
padding: 0 344px;
justify-content: space-between;
.logo {
width: 117px;
height: 30px;
}
.name-box {
display: flex;
align-items: center;
.avatar {
width: 24px;
height: 24px;
border-radius: 50%;
margin-right: 6px;
}
.name {
color: #666;
font-size: 16px;
margin-right: 8px;
}
.control {
color: #2966FF;
cursor: pointer;
}
}
}
.error-college-box { .error-college-box {
position: absolute; position: absolute;
top: 50px; top: 50px;
...@@ -10,20 +40,20 @@ ...@@ -10,20 +40,20 @@
bottom: 0; bottom: 0;
.error-college-image { .error-college-image {
position: absolute; position: absolute;
top: 246px; top: 266px;
left: 50%; left: 50%;
transform: translateX(-50%); transform: translateX(-50%);
width: 246px; width: 200px;
height: 132px; height: 200px;
display: block; display: block;
} }
.error-college-tip { .error-college-tip {
position: absolute; position: absolute;
top: 404px; top: 482px;
left: 50%; left: 50%;
transform: translateX(-50%); transform: translateX(-50%);
color: #8C8E93; color: #000;
font-size: 13px; font-size: 18px;
} }
} }
} }
\ No newline at end of file
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';
...@@ -12,7 +11,6 @@ import { XMContext } from '@/store/context'; ...@@ -12,7 +11,6 @@ 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 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;
...@@ -313,14 +311,6 @@ function ExaminationManager(props: any) { ...@@ -313,14 +311,6 @@ function ExaminationManager(props: any) {
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>
...@@ -444,11 +434,6 @@ function ExaminationManager(props: any) { ...@@ -444,11 +434,6 @@ function ExaminationManager(props: any) {
pagination={false} pagination={false}
style={{ margin: '0px 0 16px' }} style={{ margin: '0px 0 16px' }}
renderEmpty={{ 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>, description: <span style={{ display: 'block', paddingBottom: 24 }}>暂无数据</span>,
}}></XMTable> }}></XMTable>
{total > 0 && ( {total > 0 && (
......
...@@ -88,4 +88,23 @@ ...@@ -88,4 +88,23 @@
.ant-dropdown-menu-item-selected > span { .ant-dropdown-menu-item-selected > span {
color: #333333; color: #333333;
} }
\ No newline at end of file
.type-order-modal {
.type-order-table {
tr {
background: #F7F8F9 !important;
display: flex;
margin-bottom: 8px;
width: 521px;
justify-content: space-between;
td {
border: none !important;
}
}
.ant-table-tbody > tr:hover:not(.ant-table-expanded-row):not(.ant-table-row-selected) > td {
background: #F7F8F9 !important;
}
}
}
...@@ -19,7 +19,6 @@ import { ...@@ -19,7 +19,6 @@ import {
ConfigProvider, ConfigProvider,
Empty, Empty,
} from "antd"; } from "antd";
import Lottie from 'react-lottie';
import { PageControl, XMTable } from "@/components"; 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";
...@@ -31,7 +30,6 @@ import Service from "@/common/js/service"; ...@@ -31,7 +30,6 @@ 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 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;
...@@ -547,14 +545,6 @@ class PaperList extends Component { ...@@ -547,14 +545,6 @@ 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">
...@@ -635,15 +625,6 @@ class PaperList extends Component { ...@@ -635,15 +625,6 @@ class PaperList extends Component {
bordered bordered
loading={loading} loading={loading}
renderEmpty={{ 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> description: <span style={{ display: 'block', paddingBottom: 24 }}>还没有试卷</span>
}} }}
/> />
...@@ -660,16 +641,7 @@ class PaperList extends Component { ...@@ -660,16 +641,7 @@ class PaperList extends Component {
pagination={false} pagination={false}
bordered bordered
renderEmpty={{ renderEmpty={{
image: <div style={{ marginTop: 24 }}> description: <span style={{ display: 'block', paddingBottom: 24 }}>还没有试卷</span>
<Lottie
options={defaultOptions}
height={150}
width={150}
isStopped={false}
isPaused={false}
/>
</div>,
description: <span style={{ display: 'block', paddingBottom: 24 }}>暂无数据</span>
}} }}
/> />
)} )}
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
*/ */
import React, { Component } from "react"; import React, { Component } from "react";
import { Modal, ConfigProvider, Empty } from "antd"; import { Modal, ConfigProvider, Empty } from "antd";
import Lottie from 'react-lottie';
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 "./PreviewPaperModal.less"; import "./PreviewPaperModal.less";
...@@ -15,6 +16,7 @@ import ScanFileModal from "@/modules/resource-disk/modal/ScanFileModal"; ...@@ -15,6 +16,7 @@ import ScanFileModal from "@/modules/resource-disk/modal/ScanFileModal";
import _ from "underscore"; import _ from "underscore";
import XMAudio from "../../components/XMAudio"; import XMAudio from "../../components/XMAudio";
import { NUM_TO_WORD_MAP } from "@/common/constants/punchClock/punchClock"; import { NUM_TO_WORD_MAP } from "@/common/constants/punchClock/punchClock";
import previewEmpty from '../../../lottie/previewEmpty/data.json';
const questionTypeList = { const questionTypeList = {
SINGLE_CHOICE: "单选题", SINGLE_CHOICE: "单选题",
MULTI_CHOICE: "多选题", MULTI_CHOICE: "多选题",
...@@ -254,13 +256,28 @@ class PreviewPaperModal extends Component { ...@@ -254,13 +256,28 @@ class PreviewPaperModal extends Component {
// 自定义空状态 // 自定义空状态
customizeRenderEmpty = () => { customizeRenderEmpty = () => {
const defaultOptions = {
loop: true,
autoplay: true,
animationData: previewEmpty,
rendererSettings: {
preserveAspectRatio: 'xMidYMid slice'
}
}
return ( return (
<Empty <Empty
image="https://image.xiaomaiketang.com/xm/emptyTable.png" image={
imageStyle={{ <div style={{ marginTop: 24 }}>
height: 100, <Lottie
}} options={defaultOptions}
description={"暂无内容"} height={150}
width={150}
isStopped={false}
isPaused={false}
/>
</div>
}
description={<span style={{ display: 'block', paddingBottom: 24, marginTop: 50 }}>暂无内容</span>}
></Empty> ></Empty>
); );
}; };
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* @Author: yuananting * @Author: yuananting
* @Date: 2021-03-29 10:52:26 * @Date: 2021-03-29 10:52:26
* @LastEditors: yuananting * @LastEditors: yuananting
* @LastEditTime: 2021-05-08 16:11:27 * @LastEditTime: 2021-06-07 14:45:02
* @Description: 助学工具-试卷-新建选择题目弹窗 * @Description: 助学工具-试卷-新建选择题目弹窗
* @Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有 * @Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有
*/ */
...@@ -42,7 +42,8 @@ class SelectQuestionModal extends Component { ...@@ -42,7 +42,8 @@ class SelectQuestionModal extends Component {
width={1080} width={1080}
onOk={() => { onOk={() => {
this.props.setSelectedQuestion( this.props.setSelectedQuestion(
this.listRef.current.state.selectQuestionKeys.map((item) => { this.listRef.current.state.selectQuestionKeys.map((item, index) => {
item.sorterIndex = index;
item.questionId = item.id || item.questionId; item.questionId = item.id || item.questionId;
item.questionType = item.questionTypeEnum || item.questionType; item.questionType = item.questionTypeEnum || item.questionType;
item.score = item.score || 2; item.score = item.score || 2;
......
/* /*
* @Author: yuananting * @Author: yuananting
* @Date: 2021-02-25 14:34:29 * @Date: 2021-02-25 14:34:29
* @LastEditors: wufan * @LastEditors: yuananting
* @LastEditTime: 2021-05-14 18:17:08 * @LastEditTime: 2021-06-09 12:00:12
* @Description: 助学工具-题库-操作题目Tab * @Description: 助学工具-题库-操作题目Tab
* @Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有 * @Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有
*/ */
...@@ -66,23 +66,25 @@ class OperateQuestionTab extends Component { ...@@ -66,23 +66,25 @@ class OperateQuestionTab extends Component {
} }
componentDidMount() { componentDidMount() {
const { chooseOptions } = this.state; const { questionTypeKey } = this.props;
const isEditCurrent =
getParameterByName("id") &&
getParameterByName("type") === questionTypeKey;
const optionSize = isEditCurrent ? 20 : 4;
if ( if (
["INDEFINITE_CHOICE", "MULTI_CHOICE", "SINGLE_CHOICE"].includes( ["INDEFINITE_CHOICE", "MULTI_CHOICE", "SINGLE_CHOICE"].includes(
this.props.questionTypeKey questionTypeKey
) )
) { ) {
if (chooseOptions.length === 0) { // 选择题(单选 多选 不定项)-插入4条默认选项
// 选择题(单选 多选 不定项)-插入4条默认选项 for (var i = 0; i < optionSize; i++) {
for (var i = 0; i < 4; i++) { this.handleAddOption();
this.handleAddOption(); this.setState({
this.setState({ [`optionsValidate_${i}`]: "success",
[`optionsValidate_${i}`]: "success", [`optionsText_${i}`]: "",
[`optionsText_${i}`]: "", });
});
}
} }
} else if (this.props.questionTypeKey === "JUDGE") { } else if (questionTypeKey === "JUDGE") {
this.initJudgeOption("正确"); this.initJudgeOption("正确");
this.initJudgeOption("错误"); this.initJudgeOption("错误");
} }
...@@ -634,9 +636,9 @@ class OperateQuestionTab extends Component { ...@@ -634,9 +636,9 @@ class OperateQuestionTab extends Component {
this.state.stemContent, this.state.stemContent,
(contentItem) => contentItem.type === "RICH_TEXT" (contentItem) => contentItem.type === "RICH_TEXT"
); );
if(stemContent.textLength > 1000) { if (stemContent.textLength > 1000) {
validateError++; validateError++;
} }
let stem = stemContent.content.replace(/<[^>]+>/g, ""); let stem = stemContent.content.replace(/<[^>]+>/g, "");
stem = stem.replace(/\&nbsp\;/gi, ""); stem = stem.replace(/\&nbsp\;/gi, "");
stem = stem.replace(/\s+/g, ""); stem = stem.replace(/\s+/g, "");
...@@ -694,7 +696,7 @@ class OperateQuestionTab extends Component { ...@@ -694,7 +696,7 @@ class OperateQuestionTab extends Component {
optionUnChecked = item.isCorrectAnswer optionUnChecked = item.isCorrectAnswer
? optionUnChecked ? optionUnChecked
: optionUnChecked + 1; : optionUnChecked + 1;
if(optionContent[0].textLength > 1000) { if (optionContent[0].textLength > 1000) {
validateError++; validateError++;
} }
let optionInput = optionContent[0].content.replace(/<[^>]+>/g, ""); let optionInput = optionContent[0].content.replace(/<[^>]+>/g, "");
...@@ -1040,11 +1042,11 @@ class OperateQuestionTab extends Component { ...@@ -1040,11 +1042,11 @@ class OperateQuestionTab extends Component {
return dom ? ( return dom ? (
<div <div
className="question-item_question-content" className="question-item_question-content"
style={{ style={
display: ["PICTURE", "VIDEO"].includes(type) !["PICTURE", "VIDEO"].includes(type)
? "inline-grid" ? { display: "flex" }
: "flex", : { float: "left" }
}} }
key={index} key={index}
> >
{dom} {dom}
...@@ -1194,10 +1196,8 @@ class OperateQuestionTab extends Component { ...@@ -1194,10 +1196,8 @@ class OperateQuestionTab extends Component {
data-label="正确答案" data-label="正确答案"
> >
{_.map(chooseOptions, (optionItem, optionIndex) => { {_.map(chooseOptions, (optionItem, optionIndex) => {
const { const { questionOptionContentList, isCorrectAnswer } =
questionOptionContentList, optionItem;
isCorrectAnswer,
} = optionItem;
optionItem.optionSort = optionIndex; optionItem.optionSort = optionIndex;
const mediaBtn = ["VOICE", "AUDIO", "PICTURE"]; const mediaBtn = ["VOICE", "AUDIO", "PICTURE"];
const placeHold = const placeHold =
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
border-radius: 2px; border-radius: 2px;
padding: 16px; padding: 16px;
position: relative; position: relative;
margin-bottom: 35px; margin-bottom: 70px;
.editor-fill-box_single { .editor-fill-box_single {
border-radius: 4px; border-radius: 4px;
......
...@@ -6,11 +6,25 @@ ...@@ -6,11 +6,25 @@
* @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, Menu, Dropdown, DatePicker } from 'antd'; import {
import Lottie from 'react-lottie'; Table,
import _ from 'underscore'; ConfigProvider,
import { Route, withRouter } from 'react-router-dom'; Empty,
Row,
Input,
Select,
Tooltip,
Space,
Button,
Modal,
message,
Menu,
Dropdown,
DatePicker,
} from "antd";
import _ from "underscore";
import { Route, withRouter } from "react-router-dom";
import { DownOutlined } from '@ant-design/icons'; import { DownOutlined } from '@ant-design/icons';
import { PageControl, XMTable } from '@/components'; import { PageControl, XMTable } from '@/components';
import User from '@/common/js/user'; import User from '@/common/js/user';
...@@ -22,8 +36,7 @@ import Bus from '@/core/bus'; ...@@ -22,8 +36,7 @@ import Bus from '@/core/bus';
import moment from 'moment'; import moment from 'moment';
import Service from '@/common/js/service'; import Service from '@/common/js/service';
import MoveModal from '../../modal/MoveModal'; import MoveModal from '../../modal/MoveModal';
import * as nodata from '../../../lottie/nodata/data.json'; import "./QuestionList.less";
import './QuestionList.less';
const { RangePicker } = DatePicker; const { RangePicker } = DatePicker;
const { Search } = Input; const { Search } = Input;
...@@ -549,14 +562,6 @@ class QuestionList extends Component { ...@@ -549,14 +562,6 @@ class QuestionList extends Component {
preserveSelectedRowKeys: true, preserveSelectedRowKeys: true,
onChange: this.onSelectChange, 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'>
...@@ -681,15 +686,9 @@ class QuestionList extends Component { ...@@ -681,15 +686,9 @@ class QuestionList extends Component {
onChange={this.handleChangeTable} onChange={this.handleChangeTable}
rowSelection={rowSelection} rowSelection={rowSelection}
renderEmpty={{ renderEmpty={{
image: ( description: <span style={{ display: 'block', paddingBottom: 24 }}><span>还没有题目</span>
<div style={{ marginTop: 24 }}> {["CloudManager", "StoreManager"].includes(User.getUserRole()) &&
<Lottie options={defaultOptions} height={150} width={150} isStopped={false} isPaused={false} /> categoryId && (
</div>
),
description: (
<span style={{ display: 'block', paddingBottom: 24 }}>
<span>还没有题目</span>
{['CloudManager', 'StoreManager'].includes(User.getUserRole()) && categoryId && (
<span> <span>
,快去 ,快去
<span <span
......
...@@ -32,7 +32,7 @@ ...@@ -32,7 +32,7 @@
color: #666666; color: #666666;
.input-box { .input-box {
margin-bottom: 8px; margin-bottom: 8px;
display: inline-block; // display: inline-block;
*:not(p) { *:not(p) {
font-weight: normal !important; font-weight: normal !important;
font-size: 14px !important; font-size: 14px !important;
......
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