Merge branch 'dev_aliyun' of http://bdgit.educoder.net/Hjqreturn/educoder into dev_aliyun

sso
jingquan huang 5 years ago
commit c517b10cc7

@ -14,6 +14,10 @@ module ControllerRescueHandler
Util.logger_error e Util.logger_error e
render json: {status: -1, message: "接口方法异常"} render json: {status: -1, message: "接口方法异常"}
end end
rescue_from ActionController::UnknownFormat do |e|
render json: {status: -1, message: "接口调用非JSON格式"}
end
# rescue_from ActionView::MissingTemplate, with: :object_not_found # rescue_from ActionView::MissingTemplate, with: :object_not_found
# rescue_from ActiveRecord::RecordNotFound, with: :object_not_found # rescue_from ActiveRecord::RecordNotFound, with: :object_not_found
rescue_from Educoder::TipException, with: :tip_show rescue_from Educoder::TipException, with: :tip_show

@ -3,5 +3,5 @@ class ExaminationIntelligentSetting < ApplicationRecord
belongs_to :user belongs_to :user
has_many :examination_type_settings, dependent: :destroy has_many :examination_type_settings, dependent: :destroy
has_many :tag_discipline_containers, as: :container, dependent: :destroy has_many :tag_discipline_containers, as: :container, dependent: :destroy
has_many :item_baskets, dependent: :destroy has_many :item_baskets, -> { order("item_baskets.position ASC") }, dependent: :destroy
end end

@ -30,11 +30,13 @@
</td> </td>
<td><%= user.real_name %></td> <td><%= user.real_name %></td>
<td><%= raw [user.school_name.presence, user.department_name.presence].compact.join('<br/>') %></td> <td><%= raw [user.school_name.presence, user.department_name.presence].compact.join('<br/>') %></td>
<td> <td class="text-left">
<% if item.item_type == "PROGRAM" %> <% if item.item_type == "PROGRAM" %>
<%= link_to item.name, "/problems/#{item.container&.identifier}/edit", target: "_blank" %> <%= link_to item.name, "/problems/#{item.container&.identifier}/edit", class: "d-inline-block text-truncate",
style: "max-width: 280px", target: "_blank", data: { toggle: 'tooltip', title: "#{item.name}"} %>
<% else %> <% else %>
<%= link_to item.name, admins_item_authentication_path(apply), remote: true %> <%= link_to item.name, admins_item_authentication_path(apply), remote: true, class: "d-inline-block text-truncate",
style: "max-width: 280px", data: { toggle: 'tooltip', title: "#{item.name}"} %>
<% end %> <% end %>
</td> </td>
<td><%= item.type_string %></td> <td><%= item.type_string %></td>

@ -32,7 +32,7 @@ module.exports = {
// See the discussion in https://github.com/facebookincubator/create-react-app/issues/343.s // See the discussion in https://github.com/facebookincubator/create-react-app/issues/343.s
//devtool: "cheap-module-eval-source-map", //devtool: "cheap-module-eval-source-map",
// 开启调试 // 开启调试
//devtool: "source-map", // 开启调试 devtool: "source-map", // 开启调试
// These are the "entry points" to our application. // These are the "entry points" to our application.
// This means they will be the "root" imports that are included in JS bundle. // This means they will be the "root" imports that are included in JS bundle.
// The first two entry points enable "hot" CSS and auto-refreshes for JS. // The first two entry points enable "hot" CSS and auto-refreshes for JS.

@ -30,6 +30,18 @@
<div class="content unicode" style="display: block;"> <div class="content unicode" style="display: block;">
<ul class="icon_lists dib-box"> <ul class="icon_lists dib-box">
<li class="dib">
<span class="icon iconfont">&#xe72a;</span>
<div class="name">编辑</div>
<div class="code-name">&amp;#xe72a;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe72b;</span>
<div class="name">绑定</div>
<div class="code-name">&amp;#xe72b;</div>
</li>
<li class="dib"> <li class="dib">
<span class="icon iconfont">&#xe729;</span> <span class="icon iconfont">&#xe729;</span>
<div class="name">播放</div> <div class="name">播放</div>
@ -2000,6 +2012,24 @@
<div class="content font-class"> <div class="content font-class">
<ul class="icon_lists dib-box"> <ul class="icon_lists dib-box">
<li class="dib">
<span class="icon iconfont icon-bianji4"></span>
<div class="name">
编辑
</div>
<div class="code-name">.icon-bianji4
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-bangding"></span>
<div class="name">
绑定
</div>
<div class="code-name">.icon-bangding
</div>
</li>
<li class="dib"> <li class="dib">
<span class="icon iconfont icon-bofang2"></span> <span class="icon iconfont icon-bofang2"></span>
<div class="name"> <div class="name">
@ -4909,6 +4939,22 @@
<div class="content symbol"> <div class="content symbol">
<ul class="icon_lists dib-box"> <ul class="icon_lists dib-box">
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-bianji4"></use>
</svg>
<div class="name">编辑</div>
<div class="code-name">#icon-bianji4</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-bangding"></use>
</svg>
<div class="name">绑定</div>
<div class="code-name">#icon-bangding</div>
</li>
<li class="dib"> <li class="dib">
<svg class="icon svg-icon" aria-hidden="true"> <svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-bofang2"></use> <use xlink:href="#icon-bofang2"></use>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -5,6 +5,20 @@
"css_prefix_text": "icon-", "css_prefix_text": "icon-",
"description": "", "description": "",
"glyphs": [ "glyphs": [
{
"icon_id": "2077714",
"name": "编辑",
"font_class": "bianji4",
"unicode": "e72a",
"unicode_decimal": 59178
},
{
"icon_id": "10199180",
"name": "绑定",
"font_class": "bangding",
"unicode": "e72b",
"unicode_decimal": 59179
},
{ {
"icon_id": "13097093", "icon_id": "13097093",
"name": "播放", "name": "播放",

@ -20,6 +20,12 @@ Created by iconfont
/> />
<missing-glyph /> <missing-glyph />
<glyph glyph-name="bianji4" unicode="&#59178;" d="M934.724189 617.173271L834.414864 516.863946 653.380212 697.898598l100.394659 100.351991A42.257063 42.257063 0 0 0 783.769535 810.666588c6.527999 0 19.157332-1.621333 29.951997-12.415999l121.002657-121.002656a42.538663 42.538663 0 0 0 0-60.074662zM299.374908-18.176009l-200.661316-19.626665 19.669331 200.661316L593.049551 637.52527 774.084202 456.533285l-474.709294-474.709294z m695.679942 755.79727L874.09486 858.581251A127.317323 127.317323 0 0 1 783.769535 895.999915c-32.725331 0-65.407995-12.458666-90.367993-37.418664l-646.229279-646.229279c-7.082666-7.082666-11.434666-16.469332-12.287999-26.495998l-26.197331-267.818645c-2.133333-25.002665 17.706665-46.037329 42.239996-46.037329 1.194667 0 2.432 0.042667 3.626666 0.128l267.818645 26.239998a42.12053 42.12053 0 0 1 26.495998 12.287999l646.186612 646.186613c49.919996 49.919996 49.919996 130.858656 0 180.778651z" horiz-adv-x="1032" />
<glyph glyph-name="bangding" unicode="&#59179;" d="M722.7 241.2l-45.2 45.2 140.1 140.1C890 499 890 617 817.6 689.4c-72.5 72.5-190.4 72.5-262.9 0l-140.1-140-45.2 45.2 140.1 140.1c97.4 97.5 256 97.4 353.4 0 97.4-97.4 97.4-256 0-353.4L722.7 241.2zM338.1-39.9c-66.8 0-129.5 26-176.7 73.2-97.4 97.4-97.4 256 0 353.4l140.1 140.1 45.2-45.2-140.1-140.2c-72.5-72.5-72.5-190.4 0-262.9 35.1-35.1 81.8-54.5 131.5-54.5s96.3 19.3 131.4 54.5l140.1 140.1 45.2-45.2-140-140.1c-47.2-47.2-110-73.2-176.7-73.2zM330.99 248.121l316.78 316.781 45.255-45.254-316.781-316.78z" horiz-adv-x="1024" />
<glyph glyph-name="bofang2" unicode="&#59177;" d="M692.224 400.384l-4.096 4.096L430.08 551.936c-4.096 4.096-8.192 4.096-12.288 4.096-12.288 0-20.48-8.192-20.48-20.48v-303.104c0-12.288 8.192-20.48 20.48-20.48 4.096 0 8.192 0 12.288 4.096L688.128 363.52h4.096c4.096 4.096 8.192 8.192 8.192 16.384s-4.096 16.384-8.192 20.48zM438.272 265.216V502.784L647.168 384 438.272 265.216zM512 797.696C282.624 797.696 98.304 613.376 98.304 384S282.624-29.696 512-29.696c229.376 0 413.696 184.32 413.696 413.696S741.376 797.696 512 797.696z m0-790.528c-208.896 0-376.832 167.936-376.832 376.832S303.104 760.832 512 760.832 888.832 592.896 888.832 384 720.896 7.168 512 7.168z" horiz-adv-x="1024" /> <glyph glyph-name="bofang2" unicode="&#59177;" d="M692.224 400.384l-4.096 4.096L430.08 551.936c-4.096 4.096-8.192 4.096-12.288 4.096-12.288 0-20.48-8.192-20.48-20.48v-303.104c0-12.288 8.192-20.48 20.48-20.48 4.096 0 8.192 0 12.288 4.096L688.128 363.52h4.096c4.096 4.096 8.192 8.192 8.192 16.384s-4.096 16.384-8.192 20.48zM438.272 265.216V502.784L647.168 384 438.272 265.216zM512 797.696C282.624 797.696 98.304 613.376 98.304 384S282.624-29.696 512-29.696c229.376 0 413.696 184.32 413.696 413.696S741.376 797.696 512 797.696z m0-790.528c-208.896 0-376.832 167.936-376.832 376.832S303.104 760.832 512 760.832 888.832 592.896 888.832 384 720.896 7.168 512 7.168z" horiz-adv-x="1024" />

Before

Width:  |  Height:  |  Size: 393 KiB

After

Width:  |  Height:  |  Size: 394 KiB

@ -66,12 +66,19 @@ const EducoderLogin = Loadable({
loading: Loading, loading: Loading,
}) })
//微信登录 //微信登录
const Otherlogin=Loadable({ const Otherlogin=Loadable({
loader: () => import('./modules/login/Otherlogin'), loader: () => import('./modules/login/Otherlogin'),
loading: Loading, loading: Loading,
}) })
//微信登录
const Loginqq=Loadable({
loader: () => import('./modules/login/Loginqq'),
loading: Loading,
})
const Otherloginstart=Loadable({ const Otherloginstart=Loadable({
loader: () => import('./modules/login/Otherloginstart'), loader: () => import('./modules/login/Otherloginstart'),
@ -367,10 +374,10 @@ const JupyterTPI = Loadable({
loading: Loading loading: Loading
}); });
// 微信代码编辑器 // 微信代码编辑器
const WXCode = Loadable({ // const WXCode = Loadable({
loader: () => import('./modules/wxcode'), // loader: () => import('./modules/wxcode'),
loading: Loading // loading: Loading
}); // });
// //个人竞赛报名 // //个人竞赛报名
// const PersonalCompetit = Loadable({ // const PersonalCompetit = Loadable({
// loader: () => import('./modules/competition/personal/PersonalCompetit.js'), // loader: () => import('./modules/competition/personal/PersonalCompetit.js'),
@ -632,6 +639,10 @@ class App extends Component {
<Route <Route
path="/otherlogin" component={Otherlogin} path="/otherlogin" component={Otherlogin}
/> />
<Route
path="/loginqq" component={Loginqq}
/>
<Route path="/users/:username" <Route path="/users/:username"
render={ render={
(props) => { (props) => {
@ -828,11 +839,11 @@ class App extends Component {
render={ render={
(props) => (<Headplugselection {...this.props} {...props} {...this.state} />) (props) => (<Headplugselection {...this.props} {...props} {...this.state} />)
}/> }/>
<Route path="/wxcode/:identifier?" component={WXCode} {/*<Route path="/wxcode/:identifier?" component={WXCode}*/}
render={ {/* render={*/}
(props)=>(<WXCode {...this.props} {...props} {...this.state}></WXCode>) {/* (props)=>(<WXCode {...this.props} {...props} {...this.state}></WXCode>)*/}
} {/* }*/}
/> {/*/>*/}
<Route exact path="/" <Route exact path="/"
// component={ShixunsHome} // component={ShixunsHome}
render={ render={

@ -1712,12 +1712,22 @@ input.ant-input-number-input:focus {
} }
.wechatdiv{ .wechatdiv{
margin-top: 40px !important;
/*width: 800px !important;*/
}
.wechatdivs{
margin-top: 40px !important; margin-top: 40px !important;
width: 800px !important; width: 800px !important;
} }
.wechatContent{ .wechatContent{
padding: 0px 50px; padding: 0px 50px;
text-align: center;
}
.wechatContents{
padding: 0px 50px;
} }
.wechatpass{ .wechatpass{

@ -0,0 +1,292 @@
import React, {Component} from "react";
import {
Input,
Button,
Divider,
Layout,
Spin
} from "antd";
import axios from 'axios';
import moment from 'moment';
import { getImageUrl } from 'educoder'
import '../courses/css/members.css';
import "../courses/common/formCommon.css"
import '../courses/css/Courses.css';
import beijintulogontwo from '../../../src/images/login/beijintulogontwo.png';
const { Header, Footer, Sider, Content } = Layout;
//educoder登入页面
var sectionStyle = {
"height": "100%",
"width": "100%",
"min-width": "1000px",
// makesure here is String确保这里是一个字符串以下是es6写法
};
var imgback = {
" background-size":"cover",
"background-repeat":"no-repeat",
backgroundImage: `url(${beijintulogontwo})`,
}
var imgmian ={
width: "100%",
background: `url(${beijintulogontwo})`,
position: "relative",
}
var newContainer={
// background: `url(${beijintulogontwo})`,
backgroundPosition: "center" ,
backgroundRepeat: "no-repeat",
backgroundAttachment: "fixed",
backgroundSize: "100% 100%",
height:" 100%",
width:" 100%",
position: "absolute",
top: "0px",
bottom: "0px",
minHeight: "100%",
paddingTop: "40px",
}
class Loginqq extends Component {
constructor(props) {
super(props);
this.state={
login:undefined,
password:undefined,
data:undefined,
logintypes:undefined,
spinnings:true
}
}
componentDidMount() {
let url = `/users/get_user_info.json`
axios.get(url).then((result)=> {
console.log(result);
if(result){
this.setState({
data:result.data,
spinnings:false
})
}
}).catch((error)=>{
this.setState({
spinnings:false
})
})
}
loginInputonChange=(e)=>{
if(e.target.value===undefined||e.target.value===""||e.target.value===null){
}else{
if(this.state.logintypes==="username"){
this.setState({
logintypes:undefined
})
}
}
this.setState({
login:e.target.value,
})
}
passwordonChange=(e)=>{
if(e.target.value===undefined||e.target.value===""||e.target.value===null){
}else{
if(this.state.logintypes==="password"){
this.setState({
logintypes:undefined
})
}
}
this.setState({
password:e.target.value,
})
}
postwechatlogin=(type,username,password)=>{
let query=this.props.location.search;
const types = query.split('?type=');
if(type===false){
if(username===undefined||username===""||username===null){
this.setState({
logintypes:"username"
})
return
}
if(password===undefined||password===""||password===null){
this.setState({
logintypes:"password"
})
return
}
}
let url = "/bind_user.json";
axios.post(url, {
type: types[1]==="qq"?"qq":'wechat',
not_bind:type,
username:username,
password:password
}).then((response) => {
if(response.data.status===0){
window.location.href="/"
}
}).catch((error) => {
console.log(error)
});
}
render() {
let {data,logintypes,spinnings} = this.state;
console.log(logintypes)
return (
<div style={newContainer} className=" clearfix" >
<Spin size="large" spinning={spinnings} >
<style>
{
`
#root{
background:#fff !important;
}
`
}
</style>
<div>
<div style={{
"width": "100%"
}}>
<div>
<style>
{
`
.ottherimg{
width: 106px;
height: 106px;
border-radius: 50%;
}
`
}
</style>
<div className={"textcenter"} >
{data===undefined?"":data.image_url===undefined||data.image_url===null||data.image_url===""?"":<img className={"ottherimg"} src={getImageUrl(`images/${data&&data.image_url}`)}/>}
</div>
<div className={"textcenter wechatloginfont"}>
为了更好的为您服务请关联一个EduCoder账号
</div>
</div>
<div className={"educontent clearfix wechatdivs"}>
<style>
{
`
.ant-layout,.ant-layout-sider,.ant-layout-content{
background: #FFF;
}
.ant-layout-header {
height: 50px;
padding: 0 48px;
line-height: inherit;
background: #001529;
background: #FFF;
font-size: 14px;
font-family: PingFangSC-Regular,PingFangSC;
font-weight: 400;
color: rgba(0,0,0,1);
}
.ant-layout-footer {
padding: 0px 50px;
background: #FFF;
}
.wechattiyan{
width:300px;
height:46px;
background:rgba(25,144,255,1);
border-radius:4px;
}
`
}
</style>
<p>
<Layout>
<Sider>
<div className={"wechatnewchat"}>
新用户
</div>
</Sider>
<Layout>
<Header>欢迎来到EduCoder新用户登录EduCoder可以到账号管理-安全设置中绑定手机/邮箱以后可以用绑定的手机/邮箱设置的密码登录EduCoder了</Header>
<Content className={"wechatContents"}>立即体验表示您已经同意我们的 <span><a href="https://forge.educoder.net/help?index=4" target="_blank" className={"color-blue"}> 服务协议条款</a></span></Content>
<Footer>
<Button className="login_btn font-16 wechattiyan" type="primary" style={{height:"46px"}} onClick={() => this.postwechatlogin(true)}
size={"large"}>立即体验</Button>
</Footer>
</Layout>
</Layout>
</p>
<Divider />
<p>
<Layout>
<Sider>
<div className={"wechatweoldchat"}>
老用户
</div>
</Sider>
<Layout>
<Header>已有EduCoder账号可以输入您的账号和密码将您的微信账号与EduCoder账号进行绑定</Header>
<Content className={"wechatContents"}>
<Input placeholder="请输入手机号/邮箱/登录名"
value={this.state.login}
onInput={this.loginInputonChange}
className={this.state.logintypes==="username"?"bor-red mb20 wechatpass":" mb20 wechatpass"}
></Input>
<Input.Password value={this.state.password}
autoComplete="new-password"
onInput={this.passwordonChange}
className={this.state.logintypes==="password"?"bor-red wechatpass":" wechatpass"}
placeholder="请输入密码"
></Input.Password>
</Content>
{this.state.logintypes==="username"?<span className={"color-red ml50"}>请填写账号</span>:this.state.logintypes==="password"?<span className={"color-red ml50"}></span>:""}
<Footer>
<Button className="login_btn font-16 wechattiyan" type="primary" style={{height:"46px"}} onClick={() => this.postwechatlogin(false,this.state.login,this.state.password)}
size={"large"}>绑定</Button>
</Footer>
</Layout>
</Layout>
</p>
</div>
</div>
<div style={{
display: "flex",
justifyContent: "center",
width: "100%",
}}>
<div className="font-14 color-grey-9 " style={{marginTop:"20px"}}><span className="font-18">©</span>&nbsp;{moment().year()}&nbsp;EduCoder<span className="ml15 mr15">ICP17009477</span><a href="https://team.trustie.net" style={{"color":"#888"}} target="_blank">Trustie</a>&nbsp;&nbsp;&nbsp;&amp;&nbsp;&nbsp;&nbsp;IntelliDE inside.</div>
</div>
</div>
</Spin>
</div>
)
}
}
export default Loginqq;

@ -0,0 +1,54 @@
.wexintitle{
width:600px;
height:86px;
font-size:20px;
text-align: center;
color:rgba(69,155,229,1);
line-height:86px;
background:rgba(236,245,252,1);
cursor:pointer;
}
.selectwexintitle{
width:600px;
height:86px;
font-size:20px;
text-align: center;
color:rgba(153,153,153,1);
line-height:86px;
cursor:pointer;
}
.wexinHeader{
text-align: center;
font-size:14px;
color:rgba(153,153,153,1) !important;
}
.weixinfooter{
text-align: center;
}
.wexinconter{
width: 100%;
height: 40px;
}
.wexinconterfl{
font-size:20px;
color:rgba(0,0,0,1);
}
.wexinconterfr{
font-size:16px;
cursor:pointer;
color:rgba(69,155,229,1);
}
.weixinnelogin{
display: flex;
justify-content: center;
width: 100%;
margin-top: 25px;
}
.weixinmarauto{
width: 24%;
margin: 0 auto;
}

@ -4,37 +4,20 @@ import {
Button, Button,
Divider, Divider,
Layout, Layout,
Spin Spin,
Tabs
} from "antd"; } from "antd";
import axios from 'axios'; import axios from 'axios';
import moment from 'moment'; import moment from 'moment';
import { getImageUrl } from 'educoder' import { getImageUrl } from 'educoder'
import LoginRegisterComponent from '../user/LoginRegisterComponent';
import '../courses/css/members.css'; import '../courses/css/members.css';
import "../courses/common/formCommon.css" import "../courses/common/formCommon.css"
import '../courses/css/Courses.css'; import '../courses/css/Courses.css';
import beijintulogontwo from '../../../src/images/login/beijintulogontwo.png'; import './Otherlogin.css';
const { Header, Footer, Sider, Content } = Layout; const { Header, Footer, Sider, Content } = Layout;
//educoder登入页面
var sectionStyle = {
"height": "100%",
"width": "100%",
"min-width": "1000px",
// makesure here is String确保这里是一个字符串以下是es6写法
};
var imgback = {
" background-size":"cover",
"background-repeat":"no-repeat",
backgroundImage: `url(${beijintulogontwo})`,
}
var imgmian ={
width: "100%",
background: `url(${beijintulogontwo})`,
position: "relative",
}
var newContainer={ var newContainer={
// background: `url(${beijintulogontwo})`, // background: `url(${beijintulogontwo})`,
backgroundPosition: "center" , backgroundPosition: "center" ,
@ -47,7 +30,6 @@ var newContainer={
top: "0px", top: "0px",
bottom: "0px", bottom: "0px",
minHeight: "100%", minHeight: "100%",
paddingTop: "40px",
} }
class Otherlogin extends Component { class Otherlogin extends Component {
@ -58,7 +40,13 @@ class Otherlogin extends Component {
password:undefined, password:undefined,
data:undefined, data:undefined,
logintypes:undefined, logintypes:undefined,
spinnings:true spinnings:true,
setbuttontypes:0,
showbool: 1,
loginstatus:false,
logini:2,
namezh:"",
passmm:"",
} }
} }
@ -149,10 +137,20 @@ class Otherlogin extends Component {
console.log(error) console.log(error)
}); });
} }
setbuttontype=(type)=>{
this.setState({
setbuttontypes:type
})
}
gotohome=()=>{
this.props.history.replace("/");
}
render() { render() {
let {data,logintypes,spinnings} = this.state; let {data,setbuttontypes,spinnings} = this.state;
console.log(logintypes)
return ( return (
<div style={newContainer} className=" clearfix" > <div style={newContainer} className=" clearfix" >
<Spin size="large" spinning={spinnings} > <Spin size="large" spinning={spinnings} >
@ -170,25 +168,7 @@ class Otherlogin extends Component {
<div style={{ <div style={{
"width": "100%" "width": "100%"
}}> }}>
<div>
<style>
{
`
.ottherimg{
width: 106px;
height: 106px;
border-radius: 50%;
}
`
}
</style>
<div className={"textcenter"} >
{data===undefined?"":data.image_url===undefined||data.image_url===null||data.image_url===""?"":<img className={"ottherimg"} src={getImageUrl(`images/${data&&data.image_url}`)}/>}
</div>
<div className={"textcenter wechatloginfont"}>
为了更好的为您服务请关联一个EduCoder账号
</div>
</div>
<div className={"educontent clearfix wechatdiv"}> <div className={"educontent clearfix wechatdiv"}>
<style> <style>
@ -218,69 +198,70 @@ class Otherlogin extends Component {
background:rgba(25,144,255,1); background:rgba(25,144,255,1);
border-radius:4px; border-radius:4px;
} }
.ant-divider-horizontal{
margin: 0px 0 30px 0px;
}
.ant-divider{
background: #EEEEEE;
}
` `
} }
</style> </style>
<Content className={"wexinconter"}>
<div className={"fl "}>
<img alt="高校智能化教学与实训平台" className="logoimg"
src={getImageUrl("images/avatars/LaboratorySetting/1nav")} />
</div>
<div className={"fr wexinconterfr"} onClick={()=>this.gotohome()}>
返回首页
</div>
</Content>
<p> <p>
<Layout> <div className={setbuttontypes===0?"wexintitle fl":"selectwexintitle fl"} onClick={()=>this.setbuttontype(0)}>
<Sider> <i className={"iconfont icon-bangding font-25 mr10"}></i>EduCoder
<div className={"wechatnewchat"}> </div>
新用户 <div className={setbuttontypes===1?"wexintitle fl":"selectwexintitle fl"} onClick={()=>this.setbuttontype(1)}>
</div> <i className={"iconfont icon-bianji4 font-20 mr10"}></i>EduCoder使
</Sider> </div>
<Layout>
<Header>欢迎来到EduCoder新用户登录EduCoder可以到账号管理-安全设置中绑定手机/邮箱以后可以用绑定的手机/邮箱设置的密码登录EduCoder了</Header>
<Content className={"wechatContent"}>立即体验表示您已经同意我们的 <span><a href="https://forge.educoder.net/help?index=4" target="_blank" className={"color-blue"}> 服务协议条款</a></span></Content>
<Footer>
<Button className="login_btn font-16 wechattiyan" type="primary" style={{height:"46px"}} onClick={() => this.postwechatlogin(true)}
size={"large"}>立即体验</Button>
</Footer>
</Layout>
</Layout>
</p> </p>
<Divider /> <Divider />
<p> {setbuttontypes===0?<p>
<Layout> <Layout>
<Sider>
<div className={"wechatweoldchat"}>
老用户
</div>
</Sider>
<Layout> <Layout>
<Header>已有EduCoder账号可以输入您的账号和密码将您的微信账号与EduCoder账号进行绑定</Header> <Header className={"wexinHeader"}>为了更好的为您服务请输入您的账号和密码将您的微信账号与EduCoder账号进行绑定</Header>
<Content className={"wechatContent"}> <Content className={"wechatContent mt50"}>
<Input placeholder="请输入手机号/邮箱/登录名" <Input placeholder="请输入手机号/邮箱/登录名"
value={this.state.login} value={this.state.login}
onInput={this.loginInputonChange} onInput={this.loginInputonChange}
className={this.state.logintypes==="username"?"bor-red mb20 wechatpass":" mb20 wechatpass"} className={this.state.logintypes==="username"?"bor-red mb20 wechatpass":" mb20 wechatpass"}
></Input> ></Input>
</Content>
<Content className={"wechatContent"}>
<Input.Password value={this.state.password} <Input.Password value={this.state.password}
autoComplete="new-password" autoComplete="new-password"
onInput={this.passwordonChange} onInput={this.passwordonChange}
className={this.state.logintypes==="password"?"bor-red wechatpass":" wechatpass"} className={this.state.logintypes==="password"?"bor-red wechatpass":" wechatpass"}
placeholder="请输入密码" placeholder="输入密码,注意区分大小写"
></Input.Password> ></Input.Password>
</Content> </Content>
{this.state.logintypes==="username"?<span className={"color-red ml50"}>请填写账号</span>:this.state.logintypes==="password"?<span className={"color-red ml50"}></span>:""} {this.state.logintypes==="username"?<span className={"color-red ml50 weixinmarauto"}>请填写账号</span>:this.state.logintypes==="password"?<span className={"color-red ml50 weixinmarauto"}></span>:""}
<Footer> <Footer className={"weixinfooter mt30"}>
<Button className="login_btn font-16 wechattiyan" type="primary" style={{height:"46px"}} onClick={() => this.postwechatlogin(false,this.state.login,this.state.password)} <Button className="login_btn font-16 wechattiyan" type="primary" style={{height:"46px"}} onClick={() => this.postwechatlogin(false,this.state.login,this.state.password)}
size={"large"}>绑定</Button> size={"large"}>绑定</Button>
</Footer> </Footer>
</Layout> </Layout>
</Layout> </Layout>
</p> </p>:<p className={"weixinnelogin"}>
<LoginRegisterComponent {...this.props} {...this.state}
weixinlogin={true}
Setshowbool={(e)=>this.Setshowbool(e)} ></LoginRegisterComponent>
</p>}
</div> </div>
</div> </div>
<div style={{
display: "flex",
justifyContent: "center",
width: "100%",
}}>
<div className="font-14 color-grey-9 " style={{marginTop:"20px"}}><span className="font-18">©</span>&nbsp;{moment().year()}&nbsp;EduCoder<span className="ml15 mr15">ICP17009477</span><a href="https://team.trustie.net" style={{"color":"#888"}} target="_blank">Trustie</a>&nbsp;&nbsp;&nbsp;&amp;&nbsp;&nbsp;&nbsp;IntelliDE inside.</div>
</div>
</div> </div>
</Spin> </Spin>
</div> </div>

@ -20,7 +20,7 @@ class Otherloginqq extends Component {
if(result){ if(result){
if(result.data.status===0){ if(result.data.status===0){
if(result.data.new_user===true){ if(result.data.new_user===true){
window.location.href=`https://${decodeURIComponent(typeshref[1])}/otherlogin?type=qq`; window.location.href=`https://${decodeURIComponent(typeshref[1])}/loginqq?type=qq`;
}else{ }else{
// this.getinfo() // this.getinfo()
if(typeshref[0]==="account"){ if(typeshref[0]==="account"){

@ -14,6 +14,11 @@ class Otherloginstart extends Component {
const types = type[1].split('&state='); const types = type[1].split('&state=');
const typeshref = types[1].split(','); const typeshref = types[1].split(',');
if(typeshref[1]==="test-newweb.educoder.net"){
window.location.href=`https://${typeshref[1]}/otherloginstart?code=${types[0]}&state=null,""`;
}else if(typeshref[1]==="pre-newweb.educoder.net"){
window.location.href=`https://${typeshref[1]}/otherloginstart?code=${types[0]}&state=null,""`;
}
let codeurl = `/auth/wechat/callback.json` let codeurl = `/auth/wechat/callback.json`
axios.get(codeurl,{params:{ axios.get(codeurl,{params:{
code:types[0] code:types[0]
@ -21,13 +26,13 @@ class Otherloginstart extends Component {
if(result){ if(result){
if(result.data.status===0){ if(result.data.status===0){
if(result.data.new_user===true){ if(result.data.new_user===true){
window.location.href=`https://${typeshref[1]}/otherlogin?type=wechat`; this.props.history.replace(`/otherlogin?type=wechat`);
}else{ }else{
// this.getinfo() // this.getinfo()
if(typeshref[0]==="account"){ if(typeshref[0]==="account"){
window.location.href=`https://${typeshref[1]}/account/binding`; this.props.history.replace(`/account/binding`);
}else{ }else{
window.location.href=`https://${typeshref[1]}`; this.props.history.replace(`/`);
} }
} }

@ -115,6 +115,14 @@ class DetailTop extends Component{
axios.post(url).then((result)=>{ axios.post(url).then((result)=>{
if(result.status===200){ if(result.status===200){
if(result.data.status===0){ if(result.data.status===0){
this.setState({
loadtype:true,
Modalstype: true,
Modalstopval: ` 课程需经过平台审核方可公开使用,公开的课程将对平台所`,
modalsMidval:"有人公开可见。若仅本人教学使用则无需申请公开, 直接发",
Modalsbottomval:"送到课堂即可.",
cardsModalsavetype: true,
})
this.props.showNotification(result.data.message) this.props.showNotification(result.data.message)
this.props.getlistdatas(); this.props.getlistdatas();
}else if(result.data.status===1){ }else if(result.data.status===1){
@ -175,7 +183,8 @@ class DetailTop extends Component{
applyissuePath:false, applyissuePath:false,
openpathss:false, openpathss:false,
cancel_publics:false, cancel_publics:false,
cancel_has_publics:false cancel_has_publics:false,
Modalstopval:``,
}) })
} }
@ -196,27 +205,27 @@ class DetailTop extends Component{
}) })
} }
//申请发布 // //申请发布
if(loadtype===true){ // if(loadtype===true){
//
let pathid=this.props.match.params.pathId; // let pathid=this.props.match.params.pathId;
let url ="/paths/"+pathid+"/publish.json"; // let url ="/paths/"+pathid+"/publish.json";
axios.get(url).then((result)=>{ // axios.get(url).then((result)=>{
if(result.status===200){ // if(result.status===200){
if(result.data.status===0){ // if(result.data.status===0){
this.setState({ // this.setState({
Modalstype:true, // Modalstype:true,
Modalstopval: result.data.message, // Modalstopval: result.data.message,
}) // })
}else if(result.data.status===1){ // }else if(result.data.status===1){
window.location.reload(); // window.location.reload();
} // }
} // }
}).catch((error)=>{ // }).catch((error)=>{
console.log(error); // console.log(error);
}) // })
//
} // }
this.setState({ this.setState({
Modalstype:false, Modalstype:false,
Modalsbottomval:'' Modalsbottomval:''
@ -360,6 +369,7 @@ class DetailTop extends Component{
openpaths=()=>{ openpaths=()=>{
this.setState({ this.setState({
loadtype:true,
Modalstype: true, Modalstype: true,
openpathss:true, openpathss:true,
Modalstopval: "公开申请已提交,请等待管理员的审核", Modalstopval: "公开申请已提交,请等待管理员的审核",
@ -460,7 +470,7 @@ class DetailTop extends Component{
modalsTopval={Modalstopval} modalsTopval={Modalstopval}
modalsBottomval={Modalsbottomval} modalsBottomval={Modalsbottomval}
modalCancel={cardsModalcancel} modalCancel={cardsModalcancel}
modalSave={cardsModalsavetype===true?()=>this.postcancelissuePath():openpathss===true?()=>this.postopenpaths():cancel_publics===true?()=>this.postcancel_public():cancel_has_publics===true?()=>this.postcancel_has_public():putappointmenttype===true?()=>this.getappointment():()=>this.cardsModalsave()} modalSave={loadtype===true&&openpathss===false?()=>this.cardsModalcancel():cardsModalsavetype===true?()=>this.postcancelissuePath():openpathss===true?()=>this.postopenpaths():cancel_publics===true?()=>this.postcancel_public():cancel_has_publics===true?()=>this.postcancel_has_public():putappointmenttype===true?()=>this.getappointment():()=>this.cardsModalsave()}
loadtype={loadtype} loadtype={loadtype}
modalsMidval={this.state.modalsMidval} modalsMidval={this.state.modalsMidval}
modalstyles={this.state.modalstyles} modalstyles={this.state.modalstyles}

@ -197,6 +197,11 @@ class sendPanel extends Component{
destroyOnClose={true} destroyOnClose={true}
> >
<div className="newupload_conbox"> <div className="newupload_conbox">
<style>{`
body{
overflow:hidden!important;
}
`}</style>
<div className="mb20" <div className="mb20"
// onMouseLeave={this.closeList} // onMouseLeave={this.closeList}
> >

@ -1,6 +1,6 @@
import React, {Component} from 'react'; import React, {Component} from 'react';
import {Input, Select, Radio, Checkbox, Popconfirm, message, Modal,Tooltip} from 'antd'; import {Input, Select, Radio,Button, Badge, message, Modal,Tooltip} from 'antd';
import {BrowserRouter as Router, Route, Link, Switch} from "react-router-dom"; import {BrowserRouter as Router, Route, Link, Switch} from "react-router-dom";
@ -183,7 +183,7 @@ export default class TpmQuestionEdit extends Component {
/> />
{/*<a className="white-btn orange-btn fl mt1 use_scope-btn ml20 mt5 mr20"*/} {/*<a className="white-btn orange-btn fl mt1 use_scope-btn ml20 mt5 mr20"*/}
{/*onClick={this.clickshixunsanswerskill}>+ 添加</a>*/} {/*onClick={this.clickshixunsanswerskill}>+ 添加</a>*/}
<div className="ml15 color-grey-9 mt5">学员答题正确将获得技能否则不能获得技能 <div className="ml15 color-grey-9 mt5">学员答题正确将获得技能否则不能获得技能回车添加标签
<span className=" color-orange ml20" style={{display:this.props.challenge_tagtype===true?"inline-block":"none"}} id="stage_name_notice"> <span className=" color-orange ml20" style={{display:this.props.challenge_tagtype===true?"inline-block":"none"}} id="stage_name_notice">
<i className="fa fa-exclamation-circle mr3"></i> <i className="fa fa-exclamation-circle mr3"></i>
</span> </span>
@ -193,8 +193,12 @@ export default class TpmQuestionEdit extends Component {
{ {
this.props.shixunsskillanswerlist.length === 0 ? "" : this.props.shixunsskillanswerlist.map((itme, key) => { this.props.shixunsskillanswerlist.length === 0 ? "" : this.props.shixunsskillanswerlist.map((itme, key) => {
return ( return (
<li className="task_tag_span" key={key}><span>{itme}</span> <li className="fl ml10 mr10" key={key}>
<a onClick={() =>this.props.delshixunssnswerllist(key)}>×</a> <Badge className={"tpmpointer"} count={"x"} onClick={()=>this.props.delshixunssnswerllist(key)}>
<Button type="primary" ghost className={"Permanentban "}>
{itme}
</Button>
</Badge>
</li> </li>
) )
}) })

@ -1,11 +1,13 @@
import React, {Component} from 'react'; import React, {Component} from 'react';
import {Input, Select, Radio, Checkbox, Popconfirm, message, Modal,Tooltip} from 'antd'; import {Input, Select, Radio, Checkbox, Popconfirm, Button, Badge,Tooltip} from 'antd';
import {BrowserRouter as Router, Route, Link, Switch} from "react-router-dom"; import {BrowserRouter as Router, Route, Link, Switch} from "react-router-dom";
import TPMMDEditor from '../../tpm/challengesnew/TPMMDEditor'; import TPMMDEditor from '../../tpm/challengesnew/TPMMDEditor';
import './css/newquestion.css';
const Option = Select.Option; const Option = Select.Option;
const RadioGroup = Radio.Group; const RadioGroup = Radio.Group;
@ -138,7 +140,7 @@ export default class TpmQuestionNew extends Component {
// onMouseLeave={this.onshixunsmarkss} // onMouseLeave={this.onshixunsmarkss}
> >
<span className="fl mr30 color-orange pt10">*</span> <span className="fl mr30 color-orange pt10">*</span>
<Select style={{width: 120}} className="winput-240-40 fl" <Select style={{width: 120}} className="winput-240-40 fl"
id="challenge_score" id="challenge_score"
onChange={(e)=>this.props.onshixunsansweSelect(e)} onChange={(e)=>this.props.onshixunsansweSelect(e)}
@ -176,7 +178,7 @@ export default class TpmQuestionNew extends Component {
/> />
{/*<a className="white-btn orange-btn fl mt1 use_scope-btn ml20 mt5 mr20"*/} {/*<a className="white-btn orange-btn fl mt1 use_scope-btn ml20 mt5 mr20"*/}
{/*onClick={this.clickshixunsanswerskill}>+ 添加</a>*/} {/*onClick={this.clickshixunsanswerskill}>+ 添加</a>*/}
<div className="ml15 color-grey-9 mt5">学员答题正确将获得技能否则不能获得技能 <div className="ml15 color-grey-9 mt5">学员答题正确将获得技能否则不能获得技能回车添加标签
<span className=" color-orange ml20" style={{display:this.props.challenge_tagtype===true?"inline-block":"none"}} id="stage_name_notice"> <span className=" color-orange ml20" style={{display:this.props.challenge_tagtype===true?"inline-block":"none"}} id="stage_name_notice">
<i className="fa fa-exclamation-circle mr3"></i> <i className="fa fa-exclamation-circle mr3"></i>
</span> </span>
@ -186,8 +188,14 @@ export default class TpmQuestionNew extends Component {
{ {
this.props.shixunsskillanswerlist.length === 0 ? "" : this.props.shixunsskillanswerlist.map((itme, key) => { this.props.shixunsskillanswerlist.length === 0 ? "" : this.props.shixunsskillanswerlist.map((itme, key) => {
return ( return (
<li className="task_tag_span" key={key}><span>{itme}</span> <li className="fl ml10 mr10" key={key}>
<a onClick={()=>this.props.delshixunssnswerllist(key)}>×</a>
<Badge className={"tpmpointer"} count={"x"} onClick={()=>this.props.delshixunssnswerllist(key)}>
<Button type="primary" ghost className={"Permanentban "}>
{itme}
</Button>
</Badge>
</li> </li>
) )
}) })

@ -0,0 +1,7 @@
.tpmpointer{
cursor: pointer;
}
.Permanentban{
color:#5091FF !important;
border-color: #5091FF !important;
}

@ -498,7 +498,14 @@ class LoginRegisterComponent extends Component {
this.openNotification(`请同意服务协议条款`,2); this.openNotification(`请同意服务协议条款`,2);
return; return;
} }
var url = "/accounts/register.json";
let url;
if(this.props.weixinlogin){
url= '/weapps/register.json';
}else{
url = "/accounts/register.json";
}
axios.post(url, { axios.post(url, {
login: this.state.logins, login: this.state.logins,
password: this.state.passwords, password: this.state.passwords,
@ -971,7 +978,7 @@ class LoginRegisterComponent extends Component {
return ( return (
<div className="login_register_content login_register_contents" <div className={this.props.weixinlogin?"weixinregister":"login_register_content login_register_contents"}
// style={ parseInt(tab[0])==0?{height: "366px"} :{height: "510px"}} // style={ parseInt(tab[0])==0?{height: "366px"} :{height: "510px"}}
> >
<style> <style>
@ -986,7 +993,7 @@ class LoginRegisterComponent extends Component {
</style> </style>
<div> <div>
{weixinlogin===false?<Menu mode="horizontal" selectedKeys={tab} onClick={this.changeTab} className="mt20"> {weixinlogin===false&&this.props.weixinlogin===undefined?<Menu mode="horizontal" selectedKeys={tab} onClick={this.changeTab} className="mt20">
<Menu.Item key="0" className={tab===0?"active font-18":"font-18"} > 登录</Menu.Item> <Menu.Item key="0" className={tab===0?"active font-18":"font-18"} > 登录</Menu.Item>
<Menu.Item key="1" className={tab===1?"active font-18 ":"font-18 "} style={{marginLeft:"10px"}} >注册</Menu.Item> <Menu.Item key="1" className={tab===1?"active font-18 ":"font-18 "} style={{marginLeft:"10px"}} >注册</Menu.Item>
</Menu>:""} </Menu>:""}
@ -1251,7 +1258,7 @@ class LoginRegisterComponent extends Component {
<a href={'https://forge.educoder.net/help?index=4'} target="_blank" className={"color-blue"}>服务协议条款</a> <a href={'https://forge.educoder.net/help?index=4'} target="_blank" className={"color-blue"}>服务协议条款</a>
</span></span></Checkbox>:""} </span></span></Checkbox>:""}
<Button className=" font-16 mb20" type="primary" style={this.props.mygetHelmetapi&&this.props.mygetHelmetapi.main_site===true?{height:"46px", width: "100%",marginTop:"26px"}:{height:"46px", width: "100%"}} onClick={() => this.postregistered()} <Button className=" font-16 mb20" type="primary" style={this.props.mygetHelmetapi&&this.props.mygetHelmetapi.main_site===true?{height:"46px", width: "100%",marginTop:"26px"}:{height:"46px", width: "100%"}} onClick={() => this.postregistered()}
size={"large"}>注册</Button> size={"large"}>{this.props.weixinlogin?"注册并绑定":"注册"}</Button>
{this.props.mygetHelmetapi&&this.props.mygetHelmetapi.main_site===true?this.state.isphone===true?<p className="clearfix mb10 textcenter"> {this.props.mygetHelmetapi&&this.props.mygetHelmetapi.main_site===true?this.state.isphone===true?<p className="clearfix mb10 textcenter">

@ -277,4 +277,12 @@
.textcenter{ .textcenter{
text-align: center; text-align: center;
}
.weixinregister{
width: 434px;
border-radius: 6px;
background: #fff;
display: flex;
justify-content: center;
} }

@ -30,6 +30,18 @@
<div class="content unicode" style="display: block;"> <div class="content unicode" style="display: block;">
<ul class="icon_lists dib-box"> <ul class="icon_lists dib-box">
<li class="dib">
<span class="icon iconfont">&#xe72a;</span>
<div class="name">编辑</div>
<div class="code-name">&amp;#xe72a;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe72b;</span>
<div class="name">绑定</div>
<div class="code-name">&amp;#xe72b;</div>
</li>
<li class="dib"> <li class="dib">
<span class="icon iconfont">&#xe729;</span> <span class="icon iconfont">&#xe729;</span>
<div class="name">播放</div> <div class="name">播放</div>
@ -2000,6 +2012,24 @@
<div class="content font-class"> <div class="content font-class">
<ul class="icon_lists dib-box"> <ul class="icon_lists dib-box">
<li class="dib">
<span class="icon iconfont icon-bianji4"></span>
<div class="name">
编辑
</div>
<div class="code-name">.icon-bianji4
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-bangding"></span>
<div class="name">
绑定
</div>
<div class="code-name">.icon-bangding
</div>
</li>
<li class="dib"> <li class="dib">
<span class="icon iconfont icon-bofang2"></span> <span class="icon iconfont icon-bofang2"></span>
<div class="name"> <div class="name">
@ -4909,6 +4939,22 @@
<div class="content symbol"> <div class="content symbol">
<ul class="icon_lists dib-box"> <ul class="icon_lists dib-box">
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-bianji4"></use>
</svg>
<div class="name">编辑</div>
<div class="code-name">#icon-bianji4</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-bangding"></use>
</svg>
<div class="name">绑定</div>
<div class="code-name">#icon-bangding</div>
</li>
<li class="dib"> <li class="dib">
<svg class="icon svg-icon" aria-hidden="true"> <svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-bofang2"></use> <use xlink:href="#icon-bofang2"></use>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -5,6 +5,20 @@
"css_prefix_text": "icon-", "css_prefix_text": "icon-",
"description": "", "description": "",
"glyphs": [ "glyphs": [
{
"icon_id": "2077714",
"name": "编辑",
"font_class": "bianji4",
"unicode": "e72a",
"unicode_decimal": 59178
},
{
"icon_id": "10199180",
"name": "绑定",
"font_class": "bangding",
"unicode": "e72b",
"unicode_decimal": 59179
},
{ {
"icon_id": "13097093", "icon_id": "13097093",
"name": "播放", "name": "播放",

@ -20,6 +20,12 @@ Created by iconfont
/> />
<missing-glyph /> <missing-glyph />
<glyph glyph-name="bianji4" unicode="&#59178;" d="M934.724189 617.173271L834.414864 516.863946 653.380212 697.898598l100.394659 100.351991A42.257063 42.257063 0 0 0 783.769535 810.666588c6.527999 0 19.157332-1.621333 29.951997-12.415999l121.002657-121.002656a42.538663 42.538663 0 0 0 0-60.074662zM299.374908-18.176009l-200.661316-19.626665 19.669331 200.661316L593.049551 637.52527 774.084202 456.533285l-474.709294-474.709294z m695.679942 755.79727L874.09486 858.581251A127.317323 127.317323 0 0 1 783.769535 895.999915c-32.725331 0-65.407995-12.458666-90.367993-37.418664l-646.229279-646.229279c-7.082666-7.082666-11.434666-16.469332-12.287999-26.495998l-26.197331-267.818645c-2.133333-25.002665 17.706665-46.037329 42.239996-46.037329 1.194667 0 2.432 0.042667 3.626666 0.128l267.818645 26.239998a42.12053 42.12053 0 0 1 26.495998 12.287999l646.186612 646.186613c49.919996 49.919996 49.919996 130.858656 0 180.778651z" horiz-adv-x="1032" />
<glyph glyph-name="bangding" unicode="&#59179;" d="M722.7 241.2l-45.2 45.2 140.1 140.1C890 499 890 617 817.6 689.4c-72.5 72.5-190.4 72.5-262.9 0l-140.1-140-45.2 45.2 140.1 140.1c97.4 97.5 256 97.4 353.4 0 97.4-97.4 97.4-256 0-353.4L722.7 241.2zM338.1-39.9c-66.8 0-129.5 26-176.7 73.2-97.4 97.4-97.4 256 0 353.4l140.1 140.1 45.2-45.2-140.1-140.2c-72.5-72.5-72.5-190.4 0-262.9 35.1-35.1 81.8-54.5 131.5-54.5s96.3 19.3 131.4 54.5l140.1 140.1 45.2-45.2-140-140.1c-47.2-47.2-110-73.2-176.7-73.2zM330.99 248.121l316.78 316.781 45.255-45.254-316.781-316.78z" horiz-adv-x="1024" />
<glyph glyph-name="bofang2" unicode="&#59177;" d="M692.224 400.384l-4.096 4.096L430.08 551.936c-4.096 4.096-8.192 4.096-12.288 4.096-12.288 0-20.48-8.192-20.48-20.48v-303.104c0-12.288 8.192-20.48 20.48-20.48 4.096 0 8.192 0 12.288 4.096L688.128 363.52h4.096c4.096 4.096 8.192 8.192 8.192 16.384s-4.096 16.384-8.192 20.48zM438.272 265.216V502.784L647.168 384 438.272 265.216zM512 797.696C282.624 797.696 98.304 613.376 98.304 384S282.624-29.696 512-29.696c229.376 0 413.696 184.32 413.696 413.696S741.376 797.696 512 797.696z m0-790.528c-208.896 0-376.832 167.936-376.832 376.832S303.104 760.832 512 760.832 888.832 592.896 888.832 384 720.896 7.168 512 7.168z" horiz-adv-x="1024" /> <glyph glyph-name="bofang2" unicode="&#59177;" d="M692.224 400.384l-4.096 4.096L430.08 551.936c-4.096 4.096-8.192 4.096-12.288 4.096-12.288 0-20.48-8.192-20.48-20.48v-303.104c0-12.288 8.192-20.48 20.48-20.48 4.096 0 8.192 0 12.288 4.096L688.128 363.52h4.096c4.096 4.096 8.192 8.192 8.192 16.384s-4.096 16.384-8.192 20.48zM438.272 265.216V502.784L647.168 384 438.272 265.216zM512 797.696C282.624 797.696 98.304 613.376 98.304 384S282.624-29.696 512-29.696c229.376 0 413.696 184.32 413.696 413.696S741.376 797.696 512 797.696z m0-790.528c-208.896 0-376.832 167.936-376.832 376.832S303.104 760.832 512 760.832 888.832 592.896 888.832 384 720.896 7.168 512 7.168z" horiz-adv-x="1024" />

Before

Width:  |  Height:  |  Size: 393 KiB

After

Width:  |  Height:  |  Size: 394 KiB

Loading…
Cancel
Save