diff --git a/src/App.js b/src/App.js
index 263be1f7..14054d3c 100644
--- a/src/App.js
+++ b/src/App.js
@@ -55,6 +55,11 @@ const Task = Loadable({
loader: () => import('./military/task'),
loading: Loading,
})
+// 专家
+const Expert = Loadable({
+ loader: () => import('./military/expert'),
+ loading: Loading,
+})
//403页面
const Shixunauthority = Loadable({
loader: () => import('./modules/403/Shixunauthority'),
@@ -262,6 +267,9 @@ class App extends Component {
{/*任务*/}
+ {/*专家评审*/}
+
+
{/*403*/}
diff --git a/src/military/expert.js b/src/military/expert.js
new file mode 100644
index 00000000..6aa7536e
--- /dev/null
+++ b/src/military/expert.js
@@ -0,0 +1,41 @@
+import React, { Component } from "react";
+
+import { Route, Switch } from "react-router-dom";
+import { withRouter } from "react-router";
+import { SnackbarHOC } from "educoder";
+import { CNotificationHOC } from "../modules/courses/common/CNotificationHOC";
+import { TPMIndexHOC } from "../modules/tpm/TPMIndexHOC";
+import Loadable from "react-loadable";
+import Loading from "../Loading";
+import { ImageLayerOfCommentHOC } from "../modules/page/layers/ImageLayerOfCommentHOC";
+import './index.scss';
+
+const Register = Loadable({
+ loader: () => import("./expert/register"),
+ loading: Loading,
+});
+
+
+class Expert extends Component {
+ render() {
+ return (
+
+
+
+ (
+
+ )}
+ >
+
+
+ );
+ }
+}
+export default withRouter(
+ ImageLayerOfCommentHOC({
+ imgSelector: ".imageLayerParent img, .imageLayerParent .imageTarget",
+ parentSelector: ".newMain",
+ })(CNotificationHOC()(SnackbarHOC()(TPMIndexHOC(Expert))))
+);
diff --git a/src/military/expert/api.js b/src/military/expert/api.js
new file mode 100644
index 00000000..e69de29b
diff --git a/src/military/expert/fetch.js b/src/military/expert/fetch.js
new file mode 100644
index 00000000..38f2a078
--- /dev/null
+++ b/src/military/expert/fetch.js
@@ -0,0 +1,10 @@
+
+import javaFetch from '../javaFetch';
+
+
+let settings=JSON.parse(localStorage.chromesetting);
+let actionUrl = settings.api_urls? settings.api_urls.notice :'https://info.osredm.com';
+
+const service = javaFetch(actionUrl);
+export const httpUrl = actionUrl;
+export default service;
\ No newline at end of file
diff --git a/src/military/expert/index.scss b/src/military/expert/index.scss
new file mode 100644
index 00000000..e69de29b
diff --git a/src/military/expert/register/index.jsx b/src/military/expert/register/index.jsx
new file mode 100644
index 00000000..174275c6
--- /dev/null
+++ b/src/military/expert/register/index.jsx
@@ -0,0 +1,65 @@
+import React, { useEffect, useState, useCallback } from 'react';
+import { Button, Icon, Form, Modal, Input } from 'antd';
+import { Link } from "react-router-dom";
+import './index.scss';
+
+export default Form.create()(({ match, history, showNotification, form }) => {
+ const { getFieldDecorator, validateFields, setFieldsValue } = form;
+
+ // form表单公共处理函数
+ const helper = useCallback(
+ (label, name, rules, widget) => (
+
+ {getFieldDecorator(name, { rules, validateFirst: true ,getValueFromEvent: e=>e.target.value.replace(/(^\s*)|(\s*$)/g, "") })(widget)}
+
+ ),
+ []
+ );
+
+
+ return (
+
+ {
+ helper('用户姓名',
+ 'readerName',
+ [{ required: true, message: "请输入用户姓名" }, { max: 50, message: '不能超过50字符' }],
+
+ )
+ }
+
+ {
+ helper('单位名称',
+ 'companyName',
+ [{ required: true, message: "请输入公司名称" }, { max: 100, message: '不能超过100字符' }],
+
+ )
+ }
+
+ {
+ helper('联系方式',
+ 'contactInfo',
+ [{ required: true, message: "请输入联系方式" },
+ { max: 100, message: '不能超过100字符' },
+ { validator: (rule,val,callback) =>{
+ const pattern = /^((\+)?86|((\+)?86)?)0?1[3458]\d{9}$/;
+ if(pattern.test(val)){
+ callback();
+ }else {
+ callback('请输入正确的手机号码!');
+ }
+ }}],
+
+ )
+ }
+
+
+
+ )
+}
+)
diff --git a/src/military/expert/register/index.scss b/src/military/expert/register/index.scss
new file mode 100644
index 00000000..c43c4558
--- /dev/null
+++ b/src/military/expert/register/index.scss
@@ -0,0 +1,102 @@
+.centerbox {
+ position: relative;
+}
+.notice-detail {
+ margin-top: 3.5rem;
+ .head-navigation {
+ top: -2.5rem;
+ }
+ .center-content {
+ overflow: auto;
+ border: 0;
+ }
+}
+
+.notice-detail-content {
+ padding: 2rem 2.5rem 3rem;
+
+ .anticon-caret-right {
+ color: #1890ff;
+ font-size: 1rem;
+ }
+}
+
+.notice-title {
+ margin: 3rem auto 0;
+ text-align: center;
+ font-size: 1.375rem;
+ font-weight: bold;
+ line-height: 1.375rem;
+ color: #000000;
+}
+
+// 内容详情
+.item-content {
+ padding: 10px 10px 0 30px;
+}
+.content-notice {
+ padding: 20px;
+}
+
+.center-author {
+ display: flex;
+ flex-flow:row wrap-reverse;
+ justify-content: space-around;
+ align-items: center;
+ padding: .5rem;
+ background: #f9f9f9;
+ color: #333;
+ p {
+ padding: 0 .5rem;
+ }
+}
+
+.content-text {
+ margin: 1.25rem 0;
+ min-height: 30vh;
+}
+
+.content-secret{
+ min-height: 2em;
+}
+
+.notice-content-title {
+ margin: 0.5rem 0;
+ font-size: 1rem;
+ font-weight: bold;
+}
+
+.notice-content-download {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 2rem !important;
+ padding: 0 1rem;
+ background: #f9f9f9;
+ span:hover{
+ cursor: pointer;
+ color: #1890ff;
+ }
+}
+
+.form-edit-modal {
+ .ant-form-item{
+ display: flex;
+ }
+ .ant-form-item-label{
+ min-width: 5rem;
+ }
+ .ant-form-item-control-wrapper{
+ width: 75%;
+ display: inline-block;
+ }
+ .ant-input-number{
+ width: 50%;
+ }
+
+ .ant-modal-footer{
+ border-top: 0;
+ text-align: center;
+ }
+}
+