From a92f3c4d10bebbdc55270e72ccd97cd1ba7d4e28 Mon Sep 17 00:00:00 2001
From: LAPTOP-RI7D261L\Mr Ke <545800322@qq.com>
Date: Wed, 26 Feb 2020 16:40:55 +0800
Subject: [PATCH] Merge branch 'master' of http://120.79.193.119:9090/r/nsjcy/frontEnd/nsjcy

---
 SunshineIns/src/asset/image/sign.png                       |    0 
 SunshineIns/src/page/policeSecurityEdit.jsx                |    6 
 SunshineIns/src/page/ActiveManage.jsx                      |  247 +++++
 SunshineIns/src/fetch/_fetch.js                            |    2 
 SunshineLnsMinApp/app.json                                 |    1 
 SunshineLnsMinApp/pages/me/me.js                           |    6 
 SunshineIns/src/page/SignIn.jsx                            |   82 +
 SunshineIns/src/fetch/socialCompanyDetail.js               |    9 
 SunshineIns/src/view/CommonSearchForm/index.jsx            |  253 ++++++
 SunshineIns/src/index.jsx                                  |    3 
 SunshineIns/src/page/ActiveManageEdit.jsx                  |  127 ++
 SunshineLnsMinApp/pages/activityDetail/activityDetail.wxml |  113 +-
 SunshineLnsMinApp/pages/activityDetail/activityDetail.wxss |    1 
 SunshineIns/src/page/ApplyForEdit.jsx                      |    6 
 SunshineIns/src/fetch/entryQuery.js                        |    2 
 SunshineIns/src/page/CareList.jsx                          |  144 ++-
 SunshineIns/src/page/CareListEdit.jsx                      |    6 
 SunshineIns/src/page/PoliceSecurity.jsx                    |   96 +
 SunshineLnsMinApp/pages/myTranslate/myTranslate.json       |    6 
 SunshineIns/src/fetch/index.js                             |   14 
 SunshineIns/src/page/UnderAgeList.jsx                      |  224 +++++
 SunshineIns/src/page/ApplyFor.jsx                          |  107 +
 SunshineIns/src/fetch/socialCompanySave.js                 |    8 
 SunshineIns/src/view/CommonSearchForm/style.scss           |   13 
 SunshineIns/src/fetch/activeManage.js                      |    2 
 SunshineIns/src/fetch/addResult.js                         |    6 
 SunshineIns/src/data/menu.js                               |    9 
 SunshineIns/src/fetch/socialQuery.js                       |    2 
 SunshineLnsMinApp/pages/fzpxInfo/fzpxInfo.wxss             |    9 
 SunshineLnsMinApp/pages/myTranslate/myTranslate.wxml       |   26 
 SunshineLnsMinApp/pages/fzpxInfo/fzpxInfo.wxml             |  170 ++-
 SunshineLnsMinApp/pages/myTranslate/myTranslate.wxss       |  111 ++
 SunshineLnsMinApp/pages/fzpxInfo/fzpxInfo.js               |  132 ++
 SunshineLnsMinApp/pages/myTranslate/myTranslate.js         |  146 +++
 SunshineLnsMinApp/pages/me/me.wxml                         |   10 
 SunshineIns/src/fetch/socialCompanydelete.js               |    9 
 SunshineIns/src/page/ExamineEdit.jsx                       |    6 
 SunshineIns/src/page/Examine.jsx                           |  113 +-
 SunshineLnsMinApp/pages/activityDetail/activityDetail.js   |  112 ++
 SunshineIns/src/fetch/socialCompany.js                     |    9 
 SunshineIns/src/fetch/signinfo.js                          |    5 
 41 files changed, 1,945 insertions(+), 408 deletions(-)

diff --git a/SunshineIns/src/asset/image/sign.png b/SunshineIns/src/asset/image/sign.png
new file mode 100644
index 0000000..152fd05
--- /dev/null
+++ b/SunshineIns/src/asset/image/sign.png
Binary files differ
diff --git a/SunshineIns/src/data/menu.js b/SunshineIns/src/data/menu.js
index 9994009..4c09b32 100644
--- a/SunshineIns/src/data/menu.js
+++ b/SunshineIns/src/data/menu.js
@@ -85,7 +85,7 @@
   path: '/sweeping'
 }, {
   id: 'activeManage',
-  name: '活动管理',
+  name: '法制活动',
   icon: active,
   iconCheck: activeCheck,
   path: '/activeManage'
@@ -98,6 +98,13 @@
   path: '/careList'
 },
 {
+  id: 'underAgeList',
+  name: '涉未成年负责部门组织',
+  icon: active,
+  iconCheck: activeCheck,
+  path: '/underAgeList'
+},
+{
   id: 'questionnaire',
   name: '问卷管理部分',
   icon: msgManage,
diff --git a/SunshineIns/src/fetch/_fetch.js b/SunshineIns/src/fetch/_fetch.js
index 0919acd..dbde3fd 100644
--- a/SunshineIns/src/fetch/_fetch.js
+++ b/SunshineIns/src/fetch/_fetch.js
@@ -2,6 +2,8 @@
 
 // export const base = 'http://xnwj.gznsjc.gov.cn';
 export const base = 'http://nsjc.vaiwan.com';
+// export const base = 'http://nsjcy.hugeinfo.com.cn';
+
 // export const base = 'http://192.168.0.147:8081';
 
 export const domain = base + '/nsjc-charge/';
diff --git a/SunshineIns/src/fetch/activeManage.js b/SunshineIns/src/fetch/activeManage.js
index 4dc87bf..1995e10 100644
--- a/SunshineIns/src/fetch/activeManage.js
+++ b/SunshineIns/src/fetch/activeManage.js
@@ -1,6 +1,6 @@
 import fetch from './_fetch';
 import { message } from 'antd';
-export default () => fetch(`api/activity/finds?`)
+export default ({ activityType, activityStatus, startTime, endTime }) => fetch(`api/activity/finds?activityType=${activityType||''}&activityStatus=${activityStatus || ''}&startTime=${startTime || ''}&endTime=${endTime || ''}`)
     .then(
         json => json.data
     )
diff --git a/SunshineIns/src/fetch/addResult.js b/SunshineIns/src/fetch/addResult.js
new file mode 100644
index 0000000..0082000
--- /dev/null
+++ b/SunshineIns/src/fetch/addResult.js
@@ -0,0 +1,6 @@
+import fetch from './_fetch';
+import { message } from 'antd';
+export default ({ id, result}) => fetch(`api/activity/addResult?id=${id||''}&result=${result || ''}`)
+    .catch(
+        error => message.error('列表加载失败,请联系管理员', 2)
+    );
diff --git a/SunshineIns/src/fetch/entryQuery.js b/SunshineIns/src/fetch/entryQuery.js
index e6007cc..e6f9b1f 100644
--- a/SunshineIns/src/fetch/entryQuery.js
+++ b/SunshineIns/src/fetch/entryQuery.js
@@ -1,6 +1,6 @@
 import fetch from './_fetch';
 import { message } from 'antd';
-export default ({page,size, type}) => fetch(`api/entry/query?rows=${size}&page=${page}&type=${type}`)
+export default ({page,size, type, status,startTime,endTime,createrName}) => fetch(`api/entry/query?rows=${size||''}&page=${page||''}&type=${type||''}&status=${status||''}&startTime=${startTime||''}&endTime=${endTime||''}&createrName=${createrName||''}`)
     .then(
         json => json
     )
diff --git a/SunshineIns/src/fetch/index.js b/SunshineIns/src/fetch/index.js
index 1c9e300..8f5026e 100644
--- a/SunshineIns/src/fetch/index.js
+++ b/SunshineIns/src/fetch/index.js
@@ -84,6 +84,12 @@
 import saveQuestionTemp from './saveQuestionTemp';
 import questionQuery from './questionQuery';
 import questionAudit from './questionAudit';
+import signinfo from './signinfo';
+import addResult from './addResult';
+import socialCompany from './socialCompany';
+import socialCompanySave from './socialCompanySave';
+import socialCompanyDetail from './socialCompanyDetail';
+import socialCompanydelete from './socialCompanydelete';
 
 export default {
   domain,
@@ -171,5 +177,11 @@
   questionFindById,
   saveQuestionTemp,
   questionQuery,
-  questionAudit
+  questionAudit,
+  signinfo,
+  addResult,
+  socialCompany,
+  socialCompanySave,
+  socialCompanyDetail,
+  socialCompanydelete
 };
\ No newline at end of file
diff --git a/SunshineIns/src/fetch/signinfo.js b/SunshineIns/src/fetch/signinfo.js
new file mode 100644
index 0000000..eb0409c
--- /dev/null
+++ b/SunshineIns/src/fetch/signinfo.js
@@ -0,0 +1,5 @@
+import fetch from './_fetch';
+import { message } from 'antd';
+
+export default (id) => fetch(`/api/activity/signInfo?id=${id}`)
+.catch(error => message.error('信息加载失败,请联系管理员', 2));
\ No newline at end of file
diff --git a/SunshineIns/src/fetch/socialCompany.js b/SunshineIns/src/fetch/socialCompany.js
new file mode 100644
index 0000000..8f17932
--- /dev/null
+++ b/SunshineIns/src/fetch/socialCompany.js
@@ -0,0 +1,9 @@
+import fetch from './_fetch';
+import { message } from 'antd';
+export default ({ companyName, companyLegal,companyTel,companyAccount, createTime }) => fetch(`api/socialCompany/finds?companyName=${companyName || ''}&companyLegal=${companyLegal || ''}&companyTel=${companyTel || ''}&companyAccount=${companyAccount || ''}&createTime=${createTime || ''}`)
+    .then(
+        json => json.rows
+    )
+    .catch(
+        error => message.error('列表加载失败,请联系管理员', 2)
+    );
diff --git a/SunshineIns/src/fetch/socialCompanyDetail.js b/SunshineIns/src/fetch/socialCompanyDetail.js
new file mode 100644
index 0000000..15f9a1d
--- /dev/null
+++ b/SunshineIns/src/fetch/socialCompanyDetail.js
@@ -0,0 +1,9 @@
+import fetch from './_fetch';
+import { message } from 'antd';
+export default (id) => fetch(`api/socialCompany/find?id=${id||'new'}`)
+    .then(
+        json => json
+    )
+    .catch(
+        error => message.error('详情加载失败,请联系管理员', 2)
+    );
diff --git a/SunshineIns/src/fetch/socialCompanySave.js b/SunshineIns/src/fetch/socialCompanySave.js
new file mode 100644
index 0000000..c636f75
--- /dev/null
+++ b/SunshineIns/src/fetch/socialCompanySave.js
@@ -0,0 +1,8 @@
+
+import fetch from './_fetch';
+
+export default (savedate) => {
+    return fetch(`api/socialCompany/save`,
+        savedate
+    );
+}
diff --git a/SunshineIns/src/fetch/socialCompanydelete.js b/SunshineIns/src/fetch/socialCompanydelete.js
new file mode 100644
index 0000000..9944d06
--- /dev/null
+++ b/SunshineIns/src/fetch/socialCompanydelete.js
@@ -0,0 +1,9 @@
+import fetch from './_fetch';
+import { message } from 'antd';
+export default (id) => fetch(`api/socialCompany/delete?id=${id}`)
+    .then(
+        json => json
+    )
+    .catch(
+        error => message.error('删除失败,请联系管理员', 2)
+    );
diff --git a/SunshineIns/src/fetch/socialQuery.js b/SunshineIns/src/fetch/socialQuery.js
index db25515..6fcae23 100644
--- a/SunshineIns/src/fetch/socialQuery.js
+++ b/SunshineIns/src/fetch/socialQuery.js
@@ -1,6 +1,6 @@
 import fetch from './_fetch';
 import { message } from 'antd';
-export default ({page,size}) => fetch(`api/social/query?size=${size}&page=${page}`)
+export default ({page,size, taskType, status, startTime,endTime}) => fetch(`api/social/query?size=${size}&page=${page}&taskType=${taskType}&status=${status}&startTime=${startTime}&endTime=${endTime}`)
     .then(
         json => json
     )
diff --git a/SunshineIns/src/index.jsx b/SunshineIns/src/index.jsx
index 529a71b..73d63ab 100644
--- a/SunshineIns/src/index.jsx
+++ b/SunshineIns/src/index.jsx
@@ -14,6 +14,8 @@
 import BusDetail from './page/BusDetail';
 import SupPerson from './page/SupPerson';
 import Company from './page/Company';
+// 涉未成年负责部门组织
+import UnderAgeList from './page/UnderAgeList';
 import ActiveManage from './page/ActiveManage';
 import ActiveManageEdit from './page/ActiveManageEdit';
 import KnowledgeBase from './page/KnowledgeBase';
@@ -73,6 +75,7 @@
           <Route path='/active' component={Active} />
           <Route path='/supPerson' component={SupPerson} />
           <Route path='/company' component={Company} />
+          <Route path='/underAgeList' component={UnderAgeList} />
           <Route path='/knowledgeBase' component={KnowledgeBase} />
           <Route path='/articlePublish' component={ArticlePublish} />
           <Route path='/articleEidt/:id' component={ArticleEidt} />
diff --git a/SunshineIns/src/page/ActiveManage.jsx b/SunshineIns/src/page/ActiveManage.jsx
index c457ae4..1eebd18 100644
--- a/SunshineIns/src/page/ActiveManage.jsx
+++ b/SunshineIns/src/page/ActiveManage.jsx
@@ -1,20 +1,16 @@
-/**
- * 徐祥健<xuxj@hugeinfo.com.cn>
- * 2018年8月28日 10:41
- *
- */
-
 
 import React from 'react';
 
 import HeadView from '../view/HeadView';
 import TableBtnView from '../view/TableBtnView';
-import { Divider, Modal, message, Tooltip, Progress } from 'antd'
+import CommonSearchForm from '../view/CommonSearchForm';
+import { Divider, Modal, message, Button, Row, Col, Progress, Input, Upload, Icon } from 'antd'
 import moment from 'moment'
 import Fetch from '../fetch';
 import { domain } from '../fetch/_fetch';
 import TableView from '../view/TableView';
 const confirm = Modal.confirm;
+const { TextArea } = Input;
 function typeOfName(type) {
     switch (type) {
         case 0:
@@ -40,12 +36,55 @@
             return "普法预约";
     }
 }
+
+const taskNodeIds = {
+    'act_1': '南检活动',
+    'act_2': '法治培训',
+    'act_3': '普法预约',
+}
+
+const activityTypeList = [
+    'act_1',
+    'act_2',
+    'act_3',
+]
+
+const activityStatusIds = {
+    0: '未发布',
+    1: '报名中',
+    2: '活动中',
+    3: '已结束',
+    100: '已摇号',
+}
+
+const activityStatusList = [
+    0,
+    1,
+    2,
+    3,
+    100,
+]
 export default class ActiveManage extends React.Component {
     constructor(props) {
         super(props);
         this.state = {
             data: [],
-            resetKey: Date.now()
+            resetKey: Date.now(),
+            loading: false,
+            confirmLoading: false,
+            modal: false,
+            closeKey: Date.now(),
+            formData: {
+                __key: Date.now(),
+                activityType: '',
+                activityStatus: '',
+                startTime: '',
+                endTime: '',
+            },
+            savedate: {},
+            fileList: [],
+            previewVisible: false,
+            previewImage: '',
         };
     }
 
@@ -53,17 +92,83 @@
         document.title = '活动管理';
         this.getData();
     }
+
+    setFormData = data => {
+        console.log('form', data);
+        this.setState({
+            formData: data,
+        });
+    }
+
+    handlePreview = (file) => {
+        this.setState({
+            previewImage: file.url || file.thumbUrl,
+            previewVisible: true,
+        });
+    }
+
+    handleOk = () => {
+        console.log('success')
+        this.setState({ confirmLoading: true });
+        const { savedate } = this.state;
+        console.log(savedate)
+
+        if (!savedate.result) {
+            return message.warning("培训结果不能为空");
+        }
+        Fetch.addResult({ ...savedate })
+            .then(res => {
+                console.log(res)
+                if (res.code === 0) {
+                    this.setState({
+                        confirmLoading: false,
+                        modal: false,
+                        closeKey: Date.now()
+                    }, this.getData);
+                    message.success("提交成功!")
+                } else {
+                    message.error('保存失败,请联系管理员', 2)
+                }
+            });
+    }
+
+    handleCancel = () => {
+        this.setState({
+            closeKey: Date.now(),
+            modal: false
+        });
+    }
+
+    searchonClick = data => {
+        console.log('form', data);
+        this.setState({
+            formData: data,
+        });
+        this.getData();
+    }
+
+    saveInputChange = ({ target: { value, name } }) => {
+        this.setState(({ savedate }) => ({
+            savedate: {
+                ...savedate,
+                [name]: value
+            }
+        }))
+    }
+
     getData = () => {
         // this.setState({
         //     data: []
         // });
-        Fetch.activeManage()
+        this.setState({ loading: true })
+        Fetch.activeManage({ ...this.state.formData })
             .then(res => {
                 for (var i = 0; i < res.length; i++) {
                     res[i]['index'] = i + 1;
                 }
                 this.setState({
-                    data: res
+                    data: res,
+                    loading: false
                 });
             });
     }
@@ -71,8 +176,18 @@
         this.props.history.push("/activeManageEdit/" + id);
     }
 
-    signIn= (id) => {
+    signIn = (id) => {
         window.open('index.html#/signIn/' + id);
+    }
+
+    addResult = (id) => {
+        this.setState(({ savedate }) => ({
+            savedate: {
+                ...savedate,
+                id: id
+            },
+            modal: true
+        }))
     }
 
     pulish = (id) => {
@@ -162,26 +277,118 @@
                             <Divider type="vertical" />
                             <label className='theme-color' onClick={() => this.deleteItems(record.id)} style={{ cursor: 'pointer' }}>删除</label>
                         </span>
-                        : 
-                    record.status == 2 ?
+                        :
+                        record.status == 2 ?
                             <span>
                                 <label className='theme-color' onClick={() => this.showModal(record.id)} style={{ cursor: 'pointer' }}>查看</label>
                                 <Divider type="vertical" />
                                 <label className='theme-color' onClick={() => this.signIn(record.id)} style={{ cursor: 'pointer' }}>签到上墙</label>
                             </span>
-                    :
-                    <span><label className='theme-color' onClick={() => this.showModal(record.id)} style={{ cursor: 'pointer' }}>查看</label></span>
+                            :
+                            record.status == 3 ?
+                                <span>
+                                    <label className='theme-color' onClick={() => this.showModal(record.id)} style={{ cursor: 'pointer' }}>查看</label>
+                                    {!record.result &&
+                                        <React.Fragment>
+                                            <Divider type="vertical" />
+                                            <label className='theme-color' onClick={() => this.addResult(record.id)} style={{ cursor: 'pointer' }}>添加结果</label>
+                                        </React.Fragment>
+                                    }
+                                </span>
+                                :
+                                <span><label className='theme-color' onClick={() => this.showModal(record.id)} style={{ cursor: 'pointer' }}>查看</label></span>
 
                 )
             ),
         }];
-        const { data, resetKey } = this.state;
+        const { data, previewImage, formData, loading, modal, fileList, previewVisible, confirmLoading, closeKey, savedate } = this.state;
+        const props = {
+            action: domain + 'api/v1/attachment/materials?associateTypeId=1020&entityId=' + savedate.id,
+            onChange: ({ file, fileList }) => {
+                this.setState({ fileList });
+            },
+            fileList: fileList,
+            onRemove: (file) => {
+                Fetch.deleteAttachment(file.uid)
+                    .then(res => {
+                        message.success("移除成功!");
+                    });
+                this.setState(({ fileList }) => {
+                    const index = fileList.indexOf(file);
+                    const newFileList = fileList.slice();
+                    newFileList.splice(index, 1);
+                    return {
+                        fileList: newFileList,
+                    };
+                });
+            }
+        };
         return (
-            <div className="app-page">
+            <div className="app-page" >
                 <HeadView history={this.props.history} />
-                <TableBtnView key={-resetKey} type="infoManage" name='活动一览' btnName='活动发布' onClick={() => this.showModal('new')}>
-                </TableBtnView>
-                <TableView columns={columns} data={data} pageSize='10' size='default' />
+                <div style={{ marginLeft: '90%', marginBottom: '20px', marginTop: '20px' }}>
+                    <Button type="primary" size='large' onClick={() => this.showModal('new')}>活动发布</Button>
+                </div>
+                {/* <TableBtnView key={-resetKey} type="infoManage" name='活动一览' btnName='活动发布' onClick={() => this.showModal('new')}>
+                </TableBtnView> */}
+                <div style={{ background: '#fff', margin: 20 }}>
+                    <CommonSearchForm
+                        {...this.props}
+                        formData={formData}
+                        setFormData={this.setFormData}
+                        searchonClick={this.searchonClick}
+                        pathName={this.props.location.pathname}
+                        data={[
+                            {
+                                type: 'select', name: '活动类型', label: '活动类型', key: 'activityType', list: activityTypeList.map(key => ({
+                                    id: key,
+                                    name: taskNodeIds[key]
+                                })),
+                            },
+                            {
+                                type: 'select', name: '活动状态', label: '活动状态', key: 'activityStatus', list: activityStatusList.map(key => ({
+                                    id: key,
+                                    name: activityStatusIds[key]
+                                })),
+                            },
+                            {
+                                type: 'rangePicker',
+                                label: '任务生成时间',
+                                name: JSON.stringify(['开始时间', '结束时间']),
+                                key: JSON.stringify(['startTime', 'endTime']),
+                                keylistName: 'rangeTimelist',
+                            },
+                        ]} />
+                    <TableView columns={columns} data={data} pageSize='10' size='default' loading={loading} />
+                </div>
+                <Modal
+                    key={closeKey}
+                    confirmLoading={confirmLoading}
+                    visible={modal}
+                    width={'50%'}
+                    title="添加结果"
+                    onOk={this.handleOk}
+                    onCancel={this.handleCancel}
+                >
+                    <Row type="flex" align='middle' style={{ margin: '12px 0' }} justify="space-around">
+                        <Col span={6} pull={0} style={{ textAlign: 'center' }}><span>培训结果</span></Col>
+                        <Col span={18} push={0} ><TextArea rows={4} placeholder="请输入培训结果" value={savedate.result || ""} onChange={this.saveInputChange} name='result' /></Col>
+                    </Row>
+                    <Row type="flex" align='middle' justify="space-around">
+                        <Col span={6} pull={0} style={{ textAlign: 'center' }}><span>培训材料</span></Col>
+                        <Col span={18} push={0} >
+                            <Upload listType="picture-card" onPreview={this.handlePreview} {...props}>
+                                <div>
+                                    <Icon type="plus" />
+                                    <div className="ant-upload-text">上传图片</div>
+                                </div>
+                            </Upload>
+                            <Modal visible={previewVisible} footer={null} onCancel={this.handleCancel}>
+                                <img alt="example" style={{ width: '100%' }} src={previewImage} />
+                            </Modal>
+                        </Col>
+                    </Row>
+                </Modal>
             </div>
         );
     }
diff --git a/SunshineIns/src/page/ActiveManageEdit.jsx b/SunshineIns/src/page/ActiveManageEdit.jsx
index c1aa82a..c7651cd 100644
--- a/SunshineIns/src/page/ActiveManageEdit.jsx
+++ b/SunshineIns/src/page/ActiveManageEdit.jsx
@@ -5,13 +5,15 @@
  */
 import React from 'react';
 
-import { Row, Col, Input, DatePicker, Button, Modal, Upload, Icon, message, Divider, TimePicker, Badge, Select, Popconfirm, Spin } from 'antd';
+import { Row, Col, Input, DatePicker, Button, Modal, Upload, Icon, message, Divider, TimePicker, Badge, Select, Popconfirm, Spin, Breadcrumb } from 'antd';
 const { TextArea } = Input;
 import HeadView from '../view/HeadView';
 import BusDetailView from '../view/BusDetailView';
 import TableView from '../view/TableView';
 import ImageBoxView from '../view/ImageBoxView'
 // 引入编辑器以及编辑器样式
+import BraftEditor from 'braft-editor'
+import 'braft-editor/dist/index.css'
 import Fetch from '../fetch';
 import moment from 'moment';
 const format = 'HH:mm';
@@ -53,6 +55,8 @@
             disabled: true,
             status: '',
             loading: false,
+            code: '',
+            editorState: BraftEditor.createEditorState(null)
         };
     }
 
@@ -73,6 +77,7 @@
                 if (endTime == null) {
                     endTime = Date.now();
                 }
+                console.log
                 this.setState({
                     savedate: {
                         ...res.activity,
@@ -82,6 +87,8 @@
                         endHour: moment(endTime).format(format),
                         activityType: res.activity.activityType || 'act_1',
                     },
+                    code: res.code || '',
+                    editorState: BraftEditor.createEditorState(res.activity.course),
                     activityType: res.activity.activityType || 'act_1',
                     status: res.activity.activityStatus || '',
                     disabled: res.activity.activityStatus == 0 ? false : true,
@@ -111,8 +118,8 @@
             return;
         }
         if (savedate.activityPhone) {
-            if (!validator.phone(savedate.activityPhone)) {
-                return message.warning("联系电话格式不正确");
+            if (!savedate.activityPhone) {
+                return message.warning("联系电话不能为空");
             }
         }
         Fetch.saveActive(savedate)
@@ -225,9 +232,70 @@
         )
     }
 
+    uploadFn = (param) => {
+
+        const serverURL = domain + 'api/v1/attachment/upload'
+        const xhr = new XMLHttpRequest
+        const fd = new FormData()
+        const successFn = (response) => {
+            // 假设服务端直接返回文件上传后的地址
+            // 上传成功后调用param.success并传入上传后的文件地址
+            //Pz
+            const res = JSON.parse(xhr.responseText);
+            param.success({
+                url: domain + 'api/v1/attachment/image/' + res[0].id,
+                meta: {
+                    id: res[0].id,
+                    title: res[0].name,
+                    alt: res[0].name,
+                    loop: true, // 指定音视频是否循环播放
+                    autoPlay: true, // 指定音视频是否自动播放
+                    controls: true, // 指定音视频是否显示控制栏
+                    poster: domain + 'api/v1/attachment/image/' + res[0].id, // 指定视频播放器的封面
+                }
+            })
+        }
+
+
+        const progressFn = (event) => {
+            // 上传进度发生变化时调用param.progress
+            param.progress(event.loaded / event.total * 100)
+        }
+
+        const errorFn = (response) => {
+            // 上传发生错误时调用param.error
+            param.error({
+                msg: 'unable to upload.'
+            })
+        }
+        xhr.upload.addEventListener("progress", progressFn, false)
+        xhr.addEventListener("load", successFn, false)
+        xhr.addEventListener("error", errorFn, false)
+        xhr.addEventListener("abort", errorFn, false)
+        fd.append('file', param.file)
+        xhr.open('POST', serverURL, true)
+        xhr.send(fd)
+    }
+
+    handleEditorChange = (editorState) => {
+        this.setState({ editorState })
+    }
+
+    submitContent = () => {
+        // 在编辑器获得焦点时按下ctrl+s会执行此方法
+        // 编辑器内容提交到服务端之前,可直接调用editorState.toHTML()来获取HTML格式的内容
+        const htmlContent = this.state.editorState.toHTML()
+        this.setState(({ savedate }) => ({
+            savedate: {
+                ...savedate,
+                course: htmlContent
+            }
+        }))
+    }
+
     handleCancel = () => this.setState({ previewVisible: false })
     render() {
-        const { savedate, previewVisible, previewImage, fileList, dateSource, hitList, activityType, disabled, loading } = this.state;
+        const { savedate, previewVisible, previewImage,editorState, fileList, dateSource, code, hitList, activityType, disabled, loading } = this.state;
         console.log('disabled', disabled)
         const props = {
             action: domain + 'api/v1/attachment/materials?entityId=' + savedate.id,
@@ -313,6 +381,10 @@
             <div className="app-page">
                 <Spin spinning={loading}>
                     <HeadView history={this.props.history} />
+                    <Breadcrumb style={{ padding: '20px' }}>
+                        <Breadcrumb.Item><a href="index.html#/activeManage">活动管理</a></Breadcrumb.Item>
+                        <Breadcrumb.Item>活动发布</Breadcrumb.Item>
+                    </Breadcrumb>
                     <BusDetailView type='活动发布' >
                         <div style={divStyle}>
                             <Row type="flex" align='middle' justify="space-around">
@@ -324,15 +396,8 @@
                                         <Option value='act_3'>普法预约</Option>
                                     </Select>
                                 </Col>
-                                <Col span={12} pull={0}></Col>
-                            </Row>
-                        </div>
-                        <div style={divStyle}>
-                            <Row type="flex" align='middle' justify="space-around">
                                 <Col span={6} pull={0} style={{ textAlign: 'center' }}><span>主持人</span></Col>
                                 <Col span={6} push={0} ><Input disabled={disabled} placeholder="请输入主持人姓名" style={{ width: '300px' }} name='host' onChange={this.saveInputChange} value={savedate.host || ""} /></Col>
-                                <Col span={6} pull={0} style={{ textAlign: 'center' }}><span>报名要求</span></Col>
-                                <Col span={6} push={0} ><Input disabled={disabled} placeholder="请输入报名要求" style={{ width: '300px' }} name='requirement' onChange={this.saveInputChange} value={savedate.requirement || ""} /></Col>
                             </Row>
                         </div>
 
@@ -376,6 +441,12 @@
                                 <Col span={18} push={0} ><TextArea disabled={disabled} rows={4} placeholder="请输入活动描述" style={{ width: '92%' }} value={savedate.activityDesc || ""} onChange={this.saveInputChange} name='activityDesc' /></Col>
                             </Row>
                         </div>
+                        <div style={divStyle}>
+                            <Row type="flex" align='middle' justify="space-around">
+                                <Col span={6} pull={0} style={{ textAlign: 'center' }}><span>报名要求</span></Col>
+                                <Col span={18} push={0} ><TextArea disabled={disabled} placeholder="请输入报名要求" style={{ width: '92%' }} name='requirement' onChange={this.saveInputChange} value={savedate.requirement || ""} /></Col>
+                            </Row>
+                        </div>
 
                         <div style={divStyle}>
                             <Row type="flex" align='top' justify="space-around">
@@ -395,6 +466,40 @@
                         </div>
 
                         {
+                            code && <div style={divStyle}>
+                                <Row type="flex" align='middle' justify="space-around">
+                                    <Col span={6} pull={0} style={{ textAlign: 'center' }}><span>活动二维码</span></Col>
+                                    <Col span={18} push={0} ><img style={{ width: '150px', height: '150px' }} src={`data:image/png;base64,${code}`} /></Col>
+                                </Row>
+                            </div>
+
+                        }
+
+                        <div style={divStyle}>
+                            <Row type="flex" align='top' justify="space-around">
+                                <Col span={6} pull={0} style={{ textAlign: 'center' }}><span>活动进程</span></Col>
+                                <Col span={18} push={0} style={{ border: 'solid 1px rgba(0, 0, 0, 0.25)', borderRadius: '5PX' }} >
+                                    <BraftEditor
+                                        value={editorState}
+                                        disabled={disabled}
+                                        placeholder='请输入活动进程'
+                                        media={{
+                                            allowPasteImage: true, // 是否允许直接粘贴剪贴板图片(例如QQ截图等)到编辑器
+                                            image: true, // 开启图片插入功能
+                                            video: false, // 开启视频插入功能
+                                            audio: false, // 开启音频插入功能
+                                            uploadFn: this.uploadFn
+                                        }}
+                                        excludeControls={['emoji']}
+                                        onChange={this.handleEditorChange}
+                                        onSave={this.submitContent}
+                                        onBlur={this.submitContent}
+                                    />
+                                </Col>
+                            </Row>
+                        </div>
+
+                        {
                             activityType == 'act_1' ? (dateSource.length > 0 ?
                                 <div style={divStyle}>
                                     <Divider orientation="left" style={{ margin: '20px', width: '97%' }}>报名人员信息</Divider>
diff --git a/SunshineIns/src/page/ApplyFor.jsx b/SunshineIns/src/page/ApplyFor.jsx
index 43d5dc3..2eab1b3 100644
--- a/SunshineIns/src/page/ApplyFor.jsx
+++ b/SunshineIns/src/page/ApplyFor.jsx
@@ -2,10 +2,11 @@
 
 import HeadView from '../view/HeadView';
 import TableBtnView from '../view/TableBtnView';
+import CommonSearchForm from '../view/CommonSearchForm';
+import TableView from '../view/TableView';
 import { Input, Button, DatePicker, Divider, message, Popconfirm, Select, Badge, Tooltip } from 'antd';
 import moment from 'moment';
 import Fetch from '../fetch';
-import TableView from '../view/TableView';
 const Option = Select.Option;
 function typeOfName(type) {
     switch (type) {
@@ -17,15 +18,27 @@
             return "已反馈";
     }
 }
+
+const activityStatusIds = {
+    1: '待处理',
+    2: '已受理',
+    3: '已反馈',
+}
+
+const activityStatusList = [
+    1,
+    2,
+    3,
+]
 export default class ApplyFor extends React.Component {
     constructor(props) {
         super(props);
         this.state = {
             data: [],
-            formdata: {
+            formData: {
+                __key: Date.now(),
                 page: 1,
                 size: 10,
-                type:1,
             },
             resetKey: Date.now(),
             loading: false
@@ -38,10 +51,20 @@
         this.getData();
     }
 
-    getData = () => {
-        const { formdata } = this.state;
+    setFormData = data => {
+        console.log('form', data);
+        this.setState({
+            formData: data,
+        });
+    }
+
+    searchonClick = data => {
+        console.log('form', data);
+        this.setState({
+            formData: data,
+        });
         this.setState({ loading: true })
-        Fetch.entryQuery({ ...formdata })
+        Fetch.entryQuery({ ...data,type:1 })
             .then(res => {
                 console.log(res)
                 for (var i = 0; i < res.rows.length; i++) {
@@ -49,7 +72,22 @@
                 }
                 this.setState({
                     data: res.rows,
-                    loading:false
+                    loading: false
+                });
+            });
+    }
+
+    getData = () => {
+        this.setState({ loading: true })
+        Fetch.entryQuery({ ...this.state.formData,type:1 })
+            .then(res => {
+                console.log(res)
+                for (var i = 0; i < res.rows.length; i++) {
+                    res.rows[i]['index'] = i + 1;
+                }
+                this.setState({
+                    data: res.rows,
+                    loading: false
                 });
             });
     }
@@ -143,42 +181,37 @@
                 </span>
             ),
         }];
-        const { data, loading, resetKey } = this.state;
+        const { data, loading, resetKey, formData } = this.state;
         return (
             <div className="app-page">
                 <HeadView history={this.props.history} />
                 <div style={{ marginLeft: '90%', marginBottom: '20px', marginTop: '20px' }}>
                     <Button type="primary" size='large' onClick={() => this.showModal('new')}>添加申请</Button>
                 </div>
-                {/* <Breadcrumb style={{ padding: '20px' }}>
-                    <Breadcrumb.Item><a href="">后台中心</a></Breadcrumb.Item>
-                    <Breadcrumb.Item>社会关护</Breadcrumb.Item>
-                </Breadcrumb> */}
-                <TableBtnView name={''} key={resetKey}>
-                    <Select
-                        style={{ width: 200 }}
-                        placeholder="根据举报性质查询"
-                        onChange={(value) => this.onInputChange({ target: { name: 'nature', value } })}
-                    >
-                        <Option value="1">涉黑涉恶违法犯罪行为</Option>
-                        <Option value="2">涉黑涉恶违法犯罪保护伞</Option>
-                        <Option value="3">其他</Option>
-                    </Select>
-                    <Input placeholder="根据内容模糊查询" style={{ width: "200px" }} name='content' onChange={this.onInputChange} />
-                    <Select
-                        style={{ width: 200 }}
-                        placeholder="根据状态查询"
-                        onChange={(value) => this.onInputChange({ target: { name: 'status', value } })}
-                    >
-                        <Option value="2">已回复</Option>
-                        <Option value="1">待回复</Option>
-                    </Select>
-
-                    <DatePicker onChange={(_, value) => this.onInputChange({ target: { name: 'createTime', value } })} placeholder="根据创建时间查询" />
-                    <Button type="primary" onClick={this.Seaech}>查询</Button>
-                    <Button onClick={this.Reset}>重置</Button>
-                </TableBtnView>
-                <TableView columns={columns} data={data} pageSize='10' size='default' loading={loading} />
+                <div style={{ background: '#fff', margin: 20 }}>
+                    <CommonSearchForm
+                        {...this.props}
+                        formData={formData}
+                        setFormData={this.setFormData}
+                        searchonClick={this.searchonClick}
+                        pathName={this.props.location.pathname}
+                        data={[
+                            {
+                                type: 'select', name: '状态', label: '活动状态', key: 'status', list: activityStatusList.map(key => ({
+                                    id: key,
+                                    name: activityStatusIds[key]
+                                })),
+                            },
+                            {
+                                type: 'rangePicker',
+                                label: '申请时间',
+                                name: JSON.stringify(['开始时间', '结束时间']),
+                                key: JSON.stringify(['startTime', 'endTime']),
+                                keylistName: 'rangeTimelist',
+                            },
+                        ]} />
+                    <TableView columns={columns} data={data} pageSize='10' size='default' loading={loading} />
+                </div>
             </div>
         );
     }
diff --git a/SunshineIns/src/page/ApplyForEdit.jsx b/SunshineIns/src/page/ApplyForEdit.jsx
index 75bf9d6..7589c31 100644
--- a/SunshineIns/src/page/ApplyForEdit.jsx
+++ b/SunshineIns/src/page/ApplyForEdit.jsx
@@ -1,7 +1,7 @@
 
 import React from 'react';
 
-import { Row, Col, Input, DatePicker, Button, Modal, Upload, Icon, message, Divider, TimePicker, Badge, Select, Popconfirm, Spin } from 'antd';
+import { Row, Col, Input, DatePicker, Button, Modal, Upload, Icon, message, Divider, Breadcrumb, Badge, Select, Popconfirm, Spin } from 'antd';
 const { TextArea } = Input;
 import HeadView from '../view/HeadView';
 import BusDetailView from '../view/BusDetailView';
@@ -268,6 +268,10 @@
             <div className="app-page">
                 <Spin spinning={loading}>
                     <HeadView history={this.props.history} />
+                    <Breadcrumb style={{ padding: '20px' }}>
+                        <Breadcrumb.Item><a href="index.html#/entry/applyFor">入职查询</a></Breadcrumb.Item>
+                        <Breadcrumb.Item>入职申请</Breadcrumb.Item>
+                    </Breadcrumb>
                     <BusDetailView type='入职申请' >
                         <div style={divStyle}>
                             <Row type="flex" align='middle' justify="space-around">
diff --git a/SunshineIns/src/page/CareList.jsx b/SunshineIns/src/page/CareList.jsx
index bac86f5..1fa8e21 100644
--- a/SunshineIns/src/page/CareList.jsx
+++ b/SunshineIns/src/page/CareList.jsx
@@ -2,6 +2,7 @@
 
 import HeadView from '../view/HeadView';
 import TableBtnView from '../view/TableBtnView';
+import CommonSearchForm from '../view/CommonSearchForm';
 import { Input, Button, DatePicker, Divider, message, Popconfirm, Select, Badge } from 'antd';
 import moment from 'moment';
 import Fetch from '../fetch';
@@ -19,12 +20,38 @@
             return "心理疏导";
     }
 }
+
+const taskNodeIds = {
+    1: '跟踪帮教',
+    2: '合适成年人',
+    3: '社会调查',
+    4: '心理疏导',
+}
+
+const activityTypeList = [
+    1,
+    2,
+    3,
+]
+const activityStatusIds = {
+    0: '未开始',
+    1: '进行中',
+    2: '已结束',
+    99: '结束',
+}
+
+const activityStatusList = [
+    1,
+    2,
+    3,
+]
 export default class CareList extends React.Component {
     constructor(props) {
         super(props);
         this.state = {
             data: [],
-            formdata: {
+            formData: {
+                __key: Date.now(),
                 page: 1,
                 size: 10,
             },
@@ -34,28 +61,44 @@
     }
 
     componentDidMount() {
-
         document.title = '社会关护管理';
         this.getData();
     }
 
+    setFormData = data => {
+        console.log('form', data);
+        this.setState({
+            formData: data,
+        });
+    }
+
+    searchonClick = data => {
+        console.log('form', data);
+        this.setState({
+            formData: data,
+        });
+        this.getData();
+    }
+
     getData = () => {
-        const { formdata } = this.state;
-        Fetch.socialQuery({ ...formdata })
+        const { formData } = this.state;
+        this.setState({loading:true})
+        Fetch.socialQuery({ ...formData })
             .then(res => {
                 console.log(res)
                 for (var i = 0; i < res.rows.length; i++) {
                     res.rows[i]['index'] = i + 1;
                 }
                 this.setState({
-                    data: res.rows
+                    data: res.rows,
+                    loading:false,
                 });
             });
     }
     onInputChange = ({ target: { value, name } }) => {
-        this.setState(({ formdata }) => ({
-            formdata: {
-                ...formdata,
+        this.setState(({ formData }) => ({
+            formData: {
+                ...formData,
                 [name]: value
             }
         }))
@@ -65,8 +108,8 @@
     }
 
     Seaech = () => {
-        const { formdata } = this.state;
-        Fetch.getSweeping(formdata)
+        const { formData } = this.state;
+        Fetch.getSweeping(formData)
             .then(res => {
                 for (var i = 0; i < res.length; i++) {
                     res[i]['index'] = i + 1;
@@ -79,7 +122,7 @@
     Reset = () => {
         this.setState({
             resetKey: Date.now(),
-            formdata: {}
+            formData: {}
         }, this.getData);
     }
 
@@ -115,7 +158,7 @@
             key: 'status',
             render: text => (
                 text == 0 ?
-                    <Badge style={{ backgroundColor: '#6C757C' }} count={'未开始'} /> :text == 1 ? <Badge count={'F1C40F'} style={{ backgroundColor: '#6C757C' }} /> : <Badge count={'已结束'} style={{ backgroundColor: '#2ECC71' }} />
+                    <Badge style={{ backgroundColor: '#6C757C' }} count={'已结束'} /> : text == 1 ? <Badge count={'进行中'} style={{ backgroundColor: '#6C757C' }} />: text == 2 ? <Badge count={'进行中'} style={{ backgroundColor: '#6C757C' }} /> : <Badge count={'已结束'} style={{ backgroundColor: '#2ECC71' }} />
             )
         }, {
             title: '创建时间',
@@ -123,6 +166,16 @@
             key: 'createTime',
             render: text => <span>{moment(text).format("YYYY-MM-DD HH:mm")}</span>
         }, {
+            title: '开始时间',
+            dataIndex: 'startTime',
+            key: 'startTime',
+            render: text => <span>{moment(text).format("YYYY-MM-DD HH:mm")}</span>
+        }, {
+            title: '结束时间',
+            dataIndex: 'endTime',
+            key: 'endTime',
+            render: text => <span>{moment(text).format("YYYY-MM-DD HH:mm")}</span>
+        },{
             title: '操作',
             key: 'action',
             render: (text, record) => (
@@ -139,16 +192,16 @@
                         <a href="#">删除</a>
                     </Popconfirm>
                     {
-                        record.status==1?
-                        <React.Fragment>
-                            <Divider type="vertical" />
-                            <a onClick={() => this.showModal(record.id)}>结束任务</a>
-                        </React.Fragment>:''
+                        record.status == 1 ?
+                            <React.Fragment>
+                                <Divider type="vertical" />
+                                <a onClick={() => this.showModal(record.id)}>结束任务</a>
+                            </React.Fragment> : ''
                     }
                 </span>
             ),
         }];
-        const { data, loading, resetKey } = this.state;
+        const { data, loading, resetKey, formData } = this.state;
         return (
             <div className="app-page">
                 <HeadView history={this.props.history} />
@@ -159,31 +212,36 @@
                     <Breadcrumb.Item><a href="">后台中心</a></Breadcrumb.Item>
                     <Breadcrumb.Item>社会关护</Breadcrumb.Item>
                 </Breadcrumb> */}
-                <TableBtnView name={''} key={resetKey}>
-                    <Select
-                        style={{ width: 200 }}
-                        placeholder="根据举报性质查询"
-                        onChange={(value) => this.onInputChange({ target: { name: 'nature', value } })}
-                    >
-                        <Option value="1">涉黑涉恶违法犯罪行为</Option>
-                        <Option value="2">涉黑涉恶违法犯罪保护伞</Option>
-                        <Option value="3">其他</Option>
-                    </Select>
-                    <Input placeholder="根据内容模糊查询" style={{ width: "200px" }} name='content' onChange={this.onInputChange} />
-                    <Select
-                        style={{ width: 200 }}
-                        placeholder="根据状态查询"
-                        onChange={(value) => this.onInputChange({ target: { name: 'status', value } })}
-                    >
-                        <Option value="2">已回复</Option>
-                        <Option value="1">待回复</Option>
-                    </Select>
-
-                    <DatePicker onChange={(_, value) => this.onInputChange({ target: { name: 'createTime', value } })} placeholder="根据创建时间查询" />
-                    <Button type="primary" onClick={this.Seaech}>查询</Button>
-                    <Button onClick={this.Reset}>重置</Button>
-                </TableBtnView>
-                <TableView columns={columns} data={data} pageSize='10' size='default' loading={loading} />
+                <div style={{ background: '#fff', margin: 20 }}>
+                    <CommonSearchForm
+                        {...this.props}
+                        formData={formData}
+                        setFormData={this.setFormData}
+                        searchonClick={this.searchonClick}
+                        pathName={this.props.location.pathname}
+                        data={[
+                            {
+                                type: 'select', name: '任务类型', label: '任务类型', key: 'taskType', list: activityTypeList.map(key => ({
+                                    id: key,
+                                    name: taskNodeIds[key]
+                                })),
+                            },
+                            {
+                                type: 'select', name: '状态', label: '状态', key: 'status', list: activityStatusList.map(key => ({
+                                    id: key,
+                                    name: activityStatusIds[key]
+                                })),
+                            },
+                            {
+                                type: 'rangePicker',
+                                label: '创建时间',
+                                name: JSON.stringify(['开始时间', '结束时间']),
+                                key: JSON.stringify(['startTime', 'endTime']),
+                                keylistName: 'rangeTimelist',
+                            },
+                        ]} />
+                    <TableView columns={columns} data={data} pageSize='10' size='default' loading={loading}/>
+                </div>
             </div>
         );
     }
diff --git a/SunshineIns/src/page/CareListEdit.jsx b/SunshineIns/src/page/CareListEdit.jsx
index 2ed56ab..25c60e4 100644
--- a/SunshineIns/src/page/CareListEdit.jsx
+++ b/SunshineIns/src/page/CareListEdit.jsx
@@ -1,7 +1,7 @@
 
 import React from 'react';
 
-import { Row, Col, Input, DatePicker, Button, Modal, Upload, Icon, message, Divider, TimePicker, Badge, Select, Popconfirm, Spin } from 'antd';
+import { Row, Col, Input, DatePicker, Button, Modal, Upload, Icon, message, Breadcrumb, TimePicker, Badge, Select, Popconfirm, Spin } from 'antd';
 const { TextArea } = Input;
 import HeadView from '../view/HeadView';
 import BusDetailView from '../view/BusDetailView';
@@ -360,6 +360,10 @@
             <div className="app-page">
                 <Spin spinning={loading}>
                     <HeadView history={this.props.history} />
+                    <Breadcrumb style={{ padding: '20px' }}>
+                        <Breadcrumb.Item><a href="index.html#/entry/applyFor">社会关护管理</a></Breadcrumb.Item>
+                        <Breadcrumb.Item>社会关护管理活动</Breadcrumb.Item>
+                    </Breadcrumb>
                     <BusDetailView type='社会关护管理活动' >
                         <div style={divStyle}>
                             <Row type="flex" align='middle' justify="space-around">
diff --git a/SunshineIns/src/page/Examine.jsx b/SunshineIns/src/page/Examine.jsx
index ce5607f..e380587 100644
--- a/SunshineIns/src/page/Examine.jsx
+++ b/SunshineIns/src/page/Examine.jsx
@@ -2,6 +2,7 @@
 
 import HeadView from '../view/HeadView';
 import TableBtnView from '../view/TableBtnView';
+import CommonSearchForm from '../view/CommonSearchForm';
 import { Input, Button, DatePicker, Divider, message, Popconfirm, Select, Badge, Tooltip } from 'antd';
 import moment from 'moment';
 import Fetch from '../fetch';
@@ -22,10 +23,10 @@
         super(props);
         this.state = {
             data: [],
-            formdata: {
+            formData: {
+                __key: Date.now(),
                 page: 1,
                 size: 10,
-                type:2,
             },
             resetKey: Date.now(),
             loading: false
@@ -38,48 +39,57 @@
         this.getData();
     }
 
-    getData = () => {
-        const { formdata } = this.state;
-        Fetch.entryQuery({ ...formdata })
+    setFormData = data => {
+        console.log('form', data);
+        this.setState({
+            formData: data,
+        });
+    }
+
+    searchonClick = data => {
+        console.log('form', data);
+        this.setState({
+            formData: data,
+        });
+        this.setState({ loading: true })
+        Fetch.entryQuery({ ...data, type: 2 })
             .then(res => {
                 console.log(res)
                 for (var i = 0; i < res.rows.length; i++) {
                     res.rows[i]['index'] = i + 1;
                 }
                 this.setState({
-                    data: res.rows
+                    data: res.rows,
+                    loading: false
+                });
+            });
+    }
+
+    getData = () => {
+        this.setState({ loading: true })
+        console.log(this.state.formData)
+        Fetch.entryQuery({ ...this.state.formData, type: 2 })
+            .then(res => {
+                console.log(res)
+                for (var i = 0; i < res.rows.length; i++) {
+                    res.rows[i]['index'] = i + 1;
+                }
+                this.setState({
+                    data: res.rows,
+                    loading: false
                 });
             });
     }
     onInputChange = ({ target: { value, name } }) => {
-        this.setState(({ formdata }) => ({
-            formdata: {
-                ...formdata,
+        this.setState(({ formData }) => ({
+            formData: {
+                ...formData,
                 [name]: value
             }
         }))
     }
     showModal = (id) => {
         this.props.history.push("/entry/ExamineEdit/" + id);
-    }
-
-    Seaech = () => {
-        const { formdata } = this.state;
-        Fetch.getSweeping(formdata)
-            .then(res => {
-                for (var i = 0; i < res.length; i++) {
-                    res[i]['index'] = i + 1;
-                }
-                this.setState({
-                    data: res
-                });
-            });
-    }
-    Reset = () => {
-        this.setState({
-            resetKey: Date.now(),
-            formdata: {}
-        }, this.getData);
     }
 
     confirm = (e) => {
@@ -131,35 +141,30 @@
                 </span>
             ),
         }];
-        const { data, loading, resetKey } = this.state;
+        const { data, loading, resetKey, formData } = this.state;
+        console.log(formData)
         return (
             <div className="app-page">
                 <HeadView history={this.props.history} />
-                <TableBtnView name={''} key={resetKey} style={{marginTop:"20px"}}>
-                    <Select
-                        style={{ width: 200 }}
-                        placeholder="根据举报性质查询"
-                        onChange={(value) => this.onInputChange({ target: { name: 'nature', value } })}
-                    >
-                        <Option value="1">涉黑涉恶违法犯罪行为</Option>
-                        <Option value="2">涉黑涉恶违法犯罪保护伞</Option>
-                        <Option value="3">其他</Option>
-                    </Select>
-                    <Input placeholder="根据内容模糊查询" style={{ width: "200px" }} name='content' onChange={this.onInputChange} />
-                    <Select
-                        style={{ width: 200 }}
-                        placeholder="根据状态查询"
-                        onChange={(value) => this.onInputChange({ target: { name: 'status', value } })}
-                    >
-                        <Option value="2">已回复</Option>
-                        <Option value="1">待回复</Option>
-                    </Select>
-
-                    <DatePicker onChange={(_, value) => this.onInputChange({ target: { name: 'createTime', value } })} placeholder="根据创建时间查询" />
-                    <Button type="primary" onClick={this.Seaech}>查询</Button>
-                    <Button onClick={this.Reset}>重置</Button>
-                </TableBtnView>
-                <TableView columns={columns} data={data} pageSize='10' size='default' loading={loading} />
+                <div style={{ background: '#fff', margin: 20 }}>
+                    <CommonSearchForm
+                        {...this.props}
+                        formData={formData}
+                        setFormData={this.setFormData}
+                        searchonClick={this.searchonClick}
+                        pathName={this.props.location.pathname}
+                        data={[
+                            { type: 'input', name: '申请人', label: '申请人', key: 'createrName' },
+                            {
+                                type: 'rangePicker',
+                                label: '申请时间',
+                                name: JSON.stringify(['开始时间', '结束时间']),
+                                key: JSON.stringify(['startTime', 'endTime']),
+                                keylistName: 'rangeTimelist',
+                            },
+                        ]} />
+                    <TableView columns={columns} data={data} pageSize='10' size='default' loading={loading} />
+                </div>
             </div>
         );
     }
diff --git a/SunshineIns/src/page/ExamineEdit.jsx b/SunshineIns/src/page/ExamineEdit.jsx
index b4452a2..ea11120 100644
--- a/SunshineIns/src/page/ExamineEdit.jsx
+++ b/SunshineIns/src/page/ExamineEdit.jsx
@@ -1,7 +1,7 @@
 
 import React from 'react';
 
-import { Row, Col, Input, DatePicker, Button, Modal, Upload, Icon, message, Divider, TimePicker, Badge, Select, Popconfirm, Spin } from 'antd';
+import { Row, Col, Input, DatePicker, Button, Modal, Upload, Icon, message, Divider, Breadcrumb, Badge, Select, Popconfirm, Spin } from 'antd';
 const { TextArea } = Input;
 import HeadView from '../view/HeadView';
 import BusDetailView from '../view/BusDetailView';
@@ -261,6 +261,10 @@
             <div className="app-page">
                 <Spin spinning={loading}>
                     <HeadView history={this.props.history} />
+                    <Breadcrumb style={{ padding: '20px' }}>
+                        <Breadcrumb.Item><a href="index.html#/entry/applyFor">检察院审核</a></Breadcrumb.Item>
+                        <Breadcrumb.Item>检察院审核详情</Breadcrumb.Item>
+                    </Breadcrumb>
                     <BusDetailView type='检察院审核' >
                         <div style={divStyle}>
                             <Row type="flex" align='middle' justify="space-around">
diff --git a/SunshineIns/src/page/PoliceSecurity.jsx b/SunshineIns/src/page/PoliceSecurity.jsx
index dbb8f47..91dffde 100644
--- a/SunshineIns/src/page/PoliceSecurity.jsx
+++ b/SunshineIns/src/page/PoliceSecurity.jsx
@@ -2,6 +2,7 @@
 
 import HeadView from '../view/HeadView';
 import TableBtnView from '../view/TableBtnView';
+import CommonSearchForm from '../view/CommonSearchForm';
 import { Input, Button, DatePicker, Divider, message, Popconfirm, Select, Badge, Tooltip } from 'antd';
 import moment from 'moment';
 import Fetch from '../fetch';
@@ -22,10 +23,10 @@
         super(props);
         this.state = {
             data: [],
-            formdata: {
+            formData: {
+                __key: Date.now(),
                 page: 1,
                 size: 10,
-                type:3,
             },
             resetKey: Date.now(),
             loading: false
@@ -37,10 +38,20 @@
         this.getData();
     }
 
-    getData = () => {
-        const { formdata } = this.state;
+    setFormData = data => {
+        console.log('form', data);
+        this.setState({
+            formData: data,
+        });
+    }
+
+    searchonClick = data => {
+        console.log('form', data);
+        this.setState({
+            formData: data,
+        });
         this.setState({ loading: true })
-        Fetch.entryQuery({ ...formdata })
+        Fetch.entryQuery({ ...data, type: 3 })
             .then(res => {
                 console.log(res)
                 for (var i = 0; i < res.rows.length; i++) {
@@ -48,14 +59,29 @@
                 }
                 this.setState({
                     data: res.rows,
-                    loading: false 
+                    loading: false
+                });
+            });
+    }
+
+    getData = () => {
+        this.setState({ loading: true })
+        Fetch.entryQuery({ ...this.state.formData, type: 3 })
+            .then(res => {
+                console.log(res)
+                for (var i = 0; i < res.rows.length; i++) {
+                    res.rows[i]['index'] = i + 1;
+                }
+                this.setState({
+                    data: res.rows,
+                    loading: false
                 });
             });
     }
     onInputChange = ({ target: { value, name } }) => {
-        this.setState(({ formdata }) => ({
-            formdata: {
-                ...formdata,
+        this.setState(({ formData }) => ({
+            formData: {
+                ...formData,
                 [name]: value
             }
         }))
@@ -65,8 +91,8 @@
     }
 
     Seaech = () => {
-        const { formdata } = this.state;
-        Fetch.getSweeping(formdata)
+        const { formData } = this.state;
+        Fetch.getSweeping(formData)
             .then(res => {
                 for (var i = 0; i < res.length; i++) {
                     res[i]['index'] = i + 1;
@@ -79,7 +105,7 @@
     Reset = () => {
         this.setState({
             resetKey: Date.now(),
-            formdata: {}
+            formData: {}
         }, this.getData);
     }
 
@@ -132,35 +158,29 @@
                 </span>
             ),
         }];
-        const { data, loading, resetKey } = this.state;
+        const { data, loading, resetKey, formData } = this.state;
         return (
             <div className="app-page">
                 <HeadView history={this.props.history} />
-                <TableBtnView  key={resetKey} style={{marginTop:"20px"}}>
-                    <Select
-                        style={{ width: 200 }}
-                        placeholder="根据举报性质查询"
-                        onChange={(value) => this.onInputChange({ target: { name: 'nature', value } })}
-                    >
-                        <Option value="1">涉黑涉恶违法犯罪行为</Option>
-                        <Option value="2">涉黑涉恶违法犯罪保护伞</Option>
-                        <Option value="3">其他</Option>
-                    </Select>
-                    <Input placeholder="根据内容模糊查询" style={{ width: "200px" }} name='content' onChange={this.onInputChange} />
-                    <Select
-                        style={{ width: 200 }}
-                        placeholder="根据状态查询"
-                        onChange={(value) => this.onInputChange({ target: { name: 'status', value } })}
-                    >
-                        <Option value="2">已回复</Option>
-                        <Option value="1">待回复</Option>
-                    </Select>
-
-                    <DatePicker onChange={(_, value) => this.onInputChange({ target: { name: 'createTime', value } })} placeholder="根据创建时间查询" />
-                    <Button type="primary" onClick={this.Seaech}>查询</Button>
-                    <Button onClick={this.Reset}>重置</Button>
-                </TableBtnView>
-                <TableView columns={columns} data={data} pageSize='10' size='default' loading={loading} />
+                <div style={{ background: '#fff', margin: 20 }}>
+                    <CommonSearchForm
+                        {...this.props}
+                        formData={formData}
+                        setFormData={this.setFormData}
+                        searchonClick={this.searchonClick}
+                        pathName={this.props.location.pathname}
+                        data={[
+                            { type: 'input', name: '申请人', label: '申请人', key: 'createrName' },
+                            {
+                                type: 'rangePicker',
+                                label: '申请时间',
+                                name: JSON.stringify(['开始时间', '结束时间']),
+                                key: JSON.stringify(['startTime', 'endTime']),
+                                keylistName: 'rangeTimelist',
+                            },
+                        ]} />
+                    <TableView columns={columns} data={data} pageSize='10' size='default' loading={loading} />
+                </div>
             </div>
         );
     }
diff --git a/SunshineIns/src/page/SignIn.jsx b/SunshineIns/src/page/SignIn.jsx
index 1e22ab1..539dd09 100644
--- a/SunshineIns/src/page/SignIn.jsx
+++ b/SunshineIns/src/page/SignIn.jsx
@@ -1,31 +1,95 @@
 import React from 'react';
-import { Input, Button, DatePicker, Divider, message, Popconfirm, Select, Badge } from 'antd';
+import { Icon, Button, DatePicker, Divider, Affix, Spin, Card, Row, Col } from 'antd';
 
+import Fetch from '../fetch';
+import sign from './../asset/image/sign.png';
+import moment from 'moment';
+
+
+const format = 'YYYY-MM-DD HH:mm';
+
+const list = [
+    { name: '一号' },
+    { name: '二号' },
+    { name: '三号' },
+    { name: '四号' },
+    { name: '五号' },
+    { name: '六号' },
+    { name: '七号' },
+]
 export default class SignIn extends React.Component {
     constructor(props) {
         super(props);
         this.state = {
-            data: [],
-           
+            personList: [],
+            activityName: '',
+            code: '',
+            loading: false,
         };
     }
 
     componentDidMount() {
 
         document.title = '签到上墙';
-        // this.getData();
+        this.getData();
     }
 
     getData = () => {
-        
+        // signinfo
+        const { id } = this.props.match.params;
+        this.setState({ loading: true })
+        Fetch.signinfo(id)
+            .then(res => {
+                console.log(res)
+                this.setState({
+                    code: res.data.code,
+                    personList: res.data.personList,
+                    activityName: res.data.activityName,
+                    loading: false,
+                });
+            })
     }
-   
+
     render() {
-        
-        const { data, loading, resetKey } = this.state;
+
+        const { code, loading, personList, activityName } = this.state;
         return (
             <div className="app-page">
-              签到上墙
+                <Spin spinning={loading}>
+                    <Affix style={{ position: 'absolute', top: 520, right: 20 }}>
+                        <Card>
+                            < img style={{ width: '150px', height: '150px' }} src={`data:image/png;base64,${code}`} alt=""></img>
+                        </Card>
+                    </Affix>
+                    <Card style={{ margin: "8%" }}>
+                        <div>
+                            <Row type="flex" justify="center" align="middle" style={{ borderBottom: '1px solid #D8D8D8' }}>
+                                <Col style={{ color: '#3D444D', fontSize: 26, fontWeight: 'bold', lineHeight: '75px' }}>
+                                    {activityName}
+                                </Col>
+                            </Row>
+                        </div>
+
+                        <div style={{ display: 'flex' }}>
+                            {
+                                personList.length > 0 ? personList.map((item, index) => (
+                                    <div style={{ display: 'flex', flexWrap: 'wrap', flexDirection: 'column', width: '168px', height: '168px', justifyContent: 'center', alignItems: 'center',color:'#fff',textAlign:'center',lineHeight:'150px' }} key={index}>
+                                        <img src={item.imgUrl} style={{ width: '150px', height: '150px' }} />
+                                        {
+                                            item.signStatus !== 3 ?
+                                                <div style={{ width: '150px', height: '150px', backgroundColor: '#000', opacity: '0.2', position: 'absolute' }}>未签到</div> : ''
+                                        }
+                                        {
+                                            item.signStatus == 3 ?
+                                        // <div style={{ width: '150px', height: '50px', color:'#000', position: 'absolute' }}>签到时间:{moment(item.updateTime).format(format)}</div> : ''
+                                        <div style={{ width: '150px', height: '150px', color:'#000', position: 'absolute', display:'flex',justifyContent:'flex-end' }}><Icon type="check-circle" style={{fontSize:'32px'}} theme="twoTone" twoToneColor="#52c41a" /></div> : ''
+                                        }
+                                    </div>
+                                )) : <span>暂无数据</span>
+                            }
+                        </div>
+                    </Card>
+                </Spin>
             </div>
         );
     }
diff --git a/SunshineIns/src/page/UnderAgeList.jsx b/SunshineIns/src/page/UnderAgeList.jsx
new file mode 100644
index 0000000..272a96d
--- /dev/null
+++ b/SunshineIns/src/page/UnderAgeList.jsx
@@ -0,0 +1,224 @@
+import React from 'react';
+
+import HeadView from '../view/HeadView';
+import TableBtnView from '../view/TableBtnView';
+import { Input, Button, DatePicker, Divider, Modal, message } from 'antd'
+import moment from 'moment'
+import Fetch from '../fetch';
+import TableView from '../view/TableView';
+const confirm = Modal.confirm;
+export default class Company extends React.Component {
+  constructor(props) {
+    super(props);
+    this.state = {
+      data: [],
+      loading: false,
+      visible: false,
+      savedate: {},
+      formdata: {},
+      resetKey: Date.now(),
+      closeKey: Date.now()
+    };
+  }
+
+  componentDidMount() {
+    document.title = '涉未成年负责部门组织';
+    this.getData();
+  }
+  getData = () => {
+    const { formdata } = this.state;
+    Fetch.socialCompany(formdata)
+      .then(res => {
+        for (var i = 0; i < res.length; i++) {
+          res[i]['index'] = i + 1;
+        }
+        this.setState({
+          data: res
+        });
+      });
+  }
+  onInputChange = ({ target: { value, name } }) => {
+    this.setState(({ formdata }) => ({
+      formdata: {
+        ...formdata,
+        [name]: value
+      }
+    }))
+  }
+  saveInputChange = ({ target: { value, name } }) => {
+    this.setState(({ savedate }) => ({
+      savedate: {
+        ...savedate,
+        [name]: value
+      }
+    }))
+  }
+  Seaech = () => {
+    const { formdata } = this.state;
+    Fetch.socialCompany(formdata)
+      .then(res => {
+        for (var i = 0; i < res.length; i++) {
+          res[i]['index'] = i + 1;
+        }
+        this.setState({
+          data: res
+        });
+      });
+  }
+  Reset = () => {
+    this.setState({
+      resetKey: Date.now(),
+      formdata: {}
+    }, this.getData);
+  }
+
+  showModal = (id) => {
+    this.setState({
+      visible: true,
+    });
+    Fetch.socialCompanyDetail(id)
+      .then(res => {
+        this.setState({ savedate: res })
+      })
+  }
+
+  handleOk = () => {
+    this.setState({ loading: true });
+    const { savedate } = this.state;
+    if (savedate.companyTel) {
+      if (!validator.mobile(savedate.companyTel)) {
+        this.setState({
+          loading: false
+        });
+        return message.warning("电话号码格式不正确");
+      }
+    }
+    if (!savedate.companyAccount) {
+      return message.warning("账号不能为空");
+    }
+    if (!savedate.companyPassword) {
+      return message.warning("密码不能为控");
+    }
+    Fetch.socialCompanySave(savedate)
+      .then(res => {
+        if (res.statuscode === 1) {
+          this.setState({
+            loading: false,
+            visible: false,
+            closeKey: Date.now()
+          }, this.getData);
+          message.success("提交成功!")
+        } else {
+          message.error('保存失败,请联系管理员', 2)
+        }
+      });
+  }
+
+  handleCancel = () => {
+    this.setState({
+      closeKey: Date.now(),
+      visible: false
+    });
+  }
+
+  deleteItems = (id) => {
+    confirm({
+      title: '确认要删除这条数据吗?',
+      onOk: () => {
+        Fetch.socialCompanydelete(id)
+          .then(data => {
+            if (data.statuscode == 1) {
+              message.success("删除成功!")
+              this.setState({
+                resetKey: Date.now(),
+                formdata: {}
+              }, this.getData);
+            } else {
+              message.error('删除失败,请联系管理员', 2)
+            }
+          })
+      }
+    });
+  }
+  render() {
+    const columns = [{
+      title: '序号',
+      dataIndex: 'index',
+      key: 'index'
+    }, {
+      title: '公司名称',
+      dataIndex: 'companyName',
+      key: 'companyName'
+    }, {
+      title: '法人姓名',
+      dataIndex: 'companyLegal',
+      key: 'companyLegal',
+    }, {
+      title: '联系电话',
+      dataIndex: 'companyTel',
+      key: 'companyTel',
+    }, {
+      title: '公司地址',
+      dataIndex: 'companyAddress',
+      key: 'companyAddress',
+    }, {
+      title: '管理员账号',
+      dataIndex: 'companyAccount',
+      key: 'companyAccount',
+    }, {
+      title: '管理员密码',
+      dataIndex: 'companyPassword',
+      key: 'companyPassword',
+      render: text => <span>***********</span>
+    }, {
+      title: '创建时间',
+      dataIndex: 'createTime',
+      key: 'createTime',
+      render: text => <span>{moment(text).format("YYYY-MM-DD HH:mm")}</span>
+    }, {
+      title: '操作',
+      key: 'action',
+      render: (text, record) => (
+        <span>
+          <label onClick={() => this.showModal(record.id)} className='theme-color' style={{ cursor: 'pointer' }}>编辑</label>
+          <Divider type="vertical" />
+          <label onClick={() => this.deleteItems(record.id)} className='theme-color' style={{ cursor: 'pointer' }}>删除</label>
+        </span>
+      ),
+    }];
+    const { data, resetKey, visible, loading, savedate, closeKey } = this.state;
+    return (
+
+      <div className="app-page">
+        <HeadView history={this.props.history} />
+        <TableBtnView key={-resetKey} type="infoManage" name='涉未成年负责部门组织' btnName='新建公司' onClick={() => this.showModal('new')}>
+          <Input placeholder="根据公司名称模糊查询" style={{ width: "200px" }} name='companyName' onChange={this.onInputChange} />
+          <Input placeholder="根据法人姓名模糊查询" style={{ width: "200px" }} name='companyLegal' onChange={this.onInputChange} />
+          <Input placeholder="根据联系电话模糊查询" style={{ width: "200px" }} name='companyTel' onChange={this.onInputChange} />
+          <Input placeholder="根据管理员账号模糊查询" style={{ width: "200px" }} name='companyAccount' onChange={this.onInputChange} />
+          <DatePicker onChange={(_, value) => this.onInputChange({ target: { name: 'createTime', value } })} placeholder="根据创建时间查询" />
+          <Button type="primary" onClick={this.Seaech}>查询</Button>
+          <Button onClick={this.Reset}>重置</Button>
+        </TableBtnView>
+        <TableView columns={columns} data={data} pageSize='10' size='default' />
+        <Modal
+          key={closeKey}
+          confirmLoading={loading}
+          visible={visible}
+          title="公司信息"
+          onOk={this.handleOk}
+          onCancel={this.handleCancel}
+          bodyStyle={{ lineHeight: 4 }}
+        >
+          <Input addonBefore="公司名称" name='companyName' onChange={this.saveInputChange} value={savedate.companyName || ''} />
+          <Input addonBefore="法人姓名" name='companyLegal' onChange={this.saveInputChange} value={savedate.companyLegal || ''} />
+          <Input addonBefore="联系电话" name='companyTel' onChange={this.saveInputChange} value={savedate.companyTel || ''} />
+          <Input addonBefore="公司地址" name='companyAddress' onChange={this.saveInputChange} value={savedate.companyAddress || ''} />
+          <Input addonBefore="管理员账号" name='companyAccount' onChange={this.saveInputChange} value={savedate.companyAccount || ''} />
+          <Input addonBefore="管理员密码" name='companyPassword' onChange={this.saveInputChange} value={savedate.companyPassword || ''} />
+        </Modal>
+      </div>
+    );
+  }
+
+}
diff --git a/SunshineIns/src/page/policeSecurityEdit.jsx b/SunshineIns/src/page/policeSecurityEdit.jsx
index 480cf99..1939bc1 100644
--- a/SunshineIns/src/page/policeSecurityEdit.jsx
+++ b/SunshineIns/src/page/policeSecurityEdit.jsx
@@ -1,7 +1,7 @@
 
 import React from 'react';
 
-import { Row, Col, Input, DatePicker, Button, Modal, Upload, Icon, message, Divider, TimePicker, Badge, Select, Popconfirm, Spin } from 'antd';
+import { Row, Col, Input, DatePicker, Button, Modal, Upload, Icon, message, Divider, Breadcrumb, Badge, Select, Popconfirm, Spin } from 'antd';
 const { TextArea } = Input;
 import HeadView from '../view/HeadView';
 import BusDetailView from '../view/BusDetailView';
@@ -261,6 +261,10 @@
             <div className="app-page">
                 <Spin spinning={loading}>
                     <HeadView history={this.props.history} />
+                    <Breadcrumb style={{ padding: '20px' }}>
+                        <Breadcrumb.Item><a href="index.html#/entry/applyFor">检察院审核</a></Breadcrumb.Item>
+                        <Breadcrumb.Item>检察院审核详情</Breadcrumb.Item>
+                    </Breadcrumb>
                     <BusDetailView type='公安审核' >
                         <div style={divStyle}>
                             <Row type="flex" align='middle' justify="space-around">
diff --git a/SunshineIns/src/view/CommonSearchForm/index.jsx b/SunshineIns/src/view/CommonSearchForm/index.jsx
new file mode 100644
index 0000000..4dda63c
--- /dev/null
+++ b/SunshineIns/src/view/CommonSearchForm/index.jsx
@@ -0,0 +1,253 @@
+import React from 'react';
+import './style.scss';
+import {
+  Row,
+  Col,
+  Form,
+  Input,
+  Button,
+  Select,
+  DatePicker,
+
+} from 'antd';
+const { RangePicker } = DatePicker;
+import { FormComponentProps } from 'antd/lib/form';
+import { RouteComponentProps } from 'react-router-dom';
+import moment from 'moment';
+
+class CommonSearchForm extends React.Component {
+  constructor(props) {
+    super(props);
+    this.state = {
+      showModal: false,
+    };
+  }
+
+  componentDidMount() {
+    // 回车事件
+    // document.addEventListener('keydown', this.onkeydown);
+  }
+
+  componentWillUnmount() {
+    // window.removeEventListener("keydown", this.onkeydown.bind(this));
+  }
+
+  onkeydown = (e) => {
+    if (e.keyCode === 13) {
+      this.onClick('search');
+    }
+  }
+
+  onClick = type => {
+    const { pathName } = this.props;
+    let data;
+    switch (type) {
+      case 'search':
+        data = { ...this.props.formData, __key: Date.now() };
+        this.props.searchonClick(data);
+        // if (pathName) {
+        //   this.props.history.push(pathName + '?' + Object.entries(data)
+        //     .map(([k, v]) => `${k}=${v}`)
+        //     .join('&'));
+        // }
+        return;
+      case 'reset':
+        data = { __key: Date.now(), page: 1, size: 10 };
+        this.props.searchonClick(data);
+        if (pathName) {
+          this.props.history.push(pathName + '?' + Object.entries(data)
+            .map(([k, v]) => `${k}=${v}`)
+            .join('&'));
+        }
+        return;
+      case 'build':
+        return;
+    }
+  };
+
+  handleInput = ({ target: { name, value } }) => {
+    this.props.setFormData({ ...this.props.formData, [name]: value });
+  };
+
+  handleSelectChange = name => {
+    return value => {
+      this.handleInput({ target: { name, value } });
+    };
+  };
+
+  rangePickerChange = (name, key, m, d) => {
+    if (m.length > 0) {
+      this.props.setFormData({
+        ...this.props.formData,
+        [name]: d.join(','),
+        [JSON.parse(key)[0]]: d[0],
+        [JSON.parse(key)[1]]: d[1],
+      });
+    } else {
+      this.props.setFormData({
+        ...this.props.formData,
+        [name]: undefined,
+        [JSON.parse(key)[0]]: '',
+        [JSON.parse(key)[1]]: '',
+      });
+    }
+  };
+
+  datePickerChange = (name, v) => {
+    this.props.setFormData({
+      ...this.props.formData,
+      [name]: v,
+    });
+  };
+
+
+
+  render() {
+    const { formData, data, children } = this.props;
+console.log(formData)
+console.log(data)
+    return (
+      <div className="common-search-form-main">
+        <Row type="flex" align="middle" gutter={20}>
+          {/* <Row type="flex" align="bottom"> */}
+          {/* <Col span={20}>
+            <Row gutter={20}> */}
+          {data.length > 0 &&
+            data.map(item => (
+              <React.Fragment>
+                {(() => {
+                  switch (item.type) {
+                    case 'select':
+                      return (
+                        <Col span={4}>
+                          <Form.Item label={item.label}>
+                            <Select
+                              style={{ width: '100%' }}
+                              placeholder={item.name}
+                              value={formData[item.key]}
+                              allowClear
+                              onChange={this.handleSelectChange(item.key)}>
+                              {item.list &&
+                                item.list.map(item => (
+                                  <Select.Option
+                                    value={item.id}
+                                    key={item.id}>
+                                    {item.name}
+                                  </Select.Option>
+                                ))}
+                            </Select>
+                          </Form.Item>
+                        </Col>
+                      );
+                    case 'input':
+                      return (
+                        <Col span={4}>
+                          <Form.Item label={item.label}>
+                            <Input
+                              placeholder={item.name}
+                              name={item.key}
+                              value={formData[item.key]}
+                              onChange={this.handleInput}
+                            />
+                          </Form.Item>
+                        </Col>
+                      );
+                    case 'datePicker':
+                      return (
+                        <Col span={4}>
+                          <Form.Item label={item.label}>
+                            <DatePicker
+                              style={{ width: '100%' }}
+                              placeholder={item.name}
+                              onChange={(date, dateString) => {
+                                this.datePickerChange(item.key, dateString);
+                              }}
+                              value={formData[item.key] ? moment(formData[item.key], 'YYYY-MM-DD') : undefined}
+                            />
+                          </Form.Item>
+                        </Col>
+                      );
+                    case 'rangePicker':
+                      return (
+                        <Col span={6}>
+                          <Form.Item label={item.label}>
+                            <RangePicker
+                              ranges={{
+                                Today: [moment(), moment()],
+                                'This Month': [
+                                  moment().startOf('month'),
+                                  moment().endOf('month'),
+                                ],
+                              }}
+                              // defaultValue={[moment(monthStartDate, 'YYYY/MM/DD'), moment(monthEndDate, 'YYYY/MM/DD')]}
+                              value={
+                                item.keylistName &&
+                                  formData[item.keylistName] &&
+                                  typeof formData[item.keylistName] == 'string'
+                                  ? formData[item.keylistName]
+                                    .split(',')
+                                    .map(item => moment(item, 'YYYY-MM-DD'))
+                                  : []
+                              }
+                              onChange={(date, dateString) => {
+                                this.rangePickerChange(
+                                  item.keylistName,
+                                  item.key,
+                                  date,
+                                  dateString
+                                );
+                              }}
+                              placeholder={JSON.parse(item.name)}
+                            />
+                          </Form.Item>
+                        </Col>
+                      );
+                    case 'br':
+                      return (
+                        <Col span={24} style={{ marginBottom: '10px' }} />
+                      );
+                    default:
+                      return null;
+                  }
+                })()}
+              </React.Fragment>
+            ))}
+          {/* </Row> */}
+          {/* </Col> */}
+
+          <Col>
+            <Row type="flex" gutter={20} align="middle" style={{ marginBottom: 5 }}>
+              <Col>
+                <Button
+                  type="primary"
+                  onClick={() => {
+                    this.onClick('search');
+                  }}>
+                  查询
+                </Button>
+              </Col>
+              <Col>
+                <Button
+                  onClick={() => {
+                    this.onClick('reset');
+                  }}>
+                  重置
+                </Button>
+              </Col>
+              {
+                children &&
+                <Col>
+                  {children}
+                </Col>
+              }
+            </Row>
+          </Col>
+        </Row>
+      </div >
+    );
+  }
+}
+
+export default Form.create({
+  onValuesChange: (props, changed, values) => { },
+})(CommonSearchForm);
diff --git a/SunshineIns/src/view/CommonSearchForm/style.scss b/SunshineIns/src/view/CommonSearchForm/style.scss
new file mode 100644
index 0000000..d178d90
--- /dev/null
+++ b/SunshineIns/src/view/CommonSearchForm/style.scss
@@ -0,0 +1,13 @@
+.common-search-form-main {
+  padding: 15px;
+  .ant-form-item {
+    margin-bottom: 0 !important;
+    display: flex;
+  }
+  .ant-form-item-control-wrapper {
+    flex: 1;
+  }
+  // .ant-form-item-label{
+  //   width: 70px !important;
+  // }
+}
diff --git a/SunshineLnsMinApp/app.json b/SunshineLnsMinApp/app.json
index f91f0a0..68d8872 100644
--- a/SunshineLnsMinApp/app.json
+++ b/SunshineLnsMinApp/app.json
@@ -58,6 +58,7 @@
     "pages/publicSnapshot/publicSnapshot",
     "pages/scanEvildoing/scanEvildoing",
     "pages/messageNotification/messageNotification",
+    "pages/myTranslate/myTranslate",
     "pages/scanEvildoingInfo/scanEvildoingInfo",
     "pages/complaintAdvice/complaintAdvice",
     "pages/videoPreview/videoPreview",
diff --git a/SunshineLnsMinApp/pages/activityDetail/activityDetail.js b/SunshineLnsMinApp/pages/activityDetail/activityDetail.js
index b2e3e5d..37c5a5d 100644
--- a/SunshineLnsMinApp/pages/activityDetail/activityDetail.js
+++ b/SunshineLnsMinApp/pages/activityDetail/activityDetail.js
@@ -14,14 +14,16 @@
     flag: true,
     hiddenApply: true,
     // canApply: true,
-    statusWord: ''
-
+    statusWord: '',
+    signStatus: '',
+    id: ""
   },
 
   onLoad: function (options) {
     var that = this;
     that.setData({
       id: options.id,
+      signStatus: options.signStatus || '',
       flag: options.flag
     })
     
@@ -37,42 +39,48 @@
 
           console.log('传过来',options.flag)
           // 处理报名状态
-          if(options.flag == 'true') {
-            //可报名
-            console.log('可报名')
-            if (res.data.data.activityPersonNum < res.data.data.activityPersonQuota) {
-              if (res.data.data.activityStatus == 1) {
-                that.setData({
-                  canApply: true
-                })
+          if (options.signStatus) {
+            that.setData({
+              signStatus: options.signStatus
+            })
+          }else{
+            if(options.flag == 'true') {
+              //可报名
+              console.log('可报名')
+              if (res.data.data.activityPersonNum < res.data.data.activityPersonQuota) {
+                if (res.data.data.activityStatus == 1) {
+                  that.setData({
+                    canApply: true
+                  })
+                }
+                if (res.data.data.activityStatus == 2) {
+                  that.setData({
+                    canApply: false,
+                    statusWord: '活动正在进行'
+                  })
+                }
+                if (res.data.data.activityStatus == 3) {
+                  that.setData({
+                    canApply: false,
+                    statusWord: '活动已结束'
+                  })
+                }
               }
-              if (res.data.data.activityStatus == 2) {
+              else{
                 that.setData({
                   canApply: false,
-                  statusWord: '活动正在进行'
+                  statusWord: '报名人数已满'
                 })
               }
-              if (res.data.data.activityStatus == 3) {
-                that.setData({
-                  canApply: false,
-                  statusWord: '活动已结束'
-                })
-              }
-            }
-            else{
+  
+            }else{
+              //不可报名
+              console.log('不可报名')
               that.setData({
                 canApply: false,
-                statusWord: '报名人数已满'
+                statusWord: '您已报名'
               })
             }
-
-          }else{
-            //不可报名
-            console.log('不可报名')
-            that.setData({
-              canApply: false,
-              statusWord: '您已报名'
-            })
           }
 
         }
@@ -80,6 +88,52 @@
     })
   },
 
+  // 签到
+  sign: function () {
+    var id = this.data.id;
+    var userinfo = wx.getStorageSync("user");
+    var userId = userinfo.id;
+    // 只允许从相机扫码
+    wx.scanCode({
+      onlyFromCamera: true,
+      success(res) {
+        console.log(res)
+        wx.showLoading({
+          title: '识别中',
+        })
+        wx.request({
+          url: app.globalData.url + '/api/activity/sign?id'+id+'&code='+res.result+'&userId='+userId,
+          method: 'GET',
+          header: {
+            "Content-Type": "application/json"
+          },
+          success: function (res) {
+            wx.hideLoading();
+            if (res.data.code == 0) {
+              wx.showToast({
+                title: '签到成功!',
+                icon: 'success',
+                duration: 2000
+              })
+            } else {
+              wx.showToast({
+                title: '报名失败,请稍后重试!',
+                icon: 'none'
+              })
+            }
+          }
+        })
+      }
+    })
+  },
+
+  // 返回
+  goBack: function () {
+    wx.navigateBack({
+      delta: 1
+    });
+  },
+
   apply: function () {
     // wx.navigateTo({
     //   url: '../apply/apply',
diff --git a/SunshineLnsMinApp/pages/activityDetail/activityDetail.wxml b/SunshineLnsMinApp/pages/activityDetail/activityDetail.wxml
index 35e1838..c3fbc98 100644
--- a/SunshineLnsMinApp/pages/activityDetail/activityDetail.wxml
+++ b/SunshineLnsMinApp/pages/activityDetail/activityDetail.wxml
@@ -1,69 +1,82 @@
 <swiper indicator-dots="{{indicatorDots}}" autoplay="{{autoplay}}" interval="{{interval}}" width="100%" height="32vh" duration="{{duration}}">
-  <block wx:for="{{activity.attList}}" wx:key="{{item.attId}}">
-    <swiper-item>
-      <image src="{{item.imgPath}}" class="slide-image" mode="aspectFit"/>
-    </swiper-item>
-  </block>
+	<block wx:for="{{activity.attList}}" wx:key="{{item.attId}}">
+		<swiper-item>
+			<image src="{{item.imgPath}}" class="slide-image" mode="aspectFit" />
+		</swiper-item>
+	</block>
 </swiper>
 
 <view class="activityDetail-main">
-  <view class="headLineTitle">
-    {{activity.activityTitle}}
-  </view>
-  <view class="headLineInfo">
-    {{activity.startTime}}
-    <text decode="{{true}}" space="{{true}}">&nbsp;&nbsp;</text>
-    <view class="info-viewer">{{activity.activityPersonNum}}/{{activity.activityPersonQuota}}人</view>
-  </view>
-  <view class="headLineInfo">
-    {{activity.activityAddress}}
-  </view>
+	<view class="headLineTitle">
+		{{activity.activityTitle}}
+	</view>
+	<view class="headLineInfo">
+		{{activity.startTime}}
+		<text decode="{{true}}" space="{{true}}">&nbsp;&nbsp;</text>
+		<view class="info-viewer">{{activity.activityPersonNum}}/{{activity.activityPersonQuota}}人</view>
+	</view>
+	<view class="headLineInfo">
+		{{activity.activityAddress}}
+	</view>
 
 </view>
 
 <div class="index-gray tel-area">
-  <view>南沙区人民检察院新媒办</view>
-  <image src="{{tel}}" bindtap='call'></image>
+	<view>南沙区人民检察院新媒办</view>
+	<image src="{{tel}}" bindtap='call'></image>
 </div>
 
 <view class="activityDetail-main">
-  <view class="activityDetail-content">
-    {{activity.activityDesc}}
-  </view>
+	<view class="activityDetail-content">
+		{{activity.activityDesc}}
+	</view>
 </view>
 
-<!-- 我要报名窗口 -->
-<block wx:if="{{canApply == true}}">
-  <view class="activityDetail-apply" hidden="{{!hiddenApply}}">
-      <div class="activityDetail-main-buttton" bindtap="apply">我要报名</div>
-  </view>
-</block>
 
-<!-- 不满足条件不可报名的各种情况 -->
-<block wx:if="{{statusWord}}">
-  <view class="activityDetail-apply">
-      <div class="activityDetail-main-buttton">{{statusWord}}</div>
-  </view>
-</block>
+<view wx:if="{{signStatus}}">
+	<div class="submit" bindtap='submit'>提交报名</div>
+	<view wx:if="{{signStatus == 2}}">
+		<view class="submit" bindtap='sign'>签到</view>
+	</view>
+
+	<view wx:else>
+		<view class="submit bg-grey" bindtap='goBack'>返回</view>
+	</view>
+</view>
+<view wx:else>
+	<!-- 我要报名窗口 -->
+	<block wx:if="{{canApply == true}}">
+		<view class="activityDetail-apply" hidden="{{!hiddenApply}}">
+			<div class="activityDetail-main-buttton" bindtap="apply">我要报名</div>
+		</view>
+	</block>
+
+	<!-- 不满足条件不可报名的各种情况 -->
+	<block wx:if="{{statusWord}}">
+		<view class="activityDetail-apply">
+			<div class="activityDetail-main-buttton">{{statusWord}}</div>
+		</view>
+	</block>
+</view>
 
 <view hidden="{{hiddenApply}}">
-  <div class="apply">
-    <div class="apply-message">
-      <span></span>
-      <span>报名信息</span>
-    </div>
+	<div class="apply">
+		<div class="apply-message">
+			<span></span>
+			<span>报名信息</span>
+		</div>
 
-    <div class="apply-list">
-      <div class="apply-list-left">姓名</div>
-      <input data-name="proposerName" bindinput="inputChange" value='{{peopleInfo.proposerName}}' placeholder='请输入姓名'></input>
-    </div>
-    <div class="apply-list">
-      <div class="apply-list-left">电话号码</div>
-      <input data-name="proposerPhone" bindinput="inputChange" value='{{peopleInfo.proposerPhone}}' placeholder='请输入电话号码'></input>
-    </div>
-  </div>
+		<div class="apply-list">
+			<div class="apply-list-left">姓名</div>
+			<input data-name="proposerName" bindinput="inputChange" value='{{peopleInfo.proposerName}}' placeholder='请输入姓名'></input>
+		</div>
+		<div class="apply-list">
+			<div class="apply-list-left">电话号码</div>
+			<input data-name="proposerPhone" bindinput="inputChange" value='{{peopleInfo.proposerPhone}}' placeholder='请输入电话号码'></input>
+		</div>
+	</div>
 
-  <div style="display:flex;justify-content:center;margin:4vh 0">
-    <div class="submit" bindtap='submit'>提交报名</div>
-  </div>
+	<div style="display:flex;justify-content:center;margin:4vh 0">
+		<div class="submit" bindtap='submit'>提交报名</div>
+	</div>
 </view>
\ No newline at end of file
diff --git a/SunshineLnsMinApp/pages/activityDetail/activityDetail.wxss b/SunshineLnsMinApp/pages/activityDetail/activityDetail.wxss
index 0543fc2..93d29b9 100644
--- a/SunshineLnsMinApp/pages/activityDetail/activityDetail.wxss
+++ b/SunshineLnsMinApp/pages/activityDetail/activityDetail.wxss
@@ -59,7 +59,6 @@
 
 .tel-area{
   height: 6vh;
-  margin-top: ;
   padding: 0 2vh;
   font-size: 14px;
   display:flex;
diff --git a/SunshineLnsMinApp/pages/fzpxInfo/fzpxInfo.js b/SunshineLnsMinApp/pages/fzpxInfo/fzpxInfo.js
index 496552f..d63220d 100644
--- a/SunshineLnsMinApp/pages/fzpxInfo/fzpxInfo.js
+++ b/SunshineLnsMinApp/pages/fzpxInfo/fzpxInfo.js
@@ -10,17 +10,22 @@
    */
   data: {
     loading: false,
-    peopleInfo: {}
+    peopleInfo: {},
+    signStatus: '',
+    id: "",
+    topattList:[],
+    bottomattList:[]
   },
 
   /**
    * 生命周期函数--监听页面加载
    */
-  onLoad: function(options) {
+  onLoad: function (options) {
     var that = this;
     that.setData({
       id: options.id,
-      flag: options.flag,
+      signStatus: options.signStatus || '',
+      flag: options.flag || '',
       loading: true
     });
     wx.showLoading({
@@ -28,7 +33,7 @@
     })
     wx.request({
       url: app.globalData.url + '/api/activity/find?id=' + options.id,
-      success: function(res) {
+      success: function (res) {
         console.log(res);
         that.setData({
           loading: false
@@ -37,45 +42,54 @@
         if (res.data.code == 0) {
           res.data.data.startTime = app.formatDate(res.data.data.startTime)
           that.setData({
-            activity: res.data.data
+            activity: res.data.data,
+            bottomattList:res.data.data.attList.filter((item)=>(item.associateType==1020)),
+            topattList:res.data.data.attList.filter((item)=>(item.associateType==1000))
           })
           console.log('传过来', options.flag)
+          console.log('传过来', options.signStatus)
           // 处理报名状态
-          if (options.flag == 'true') {
-            //可报名
-            console.log('可报名')
-            if (res.data.data.activityPersonNum < res.data.data.activityPersonQuota) {
-              if (res.data.data.activityStatus == 1) {
-                that.setData({
-                  canApply: true
-                })
-              }
-              if (res.data.data.activityStatus == 2) {
+          if (options.signStatus) {
+            that.setData({
+              signStatus: options.signStatus
+            })
+          } else {
+            if (options.flag == 'true') {
+              //可报名
+              console.log('可报名')
+              if (res.data.data.activityPersonNum < res.data.data.activityPersonQuota) {
+                if (res.data.data.activityStatus == 1) {
+                  that.setData({
+                    canApply: true
+                  })
+                }
+                if (res.data.data.activityStatus == 2) {
+                  that.setData({
+                    canApply: false,
+                    statusWord: '活动正在进行'
+                  })
+                }
+                if (res.data.data.activityStatus == 3) {
+                  that.setData({
+                    canApply: false,
+                    statusWord: '活动已结束'
+                  })
+                }
+              } else {
                 that.setData({
                   canApply: false,
-                  statusWord: '活动正在进行'
+                  statusWord: '报名人数已满'
                 })
               }
-              if (res.data.data.activityStatus == 3) {
-                that.setData({
-                  canApply: false,
-                  statusWord: '活动已结束'
-                })
-              }
+
             } else {
+              //不可报名
+              console.log('不可报名')
               that.setData({
                 canApply: false,
-                statusWord: '报名人数已满'
+                statusWord: '您已报名'
               })
             }
-
-          } else {
-            //不可报名
-            console.log('不可报名')
-            that.setData({
-              canApply: false,
-              statusWord: '您已报名'
-            })
           }
 
         }
@@ -84,7 +98,7 @@
   },
 
   // 跳转
-  linkFunction: function() {
+  linkFunction: function () {
     wx.showToast({
       title: '抱歉,报名人数已满',
       icon: 'none',
@@ -93,14 +107,14 @@
   },
 
   // 呼叫组织方
-  makePhoneCall: function(e) {
+  makePhoneCall: function (e) {
     var phone = e.currentTarget.dataset['phone'];
     wx.makePhoneCall({
       phoneNumber: phone
     })
   },
 
-  inputChange: function(e) {
+  inputChange: function (e) {
     var name = e.currentTarget.dataset.name;
     this.setData({
       peopleInfo: {
@@ -110,8 +124,54 @@
     })
   },
 
+  // 签到
+  sign: function () {
+    var id = this.data.id;
+    var userinfo = wx.getStorageSync("user");
+    var userId = userinfo.id;
+    // 只允许从相机扫码
+    wx.scanCode({
+      onlyFromCamera: true,
+      success(res) {
+        console.log(res)
+        wx.showLoading({
+          title: '识别中',
+        })
+        wx.request({
+          url: app.globalData.url + '/api/activity/sign?id'+id+'&code='+res.result+'&userId='+userId,
+          method: 'GET',
+          header: {
+            "Content-Type": "application/json"
+          },
+          success: function (res) {
+            wx.hideLoading();
+            if (res.data.code == 0) {
+              wx.showToast({
+                title: '签到成功!',
+                icon: 'success',
+                duration: 2000
+              })
+            } else {
+              wx.showToast({
+                title: '报名失败,请稍后重试!',
+                icon: 'none'
+              })
+            }
+          }
+        })
+      }
+    })
+  },
+
+  // 返回
+  goBack: function () {
+    wx.navigateBack({
+      delta: 1
+    });
+  },
+
   // 提交报名
-  submit: function() {
+  submit: function () {
     var peopleInfo = this.data.peopleInfo;
     var userinfo = wx.getStorageSync("user");
     var personId = userinfo.id;
@@ -149,7 +209,7 @@
       header: {
         "Content-Type": "application/json"
       },
-      success: function(res) {
+      success: function (res) {
         wx.hideLoading();
         if (res.data.code == 0) {
           wx.reLaunch({
diff --git a/SunshineLnsMinApp/pages/fzpxInfo/fzpxInfo.wxml b/SunshineLnsMinApp/pages/fzpxInfo/fzpxInfo.wxml
index b4aee34..83b3115 100644
--- a/SunshineLnsMinApp/pages/fzpxInfo/fzpxInfo.wxml
+++ b/SunshineLnsMinApp/pages/fzpxInfo/fzpxInfo.wxml
@@ -1,83 +1,111 @@
 <!--pages/fzpxInfo/fzpxInfo.wxml-->
 <view class="fzpxInfo-bg" wx:if="{{!loading}}">
-  <view class="flex1">
-    <swiper class="screen-swiper square-dot" indicator-dots="true" circular="true" autoplay="true" interval="5000" duration="500">
-      <swiper-item wx:for="{{activity.attList}}" wx:key>
-        <image src="{{item.imgPath}}" mode="aspectFill"></image>
-        <!-- <video src="{{item.url}}" autoplay loop muted show-play-btn="{{false}}" controls="{{false}}" objectFit="cover" wx:if="{{item.type=='video'}}"></video> -->
-      </swiper-item>
-    </swiper>
+	<view class="flex1">
+		<swiper class="screen-swiper square-dot" indicator-dots="true" circular="true" autoplay="true" interval="5000" duration="500">
+			<swiper-item wx:for="{{topattList}}" wx:key>
+				<image src="{{item.imgPath}}" mode="aspectFill"></image>
+				<!-- <video src="{{item.url}}" autoplay loop muted show-play-btn="{{false}}" controls="{{false}}" objectFit="cover" wx:if="{{item.type=='video'}}"></video> -->
+			</swiper-item>
+		</swiper>
 
-    <view class="fzpxInfo-main">
-      <view class="fzpxInfo-main-t">{{activity.activityTitle}}</view>
-      <view class="fzpxInfo-main-group">
-        <view class="fzpxInfo-main-group-title">培训时间</view>
-        <view class="fzpxInfo-main-group-around">{{activity.startTime}}</view>
-      </view>
-      <view class="fzpxInfo-main-group">
-        <view class="fzpxInfo-main-group-title">报名人数</view>
-        <view class="fzpxInfo-main-group-around">{{activity.activityPersonNum}}/{{activity.activityPersonQuota}}人</view>
-      </view>
-      <view class="fzpxInfo-main-group">
-        <view class="fzpxInfo-main-group-title">培训地点</view>
-        <view class="fzpxInfo-main-group-around">{{activity.activityAddress}}</view>
-      </view>
-      <view class="fzpxInfo-main-group">
-        <view class="fzpxInfo-main-group-title">组织方</view>
-        <view style="display: flex; line-height:48rpx;">
-          <view class="fzpxInfo-main-group-around">{{activity.host || '无'}}</view>
-          <text class="cuIcon-dianhua lg text-blue margin-left" data-phone="{{activity.activityPhone}}" bindtap="makePhoneCall"></text>
-        </view>
-      </view>
-      <view class="fzpxInfo-main-group">
-        <view class="fzpxInfo-main-group-title">培训对象</view>
-        <view class="fzpxInfo-main-group-around">{{activity.requirement}}</view>
-      </view>
-      <view class="fzpxInfo-main-group" style="display:block;padding: 10rpx 30rpx;">
-        <view class="fzpxInfo-main-group-title">培训内容</view>
-        <view>
-          <view class="fzpxInfo-main-group-around">{{activity.activityDesc}}</view>
-        </view>
-      </view>
-    </view>
+		<view class="fzpxInfo-main">
+			<view class="fzpxInfo-main-t">{{activity.activityTitle}}</view>
+			<view class="fzpxInfo-main-group">
+				<view class="fzpxInfo-main-group-title">培训时间</view>
+				<view class="fzpxInfo-main-group-around">{{activity.startTime}}</view>
+			</view>
+			<view class="fzpxInfo-main-group">
+				<view class="fzpxInfo-main-group-title">报名人数</view>
+				<view class="fzpxInfo-main-group-around">{{activity.activityPersonNum}}/{{activity.activityPersonQuota}}人</view>
+			</view>
+			<view class="fzpxInfo-main-group">
+				<view class="fzpxInfo-main-group-title">培训地点</view>
+				<view class="fzpxInfo-main-group-around">{{activity.activityAddress}}</view>
+			</view>
+			<view class="fzpxInfo-main-group">
+				<view class="fzpxInfo-main-group-title">组织方</view>
+				<view style="display: flex; line-height:48rpx;">
+					<view class="fzpxInfo-main-group-around">{{activity.host || '无'}}</view>
+					<text class="cuIcon-dianhua lg text-blue margin-left" data-phone="{{activity.activityPhone}}" bindtap="makePhoneCall"></text>
+				</view>
+			</view>
+			<view class="fzpxInfo-main-group">
+				<view class="fzpxInfo-main-group-title">报名要求</view>
+				<view class="fzpxInfo-main-group-around">{{activity.requirement}}</view>
+			</view>
+			<view class="fzpxInfo-main-group" style="display:block;padding: 10rpx 30rpx;">
+				<view class="fzpxInfo-main-group-title">培训内容</view>
+				<view>
+					<view class="fzpxInfo-main-group-around">{{activity.activityDesc}}</view>
+				</view>
+			</view>
 
-    <block wx:if="{{activity.activityStatus == 1 && flag == 'true'}}">
-      <view class="sub-title">报名信息</view>
-      <form>
-        <view class="cu-form-group">
-          <view class="title">姓名
-            <span style="color: red;">*</span>
-          </view>
-          <input placeholder="请输入姓名" data-name="proposerName" bindinput="inputChange" value='{{peopleInfo.proposerName}}'></input>
-        </view>
-        <view class="cu-form-group">
-          <view class="title">电话号码
-            <span style="color: red;">*</span>
-          </view>
-          <input placeholder="请输入电话号码" data-name="proposerPhone" bindinput="inputChange" value='{{peopleInfo.proposerPhone}}'></input>
-        </view>
-      </form>
-    </block>
+			<view wx:if="{{activity.result}}" class="fzpxInfo-main-group">
+				<view class="fzpxInfo-main-group-title">培训结果</view>
+				<view class="fzpxInfo-main-group-around">{{activity.result}}</view>
+			</view>
 
-  </view>
+			<view wx:if="{{activity.result}}" class="fzpxInfo-main-group">
+				<view class="fzpxInfo-main-group-title">培训材料</view>
+				<view class="fzpxInfo-main-group-around" style="display:flex;flex-wrap: wrap">
+					<view class="educt_hasupload_pic" wx:for="{{bottomattList}}" wx:key="index">
+						<image src="{{item.imgPath}}" class="upload"></image>
+					</view>
+				</view>
+			</view>
+		</view>
 
-  <view class="fzpxInfo-foot margin-top">
-    <!-- <view class="fzpxInfo-foot-title">报名须知</view>
+		<block wx:if="{{activity.activityStatus == 1 && flag == 'true'}}">
+			<view class="sub-title">报名信息</view>
+			<form>
+				<view class="cu-form-group">
+					<view class="title">姓名
+						<span style="color: red;">*</span>
+					</view>
+					<input placeholder="请输入姓名" data-name="proposerName" bindinput="inputChange" value='{{peopleInfo.proposerName}}'></input>
+				</view>
+				<view class="cu-form-group">
+					<view class="title">电话号码
+						<span style="color: red;">*</span>
+					</view>
+					<input placeholder="请输入电话号码" data-name="proposerPhone" bindinput="inputChange" value='{{peopleInfo.proposerPhone}}'></input>
+				</view>
+			</form>
+		</block>
+
+	</view>
+
+	<view class="fzpxInfo-foot margin-top">
+		<view wx:if="{{signStatus}}">
+			<view wx:if="{{signStatus == 2}}">
+				<view class="fzpxInfo-foot-button bg-grey" bindtap='sign'>签到</view>
+			</view>
+
+			<view wx:else>
+				<view class="fzpxInfo-foot-button bg-grey" bindtap='goBack'>返回</view>
+			</view>
+		</view>
+
+		<view wx:else>
+			<!-- <view class="fzpxInfo-foot-title">报名须知</view>
     <view class="fzpxInfo-foot-txt">请确认所有参赛人员的排列顺序。相关信息会在参赛证件、参赛证明、获取证书等重要比赛文件中提现。</view>
     <view class="fzpxInfo-foot-txt">由于参赛队信息填报原因产生的任何错误,在相关文件完成制作后一律不予修改;</view> -->
-    <view wx:if="{{flag == 'false'}}">
-      <view class="fzpxInfo-foot-button bg-grey">您已报名</view>
-    </view>
-    <view wx:if="{{flag == 'true'}}">
+			<view wx:if="{{flag == 'false'}}">
+				<view class="fzpxInfo-foot-button bg-grey">您已报名</view>
+			</view>
+			<view wx:if="{{flag == 'true'}}">
 
-      <view class="fzpxInfo-foot-button bg-blue" wx:if="{{activity.activityStatus == 1}}" bindtap='submit'>我要报名</view>
-      <view class="fzpxInfo-foot-button bg-blue" wx:elif="{{activity.activityStatus == 2}}">活动正在进行</view>
-      <view class="fzpxInfo-foot-button bg-grey" wx:elif="{{activity.activityStatus == 3}}">活动已结束</view>
-      <view class="fzpxInfo-foot-button bg-grey" wx:else>报名人数已满</view>
+				<view class="fzpxInfo-foot-button bg-blue" wx:if="{{activity.activityStatus == 1}}" bindtap='submit'>我要报名</view>
+				<view class="fzpxInfo-foot-button bg-blue" wx:elif="{{activity.activityStatus == 2}}">活动正在进行</view>
+				<view class="fzpxInfo-foot-button bg-grey" wx:elif="{{activity.activityStatus == 3}}">活动已结束</view>
+				<view class="fzpxInfo-foot-button bg-grey" wx:else>报名人数已满</view>
 
-    </view>
-    <view>
+			</view>
+		</view>
 
-    </view>
-  </view>
+
+		<view>
+
+		</view>
+	</view>
 </view>
\ No newline at end of file
diff --git a/SunshineLnsMinApp/pages/fzpxInfo/fzpxInfo.wxss b/SunshineLnsMinApp/pages/fzpxInfo/fzpxInfo.wxss
index d2c6db6..014d402 100644
--- a/SunshineLnsMinApp/pages/fzpxInfo/fzpxInfo.wxss
+++ b/SunshineLnsMinApp/pages/fzpxInfo/fzpxInfo.wxss
@@ -76,6 +76,15 @@
   font-weight: 600;
 }
 
+.upload {
+  width: 48px;
+  height: 48px;
+}
+
+.educt_hasupload_pic {
+  margin: 4px;
+}
+
 .fzpxInfo-foot-txt {
   margin: 6px 6px 24px;
   line-height: 22PX;
diff --git a/SunshineLnsMinApp/pages/me/me.js b/SunshineLnsMinApp/pages/me/me.js
index a5f4278..60e235a 100644
--- a/SunshineLnsMinApp/pages/me/me.js
+++ b/SunshineLnsMinApp/pages/me/me.js
@@ -35,6 +35,12 @@
     })
   },
 
+  myTranslate: function() {
+    wx.navigateTo({
+      url: '../myTranslate/myTranslate',
+    })
+  },
+
   onLoad: function() {
     this.notification();
   },
diff --git a/SunshineLnsMinApp/pages/me/me.wxml b/SunshineLnsMinApp/pages/me/me.wxml
index 3c636c0..a8ddf5a 100644
--- a/SunshineLnsMinApp/pages/me/me.wxml
+++ b/SunshineLnsMinApp/pages/me/me.wxml
@@ -22,6 +22,16 @@
       <image class="me-business-right-icon" src="{{user}}" />
     </div>
 
+    <div class="me-business-nav" bindtap="myTranslate">
+      <image class="me-business-icon" src="{{xxtx}}" />
+      <div class="me-business-title">我的活动</div>
+      <block wx:if="{{notRead > 0}}">
+        <div class="me-business-info">{{notRead}}</div>
+      </block>
+
+      <image class="me-business-right-icon" src="{{user}}" />
+    </div>
+
     <div class="me-business-nav" bindtap="msg">
       <image class="me-business-icon" src="{{xxtx}}" />
       <div class="me-business-title">消息提醒</div>
diff --git a/SunshineLnsMinApp/pages/myTranslate/myTranslate.js b/SunshineLnsMinApp/pages/myTranslate/myTranslate.js
new file mode 100644
index 0000000..d587e72
--- /dev/null
+++ b/SunshineLnsMinApp/pages/myTranslate/myTranslate.js
@@ -0,0 +1,146 @@
+// pages/businessSchedule/businessSchedule.js
+const app = getApp()
+Page({
+
+  /**
+   * 页面的初始数据
+   */
+  data: {
+    loading: app.globalData.imgUrl + '/image/loading.svg',
+    navbar: ['全部', '未开始', '进行中', '已完成'],
+    currentTab: 0,
+    size: 10,
+    size1: 10,
+    size2: 10,
+    size3: 10,
+    content: '------加载中------',
+    hasMoreData: true,
+    createTime: '',
+    dataSet: []
+  },
+
+  navbarTap: function (e) {
+    this.setData({
+      currentTab: e.currentTarget.dataset.idx
+    })
+    this.showList(this.data.currentTab)
+
+  },
+
+  showList: function (tab) {
+    var userinfo = wx.getStorageSync("user");
+    var that = this;
+    var id = userinfo.id
+    var str;
+    var sizeQty;
+    switch (tab) {
+      case 0:
+        str = "&status=";
+        sizeQty = 'size';
+        break;
+      case 1:
+        str = "&status=1";
+        sizeQty = 'size1';
+        break;
+      case 2:
+        str = "&status=2";
+        sizeQty = 'size2';
+        break;
+      case 3:
+        str = "&status=3";
+        sizeQty = 'size3';
+        break;
+    }
+    wx.request({
+      url: app.globalData.url + '/api/activity/myActivities?page=1&size=' + that.data[sizeQty] + '&userId=' + id + str,
+      success: function (res) {
+        if (res.data.code == 0) {
+          (res.data.data.content).forEach(e => {
+            (e.createTime) = app.formatDate(e.createTime)
+            switch (e.activityType) {
+              case 'act_1':
+                e.activityType = '南检活动';
+                break;
+              case 'act_2':
+                e.activityType = '法治培训';
+                break;
+              case 'act_3':
+                e.activityType = '基地参观';
+                break;
+            }
+
+
+          });
+          if (res.data.data.totalElements < that.data[sizeQty]) {
+            that.setData({
+              dataSet: res.data.data.content,
+              hasMoreData: false,
+              content: '------我是有底线的------'
+            })
+          } else {
+            that.setData({
+              dataSet: res.data.data.content,
+              hasMoreData: true,
+              content: '------加载更多------',
+              [sizeQty]: that.data[sizeQty] + 10
+            })
+          }
+        } else {
+          wx.showModal({
+            title: '提示',
+            content: "请求失败!"
+          })
+        }
+      }
+    })
+  },
+
+  businessSchedule: function (event) {
+    var id = event.currentTarget.id;
+    var activityType = this.data.dataSet[id].activityType;
+    var signStatus = this.data.dataSet[id].signStatus;
+    var id = this.data.dataSet[id].id;
+
+    console.log(activityType)
+    console.log(signStatus);
+    if (activityType == "法治培训") {
+      wx.navigateTo({
+        url: '../fzpxInfo/fzpxInfo?id=' + id + '&signStatus=' + signStatus,
+      })
+    } else if (activityType == "南检活动") {
+      wx.navigateTo({
+        url: '../activityDetail/activityDetail?id=' + id + '&signStatus=' + signStatus,
+      })
+    } else if (activityType == "基地参观") {
+      wx.navigateTo({
+        url: '../complaintAdvice/complaintAdvice?id=' + businessId,
+      })
+    } else {
+      wx.showModal({
+        title: '提示',
+        content: "文件错误!"
+      })
+    }
+  },
+
+  onLoad: function () {
+    this.showList(0)
+  },
+
+  /**
+   * 页面上拉触底事件的处理函数
+   */
+  onReachBottom: function () {
+    if (this.data.hasMoreData) {
+      this.showList(this.data.currentTab)
+      this.setData({
+        content: '------加载更多------'
+      })
+    } else {
+      this.setData({
+        content: '------我是有底线的------'
+      })
+    }
+  },
+
+})
\ No newline at end of file
diff --git a/SunshineLnsMinApp/pages/myTranslate/myTranslate.json b/SunshineLnsMinApp/pages/myTranslate/myTranslate.json
new file mode 100644
index 0000000..5a26128
--- /dev/null
+++ b/SunshineLnsMinApp/pages/myTranslate/myTranslate.json
@@ -0,0 +1,6 @@
+{
+  "navigationBarTitleText": "我的活动",
+  "backgroundTextStyle": "light",
+  "navigationBarBackgroundColor": "#fff",
+  "navigationBarTextStyle": "black"
+}
\ No newline at end of file
diff --git a/SunshineLnsMinApp/pages/myTranslate/myTranslate.wxml b/SunshineLnsMinApp/pages/myTranslate/myTranslate.wxml
new file mode 100644
index 0000000..db24d31
--- /dev/null
+++ b/SunshineLnsMinApp/pages/myTranslate/myTranslate.wxml
@@ -0,0 +1,26 @@
+<!--pages/myTranslate/myTranslate.wxml-->
+<!--导航条-->
+<view class="navbar">
+  <text wx:for="{{navbar}}" data-idx="{{index}}" class="item {{currentTab==index ? 'active' : ''}}" wx:key="unique" bindtap="navbarTap">{{item}}</text>
+</view>
+
+<!--列表数据-->
+<view style='flex-direction:column;height:94vh;background-color:rgba(80, 119, 170, 0.06)'>
+  <div class="businessSchedule" bindtap='businessSchedule' id="{{key}}" wx:for="{{dataSet}}" wx:for-index='key' wx:key="*this">
+    <div class="businessSchedule-top">
+      <div class="businessSchedule-top-img">
+        <image src="{{item.iconSrc}}" class="businessSchedule-top-img"></image>
+      </div>
+      <div class="businessSchedule-top-title">{{item.activityType}}</div>
+      <div class="businessSchedule-top-status backgroundorange-title" wx:if="{{item.signStatus==1}}">未审核</div>
+      <div class="businessSchedule-top-status backgroundorange-title" wx:if="{{item.signStatus==2}}">未签到</div>
+      <div class="businessSchedule-top-status backgroundorange-title" wx:if="{{item.signStatus==3}}">已签到</div>
+      <div class="businessSchedule-top-status backgroundorange-title" wx:if="{{item.signStatus==4}}">不通过</div>
+      <div class="businessSchedule-top-status backgroundgreen-title" wx:if="{{item.signStatus==99}}">取消</div>
+    </div>
+    <div class="businessSchedule-center">{{item.activityDese}}</div>
+    <div class="businessSchedule-bottom">于 {{item.createTime}} 提交申请</div>
+  </div>
+  <div class="businessSchedule-load">------{{content}}------</div>
+</view>
+
diff --git a/SunshineLnsMinApp/pages/myTranslate/myTranslate.wxss b/SunshineLnsMinApp/pages/myTranslate/myTranslate.wxss
new file mode 100644
index 0000000..e0e3e0f
--- /dev/null
+++ b/SunshineLnsMinApp/pages/myTranslate/myTranslate.wxss
@@ -0,0 +1,111 @@
+/* pages/myTranslate/myTranslate.wxss */
+view {
+  display: flex;
+}
+
+.navbar {
+  flex: none;
+  display: flex;
+  background: #fff;
+  font-size: 18px;
+  color: #999;
+  height: 6vh;
+}
+
+.navbar .item {
+  position: relative;
+  flex: auto;
+  text-align: center;
+  line-height: 80rpx;
+}
+
+.navbar .item.active {
+  color: #2195ff;
+}
+
+.navbar .item.active:after {
+  content: "";
+  display: block;
+  position: absolute;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  height: 4rpx;
+  background: #2195ff;
+}
+
+.businessSchedule {
+  font-size: 16px;
+  padding: 2vh;
+  margin: 2vh;
+  background-color: #fff;
+  box-shadow: 0px 6px 6px 0 rgba(80, 119, 170, 0.06);
+}
+
+.businessSchedule-top {
+  display: flex;
+  color: #333;
+  align-items: center;
+  padding-bottom: 1vh;
+  border-bottom: 1px solid #f2f2f2;
+}
+
+.businessSchedule-top-img {
+  width: 3vh;
+  height: 3vh;
+}
+
+.businessSchedule-top-title {
+  padding-left: 1vh;
+}
+
+.businessSchedule-top-status {
+  margin-left: auto;
+  display: flex;
+  justify-content: center;
+  box-shadow: 0px 4px 8px 0px rgba(136, 136, 136, 0.11);
+  padding: 1vh;
+  border-radius: 18px;
+  color: #fff;
+}
+
+.businessSchedule-center {
+  font-size: 14px;
+  display: flex;
+  padding: 1vh 0;
+  color: #333;
+}
+
+.businessSchedule-bottom {
+  display: flex;
+  font-size: 14px;
+  color: #999;
+}
+
+.loading {
+  padding: 10rpx;
+  text-align: center;
+}
+
+.loading:before {
+  display: inline-block;
+  margin-right: 5rpx;
+  vertical-align: middle;
+  content: '';
+  width: 40rpx;
+  height: 40rpx;
+  background-size: contain;
+  animation: rotate 1s linear infinite;
+}
+
+.loading.complete:before {
+  display: none;
+}
+
+.businessSchedule-load {
+  display: flex;
+  justify-content: center;
+  color: #999;
+  font-size: 14px;
+  margin-bottom: 4vh;
+}

--
Gitblit v1.8.0