Commit 015f5d1e by guomingpang

Merge branch 'feat/pangguoming/20210528/external_courses' into gray

parents 1360c542 f510239f
#ignore obj and lib file
dist
rev
node_modules
coverage
*/vendor.js
*/vendor.*.*
*/vendor-manifest.json
coverage
npm-shrinkwrap.json
### OSX template
.DS_Store
node_modules/
dist/
npm-debug.log
\ No newline at end of file
.AppleDouble
.LSOverride
yarn.lock
yarn-error.lock
# IntelliJ project files
.idea
*.iml
out
gen
### Sass template
.sass-cache/
*.css.map
### Vim template
# swap
[._]*.s[a-w][a-z]
[._]s[a-w][a-z]
# session
Session.vim
# temporary
.netrwhist
*~
# auto-generated tag files
tags
### SublimeText template
# cache files for sublime text
*.tmlanguage.cache
*.tmPreferences.cache
*.stTheme.cache
# workspace files are user-specific
*.sublime-workspace
# project files should be checked into the repository, unless a significant
# proportion of contributors will probably not be using SublimeText
# *.sublime-project
# sftp configuration file
sftp-config.json
npm-debug.log
*.zip
build/vendor.js.map
package-lock.json
.vscode/*
demo.js
debug.log
......@@ -36,7 +36,7 @@
"case-sensitive-paths-webpack-plugin": "2.3.0",
"classnames": "^2.2.6",
"cropper": "^3.1.4",
"cross-env": "^7.0.2",
"cross-env": "^7.0.3",
"css-loader": "3.4.2",
"dom-to-image": "^2.6.0",
"dotenv": "8.2.0",
......
@import '../core/variables.less';
@import "../core/variables.less";
.xm-breadCrumb{
.xm-breadCrumb {
margin-left: 16px;
color: #989898;
margin-top:10px;
margin-top: 10px;
margin-bottom: 10px;
+.statistic-tips{
+ .statistic-tips {
position: relative;
top: -8px;
margin-bottom: 0px !important;
......@@ -20,26 +20,25 @@
font-size: @xm-font-size-m;
line-height: 25px;
}
.ant-breadcrumb{
.ant-breadcrumb {
display: inline-block;
span{
span {
color: #333;
font-weight: 400;
}
}
.divide{
.divide {
display: inline-block;
position: relative;
height: 12px;
width: 25px;
&:after{
content:'';
&:after {
content: "";
position: absolute;
left: 12px;
height: 16px;
top: 0px;
border-left:1px solid #989898;
border-left: 1px solid #989898;
}
}
}
\ No newline at end of file
}
/*
* @Description:
* @Description:
* @Author: zangsuyun
* @Date: 2021-03-13 10:57:14
* @LastEditors: zangsuyun
* @LastEditTime: 2021-03-13 17:16:44
* @LastEditors: fusanqiasng
* @LastEditTime: 2021-05-24 22:10:50
* @Copyright: © 2020 杭州杰竞科技有限公司 版权所有
*/
import PropTypes from 'prop-types';
import PropTypes from 'prop-types'
import React from 'react'
// import { Modal } from 'antd';
import './TableSelectedData.less';
import './TableSelectedData.less'
class TableSelectedData extends React.Component {
constructor(props) {
super(props);
}
render() {
return (
<div className={this.props.className+' selected-data-box'}>
<span className="icon iconfont">&#xe61d;</span>
<span className="selected-text">{'已选择'+this.props.selectedNum+'项'}</span>
<span className="click-clear" onClick={this.props.clearSelectedData}>清空</span>
<div className={this.props.className + ' selected-data-box'}>
<span className='icon iconfont'>&#xe61d;</span>
<span className='selected-text'>{'已选择' + this.props.selectedNum + '项'}</span>
<span className='click-clear' onClick={this.props.clearSelectedData}>
清空
</span>
</div>
)
}
}
TableSelectedData.propTypes = {
className: PropTypes.string, // class
selectedNum: PropTypes.number, // 已选择人数
clearSelectedData: PropTypes.func, // 取消全部选择
};
className: PropTypes.string, // class
selectedNum: PropTypes.number, // 已选择人数
clearSelectedData: PropTypes.func // 取消全部选择
}
TableSelectedData.defaultProps = {
className: '',
selectedNum: 0,
clearSelectedData: function () {
}
clearSelectedData: function () {}
}
export default TableSelectedData
\ No newline at end of file
export default TableSelectedData
......@@ -8,7 +8,7 @@
right: 0;
bottom: 0;
z-index: 101;
background-color: #F0F2F5;
background-color: #f0f2f5;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
.page {
......@@ -19,14 +19,14 @@
bottom: 0;
z-index: 102;
overflow: auto;
.box{
&:first-child{
.box {
&:first-child {
margin-bottom: 8px;
}
&+.box{
margin: 8px 16px;
& + .box {
margin: 8px 16px;
}
&:last-child{
&:last-child {
margin-bottom: 16px;
}
}
......@@ -42,38 +42,40 @@
animation: all 0.75;
padding-bottom: 16px;
}
.content-sub-header{
.content-sub-header {
padding: 0px 16px 0;
line-height: 30px;
}
.content-header {
padding: 10px 16px;
padding: 16px 16px;
line-height: 30px;
background: #fff;
margin: 16px 16px 0;
font-size: 24px;
color: #333;
font-weight: 500;
h1 {
font-size: 14px;
color: #898989;
font-weight: normal;
display: inline-block;
}
}
.box{
.box {
padding: 16px;
margin: 0 16px 16px;
margin-bottom: 8px;
margin: 0 16px;
background: #ffffff;
// min-height: 400px;
.box-header {
line-height: 30px;
padding-bottom: 12px;
&.searchOnly{
&.searchOnly {
padding-bottom: 0px;
}
.filter-row {
min-height: 30px;
margin-bottom: 10px;
>* {
> * {
float: left;
margin-left: 16px;
height: 40px;
......@@ -89,16 +91,12 @@
.box-footer {
margin-top: 16px;
}
&:first-child{
&:first-child {
margin-bottom: 8px;
}
&+.box{
margin: 8px 16px;
}
&:last-child{
margin-bottom: 13px;
& + .box {
margin: 8px 16px;
}
}
// .ant-calendar-picker{
// top:-1px;
......@@ -108,26 +106,25 @@
.box-header {
.ant-row-flex {
padding-top: 2px;
>div:nth-child(1) {
> div:nth-child(1) {
display: flex;
flex-wrap: wrap;
align-items:space-between;
align-items: space-between;
.flex(1);
>*{
> * {
flex-basis: 30%;
margin-right: 3%;
margin-bottom: 16px;
}
}
&.lastRow{
>div:nth-child(1) {
>*{
&.lastRow {
> div:nth-child(1) {
> * {
margin-bottom: 0px;
}
}
}
}
}
}
.full-screen-page {
......@@ -139,5 +136,5 @@
bottom: 0;
right: 0;
user-select: none;
background-color: #F0F2F5;
background-color: #f0f2f5;
}
/*
* @Author: yuananting
* @Date: 2021-03-03 15:13:12
* @LastEditors: yuananting
* @LastEditTime: 2021-04-13 13:58:40
* @LastEditors: fusanqiasng
* @LastEditTime: 2021-05-25 10:07:03
* @Description: 助学工具接口
* @Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有
*/
import Service from "@/common/js/service";
import Service from '@/common/js/service'
export function queryExternalCategoryTree(params: object) {
return Service.Hades('public/externalHades/queryCategoryTree', params)
}
export function queryCategoryTree(params: object) {
return Service.Hades("public/hades/queryCategoryTree", params);
return Service.Hades('public/hades/queryCategoryTree', params)
}
export function addCategory(params: object) {
return Service.Hades("public/hades/addCategory", params);
return Service.Hades('public/hades/addCategory', params)
}
export function delCategory(params: object) {
return Service.Hades("public/hades/delCategory", params);
return Service.Hades('public/hades/delCategory', params)
}
export function editCategory(params: object) {
return Service.Hades("public/hades/editCategory", params);
return Service.Hades('public/hades/editCategory', params)
}
export function editCategoryTree(params: object) {
return Service.Hades("public/hades/editCategoryTree", params);
return Service.Hades('public/hades/editCategoryTree', params)
}
export function queryQuestionPageList(params: object) {
return Service.Hades("public/hades/queryQuestionPageList", params);
return Service.Hades('public/hades/queryQuestionPageList', params)
}
export function addQuestion(params: object) {
return Service.Hades("public/hades/addQuestion", params);
return Service.Hades('public/hades/addQuestion', params)
}
export function deleteQuestion(params: object) {
return Service.Hades("public/hades/deleteQuestion", params);
return Service.Hades('public/hades/deleteQuestion', params)
}
export function queryQuestionDetails(params: object) {
return Service.Hades("public/hades/queryQuestionDetails", params);
return Service.Hades('public/hades/queryQuestionDetails', params)
}
export function editQuestion(params: object) {
return Service.Hades("public/hades/editQuestion", params);
return Service.Hades('public/hades/editQuestion', params)
}
export function batchImport(params: object) {
return Service.Hades("public/hades/batchImport", params);
return Service.Hades('public/hades/batchImport', params)
}
export function createPaper(params: object) {
return Service.Hades("public/hades/createPaper", params);
return Service.Hades('public/hades/createPaper', params)
}
export function queryPaperPageList(params: object) {
return Service.Hades("public/hades/queryPaperPageList", params);
return Service.Hades('public/hades/queryPaperPageList', params)
}
export function deletePaper(params: object) {
return Service.Hades("public/hades/deletePaper", params);
return Service.Hades('public/hades/deletePaper', params)
}
export function queryPaperDetail(params: object) {
return Service.Hades("public/hades/queryPaperDetail", params);
return Service.Hades('public/hades/queryPaperDetail', params)
}
export function viewPaper(params: object) {
return Service.Hades("public/hades/viewPaper", params);
return Service.Hades('public/hades/viewPaper', params)
}
export function editPaper(params: object) {
return Service.Hades("public/hades/editPaper", params);
return Service.Hades('public/hades/editPaper', params)
}
export function batchQueryQuestionDetails(params: object) {
return Service.Hades("public/hades/batchQueryQuestionDetails", params);
return Service.Hades('public/hades/batchQueryQuestionDetails', params)
}
export function queryQuestionPageListWithContent(params: object) {
return Service.Hades("public/hades/queryQuestionPageListWithContent", params);
}
\ No newline at end of file
return Service.Hades('public/hades/queryQuestionPageListWithContent', params)
}
/*
* @Author: yuananting
* @Date: 2021-03-11 11:34:37
* @LastEditors: yuananting
* @LastEditTime: 2021-04-13 13:58:11
* @LastEditors: fusanqiasng
* @LastEditTime: 2021-05-24 23:44:39
* @Description: 助学工具接口
* @Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有
*/
import {
queryCategoryTree,
addCategory,
delCategory,
editCategory,
editCategoryTree,
addQuestion,
queryQuestionPageList,
deleteQuestion,
queryQuestionDetails,
editQuestion,
batchImport,
createPaper,
queryPaperPageList,
deletePaper,
queryPaperDetail,
viewPaper,
import {
queryExternalCategoryTree,
queryCategoryTree,
addCategory,
delCategory,
editCategory,
editCategoryTree,
addQuestion,
queryQuestionPageList,
deleteQuestion,
queryQuestionDetails,
editQuestion,
batchImport,
createPaper,
queryPaperPageList,
deletePaper,
queryPaperDetail,
viewPaper,
editPaper,
batchQueryQuestionDetails,
queryQuestionPageListWithContent,
} from '@/data-source/aidTool/request-apis';
queryQuestionPageListWithContent
} from '@/data-source/aidTool/request-apis'
export default class AidToolService {
// 获取题目分类树
/**
* 查询运营端分类书
* @param parmas
* @returns
*/
static queryExternalCategoryTree(parmas: any) {
return queryExternalCategoryTree(parmas)
}
// 获取题目分类树
static queryCategoryTree(params: any) {
return queryCategoryTree(params);
return queryCategoryTree(params)
}
// 新增题目分类
static addCategory(params: any) {
return addCategory(params);
return addCategory(params)
}
// 删除分类
static delCategory(params: any) {
return delCategory(params);
return delCategory(params)
}
// 编辑分类
static editCategory(params: any) {
return editCategory(params);
return editCategory(params)
}
// 编辑分类树(拖拽)
static editCategoryTree(params: any) {
return editCategoryTree(params);
return editCategoryTree(params)
}
// 查询题目列表
static queryQuestionPageList(params: any) {
return queryQuestionPageList(params);
return queryQuestionPageList(params)
}
// 添加题目
static addQuestion(params: any) {
return addQuestion(params);
return addQuestion(params)
}
// 删除题目
static deleteQuestion(params: any) {
return deleteQuestion(params);
return deleteQuestion(params)
}
// 预览题目
static queryQuestionDetails(params: any) {
return queryQuestionDetails(params);
return queryQuestionDetails(params)
}
// 编辑题目
static editQuestion(params: any) {
return editQuestion(params);
return editQuestion(params)
}
// 批量导入
static batchImport(params: any) {
return batchImport(params);
return batchImport(params)
}
// 创建试卷
static createPaper(params: any) {
return createPaper(params);
return createPaper(params)
}
// 查询试卷列表
static queryPaperPageList(params: any) {
return queryPaperPageList(params);
return queryPaperPageList(params)
}
// 删除试卷
static deletePaper(params: any) {
return deletePaper(params);
return deletePaper(params)
}
// 编辑前查询试卷信息
static queryPaperDetail(params: any) {
return queryPaperDetail(params);
return queryPaperDetail(params)
}
// 预览试卷
static viewPaper(params: any) {
return viewPaper(params);
return viewPaper(params)
}
// 编辑试卷
static editPaper(params: any) {
return editPaper(params);
return editPaper(params)
}
// 操作试卷-预览查询多题目信息
static batchQueryQuestionDetails(params: any) {
return batchQueryQuestionDetails(params);
return batchQueryQuestionDetails(params)
}
// 操作试卷-选择题目列表带题目详情
static queryQuestionPageListWithContent(params: any) {
return queryQuestionPageListWithContent(params);
return queryQuestionPageListWithContent(params)
}
}
\ No newline at end of file
}
/*
* @Author: 陈剑宇
* @Date: 2020-05-07 14:43:01
* @LastEditTime: 2021-04-19 16:42:24
* @LastEditors: zhangleyuan
* @Description:
* @LastEditTime: 2021-05-28 15:20:40
* @LastEditors: fusanqiasng
* @Description:
* @FilePath: /wheat-web-demo/src/domains/basic-domain/constants.ts
*/
import { MapInterface } from '@/domains/basic-domain/interface'
// 默认是 dev 环境
const ENV: string = process.env.DEPLOY_ENV || 'dev';
console.log("process.env.DEPLOY_ENV",process)
const ENV: string = process.env.DEPLOY_ENV || 'dev'
console.log('process.env.DEPLOY_ENV', process)
const BASIC_HOST_MAP: MapInterface = {
dev: 'https://dev-heimdall.xiaomai5.com/',
dev1: 'https://dev1-heimdall.xiaomai5.com/',
rc: 'https://rc-heimdall.xiaomai5.com/',
gray: 'https://gray-heimdall.xiaomai5.com/',
prod: 'https://gateway.xiaomai5.com/'
};
prod: 'https://gateway.xiaomai5.com/',
}
const PATH_MAP: MapInterface = {
dev: 'https://dev.xiaomai5.com/xiaomai-cloud-class-web/h5.html',
dev1: 'https://dev.xiaomai5.com/xiaomai-cloud-class-web/h5.html',
rc: 'https://rc.xiaomai5.com/xiaomai-cloud-class-web/h5.html',
gray: 'https://res.xiaomai0.com/xiaomai-cloud-class-web/gray/h5.html',
prod: 'https://res.xiaomai0.com/xiaomai-cloud-class-web/h5.html'
};
prod: 'https://res.xiaomai0.com/xiaomai-cloud-class-web/h5.html',
}
// axios headers config
export const TIME_OUT: number = 20000;
export const USER_TYPE: string = 'B';
export const PROJECT = 'xmzj-web-b';
export const VERSION = '5.4.8';
export const PREFIX = 'cloud-class';
export const USER_PREFIX = 'store-live';
export const TIME_OUT: number = 20000
export const USER_TYPE: string = 'B'
export const PROJECT = 'xmzj-web-b'
export const VERSION = '5.4.8'
export const PREFIX = 'cloud-class'
export const USER_PREFIX = 'store-live'
// host
export const BASIC_HOST: string = BASIC_HOST_MAP[ENV];
export const PATH: string = PATH_MAP[ENV];
export const BASIC_HOST: string = BASIC_HOST_MAP[ENV]
export const PATH: string = PATH_MAP[ENV]
.video-course-list {
margin-top: 12px;
.video-list-table{
.video-list-table {
tbody {
tr{
&:nth-child(even){
tr {
&:nth-child(even) {
background: transparent !important;
td{
background:#FFF !important;
td {
background: #fff !important;
}
}
&:nth-child(odd){
background: #FAFAFA !important;
td{
background: #FAFAFA !important;
&:nth-child(odd) {
background: #fafafa !important;
td {
background: #fafafa !important;
}
}
&:hover{
td{
background:#F3f6fa !important;
&:hover {
td {
background: #f3f6fa !important;
}
}
}
}
}
.watchUserCount{
text-align:right;
padding:16px;
.watchUserCount {
text-align: right;
padding: 16px;
}
.operate-text {
color: #5289FA;
color: #5289fa;
cursor: pointer;
}
.operate {
display: flex;
&__item {
color: #5289FA;
color: #5289fa;
cursor: pointer;
&.split {
margin: 0 8px;
color: #BFBFBF;
color: #bfbfbf;
}
}
}
.more-operate{
line-height:20px;
.more-operate {
line-height: 20px;
}
.record__item {
display: flex;
......@@ -56,21 +56,20 @@
height: 50px;
border-radius: 2px;
margin-right: 8px;
background-color: #666;
// background-color: #666;
}
.course-name {
color: #666;
width:188px;
width: 188px;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
height:48px;
height: 48px;
}
}
}
.video-course-more-menu {
......@@ -85,4 +84,4 @@
background: #f3f6fa;
}
}
}
\ No newline at end of file
}
import React from 'react';
import { Row, Input, Select,Tooltip } from 'antd';
import React from 'react'
import { Row, Input, Select, Tooltip } from 'antd'
import RangePicker from "@/modules/common/DateRangePicker";
import RangePicker from '@/modules/common/DateRangePicker'
import './OfflineCourseFilter.less';
import moment from 'moment';
import StoreService from "@/domains/store-domain/storeService";
import './OfflineCourseFilter.less'
import moment from 'moment'
import StoreService from '@/domains/store-domain/storeService'
const { Search } = Input;
const { Option } = Select;
const { Search } = Input
const { Option } = Select
const DEFAULT_QUERY = {
courseName: null, // 课程名称
operatorId: null, // 创建人
beginTime: null, // 开始日期
endTime: null, // 结束日期
shelfState:null,
courseName: null, // 课程名称
operatorId: null, // 创建人
beginTime: null, // 开始日期
endTime: null, // 结束日期
shelfState: null,
}
const defaultTeacherQuery = {
size: 10,
current: 1,
nickName:null
nickName: null,
}
class OfflineCourseFilter extends React.Component {
constructor(props) {
super(props);
super(props)
this.state = {
query: { ...DEFAULT_QUERY }, // 使用扩展运算符,避免浅拷贝
query: { ...DEFAULT_QUERY }, // 使用扩展运算符,避免浅拷贝
teacherQuery: defaultTeacherQuery,
teacherList:[],
expandFilter:false
teacherList: [],
expandFilter: false,
}
}
componentDidMount() {
this.getTeacherList();
this.getTeacherList()
}
getTeacherList(current = 1, selectList){
const { teacherQuery,teacherList} = this.state;
getTeacherList(current = 1, selectList) {
const { teacherQuery, teacherList } = this.state
const _query = {
...teacherQuery,
current,
size:10
};
StoreService.getStoreUserBasicPage( _query).then((res) => {
const { result = {} } = res;
const { records = [], total = 0, hasNext } = result;
const list = current > 1 ? teacherList.concat(records) : records;
this.setState({
hasNext,
teacherList: list,
})
});
size: 10,
}
StoreService.getStoreUserBasicPage(_query).then((res) => {
const { result = {} } = res
const { records = [], total = 0, hasNext } = result
const list = current > 1 ? teacherList.concat(records) : records
this.setState({
hasNext,
teacherList: list,
})
})
}
// 滑动加载更多讲师列表
handleScrollTeacherList = (e) => {
const { hasNext } = this.state;
const container = e.target;
const scrollToBottom = container && container.scrollHeight <= container.clientHeight + container.scrollTop;
const { hasNext } = this.state
const container = e.target
const scrollToBottom = container && container.scrollHeight <= container.clientHeight + container.scrollTop
if (scrollToBottom && hasNext) {
const { teacherQuery } = this.state;
let _teacherQuery = teacherQuery;
const { teacherQuery } = this.state
let _teacherQuery = teacherQuery
_teacherQuery.current = _teacherQuery.current + 1
this.setState({
teacherQuery:{..._teacherQuery}
},()=>{this.getTeacherList(_teacherQuery.current)})
this.setState(
{
teacherQuery: { ..._teacherQuery },
},
() => {
this.getTeacherList(_teacherQuery.current)
}
)
}
}
// 改变搜索条件
handleChangeQuery = (field, value) => {
this.setState({
query: {
...this.state.query,
[field]: value,
current: 1,
handleChangeQuery = (field, value) => {
this.setState(
{
query: {
...this.state.query,
[field]: value,
current: 1,
},
},
() => {
if (field === 'courseName') return
this.props.onChange(this.state.query)
}
}, () => {
if (field === 'courseName') return;
this.props.onChange(this.state.query)
});
)
}
handleChangeDates = (dates) => {
const query = _.clone(this.state.query);
const query = _.clone(this.state.query)
if (_.isEmpty(dates)) {
delete query.beginTime;
delete query.endTime;
delete query.beginTime
delete query.endTime
} else {
query.beginTime = dates[0].valueOf();
query.endTime = dates[1].valueOf();
query.beginTime = dates[0]?.startOf('day').valueOf()
query.endTime = dates[0]?.endOf('day').valueOf()
}
this.setState({
query:{
...query,
current: 1,
this.setState(
{
query: {
...query,
current: 1,
},
},
() => {
this.props.onChange(this.state.query)
}
}, () => {
this.props.onChange(this.state.query);
})
)
}
// 重置搜索条件
handleReset = () => {
this.setState({
query: DEFAULT_QUERY,
}, () => {
this.props.onChange(this.state.query);
})
this.setState(
{
query: DEFAULT_QUERY,
},
() => {
this.props.onChange(this.state.query)
}
)
}
render() {
const {
query: {
courseName,
courseState,
shelfState,
},
query: { courseName, courseState, shelfState },
expandFilter,
} = this.state;
} = this.state
return (
<div className="video-course-filter">
<Row type="flex" justify="space-between" align="top">
<div className="search-condition">
<div className="search-condition__item">
<span className="search-name">线下课名称:</span>
<div className='video-course-filter'>
<Row type='flex' justify='space-between' align='top'>
<div className='search-condition'>
<div className='search-condition__item'>
<span className='search-name'>线下课名称:</span>
<Search
value={courseName}
placeholder="搜索线下课名称"
onChange={(e) => { this.handleChangeQuery('courseName', e.target.value)}}
onSearch={ () => { this.props.onChange(this.state.query) } }
style={{ width: "calc(100% - 84px)" }}
enterButton={<span className="icon iconfont" style={{fontSize: '16px'}}>&#xe832;</span>}
placeholder='搜索线下课名称'
onChange={(e) => {
this.handleChangeQuery('courseName', e.target.value)
}}
onSearch={() => {
this.props.onChange(this.state.query)
}}
style={{ width: 'calc(100% - 84px)' }}
enterButton={
<span className='icon iconfont' style={{ fontSize: '16px' }}>
&#xe832;
</span>
}
/>
</div>
<div className="search-condition__item">
<span className="shelf-status">学院展示:</span>
<div className='search-condition__item'>
<span className='shelf-status'>学院展示:</span>
<Select
style={{ width: "calc(100% - 84px)" }}
placeholder="请选择"
style={{ width: 'calc(100% - 84px)' }}
placeholder='请选择'
allowClear={true}
value={shelfState}
onChange={(value) => { this.handleChangeQuery('shelfState', value) }}
suffixIcon={<span className="icon iconfont" style={{fontSize:'12px',color:'#BFBFBF'}}>&#xe835;</span>}
>
<Option value="YES">开启</Option>
<Option value="NO">关闭</Option>
onChange={(value) => {
this.handleChangeQuery('shelfState', value)
}}
suffixIcon={
<span className='icon iconfont' style={{ fontSize: '12px', color: '#BFBFBF' }}>
&#xe835;
</span>
}>
<Option value='YES'>开启</Option>
<Option value='NO'>关闭</Option>
</Select>
</div>
</div>
<div className="reset-fold-area">
<Tooltip title="清空筛选"><span className="resetBtn iconfont icon" onClick={this.handleReset}>&#xe61b; </span></Tooltip>
</div>
<div className='reset-fold-area'>
<Tooltip title='清空筛选'>
<span className='resetBtn iconfont icon' onClick={this.handleReset}>
&#xe61b;{' '}
</span>
</Tooltip>
</div>
</Row>
</div>
)
}
}
export default OfflineCourseFilter;
export default OfflineCourseFilter
.video-course-list {
margin-top: 12px;
.video-list-table{
&.video-course-list-mt {
margin-top: 4px;
}
.video-list-table {
tbody {
tr{
&:nth-child(even){
tr {
&:nth-child(even) {
background: transparent !important;
td{
background:#FFF !important;
td {
background: #fff !important;
}
}
&:nth-child(odd){
background: #FAFAFA !important;
td{
background: #FAFAFA !important;
&:nth-child(odd) {
background: #fafafa !important;
td {
background: #fafafa !important;
}
}
&:hover{
td{
background:#F3f6fa !important;
&:hover {
td {
background: #f3f6fa !important;
}
}
}
}
}
.watchUserCount{
text-align:right;
padding:16px;
.watchUserCount {
text-align: right;
padding: 16px;
}
.operate-text {
color: #5289FA;
color: #5289fa;
cursor: pointer;
}
.operate {
display: flex;
&__item {
color: #5289FA;
color: #5289fa;
cursor: pointer;
&.split {
margin: 0 8px;
color: #BFBFBF;
color: #bfbfbf;
}
}
}
.more-operate{
line-height:20px;
.more-operate {
line-height: 20px;
}
.record__item {
display: flex;
......@@ -56,21 +59,21 @@
height: 50px;
border-radius: 2px;
margin-right: 8px;
background-color: #666;
// background-color: #666;
}
.course-name {
color: #666;
width:188px;
width: 188px;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
height:48px;
height: 48px;
}
}
.related-task{
.related-task {
text-overflow: -o-ellipsis-lastline;
overflow: hidden;
text-overflow: ellipsis;
......@@ -93,4 +96,4 @@
background: #f3f6fa;
}
}
}
\ No newline at end of file
}
/*
* @Author: 吴文洁
* @Date: 2020-08-05 10:08:06
* @LastEditors: zhangleyuan
* @LastEditTime: 2020-12-26 15:56:49
* @Description: 云课堂-视频课入口页面
* @Copyright: 杭州杰竞科技有限公司 版权所有
*/
import React from 'react';
import VideoCourseFilter from './components/VideoCourseFilter';
import VideoCourseOpt from './components/VieoCourseOpt';
import VideoCourseList from './components/VideoCourseList';
import CourseService from "@/domains/course-domain/CourseService";
import React from 'react'
import { Tabs } from 'antd'
import VideoCourseFilter from './components/VideoCourseFilter'
import VideoCourseOpt from './components/VieoCourseOpt'
import VideoCourseList from './components/VideoCourseList'
import CourseService from '@/domains/course-domain/CourseService'
import User from '@/common/js/user'
const { TabPane } = Tabs
class VideoCourse extends React.Component {
constructor(props) {
super(props);
super(props)
this.state = {
query: {
size: 10,
current: 1,
storeId:User.getStoreId()
storeId: User.getStoreId(),
},
dataSource: [], // 视频课列表
totalCount: 0, // 视频课数据总条数
dataSource: [], // 视频课列表
totalCount: 0, // 视频课数据总条数
currentTabKey: 'internal',
}
}
componentWillMount() {
// 获取视频课列表
this.handleFetchScheduleList();
this.handleFetchScheduleList()
}
// 获取视频课列表
handleFetchScheduleList = (_query = {}) => {
const { currentTabKey } = this.state
const query = {
...this.state.query,
..._query
};
..._query,
courseDivision: currentTabKey === 'external' ? 1 : null,
}
// 更新请求参数
this.setState({ query });
this.setState({ query })
CourseService.videoSchedulePage(query).then((res) => {
const { result = {} } = res || {};
const { records = [], total = 0 } = result;
const { result = {} } = res || {}
const { records = [], total = 0 } = result
if (Number(total) && query.size * (query.current - 1) >= Number(total)) {
this.handleFetchScheduleList({
...query,
current: 1,
})
return
}
this.setState({
dataSource: records,
totalCount: Number(total)
});
});
totalCount: Number(total),
})
})
}
currenTabChange = (currentTabKey) => {
const { query } = this.state
this.setState(
{
currentTabKey,
query: {
...query,
current: 1,
},
},
() => {
this.handleFetchScheduleList()
}
)
}
changeShelfState = (index, shelfState) => {
const { dataSource } = this.state
dataSource[index].shelfState = shelfState
this.setState({
dataSource,
})
}
render() {
const { dataSource, totalCount, query } = this.state;
const { dataSource, totalCount, query, currentTabKey } = this.state
return (
<div className="page video-course-page">
<div className="content-header">视频课</div>
<div className='page video-course-page'>
<div className='content-header'>视频课</div>
<div className="box">
{/* 搜索模块 */}
<VideoCourseFilter
onChange={this.handleFetchScheduleList}
/>
<div className='box'>
<Tabs onChange={this.currenTabChange} activeKey={currentTabKey}>
<TabPane key='internal' tab='内部课程'></TabPane>
<TabPane key='external' tab='外部课程'></TabPane>
</Tabs>
{/* 搜索模块 */}
<VideoCourseFilter currentTabKey={currentTabKey} onChange={this.handleFetchScheduleList} />
{/* 操作模块 */}
<VideoCourseOpt />
<If condition={currentTabKey === 'internal'}>
<VideoCourseOpt />
</If>
{/* 视频课列表模块 */}
<VideoCourseList
type={currentTabKey}
query={query}
dataSource={dataSource}
totalCount={totalCount}
onChange={this.handleFetchScheduleList}
changeShelfState={this.changeShelfState}
/>
</div>
</div>
......@@ -82,4 +111,4 @@ class VideoCourse extends React.Component {
}
}
export default VideoCourse;
export default VideoCourse
......@@ -2,23 +2,28 @@
* @Description:
* @Author: zangsuyun
* @Date: 2021-03-12 10:43:10
* @LastEditors: zangsuyun
* @LastEditTime: 2021-04-10 16:39:30
<<<<<<< HEAD
* @LastEditors: fusanqiasng
* @LastEditTime: 2021-05-28 13:33:07
=======
* @LastEditors: fusanqiasng
* @LastEditTime: 2021-05-27 13:51:42
>>>>>>> 4399d60 (fix:修复外部课程相关模块bug)
* @Copyright: © 2020 杭州杰竞科技有限公司 版权所有
*/
import React from "react";
import React from 'react'
import KnowledgeBaseFilter from "./components/KnowledgeBaseFilter";
import KnowledgeBaseOpt from "./components/KnowledgeBaseOpt";
import KnowledgeBaseList from "./components/KnowledgeBaseList";
import Classification from "./components/Classification";
import KnowledgeBaseFilter from './components/KnowledgeBaseFilter'
import KnowledgeBaseOpt from './components/KnowledgeBaseOpt'
import KnowledgeBaseList from './components/KnowledgeBaseList'
import Classification from './components/Classification'
import KnowledgeAPI from "@/data-source/knowledge/request-api";
import User from "@/common/js/user";
import KnowledgeAPI from '@/data-source/knowledge/request-api'
import User from '@/common/js/user'
export default class KnowledgeBase extends React.Component {
constructor(props) {
super(props);
super(props)
this.state = {
query: {
size: 10,
......@@ -30,82 +35,68 @@ export default class KnowledgeBase extends React.Component {
totalCount: 0, // 知识库数据总条数
categoryId: '0',
updateCategoryFlag: false,
};
}
}
componentWillMount() {
// 获取知识库列表
this.handleFetchScheduleList();
this.handleFetchScheduleList()
// this.getCategoryTree()
}
getSelectedCategoryId = (categoryId) => {
this.setState({
categoryId,
});
this.handleFetchScheduleList({ categoryId,current:1 });
};
})
this.handleFetchScheduleList({ categoryId, current: 1 })
}
// 更新分类树
updateCategoryTree = () => {
this.setState({
updateCategoryFlag: !this.state.updateCategoryFlag,
});
};
})
}
// 获取知识库列表
handleFetchScheduleList = (_query = {},flag = true) => {
handleFetchScheduleList = (_query = {}, flag = true) => {
const query = {
...this.state.query,
..._query,
};
}
// 更新请求参数
this.setState({ query });
this.setState({ query })
flag && KnowledgeAPI.queryPageKnowledgeForManager(query).then((res) => {
// KnowledgeAPI.videoSchedulePage(query).then((res) => {
const { result = {} } = res || {};
const { records = [], total = 0 } = result;
this.setState({
dataSource: records,
totalCount: Number(total),
});
});
};
flag &&
KnowledgeAPI.queryPageKnowledgeForManager(query).then((res) => {
// KnowledgeAPI.videoSchedulePage(query).then((res) => {
const { result = {} } = res || {}
const { records = [], total = 0 } = result
this.setState({
dataSource: records,
totalCount: Number(total),
})
})
}
render() {
const {
dataSource,
totalCount,
query,
categoryId,
updateCategoryFlag,
} = this.state;
const { dataSource, totalCount, query, categoryId, updateCategoryFlag } = this.state
return (
<div className="page">
<div className="content-header">知识库</div>
<div className='page'>
<div className='content-header'>知识库</div>
<div className="box" style={{ display: "flex" }}>
<div className='box' style={{ display: 'flex' }}>
{/* 搜索模块 */}
<div className="left" style={{ width: 245 }}>
<Classification
updateCategoryFlag={updateCategoryFlag}
categoryId={categoryId}
getSelectedCategoryId={this.getSelectedCategoryId}
/>
<div className='left' style={{ width: 245 }}>
<Classification updateCategoryFlag={updateCategoryFlag} categoryId={categoryId} getSelectedCategoryId={this.getSelectedCategoryId} />
</div>
<div
className="liner"
style={{ backgroundColor: "rgb(238, 238, 238)", width: 0.5, margin: "1px 16px 1px 2px" }}
></div>
<div className="right" style={{ width: "calc(100% - 285px)" }}>
<div className='liner' style={{ backgroundColor: 'rgb(238, 238, 238)', width: 0.5, margin: '1px 16px 1px 2px' }}></div>
<div className='right' style={{ width: 'calc(100% - 285px)' }}>
<KnowledgeBaseFilter onChange={this.handleFetchScheduleList} />
{/* 操作模块 */}
{categoryId != 0 && <KnowledgeBaseOpt
onChange={this.handleFetchScheduleList}
updateCategoryTree={this.updateCategoryTree}
categoryId={categoryId}
/>}
{categoryId !== '0' && (
<KnowledgeBaseOpt onChange={this.handleFetchScheduleList} updateCategoryTree={this.updateCategoryTree} categoryId={categoryId} />
)}
{/* 知识库列表模块 */}
<KnowledgeBaseList
......@@ -119,6 +110,6 @@ export default class KnowledgeBase extends React.Component {
</div>
</div>
</div>
);
)
}
}
......@@ -71,13 +71,13 @@
}
.courseware {
font-size: 14px;
color: #5289fa;
color: #2966ff;
line-height: 20px;
text-align: right;
cursor: pointer;
}
.quota-icon {
color: #5289fa;
color: #2966ff;
cursor: pointer;
}
.operate {
......@@ -85,7 +85,7 @@
align-items: center;
flex-wrap: wrap;
.operate__item {
color: #5289fa;
color: #2966ff;
cursor: pointer;
&.split {
margin: 0 8px;
......@@ -94,7 +94,7 @@
}
}
.operate-text {
color: #5289fa;
color: #2966ff;
cursor: pointer;
}
.course-start-end {
......@@ -125,42 +125,10 @@
}
}
.add-course-modal {
.ant-tabs-top > .ant-tabs-nav::before {
border-bottom: 0px;
}
.ant-tabs-nav-list {
margin: 0 auto;
flex:none !important
}
.ant-tabs-tab.ant-tabs-tab-active .ant-tabs-tab-btn {
font-weight: normal;
border-bottom: 0px;
}
.ant-tabs-nav .ant-tabs-tab {
padding: 6px 12px !important;
margin: 0;
border: 0.5px solid #e8e8e8;
font-size: 14px !important;
color: #999;
&:nth-child(1) {
border-radius: 4px 0px 0px 4px;
}
&:nth-child(3) {
border-radius: 0px 4px 4px 0px;
}
}
.ant-tabs-nav .ant-tabs-tab-active {
border: 1px solid #ffb714;
color: #ffb714;
}
.ant-tabs-top .ant-tabs-ink-bar-animated:after {
height: 0;
color: #2966ff;
}
.ant-modal-content tr > td{
padding:12px 8px !important;
.ant-modal-content tr > td {
padding: 12px 8px !important;
}
}
/*
* @Author: zhangleyuan
* @Date: 2021-02-20 16:13:39
* @LastEditors: zhangleyuan
* @LastEditTime: 2021-03-10 18:38:50
* @LastEditors: fusanqiasng
* @LastEditTime: 2021-05-23 23:59:43
* @Description: 描述一下
* @@Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有
*/
import React, { useEffect, useState } from "react";
import PlanFilter from './components/PlanFilter';
import PlanOpt from './components/PlanOpt';
import PlanList from './components/PlanList';
import PlanService from "@/domains/plan-domain/planService";
import User from '@/common/js/user';
import React, { useEffect, useState } from 'react'
import PlanFilter from './components/PlanFilter'
import PlanOpt from './components/PlanOpt'
import PlanList from './components/PlanList'
import PlanService from '@/domains/plan-domain/planService'
import User from '@/common/js/user'
function PlanPage() {
const [planListData, setPlanListData] = useState([]);
const [query,setQuery] = useState({
current:1,
size:10,
});
const [planListData, setPlanListData] = useState([])
const [query, setQuery] = useState({
current: 1,
size: 10
})
useEffect(() => {
handleFetchPlanList();
}, [query]);
const [totalCount,setTotalCount] = useState(0);
function queryChange(_query){
const params = {
...query,
..._query,
};
setQuery(params);
}
function handleFetchPlanList(_query){
function handleFetchPlanList(_query) {
const params = {
...query,
..._query,
storeUserId: User.getStoreUserId()
}
//动态获取计划列表
PlanService.getTrainingPlanPage(params).then((res) => {
const {
result: { records = [], total }
} = res
setPlanListData(records)
setTotalCount(total)
})
}
handleFetchPlanList()
}, [query])
const [totalCount, setTotalCount] = useState(0)
function queryChange(_query) {
const params = {
...query,
..._query,
storeUserId:User.getStoreUserId()
};
//动态获取计划列表
PlanService.getTrainingPlanPage(params).then((res) => {
const { result: { records = [], total } } = res;
setPlanListData(records);
setTotalCount(total);
})
..._query
}
setQuery(params)
}
return (
<div className="page">
<div className="content-header">培训计划</div>
<div className="box">
<PlanFilter onChange={queryChange}/>
<PlanOpt/>
<PlanList
planListData={planListData}
query={query}
totalCount={totalCount}
onChange={queryChange}
/>
</div>
<div className='page'>
<div className='content-header'>培训计划</div>
<div className='box'>
<PlanFilter onChange={queryChange} />
<PlanOpt />
<PlanList planListData={planListData} query={query} totalCount={totalCount} onChange={queryChange} />
</div>
</div>
)
}
export default PlanPage;
\ No newline at end of file
export default PlanPage
.user-learning-data{
.user-learning-table{
margin-top:4px;
.user-learning-data {
.user-learning-table {
margin-top: 4px;
}
.operate-area {
.operate-item {
font-size: 14px;
color: #2966ff;
cursor: pointer;
}
.operate-area{
.operate-item{
font-size:14px;
color:#5289FA;
cursor: pointer;
}
.split{
margin:0 4px;
color: #BFBFBF;
}
.split {
margin: 0 4px;
color: #bfbfbf;
}
.learn-num{
text-align:right;
margin-right:20px;
}
}
\ No newline at end of file
}
.learn-num {
text-align: right;
margin-right: 20px;
}
.ant-table-column-sorters:after {
display: none;
}
}
/*
* @Author: 吴文洁
* @Date: 2020-07-20 19:12:49
* @Author: 吴文洁
* @Date: 2020-07-20 19:12:49
* @Last Modified by: 吴文洁
* @Last Modified time: 2020-07-20 20:25:13
* @Description: 大班直播分享弹窗
*/
import React from 'react';
import { Modal, Input, Button, message } from 'antd';
import domtoimage from 'dom-to-image';
import qrcode from "@/libs/qrcode/qrcode.js";
import User from '@/common/js/user';
import $ from 'jquery';
import CourseService from "@/domains/course-domain/CourseService";
import React from 'react'
import { Modal, Button, message } from 'antd'
import domtoimage from 'dom-to-image'
import qrcode from '@/libs/qrcode/qrcode.js'
import User from '@/common/js/user'
import $ from 'jquery'
import CourseService from '@/domains/course-domain/CourseService'
import './SharePlanModal.less';
import './SharePlanModal.less'
const storeName = User.getStoreName();
const DEFAULT_COVER = 'https://image.xiaomaiketang.com/xm/YNfi45JwFA.png';
const DEFAULT_COVER = 'https://image.xiaomaiketang.com/xm/YNfi45JwFA.png'
class ShareLiveModal extends React.Component {
constructor(props) {
super(props);
super(props)
this.state = {
shareUrl: ''
shareUrl: '',
}
}
componentDidMount() {
// 获取短链接
this.handleConvertShortUrl();
this.handleConvertShortUrl()
}
handleConvertShortUrl = () => {
const { longUrl } = this.props.data;
const { longUrl } = this.props.data
// 发请求
CourseService.getQrcode({
urls: [longUrl]
urls: [longUrl],
}).then((res) => {
const { result = [] } = res;
this.setState({
shareUrl: result[0].shortUrl
}, () => {
const qrcodeWrapDom = document.querySelector('#qrcodeWrap');
const qrcodeNode = new qrcode({
text: this.state.shareUrl,
size: 98,
})
qrcodeWrapDom.appendChild(qrcodeNode);
});
const { result = [] } = res
this.setState(
{
shareUrl: result[0].shortUrl,
},
() => {
const qrcodeWrapDom = document.querySelector('#qrcodeWrap')
const qrcodeNode = new qrcode({
text: this.state.shareUrl,
size: 98,
})
qrcodeWrapDom.appendChild(qrcodeNode)
}
)
})
}
componentWillUnmount() {
// 页面销毁之前清空定时器
clearTimeout(this.timer);
clearTimeout(this.timer)
}
// 下载海报
handleDownloadPoster = () => {
this.setState({
showImg:true,
time:new Date().valueOf()
},()=>{
this.setState({time:new Date().valueOf()},()=>{
let node = document.getElementById('poster');
domtoimage.toPng(node)
.then((imgData) => {
this.setState(
{
showImg: true,
time: new Date().valueOf(),
},
() => {
this.setState({ time: new Date().valueOf() }, () => {
let node = document.getElementById('poster')
domtoimage.toPng(node).then((imgData) => {
console.log(imgData)
const download = document.createElement('a');
const { planName } = this.props.data;
$(download).attr('href', imgData).attr('download', `${planName}.png`).get(0).click();
const download = document.createElement('a')
const { planName } = this.props.data
$(download).attr('href', imgData).attr('download', `${planName}.png`).get(0).click()
})
})
})
})
}
)
}
// 复制分享链接
handleCopy = () => {
const textContent = document.getElementById('shareUrl').innerText;
const textContent = document.getElementById('shareUrl').innerText
window.copyText(textContent);
message.success('复制成功!');
window.copyText(textContent)
message.success('复制成功!')
}
render() {
const {data} = this.props;
const { planName, coverUrl = DEFAULT_COVER} = data;
const { shareUrl,showImg,time} = this.state;
const { data } = this.props
const { planName, coverUrl = DEFAULT_COVER } = data
const { shareUrl, showImg, time } = this.state
return (
<Modal
title={'分享培训计划'}
......@@ -100,58 +101,61 @@ class ShareLiveModal extends React.Component {
visible={true}
footer={null}
maskClosable={false}
closeIcon={<span className="icon iconfont modal-close-icon">&#xe6ef;</span>}
className="share-live-modal"
onCancel={this.props.close}
>
<div className="left">
<div id="poster">
<div className="store-name">
<span className="text">{storeName}</span>
</div>
<div className="course-name-title">邀请你参与培训:</div>
<div class="live-couse-name">{planName}</div>
{
showImg ? <img
crossOrigin='*'
src={coverUrl+`?=${time}`}
className="course-cover"
/>: <img
src={coverUrl+`?=${time}`}
className="course-cover"
/>
}
<div className="qrcode-wrap">
<div className="qrcode-wrap__left">
<div className="text">长按识别二维码进入观看</div>
<img className="finger" src="https://image.xiaomaiketang.com/xm/thpkWDwJsC.png"/>
closeIcon={<span className='icon iconfont modal-close-icon'>&#xe6ef;</span>}
className='share-live-modal'
onCancel={this.props.close}>
<div className='left'>
<div id='poster'>
<div className='store-name'>
<span className='text'>{User.getStoreName()}</span>
</div>
<div className="qrcode-wrap__right" id="qrcodeWrap">
<div className='course-name-title'>邀请你参与培训:</div>
<div class='live-couse-name'>{planName}</div>
<Choose>
<When condition={showImg}>
<img crossOrigin='*' src={coverUrl + `?=${time}`} className='course-cover' alt='' />
</When>
<Otherwise>
<img src={coverUrl + `?=${time}`} className='course-cover' alt='' />
</Otherwise>
</Choose>
<div className='qrcode-wrap'>
<div className='qrcode-wrap__left'>
<div className='text'>长按识别二维码进入观看</div>
<img className='finger' src='https://image.xiaomaiketang.com/xm/thpkWDwJsC.png' alt='' />
</div>
<div className='qrcode-wrap__right' id='qrcodeWrap'></div>
</div>
</div>
</div>
</div>
<div className="right">
<div className="share-poster right__item">
<div className="title">① 海报分享</div>
<div className="sub-title">学员可通过微信扫描海报二维码,查看培训计划</div>
<div className="content" onClick={this.handleDownloadPoster}>下载海报</div>
</div>
<div className='right'>
<div className='share-poster right__item'>
<div className='title'>① 海报分享</div>
<div className='sub-title'>学员可通过微信扫描海报二维码,查看培训计划</div>
<div className='content' onClick={this.handleDownloadPoster}>
下载海报
</div>
</div>
<div className="share-url right__item">
<div className="title">② 链接分享</div>
<div className="sub-title">学员可通过微信或浏览器打开以下链接,查看培训计划</div>
<div className="content url-content">
<div className="share-url" id="shareUrl">{shareUrl}</div>
<Button type="primary" onClick={this.handleCopy}>复制</Button>
<div className='share-url right__item'>
<div className='title'>② 链接分享</div>
<div className='sub-title'>学员可通过微信或浏览器打开以下链接,查看培训计划</div>
<div className='content url-content'>
<div className='share-url' id='shareUrl'>
{shareUrl}
</div>
<Button type='primary' onClick={this.handleCopy}>
复制
</Button>
</div>
</div>
</div>
</div>
</Modal>
)
}
}
export default ShareLiveModal;
export default ShareLiveModal
.related-course-modal{
.ant-tabs-top > .ant-tabs-nav::before{
border-bottom: 0px;
}
.ant-tabs-nav-list{
margin:0 auto;
}
.ant-tabs-tab.ant-tabs-tab-active .ant-tabs-tab-btn{
font-weight:normal;
}
.ant-tabs-nav .ant-tabs-tab{
padding:6px 12px !important;
margin:0;
border: 1px solid #E8E8E8;
font-size:14px !important;
color:#999;
&:nth-child(1){
border-radius: 4px 0px 0px 4px;
}
&:nth-child(2){
border-radius: 0px 4px 4px 0px;
}
}
.related-course-modal {
.ant-tabs-tab.ant-tabs-tab-active .ant-tabs-tab-btn {
font-weight: normal;
}
// .ant-tabs-nav .ant-tabs-tab {
// padding: 6px 12px !important;
// margin: 0;
// border: 1px solid #e8e8e8;
// font-size: 14px !important;
// color: #999;
.ant-tabs-nav .ant-tabs-tab-active{
border: 1px solid #FFB714;
color:#FFB714;
}
// &:nth-child(1) {
// border-radius: 4px 0px 0px 4px;
// }
// &:nth-child(2) {
// border-radius: 0px 4px 4px 0px;
// }
// }
.ant-tabs-top .ant-tabs-ink-bar-animated:after{
height:0;
}
.link-create-course{
color:#666666;
font-size:14px;
width:638px;
text-align:left;
display:inline-block;
span{
color:#5289FA;
}
}
.search-container{
margin-bottom:16px;
}
.select-area{
margin-bottom:12px;
display:flex;
justify-content:space-between;
.select-box{
display:inline-box;
width: 186px;
background: #FFF4DD;
border-radius: 4px;
padding:6px 16px;
margin-right:8px;
display: flex;
justify-content: space-between;
.tip-icon{
color:#FF9D14;
font-size:14px;
margin-right:4px;
}
.select-num{
color:#666666;
font-size:14px;
}
.clear-btn{
text-align:right;
color:#5289FA;
font-size:14px;
}
}
.related-box{
padding:6px 16px;
background: #FFF4DD;
border-radius: 4px;
flex:1;
color:#666666;
font-size:14px;
}
// .ant-tabs-nav .ant-tabs-tab-active {
// // border: 1px solid #ffb714;
// color: #ffb714;
// }
// .ant-tabs-top .ant-tabs-ink-bar-animated:after {
// height: 0;
// }
.ant-modal-footer {
display: flex;
}
.link-create-course {
color: #666666;
font-size: 14px;
width: 638px;
text-align: left;
display: inline-block;
span {
color: #5289fa;
}
.course-info{
}
.search-container {
margin-bottom: 16px;
}
.select-area {
margin-bottom: 12px;
display: flex;
justify-content: space-between;
.select-box {
display: inline-box;
width: 186px;
background: #fff4dd;
border-radius: 4px;
padding: 6px 16px;
margin-right: 8px;
display: flex;
align-items: center;
.course-cover{
width: 97px;
height: 55px;
display: inline-block;
border-radius:4px;
margin-right:8px;
justify-content: space-between;
.tip-icon {
color: #ff9d14;
font-size: 14px;
margin-right: 4px;
}
.course-name{
font-size:14px;
color:#666;
text-overflow: -o-ellipsis-lastline;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
line-clamp: 2;
-webkit-box-orient: vertical;
width:238px;
.select-num {
color: #666666;
font-size: 14px;
}
.course-status {
font-size:12px;
line-height:18px;
display:inline-block;
border-radius:2px;
padding:0 8px;
margin-top:8px;
.clear-btn {
text-align: right;
color: #5289fa;
font-size: 14px;
}
}
}
\ No newline at end of file
.related-box {
padding: 6px 16px;
background: #fff4dd;
border-radius: 4px;
flex: 1;
color: #666666;
font-size: 14px;
}
}
.course-info {
display: flex;
align-items: center;
.course-cover {
width: 97px;
height: 55px;
display: inline-block;
border-radius: 4px;
margin-right: 8px;
}
.course-name {
font-size: 14px;
color: #666;
text-overflow: -o-ellipsis-lastline;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
line-clamp: 2;
-webkit-box-orient: vertical;
width: 180px;
}
.course-status {
font-size: 12px;
line-height: 18px;
display: inline-block;
border-radius: 2px;
padding: 0 8px;
margin-top: 8px;
}
}
}
......@@ -15,10 +15,11 @@
background-color: #f0f2f5;
overflow-x: scroll;
z-index: 1;
&.right-container-vertical{
left:@xm-left-min-width;
.page{
.page{
height: calc(~'100% - 50px');
&.right-container-vertical {
left: @xm-left-min-width;
.page {
.page {
left: @xm-left-min-width;
}
}
......@@ -41,7 +42,6 @@
}
}
.right-container {
// min-width: 1186px;
&:before {
......@@ -111,7 +111,7 @@
}
&.multiple {
h1{
h1 {
&.on {
border-left: 1px solid @border;
}
......
.wechatLoginBox {
height: 320px;
text-align: center;
.wechatLoginBox{
height: 320px;
.text {
margin-top: 12px;
font-size: 14px;
font-family: PingFangSC-Regular, PingFang SC;
color: #999999;
line-height: 20px;
}
.rwm {
position: relative;
width: 160px;
height: 160px;
text-align: center;
.text{
margin-top: 12px;
display: inline-block;
margin-top: 24px;
.error {
position: absolute;
width: 100%;
height: 100%;
background: rgba(255, 255, 255, 0.95);
display: flex;
align-items: center;
justify-content: center;
left: 0px;
top: 0px;
div {
margin: 0 10px;
font-size: 14px;
font-family: PingFangSC-Regular, PingFang SC;
color: #999999;
font-weight: 400;
color: #333333;
line-height: 20px;
}
.ope {
cursor: pointer;
color: rgba(82, 137, 250, 1);
}
}
.rwm{
position: relative;
width: 160px;
height: 160px;
text-align: center;
display: inline-block;
margin-top: 24px;
.error{
position: absolute;
width: 170px;
height: 170px;
background: rgba(255, 255, 255, 0.95);
display: flex;
align-items:center;
justify-content:center;
left:-5px;
top:-5px;
div{
margin: 0 10px;
font-size: 14px;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: #333333;
line-height: 20px;
}
.ope{
cursor: pointer;
color:rgba(82, 137, 250, 1);
}
}
}
}
.ant-tabs-tab-active{
.ant-tabs-tab-btn{
color: #333333;
}
.ant-tabs-tab-active {
.ant-tabs-tab-btn {
color: #333333;
}
.ant-tabs-tab-btn{
color: #999999;
font-size: 16px;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
line-height: 25px;
}
}
.ant-tabs-nav::before{
display: none;
}
.ant-tabs-tab{
width: 105px;
text-align: center;
}
.ant-tabs > .ant-tabs-nav .ant-tabs-nav-list{
margin: 0 auto;
}
.ant-tabs-top > .ant-tabs-nav .ant-tabs-ink-bar{
width: 24px !important;
height: 4px;
margin-left: 30px;
}
.ant-tabs-tab-btn {
color: #999999;
font-size: 16px;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
line-height: 25px;
}
.ant-tabs-nav::before {
display: none;
}
.ant-tabs-tab {
width: 105px;
text-align: center;
}
.ant-tabs > .ant-tabs-nav .ant-tabs-nav-list {
margin: 0 auto;
}
.ant-tabs-top > .ant-tabs-nav .ant-tabs-ink-bar {
width: 24px !important;
height: 4px;
margin-left: 30px;
}
}
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment