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}}"> </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}}"> </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