Commit 9417fce0 by guomingpang

Merge branch 'master' into rc

parents 8ac4b55e b6e69746
......@@ -124,8 +124,8 @@ module.exports = function (webpackEnv) {
options: {
lessOptions: {
modifyVars: {
'primary-color': 'rgba(255, 183, 20, 1)',
'border-radius-base': '4px'
'primary-color': '#2966FF',
'border-radius-base': '2px',
},
javascriptEnabled: true
}
......
......@@ -64,7 +64,7 @@
.span-left{
margin-left: 10px;
.span-left-l{
color: #ffb714;
color: #2966FF;
cursor: pointer;
}
}
......@@ -73,7 +73,7 @@
margin-right: 10px;
color: #999;
.span-right-l{
color: #5289FA;
color: #2966FF;
cursor: pointer;
}
}
......
......@@ -6,7 +6,7 @@
margin-bottom: 10px;
}
.bread:hover{
color: #5289FA;
color: #2966FF;
}
}
......
......@@ -16,7 +16,7 @@
.managing-right{
float: right;
color: #5289FA;
color: #2966FF;
cursor: pointer;
.tool-tip-right{
margin-right: 4px;
......
......@@ -38,7 +38,7 @@
&:not(:last-child) {
cursor: pointer;
&:hover {
color: #5289FA;
color: #2966FF;
}
&::before {
content: '/';
......@@ -104,7 +104,7 @@
}
.footer__left {
color: #5289fa;
color: #2966FF;
cursor: pointer;
}
}
......
......@@ -109,7 +109,7 @@
margin-top: 40px;
.content {
color: #FF7519;
color: #2966FF;
cursor: pointer;
}
}
......
.xm-show-tip {
position: relative;
min-height:32px;
background:#FFF4DD;
background:#E9EFFF;
border-radius:4px;
display: flex;
justify-content: flex-start;
......@@ -9,7 +9,7 @@
padding: 0 12px;
line-height: 32px;
span.icon {
color:#FF9D14;
color:#2966FF;
line-height: 20px;
}
p {
......
......@@ -316,7 +316,7 @@ class UploadProgressModal extends React.Component {
return (
<div
className="file-item"
className={`file-item ${file.status === 'fail' ? 'fail':''}`}
key={`file-item${index}`}
>
......
......@@ -54,6 +54,9 @@
line-height: 50px;
padding: 0 24px;
position: relative;
&.fail {
background-color: rgba(255, 79, 79, 0.06);
}
&:not(:last-child) {
margin-bottom: 4px;
......
/*
* @Author: 吴文洁
* @Date: 2020-08-31 09:34:31
* @LastEditors: zhangleyuan
* @LastEditTime: 2021-04-27 16:59:07
* @LastEditors: wufan
* @LastEditTime: 2021-05-27 10:42:12
* @Description:
* @Copyright: 杭州杰竞科技有限公司 版权所有
*/
import qs from 'qs';
import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse, AxiosPromise, AxiosError } from 'axios';
import { message } from 'antd';
......
@import "../core/variables.less";
.xm-breadCrumb {
margin-left: 16px;
.xm-breadCrumb{
padding-left: 16px;
color: #989898;
margin-top: 10px;
margin-bottom: 10px;
+ .statistic-tips {
padding-top: 16px;
padding-bottom: 8px;
background: #fff;
width: calc(100vw - 218px);
+.statistic-tips{
position: relative;
top: -8px;
margin-bottom: 0px !important;
......
......@@ -11,7 +11,7 @@
color: #666;
}
.nc_iconfont {
color: #FFB714;
color: #2966FF;
font-weight: bold;
border-color: #e8e8e8;
height: 40px;
......@@ -26,11 +26,12 @@
box-sizing: border-box;
}
.nc_scale .nc_ok, .nc_scale .nc_bg {
background: #FFB714;
background: #2966FF;
border-radius: 4px 0 0 4px;
opacity: 0.3;
}
.nc_scale .btn_ok {
color: #FFB714;
color: #2966FF;
height: 40px;
line-height: 40px;
box-sizing: border-box;
......@@ -42,7 +43,7 @@
.nc-lang-cnt {
color: #666;
a {
color: #FFB714;
color: #2966FF;
}
}
}
......
......@@ -3,7 +3,7 @@
.multiple-calendar {
width: 295px;
border: 1px solid #e8e8e8;
border-radius: 4px;
border-radius: 2px;
ul {
list-style: none;
}
......@@ -22,7 +22,7 @@
cursor: default;
&:hover {
background: #FFFFFF;
border-radius: 4px;
border-radius: 2px;
}
}
.self {
......@@ -55,8 +55,8 @@
cursor: pointer;
vertical-align: top;
&:hover {
background: rgba(255, 183, 20,.2);
border-radius:4px;
background: rgba(41, 102, 255, .1);
border-radius:2px;
}
&.before-disabled {
color: #e8e8e8;
......@@ -81,11 +81,11 @@
&.active {
background: @xm-color-primary;
color: #fff;
border-radius: 4px;
border-radius: 2px;
}
&.today {
border: 1px solid @xm-color-primary;
border-radius: 5px;
border-radius: 2px;
}
}
}
......@@ -151,7 +151,7 @@
border-radius: none;
span {
background: @xm-color-primary;
border-radius: 4px;
border-radius: 2px;
}
&:hover {
span {
......@@ -164,13 +164,13 @@
border-radius: none;
span {
border: 1px solid @xm-color-primary;
border-radius: 5px;
border-radius: 2px;
}
}
&.past {
span {
background:rgba(255,133,52,0.1);
border-radius: 4px;
border-radius: 2px;
color:rgba(0,0,0,0.25);
}
}
......
.xm-show-tip {
position: relative;
min-height:32px;
background:#FFF4DD;
background:#E9EFFF;
border-radius:4px;
display: flex;
justify-content: flex-start;
......@@ -9,7 +9,7 @@
padding: 0 12px;
line-height: 32px;
.icon {
color:#FF9D14;
color:#2966FF;
font-size:14px;
}
p {
......
......@@ -3,12 +3,12 @@
min-width: 186px;
height: 32px;
line-height: 32px;
background: #FFF4DD;
background: #E9EFFF;
padding: 0px 16px;
border-radius:4px;
margin: 16px 10px 13px 0;
.iconfont {
color: #FF9D14;
color: #2966FF;
}
.selected-text {
margin-left: 10px;
......@@ -17,7 +17,7 @@
.click-clear {
float: right;
cursor: pointer;
color: #5289FA;
color: #2966FF;
&:hover {
color: rgba(85, 168, 253, 0.8);
}
......
......@@ -6,7 +6,7 @@
*/
@import './variables.less';
@active-color: #2966ff;
@active-color: #2966FF;
// 消息提示框
.ant-message {
......@@ -233,6 +233,10 @@
}
}
.ant-tabs-tab.ant-tabs-tab-active .ant-tabs-tab-btn {
font-weight: 500!important;
}
.ant-tabs-nav .ant-tabs-tab-active {
color: @active-color !important;
}
......@@ -260,7 +264,7 @@
position: absolute;
width: 30px;
height: 4px;
background: #2966ff !important;
background: #2966FF !important;
left: 50%;
transform: translateX(-50%);
}
......@@ -335,14 +339,14 @@ mr0 {
background: #f3f6fa;
.ant-select-selected-icon {
color: #2966ff !important;
color:#2966FF !important;
}
}
.ant-select-dropdown-menu-item-selected {
background: none;
font-weight: 400 !important;
color: #2966ff;
color:#2966FF;
}
.ant-select-open .ant-select-selection {
......@@ -440,7 +444,7 @@ mr0 {
.ant-modal {
.ant-input {
&:focus {
border: 1px solid #2966ff !important;
border: 1px solid #2966FF !important;
}
}
}
......@@ -453,8 +457,8 @@ mr0 {
.ant-calendar-footer-extra {
.ant-tag-blue {
background: #fff;
color: #2966ff;
border-color: #2966ff;
color: #2966FF;
border-color: #2966FF;
}
}
}
......@@ -470,7 +474,7 @@ mr0 {
}
.ant-modal-confirm-info .ant-modal-confirm-body > .anticon {
color: #2966ff !important;
color: #2966FF!important;
}
.ant-breadcrumb > span:last-child .ant-breadcrumb-separator {
......@@ -498,7 +502,7 @@ mr0 {
font-size: 22px !important;
line-height: 22px !important;
float: left !important;
color: #2966ff !important;
color:#2966FF !important;
margin-right: 16px !important;
&.blue {
color: #5cbaff !important;
......@@ -523,8 +527,8 @@ mr0 {
float: left;
margin-right: 16px;
}
> .confirm-icon {
color: #2966ff;
>.confirm-icon{
color: #2966FF;
}
.ant-modal-confirm-content {
margin-left: 38px;
......@@ -590,9 +594,9 @@ mr0 {
// background: #FAFAFA !important;
// }
.ant-table-thead > tr > th {
font-weight: bold !important;
color: #333 !important;
.ant-table-thead > tr > th{
font-weight:bold !important;
color:#333 !important;
}
td.ant-table-column-sort {
background: none;
......@@ -653,12 +657,11 @@ td.ant-table-column-sort {
border-color: @xm-color-text-select-primary !important;
border: none !important;
&:hover {
background-color: #2966ff !important;
background-color: #2966FF !important;
opacity: 0.8 !important;
}
&:focus,
&:active {
background-color: #5c8aff !important;
&:active{
background-color:#5C8AFF !important;
}
}
......@@ -716,9 +719,10 @@ td.ant-table-column-sort {
box-shadow: none !important;
border-right: 0px !important;
}
.ant-input-search > .ant-input-group > .ant-input-group-addon:last-child .ant-input-search-button span {
color: #bfbfbf !important;
font-size: 12px;
.ant-input-search > .ant-input-group > .ant-input-group-addon:last-child .ant-input-search-button span{
color:#bfbfbf !important;
font-size:12px;
}
.ant-modal-footer {
......@@ -769,3 +773,4 @@ td.ant-table-column-sort {
.ant-table-column-sorter-full {
margin-top: -0.32rem !important;
}
......@@ -1602,7 +1602,7 @@ input:focus {
font-size: 22px !important;
line-height: 22px !important;
float: left !important;
color: #FFB714 !important;
color: #2966FF !important;
margin-right: 16px !important;
}
......@@ -1678,11 +1678,11 @@ input:focus {
align-items: center;
flex-wrap: wrap;
.operate-text {
color: #5289FA;
color: #2966FF;
cursor: pointer;
}
.operate__item {
color: #5289FA;
color: #2966FF;
cursor: pointer;
&.split {
margin: 0 8px;
......@@ -1690,7 +1690,7 @@ input:focus {
}
}
.more{
color: #5289FA;
color: #2966FF;
cursor: pointer;
cursor: pointer;
}
......
......@@ -7,26 +7,25 @@
left: 0px;
right: 0;
bottom: 0;
z-index: 101;
background-color: #f0f2f5;
z-index:3;
background-color: #fff;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
min-height: 100%;
.page {
position: fixed;
top: 50px;
top: 60px;
left: 180px;
right: 0;
bottom: 0;
z-index: 102;
overflow: auto;
.box {
&:first-child {
margin:0 16px;
.box{
&:first-child{
margin-bottom: 8px;
}
& + .box {
margin: 8px 16px;
}
&:last-child {
&:last-child{
margin-bottom: 16px;
}
}
......@@ -47,13 +46,12 @@
line-height: 30px;
}
.content-header {
padding: 16px 16px;
padding: 16px 16px 8px 16px;
line-height: 30px;
background: #fff;
margin: 16px 16px 0;
font-size: 24px;
color: #333;
font-weight: 500;
font-size:24px;
color:#333;
font-weight:bold;
background: #FFF;
h1 {
font-weight: normal;
display: inline-block;
......@@ -62,9 +60,8 @@
.box {
padding: 16px;
margin: 0 16px;
background: #ffffff;
// min-height: 400px;
// min-height: calc(100vh - 126px);
.box-header {
line-height: 30px;
padding-bottom: 12px;
......@@ -91,16 +88,7 @@
.box-footer {
margin-top: 16px;
}
&:first-child {
margin-bottom: 8px;
}
& + .box {
margin: 8px 16px;
}
}
// .ant-calendar-picker{
// top:-1px;
// }
}
.box-header {
......
@sunLight: #FED951;
@sun: #FFB714;
@sunDark: #FFB714;
@sun: #2966FF;
@sunDark: #2966FF;
@orangeLight: #FDBB70;
......@@ -56,7 +56,7 @@
//old
//color
@xm-color-primary:#FFB714;
@xm-color-primary:#2966FF;
@xm-color-primary_active: #020201;
@xm-color-primary-darker: #ff8534;
@xm-color-selected: #F58E2C;
......@@ -66,7 +66,7 @@
@xm-color-secondary-light: #e28534;
@xm-color-secondary: #ff8534;
@xm-color-secondary-darker: #D65E30;
@xm-color-text-select-primary:#FFB714;
@xm-color-text-select-primary:#2966FF;
@xm-color-text-select-warning:#ec4b35;
@xm-color-info: #45b2ff;
......@@ -131,7 +131,7 @@
@xm-table-tbody-color:#666;
//侧边栏宽度
@xm-left-width:180px;
@xm-left-min-width:64px;
@xm-left-min-width:56px;
@xm-color-text-menu:#9a9dA7;
// 下拉框
......
<!--
* @Author: 吴文洁
* @Date: 2020-08-24 12:20:57
* @LastEditors: zhangleyuan
* @LastEditTime: 2021-05-10 13:41:44
* @LastEditors: Please set LastEditors
* @LastEditTime: 2021-05-26 16:26:17
* @Description:
* @Copyright: 杭州杰竞科技有限公司 版权所有
-->
......@@ -25,7 +25,7 @@
user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
-->
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
<link rel="stylesheet" href="//at.alicdn.com/t/font_2223403_e0vkqcd8igi.css">
<link rel="stylesheet" href="//at.alicdn.com/t/font_2223403_oqqm4z9s35j.css">
<!--
Notice the use of %PUBLIC_URL% in the tags above.
......
......@@ -2,7 +2,7 @@
* @Author: 吴文洁
* @Date: 2020-08-24 12:20:57
* @LastEditors: wufan
* @LastEditTime: 2021-05-17 19:53:24
* @LastEditTime: 2021-05-27 10:24:06
* @Description:
* @Copyright: 杭州杰竞科技有限公司 版权所有
-->
......@@ -23,7 +23,7 @@
user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
-->
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
<link rel="stylesheet" href="//at.alicdn.com/t/font_2223403_e0vkqcd8igi.css">
<link rel="stylesheet" href="//at.alicdn.com/t/font_2223403_oqqm4z9s35j.css">
<!--
Notice the use of %PUBLIC_URL% in the tags above.
......
.employee-manage-page{
.box-header{
margin-bottom:4px;
}
.add-show-btn{
margin-top:12px;
}
}
\ No newline at end of file
......@@ -263,7 +263,7 @@ function EmployeeManage() {
}
return (
<div className=" page employee-manage-page">
<div className="page employee-manage-page">
<div className="content-header">员工管理</div>
<div className="box">
<div className="box-header">
......@@ -272,7 +272,7 @@ function EmployeeManage() {
display: "flex",
alignItems: "center",
justifyContent: "flex-start",
padding: "0px 0 16px",
padding: "0px 0 4px",
}}
>
<div>
......
......@@ -2,13 +2,12 @@
.box-header {
display: flex;
width: calc(100% - 80px);
margin-bottom: 16px;
margin-bottom: 4px;
.header-item {
width: 30%;
margin-right: 3%;
display: flex;
.item-name {
width: 80px;
flex-shrink: 0;
}
}
......
......@@ -2,7 +2,7 @@
* @Author: wufan
* @Date: 2020-11-30 10:47:38
* @LastEditors: wufan
* @LastEditTime: 2021-05-13 17:45:53
* @LastEditTime: 2021-05-30 15:57:40
* @Description: 学员管理页面
* @@Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有
*/
......@@ -68,7 +68,7 @@ function UserManagePage() {
<span className="title">{val}</span>
<span
className="tag"
style={{ color: item.sourceEnum === 'WORK_WE_CHAT' ? '#FFB714' : '#1DCC65'}}
style={{ color: item.sourceEnum === 'WORK_WE_CHAT' ? '#2966FF' : '#1DCC65'}}
>{item.sourceEnum === 'WORK_WE_CHAT' ? '@企业微信' : '@微信'}</span>
</div>
);
......
......@@ -79,7 +79,7 @@
line-height: 45px;
margin-left: 10px;
.span-left-l{
color: #ffb714;
color: #2966FF;
cursor: pointer;
}
}
......@@ -89,7 +89,7 @@
margin-right: 10px;
color: #999;
.span-right-l{
color: #5289FA;
color: #2966FF;
cursor: pointer;
}
}
......
......@@ -39,9 +39,9 @@
height: 18px;
line-height: 18px;
padding: 0 8px;
border: 1px solid #FFB714;
border: 1px solid #2966FF;
border-radius: 9px;
color: #FFB714;
color: #2966FF;
margin-top: 13px;
font-size: 12px;
flex-shrink: 0;
......@@ -54,7 +54,7 @@
left: 0;
height: 100%;
width: 4px;
background: #FFB714;
background: #2966FF;
}
}
}
......
......@@ -58,6 +58,7 @@ export default function ExaminationManager(props: any) {
onPopupScroll={handleScrollTeacherList}
suffixIcon={<span className="icon iconfont" style={{ fontSize: '12px', color: '#BFBFBF' }}>&#xe835;</span>}
value={props.val || null}
filterOption={(input: any, option: any) => option}
onChange={(value) => {
props.onChange(value)
}}
......
......@@ -27,7 +27,7 @@ import _ from "underscore";
import $ from 'jquery';
import './AddLive.less';
const defaultCover = 'https://image.xiaomaiketang.com/xm/YNfi45JwFA.png';
const defaultCover = 'https://image.xiaomaiketang.com/xm/Yip2YtFDwH.png';
const defaultBasicInfo = {
courseName: null, // 课程名称
coverUrl: defaultCover,
......@@ -578,7 +578,7 @@ handleChangeBasicInfo = (field, value) => {
</div>
</div>
<div className="footer">
<div className="footer shrink-footer">
<Button onClick={this.handleGoBack}>取消</Button>
<Button onClick={this.handleShowPreviewModal}>预览</Button>
<Button type="primary" onClick={_.debounce(() => this.handleSubmit(), 3000, true)}>保存</Button>
......
.add-live-page {
position:relative !important;
.box {
margin-bottom: 66px !important;
margin-bottom: 52px !important;
}
.add-live-page__form {
margin-top: 16px;
......@@ -44,17 +44,34 @@
text-align: right;
}
}
.basic-info__wrap, .class-info__wrap, .intro-info__wrap {
.title {
position: relative;
padding-left: 14px;
&::before {
content: "";
position: absolute;
left: 0px;
top: 50%;
transform: translateY(-50%);
width: 4px;
height: 10px;
background: #2966FF;
}
}
}
}
.footer {
position: fixed;
left: 196px;
bottom: 0;
height: 58px;
width: 100%;
width: ~'calc(100% - 218px)';
display: flex;
align-items: center;
justify-content: flex-end;
padding-right: 252px;
padding-right: 72px;
background: #fff;
border-top: 1px solid #E8E8E8;
z-index: 9999;
......
......@@ -27,7 +27,7 @@
}
.handel-btn {
color: #5289fa;
color: #2966FF;
cursor: pointer;
}
.split {
......@@ -41,6 +41,18 @@
font-weight: 500;
color: #333333;
margin-bottom: 16px;
position: relative;
padding-left: 14px;
&::before {
content: "";
position: absolute;
left: 0px;
top: 50%;
transform: translateY(-50%);
width: 4px;
height: 10px;
background: #2966FF;
}
}
.select-course {
width: 300px;
......@@ -119,7 +131,7 @@
height: 37px;
font-size: 26px;
font-weight: 500;
color: #5289fa;
color: #2966FF;
line-height: 37px;
&.can-click {
cursor: pointer;
......
......@@ -17,7 +17,7 @@ import Upload from '@/core/upload';
import './AddLiveBasic.less';
const defaultCover = 'https://image.xiaomaiketang.com/xm/YNfi45JwFA.png';
const defaultCover = 'https://image.xiaomaiketang.com/xm/Yip2YtFDwH.png';
const fieldNames = { label: 'categoryName', value: 'id', children: 'sonCategoryList' };
let cutFlag = false;
let timer = null
......
......@@ -42,7 +42,7 @@
width: 100%;
height: 100%;
object-fit: contain;
border: 1px solid #E8e8e8;
border-radius: 4px;
}
}
......@@ -50,7 +50,7 @@
.default-btn {
margin-left: 16px;
color: #5289FA;
color: #2966FF;
cursor: pointer;
&.disabled {
......@@ -76,7 +76,7 @@
}
.ant-cascader-menu-item-active:not(.ant-cascader-menu-item-disabled){
font-weight:normal !important;
color:#FF9D14 !important;
color:#2966FF !important;
}
#imgCutModalNew {
width: 500px;
......
......@@ -185,7 +185,7 @@
.select-day {
margin-bottom: 4px;
.mark-day {
color: #5289FA;
color: #2966FF;
}
}
}
......
......@@ -136,7 +136,7 @@
}
.checkExample {
width: 60px;
color: #5289FA;
color: #2966FF;
cursor: pointer;
}
.warmup {
......
......@@ -36,8 +36,8 @@ class GraphicsEditor extends React.Component {
resetIndex = (bool) => {
const topDom = document.querySelector('.top-container');
const leftDom = document.querySelector('.left-container');
topDom.style.zIndex = bool ? 'auto' : 112;
leftDom.style.zIndex = bool ? 'auto' : 2;
// topDom.style.zIndex = bool ? 'auto' : 112;
// leftDom.style.zIndex = bool ? 'auto' : 2;
}
renderEditor() {
......
......@@ -32,7 +32,7 @@ const courseStateShow = {
UN_START: {
code: 1,
title: "待开课",
color: "#FFB714",
color: "#FFB129",
},
STARTING: {
code: 2,
......@@ -166,7 +166,7 @@ class LiveCourseList extends React.Component {
})
}
{ !hasCover &&
<img className="course-cover" src={'https://image.xiaomaiketang.com/xm/YNfi45JwFA.png'} />
<img className="course-cover" src={'https://image.xiaomaiketang.com/xm/Yip2YtFDwH.png'} />
}
<div>
{ record.courseName.length > 17?
......@@ -262,7 +262,7 @@ class LiveCourseList extends React.Component {
{
title: <span>
<span>学院展示</span>
<Tooltip title={<div>开启后,学员可在学院内查看到此课程。若课程“未成功开课”,则系统会自动“关闭”学院展示。<br/>关闭后,学院内不再展示此课程,但学员仍可通过分享的海报/链接查看此课程。</div>}><i className="icon iconfont" style={{ marginLeft: '5px',cursor:'pointer',color:'#bfbfbf',fontSize:'14px'}}>&#xe61d;</i></Tooltip>
<Tooltip title={<div>开启后,学员可在学院内查看到此课程。若课程“未成功开课”,则系统会自动“关闭”学院展示。<br/>关闭后,学院内不再展示此课程,但学员仍可通过分享的海报/链接查看此课程。</div>}><i className="icon iconfont" style={{ marginLeft: '5px',cursor:'pointer',color:'#bfbfbf',fontSize:'14px',fontWeight:'normal'}}>&#xe61d;</i></Tooltip>
</span>,
width: "9%",
key: "shelfState",
......@@ -360,7 +360,7 @@ class LiveCourseList extends React.Component {
<span className="operate-text">更多</span>
<span
className="iconfont icon"
style={{ color: "#5289FA" }}
style={{ color: "#2966FF" }}
>
&#xe824;
</span>
......@@ -400,7 +400,7 @@ class LiveCourseList extends React.Component {
})
}
{ !hasCover &&
<img className="course-cover" src={'https://image.xiaomaiketang.com/xm/YNfi45JwFA.png'} />
<img className="course-cover" src={'https://image.xiaomaiketang.com/xm/Yip2YtFDwH.png'} />
}
<div>
{ record.courseName.length > 17?
......
......@@ -83,13 +83,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 {
......@@ -97,7 +97,7 @@
align-items: center;
flex-wrap: wrap;
.operate__item {
color: #5289FA;
color: #2966FF;
cursor: pointer;
&.split {
margin: 0 8px;
......@@ -106,7 +106,7 @@
}
}
.operate-text {
color: #5289FA;
color: #2966FF;
cursor: pointer;
}
.course-start-end {
......
/*
* @Author: 吴文洁
* @Date: 2020-08-05 10:07:47
* @LastEditors: zhangleyuan
* @LastEditTime: 2021-05-10 10:15:31
* @LastEditors: wufan
* @LastEditTime: 2021-05-27 16:37:28
* @Description: 图文课新增/编辑页
* @Copyright: 杭州杰竞科技有限公司 版权所有
*/
......@@ -33,7 +33,7 @@ const fieldNames = { label: 'categoryName', value: 'id', children: 'sonCategory
//添加课程时课程默认的一些值
const defaultShelfState = 'YES';
const whetherVisitorsJoin = 'NO'
const defaultCoverUrl = 'https://image.xiaomaiketang.com/xm/YNfi45JwFA.png';
const defaultCoverUrl = 'https://image.xiaomaiketang.com/xm/wFnpZtp2yB.png';
let cutFlag = false;
class AddGraphicsCourse extends React.Component {
......@@ -530,7 +530,7 @@ class AddGraphicsCourse extends React.Component {
const courseWareIcon = FileVerifyMap[videoType] ? FileTypeIcon[FileVerifyMap[videoType].type] : FileTypeIcon[videoType];
return (
<div className="page add-video-course-page">
<div className="page add-graphics-course-page">
<Breadcrumbs
navList={pageType === "add" ? "新建图文课" : "编辑图文课"}
goBack={this.handleGoBack}
......@@ -596,7 +596,7 @@ class AddGraphicsCourse extends React.Component {
</div>
</div>
<div className="footer">
<div className="footer shrink-footer">
<Button onClick={this.handleGoBack}>取消</Button>
<Button onClick={this.handleShowPreviewModal}>预览</Button>
<Button type="primary" onClick={_.debounce(() => this.handleSubmit(), 3000, true)}>保存</Button>
......
.add-video-course-page {
.add-graphics-course-page {
position:relative !important;
.box{
margin-bottom:66px !important;
margin-bottom:52px !important;
}
.ant-radio-group {
display: flex;
......@@ -80,6 +80,7 @@
width: 100%;
height: 100%;
object-fit: contain;
border-radius: 4px;
}
}
.empty-img {
......@@ -129,13 +130,14 @@
.footer {
position: fixed;
left: 196px;
bottom: 0;
height: 58px;
width: 100%;
width: ~'calc(100% - 218px)';
display: flex;
align-items: center;
justify-content: flex-end;
padding-right: 252px;
padding-right: 72px;
background: #fff;
border-top: 1px solid #E8E8E8;
z-index: 999;
......
/*
* @Author: 吴文洁
* @Date: 2020-08-05 10:12:45
* @LastEditors: wufan
* @LastEditTime: 2021-05-13 16:32:38
* @LastEditors: Please set LastEditors
* @LastEditTime: 2021-05-27 20:13:53
* @Description: 视频课-列表模块
* @Copyright: 杭州杰竞科技有限公司 版权所有
*/
......@@ -25,7 +25,7 @@ import User from '@/common/js/user'
import './GraphicsCourseList.less';
const ENV = process.env.DEPLOY_ENV || 'dev';
const defaultCoverUrl = 'https://image.xiaomaiketang.com/xm/YNfi45JwFA.png';
const defaultCoverUrl = 'https://image.xiaomaiketang.com/xm/wFnpZtp2yB.png';
class GraphicsCourseList extends React.Component {
......@@ -137,7 +137,7 @@ class GraphicsCourseList extends React.Component {
{
title: <span>
<span>学院展示</span>
<Tooltip title={<div>开启后,学员可在学院内查看到此课程。<br/>关闭后,学院内不再展示此课程,但学员仍可通过分享的海报/链接查看此课程。</div>}><i className="icon iconfont" style={{ marginLeft: '5px',cursor:'pointer',color:'#bfbfbf',fontSize:'14px'}}>&#xe61d;</i></Tooltip>
<Tooltip title={<div>开启后,学员可在学院内查看到此课程。<br/>关闭后,学院内不再展示此课程,但学员仍可通过分享的海报/链接查看此课程。</div>}><i className="icon iconfont" style={{ marginLeft: '5px',cursor:'pointer',color:'#bfbfbf',fontSize:'14px',fontWeight:'normal'}}>&#xe61d;</i></Tooltip>
</span>,
width: 120,
dataIndex: "courseware",
......@@ -218,7 +218,7 @@ class GraphicsCourseList extends React.Component {
<span className="operate-text">更多</span>
<span
className="iconfont icon"
style={{ color: "#5289FA" }}
style={{ color: "#2966FF" }}
>
&#xe824;
</span>
......
......@@ -28,14 +28,14 @@
padding: 16px;
}
.operate-text {
color: #5289fa;
color: #2966FF;
cursor: pointer;
}
.operate {
display: flex;
&__item {
color: #5289fa;
color: #2966FF;
cursor: pointer;
&.split {
......@@ -51,12 +51,11 @@
display: flex;
.course-cover {
min-width: 97px;
max-width: 97px;
width: 97px;
height: 50px;
border-radius: 2px;
margin-right: 8px;
// background-color: #666;
object-fit: contain;
}
.course-name {
......
......@@ -284,7 +284,7 @@ class ManageCoursewareModal extends React.Component {
onCancel={() => { }}
>
<span style={{
color: '#5289FA',
color: '#2966FF',
cursor: 'pointer'
}}>删除</span>
</Popconfirm>
......
......@@ -60,7 +60,7 @@
}
&:hover {
.name {
color: #FFB714;
color: #2966FF;
}
}
}
......
......@@ -27,7 +27,7 @@ class PreviewGraphicsModal extends React.Component {
footer={null}
maskClosable={false}
closeIcon={<span className="icon iconfont modal-close-icon">&#xe6ef;</span>}
className="preview-live-graphics-modal"
className="preview-graphics-modal"
>
<div className="container__wrap">
<div className="container">
......
.preview-live-graphics-modal {
.preview-graphics-modal {
.ant-modal-body {
background-image: url('https://image.xiaomaiketang.com/xm/xZWdziTCAf.png');
background-size: 100% 100%;
......@@ -13,13 +13,12 @@
}
.container {
overflow: scroll;
overflow: auto;
height: 100%;;
.course-cover, .course-url {
width: 100%;
height: 141px;
background: #000;
}
&__body {
......@@ -55,21 +54,20 @@
font-size: 12px;
color: #333333;
padding: 0 10px;
border-bottom: 1px solid #E8E8E8;
.title-word {
position: relative;
margin-right: 15px;
cursor: pointer;
}
.selected {
color: #FFB714;
color: #2966FF;
&::after {
content: '';
position: absolute;
bottom: -4px;
width: 20px;
height: 1px;
background: #FFB714;
background: #2966FF;
left: 50%;
transform: translateX(-50%);
}
......
......@@ -5,7 +5,7 @@
.select-container{
margin-bottom:12px;
.con{
background: #FFF4DD;
background: #E9EFFF;
border-radius: 4px;
padding:6px 16px;
display: inline-flex;
......@@ -13,7 +13,7 @@
justify-content: space-between;
.tip{
font-size:14px;
color:#FF9D14;
color:#2966FF;
margin-right:8px;
}
.text{
......@@ -22,7 +22,7 @@
margin-right:30px;
}
.clear{
color:#5289FA;
color:#2966FF;
font-size:14px;
}
......
......@@ -131,7 +131,7 @@
margin-bottom: 40px;
.content {
color:rgba(82, 137, 250, 1);
color:#2966FF;
cursor: pointer;
}
}
......
......@@ -2,7 +2,7 @@
* @Author: 吴文洁
* @Date: 2020-08-05 10:07:47
* @LastEditors: wufan
* @LastEditTime: 2021-05-25 20:00:18
* @LastEditTime: 2021-05-27 19:25:48
* @Description: 线下课新增/编辑页
* @Copyright: 杭州杰竞科技有限公司 版权所有
*/
......@@ -41,7 +41,7 @@ import MultipleDatePicker from '@/components/MultipleDatePicker';
import './AddOfflineCourse.less';
const { Option } = Select;
const defaultCoverUrl = 'https://image.xiaomaiketang.com/xm/YNfi45JwFA.png';
const defaultCoverUrl = 'https://image.xiaomaiketang.com/xm/pxbWKsYA87.png';
let cutFlag = false;
const unitList = [
{ key: 'HOUR', value: '小时' },
......@@ -1046,8 +1046,8 @@ class AddOfflineCourse extends React.Component {
<span
onClick={() => this.setState({ startTimeApply: moment(`${moment(calendarTime[0]).format('YYYY-MM-DD')} ${moment(startTime).format('HH:mm')}`).subtract(1, 'days').valueOf(), endTimeApply: moment(`${moment(calendarTime[0]).format('YYYY-MM-DD')} ${moment(startTime).format('HH:mm')}`).valueOf() - 1000 })}
style={{
color: '#FFB714',
border: '1px solid #FFB714',
color: '#2966FF',
border: '1px solid #2966FF',
padding: '2px 8px',
borderRadius: '2px',
marginRight: 8,
......@@ -1056,8 +1056,8 @@ class AddOfflineCourse extends React.Component {
<span
onClick={() => this.setState({ startTimeApply: moment(`${moment(calendarTime[0]).format('YYYY-MM-DD')} ${moment(startTime).format('HH:mm')}`).subtract(2, 'days').valueOf(), endTimeApply: moment(`${moment(calendarTime[0]).format('YYYY-MM-DD')} ${moment(startTime).format('HH:mm')}`).valueOf() - 1000 })}
style={{
color: '#FFB714',
border: '1px solid #FFB714',
color: '#2966FF',
border: '1px solid #2966FF',
padding: '2px 8px',
borderRadius: '2px',
marginRight: 8,
......@@ -1066,8 +1066,8 @@ class AddOfflineCourse extends React.Component {
<span
onClick={() => this.setState({ startTimeApply: moment(`${moment(calendarTime[0]).format('YYYY-MM-DD')} ${moment(startTime).format('HH:mm')}`).subtract(3, 'days').valueOf(), endTimeApply: moment(`${moment(calendarTime[0]).format('YYYY-MM-DD')} ${moment(startTime).format('HH:mm')}`).valueOf() - 1000 })}
style={{
color: '#FFB714',
border: '1px solid #FFB714',
color: '#2966FF',
border: '1px solid #2966FF',
padding: '2px 8px',
borderRadius: '2px',
marginRight: 8,
......
.add-offline-course-page {
position:relative !important;
.box{
margin-bottom:66px !important;
margin-bottom:52px !important;
}
.ant-radio-group {
display: flex;
......@@ -36,6 +36,18 @@
line-height: 22px;
margin-bottom: 16px;
margin-left: -16px;
position: relative;
padding-left: 14px;
&::before {
content: "";
position: absolute;
left: 0px;
top: 50%;
transform: translateY(-50%);
width: 4px;
height: 10px;
background: #2966FF;
}
}
}
.label{
......@@ -98,7 +110,7 @@
.select-day {
margin-bottom: 4px;
.mark-day {
color: #FFB714;
color: #2966FF;
}
}
}
......@@ -165,7 +177,6 @@
width: 100%;
height: 100%;
object-fit: contain;
border: 1px solid #E8e8e8;
}
}
......@@ -173,7 +184,7 @@
.default-btn {
margin-left: 16px;
color: #5289FA;
color: #2966FF;
cursor: pointer;
&.disabled {
......@@ -219,11 +230,11 @@
position: fixed;
bottom: 0;
height: 58px;
width: 100%;
width: ~'calc(100% - 218px)';
display: flex;
align-items: center;
justify-content: flex-end;
padding-right: 252px;
padding-right: 72px;
background: #fff;
border-top: 1px solid #E8E8E8;
z-index: 999;
......
......@@ -13,7 +13,7 @@
width: 4px;
height: 16px;
content: '';
background: #FFB714;
background: #2966FF;
left: 0;
top: 5px;
}
......@@ -66,7 +66,7 @@
}
}
.calendar-text {
color: #FF9D14;
color: #2966FF;
line-height: 20px;
margin: 0 44px;
}
......@@ -85,7 +85,8 @@
cursor: pointer;
}
&.selected {
background: rgba(255, 183, 20, 0.06);
background: #E9EFFF;
color: #2966FF;
}
}
}
......
/*
* @Author: 吴文洁
* @Date: 2020-08-05 10:12:45
* @LastEditors: zhangleyuan
* @LastEditTime: 2021-03-27 16:24:47
* @LastEditors: Please set LastEditors
* @LastEditTime: 2021-05-27 20:14:01
* @Description: 视频课-列表模块
* @Copyright: 杭州杰竞科技有限公司 版权所有
*/
......@@ -123,7 +123,7 @@ class OfflineCourseList extends React.Component {
{
title: <span>
<span>学院展示</span>
<Tooltip title={<div>开启后,学员可在学院内查看到此课程。若课程“取消”,则系统会自动“关闭”学院展示。<br/>关闭后,学院内不再展示此课程,但学员仍可通过分享的海报/链接查看此课程。</div>}><i className="icon iconfont" style={{ marginLeft: '5px',cursor:'pointer',color:'#bfbfbf',fontSize:'14px'}}>&#xe61d;</i></Tooltip>
<Tooltip title={<div>开启后,学员可在学院内查看到此课程。若课程“取消”,则系统会自动“关闭”学院展示。<br/>关闭后,学院内不再展示此课程,但学员仍可通过分享的海报/链接查看此课程。</div>}><i className="icon iconfont" style={{ marginLeft: '5px',cursor:'pointer',color:'#bfbfbf',fontSize:'14px',fontWeight:'normal'}}>&#xe61d;</i></Tooltip>
</span>,
width: 120,
dataIndex: "courseware",
......@@ -200,7 +200,7 @@ class OfflineCourseList extends React.Component {
<span className="operate-text">更多</span>
<span
className="iconfont icon"
style={{ color: "#5289FA" }}
style={{ color: "#2966FF" }}
>
&#xe824;
</span>
......
......@@ -28,14 +28,14 @@
padding:16px;
}
.operate-text {
color: #5289FA;
color: #2966FF;
cursor: pointer;
}
.operate {
display: flex;
&__item {
color: #5289FA;
color: #2966FF;
cursor: pointer;
&.split {
......
......@@ -87,8 +87,8 @@ class PreviewOfflineModal extends React.Component {
signOutEndTimeUnit,
} = this.state;
const unit = (signInTimeUnit || '').toLocaleLowerCase() + 's';
const time = (signInType == 'START_AGO' ? startTime : endTime) && moment(signInType == 'START_AGO' ? startTime : endTime).subtract(signInTimeNum, unit);
const signInTime = (time && signInTimeNum) && `${moment(time).format('HH:mm')} ~ ${moment(signInType == 'START_AGO' ? startTime : endTime).format('HH:mm')}`;
const time = (signInType === 'START_AGO' ? startTime : endTime) && moment(signInType === 'START_AGO' ? startTime : endTime).subtract(signInTimeNum, unit);
const signInTime = (time && signInTimeNum) && `${moment(time).format('HH:mm')} ~ ${moment(signInType === 'START_AGO' ? startTime : endTime).format('HH:mm')}`;
const endUnit = (signOutEndTimeUnit || '').toLocaleLowerCase() + 's';
const end = (endTime && signOutEndTimeNum) && moment(endTime).add(signOutEndTimeNum, endUnit);
let startUnit = '';
......@@ -108,7 +108,7 @@ class PreviewOfflineModal extends React.Component {
footer={null}
maskClosable={false}
closeIcon={<span className="icon iconfont modal-close-icon">&#xe6ef;</span>}
className="preview-live-graphics-modal"
className="preview-offline-modal"
>
<div className="container__wrap">
<div className="container">
......
.preview-live-graphics-modal {
.preview-offline-modal {
.ant-modal-body {
background-image: url('https://image.xiaomaiketang.com/xm/xZWdziTCAf.png');
background-size: 100% 100%;
......@@ -13,7 +13,7 @@
}
.container {
overflow: scroll;
overflow: auto;
height: 100%;;
&__header {
position: relative;
......@@ -134,7 +134,7 @@
content: '';
width: 2px;
height: 14px;
background: #FFB714;
background: #2966FF;
left: 0;
top: 2px;
}
......
/*
* @Author: 吴文洁
* @Date: 2020-08-05 10:07:47
* @LastEditors: fusanqiasng
* @LastEditTime: 2021-05-24 21:04:03
* @LastEditors: wufan
* @LastEditTime: 2021-05-30 20:35:49
* @Description: 视频课新增/编辑页
* @Copyright: 杭州杰竞科技有限公司 版权所有
*/
......@@ -684,7 +684,7 @@ class AddVideoCourse extends React.Component {
</div>
</div>
<div className='footer'>
<div className="footer shrink-footer">
<Button onClick={this.handleGoBack}>取消</Button>
<Button onClick={this.handleShowPreviewModal}>预览</Button>
<Button type='primary' onClick={_.debounce(() => this.handleSubmit(), 3000, true)}>
......
.add-video-course-page {
position:relative !important;
.box{
margin-bottom:66px !important;
margin-bottom:52px !important;
}
.ant-radio-group {
display: flex;
......@@ -129,13 +129,14 @@
.footer {
position: fixed;
left: 196px;
bottom: 0;
height: 58px;
width: 100%;
width: ~'calc(100% - 218px)';
display: flex;
align-items: center;
justify-content: flex-end;
padding-right: 252px;
padding-right: 72px;
background: #fff;
border-top: 1px solid #E8E8E8;
z-index: 999;
......
/*
* @Author: 吴文洁
* @Date: 2020-08-05 10:12:45
* @LastEditors: fusanqiasng
<<<<<<< HEAD
* @LastEditTime: 2021-05-30 10:45:55
=======
<<<<<<< Updated upstream
* @LastEditTime: 2021-05-27 17:48:31
=======
* @LastEditTime: 2021-05-27 19:13:55
>>>>>>> Stashed changes
>>>>>>> feature/pangguoming/20210520/external_courses
* @Description: 视频课-列表模块
* @Copyright: 杭州杰竞科技有限公司 版权所有
*/
import React from 'react'
import { Table, Modal, message, Tooltip, Switch, Dropdown } from 'antd'
import _ from 'underscore'
import { PageControl } from '@/components'
import { LIVE_SHARE } from '@/domains/course-domain/constants'
import React from "react"
import { Table, Modal, message, Tooltip, Switch, Dropdown } from "antd"
import _ from "underscore"
import { PageControl } from "@/components"
import { LIVE_SHARE } from "@/domains/course-domain/constants"
import ShareLiveModal from '@/modules/course-manage/modal/ShareLiveModal'
import WatchDataModal from '../modal/WatchDataModal'
import CourseService from '@/domains/course-domain/CourseService'
import RelatedPlanModal from '../../modal/RelatedPlanModal'
import User from '@/common/js/user'
import ShareLiveModal from "@/modules/course-manage/modal/ShareLiveModal"
import WatchDataModal from "../modal/WatchDataModal"
import CourseService from "@/domains/course-domain/CourseService"
import RelatedPlanModal from "../../modal/RelatedPlanModal"
import User from "@/common/js/user"
import './VideoCourseList.less'
import "./VideoCourseList.less"
class VideoCourseList extends React.Component {
constructor(props) {
super(props)
this.state = {
id: '', // 视频课ID
id: "", // 视频课ID
studentIds: [],
RelatedPlanModalVisible: false,
selectPlanList: {},
ShelfLoading: false,
ShelfLoading: false
// dataSource: [],
}
}
componentDidMount() {
const videoCourseItem = localStorage.getItem('videoCourseItem')
const videoCourseItem = localStorage.getItem("videoCourseItem")
if (videoCourseItem) {
const _videoCourseItem = JSON.parse(videoCourseItem)
this.handleShowShareModal(_videoCourseItem, true)
......@@ -57,7 +41,7 @@ class VideoCourseList extends React.Component {
data={record}
close={() => {
this.setState({
watchDataModal: null,
watchDataModal: null
})
}}
/>
......@@ -71,11 +55,11 @@ class VideoCourseList extends React.Component {
const { ShelfLoading } = this.state
const columns = [
{
title: '视频课',
key: 'scheduleName',
dataIndex: 'scheduleName',
title: "视频课",
key: "scheduleName",
dataIndex: "scheduleName",
width: 321,
fixed: 'left',
fixed: "left",
render: (val, record) => {
const { coverUrl, scheduleVideoUrl } = record
return (
......@@ -85,7 +69,7 @@ class VideoCourseList extends React.Component {
className='course-cover'
src={
coverUrl ||
(type === 'internal' ? `${scheduleVideoUrl}?x-oss-process=video/snapshot,t_0,m_fast` : 'https://image.xiaomaiketang.com/xm/mt3ZQRxGKB.png')
(type === "internal" ? `${scheduleVideoUrl}?x-oss-process=video/snapshot,t_0,m_fast` : "https://image.xiaomaiketang.com/xm/mt3ZQRxGKB.png")
}
alt=''
/>
......@@ -101,31 +85,31 @@ class VideoCourseList extends React.Component {
</Choose>
</div>
)
},
}
},
{
title: (
<span>
<span>课程分类</span>
<If condition={type !== 'internal'}>
<If condition={type !== "internal"}>
<Tooltip title={<div>外部课程的分类由系统提供,不影响企业课程分类。</div>}>
<i className='icon iconfont' style={{ marginLeft: '5px', cursor: 'pointer', color: '#bfbfbf', fontSize: '14px', fontWeight: 'normal' }}>
<i className='icon iconfont' style={{ marginLeft: "5px", cursor: "pointer", color: "#bfbfbf", fontSize: "14px", fontWeight: "normal" }}>
&#xe61d;
</i>
</Tooltip>
</If>
</span>
),
key: 'categoryName',
dataIndex: 'categoryName',
key: "categoryName",
dataIndex: "categoryName",
width: 200,
render: (val, record) => {
return (
<Choose>
<When condition={type === 'internal'}>
<When condition={type === "internal"}>
<div className='record__item'>
{record.categoryOneName}
{record.categoryTwoName ? `-${record.categoryTwoName}` : ''}
{record.categoryTwoName ? `-${record.categoryTwoName}` : ""}
</div>
</When>
<Otherwise>
......@@ -133,12 +117,12 @@ class VideoCourseList extends React.Component {
</Otherwise>
</Choose>
)
},
}
},
{
title: '创建人',
key: 'createName',
dataIndex: 'createName',
title: "创建人",
key: "createName",
dataIndex: "createName",
width: 100,
render: (val) => {
return (
......@@ -150,7 +134,7 @@ class VideoCourseList extends React.Component {
)}
</div>
)
},
}
},
{
title: (
......@@ -164,62 +148,62 @@ class VideoCourseList extends React.Component {
关闭后,学院内不再展示此课程,但学员仍可通过分享的海报/链接查看此课程。
</div>
}>
<i className='icon iconfont' style={{ marginLeft: '5px', cursor: 'pointer', color: '#bfbfbf', fontSize: '14px' }}>
<i className='icon iconfont' style={{ marginLeft: "5px", cursor: "pointer", color: "#bfbfbf", fontSize: "14px" }}>
&#xe61d;
</i>
</Tooltip>
</span>
),
width: 120,
key: 'shelfState',
dataIndex: 'shelfState',
key: "shelfState",
dataIndex: "shelfState",
render: (val, item, index) => {
return (
<Switch
loading={ShelfLoading}
checked={item.shelfState === 'YES'}
checked={item.shelfState === "YES"}
defaultChecked={item.shelfState}
onClick={(checked) => {
this.changeShelfState(checked, item, index)
}}
/>
)
},
}
},
{
title: '观看学员数',
title: "观看学员数",
width: 110,
key: 'watchUserCount',
dataIndex: 'watchUserCount',
key: "watchUserCount",
dataIndex: "watchUserCount",
render: (val, item) => {
return <div className='watchUserCount'>{val || 0}</div>
},
}
},
{
title: '创建时间',
title: "创建时间",
width: 181,
key: 'created',
dataIndex: 'created',
key: "created",
dataIndex: "created",
sorter: true,
render: (val) => {
return formatDate('YYYY-MM-DD H:i', val)
},
return formatDate("YYYY-MM-DD H:i", val)
}
},
{
title: '更新时间',
title: "更新时间",
width: 181,
key: 'updated',
dataIndex: 'updated',
key: "updated",
dataIndex: "updated",
sorter: true,
render: (val) => {
return formatDate('YYYY-MM-DD H:i', val)
},
return formatDate("YYYY-MM-DD H:i", val)
}
},
{
title: '关联项',
title: "关联项",
width: 200,
key: 'planList',
dataIndex: 'planList',
key: "planList",
dataIndex: "planList",
render: (val, record) => {
return (
<div className='related-task'>
......@@ -241,14 +225,14 @@ class VideoCourseList extends React.Component {
</Choose>
</div>
)
},
}
},
{
title: '操作',
key: 'operate',
dataIndex: 'operate',
title: "操作",
key: "operate",
dataIndex: "operate",
width: 210,
fixed: 'right',
fixed: "right",
render: (val, record) => {
return (
<div className='operate'>
......@@ -256,7 +240,7 @@ class VideoCourseList extends React.Component {
观看数据
</div>
<If condition={type === 'internal'}>
<If condition={type === "internal"}>
<span className='operate__item split'> | </span>
<div className='operate__item' onClick={() => this.handleShowShareModal(record)}>
分享
......@@ -266,18 +250,18 @@ class VideoCourseList extends React.Component {
<Dropdown overlay={this.renderMoreOperate(record)}>
<span className='more-operate'>
<span className='operate-text'>更多</span>
<span className='iconfont icon' style={{ color: '#2966FF' }}>
<span className='iconfont icon' style={{ color: "#2966FF" }}>
&#xe824;
</span>
</span>
</Dropdown>
</div>
)
},
},
}
}
]
type !== 'internal' && columns.splice(2, 1)
type !== "internal" && columns.splice(2, 1)
return columns
}
......@@ -285,17 +269,17 @@ class VideoCourseList extends React.Component {
const { type } = this.props
return (
<div className='live-course-more-menu'>
<If condition={type !== 'internal'}>
<If condition={type !== "internal"}>
<div className='operate__item' onClick={() => this.handleShowShareModal(item)}>
分享
</div>
</If>
{(User.getUserRole() === 'CloudManager' || User.getUserRole() === 'StoreManager') && (
{(User.getUserRole() === "CloudManager" || User.getUserRole() === "StoreManager") && (
<div className='operate__item' onClick={() => this.handleRelatedModalShow(item)}>
关联培训计划
</div>
)}
<If condition={type === 'internal'}>
<If condition={type === "internal"}>
<div
className='operate__item'
onClick={() => {
......@@ -312,10 +296,10 @@ class VideoCourseList extends React.Component {
}
handlePlanName = (planArray) => {
let planStr = ''
let planStr = ""
planArray.map((item, index) => {
if (index < planArray.length - 1) {
planStr = planStr + item.planName + '、'
planStr = planStr + item.planName + "、"
} else {
planStr = planStr + item.planName
}
......@@ -324,21 +308,21 @@ class VideoCourseList extends React.Component {
}
//改变上架状态
changeShelfState = (checked, item, index) => {
let _shelfState = checked ? 'YES' : 'NO'
let _shelfState = checked ? "YES" : "NO"
if (checked) {
_shelfState = 'YES'
_shelfState = "YES"
} else {
_shelfState = 'NO'
_shelfState = "NO"
}
const params = {
courseId: item.id,
shelfState: _shelfState,
shelfState: _shelfState
}
CourseService.changeVideoShelfState(params).then(() => {
if (_shelfState === 'YES') {
message.success('已开启展示')
if (_shelfState === "YES") {
message.success("已开启展示")
} else {
message.success('已取消展示')
message.success("已取消展示")
}
this.props.changeShelfState(index, _shelfState)
})
......@@ -347,22 +331,22 @@ class VideoCourseList extends React.Component {
// 删除视频课
handleDeleteVideoCourse = (scheduleId) => {
Modal.confirm({
title: '你确定要删除此视频课吗?',
content: '删除后,学员将不能进行观看。',
title: "你确定要删除此视频课吗?",
content: "删除后,学员将不能进行观看。",
icon: <span className='icon iconfont default-confirm-icon'>&#xe6f4;</span>,
okText: '确定',
okType: 'danger',
cancelText: '取消',
okText: "确定",
okType: "danger",
cancelText: "取消",
onOk: () => {
const param = {
courseId: scheduleId,
storeId: User.getStoreId(),
storeId: User.getStoreId()
}
CourseService.delVideoSchedule(param).then(() => {
message.success('删除成功')
message.success("删除成功")
this.props.onChange()
})
},
}
})
}
......@@ -377,7 +361,7 @@ class VideoCourseList extends React.Component {
longUrl,
coverUrl,
scheduleVideoUrl,
courseName,
courseName
}
const shareLiveModal = (
......@@ -389,9 +373,9 @@ class VideoCourseList extends React.Component {
title='视频课'
close={() => {
this.setState({
shareLiveModal: null,
shareLiveModal: null
})
localStorage.setItem('videoCourseItem', '')
localStorage.setItem("videoCourseItem", "")
}}
/>
)
......@@ -404,25 +388,25 @@ class VideoCourseList extends React.Component {
const { query } = this.props
let { order: _order } = query
// 按创建时间升序排序
if (columnKey === 'created' && order === 'ascend') {
_order = 'CREATED_ASC'
if (columnKey === "created" && order === "ascend") {
_order = "CREATED_ASC"
}
// 按创建时间降序排序
if (columnKey === 'created' && order === 'descend') {
_order = 'CREATED_DESC'
if (columnKey === "created" && order === "descend") {
_order = "CREATED_DESC"
}
// 按更新时间升序排序
if (columnKey === 'updated' && order === 'ascend') {
_order = 'UPDATED_ASC'
if (columnKey === "updated" && order === "ascend") {
_order = "UPDATED_ASC"
}
// 按更新时间降序排序
if (columnKey === 'updated' && order === 'descend') {
_order = 'UPDATED_DESC'
if (columnKey === "updated" && order === "descend") {
_order = "UPDATED_DESC"
}
const _query = {
...query,
orderEnum: _order,
orderEnum: _order
}
this.props.onChange(_query)
}
......@@ -439,23 +423,23 @@ class VideoCourseList extends React.Component {
this.setState({
RelatedPlanModalVisible: true,
selectCourseId: item.id,
selectPlanList: selectPlanList,
selectPlanList: selectPlanList
})
}
closeRelatedPlanModalVisible = () => {
this.setState({
RelatedPlanModalVisible: false,
RelatedPlanModalVisible: false
})
}
onChangeSelectPlanList = (selectPlanList) => {
this.setState({
selectPlanList: selectPlanList,
selectPlanList: selectPlanList
})
}
onConfirmSelectPlanList = () => {
this.setState(
{
RelatedPlanModalVisible: false,
RelatedPlanModalVisible: false
},
() => {
this.props.onChange()
......@@ -467,7 +451,7 @@ class VideoCourseList extends React.Component {
const { current, size } = query
const { RelatedPlanModalVisible, selectPlanList, selectCourseId } = this.state
return (
<div className={`video-course-list ${type !== 'internal' ? 'video-course-list-mt' : ''}`}>
<div className={`video-course-list ${type !== "internal" ? "video-course-list-mt" : ""}`}>
<Table
rowKey={(record) => record.id}
dataSource={dataSource}
......
......@@ -31,14 +31,14 @@
padding: 16px;
}
.operate-text {
color: #5289fa;
color: #2966FF;
cursor: pointer;
}
.operate {
display: flex;
&__item {
color: #5289fa;
color: #2966FF;
cursor: pointer;
&.split {
......@@ -59,7 +59,6 @@
height: 50px;
border-radius: 2px;
margin-right: 8px;
// background-color: #666;
}
.course-name {
......
......@@ -189,13 +189,13 @@ class Home extends React.Component {
}
}
})
this._chart.line().position('time*studyNum').color('#5289FA').tooltip('time*studyNum', function( time, studyNum){
this._chart.line().position('time*studyNum').color('#2966FF').tooltip('time*studyNum', function( time, studyNum){
return {
name: '学习人数',
value: studyNum + '人'
}
});
this._chart.line().position('time*studyTime').color('#FFB714').tooltip('time*studyTime', function( time, studyTime){
this._chart.line().position('time*studyTime').color('#FFBB54').tooltip('time*studyTime', function( time, studyTime){
return {
name: '人均学习时长',
value: studyTime + '分钟'
......@@ -265,8 +265,9 @@ class Home extends React.Component {
};
return (
<div className="home-page">
<div className="home-title">数据概况</div>
<div className="data-box">
<div className="data-wrap">
<div className="home-title">数据概况</div>
<div className="data-box">
<div className="data-item">
<div className="header">
<img className="header-icon" src="https://image.xiaomaiketang.com/xm/wAaFtjeRsM.png" />
......@@ -364,65 +365,67 @@ class Home extends React.Component {
</div>
</div>
</div>
<div className="home-title">学习概况</div>
<div className="study-box">
<div className="study-item">
<div className="study-title">课程学习排行榜</div>
<div className="study-header">
<div className="study-tab">
<span
className={`tab${scheduleType === 'LIVE' ? ' selected' : ''}`}
onClick={() => this.setState({ scheduleType: 'LIVE' }, () => this.getHotCourse())}
>直播课</span>
<span
className={`tab${scheduleType === 'VOICE' ? ' selected' : ''}`}
onClick={() => this.setState({ scheduleType: 'VOICE' }, () => this.getHotCourse())}
>视频课</span>
<span
className={`tab${scheduleType === 'PICTURE' ? ' selected' : ''}`}
onClick={() => this.setState({ scheduleType: 'PICTURE' }, () => this.getHotCourse())}
>图文课</span>
</div>
<div className="study-select">
<span className="select-word">{moment().subtract(timeRange - 1, 'day').format('MM.DD')} ~ {moment().format('MM.DD')}</span>
<Select
style={{ width: 88 }}
value={timeRange}
onChange={(value) => {
this.setState({ timeRange: value }, () => this.getHotCourse());
}}
>
<Option value="7">近7天</Option>
<Option value="15">近15天</Option>
<Option value="30">近30天</Option>
</Select>
</div>
</div>
{_.isEmpty(list) ?
<div className="study-empty">
<img src="https://image.xiaomaiketang.com/xm/52dmait5Bx.png" />
<div>暂无课程上榜</div>
</div>
<div className="study-wrap">
<div className="home-title">学习概况</div>
<div className="study-box">
<div className="study-item">
<div className="study-title">课程学习排行榜</div>
<div className="study-header">
<div className="study-tab">
<span
className={`tab${scheduleType === 'LIVE' ? ' selected' : ''}`}
onClick={() => this.setState({ scheduleType: 'LIVE' }, () => this.getHotCourse())}
>直播课</span>
<span
className={`tab${scheduleType === 'VOICE' ? ' selected' : ''}`}
onClick={() => this.setState({ scheduleType: 'VOICE' }, () => this.getHotCourse())}
>视频课</span>
<span
className={`tab${scheduleType === 'PICTURE' ? ' selected' : ''}`}
onClick={() => this.setState({ scheduleType: 'PICTURE' }, () => this.getHotCourse())}
>图文课</span>
</div>
<div className="study-select">
<span className="select-word">{moment().subtract(timeRange - 1, 'day').format('MM.DD')} ~ {moment().format('MM.DD')}</span>
<Select
style={{ width: 88 }}
value={timeRange}
onChange={(value) => {
this.setState({ timeRange: value }, () => this.getHotCourse());
}}
>
<Option value="7">近7天</Option>
<Option value="15">近15天</Option>
<Option value="30">近30天</Option>
</Select>
</div>
</div>
: list.map((item, index) => (
<div className={`table-item${index % 2 ? '' : ' odd'}`} key={item.id}>
{index < 3 ?
<span className="table-number"><img src={this.showNumber(index)} className="table-image" /></span>
: <span className="table-number">{index + 1}</span>
}
<div className="table-data">
<div className="table-name">
<Tooltip title={item.courseName}>
{item.courseName}
</Tooltip>
{_.isEmpty(list) ?
<div className="study-empty">
<img src="https://image.xiaomaiketang.com/xm/52dmait5Bx.png" />
<div>暂无课程上榜</div>
</div>
: list.map((item, index) => (
<div className={`table-item${index % 2 ? '' : ' odd'}`} key={item.id}>
{index < 3 ?
<span className="table-number"><img src={this.showNumber(index)} className="table-image" /></span>
: <span className="table-number">{index + 1}</span>
}
<div className="table-data">
<div className="table-name">
<Tooltip title={item.courseName}>
{item.courseName}
</Tooltip>
</div>
<div className="table-tag">{item.categoryName}</div>
</div>
<div className="table-tag">{item.categoryName}</div>
<span className="table-study">{item.studyNum || 0}人已学习</span>
</div>
<span className="table-study">{item.studyNum || 0}人已学习</span>
</div>
))
}
</div>
<div className="study-item">
))
}
</div>
<div className="study-item">
<div className="study-title">培训计划完成情况
<Tooltip overlayClassName="data-plan-tooltip" title="若某人加入多个培训计划,则需完成所有已加入的培训计划后,才视为已完成培训">
<span className="iconfont icon">&#xe61d;</span>
......@@ -461,7 +464,7 @@ class Home extends React.Component {
<Geom
type="intervalStack"
position="percent"
color={['item', ['#FDB513', '#5289FA']]}
color={['item', ['#FFBB54', '#2966FF']]}
tooltip={[
"item*percent",
(item, percent) => {
......@@ -504,6 +507,7 @@ class Home extends React.Component {
<div className="word">完成培训</div>
</div>
</div>
</div>
</div>
<div className="study-chart">
<div className="study-title">学习人数与时长
......
.home-page {
padding: 0 16px 16px;
// padding: 0 16px 16px;
min-width: 1100px;
position: relative;
z-index:3;
.g2-tooltip-marker {
border-radius: 50% !important;
}
.home-title {
height: 44px;
line-height: 44px;
color: #999;
color: #333;
padding-left:28px;
font-size:16px;
font-weight:bold;
position: relative;
padding-top:16px;
&::before{
width:4px;
height:12px;
content:'';
background-image: linear-gradient(#2966FF 83.5%, #0ACCA4 16.5%);
display:inline-block;
position: absolute;
left:16px;
top:22px;
}
}
@font-face {
font-family: 'number';
src: url('https://image.xiaomaiketang.com/xm/n2sADd2jY6.TTF');
}
.data-box {
display: flex;
justify-content: space-between;
.data-item {
position: relative;
height: 156px;
background: #fff;
width: ~'calc(16.67% - 8px)';
padding: 16px;
&.course-data {
width: ~'calc(50% - 24px)';
}
.header {
display: flex;
.header-icon {
width: 18px;
height: 18px;
margin-right: 4px;
}
.header-word {
display: inline-block;
font-size: 12px;
line-height: 18px;
color: #999;
}
}
.data-number {
font-family: 'number';
font-size: 28px;
color: #333;
margin-top: 24px;
}
.data-footer {
margin-top: 12px;
.footer-word {
font-size: 12px;
color: #999;
margin-right: 8px;
.data-wrap{
background: #FFF;
.data-box {
display: flex;
justify-content: space-between;
padding-left: 10px;
.data-item {
position: relative;
height: 156px;
background: #fff;
width: ~'calc(16.67% - 8px)';
padding: 16px;
&.course-data {
width: ~'calc(50% - 24px)';
}
.iconfont {
font-size: 12px;
margin-right: 4px;
color: #EC4B35;
.header {
display: flex;
.header-icon {
width: 18px;
height: 18px;
margin-right: 4px;
}
.header-word {
display: inline-block;
font-size: 14px;
line-height: 18px;
color: #333;
font-weight:500;
}
}
.footer-number {
font-size: 12px;
color: #999;
.data-number {
font-family: 'number';
font-size: 28px;
color: #333;
margin-top: 24px;
}
}
.course-box {
border-radius: 4px;
background: #FAFAFA;
height: 124px;
width: 66%;
position: absolute;
right: 16px;
top: 16px;
padding: 8px 24px 0;
.course-item {
display: inline-block;
width: 50%;
padding: 4px 0 12px;
.course-title {
.data-footer {
margin-top: 12px;
.footer-word {
font-size: 12px;
color: #999;
margin-right: 8px;
}
.iconfont {
font-size: 12px;
margin-right: 4px;
color: #EC4B35;
}
.footer-number {
font-size: 12px;
color: #999;
}
.data {
display: flex;
align-items: flex-end;
.course-number {
font-size: 16px;
font-family: 'number';
margin-right: 16px;
}
.course-word {
}
.course-box {
border-radius: 4px;
background: #FAFAFA;
height: 124px;
width: 66%;
position: absolute;
right: 16px;
top: 16px;
padding: 8px 24px 0;
.course-item {
display: inline-block;
width: 50%;
padding: 4px 0 12px;
.course-title {
font-size: 12px;
color: #999;
margin-right: 8px;
}
.iconfont {
font-size: 12px;
margin-right: 4px;
color: #EC4B35;
}
.add-number {
font-size: 12px;
color: #999;
.data {
display: flex;
align-items: flex-end;
.course-number {
font-size: 16px;
font-family: 'number';
margin-right: 16px;
}
.course-word {
font-size: 12px;
color: #999;
margin-right: 8px;
}
.iconfont {
font-size: 12px;
margin-right: 4px;
color: #EC4B35;
}
.add-number {
font-size: 12px;
color: #999;
}
}
}
}
}
}
}
.study-box {
display: flex;
justify-content: space-between;
.study-item {
position: relative;
height: 414px;
background: #fff;
width: ~'calc(50% - 8px)';
padding: 16px;
overflow: hidden;
.study-title {
font-size: 16px;
color: #333;
font-weight: 500;
line-height: 22px;
margin-bottom: 12px;
.iconfont {
font-size: 14px;
color: #BFBFBF;
margin-left: 4px;
}
.tip {
.study-wrap{
background: #FFF;
margin-top:16px;
.study-box {
display: flex;
justify-content: space-between;
padding-left: 10px;
.study-item {
position: relative;
height: 414px;
background: #fff;
width: ~'calc(50% - 8px)';
padding: 16px;
overflow: hidden;
.study-title {
font-size: 14px;
color: #999999;
margin-left: 8px;
font-weight: 400;
color: #333;
font-weight: 500;
line-height: 22px;
margin-bottom: 12px;
.iconfont {
font-size: 14px;
color: #BFBFBF;
margin-left: 4px;
}
.tip {
font-size: 14px;
color: #999999;
margin-left: 8px;
font-weight: 400;
}
}
}
.study-header {
display: flex;
justify-content: space-between;
margin-bottom: 16px;
.study-tab {
.tab {
position: relative;
padding-right: 24px;
color: #666;
cursor: pointer;
&.selected {
color: #FDB513;
&::after {
position: absolute;
width: 24px;
height: 2px;
content: '';
background: #FDB513;
border-radius: 1px;
left: 9px;
bottom: -4px;
.study-header {
display: flex;
justify-content: space-between;
margin-bottom: 16px;
.study-tab {
.tab {
position: relative;
padding-right: 24px;
color: #666;
cursor: pointer;
&.selected {
color: #2966FF;
&::after {
position: absolute;
width: 24px;
height: 2px;
content: '';
background: #2966FF;
border-radius: 1px;
left: 9px;
bottom: -4px;
}
}
}
}
.study-select {
.select-word {
color: #999;
margin-right: 8px;
}
}
}
.study-select {
.select-word {
.table-item {
width: 100%;
height: 60px;
display: flex;
align-items: center;
&.odd {
background: #FAFAFA;
}
.table-image {
width: 24px;
height: 24px;
}
.table-number {
width: 15%;
color: #999;
margin-right: 8px;
padding: 0 16px;
text-align: center;
}
}
}
.table-item {
width: 100%;
height: 60px;
display: flex;
align-items: center;
&.odd {
background: #FAFAFA;
}
.table-image {
width: 24px;
height: 24px;
}
.table-number {
width: 15%;
color: #999;
padding: 0 16px;
text-align: center;
}
.table-data {
width: 55%;
padding: 0 16px;
.table-name {
color: #333;
line-height: 20px;
margin-bottom: 2px;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
.table-data {
width: 55%;
padding: 0 16px;
.table-name {
color: #333;
line-height: 20px;
margin-bottom: 2px;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
.table-tag {
line-height: 17px;
color: #999;
font-size: 12px;
}
}
.table-tag {
line-height: 17px;
.table-study {
width: 30%;
color: #999;
font-size: 12px;
padding: 0 16px;
}
}
.table-study {
width: 30%;
color: #999;
padding: 0 16px;
}
}
.study-empty {
margin-top: 102px;
img {
display: block;
width: 100px;
height: 100px;
margin: 0 auto 8px;
}
div {
text-align: center;
color: #333;
.study-empty {
margin-top: 102px;
img {
display: block;
width: 100px;
height: 100px;
margin: 0 auto 8px;
}
div {
text-align: center;
color: #333;
}
}
}
.circle-box {
width: 70%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
.big-circle {
.circle-box {
width: 70%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
width: 204px;
height: 204px;
border-radius: 102px;
background: #F1F3F6;
margin-top: -20px;
.small-circle {
.big-circle {
display: flex;
align-items: center;
justify-content: center;
width: 124px;
height: 124px;
border-radius: 62px;
background: #fff;
.tip-box {
text-align: center;
width: 204px;
height: 204px;
border-radius: 102px;
background: #F1F3F6;
margin-top: -20px;
.small-circle {
display: flex;
align-items: center;
justify-content: center;
width: 124px;
height: 124px;
border-radius: 62px;
background: #fff;
.tip-box {
text-align: center;
}
}
}
}
}
.circle-tip {
position: absolute;
left: 70%;
padding-left: 16px;
&.unfinished {
top: 152px;
.spot {
background: #5289FA;
.circle-tip {
position: absolute;
left: 70%;
padding-left: 16px;
&.unfinished {
top: 152px;
.spot {
background: #2966FF;
}
}
&.finished {
top: 232px;
.spot {
background: #FFBB54;
}
}
}
&.finished {
top: 232px;
.spot {
background: #FFBB54;
position: absolute;
width: 8px;
height: 8px;
border-radius: 4px;
top: 20px;
left: 0;
}
.number {
color: #333;
font-size: 16px;
margin-bottom: 2px;
}
.word {
color: #999;
}
}
.spot {
position: absolute;
width: 8px;
height: 8px;
border-radius: 4px;
top: 20px;
left: 0;
}
.number {
color: #333;
font-size: 16px;
margin-bottom: 2px;
}
.word {
color: #999;
}
}
}
}
.study-chart {
width: 100%;
height: 432px;
background: #fff;
padding: 16px;
margin-top: 16px;
padding-bottom: 32px;
padding: 16px 16px 32px 26px;
.study-title {
font-size: 16px;
font-size: 14px;
color: #333;
font-weight: 500;
line-height: 22px;
......@@ -328,7 +352,7 @@
align-items: center;
color: #666;
.student-dot {
background: #5289FA;
background: #2966FF;
height: 8px;
width: 8px;
border-radius: 50%;
......
......@@ -12,7 +12,7 @@ const ENUM = {
UN_START: {
code: 1,
title: "待开课",
color: "#FFB714",
color: "#2966FF",
},
STARTING: {
code: 2,
......
......@@ -2,8 +2,8 @@
* @Description:
* @Author: zangsuyun
* @Date: 2021-03-19 18:05:23
* @LastEditors: yuananting
* @LastEditTime: 2021-04-15 21:46:41
* @LastEditors: wufan
* @LastEditTime: 2021-05-30 16:48:46
* @Copyright: © 2020 杭州杰竞科技有限公司 版权所有
*/
......@@ -193,10 +193,10 @@ class Classification extends Component {
className="sider-search"
placeholder="搜索名称分类"
onSearch={(value) => {
// TODO 调用查询分类接口
this.queryCategoryTree(value);
}}
enterButton={<span className="icon iconfont">&#xe832;</span>}
style={{width: 230}}
/>
<div className="sider-btn">
<Button
......
......@@ -2,8 +2,8 @@
* @Description:
* @Author: zangsuyun
* @Date: 2021-03-19 18:16:58
* @LastEditors: zangsuyun
* @LastEditTime: 2021-03-25 19:13:06
* @LastEditors: wufan
* @LastEditTime: 2021-05-30 10:19:47
* @Copyright: © 2020 杭州杰竞科技有限公司 版权所有
*/
......@@ -25,14 +25,14 @@
}
.sider-tree {
width: 266px;
width: 244px;
overflow: scroll;
height: ~'calc(100vh - 300px)';
.empty-tree-tip {
text-align: center;
margin-top: 100%;
.empty-tree-btn {
color: #ffb714;
color: #2966FF;
cursor: pointer;
}
}
......@@ -40,7 +40,7 @@
font-size: 14px;
font-weight: 400;
color: #666666;
width: 260px;
width: 234px;
.anticon {
color: #666666;
}
......@@ -52,12 +52,12 @@
white-space: nowrap;
}
.ant-tree-node-content-wrapper.ant-tree-node-selected {
color: #666666;
color: #2966FF;
}
}
.ant-tree-treenode-selected:hover::before,
.ant-tree-treenode-selected::before {
background: #fffbf1;
background: rgba(238, 243, 255, 1);
}
}
}
......
......@@ -3,92 +3,92 @@
* @Author: zangsuyun
* @Date: 2021-03-12 14:49:40
* @LastEditors: wufan
* @LastEditTime: 2021-05-13 16:35:41
* @LastEditTime: 2021-05-30 20:37:42
* @Copyright: © 2020 杭州杰竞科技有限公司 版权所有
*/
import React from "react";
import { Table, Modal, message, Tooltip, Switch, Dropdown, Button } from "antd";
import { Route, withRouter } from "react-router-dom";
import { PageControl } from "@/components";
import { LIVE_SHARE_MAP } from "@/common/constants/academic/cloudClass";
import { appId, shareUrl, LIVE_SHARE } from "@/domains/course-domain/constants";
import ScanFileModal from "../../resource-disk/modal/ScanFileModal";
import WatchData from "./WatchData";
import KnowledgeAPI from "@/data-source/knowledge/request-api";
import ENUM from "../ENUM.js";
import "./KnowledgeBaseList.less";
import React from "react"
import { Table, Modal, message, Tooltip, Switch, Dropdown, Button } from "antd"
import { Route, withRouter } from "react-router-dom"
import { PageControl } from "@/components"
import { LIVE_SHARE_MAP } from "@/common/constants/academic/cloudClass"
import { appId, shareUrl, LIVE_SHARE } from "@/domains/course-domain/constants"
import ScanFileModal from "../../resource-disk/modal/ScanFileModal"
import WatchData from "./WatchData"
import KnowledgeAPI from "@/data-source/knowledge/request-api"
import ENUM from "../ENUM.js"
import "./KnowledgeBaseList.less"
const DEFAULT_SIZE_UNIT = 1000 * 1000; // 将B转换成M
const { confirm } = Modal;
const ENV = process.env.DEPLOY_ENV || "dev";
const DEFAULT_SIZE_UNIT = 1000 * 1000 // 将B转换成M
const { confirm } = Modal
const ENV = process.env.DEPLOY_ENV || "dev"
class KnowledgeBaseList extends React.Component {
constructor(props) {
super(props);
super(props)
this.state = {
id: "",
scanFileModal:null
};
id: "",
scanFileModal: null
}
}
handleAdminName = (adminArray) => {
let adminStr = "";
let adminStr = ""
adminArray.map((item, index) => {
if (index < adminArray.length - 1) {
adminStr = adminStr + item.adminName + "、";
adminStr = adminStr + item.adminName + "、"
} else {
adminStr = adminStr + item.adminName;
adminStr = adminStr + item.adminName
}
});
return adminStr;
};
})
return adminStr
}
handleUp = (index, record) => {
if (index === 0 && this.props.query.current === 1) {
return;
return
}
const params = {
direction: "UP",
id: record.id,
storeId: record.storeId,
};
storeId: record.storeId
}
KnowledgeAPI.moveKnowledge(params).then((res) => {
if (res.success) {
message.success("更新成功");
this.props.onChange();
message.success("更新成功")
this.props.onChange()
}
});
};
})
}
handleDown = (record, index) => {
const { query, totalCount } = this.props;
const { current, size } = query;
const { query, totalCount } = this.props
const { current, size } = query
if (totalCount === size * (current - 1) + index + 1) {
return;
return
}
const params = {
direction: "DOWN",
id: record.id,
storeId: record.storeId,
};
storeId: record.storeId
}
KnowledgeAPI.moveKnowledge(params).then((res) => {
if (res.success) {
message.success("更新成功");
this.props.onChange();
message.success("更新成功")
this.props.onChange()
}
});
};
})
}
getBlob = (url) => {
return new Promise((resolve) => {
const xhr = new XMLHttpRequest()
xhr.open('GET', url, true)
xhr.responseType = 'blob'
xhr.open("GET", url, true)
xhr.responseType = "blob"
xhr.onload = () => {
if (xhr.status === 200) {
resolve(xhr.response)
......@@ -102,8 +102,8 @@ class KnowledgeBaseList extends React.Component {
if (window.navigator.msSaveOrOpenBlob) {
navigator.msSaveBlob(blob, filename)
} else {
const link = document.createElement('a')
const body = document.querySelector('body')
const link = document.createElement("a")
const body = document.querySelector("body")
// 创建对象url
link.href = window.URL.createObjectURL(blob)
......@@ -124,15 +124,15 @@ class KnowledgeBaseList extends React.Component {
this.saveAs(blob, folder.folderName)
})
}
// 预览文件
handleScanFile = (folder) => {
console.log(folder);
const { folderFormat, folderSize, ossUrl } = folder;
console.log(folder)
const { folderFormat, folderSize, ossUrl } = folder
switch (folderFormat) {
case "PDF":
window.open(ossUrl, "_blank");
break;
window.open(ossUrl, "_blank")
break
case "WORD":
case "DOCX":
case "DOC":
......@@ -141,11 +141,7 @@ class KnowledgeBaseList extends React.Component {
case "PPTX":
case "PDF":
if (
((folderFormat === "PPT" ||
folderFormat === "PPTX" ||
folderFormat === "DOCX" ||
folderFormat === "WORD" ||
folderFormat === "DOC") &&
((folderFormat === "PPT" || folderFormat === "PPTX" || folderFormat === "DOCX" || folderFormat === "WORD" || folderFormat === "DOC") &&
folderSize > 10 * DEFAULT_SIZE_UNIT) ||
(folderFormat === "EXCEL" && folderSize > 5 * DEFAULT_SIZE_UNIT)
) {
......@@ -157,33 +153,33 @@ class KnowledgeBaseList extends React.Component {
okText: "下载",
onOk: () => {
this.handleDownload(folder)
},
});
break;
}
})
break
}
const prefixUrl = "https://view.officeapps.live.com/op/view.aspx?src=";
const scanUrl = `${prefixUrl}${encodeURIComponent(ossUrl)}`;
window.open(scanUrl, "_blank");
break;
const prefixUrl = "https://view.officeapps.live.com/op/view.aspx?src="
const scanUrl = `${prefixUrl}${encodeURIComponent(ossUrl)}`
window.open(scanUrl, "_blank")
break
default:
const scanFileModal = (
<ScanFileModal
fileType={folderFormat}
item={folder}
close={() => {
this.setState({ scanFileModal: null });
this.setState({ scanFileModal: null })
}}
/>
);
this.setState({ scanFileModal });
break;
)
this.setState({ scanFileModal })
break
}
};
}
// 请求表头
parseColumns = () => {
const { query, totalCount } = this.props;
const { current, size } = query;
const { query, totalCount } = this.props
const { current, size } = query
const columns = [
{
title: "课程名称",
......@@ -192,131 +188,95 @@ class KnowledgeBaseList extends React.Component {
width: 391,
fixed: "left",
render: (val, record) => {
const { coverUrl, mediaCourseUrl } = record.source;
let hasCover = false;
const type = record.type;
const { coverUrl, mediaCourseUrl, courseDivision } = record.source
let hasCover = false
const type = record.type
return (
<div>
{type === "LIVE" && (
<div className="record__item">
<div className='record__item'>
{record.source &&
record.source.courseMediaVOS.map((item, index) => {
if (item.contentType === "COVER") {
hasCover = true;
return (
<img
className="course-cover"
key={index}
src={item.mediaUrl}
/>
);
hasCover = true
return <img className='course-cover' key={index} src={item.mediaUrl} />
}
})}
{!hasCover && (
<img
className="course-cover"
src={"https://image.xiaomaiketang.com/xm/YNfi45JwFA.png"}
src={"https://image.xiaomaiketang.com/xm/Yip2YtFDwH.png"}
/>
)}
<div>
{val.length > 17 ? (
<Tooltip title={val}>
<div className="course-name">{val}</div>
<div className='course-name'>{val}</div>
</Tooltip>
) : (
<div className="course-name">{val}</div>
<div className='course-name'>{val}</div>
)}
<div>
<span className="course-time">
{formatDate(
"YYYY-MM-DD H:i",
parseInt(record.source.startTime)
)}
~{formatDate("H:i", parseInt(record.source.endTime))}
<span className='course-time'>
{formatDate("YYYY-MM-DD H:i", parseInt(record.source.startTime))}~{formatDate("H:i", parseInt(record.source.endTime))}
</span>
<span
className="course-status"
className='course-status'
style={{
color:
ENUM.courseStateShow[record.source.courseState]
.color,
border: `1px solid ${
ENUM.courseStateShow[record.source.courseState]
.color
}`,
}}
>
color: ENUM.courseStateShow[record.source.courseState].color,
border: `1px solid ${ENUM.courseStateShow[record.source.courseState].color}`
}}>
{ENUM.courseStateShow[record.source.courseState].title}
</span>
{record.hideToUser && (
<Tooltip
title={
<div>课程未成功开课,已在学员知识列表中隐藏</div>
}
>
<Tooltip title={<div>课程未成功开课,已在学员知识列表中隐藏</div>}>
<i
className="icon iconfont"
className='icon iconfont'
style={{
marginLeft: "5px",
cursor: "pointer",
color: "#FF4F4F",
fontSize: "14px",
}}
>
fontSize: "14px"
}}>
&#xe61d;
</i>
</Tooltip>
)}
</div>
<div className="teacher-assistant">
<div className='teacher-assistant'>
{record.source.teacherName.length > 4 ? (
<Tooltip title={record.source.teacherName}>
<span className="teacher">
讲师:{record.source.teacherName}
</span>
<span className='teacher'>讲师:{record.source.teacherName}</span>
</Tooltip>
) : (
<span className="teacher">
讲师:{record.source.teacherName}
</span>
<span className='teacher'>讲师:{record.source.teacherName}</span>
)}
{record.source.admins.length > 0 && (
<>
<span className="split"> | </span>
{this.handleAdminName(record.source.admins).length >
4 ? (
<Tooltip
title={this.handleAdminName(record.source.admins)}
>
<span className="assistant">
<span className='split'> | </span>
{this.handleAdminName(record.source.admins).length > 4 ? (
<Tooltip title={this.handleAdminName(record.source.admins)}>
<span className='assistant'>
助教:
{record.source.admins.map((item, index) => {
return (
<span>
{item.adminName}{" "}
{index <
record.source.admins.length - 1 && (
<span></span>
)}{" "}
{item.adminName} {index < record.source.admins.length - 1 && <span></span>}{" "}
</span>
);
)
})}
</span>
</Tooltip>
) : (
<span className="assistant">
<span className='assistant'>
助教:
{record.source.admins.map((item, index) => {
return (
<span key={index}>
{item.adminName}{" "}
{index <
record.source.admins.length - 1 && (
<span></span>
)}{" "}
{item.adminName} {index < record.source.admins.length - 1 && <span></span>}{" "}
</span>
);
)
})}
</span>
)}
......@@ -328,21 +288,25 @@ class KnowledgeBaseList extends React.Component {
)}
{type === "VOICE" && (
<div className="record__item">
<div className='record__item'>
{/* 上传了封面的话就用上传的封面, 没有的话就取视频的第一帧 */}
<img
className="course-cover"
className='course-cover'
src={
coverUrl ||
`${mediaCourseUrl}?x-oss-process=video/snapshot,t_0,m_fast`
coverUrl
? coverUrl
: courseDivision !== "EXTERNAL"
? `${mediaCourseUrl}?x-oss-process=video/snapshot,t_0,m_fast`
: "https://image.xiaomaiketang.com/xm/mt3ZQRxGKB.png"
}
alt=''
/>
{val.length > 25 ? (
<Tooltip title={val}>
<div className="course-name clamp">{val}</div>
<div className='course-name clamp'>{val}</div>
</Tooltip>
) : (
<div className="course-name clamp">{val}</div>
<div className='course-name clamp'>{val}</div>
)}
</div>
)}
......@@ -353,63 +317,54 @@ class KnowledgeBaseList extends React.Component {
className="course-cover"
src={
coverUrl ||
"https://image.xiaomaiketang.com/xm/YNfi45JwFA.png"
"https://image.xiaomaiketang.com/xm/wFnpZtp2yB.png"
}
/>
{val.length > 25 ? (
<Tooltip title={val}>
<div className="course-name clamp">{val}</div>
<div className='course-name clamp'>{val}</div>
</Tooltip>
) : (
<div className="course-name clamp">{val}</div>
<div className='course-name clamp'>{val}</div>
)}
</div>
)}
{type === "FOLDER" && (
<div
className="record__item"
className='record__item'
onClick={() => {
this.handleScanFile(record.source);
}}
>
<div
className={`folder-type ${
record.source && record.source.folderFormat
}`}
/>
this.handleScanFile(record.source)
}}>
<div className={`folder-type ${record.source && record.source.folderFormat}`} />
{val.length > 25 ? (
<Tooltip title={val}>
<div className="course-name clamp">{val}</div>
<div className='course-name clamp'>{val}</div>
</Tooltip>
) : (
<div className="course-name clamp">{val}</div>
<div className='course-name clamp'>{val}</div>
)}
</div>
)}
</div>
);
},
)
}
},
{
title: "课程类型",
key: "type",
dataIndex: "type",
align:'center',
align: "center",
// width: 100,
render: (val, record) => {
return (
<div className="">
{val ? ENUM.CourseTypeEnum[val] : "-"}
</div>
);
},
return <div className=''>{val ? ENUM.CourseTypeEnum[val] : "-"}</div>
}
},
{
title: "创建人",
key: "createName",
dataIndex: "createName",
align:'center',
align: "center",
render: (val) => {
return (
<div>
......@@ -419,31 +374,27 @@ class KnowledgeBaseList extends React.Component {
</Tooltip>
)}
</div>
);
},
)
}
},
{
title: "观看学员数",
key: "watchUserCount",
dataIndex: "watchUserCount",
align:'right',
align: "right",
render: (val, item) => {
return val ? (
<div
className="operate"
style={{display:'block'}}
onClick={() => this.handleLinkToClassData(item)}
>
<span className="operate__item">{val}</span>
<div className='operate' style={{ display: "block" }} onClick={() => this.handleLinkToClassData(item)}>
<span className='operate__item'>{val}</span>
</div>
) : (
0
);
},
)
}
},
{
title: "",
width: 48,
width: 48
},
{
title: "操作",
......@@ -452,131 +403,111 @@ class KnowledgeBaseList extends React.Component {
width: 160,
fixed: "right",
render: (val, record, index) => {
console.log(this.props.categoryId);
console.log(this.props.categoryId)
return this.props.categoryId === "0" ? (
<div className="operate">
<div
className="operate__item"
onClick={() => this.handleDelete(record)}
>
<div className='operate'>
<div className='operate__item' onClick={() => this.handleDelete(record)}>
移出
</div>
</div>
) : (
<div className="operate">
<div
className={
index === 0 && current === 1
? "operate__item disable"
: "operate__item"
}
onClick={() => this.handleUp(index, record)}
>
<div className='operate'>
<div className={index === 0 && current === 1 ? "operate__item disable" : "operate__item"} onClick={() => this.handleUp(index, record)}>
上移
</div>
<span className="operate__item split"> | </span>
<span className='operate__item split'> | </span>
<div
className={
totalCount === size * (current - 1) + index + 1
? "operate__item disable"
: "operate__item"
}
onClick={() => this.handleDown(record, index)}
>
className={totalCount === size * (current - 1) + index + 1 ? "operate__item disable" : "operate__item"}
onClick={() => this.handleDown(record, index)}>
下移
</div>
<span className="operate__item split"> | </span>
<div
className="operate__item"
onClick={() => this.handleDelete(record)}
>
<span className='operate__item split'> | </span>
<div className='operate__item' onClick={() => this.handleDelete(record)}>
移出
</div>
</div>
);
},
},
];
return columns;
};
)
}
}
]
return columns
}
handleDelete = (record) => {
return confirm({
title: "移出知识",
content: "确定将分类中此知识移出吗?",
icon: (
<span className="icon iconfont default-confirm-icon">&#xe839; </span>
),
icon: <span className='icon iconfont default-confirm-icon'>&#xe839; </span>,
okText: "删除",
okType: "danger",
cancelText: "取消",
width: 440,
height: 188,
onOk: () => {
this.deleteConfirm(record);
},
});
};
this.deleteConfirm(record)
}
})
}
// 前往上课数据页面
handleLinkToClassData = (item) => {
const { match } = this.props;
console.log(item);
localStorage.setItem("WatchData_CourseName", item.name);
const { match } = this.props
console.log(item)
localStorage.setItem("WatchData_CourseName", item.name)
window.RCHistory.push({
// pathname: `${match.url}/course-data?type=${item.courseType}&id=${item.liveCourseId}`,
pathname: `${match.url}/course-data?type=${item.type}&id=${item.id}`,
});
};
pathname: `${match.url}/course-data?type=${item.type}&id=${item.id}`
})
}
deleteConfirm = (item) => {
const params = {
id: item.id,
storeId: item.storeId,
};
storeId: item.storeId
}
KnowledgeAPI.delKnowledge(params).then((res) => {
if (res.success) {
message.success("移出成功");
this.props.onChange();
this.props.updateCategoryTree();
message.success("移出成功")
this.props.onChange()
this.props.updateCategoryTree()
}
});
};
})
}
onShowSizeChange = (current, size) => {
if (current == size) {
return;
return
}
let _query = this.props.query;
_query.size = size;
this.props.onChange(_query);
};
let _query = this.props.query
_query.size = size
this.props.onChange(_query)
}
render() {
const { dataSource = [], totalCount, query, match } = this.props;
const { current, size } = query;
const { dataSource = [], totalCount, query, match } = this.props
const { current, size } = query
return (
<div className="knowledge-base-list">
<div className='knowledge-base-list'>
<Table
rowKey={(record) => record.id}
size="middle"
size='middle'
dataSource={dataSource}
columns={this.parseColumns()}
pagination={false}
scroll={{ x: 900 }}
bordered
className="knowledge-list-table"
className='knowledge-list-table'
/>
<div className="box-footer">
<div className='box-footer'>
{totalCount > 0 && (
<PageControl
current={current - 1}
pageSize={size}
total={totalCount}
toPage={(page) => {
const _query = { ...query, current: page + 1 };
this.props.onChange(_query);
const _query = { ...query, current: page + 1 }
this.props.onChange(_query)
}}
onShowSizeChange={this.onShowSizeChange}
/>
......@@ -586,10 +517,9 @@ class KnowledgeBaseList extends React.Component {
<Route path={`${match.url}/course-data`} component={WatchData} />
{this.state.scanFileModal}
</div>
);
)
}
}
export default withRouter(KnowledgeBaseList);
export default withRouter(KnowledgeBaseList)
......@@ -30,13 +30,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 {
......@@ -44,7 +44,7 @@
align-items: center;
flex-wrap: wrap;
.operate__item {
color: #5289fa;
color: #2966FF;
cursor: pointer;
&.split {
margin: 0 8px;
......@@ -57,7 +57,7 @@
}
}
.operate-text {
color: #5289fa;
color: #2966FF;
cursor: pointer;
}
.course-start-end {
......
......@@ -39,7 +39,7 @@ class WatchData extends React.Component {
<WatchDataHeader
type={ENUM.CourseTypeEnum[type]}
courseName={localStorage.getItem("WatchData_CourseName")}
color="#FFB714"
color="#2966FF"
/>
<div className="box">
......
......@@ -2,24 +2,19 @@
* @Description:
* @Author: zangsuyun
* @Date: 2021-03-12 10:43:10
<<<<<<< HEAD
* @LastEditors: fusanqiasng
* @LastEditTime: 2021-05-28 13:33:07
=======
* @LastEditors: fusanqiasng
* @LastEditTime: 2021-05-27 13:51:42
>>>>>>> 4399d60 (fix:修复外部课程相关模块bug)
* @LastEditors: wufan
* @LastEditTime: 2021-05-30 20:36:42
* @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) {
......@@ -29,12 +24,12 @@ export default class KnowledgeBase extends React.Component {
size: 10,
current: 1,
storeId: User.getStoreId(),
categoryId: 0,
categoryId: 0
},
dataSource: [], // 知识库列表
totalCount: 0, // 知识库数据总条数
categoryId: '0',
updateCategoryFlag: false,
categoryId: "0",
updateCategoryFlag: false
}
}
......@@ -45,7 +40,7 @@ export default class KnowledgeBase extends React.Component {
}
getSelectedCategoryId = (categoryId) => {
this.setState({
categoryId,
categoryId
})
this.handleFetchScheduleList({ categoryId, current: 1 })
}
......@@ -53,14 +48,14 @@ export default class KnowledgeBase extends React.Component {
// 更新分类树
updateCategoryTree = () => {
this.setState({
updateCategoryFlag: !this.state.updateCategoryFlag,
updateCategoryFlag: !this.state.updateCategoryFlag
})
}
// 获取知识库列表
handleFetchScheduleList = (_query = {}, flag = true) => {
const query = {
...this.state.query,
..._query,
..._query
}
// 更新请求参数
......@@ -73,7 +68,7 @@ export default class KnowledgeBase extends React.Component {
const { records = [], total = 0 } = result
this.setState({
dataSource: records,
totalCount: Number(total),
totalCount: Number(total)
})
})
}
......@@ -84,17 +79,20 @@ export default class KnowledgeBase extends React.Component {
<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>
<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% - 265px)" }}>
<KnowledgeBaseFilter onChange={this.handleFetchScheduleList} />
{/* 操作模块 */}
{categoryId !== '0' && (
{categoryId !== "0" && (
<KnowledgeBaseOpt onChange={this.handleFetchScheduleList} updateCategoryTree={this.updateCategoryTree} categoryId={categoryId} />
)}
......
......@@ -3,7 +3,7 @@
* @Author: zangsuyun
* @Date: 2021-03-13 09:54:26
* @LastEditors: fusanqiasng
* @LastEditTime: 2021-05-28 20:19:06
* @LastEditTime: 2021-05-30 23:59:36
* @Copyright: © 2020 杭州杰竞科技有限公司 版权所有
*/
......@@ -25,23 +25,23 @@ const courseStateShow = {
UN_START: {
code: 1,
title: '待开课',
color: '#2966FF',
color: '#FFB129'
},
STARTING: {
code: 2,
title: '上课中',
color: '#238FFF',
color: '#238FFF'
},
FINISH: {
code: 3,
title: '已完成',
color: '#3BBDAA',
color: '#3BBDAA'
},
EXPIRED: {
code: 4,
title: '未成功开课',
color: '#999',
},
color: '#999'
}
}
class AddCourse extends React.Component {
......@@ -55,7 +55,7 @@ class AddCourse extends React.Component {
excludeUsed: true,
courseType: 'LIVE',
storeId: User.getStoreId(),
toRefKnowledgeCategoryId: this.props.categoryId,
toRefKnowledgeCategoryId: this.props.categoryId
},
liveTotalCount: 0,
selectLive: [], //弹窗内已选择的直播课程
......@@ -63,21 +63,21 @@ class AddCourse extends React.Component {
videoCourseDivision: 'internal',
videoDataSource: {
external: [],
internal: [],
internal: []
},
videoSize: {
external: 10,
internal: 10,
internal: 10
},
videoSearchDefalt: {
external: {
categoryId: '',
courseName: '',
courseName: ''
},
internal: {
categoryId: '',
courseName: '',
},
courseName: ''
}
},
videoQuery: {
......@@ -88,7 +88,7 @@ class AddCourse extends React.Component {
courseType: 'VOICE',
excludeUsed: true,
storeId: User.getStoreId(),
toRefKnowledgeCategoryId: this.props.categoryId,
toRefKnowledgeCategoryId: this.props.categoryId
},
internal: {
categoryId: '',
......@@ -97,20 +97,20 @@ class AddCourse extends React.Component {
courseType: 'VOICE',
excludeUsed: true,
storeId: User.getStoreId(),
toRefKnowledgeCategoryId: this.props.categoryId,
},
toRefKnowledgeCategoryId: this.props.categoryId
}
},
videoTotalCount: {
external: 0,
internal: 0,
internal: 0
},
selectVideo: {
external: [],
internal: [],
internal: []
}, //弹窗内已选择的视频课程
currentVideoCourseListData: {
external: [],
internal: [],
internal: []
}, //页面中已关联的视频课程
pictureDataSource: [],
......@@ -120,12 +120,12 @@ class AddCourse extends React.Component {
excludeUsed: true,
courseType: 'PICTURE',
storeId: User.getStoreId(),
toRefKnowledgeCategoryId: this.props.categoryId,
toRefKnowledgeCategoryId: this.props.categoryId
},
pictureTotalCount: 0,
selectPicture: [], //弹窗内已选择的图文课程
categoryList: [], //内部分类列表
categoryListExternal: [], //外部分类列表
categoryListExternal: [] //外部分类列表
}
}
componentDidMount() {
......@@ -139,25 +139,25 @@ class AddCourse extends React.Component {
queryCategoryTree = (categoryName) => {
let query = {
storeId: User.getStoreId(),
withCount: false,
withCount: false
}
let queryInternal = {
bizType: 'QUESTION',
source: 2,
tenantId: User.getStoreId(),
userId: User.getStoreUserId(),
count: false,
count: false
}
AidToolService.queryExternalCategoryTree(queryInternal).then((res) => {
const { categoryList = [] } = res.result
this.setState({
categoryListExternal: this.renderTreeNodes(categoryList),
categoryListExternal: this.renderTreeNodes(categoryList)
})
})
KnowledgeAPI.getCategoryTree(query).then((res) => {
const { categoryList = [] } = res.result
this.setState({
categoryList: this.renderTreeNodes(categoryList),
categoryList: this.renderTreeNodes(categoryList)
})
})
}
......@@ -187,7 +187,7 @@ class AddCourse extends React.Component {
const params = {
...liveQuery,
size: liveSize,
size: liveSize
}
// CourseService.getLiveCloudCoursePage(params).then((res) => {
......@@ -196,7 +196,7 @@ class AddCourse extends React.Component {
const { records = [], total = 0 } = result
this.setState({
liveDataSource: records,
liveTotalCount: Number(total),
liveTotalCount: Number(total)
})
})
}
......@@ -208,7 +208,7 @@ class AddCourse extends React.Component {
const params = {
...videoQuery[videoCourseDivision],
size: videoSize[videoCourseDivision],
courseDivision: videoCourseDivision === 'internal' ? 'INTERNAL' : 'EXTERNAL',
courseDivision: videoCourseDivision === 'internal' ? 'INTERNAL' : 'EXTERNAL'
}
// CourseService.videoSchedulePage(query).then((res) => {
......@@ -218,12 +218,12 @@ class AddCourse extends React.Component {
this.setState({
videoDataSource: {
...videoDataSource,
[videoCourseDivision]: records,
[videoCourseDivision]: records
},
videoTotalCount: {
...videoTotalCount,
[videoCourseDivision]: Number(total),
},
[videoCourseDivision]: Number(total)
}
})
})
}
......@@ -234,7 +234,7 @@ class AddCourse extends React.Component {
const params = {
...pictureQuery,
size: pictureSize,
size: pictureSize
}
// CourseService.pictureSchedulePage(query).then((res) => {
......@@ -243,7 +243,7 @@ class AddCourse extends React.Component {
const { records = [], total = 0 } = result
this.setState({
pictureDataSource: records,
pictureTotalCount: Number(total),
pictureTotalCount: Number(total)
})
})
}
......@@ -254,7 +254,7 @@ class AddCourse extends React.Component {
}
this.setState(
{
liveSize: size,
liveSize: size
},
() => {
this.handleFetchLiveList()
......@@ -268,7 +268,7 @@ class AddCourse extends React.Component {
}
this.setState(
{
videoSize: size,
videoSize: size
},
() => {
this.handleFetchVideoList()
......@@ -282,7 +282,7 @@ class AddCourse extends React.Component {
}
this.setState(
{
pictureSize: size,
pictureSize: size
},
() => {
this.handleFetchPictureList()
......@@ -304,6 +304,7 @@ class AddCourse extends React.Component {
cursor: 'pointer',
color: '#bfbfbf',
fontSize: '14px',
fontWeight: '400'
}}>
&#xe61d;
</i>
......@@ -340,7 +341,7 @@ class AddCourse extends React.Component {
className='course-status'
style={{
color: courseStateShow[record.courseState].color,
border: `1px solid ${courseStateShow[record.courseState].color}`,
border: `1px solid ${courseStateShow[record.courseState].color}`
}}>
{courseStateShow[record.courseState].title}
</span>
......@@ -348,7 +349,7 @@ class AddCourse extends React.Component {
</div>
</div>
)
},
}
},
{
title: '上课时间',
......@@ -362,7 +363,7 @@ class AddCourse extends React.Component {
{formatDate('H:i', parseInt(item.startTime))}~{formatDate('H:i', parseInt(item.endTime))}
</span>
)
},
}
},
{
......@@ -377,8 +378,8 @@ class AddCourse extends React.Component {
{record.categoryTwoName ? `-${record.categoryTwoName}` : ''}
</div>
)
},
},
}
}
]
return columns
......@@ -399,6 +400,7 @@ class AddCourse extends React.Component {
cursor: 'pointer',
color: '#bfbfbf',
fontSize: '14px',
fontWeight: '400'
}}>
&#xe61d;
</i>
......@@ -435,7 +437,7 @@ class AddCourse extends React.Component {
</Choose>
</div>
)
},
}
},
{
title: '课程时长',
......@@ -444,7 +446,7 @@ class AddCourse extends React.Component {
dataIndex: 'videoDuration',
render: (text, item) => {
return <span>{text ? dealTimeDuration(text) : '-'}</span>
},
}
},
{
......@@ -465,8 +467,8 @@ class AddCourse extends React.Component {
</Otherwise>
</Choose>
)
},
},
}
}
]
return columns
}
......@@ -485,6 +487,7 @@ class AddCourse extends React.Component {
cursor: 'pointer',
color: '#bfbfbf',
fontSize: '14px',
fontWeight: '400'
}}>
&#xe61d;
</i>
......@@ -512,7 +515,7 @@ class AddCourse extends React.Component {
</Choose>
</div>
)
},
}
},
{
title: '课程分类',
......@@ -525,8 +528,8 @@ class AddCourse extends React.Component {
{record.categoryTwoName ? `-${record.categoryTwoName}` : ''}
</div>
)
},
},
}
}
]
return columns
}
......@@ -557,8 +560,8 @@ class AddCourse extends React.Component {
this.setState({
selectVideo: {
...selectVideo,
[videoCourseDivision]: _list,
},
[videoCourseDivision]: _list
}
})
}
......@@ -586,7 +589,7 @@ class AddCourse extends React.Component {
this.setState(
{
videoQuery,
videoSearchDefalt,
videoSearchDefalt
},
() => {
this.handleFetchVideoList()
......@@ -598,7 +601,7 @@ class AddCourse extends React.Component {
const { videoSearchDefalt, videoCourseDivision } = this.state
videoSearchDefalt[videoCourseDivision].courseName = e.target.value
this.setState({
videoSearchDefalt,
videoSearchDefalt
})
}
......@@ -608,7 +611,7 @@ class AddCourse extends React.Component {
liveQuery.current = 1
this.setState(
{
liveQuery,
liveQuery
},
() => {
this.handleFetchLiveList()
......@@ -622,7 +625,7 @@ class AddCourse extends React.Component {
pictureQuery.current = 1
this.setState(
{
pictureQuery,
pictureQuery
},
() => {
this.handleFetchPictureList()
......@@ -638,7 +641,7 @@ class AddCourse extends React.Component {
refIds: _.pluck(selectVideo.external, 'id'),
storeId: User.getStoreId(),
type: 'VOICE',
createId: User.getStoreUserId(),
createId: User.getStoreUserId()
})
}
if (selectVideo.internal.length) {
......@@ -647,7 +650,7 @@ class AddCourse extends React.Component {
refIds: _.pluck(selectVideo.internal, 'id'),
storeId: User.getStoreId(),
type: 'VOICE',
createId: User.getStoreUserId(),
createId: User.getStoreUserId()
})
}
if (selectLive.length) {
......@@ -656,7 +659,7 @@ class AddCourse extends React.Component {
refIds: _.pluck(selectLive, 'liveCourseId'),
storeId: User.getStoreId(),
type: 'LIVE',
createId: User.getStoreUserId(),
createId: User.getStoreUserId()
})
}
if (selectPicture.length) {
......@@ -665,7 +668,7 @@ class AddCourse extends React.Component {
refIds: _.pluck(selectPicture, 'id'),
storeId: User.getStoreId(),
type: 'PICTURE',
createId: User.getStoreUserId(),
createId: User.getStoreUserId()
})
}
......@@ -687,9 +690,9 @@ class AddCourse extends React.Component {
...videoSearchDefalt,
[e.target.value]: {
courseName: videoQuery[e.target.value].courseName,
categoryId: videoQuery[e.target.value].categoryId,
},
},
categoryId: videoQuery[e.target.value].categoryId
}
}
},
() => {
this.handleFetchVideoList()
......@@ -732,7 +735,7 @@ class AddCourse extends React.Component {
selectPicture,
videoSearchDefalt,
categoryList,
categoryListExternal,
categoryListExternal
} = this.state
const LiveSelection = {
......@@ -746,7 +749,7 @@ class AddCourse extends React.Component {
_list = _.reject(selectLive, (item) => _.find(changeRows, (data) => data.liveCourseId === item.liveCourseId))
}
this.setState({ selectLive: _list })
},
}
}
const VideoSelection = {
......@@ -762,10 +765,10 @@ class AddCourse extends React.Component {
this.setState({
selectVideo: {
...selectVideo,
[videoCourseDivision]: _list,
},
[videoCourseDivision]: _list
}
})
},
}
}
const PictureSelection = {
......@@ -779,7 +782,7 @@ class AddCourse extends React.Component {
_list = _.reject(selectPicture, (item) => _.find(changeRows, (data) => data.id === item.id))
}
this.setState({ selectPicture: _list })
},
}
}
return (
......@@ -823,10 +826,10 @@ class AddCourse extends React.Component {
this.setState({
selectVideo: {
internal: [],
external: [],
external: []
},
selectLive: [],
selectPicture: [],
selectPicture: []
})
}}
/>
......@@ -851,7 +854,7 @@ class AddCourse extends React.Component {
const _query = { ...liveQuery, current: page + 1 }
this.setState(
{
liveQuery: _query,
liveQuery: _query
},
() => {
this.handleFetchLiveList()
......@@ -890,6 +893,7 @@ class AddCourse extends React.Component {
<TreeSelect
treeNodeFilterProp='categoryName'
showSearch
value={videoQuery[videoCourseDivision].categoryId}
style={{ minWidth: 'calc(100% - 75px)' }}
dropdownMatchSelectWidth={false}
dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
......@@ -909,10 +913,10 @@ class AddCourse extends React.Component {
this.setState({
selectVideo: {
internal: [],
external: [],
external: []
},
selectLive: [],
selectPicture: [],
selectPicture: []
})
}}
/>
......@@ -941,8 +945,8 @@ class AddCourse extends React.Component {
{
videoQuery: {
...videoQuery,
[videoCourseDivision]: _query,
},
[videoCourseDivision]: _query
}
},
() => {
this.handleFetchVideoList()
......@@ -994,10 +998,10 @@ class AddCourse extends React.Component {
this.setState({
selectVideo: {
internal: [],
external: [],
external: []
},
selectLive: [],
selectPicture: [],
selectPicture: []
})
}}
/>
......@@ -1022,7 +1026,7 @@ class AddCourse extends React.Component {
const _query = { ...pictureQuery, current: page + 1 }
this.setState(
{
pictureQuery: _query,
pictureQuery: _query
},
() => {
this.handleFetchPictureList()
......
......@@ -2,8 +2,8 @@
* @Description:
* @Author: zangsuyun
* @Date: 2021-03-13 14:38:49
* @LastEditors: zangsuyun
* @LastEditTime: 2021-03-16 15:20:51
* @LastEditors: wufan
* @LastEditTime: 2021-05-30 10:08:02
* @Copyright: © 2020 杭州杰竞科技有限公司 版权所有
*/
......@@ -22,7 +22,7 @@ const courseStateShow = {
UN_START: {
code: 1,
title: "待开课",
color: "#FFB714",
color: "#FFB129",
},
STARTING: {
code: 2,
......@@ -107,6 +107,7 @@ class LiveList extends React.Component {
cursor: "pointer",
color: "#bfbfbf",
fontSize: "14px",
fontWeight:"400"
}}
>
&#xe61d;
......
......@@ -71,13 +71,13 @@
}
.courseware {
font-size: 14px;
color: #2966ff;
color: #2966FF;
line-height: 20px;
text-align: right;
cursor: pointer;
}
.quota-icon {
color: #2966ff;
color: #2966FF;
cursor: pointer;
}
.operate {
......@@ -85,7 +85,7 @@
align-items: center;
flex-wrap: wrap;
.operate__item {
color: #2966ff;
color: #2966FF;
cursor: pointer;
&.split {
margin: 0 8px;
......@@ -94,7 +94,7 @@
}
}
.operate-text {
color: #2966ff;
color: #2966FF;
cursor: pointer;
}
.course-start-end {
......
......@@ -2,8 +2,8 @@
* @Description:
* @Author: zangsuyun
* @Date: 2021-03-13 11:48:24
* @LastEditors: zangsuyun
* @LastEditTime: 2021-04-01 11:58:46
* @LastEditors: wufan
* @LastEditTime: 2021-05-30 10:08:09
* @Copyright: © 2020 杭州杰竞科技有限公司 版权所有
*/
......@@ -105,6 +105,7 @@ class VideoList extends React.Component {
cursor: "pointer",
color: "#bfbfbf",
fontSize: "14px",
fontWeight:"400"
}}
>
&#xe61d;
......
.personal-info-page{
.box{
padding: 60px 60px 60px 40px !important;
padding: 24px 60px 60px 40px !important;
}
.label{
width:84px;
......@@ -57,4 +57,8 @@
margin-left:20px;
}
}
.save-btn {
margin-left: 92px;
}
}
\ No newline at end of file
/*
* @Author: zhangleyuan
* @Date: 2020-11-27 15:06:31
* @LastEditors: zangsuyun
* @LastEditTime: 2021-03-22 13:55:24
* @LastEditors: wufan
* @LastEditTime: 2021-05-28 15:31:06
* @Description: 描述一下
* @@Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有
*/
......@@ -181,7 +181,7 @@ console.log('User.getStoreType()',User.getStoreType());
</Button>
</div>
)}
<div>
<div className="save-btn">
<Button
type="primary"
onClick={() => {
......
/*
* @Author: zhangleyuan
* @Date: 2021-02-20 16:13:39
* @LastEditors: fusanqiasng
* @LastEditTime: 2021-05-24 00:00:31
* @LastEditors: wufan
* @LastEditTime: 2021-05-30 20:39:16
* @Description: 描述一下
* @@Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有
*/
......@@ -17,7 +17,7 @@ import PlanService from '@/domains/plan-domain/planService'
import User from '@/common/js/user'
import _ from 'underscore'
import './AddPlan.less'
const defaultCover = 'https://image.xiaomaiketang.com/xm/YNfi45JwFA.png'
const defaultCover = 'https://image.xiaomaiketang.com/xm/rEAetaTEh3.png';
const defaultBasicData = {
planName: '',
coverUrl: defaultCover,
......@@ -286,7 +286,7 @@ function AddPlan() {
)}
</div>
</div>
<div className='footer'>
<div className='footer shrink-footer'>
<Button onClick={handleGoBack}>取消</Button>
<Button type='primary' onClick={submitInfo} disabled={submitDisabled}>
保存
......
.add-plan-page {
position:relative !important;
.box {
margin-bottom: 66px !important;
margin-bottom: 52px !important;
padding-bottom: 40px!important;
.add-plan-page__form {
margin-top: 16px;
.title {
......@@ -18,13 +19,14 @@
}
.footer {
position: fixed;
left: 196px;
bottom: 0;
height: 58px;
width: 100%;
width: ~'calc(100% - 218px)';
display: flex;
align-items: center;
justify-content: flex-end;
padding-right: 252px;
padding-right: 72px;
background: #fff;
border-top: 1px solid #E8E8E8;
z-index: 9999;
......
......@@ -10,7 +10,7 @@ import Bus from '@/core/bus';
import './LearningData.less';
const userRole = User.getUserRole();
const defaultCover = 'https://image.xiaomaiketang.com/xm/YNfi45JwFA.png';
const defaultCover = 'https://image.xiaomaiketang.com/xm/rEAetaTEh3.png';
class LearningData extends React.Component {
constructor(props) {
......
......@@ -7,7 +7,7 @@
font-weight:normal;
}
.plan-info{
margin:16px;
margin-bottom:8px;
padding:16px;
background: #FFF;
display:flex;
......
......@@ -40,13 +40,12 @@
width: 100%;
height: 100%;
object-fit: contain;
border: 1px solid #E8e8e8;
}
}
.opt-btns{
.default-btn {
margin:0 8px;
color: #5289FA;
color: #2966FF;
cursor: pointer;
&.disabled {
color: #CCC;
......
......@@ -134,6 +134,7 @@ class EmployeeShareData extends React.Component {
)
}
},
//产品暂时性隐藏
// {
// title: '手机号',
// key: 'storeUserPhone',
......
......@@ -4,7 +4,7 @@
}
.operate-item{
font-size:14px;
color:#5289FA;
color:#2966FF;
cursor: pointer;
}
.learn-num{
......
......@@ -2,7 +2,7 @@
* @Author: zhangleyuan
* @Date: 2021-02-20 16:46:46
* @LastEditors: wufan
* @LastEditTime: 2021-05-13 16:36:43
* @LastEditTime: 2021-05-14 18:12:50
* @Description: 描述一下
* @@Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有
*/
......@@ -131,7 +131,7 @@ function PlanList(props) {
<span className="operate-text">更多</span>
<span
className="iconfont icon"
style={{ color: "#5289FA" }}
style={{ color: "#2966FF" }}
>
&#xe824;
</span>
......
......@@ -37,14 +37,14 @@
-webkit-box-orient: vertical;
}
.operate-text {
color: #5289FA;
color: #2966FF;
cursor: pointer;
}
.operate {
display: flex;
&__item {
color: #5289FA;
color: #2966FF;
cursor: pointer;
&.split {
......
......@@ -17,7 +17,7 @@
font-size:14px;
}
.add-task-btn{
color: #5289FA;
color: #2966FF;
font-size:14px;
}
}
......@@ -81,7 +81,7 @@
.course-box{
.add-course-con{
padding:16px 51px;
color: #5289FA;
color: #2966FF;
font-size:14px;
.add-course-btn-disabled{
font-size:14px;
......
......@@ -194,16 +194,10 @@ class UserLearningData extends React.Component {
},
},
{
title: (
<span>
<span>负责人</span>
<Tooltip title='培训计划的分享者/跟进人'>
<i className='icon iconfont' style={{ marginLeft: '5px', cursor: 'pointer', color: '#bfbfbf', fontSize: '14px' }}>
&#xe61d;
</i>
</Tooltip>
</span>
),
title: <span>
<span>负责人</span>
<Tooltip title="培训计划的分享者/跟进人"><i className="icon iconfont" style={{ marginLeft: '5px',cursor:'pointer',color:'#bfbfbf',fontSize:'14px',fontWeight:"400"}}>&#xe61d;</i></Tooltip>
</span>,
key: 'userNameList',
dataIndex: 'userNameList',
render: (val, record) => {
......@@ -241,17 +235,10 @@ class UserLearningData extends React.Component {
},
},
{
title: (
<span>
<span>学习进度</span>
<Tooltip title='学员培训计划中达到“已完成”状态的课程数/总课程数'>
<i className='icon iconfont' style={{ marginLeft: '5px', cursor: 'pointer', color: '#bfbfbf', fontSize: '14px' }}>
&#xe61d;
</i>
</Tooltip>
</span>
),
title: <span>
<span>学习进度</span>
<Tooltip title="学员培训计划中达到“已完成”状态的课程数/总课程数"><i className="icon iconfont" style={{ marginLeft: '5px',cursor:'pointer',color:'#bfbfbf',fontSize:'14px', fontWeight:"400"}}>&#xe61d;</i></Tooltip>
</span>,
key: 'learnNum',
dataIndex: 'learnNum',
width: 130,
......
......@@ -15,7 +15,7 @@
margin-bottom: 12px;
.label{
font-size:14px;
color:#666;
color:#333;
vertical-align: middle;
width:70px;
text-align:right;
......
......@@ -131,7 +131,7 @@
margin-bottom: 40px;
.content {
color:rgba(82, 137, 250, 1);
color:#2966FF;
cursor: pointer;
}
}
......
import React from 'react'
import _ from 'underscore'
import { Table, Radio, Tabs, Modal, Input, message, Button, Tooltip } from 'antd'
import React from "react"
import _ from "underscore"
import { Table, Radio, Tabs, Modal, Input, message, Button, Tooltip } from "antd"
import { PageControl } from '@/components'
import { PageControl } from "@/components"
import CourseService from '@/domains/course-domain/CourseService'
import User from '@/common/js/user'
import Service from '@/common/js/service'
import dealTimeDuration from '../../course-manage/utils/dealTimeDuration'
import CourseService from "@/domains/course-domain/CourseService"
import User from "@/common/js/user"
import Service from "@/common/js/service"
import dealTimeDuration from "../../course-manage/utils/dealTimeDuration"
import './relatedCourseModal.less'
import "./relatedCourseModal.less"
const { Search } = Input
const { TabPane } = Tabs
const courseStateShow = {
UN_START: {
code: 1,
title: '待开课',
color: '#FFB714'
title: "待开课",
color: "#FFB129",
},
STARTING: {
code: 2,
title: '上课中',
color: '#238FFF'
title: "上课中",
color: "#238FFF"
},
FINISH: {
code: 3,
title: '已完成',
color: '#3BBDAA'
title: "已完成",
color: "#3BBDAA"
},
EXPIRED: {
code: 4,
title: '未成功开课',
color: '#999'
title: "未成功开课",
color: "#999"
}
}
class SelectOperatorModal extends React.Component {
......@@ -49,7 +49,7 @@ class SelectOperatorModal extends React.Component {
currentCourseListData: [],
currentLiveCourseListData: [], //页面中已关联的直播课程
videoCourseDivision: 'internal',
videoCourseDivision: "internal",
videoDataSource: {
external: [],
internal: []
......@@ -59,10 +59,10 @@ class SelectOperatorModal extends React.Component {
internal: 10
},
videoSearchName: {
external: '',
internal: ''
external: "",
internal: ""
},
videoSearchDefalt: '',
videoSearchDefalt: "",
videoQuery: {
external: {
current: 1
......@@ -93,7 +93,7 @@ class SelectOperatorModal extends React.Component {
selectPicture: [], //弹窗内已选择的视频课程
currentPictureCourseListData: [], //页面中已关联的视频课程
activeKey: 'video',
activeKey: "video",
currentTaskCourseData: this.props.data[this.props.selectedTaskIndex].courseList || []
}
}
......@@ -111,7 +111,7 @@ class SelectOperatorModal extends React.Component {
let currentLiveCourseListData = []
_data.map((item) => {
item.courseList.map((childItem, childIndex) => {
if (childItem.courseType === 'LIVE') {
if (childItem.courseType === "LIVE") {
currentLiveCourseListData.push(childItem.courseId)
}
return childItem
......@@ -143,7 +143,7 @@ class SelectOperatorModal extends React.Component {
let currentVideoCourseListData = []
_data.map((item, index) => {
item.courseList.map((childItem, childIndex) => {
if (childItem.courseType === 'VOICE') {
if (childItem.courseType === "VOICE") {
currentVideoCourseListData.push(childItem.courseId)
}
return childItem
......@@ -153,12 +153,12 @@ class SelectOperatorModal extends React.Component {
const params = {
...videoQuery[videoCourseDivision],
size: videoSize[videoCourseDivision],
courseDivision: videoCourseDivision === 'internal' ? 'INTERNAL' : 'EXTERNAL',
courseDivision: videoCourseDivision === "internal" ? "INTERNAL" : "EXTERNAL",
excludeCourseIdList: currentVideoCourseListData
}
CourseService.videoScheduleBasePage(params).then((res) => {
const { result = {} } = res
console.log('result', result)
console.log("result", result)
const { records = [], total = 0 } = result
......@@ -183,7 +183,7 @@ class SelectOperatorModal extends React.Component {
let currentPictureCourseListData = []
_data.map((item, index) => {
item.courseList.map((childItem, childIndex) => {
if (childItem.courseType === 'PICTURE') {
if (childItem.courseType === "PICTURE") {
currentPictureCourseListData.push(childItem.courseId)
}
return childItem
......@@ -193,12 +193,12 @@ class SelectOperatorModal extends React.Component {
const params = {
...pictureQuery,
size: pictureSize,
courseType: 'PICTURE',
courseType: "PICTURE",
storeId: User.getStoreId(),
excludeCourseIdList: currentPictureCourseListData
}
Service.Hades('public/hades/mediaCoursePage', params).then((res) => {
Service.Hades("public/hades/mediaCoursePage", params).then((res) => {
const { result = {} } = res
const { records = [], total = 0 } = result
this.setState({
......@@ -287,32 +287,24 @@ class SelectOperatorModal extends React.Component {
parseLiveColumns = () => {
const columns = [
{
title: (
<span>
<span>课程信息</span>
<Tooltip title='仅显示未关联课程,已关联课程不支持重复选择'>
<i className='icon iconfont' style={{ marginLeft: '5px', cursor: 'pointer', color: '#bfbfbf', fontSize: '14px' }}>
&#xe61d;
</i>
</Tooltip>
</span>
),
title: <span><span>课程信息</span><Tooltip title="仅显示未关联课程,已关联课程不支持重复选择"><i className="icon iconfont" style={{ marginLeft: '5px',cursor:'pointer',color:'#bfbfbf',fontSize:'14px',fontWeight:"400"
}}>&#xe61d;</i></Tooltip></span>,
key: 'course',
dataIndex: 'course',
width: '40%',
width:'40%',
render: (val, record) => {
let hasCover = false
return (
<div className='course-info'>
{record.courseMediaVOS.map((item) => {
if (item.contentType === 'COVER') {
if (item.contentType === "COVER") {
hasCover = true
return <img className='course-cover' src={item.mediaUrl} alt='' />
}
return null
})}
<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/YNfi45JwFA.png"} alt='' />
</If>
<div>
......@@ -328,31 +320,31 @@ class SelectOperatorModal extends React.Component {
}
},
{
title: '上课时间',
key: 'courseTime',
dataIndex: 'courseTime',
width: '40%',
title: "上课时间",
key: "courseTime",
dataIndex: "courseTime",
width: "40%",
render: (val, record) => {
return (
<div>
<div>{formatDate('YYYY-MM-DD', record.startTime)}</div>
<div>{formatDate("YYYY-MM-DD", record.startTime)}</div>
<div>
{formatDate('H:i', record.startTime)}~{formatDate('H:i', record.endTime)}
{formatDate("H:i", record.startTime)}~{formatDate("H:i", record.endTime)}
</div>
</div>
)
}
},
{
title: '学院展示',
key: 'shelfState',
dataIndex: 'shelfState',
width: '20%',
title: "学院展示",
key: "shelfState",
dataIndex: "shelfState",
width: "20%",
render: (val, record) => {
return (
<span>
<Choose>
<When condition={record.shelfState === 'YES'}>
<When condition={record.shelfState === "YES"}>
<span>开启</span>
</When>
<Otherwise>
......@@ -372,19 +364,10 @@ class SelectOperatorModal extends React.Component {
const { videoCourseDivision } = this.state
const columns = [
{
title: (
<span>
<span>课程信息</span>
<Tooltip title='仅显示未关联课程,已关联课程不支持重复选择'>
<i className='icon iconfont' style={{ marginLeft: '5px', cursor: 'pointer', color: '#bfbfbf', fontSize: '14px' }}>
&#xe61d;
</i>
</Tooltip>
</span>
),
title: <span><span>课程信息</span><Tooltip title="仅显示未关联课程,已关联课程不支持重复选择"><i className="icon iconfont" style={{ marginLeft: '5px',cursor:'pointer',color:'#bfbfbf',fontSize:'14px',fontWeight:"400"}}>&#xe61d;</i></Tooltip></span>,
key: 'course',
dataIndex: 'course',
width: '40%',
width:'60%',
render: (val, record) => {
const { coverUrl, scheduleVideoUrl } = record
return (
......@@ -394,9 +377,9 @@ class SelectOperatorModal extends React.Component {
className='course-cover'
src={
coverUrl ||
(videoCourseDivision === 'internal'
(videoCourseDivision === "internal"
? `${scheduleVideoUrl}?x-oss-process=video/snapshot,t_0,m_fast`
: 'https://image.xiaomaiketang.com/xm/mt3ZQRxGKB.png')
: "https://image.xiaomaiketang.com/xm/mt3ZQRxGKB.png")
}
alt=''
/>
......@@ -407,23 +390,23 @@ class SelectOperatorModal extends React.Component {
}
},
{
title: '课程时长',
key: 'courseTime',
dataIndex: 'courseTime',
width: '20%',
title: "课程时长",
key: "courseTime",
dataIndex: "courseTime",
width: "20%",
render: (val, record) => {
return <span className='course-status'>{dealTimeDuration(record.videoDuration)}</span>
}
},
{
title: '学院展示',
key: 'shelfState',
dataIndex: 'shelfState',
width: '20%',
title: "学院展示",
key: "shelfState",
dataIndex: "shelfState",
width: "20%",
render: (val, record) => {
return (
<Choose>
<When condition={record.shelfState === 'YES'}>
<When condition={record.shelfState === "YES"}>
<span>开启</span>
</When>
<Otherwise>
......@@ -441,46 +424,37 @@ class SelectOperatorModal extends React.Component {
parsePictureColumns = () => {
const columns = [
{
title: (
<span>
<span>课程信息</span>
<Tooltip title='仅显示未关联课程,已关联课程不支持重复选择'>
<i className='icon iconfont' style={{ marginLeft: '5px', cursor: 'pointer', color: '#bfbfbf', fontSize: '14px' }}>
&#xe61d;
</i>
</Tooltip>
</span>
),
title: <span><span>课程信息</span><Tooltip title="仅显示未关联课程,已关联课程不支持重复选择"><i className="icon iconfont" style={{ marginLeft: '5px',cursor:'pointer',color:'#bfbfbf',fontSize:'14px',fontWeight:"400"}}>&#xe61d;</i></Tooltip></span>,
key: 'course',
dataIndex: 'course',
width: '55%',
width:'55%',
render: (val, record) => {
const { coverUrl } = record
return (
<div className='course-info'>
{/* 上传了封面的话就用上传的封面, 没有的话就取视频的第一帧 */}
<img className='course-cover' src={coverUrl || 'https://image.xiaomaiketang.com/xm/YNfi45JwFA.png'} alt='' />
<img className='course-cover' src={coverUrl || "https://image.xiaomaiketang.com/xm/YNfi45JwFA.png"} alt='' />
<div className='course-name'>{record.courseName}</div>
</div>
)
}
},
{
title: '更新时间',
key: 'updated',
dataIndex: 'updated',
width: '25%',
title: "更新时间",
key: "updated",
dataIndex: "updated",
width: "25%",
render: (val, record) => {
return <span className='course-status'>{formatDate('YYYY-MM-DD', record.updated)}</span>
return <span className='course-status'>{formatDate("YYYY-MM-DD", record.updated)}</span>
}
},
{
title: '学院展示',
key: 'shelfState',
dataIndex: 'shelfState',
width: '20%',
title: "学院展示",
key: "shelfState",
dataIndex: "shelfState",
width: "20%",
render: (val, record) => {
return <span>{record.shelfState === 'YES' ? '开启' : '关闭'}</span>
return <span>{record.shelfState === "YES" ? "开启" : "关闭"}</span>
}
}
]
......@@ -495,7 +469,7 @@ class SelectOperatorModal extends React.Component {
_list = _.reject(selectLive, (item) => item.liveCourseId === record.liveCourseId)
}
if (_list.length + currentTaskCourseData.length + selectVideo.length + selectPicture.length > 20) {
message.warning('无法继续选择,一个任务最多关联20个课程')
message.warning("无法继续选择,一个任务最多关联20个课程")
return
}
this.setState({ selectLive: _list })
......@@ -513,7 +487,7 @@ class SelectOperatorModal extends React.Component {
_list = _.reject(selectList, (item) => item.id === record.id)
}
if (_list.length + currentTaskCourseData.length + selectLive.length + selectPicture.length > 20) {
message.warning('无法继续选择,一个任务最多关联20个课程')
message.warning("无法继续选择,一个任务最多关联20个课程")
return
}
this.setState({
......@@ -533,7 +507,7 @@ class SelectOperatorModal extends React.Component {
_list = _.reject(selectPicture, (item) => item.id === record.id)
}
if (_list.length + currentTaskCourseData.length + selectLive.length + selectVideo.length > 20) {
message.warning('无法继续选择,一个任务最多关联20个课程')
message.warning("无法继续选择,一个任务最多关联20个课程")
return
}
this.setState({ selectPicture: _list })
......@@ -553,7 +527,7 @@ class SelectOperatorModal extends React.Component {
return selectVideo.map((item) => {
let _item = {}
_item.courseId = item.id
_item.courseType = 'VOICE'
_item.courseType = "VOICE"
_item.courseName = item.courseName
return _item
......@@ -564,7 +538,7 @@ class SelectOperatorModal extends React.Component {
return selectLive.map((item, index) => {
let _item = {}
_item.courseId = item.liveCourseId
_item.courseType = 'LIVE'
_item.courseType = "LIVE"
_item.courseName = item.courseName
_item.courseState = item.courseState
return _item
......@@ -587,46 +561,46 @@ class SelectOperatorModal extends React.Component {
return selectPicture.map((item, index) => {
let _item = {}
_item.courseId = item.id
_item.courseType = 'PICTURE'
_item.courseType = "PICTURE"
_item.courseName = item.courseName
return _item
})
}
renderFooter = () => {
const { activeKey } = this.state
let href = ''
let href = ""
switch (activeKey) {
case 'live':
case "live":
href = (
<a
target='_blank'
rel='noopener noreferrer'
className='link-create-course'
href={window.location.origin + window.location.pathname + '#/create-live-course?type=add'}
href={window.location.origin + window.location.pathname + "#/create-live-course?type=add"}
onClick={this.props.onClose}>
没有找到需要的直播课?<span>去创建</span>
</a>
)
break
case 'video':
case "video":
href = (
<a
target='_blank'
rel='noopener noreferrer'
className='link-create-course'
href={window.location.origin + window.location.pathname + '#/create-video-course?type=add'}
href={window.location.origin + window.location.pathname + "#/create-video-course?type=add"}
onClick={this.props.onClose}>
没有找到需要的视频课?<span>去创建</span>
</a>
)
break
case 'picture':
case "picture":
href = (
<a
target='_blank'
rel='noopener noreferrer'
className='link-create-course'
href={window.location.origin + window.location.pathname + '#/create-graphics-course?type=add'}
href={window.location.origin + window.location.pathname + "#/create-graphics-course?type=add"}
onClick={this.props.onClose}>
没有找到需要的图文课?<span>去创建</span>
</a>
......@@ -741,8 +715,8 @@ class SelectOperatorModal extends React.Component {
pagination={false}
bordered
rowSelection={{
type: 'checkbox',
selectedRowKeys: _.pluck(selectLive, 'liveCourseId'),
type: "checkbox",
selectedRowKeys: _.pluck(selectLive, "liveCourseId"),
onSelect: (record, selected) => {
this.selectLiveList(record, selected)
},
......@@ -754,7 +728,7 @@ class SelectOperatorModal extends React.Component {
_list = _.reject(selectLive, (item) => _.find(changeRows, (data) => data.liveCourseId === item.liveCourseId))
}
if (_list.length + currentTaskCourseData.length + selectVideo.length + selectPicture.length > 20) {
message.warning('无法继续选择,一个任务最多关联20个课程')
message.warning("无法继续选择,一个任务最多关联20个课程")
const extraLength = _list.length + currentTaskCourseData.length + selectVideo.length + selectPicture.length - 20
_list.splice(_list.length - extraLength, extraLength)
}
......@@ -788,7 +762,7 @@ class SelectOperatorModal extends React.Component {
</TabPane>
<TabPane tab='视频课' key='video'>
<Radio.Group value={videoCourseDivision} onChange={this.videoCourseDivisionChange} style={{ marginBottom: 8 }}>
<Radio.Group value={videoCourseDivision} onChange={this.videoCourseDivisionChange} style={{ marginBottom: 16 }}>
<Radio.Button value='internal'>内部课程</Radio.Button>
<Radio.Button value='external'>外部课程</Radio.Button>
</Radio.Group>
......@@ -832,8 +806,8 @@ class SelectOperatorModal extends React.Component {
pagination={false}
bordered
rowSelection={{
type: 'checkbox',
selectedRowKeys: _.pluck(selectVideo[videoCourseDivision], 'id'),
type: "checkbox",
selectedRowKeys: _.pluck(selectVideo[videoCourseDivision], "id"),
onSelect: (record, selected) => {
this.selectVideoList(record, selected)
},
......@@ -845,7 +819,7 @@ class SelectOperatorModal extends React.Component {
_list = _.reject(selectVideo[videoCourseDivision], (item) => _.find(changeRows, (data) => data.id === item.id))
}
if (_list.length + currentTaskCourseData.length + selectLive.length + selectPicture.length > 20) {
message.warning('无法继续选择,一个任务最多关联20个课程')
message.warning("无法继续选择,一个任务最多关联20个课程")
const extraLength = _list.length + currentTaskCourseData.length + selectLive.length + selectPicture.length - 20
_list.splice(_list.length - extraLength, extraLength)
}
......@@ -927,8 +901,8 @@ class SelectOperatorModal extends React.Component {
pagination={false}
bordered
rowSelection={{
type: 'checkbox',
selectedRowKeys: _.pluck(selectPicture, 'id'),
type: "checkbox",
selectedRowKeys: _.pluck(selectPicture, "id"),
onSelect: (record, selected) => {
this.selectPictureList(record, selected)
},
......@@ -940,7 +914,7 @@ class SelectOperatorModal extends React.Component {
_list = _.reject(selectPicture, (item) => _.find(changeRows, (data) => data.id === item.id))
}
if (_list.length + currentTaskCourseData.length + selectVideo.length + selectLive.length > 20) {
message.warning('无法继续选择,一个任务最多关联20个课程')
message.warning("无法继续选择,一个任务最多关联20个课程")
const extraLength = _list.length + currentTaskCourseData.length + selectVideo.length + selectLive.length - 20
_list.splice(_list.length - extraLength, extraLength)
}
......
.related-course-modal {
.ant-tabs-tab.ant-tabs-tab-active .ant-tabs-tab-btn {
font-weight: normal;
font-weight: 500;
}
// .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;
// }
// }
// .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;
.link-create-course{
color:#666666;
font-size:14px;
width:638px;
text-align:left;
display:inline-block;
span{
color:#2966FF;
}
}
.search-container{
margin-bottom:16px;
}
.select-area{
margin-bottom:12px;
display:flex;
justify-content:space-between;
.select-box{
display:inline-box;
width: 186px;
background: #E9EFFF;
border-radius: 4px;
padding:6px 16px;
margin-right:8px;
display: flex;
justify-content: space-between;
.tip-icon{
color:#2966FF;
font-size:14px;
margin-right:4px;
}
.select-num{
color:#666666;
font-size:14px;
}
.clear-btn{
text-align:right;
color:#2966FF;
font-size:14px;
}
}
.related-box{
padding:6px 16px;
background: #E9EFFF;
border-radius: 4px;
flex:1;
color:#666666;
font-size:14px;
}
}
.search-container {
margin-bottom: 16px;
......@@ -48,14 +62,14 @@
.select-box {
display: inline-box;
width: 186px;
background: #fff4dd;
background: #e9efff;
border-radius: 4px;
padding: 6px 16px;
margin-right: 8px;
display: flex;
justify-content: space-between;
.tip-icon {
color: #ff9d14;
color: #2966ff;
font-size: 14px;
margin-right: 4px;
}
......@@ -71,7 +85,7 @@
}
.related-box {
padding: 6px 16px;
background: #fff4dd;
background: #e9efff;
border-radius: 4px;
flex: 1;
color: #666666;
......
......@@ -45,11 +45,11 @@
}
&:hover {
background: rgba(255,133,52,0.06);
background: rgba(41, 102, 255, 0.06);
}
&.active {
background: rgba(255,133,52,0.06);
background: rgba(41, 102, 255, 0.06);
.iconfont, .disk-name {
font-weight: 500;
}
......@@ -163,7 +163,7 @@
&:not(:last-child) {
cursor: pointer;
&:hover {
color: #5289FA;
color: #2966FF;
}
&::before {
content: '/';
......@@ -200,7 +200,7 @@
}
.file-path {
cursor: pointer;
color: #5289FA;
color: #2966FF;
}
.ant-dropdown-trigger {
cursor: pointer;
......
......@@ -38,7 +38,7 @@
&:not(:last-child) {
cursor: pointer;
&:hover {
color: #5289FA;
color: #2966FF;
}
&::before {
content: '/';
......@@ -83,7 +83,7 @@
color: #BFBFBF;
font-size:12px;
&.correct {
color: #FFB714;
color: #2966FF;
}
}
}
......@@ -102,7 +102,7 @@
}
.footer__left {
color: #5289fa;
color: #2966FF;
cursor: pointer;
}
}
......
......@@ -40,11 +40,11 @@
}
&:hover {
background: rgba(255, 183, 20, 0.05);
background: rgba(41, 102, 255, 0.06);
}
&.active {
background: rgba(255, 183, 20, 0.05);
background: rgba(41, 102, 255, 0.06);
.iconfont, .disk-name {
font-weight: 500;
}
......@@ -55,7 +55,7 @@
right: 0;
width: 4px;
height: 100%;
background-color: #FFB714;
background-color: #2966FF;
}
}
......@@ -79,7 +79,7 @@
position: absolute;
left: 33px;
bottom: 24px;
color: #5289FA;
color: #2966FF;
}
}
......@@ -172,7 +172,7 @@
&:not(:last-child) {
cursor: pointer;
&:hover {
color: #5289FA;
color: #2966FF;
}
&::before {
content: '/';
......@@ -204,12 +204,12 @@
}
&__text:hover {
color: #5289FA;
color: #2966FF;
}
}
.file-path {
cursor: pointer;
color: #5289FA;
color: #2966FF;
}
.ant-dropdown-trigger {
cursor: pointer;
......
/*
* @Author: 吴文洁
* @Date: 2019-07-10 10:30:49
* @LastEditors: wufan
* @LastEditTime: 2021-03-26 16:13:48
* @LastEditors: Please set LastEditors
* @LastEditTime: 2021-05-24 16:29:05
* @Description:
*/
import React, { useContext, useEffect, useState } from 'react';
......@@ -127,7 +127,7 @@ const App: React.FC = (props: any) => {
<ConfigProvider locale={zhCN} autoInsertSpaceInButton={false}>
<Main menuType={menuType} />
</ConfigProvider>
<Menu menuType={menuType} />
<Menu menuType={menuType} handleMenuType={handleMenuType}/>
</div>
)
}
......
......@@ -13,6 +13,7 @@
display: flex;
justify-content: center;
background: #fff;
z-index: 999;
.box {
height: 60px;
width: 1280px;
......@@ -38,7 +39,7 @@
}
.logout {
font-size: 14px;
color: #5289FA;
color: #2966FF;
cursor: pointer;
}
}
......@@ -102,8 +103,8 @@
padding: 0 8px;
line-height: 18px;
border-radius: 9px;
border: 1px solid #5289FA;
color: #5289FA;
border: 1px solid #2966FF;
color: #2966FF;
font-size: 12px;
}
}
......@@ -124,7 +125,7 @@
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
color: #5289FA;
color: #2966FF;
font-size: 16px;
}
.control-box {
......@@ -135,7 +136,7 @@
.control-button {
margin-left: 10px;
cursor: pointer;
color: #5289FA;
color: #2966FF;
}
.disable-button {
display: none;
......@@ -171,14 +172,14 @@
}
.disable-button {
display: block;
color: #5289FA;
color: #2966FF;
}
}
}
}
}
.college-create {
border: 1px dashed #5289FA;
border: 1px dashed #2966FF;
}
}
}
......
......@@ -190,12 +190,14 @@ export default class CreateCollege extends React.Component {
<img className="box-image" src="https://image.xiaomaiketang.com/xm/fe4NCjr7XF.png" />
</div>
</div>
<Breadcrumbs
navList="创建企学院"
goBack={() => {
window.RCHistory.goBack();
}}
/>
<div className="breadcrumb-wrap">
<Breadcrumbs
navList="创建企学院"
goBack={() => {
window.RCHistory.goBack();
}}
/>
</div>
<div className="create-box">
<div className="image-box">
<img className="image" src="https://image.xiaomaiketang.com/xm/fe4NCjr7XF.png"/>
......
.college-manage-page {
.breadcrumb-wrap {
margin-left: 57px;
}
.create-box {
padding-top: 108px;
margin: 0 auto;
......
......@@ -2,7 +2,7 @@
* @Author: 吴文洁
* @Date: 2019-09-10 18:26:03
* @LastEditors: Please set LastEditors
* @LastEditTime: 2021-05-12 17:30:25
* @LastEditTime: 2021-05-27 19:44:42
* @Description:
*/
import React, { useRef, useContext, useEffect, useState } from "react";
......@@ -219,23 +219,8 @@ function Header(props) {
<div id="top-container" className="top-container">
<div className="top top-nav">
<div>
{menuType ? <img src='https://image.xiaomaiketang.com/xm/fe4NCjr7XF.png' className="logo" alt="" />:<img src="https://image.xiaomaiketang.com/xm/c4KiP2epBP.png" className="logo" alt="" />}
<img src='https://image.xiaomaiketang.com/xm/WEsMPAYxAs.png' className="logo" alt="" />
</div>
{menuType ? (
<span
className="icon iconfont cursor ml20 handLike"
onClick={handleMenu}
>
&#xe83d;
</span>
) : (
<span
className="icon iconfont cursor ml20 handLike"
onClick={handleMenu}
>
&#xe615;
</span>
)}
<div className="message-help">
{list.length ? (
<ClickOutside
......@@ -313,10 +298,15 @@ function Header(props) {
</div>
)}
<div className="right-box">
<div className="right-bg-img">
<img src="https://image.xiaomaiketang.com/xm/WCwjyyXYda.png"></img>
</div>
<div className="link-to-store">
<div className="link">
<span className="icon iconfont tool-tip-right">&#xe85d;</span>
<div className="text">前往学院</div>
<span className="link-btn">
<span className="icon iconfont tool-tip-right">&#xe85d;</span>
<span className="text">前往学院</span>
</span>
<div className="store-popover">
<div className="pc-url">
<div className="name">网页端学院</div>
......@@ -337,8 +327,10 @@ function Header(props) {
</div>
</div>
<div className="share" onClick={handleCopy}>
<span className="icon iconfont tool-tip-right">&#xe85e;</span>
<div className="text">分享学院</div>
<span className="share-btn">
<span className="icon iconfont tool-tip-right">&#xe85e;</span>
<span className="text">分享学院</span>
</span>
</div>
</div>
<Dropdown overlay={userMenu()} arrow>
......
@import "../../core/variables.less";
@top-height: 50px;
@top-height: 60px;
@icon-color: #939393;
.top-container {
position: absolute;
......@@ -7,8 +7,17 @@
left: 0;
right: 0;
height: @top-height;
background-color: #fff;
z-index: 112;
background-color: #2966FF;
// z-index:2;
&::after{
content:'';
width:100%;
height:60px;
background: linear-gradient(180deg, #2966FF 0%, rgba(41, 102, 255, 0.82) 29%, rgba(41, 102, 255, 0.58) 55%, rgba(41, 102, 255, 0.27) 77%, rgba(7, 78, 255, 0) 100%);
position:absolute;
z-index:2;
top:59px;
}
.logo {
display: inline-block;
height: 30px;
......@@ -17,7 +26,7 @@
.logo-name {
font-size: 14px;
font-weight: 500;
color: #ffb714;
color: #2966FF;
line-height: 20px;
vertical-align: middle;
font-weight: bold;
......@@ -177,7 +186,7 @@
flex: 1;
-webkit-flex: 1;
justify-content: space-between;
margin-left: 54px;
margin-left: 62px;
.college-container {
position: relative;
width: 360px;
......@@ -195,7 +204,7 @@
cursor: pointer;
}
.college-name {
color: #666;
color:#FFFFFF;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
......@@ -204,9 +213,9 @@
.icon {
font-size: 14px;
margin-left: 8px;
color: #8c8e93;
color: #FFF;
&:hover {
color: #555;
color:#FFF;
}
}
}
......@@ -274,9 +283,9 @@
align-items: center;
.store-name {
font-size: 14px;
color: #666;
color: #FFF;
line-height: 49px;
margin-left: 36px;
margin-left: 8px;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
......@@ -294,26 +303,36 @@
display: flex;
align-items: center;
}
.right-bg-img{
img{
width:277px;
height:60px;
}
}
.link-to-store {
display: flex;
height: 49px;
line-height: 49px;
.text {
font-size: 14px;
color: #666;
color: #FFF;
line-height: 49px;
margin-left: 7px;
}
.iconfont {
color: #8c8e93;
&:hover {
color: #555;
}
color: #FFF;
}
.link {
display: flex;
cursor: pointer;
position: relative;
.link-btn{
padding:3px 12px;
border: 1px solid rgba(255, 255, 255, 0.5);
border-radius: 4px;
&:hover{
border: 1px solid rgba(255, 255, 255, 1);
}
}
.store-popover {
display: none;
}
......@@ -343,7 +362,7 @@
line-height: 20px;
}
.url-link {
color: #5289fa;
color: #2966FF;
font-size: 14px;
line-height: 20px;
}
......@@ -374,8 +393,15 @@
}
.share {
cursor: pointer;
display: flex;
margin-left: 16px;
.share-btn{
padding:3px 12px;
border: 1px solid rgba(255, 255, 255, 0.5);
border-radius: 4px;
&:hover{
border: 1px solid rgba(255, 255, 255, 1);
}
}
}
}
.drop-menu {
......@@ -503,6 +529,7 @@
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
color:#FFF;
}
}
}
......
......@@ -147,20 +147,19 @@ function Login(props) {
}
return (
<div className='login-page'>
<div className='login-main'>
<div className='left-banner'>
<div>
<img src='https://image.xiaomaiketang.com/xm/Newk4NrxKC.png' alt='' style={{ width: 60, height: 61 }} />
</div>
<div className='name'>小麦企学院</div>
<div className='desc'>一键开启直播授课 让知识更有价值</div>
<div className="login-page" >
<div className="logo-img-box"><img src="https://image.xiaomaiketang.com/xm/6k8PPCmywG.png" className="logo-img"/></div>
<div className="login-main">
<div className="left-banner">
<div className="img-box"><img src="https://image.xiaomaiketang.com/xm/CDCcdAdaPs.png" alt="" /></div>
</div>
<div className='login-box'>
<div className='login'>
<div className='r'>
<Tabs defaultActiveKey='1'>
<TabPane tab='企业微信登录' key='1'>
<div className="login-box">
<div className="left-top-block color-block"></div>
<div className="right-bottom-block color-block"></div>
<div className="login">
<div className="r">
<Tabs defaultActiveKey="1">
<TabPane tab="企业微信登录" key="1">
<WechatLogin></WechatLogin>
</TabPane>
<TabPane tab='手机号登录' key='2'>
......@@ -172,7 +171,7 @@ function Login(props) {
autoComplete='off'
name='account'
maxLength={11}
placeholder='手机号'
placeholder="请输入手机号"
value={phone}
onChange={(e) => {
setPhone(e.target.value)
......@@ -182,11 +181,11 @@ function Login(props) {
<div className='error-message'></div>
<div className='phoneverify'>
<Input
type='text'
id='phoneverify'
name='phoneverify'
placeholder='验证码'
autoComplete='off'
type="text"
id="phoneverify"
name="phoneverify"
placeholder="请输入验证码"
autoComplete="off"
value={phoneverify}
maxLength={4}
onChange={(e) => {
......
......@@ -4,49 +4,61 @@
font-family: "微软雅黑";
padding: 0;
min-width: 1200px;
background: #21242e;
background: #F4F6FA;
height: 100%;
overflow-y: hidden;
.logo-img-box{
position: absolute;
top:24px;
right:32px;
z-index:1;
.logo-img{
width:120px;
display: inline-block;
}
}
.login-main {
min-width: 1200px;
display: flex;
}
.left-banner {
position: fixed;
min-width: 315px;
text-align: center;
top: 50%;
left: 30%;
-webkit-transform: translate(-50%, -50%);
-moz-transform: translate(-50%, -50%);
-ms-transform: translate(-50%, -50%);
-o-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
.name {
font-size: 30px;
font-weight: 500;
color: #ffffff;
line-height: 42px;
margin-top: 11px;
}
.desc {
font-size: 14px;
font-weight: 400;
color: #ffffff;
line-height: 20px;
margin-top: 10px;
position: relative;
width: 540px;
height: 100vh;
.img-box {
background: #2966FF;
width: 540px;
height: 100vh;
img {
width: 540px;
height: 800px;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%,-50%);
}
}
}
.login-box {
min-width: 360px;
height: 340px;
position: fixed;
top: 50%;
left: 70%;
-webkit-transform: translate(-50%, -50%);
-moz-transform: translate(-50%, -50%);
-ms-transform: translate(-50%, -50%);
-o-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
min-width: 740px;
height: 100vh;
width: calc(100vw - 500px);
position: relative;
.color-block {
width: 256px;
height: 256px;
background: rgba(41, 102, 255, 0.05);
position: absolute;
top:0;
left: 0;
&.right-bottom-block {
top:auto;
left: auto;
bottom: 0;
right: 0;
}
}
.go-to-site {
position: absolute;
bottom: -80px;
......@@ -74,15 +86,18 @@
display: -webkit-flex;
flex-direction: row;
-webkit-flex-direction: row;
height: 100%;
width: 420px;
height: 420px;
position: absolute;
left: 50%;
top:50%;
transform: translate(-50%,-50%);
overflow: hidden;
background-color: #ffffff;
border-radius: 4px; //box-shadow: 0 0 17px @sun;
border-radius: 4px;
.ant-tabs-tab-btn {
color: #999999;
font-size: 16px;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
font-size: 18px;
line-height: 25px;
&.ant-tabs-tab-active {
color: #333333;
......@@ -92,6 +107,7 @@
.ant-tabs-tab-active {
.ant-tabs-tab-btn {
color: #333333;
font-weight:500!important;
}
}
.ant-tabs-nav::before {
......@@ -165,7 +181,7 @@
flex: 1;
-webkit-flex: 1;
height: 100%;
padding: 24px;
padding: 40px;
box-sizing: border-box;
position: relative;
&.show-qrcode {
......@@ -181,6 +197,9 @@
}
}
}
.login-form{
margin-top:32px;
}
.qrcode {
display: none;
text-align: center;
......@@ -364,9 +383,9 @@
border-radius: 3px;
margin-top: 60px;
font-size: 14px; // font-weight: 300;
color:#5289FA;
color:#2966FF;
&:hover {
color: #ffb714;
color: #2966FF;
}
&::before {
content: "";
......@@ -397,7 +416,7 @@
}
.refresh {
font-size: 14px;
color: #5289fa;
color: #2966FF;
cursor: pointer;
}
}
......@@ -411,7 +430,7 @@
}
}
.submit {
margin-top: 11px;
margin-top: 24px;
button {
// font-weight: 300;
}
......@@ -450,7 +469,7 @@
text-align:center;
&:hover {
opacity: 0.7;
background: linear-gradient(90deg, #ffb714 0%, #ffad34 100%);
background: #5C8AFF;
}
}
}
......
......@@ -4,7 +4,7 @@
@import '../../core/global.less';
@import '../../core/filter.less';
@top-height: 50px;
@top-height: 60px;
.right-container {
position: absolute;
......@@ -13,13 +13,20 @@
right: 0;
bottom: 0;
background-color: #f0f2f5;
overflow-x: scroll;
z-index: 1;
height: calc(~'100% - 50px');
&.right-container-vertical {
left: @xm-left-min-width;
.page {
.page {
overflow-x: auto;
padding:0 16px;
// z-index: 1;
&.right-container-vertical{
left:@xm-left-min-width;
.page{
.footer {
left: 80px;
width: calc(100% - 102px);
}
.xm-breadCrumb {
width: 100%;
}
.page{
left: @xm-left-min-width;
}
}
......
@import '../../core/variables.less';
@top-height: 50px;
@menu-bakg: #2B2E37;
@active-color: #FFB714;
@top-height: 60px;
@menu-bakg: #FFF;
@active-color: #2966FF;
.left-container {
position: absolute;
z-index: 2;
......@@ -11,10 +11,19 @@
bottom: 0;
width: @xm-left-width;
background: @menu-bakg;
color: #FFFFFF;
color: #333;
.menu-type-icon{
margin:4px 0 0px 150px;
cursor: pointer;
.icon{
font-size:14px;
color:#5E606A;
}
}
.ant-menu {
padding-left: 0 !important;
background: transparent;
color: #333;
background: #FFF !important;
}
.left {
-webkit-user-select: none;
......@@ -25,13 +34,11 @@
display: -webkit-flex;
flex-direction: column;
-webkit-flex-direction: column;
height: 100%;
.nav {
-webkit-flex: 1;
cursor: default;
font-size: 16px;
margin-top: 16px;
height: calc(~'100% - 72px');
overflow: auto;
&::-webkit-scrollbar {
......@@ -40,6 +47,11 @@
.icon {
margin-right: 20px
}
.icon-img{
width:16px;
height:16px;
margin-right:16px;
}
.listType {
width: 5px;
height: 5px;
......@@ -49,12 +61,32 @@
left: 38px;
position: absolute;
}
.ant-menu-item{
padding-left: 13px !important;
padding-right: 0px;
margin: 6px 8px;
width: calc(100% - 15px);
&:hover{
background: #F3F6FA;
border-radius: 2px;
color:#333;
}
}
.ant-menu-item-selected{
color:@active-color;
background-color:@active-color;
color:#FFF;
border-radius:2px;
&:hover{
color:#FFF;
}
}
.ant-menu-sub{
.ant-menu-submenu{
.ant-menu-submenu-title{
margin:6px 8px;
padding-left:13px !important;
}
.ant-menu-item{
padding-left:58px
padding-left:46px !important;
}
}
......@@ -69,78 +101,70 @@
}
}
.ant-menu-submenu-arrow{
right:22px;
color:#5E606A;
}
}
}
&.left-container-vertical {
width: 62px;
width: 56px;
.menu-type-icon{
margin:4px 0 0px 22px;
}
.left {
.ant-menu-submenu-arrow{
display:none !important;
}
}
}
.shink-footer {
left: 74px;
}
// &:hover{
// .menu-type-icon{
// display:inline-block;
// }
// }
}
.ant-menu-dark.ant-menu-dark:not(.ant-menu-horizontal) .ant-menu-item-selected {
background:@menu-bakg !important;
.ant-menu:not(.ant-menu-horizontal) .ant-menu-item-selected {
background:@active-color !important;
}
.ant-menu.ant-menu-dark, .ant-menu-dark .ant-menu-sub, .ant-menu.ant-menu-dark .ant-menu-sub{
background: @menu-bakg !important;
}
.ant-menu-submenu-popup{
left:67px !important;
}
.ant-menu-submenu-popup>.ant-menu {
background: @menu-bakg !important;
color: #9A9DA7;
padding-left: 15px;
color: #333;
width: 132px;
min-width: auto;
li {
padding-left: 22px;
padding-right: 0;
width: 117px;
margin-bottom:0 !important;
&:first-child{
margin-top:8px !important;
width: calc(100% - 16px);
padding-left: 20px;
margin:12px 8px !important;
&:hover{
background: #F3F6FA;
border-radius: 2px;
color:#333 !important;
}
&:last-child{
margin-bottom:8px !important;
}
}
.listType {
width: 5px;
height: 5px;
background: #9A9DA7;
border-radius: 50%;
top: 18px;
left: 10px;
position: absolute;
}
.ant-menu-item-selected {
background: @menu-bakg;
background: @active-color;
color: #fff;
.listType {
background: @active-color;
&:hover{
color: #fff !important;
}
}
&:hover {
.ant-menu-item-active {
color: #fff;
.listType {
background: #fff;
}
}
.ant-menu-item-selected {
.listType {
background: @active-color;
}
}
}
}
......@@ -10,7 +10,7 @@ import "./Menu.less";
const { SubMenu } = Menu;
function Aside(props: any) {
const {menuType} = props
const {menuType,handleMenuType}= props
const ctx: any = useContext(XMContext);
const [selectKey, setSelectKey] = useState();
const [openKeys, setOpenKeys] = useState(['']);
......@@ -41,6 +41,9 @@ function Aside(props: any) {
setOpenKeys([key]);
}
}
function handleMenu() {
handleMenuType();
}
return (
<div
......@@ -51,6 +54,21 @@ function Aside(props: any) {
: "left-container left-container-vertical"
}
>
<div className="menu-type-icon" onClick={handleMenu}>
{menuType ? (
<span
className="icon iconfont"
>
&#xe83d;
</span>
) : (
<span
className="icon iconfont"
>
&#xe615;
</span>
)}
</div>
<div className="left">
<div className="nav">
......@@ -58,7 +76,6 @@ function Aside(props: any) {
style={{ minHeight: "100%", background: '#0E1935' }}
selectedKeys={selectKey}
openKeys={openKeys}
theme="dark"
inlineCollapsed={false}
mode={menuType ? "inline" : "vertical"}
>
......@@ -68,31 +85,19 @@ function Aside(props: any) {
return null;
}
if (item.children) {
return <SubMenu
key={item.groupCode}
style={{ marginTop: 0 }}
className="first-menu-item"
title={
<div>
<span
style={{ marginRight: 6 }}
className="iconfont icon"
dangerouslySetInnerHTML={{ __html: item.icon }}
></span>
{menuType &&
<span>{item.groupName}</span>
}
</div>
}
onTitleClick={() => onOpenChange(item.groupCode)}
>
return <SubMenu key={item.groupCode} style={{ marginTop: 0 }} className="first-menu-item" title={<div >
{/* <span style={{ marginRight: 16 }} className="iconfont icon" dangerouslySetInnerHTML={{ __html:item.icon}}></span> */}
<img src={item.img} className="icon-img"></img>
{menuType &&
<span>{item.groupName}</span>
}</div>
} onTitleClick={() => onOpenChange(item.groupCode)}>
{
item.children.map((_item: any, _index: any) => {
if (ctx.xmState.storeUserPermissionList.indexOf(_item.groupCode) === -1) {
return null;
}
return <Menu.Item onClick={() => { toggleMenu(_item) }} style={{ marginTop: 0 }} key={_item.groupCode + index + _index}>
<span className="listType"></span>
<span className="name">{_item.groupName}</span>
</Menu.Item>
......@@ -101,8 +106,14 @@ function Aside(props: any) {
</SubMenu>
} else {
return <Menu.Item onClick={() => { toggleMenu(item) }} key={item.groupCode} className="first-menu-item">
{/* <span style={{ marginRight: 16 }} className="iconfont icon" dangerouslySetInnerHTML={{ __html:item.icon}}></span> */}
{selectKey === item.groupCode ?
<img src={item.selectImg} className="icon-img"></img>
:
<img src={item.img} className="icon-img"></img>
}
<span style={{ marginRight: 6 }} className="iconfont icon" dangerouslySetInnerHTML={{ __html:item.icon}}></span>
{menuType &&
<span>{item.groupName}</span>
}
......
......@@ -9,35 +9,39 @@
color: #999999;
line-height: 20px;
}
.rwm {
.rwm{
position: relative;
width: 160px;
height: 160px;
width: 210px;
height: 210px;
text-align: center;
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;
font-weight: 400;
color: #333333;
line-height: 20px;
}
.ope {
cursor: pointer;
color: rgba(82, 137, 250, 1);
}
border: 1px solid #e8e8e8;
border-radius: 2px;
padding:15px;
.error{
position: absolute;
width: 200px;
height: 200px;
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);
}
}
}
......
......@@ -36,8 +36,9 @@ export default function WechatLogin(props: any) {
let qrnode = new qrcode({
text: redirect,
correctLevel: 2,
size: 160,
image: 'https://image.xiaomaiketang.com/xm/Newk4NrxKC.png',
size: 180,
// image: 'https://image.xiaomaiketang.com/xm/Newk4NrxKC.png',
image: 'https://image.xiaomaiketang.com/xm/bFkRBz7teA.png',
imageSize: 50
});
qrcodeWrapDom.innerHTML = '';
......
......@@ -4,19 +4,19 @@
}
.add-btn{
font-weight: 400;
color: #5289FA;
color: #2966FF;
line-height: 20px;
cursor: pointer;
}
.edit-btn{
font-weight: 400;
color: #5289FA;
color: #2966FF;
line-height: 20px;
cursor: pointer;
}
.delete-btn{
font-weight: 400;
color: #5289FA;
color: #2966FF;
line-height: 20px;
cursor: pointer;
}
......
......@@ -51,14 +51,14 @@
.operation {
.edit {
color: #5289fa;
color: #2966FF;
cursor: pointer;
}
.divider-line {
color:#BFBFBF
}
.delete {
color: #5289fa;
color: #2966FF;
cursor: pointer;
}
}
......
/*
* @Author: wufan
* @Date: 2020-11-30 10:47:38
* @LastEditors: zhangleyuan
* @LastEditTime: 2021-02-01 14:02:11
* @LastEditors: wufan
* @LastEditTime: 2021-05-28 16:20:26
* @Description: web学院banner页面
* @@Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有
*/
......@@ -372,7 +372,7 @@ class StoreH5Decoration extends React.Component {
/>
);
return (
<div className="user-manage-page">
<div className="store-decoration-h5-page">
<div className="box-header">
<div className="banner-setting">
<div className="title">banner设置</div>
......
......@@ -40,7 +40,7 @@
}
.operate-con{
.upload-btn{
color:#5289FA;
color:#2966FF;
font-size:14px;
margin-bottom:4px;
}
......
/*
* @Author: wufan
* @Date: 2020-11-30 10:47:38
* @LastEditors: yuananting
* @LastEditTime: 2021-03-18 11:29:43
* @LastEditors: wufan
* @LastEditTime: 2021-05-28 16:21:04
* @Description: web学院banner页面
* @@Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有
*/
......@@ -370,7 +370,7 @@ class StoreWebDecoration extends React.Component {
/>
);
return (
<div className="user-manage-page">
<div className="store-decoration-web-page">
<div className="box-header">
<div className="banner-setting">
<div className="title">banner设置</div>
......
......@@ -11,7 +11,7 @@
}
.course-category-tree {
position: relative;
margin-top: 16px;
margin-top: 12px;
width: 900px;
border: 1px solid #e8e8e8;
.ant-tree.ant-tree-directory {
......@@ -29,7 +29,7 @@
vertical-align: middle;
}
.ant-tree-node-content-wrapper.ant-tree-node-selected {
color: #666666;
color: #2966FF;
}
.ant-tree-node-content-wrapper {
display: flex;
......@@ -50,7 +50,7 @@
}
.ant-tree-treenode-selected:hover::before,
.ant-tree-treenode-selected::before {
background: #fffbf1;
background: rgba(238, 243, 255, 1);
}
}
}
......
......@@ -17,14 +17,14 @@
}
.sider-tree {
width: 240px;
width: 244px;
overflow: scroll;
height: calc(100vh - 300px);
.empty-tree-tip {
text-align: center;
margin-top: 100%;
.empty-tree-btn {
color: #ffb714;
color: #2966FF;
cursor: pointer;
}
}
......@@ -49,7 +49,7 @@
}
.ant-tree-treenode-selected:hover::before,
.ant-tree-treenode-selected::before {
background: #fffbf1;
background: rgba(238, 243, 255, 1);
}
}
}
......
.examPage{
padding-bottom: 62px;
.ant-alert-info{
background: rgba(255, 244, 221, 1);
border: none;
padding-bottom: 50px;
.box {
padding-bottom: 40px!important;
}
.ant-form-item{
&:last-child{
......@@ -66,13 +65,14 @@
}
.footer {
position: fixed;
left: 196px;
bottom: 0;
height: 58px;
width: 100%;
width: ~'calc(100% - 218px)';
display: flex;
align-items: center;
justify-content: flex-end;
padding-right: 252px;
padding-right: 72px;
background: #fff;
border-top: 1px solid #E8E8E8;
z-index: 9999;
......
......@@ -9,6 +9,8 @@ import _ from 'underscore'
import GraphicsEditor from '../../course-manage/components/GraphicsEditor';
import SelectPaperModal from './SelectPaperModal'
import PreviewModal from './PreviewModal'
import ShowTips from "@/components/ShowTips";
import './AddExam.less';
const { RangePicker } = DatePicker;
......@@ -230,8 +232,9 @@ function AddExam(props: any) {
<Breadcrumbs navList={props.type === 'edit' ? "编辑考试" : "新建考试"} goBack={handleGoBack} />
<div className="box">
<Alert message="请遵守国家相关规定,切勿上传低俗色情、暴力恐怖、谣言诈骗、侵权盗版等相关内容,小麦企学院保有依据国家规定及平台规则进行处理的权利" type="info" showIcon />
<div className="form">
<div className="show-tips">
<ShowTips message="请遵守国家相关规定,切勿上传低俗色情、暴力恐怖、谣言诈骗、侵权盗版等相关内容,小麦企学院保有依据国家规定及平台规则进行处理的权利" />
</div> <div className="form">
<div className="title">基本信息</div>
<Form
labelCol={{ span: 3 }}
......@@ -418,7 +421,7 @@ function AddExam(props: any) {
setPaperInfo(info)
}} paperInfo={paperInfo} close={() => { setShowModal(false) }}></SelectPaperModal>
}
<div className="footer">
<div className="footer shrink-footer">
<Button onClick={handleGoBack}>取消</Button>
<Button onClick={() => { setPreview(true) }}>预览</Button>
<Button type="primary" onClick={handleSave}>保存</Button>
......
......@@ -129,6 +129,7 @@ function ExaminationManager(props: any) {
{
title: "创建时间",
dataIndex: "examCreateTime",
align:fixStr.right,
sorter: true,
sortOrder: field === "examCreateTime" ? order : sortStatus.type,
render: (text: any, record: any) => <span>{moment(text).format("YYYY-MM-DD HH:mm")}</span>,
......@@ -293,7 +294,7 @@ function ExaminationManager(props: any) {
<div style={{ display: 'flex' }}>
<div className="search-condition">
<div className="search-condition__item">
<span className="search-name">考试名称:</span>
<span className="search-name">考试名称</span>
<Search
value={query.examName}
className='search-input'
......@@ -321,7 +322,7 @@ function ExaminationManager(props: any) {
></TeacherSelect>
<div className="search-condition__item">
<span className="search-name">考试时间:</span>
<span className="search-name">考试时间</span>
<RangePicker
className='search-input'
value={[
......@@ -339,7 +340,7 @@ function ExaminationManager(props: any) {
</div>
{
!!expandFilter && <div className="search-condition__item">
<span className="search-name">创建时间:</span>
<span className="search-name">创建时间</span>
<RangePicker
className='search-input'
value={[
......
......@@ -6,4 +6,11 @@
padding: 2px 4px;
line-height: 16px;
}
.ant-table-column-sorters {
justify-content: flex-end;
}
.ant-table-column-sorter {
margin-top: 0px !important;
}
}
\ No newline at end of file
/*
* @Author: yuananting
* @Date: 2021-03-27 16:15:13
* @LastEditors: zhangleyuan
* @LastEditTime: 2021-05-10 10:16:31
* @LastEditors: wufan
* @LastEditTime: 2021-05-30 16:56:15
* @Description: 助学工具-新建/复制/编辑试卷
* @Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有
*/
......@@ -490,7 +490,7 @@ class OperatePaper extends Component {
title: "题型",
dataIndex: "questionType",
key: "questionType",
width: "16%",
width: "12%",
sorter: true,
showSorterTooltip: false,
filters: [
......@@ -552,7 +552,8 @@ class OperatePaper extends Component {
<Tooltip title="多选题和填空题的漏选/半对得分不能高于题目本身分值">
<span
className="icon iconfont"
style={{ color: "#BFBFBF", fontSize: 14 }}
style={{ color: "#BFBFBF", fontSize: 14,fontWeight:"400"
}}
>
&#xe7c4;
</span>
......@@ -707,7 +708,7 @@ class OperatePaper extends Component {
<div className="show-tips">
<ShowTips message="请遵守国家相关规定,切勿上传低俗色情、暴力恐怖、谣言诈骗、侵权盗版等相关内容,小麦企学院保有依据国家规定及平台规则进行处理的权利" />
</div>
<Form ref={this.formRef} style={{ marginTop: 24 }}>
<Form ref={this.formRef} style={{ marginTop: 24, marginBottom: '85px' }}>
<Form.Item
name="paperName"
label="试卷名称:"
......@@ -798,11 +799,12 @@ class OperatePaper extends Component {
dataSource={selectQuestionList}
pagination={false}
onChange={this.sortByQuestionType}
selections={false}
/>
</ConfigProvider>
</Form>
</div>
<div className="footer">
<div className="footer shrink-footer">
<Button onClick={this.handleGoBack}>取消</Button>
<Button onClick={this.previewPaper}>预览</Button>
<Button type="primary" onClick={this.savePaper}>
......
.operate-paper-page {
.box {
margin-bottom: 66px !important;
margin-bottom: 52px !important;
.table-style {
border: 1px solid #f0f0f0 !important;
}
......@@ -20,14 +20,14 @@
color: #999999;
line-height: 20px;
span {
color: #ffb714;
color: #2966FF;
}
}
.record-operate {
display: flex;
&__item {
color: #5289fa;
color: #2966FF;
cursor: pointer;
&.split {
......@@ -44,13 +44,14 @@
.footer {
position: fixed;
left: 196px;
bottom: 0;
height: 58px;
width: 100%;
width: ~'calc(100% - 218px)';
display: flex;
align-items: center;
justify-content: flex-end;
padding-right: 252px;
padding-right: 72px;
background: #fff;
border-top: 1px solid #e8e8e8;
z-index: 999;
......@@ -58,6 +59,19 @@
margin-left: 10px;
}
}
.ant-table tbody tr {
&:last-child {
td {
border-bottom: none!important;
}
}
}
.ant-table-thead>tr>th:not(:last-child):not(.ant-table-selection-column):not(.ant-table-row-expand-icon-cell):not([colspan]) {
&::before {
width: 0!important;
}
}
}
.aid-tool-list {
......
......@@ -47,7 +47,7 @@
position: relative;
margin-top: 16px;
.empty-list-tip {
color: #ffb714;
color: #2966FF;
cursor: pointer;
}
.record-name {
......@@ -59,7 +59,7 @@
display: flex;
&__item {
color: #5289fa;
color: #2966FF;
cursor: pointer;
&.split {
......
......@@ -381,7 +381,7 @@ class SelectQuestionList extends Component {
<div className="select-tip-box">
<div>
<span className="icon iconfont tip-icon">&#xe61d;</span>
<span style={{marginRight: 8}}>已选<span style={{color: "#FFB714"}}>{selectQuestionKeys.length}</span></span>
<span style={{marginRight: 8}}>已选<span style={{color: "#2966FF"}}>{selectQuestionKeys.length}</span></span>
{selectQuestionKeys.length > 0 && (
<span>(
{singleCount > 0 && ` 单选题${singleCount}题 `}
......
......@@ -44,7 +44,7 @@
position: relative;
margin-top: 16px;
.empty-list-tip {
color: #ffb714;
color: #2966FF;
cursor: pointer;
}
.record-name {
......@@ -56,7 +56,7 @@
display: flex;
&__item {
color: #5289fa;
color: #2966FF;
cursor: pointer;
&.split {
......@@ -67,13 +67,13 @@
}
}
.select-tip-box {
background: #fff4dd;
background: #E9EFFF;
border-radius: 4px;
padding: 6px 16px;
display: flex;
justify-content: space-between;
.tip-icon {
color: #ff9d14;
color: #2966FF;
font-size: 14px;
margin-right: 4px;
}
......@@ -82,7 +82,7 @@
font-size: 14px;
}
.clear-btn {
color: #5289fa;
color: #2966FF;
font-size: 14px;
cursor: pointer;
}
......
/*
* @Author: yuananting
* @Date: 2021-02-25 13:46:35
* @LastEditors: yuananting
* @LastEditTime: 2021-05-10 20:33:16
* @LastEditors: wufan
* @LastEditTime: 2021-05-24 11:32:47
* @Description: 助学工具-题库-新建/编辑题目
* @Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有
*/
......@@ -325,7 +325,7 @@ class OperateQuestion extends Component {
className="icon iconfont"
style={{
color:
activeKey === "SINGLE_CHOICE" ? "#ffb714" : "#CCCCCC",
activeKey === "SINGLE_CHOICE" ? "#2966FF" : "#CCCCCC",
}}
>
&#xe7fa;{" "}
......@@ -354,7 +354,7 @@ class OperateQuestion extends Component {
className="icon iconfont"
style={{
color:
activeKey === "MULTI_CHOICE" ? "#ffb714" : "#CCCCCC",
activeKey === "MULTI_CHOICE" ? "#2966FF" : "#CCCCCC",
}}
>
&#xe7fb;{" "}
......@@ -382,7 +382,7 @@ class OperateQuestion extends Component {
<span
className="icon iconfont"
style={{
color: activeKey === "JUDGE" ? "#ffb714" : "#CCCCCC",
color: activeKey === "JUDGE" ? "#2966FF" : "#CCCCCC",
}}
>
&#xe7fc;{" "}
......@@ -410,7 +410,7 @@ class OperateQuestion extends Component {
className="icon iconfont"
style={{
color:
activeKey === "GAP_FILLING" ? "#ffb714" : "#CCCCCC",
activeKey === "GAP_FILLING" ? "#2966FF" : "#CCCCCC",
}}
>
&#xe7fd;{" "}
......@@ -439,7 +439,7 @@ class OperateQuestion extends Component {
style={{
color:
activeKey === "INDEFINITE_CHOICE"
? "#ffb714"
? "#2966FF"
: "#CCCCCC",
}}
>
......@@ -472,7 +472,7 @@ class OperateQuestion extends Component {
</TabPane>
</Tabs>
</div>
<div className="footer">
<div className="footer shrink-footer">
<Button
onClick={() => {
this.handleGoBack();
......
.operate-question-page {
.box {
margin-bottom: 66px !important;
margin-bottom: 52px !important;
.ant-tabs {
color: #666666;
}
......@@ -8,13 +8,14 @@
.footer {
position: fixed;
left: 196px;
bottom: 0;
height: 58px;
width: 100%;
width: ~'calc(100% - 218px)';
display: flex;
align-items: center;
justify-content: flex-end;
padding-right: 252px;
padding-right: 72px;
background: #fff;
border-top: 1px solid #e8e8e8;
z-index: 999;
......
/*
* @Author: yuananting
* @Date: 2021-02-25 14:34:29
* @LastEditors: yuananting
* @LastEditTime: 2021-03-29 16:22:15
* @LastEditors: wufan
* @LastEditTime: 2021-05-14 18:17:08
* @Description: 助学工具-题库-操作题目Tab
* @Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有
*/
......@@ -600,7 +600,7 @@ class OperateQuestionTab extends Component {
/>
)}
<Tag
style={{ color: "#5289FA", fontSize: 14 }}
style={{ color: "#2966FF", fontSize: 14 }}
onClick={() => {
this.addAnswerTag(optionItem);
}}
......
......@@ -24,7 +24,7 @@
color: #999999;
margin-top: 8px;
.fill-info_icon {
color: #5289fa;
color: #2966FF;
font-size: 14px;
padding-left: 9px;
cursor: pointer;
......@@ -229,7 +229,7 @@
line-height: 33px;
align-self: stretch;
.option-operate_item__icon:hover {
color: #ffb714;
color: #2966FF;
}
.icon {
color: #bfbfbf;
......@@ -252,7 +252,7 @@
border-radius: 4px;
border: 1px dashed #e8e8e8;
font-size: 14px;
color: #5289fa;
color: #2966FF;
line-height: 44px;
text-align: center;
cursor: pointer;
......
......@@ -26,7 +26,7 @@
}
.editor-fill-info_icon {
color: #5289fa !important;
color: #2966FF !important;
font-size: 14px;
padding-left: 9px !important;
cursor: pointer;
......@@ -163,7 +163,7 @@
&:hover {
.edtior-media_item__icon {
color: #ffb714;
color: #2966FF;
}
}
......
......@@ -44,7 +44,7 @@
position: relative;
margin-top: 16px;
.empty-list-tip {
color: #ffb714;
color: #2966FF;
cursor: pointer;
}
.record-name {
......@@ -56,7 +56,7 @@
display: flex;
&__item {
color: #5289fa;
color: #2966FF;
cursor: pointer;
&.split {
......
......@@ -183,11 +183,11 @@ class BatchImportQuestionModal extends Component {
/>
<p className="status">导入完成</p>
<p className="status-tip">
<span style={{ color: successCnt === 0 ? "" : "#FF9D14" }}>
<span style={{ color: successCnt === 0 ? "" : "#2966FF" }}>
{successCnt}
</span>
个题目导入成功,
<span style={{ color: failCnt === 0 ? "" : "#FF9D14" }}>
<span style={{ color: failCnt === 0 ? "" : "#2966FF" }}>
{failCnt}
</span>
个题目导入失败。
......
......@@ -63,7 +63,7 @@
}
.down-btn {
text-align: left;
color: #5289fa;
color: #2966FF;
font-size: 12px;
display: block;
margin-top: 8px;
......
......@@ -209,7 +209,6 @@
color: #666666;
.desc-input-box {
margin-bottom: 8px;
display: inline-block;
*:not(p) {
font-weight: normal !important;
font-size: 14px !important;
......@@ -219,7 +218,6 @@
}
}
.desc-picture-box {
display: inline-flex;
margin-bottom: 16px;
.picture-box {
width: 88px;
......
/*
* @Author: yuananting
* @Date: 2021-02-21 15:53:31
* @LastEditors: wufan
* @LastEditTime: 2021-05-13 16:40:11
* @LastEditors: Please set LastEditors
* @LastEditTime: 2021-05-30 11:00:09
* @Description: 描述一下咯
* @Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有
*/
......@@ -10,13 +10,16 @@ export const menuList: any = [
{
groupName: "中心首页",
groupCode: "CloudPage",
icon: '&#xe6b7;',
link: '/home'
icon: '&#xe8a7;',
link: '/home',
img:'https://image.xiaomaiketang.com/xm/ni3BFJDT3a.png',
selectImg:'https://image.xiaomaiketang.com/xm/GRDztTAWaM.png'
},
{
groupName: "课程管理",
groupCode: "CloudCourse",
icon: '&#xe831;',
icon: '&#xe8a5;',
img:'https://image.xiaomaiketang.com/xm/jBGrGjM7HQ.png',
children: [
{
groupName: "直播课",
......@@ -43,19 +46,24 @@ export const menuList: any = [
{
groupName: "知识库",
groupCode: "CloudKnowledge",
icon: '&#xe840;',
link: '/knowledge-base'
icon: '&#xe8a8;',
link: '/knowledge-base',
img:'https://image.xiaomaiketang.com/xm/8sbP5rGQWh.png',
selectImg:'https://image.xiaomaiketang.com/xm/hJKCfibC22.png'
},
{
groupName: "资料云盘",
groupCode: "CloudDisk",
icon: '&#xe83b;',
link: '/resource-disk'
icon: '&#xe8aa;',
link: '/resource-disk',
img:'https://image.xiaomaiketang.com/xm/zGKbXJPzXx.png',
selectImg:'https://image.xiaomaiketang.com/xm/5sN4MzjxYc.png',
},
{
groupName: "培训管理",
groupCode: "TrainManage",
icon: '&#xe863;',
icon: '&#xe8a6;',
img:'https://image.xiaomaiketang.com/xm/Yy6pZ6G6kS.png',
children: [
{
groupName: "培训计划",
......@@ -67,7 +75,8 @@ export const menuList: any = [
{
groupName: "助学工具",
groupCode: "AidTool",
icon: '&#xe828;',
icon: '&#xe8a9;',
img:'https://image.xiaomaiketang.com/xm/xsma4hx3b3.png',
children: [
{
groupName: "题库",
......@@ -89,7 +98,8 @@ export const menuList: any = [
{
groupName: "学院管理",
groupCode: "CloudShop",
icon: '&#xe82e;',
icon: '&#xe8a4;',
img:'https://image.xiaomaiketang.com/xm/Q8i5RSMKNc.png',
children: [
{
groupName: "学院信息",
......
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