From 93fc1e3e4435d4052226fbb9f3a4718b20efbfd5 Mon Sep 17 00:00:00 2001 From: jl-zhoujl2 Date: Tue, 5 Jul 2022 21:57:38 +0800 Subject: [PATCH 01/10] 7.5 wangeditor --- config/router.config.ts | 7 +++- src/components/richText/wang/index.tsx | 2 +- .../ProjectManager/components/WangEditor.tsx | 35 +++++++++++++++++++ 3 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 src/pages/MainPage/ProjectManager/components/WangEditor.tsx diff --git a/config/router.config.ts b/config/router.config.ts index c4de15a..a814f7f 100644 --- a/config/router.config.ts +++ b/config/router.config.ts @@ -36,6 +36,11 @@ export default [ path: '/Calendar', component: './MainPage/ProjectManager/components/CalendarForm', }, + //富文本组件 + { + path: '/editor', + component: './MainPage/ProjectManager/components/WangEditor', + }, //401错误页 { exact: true, @@ -243,7 +248,7 @@ export default [ path: '/Supervision', component: './Project/ProjectManage/Supervision' }, - {//审查人员 项目管理页 + {//审查人员 项目管理页 name: 'Examination', path: '/Examination', component: './Project/ProjectManage/Examination' diff --git a/src/components/richText/wang/index.tsx b/src/components/richText/wang/index.tsx index e1151f8..14dd2eb 100644 --- a/src/components/richText/wang/index.tsx +++ b/src/components/richText/wang/index.tsx @@ -46,7 +46,7 @@ const BraftText: React.FC = (props) => { 'fullscreen', //全屏 // 'emoticon',//表情 - // 'image',//图片 + 'image',//图片 // 'video',//视频 // 'table',//表格 // 'todo',//待办 diff --git a/src/pages/MainPage/ProjectManager/components/WangEditor.tsx b/src/pages/MainPage/ProjectManager/components/WangEditor.tsx new file mode 100644 index 0000000..f6fe537 --- /dev/null +++ b/src/pages/MainPage/ProjectManager/components/WangEditor.tsx @@ -0,0 +1,35 @@ +import React, { useRef, useState } from 'react'; +import { Button, Typography } from 'antd'; +import BraftText from '@/components/richText/wang'; +import ProCard from '@ant-design/pro-card'; +import { isEmpty } from '@/utils/CommonUtils'; + +const Editor: React.FC<{}> = () => { + const braftRef = useRef(null); + const [text, setText] = useState(); + const { Text, Paragraph } = Typography; + return ( + + setText(braftRef.current?.getHtml())}>生成}> + + + + {isEmpty(text) ? '没有' : ( + +
+                            
+                                {text}
+                            
+                        
+
+ )} +
+
+ ); +}; + +export default Editor; From 20f092d6b132dc65d21a72ffab03adb54c9d1659 Mon Sep 17 00:00:00 2001 From: jl-zhoujl2 Date: Tue, 12 Jul 2022 15:10:29 +0800 Subject: [PATCH 02/10] 7.12 --- config/router.config.ts | 6 +- config/router_partyManagement.ts | 23 +++ .../components/EventMaintenanceModal.tsx | 101 ++++++++++++ .../Management/EventMaintenance/index.tsx | 151 ++++++++++++++++++ .../Management/EventMaintenance/service.tsx | 0 .../Management/OpinionCollection/index.tsx | 133 +++++++++++++++ .../Management/OpinionCollection/service.tsx | 0 .../Management/ProLineMaintenance/index.tsx | 51 ++++++ .../Management/ProLineMaintenance/service.tsx | 0 9 files changed, 463 insertions(+), 2 deletions(-) create mode 100644 config/router_partyManagement.ts create mode 100644 src/pages/PartyMemberTopic/Management/EventMaintenance/components/EventMaintenanceModal.tsx create mode 100644 src/pages/PartyMemberTopic/Management/EventMaintenance/index.tsx create mode 100644 src/pages/PartyMemberTopic/Management/EventMaintenance/service.tsx create mode 100644 src/pages/PartyMemberTopic/Management/OpinionCollection/index.tsx create mode 100644 src/pages/PartyMemberTopic/Management/OpinionCollection/service.tsx create mode 100644 src/pages/PartyMemberTopic/Management/ProLineMaintenance/index.tsx create mode 100644 src/pages/PartyMemberTopic/Management/ProLineMaintenance/service.tsx diff --git a/config/router.config.ts b/config/router.config.ts index c4de15a..6c0be07 100644 --- a/config/router.config.ts +++ b/config/router.config.ts @@ -4,12 +4,13 @@ import home from './HomePage/router_home'; import juryRoom from './JuryRoom/router_menuJury.config'; import approvalForm from './router_approval_form'; import partyMemberTopic from './router_partyMemberTopic'; +import partyManagement from './router_partyManagement'; export default [ //========================================================================登陆 ...transfer,//跳转、登陆 //审批单 ...approvalForm, - //党员专题 + //党建攻坚 ...partyMemberTopic, { path: '/userformal', @@ -106,6 +107,7 @@ export default [ }, ...home,//各角色主页 ...menuaZhaoBiao,//项目菜单所有路由 + ...partyManagement,//党建攻坚管理端 {//问卷调查 name: 'Questionnaire', icon: 'UnorderedListOutlined', @@ -243,7 +245,7 @@ export default [ path: '/Supervision', component: './Project/ProjectManage/Supervision' }, - {//审查人员 项目管理页 + {//审查人员 项目管理页 name: 'Examination', path: '/Examination', component: './Project/ProjectManage/Examination' diff --git a/config/router_partyManagement.ts b/config/router_partyManagement.ts new file mode 100644 index 0000000..9d864f6 --- /dev/null +++ b/config/router_partyManagement.ts @@ -0,0 +1,23 @@ +export default [ + { + name: 'partyMemberTopicManage', + path: '/partyMemberTopicManage', + routes: [ + {//活动维护 + name: 'EventMaintenance', + path: '/partyMemberTopicManage/EventMaintenance', + component: './PartyMemberTopic/Management/EventMaintenance', + }, + { //意见收集管理 + name: 'OpinionCollection', + path: '/partyMemberTopicManage/OpinionCollection', + component: './PartyMemberTopic/Management/OpinionCollection', + }, + { //物资采购专业线数据维护 + name: 'ProLineMaintenance', + path: '/partyMemberTopicManage/ProLineMaintenance', + component: './PartyMemberTopic/Management/ProLineMaintenance', + }, + ] + } +]; \ No newline at end of file diff --git a/src/pages/PartyMemberTopic/Management/EventMaintenance/components/EventMaintenanceModal.tsx b/src/pages/PartyMemberTopic/Management/EventMaintenance/components/EventMaintenanceModal.tsx new file mode 100644 index 0000000..2c59719 --- /dev/null +++ b/src/pages/PartyMemberTopic/Management/EventMaintenance/components/EventMaintenanceModal.tsx @@ -0,0 +1,101 @@ +import React, { useRef } from 'react'; +import { Modal, Card, Col, Form, Input, Row, Space, Typography, Select } from 'antd'; +import BraftText from '@/components/richText/wang'; +import ExtendUpload from '@/utils/ExtendUpload'; + +const layout = { + labelCol: { span: 3 }, + wrapperCol: { span: 21 }, +}; + +const validateMessages = { + required: '请填写此项', +}; + +const modalHeight = window.innerHeight * 96 / 100; + +interface EventMaintenanceModalProps { + modalVisible: boolean; + onCancel: () => void; +} + +const EventMaintenanceModal: React.FC = (props) => { + const { modalVisible, onCancel } = props; + const [form] = Form.useForm(); + const { Option } = Select; + const braftRef = useRef(null); + const onFinish = (values: any) => { + console.log(values); + }; + + return ( + onCancel()} + okText="保存" + maskClosable={false} + style={{ maxHeight: modalHeight }} + bodyStyle={{ maxHeight: modalHeight - 108, overflowY: 'auto', }} + centered + cancelText="返回" + width={'70%'} + > +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ ); +}; + +export default EventMaintenanceModal; diff --git a/src/pages/PartyMemberTopic/Management/EventMaintenance/index.tsx b/src/pages/PartyMemberTopic/Management/EventMaintenance/index.tsx new file mode 100644 index 0000000..e018c6a --- /dev/null +++ b/src/pages/PartyMemberTopic/Management/EventMaintenance/index.tsx @@ -0,0 +1,151 @@ +import { PlusOutlined } from '@ant-design/icons'; +import { ActionType, ProColumns } from '@ant-design/pro-table'; +import ProTable from '@ant-design/pro-table'; +import { Button, Card } from 'antd'; +import React, { useState } from 'react'; +import { useRef } from 'react'; +import EventMaintenanceModal from './components/EventMaintenanceModal'; + +const data = [ + { + id: 1, + index: 1, + title: 1, + type: 0, + }, + { + id: 2, + index: 2, + title: 2, + type: 1, + }, + { + id: 3, + index: 3, + title: 3, + type: 2, + }, + { + id: 4, + index: 4, + title: 4, + type: 2, + }, +] + +const columns: ProColumns[] = [ + { + title: '序号', + dataIndex: 'index', + valueType: 'index', + width: 48, + }, + { + title: '标题名称', + dataIndex: 'title', + ellipsis: true, + }, + { + title: '类型', + dataIndex: 'type', + valueType: 'select', + valueEnum: { + 0: { text: '首页' }, + 1: { text: '活动风采' }, + 2: { text: '攻坚克难项目' }, + }, + }, + { + title: '发布时间', + key: 'showTime', + dataIndex: 'created_at', + valueType: 'dateTime', + hideInSearch: true, + }, + { + title: '状态', + dataIndex: 'state', + valueType: 'select', + valueEnum: { + 0: { text: '草稿' }, + 1: { text: '发布' }, + }, + }, + { + title: '开始时间', + dataIndex: 'starttime', + valueType: 'date', + hideInTable: true, + }, + { + title: '结束时间', + dataIndex: 'endtime', + valueType: 'date', + hideInTable: true, + }, + { + title: '发布人', + dataIndex: 'people', + hideInSearch: true, + }, + { + title: '操作', + hideInSearch: true, + render: (text, record, _, action) => [ + , + , + + , + , + , + ], + }, +]; + +export default () => { + const actionRef = useRef(); + const [modalVisible, setModalVisible] = useState(false); + return ( + + + columns={columns} + actionRef={actionRef} + request={async (params) => { + return { + data: data, + success: true, + }; + }} + rowKey="id" + options={false} + pagination={{ + pageSize: 10, + onChange: (page) => console.log(page), + }} + search={{ + defaultCollapsed: false,//默认展开 + }} + dateFormatter="string" + toolBarRender={() => [ + + ]} + /> + setModalVisible(false)} /> + + ); +}; \ No newline at end of file diff --git a/src/pages/PartyMemberTopic/Management/EventMaintenance/service.tsx b/src/pages/PartyMemberTopic/Management/EventMaintenance/service.tsx new file mode 100644 index 0000000..e69de29 diff --git a/src/pages/PartyMemberTopic/Management/OpinionCollection/index.tsx b/src/pages/PartyMemberTopic/Management/OpinionCollection/index.tsx new file mode 100644 index 0000000..fe46049 --- /dev/null +++ b/src/pages/PartyMemberTopic/Management/OpinionCollection/index.tsx @@ -0,0 +1,133 @@ +import { UploadOutlined } from '@ant-design/icons'; +import { ActionType, ProColumns } from '@ant-design/pro-table'; +import ProTable from '@ant-design/pro-table'; +import { Button, Card } from 'antd'; +import React from 'react'; +import { useRef } from 'react'; + +const data = [ + { + id: 1, + index: 1, + title: 1, + type: 0, + }, + { + id: 2, + index: 2, + title: 2, + type: 1, + }, + { + id: 3, + index: 3, + title: 3, + type: 2, + }, + { + id: 4, + index: 4, + title: 4, + type: 2, + }, +] + +const columns: ProColumns[] = [ + { + title: '序号', + dataIndex: 'index', + valueType: 'index', + width: 48, + }, + { + title: '意见类型', + dataIndex: 'type', + valueType: 'select', + valueEnum: { + 0: { text: '网络运营' }, + 1: { text: '综合行政' }, + 2: { text: '市场' }, + }, + }, + + { + title: '意见内容', + dataIndex: 'title', + ellipsis: true, + hideInSearch: true, + }, + { + title: '补充信息', + dataIndex: 'other', + ellipsis: true, + hideInSearch: true, + }, + { + title: '提交时间', + key: 'showTime', + dataIndex: 'created_at', + valueType: 'dateTime', + hideInSearch: true, + }, + { + title: '开始时间', + dataIndex: 'starttime', + valueType: 'date', + hideInTable: true, + }, + { + title: '结束时间', + dataIndex: 'endtime', + valueType: 'date', + hideInTable: true, + }, + { + title: '提交人员', + dataIndex: 'people', + hideInSearch: true, + }, + { + title: '附件管理', + hideInSearch: true, + render: (text, record, _, action) => [ + , + ], + }, +]; + +export default () => { + const actionRef = useRef(); + return ( + + + columns={columns} + actionRef={actionRef} + request={async (params) => { + return { + data: data, + success: true, + }; + }} + rowKey="id" + options={false} + pagination={{ + pageSize: 10, + onChange: (page) => console.log(page), + }} + search={{ + span: 6, + defaultCollapsed: false,//默认展开 + }} + rowSelection={{}} + dateFormatter="string" + toolBarRender={() => [ + + ]} + /> + + ); +}; \ No newline at end of file diff --git a/src/pages/PartyMemberTopic/Management/OpinionCollection/service.tsx b/src/pages/PartyMemberTopic/Management/OpinionCollection/service.tsx new file mode 100644 index 0000000..e69de29 diff --git a/src/pages/PartyMemberTopic/Management/ProLineMaintenance/index.tsx b/src/pages/PartyMemberTopic/Management/ProLineMaintenance/index.tsx new file mode 100644 index 0000000..9c8d8fb --- /dev/null +++ b/src/pages/PartyMemberTopic/Management/ProLineMaintenance/index.tsx @@ -0,0 +1,51 @@ + +import { Button, Card, Col, Form, Input, Row, Space, Typography } from 'antd'; +import React from 'react'; + +const layout = { + labelCol: { span: 6 }, + wrapperCol: { span: 15 }, +}; +const validateMessages = { + required: '请填写此项', +}; + +export default () => { + const { Title } = Typography; + const onFinish = (values: any) => { + console.log(values); + }; + return ( + + + + + + 党建攻坚活动情况 +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ ); +}; \ No newline at end of file diff --git a/src/pages/PartyMemberTopic/Management/ProLineMaintenance/service.tsx b/src/pages/PartyMemberTopic/Management/ProLineMaintenance/service.tsx new file mode 100644 index 0000000..e69de29 From 26b7130352b8b5338f0dd2a0648b8c7713bd41e5 Mon Sep 17 00:00:00 2001 From: jl-zhoujl2 Date: Tue, 12 Jul 2022 16:37:11 +0800 Subject: [PATCH 03/10] =?UTF-8?q?7.11=20=E5=AF=8C=E6=96=87=E6=9C=AC?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=9C=AC=E5=9C=B0=E5=9B=BE=E7=89=87=E4=B8=8A?= =?UTF-8?q?=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/richText/wang/index.tsx | 105 ++++++++++++++++-- .../ProjectManager/components/WangEditor.tsx | 6 +- 2 files changed, 97 insertions(+), 14 deletions(-) diff --git a/src/components/richText/wang/index.tsx b/src/components/richText/wang/index.tsx index 14dd2eb..ee1ef7f 100644 --- a/src/components/richText/wang/index.tsx +++ b/src/components/richText/wang/index.tsx @@ -1,7 +1,8 @@ import React, { useEffect, useImperativeHandle, useState } from 'react'; import AlertMenu from './fullScreen' import E from 'wangeditor'; -import { Button } from 'antd'; +import { Button, message, Spin } from 'antd'; +import { pictureDisplayPath, uploadAttachmentPath } from '@/utils/DownloadUtils'; interface WangType { braftRef: any;//挂载 @@ -21,6 +22,8 @@ const BraftText: React.FC = (props) => { //======================================================================================state const [content, setContent] = useState(''); const [fullScreen, fullScreenSet] = useState(false); + //遮罩 + const [loading, setLoading] = useState(false); const { braftRef, echo, @@ -33,7 +36,7 @@ const BraftText: React.FC = (props) => { const tools = [//工具栏 'head',//标题 'fontSize', //字号 - 'lineHeight', //行高 + // 'lineHeight', //行高 'foreColor', //颜色 'bold', //加粗 'italic', //斜体 @@ -41,12 +44,13 @@ const BraftText: React.FC = (props) => { 'strikeThrough', //文字删除线 'indent', //缩进 'justify', //文字对齐方式 + 'list', //列表 + 'image',//图片 'undo', //撤销 - 'redo', //重做 + 'redo', //恢复 'fullscreen', //全屏 // 'emoticon',//表情 - 'image',//图片 // 'video',//视频 // 'table',//表格 // 'todo',//待办 @@ -56,12 +60,12 @@ const BraftText: React.FC = (props) => { useEffect(() => { if (willCreate) { // 注:class写法需要在componentDidMount 创建编辑器 - editor = new E("#div1") + editor = new E("#div1"); //工具栏 editor.config.menus = tools; //提示 - editor.config.placeholder = '为了能顺利发布,建议您内容去掉下划线等格式,尽量以纯文本形式发布。' + editor.config.placeholder = '为了能顺利发布,建议您内容去掉下划线等格式,尽量以纯文本形式发布。'; // 配置 onchange 回调函数 editor.config.onchange = editorOnChange; // 注册菜单 @@ -73,6 +77,85 @@ const BraftText: React.FC = (props) => { // 设置编辑区域高度为 500px height && (editor.config.height = height); + //关闭网络上传图片 + editor.config.showLinkImg = false; + // 关闭粘贴内容中的样式 + editor.config.pasteFilterStyle = false; + // 忽略粘贴内容中的图片 + editor.config.pasteIgnoreImg = true; + // 上传图片到服务器,对应的是controller层的@RequestMapping("/upload") + editor.config.uploadImgServer = uploadAttachmentPath;//接口名称 + //自定义name,接收的时候图片文件的那么用这个,对应的是参数中的MultipartFile upimg名称,这个名称即上传到浏览器的参数名称 + editor.config.uploadFileName = "multipartFiles";//这个需要和后台商量上传图片的名称 + //设置请求体额外参数 + editor.config.uploadImgParams = { + appCode: 'ebtp-cloud-frontend', + objectId: '1546325338156965888', + }; + // 将 timeout 时间改为 60s + editor.config.uploadImgTimeout = 60000; + // 将图片大小限制为 500k + editor.config.uploadImgMaxSize = 500 * 1024; + // 限制一次最多上传 1 张图片 + editor.config.uploadImgMaxLength = 1; + //上传图片的错误提示默认使用alert弹出,也可以自定义用户体验更好的提示方式 + editor.config.customAlert = function (info: string) { + const repinfo = info.replace(/0.48828125M/g, '500K'); + // info 是需要提示的内容 + message.error(repinfo); + }; + // 上传图片的结果反馈 + editor.config.uploadImgHooks = { + before: function (xhr: any, editor: any, files: any) { + console.log('before xhr', xhr); + console.log('before files', files); + setLoading(true); + // 图片上传之前触发 + // xhr 是 XMLHttpRequst 对象,editor 是编辑器对象,files 是选择的图片文件 + // 如果返回的结果是 {prevent: true, msg: 'xxxx'} 则表示用户放弃上传 + // return { + // prevent: true, + // msg: '放弃上传' + // } + // console.log("before:",xhr) + }, + success: function (xhr: any, editor: any, result: any) { + // 图片上传并返回结果,图片插入成功之后触发 + // xhr 是 XMLHttpRequst 对象,editor 是编辑器对象,result 是服务器端返回的结果 + // console.log("success:",result) + }, + fail: function (xhr: any, editor: any, result: any) { + // 图片上传并返回结果,但图片插入错误时触发 + // xhr 是 XMLHttpRequst 对象,editor 是编辑器对象,result 是服务器端返回的结果 + }, + error: function (xhr: any, editor: any) { + // 图片上传出错时触发 + // xhr 是 XMLHttpRequst 对象,editor 是编辑器对象 + }, + // 上传图片超时 + timeout: function (xhr: any) { + message.error('服务器超时!'); + setLoading(false); + }, + // 如果服务器端返回的不是 {errno:0, data: [...]} 这种格式,可使用该配置 + // (但是,服务器端返回的必须是一个 JSON 格式字符串!!!否则会报错) + customInsert: function (insertImg: (arg0: any) => void, result: any, editor: any) { + // 图片上传并返回结果,自定义插入图片的事件(而不是编辑器自动插入图片!!!) + // insertImg 是插入图片的函数,参数editor 是编辑器对象,result 是服务器端返回的结果 + // 举例:假如上传图片成功后,服务器端返回的是 {url:'....'} 这种格式,即可这样插入图片: + console.log('customInsert result', result) + if (result?.success) { + const url = pictureDisplayPath + '?filePath=' + result.data[0].sysStorageVO.filePath; + insertImg(url); + } else { + message.error('图片上传失败!'); + } + setLoading(false); + // var url = result.result.remote_path; + // insertImg(url); + // result 必须是一个 JSON 格式字符串!!!否则报错 + } + }; /**一定要创建 */ editor.create(); @@ -132,11 +215,11 @@ const BraftText: React.FC = (props) => { onChange?.(newHtml); }; return ( -
- {/* - */} -
-
+ +
+
+
+
) } export default BraftText \ No newline at end of file diff --git a/src/pages/MainPage/ProjectManager/components/WangEditor.tsx b/src/pages/MainPage/ProjectManager/components/WangEditor.tsx index f6fe537..41e7579 100644 --- a/src/pages/MainPage/ProjectManager/components/WangEditor.tsx +++ b/src/pages/MainPage/ProjectManager/components/WangEditor.tsx @@ -14,10 +14,10 @@ const Editor: React.FC<{}> = () => { bordered headerBordered > - setText(braftRef.current?.getHtml())}>生成}> - + + setText(value)} /> - + {isEmpty(text) ? '没有' : (

From 8276d04729fddcd81dd6a93a00b0db60b4ec245c Mon Sep 17 00:00:00 2001
From: jl-zhoujl2 
Date: Wed, 13 Jul 2022 10:04:01 +0800
Subject: [PATCH 04/10] =?UTF-8?q?7.13=20=E5=AF=8C=E6=96=87=E6=9C=AC?=
 =?UTF-8?q?=E6=94=B9=E9=80=A0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/components/richText/wang/index.tsx        | 63 ++++++++++++++-----
 .../ProjectManager/components/WangEditor.tsx  | 10 ++-
 2 files changed, 57 insertions(+), 16 deletions(-)

diff --git a/src/components/richText/wang/index.tsx b/src/components/richText/wang/index.tsx
index ee1ef7f..e0efd6c 100644
--- a/src/components/richText/wang/index.tsx
+++ b/src/components/richText/wang/index.tsx
@@ -1,8 +1,10 @@
-import React, { useEffect, useImperativeHandle, useState } from 'react';
+import React, { useEffect, useImperativeHandle, useRef, useState } from 'react';
 import AlertMenu from './fullScreen'
 import E from 'wangeditor';
 import { Button, message, Spin } from 'antd';
 import { pictureDisplayPath, uploadAttachmentPath } from '@/utils/DownloadUtils';
+import { isEmpty } from '@/utils/CommonUtils';
+import { createNewFileBid } from '@/services/download_';
 
 interface WangType {
   braftRef: any;//挂载
@@ -10,7 +12,9 @@ interface WangType {
   echo?: any;//回显内容
   value?: any;
   height?: number;
-  onChange?: (value: any) => void
+  onChange?: (value: any) => void;
+  useImage?: boolean;//使用图片上传
+  imageId?: string;//图片objectId
 }
 let editor: any = null;
 
@@ -24,6 +28,8 @@ const BraftText: React.FC = (props) => {
   const [fullScreen, fullScreenSet] = useState(false);
   //遮罩
   const [loading, setLoading] = useState(false);
+  //imageId
+  const objectId = useRef(null);
   const {
     braftRef,
     echo,
@@ -31,6 +37,8 @@ const BraftText: React.FC = (props) => {
     value,
     height,
     onChange,
+    useImage,
+    imageId,
   } = props;
 
   const tools = [//工具栏
@@ -45,11 +53,11 @@ const BraftText: React.FC = (props) => {
     'indent', //缩进
     'justify', //文字对齐方式
     'list', //列表
-    'image',//图片
     'undo', //撤销
     'redo', //恢复
     'fullscreen', //全屏
 
+    // 'image',//图片
     // 'emoticon',//表情
     // 'video',//视频
     // 'table',//表格
@@ -62,6 +70,8 @@ const BraftText: React.FC = (props) => {
       // 注:class写法需要在componentDidMount 创建编辑器
       editor = new E("#div1");
 
+      //添加图片上传
+      useImage && tools.splice(-3, 0, 'image');
       //工具栏
       editor.config.menus = tools;
       //提示
@@ -88,28 +98,38 @@ const BraftText: React.FC = (props) => {
       //自定义name,接收的时候图片文件的那么用这个,对应的是参数中的MultipartFile upimg名称,这个名称即上传到浏览器的参数名称
       editor.config.uploadFileName = "multipartFiles";//这个需要和后台商量上传图片的名称
       //设置请求体额外参数
-      editor.config.uploadImgParams = {
-        appCode: 'ebtp-cloud-frontend',
-        objectId: '1546325338156965888',
-      };
+      if (useImage) {
+        if (isEmpty(imageId)) {
+          createNewFileBid().then(res => {//获取雪花id
+            editor.config.uploadImgParams = {
+              appCode: 'ebtp-cloud-frontend',
+              objectId: res?.id,
+            };
+            objectId.current = res?.id;
+          })
+        } else {
+          editor.config.uploadImgParams = {
+            appCode: 'ebtp-cloud-frontend',
+            objectId: imageId,
+          };
+          objectId.current = imageId;
+        }
+      }
       // 将 timeout 时间改为 60s
       editor.config.uploadImgTimeout = 60000;
-      // 将图片大小限制为 500k
-      editor.config.uploadImgMaxSize = 500 * 1024;
+      // 将图片大小限制为 600k
+      editor.config.uploadImgMaxSize = 600 * 1024;
       // 限制一次最多上传 1 张图片
       editor.config.uploadImgMaxLength = 1;
       //上传图片的错误提示默认使用alert弹出,也可以自定义用户体验更好的提示方式
       editor.config.customAlert = function (info: string) {
-        const repinfo = info.replace(/0.48828125M/g, '500K');
+        const repinfo = info.replace(/0.5859375M/g, '600K');
         // info 是需要提示的内容
         message.error(repinfo);
       };
       // 上传图片的结果反馈
       editor.config.uploadImgHooks = {
         before: function (xhr: any, editor: any, files: any) {
-          console.log('before xhr', xhr);
-          console.log('before files', files);
-          setLoading(true);
           // 图片上传之前触发
           // xhr 是 XMLHttpRequst 对象,editor 是编辑器对象,files 是选择的图片文件
           // 如果返回的结果是 {prevent: true, msg: 'xxxx'} 则表示用户放弃上传
@@ -118,6 +138,16 @@ const BraftText: React.FC = (props) => {
           // msg: '放弃上传'
           // }
           // console.log("before:",xhr)
+          if (isEmpty(objectId.current)) {
+            return {
+              prevent: true,
+              msg: '上传失败,原因:上传参数错误'
+            }
+          }
+          setLoading(true);
+          return {
+            prevent: false,
+          }
         },
         success: function (xhr: any, editor: any, result: any) {
           // 图片上传并返回结果,图片插入成功之后触发
@@ -143,7 +173,6 @@ const BraftText: React.FC = (props) => {
           // 图片上传并返回结果,自定义插入图片的事件(而不是编辑器自动插入图片!!!)
           // insertImg 是插入图片的函数,参数editor 是编辑器对象,result 是服务器端返回的结果
           // 举例:假如上传图片成功后,服务器端返回的是 {url:'....'} 这种格式,即可这样插入图片:
-          console.log('customInsert result', result)
           if (result?.success) {
             const url = pictureDisplayPath + '?filePath=' + result.data[0].sysStorageVO.filePath;
             insertImg(url);
@@ -182,6 +211,7 @@ const BraftText: React.FC = (props) => {
     getHtml,
     getHtml1,
     makeDis,
+    getImageId,
   }));
 
   // 获取html方法1
@@ -214,6 +244,11 @@ const BraftText: React.FC = (props) => {
   const triggerChange = (newHtml: any) => {
     onChange?.(newHtml);
   };
+
+  //获取富文本图片objectId
+  function getImageId() {
+    return objectId.current;
+  }
   return (
     
       
diff --git a/src/pages/MainPage/ProjectManager/components/WangEditor.tsx b/src/pages/MainPage/ProjectManager/components/WangEditor.tsx index 41e7579..025fa87 100644 --- a/src/pages/MainPage/ProjectManager/components/WangEditor.tsx +++ b/src/pages/MainPage/ProjectManager/components/WangEditor.tsx @@ -7,6 +7,7 @@ import { isEmpty } from '@/utils/CommonUtils'; const Editor: React.FC<{}> = () => { const braftRef = useRef(null); const [text, setText] = useState(); + const [code, setCode] = useState(); const { Text, Paragraph } = Typography; return ( = () => { headerBordered > - setText(value)} /> + setText(value)} useImage /> - + + {code} + + + }> {isEmpty(text) ? '没有' : (

From 9ab4413e88eed3bd06d4226bb1481bbf403ec2e8 Mon Sep 17 00:00:00 2001
From: jl-zhoujl2 
Date: Fri, 15 Jul 2022 08:58:51 +0800
Subject: [PATCH 05/10] =?UTF-8?q?7.15=20=E5=85=9A=E5=BB=BA=E6=94=BB?=
 =?UTF-8?q?=E5=9D=9A=E7=AE=A1=E7=90=86=E7=AB=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 config/router.config.ts                       |   2 -
 config/router_partyManagement.ts              |  23 --
 config/router_partyMemberTopic.ts             |   7 +-
 src/assets/topic/topic_right_manager.jpg      | Bin 0 -> 31714 bytes
 src/components/richText/wang/index.tsx        |  10 +-
 src/pages/PartyMemberTopic/Home/index.less    |   4 +
 src/pages/PartyMemberTopic/Home/index.tsx     |  11 +-
 .../components/EventMaintenanceModal.tsx      | 205 ++++++++---
 .../Management/EventMaintenance/index.tsx     | 325 +++++++++++-------
 .../Management/EventMaintenance/service.tsx   |  36 ++
 .../Management/Manage/index.less              |  42 +++
 .../Management/Manage/index.tsx               |  57 +++
 .../Management/OpinionCollection/index.tsx    | 271 +++++++++------
 .../Management/OpinionCollection/service.tsx  |  12 +
 .../Management/ProLineMaintenance/index.tsx   | 107 ++++--
 .../Management/ProLineMaintenance/service.tsx |  16 +
 src/pages/PartyMemberTopic/utils.ts           |  14 +
 17 files changed, 796 insertions(+), 346 deletions(-)
 delete mode 100644 config/router_partyManagement.ts
 create mode 100644 src/assets/topic/topic_right_manager.jpg
 create mode 100644 src/pages/PartyMemberTopic/Management/Manage/index.less
 create mode 100644 src/pages/PartyMemberTopic/Management/Manage/index.tsx

diff --git a/config/router.config.ts b/config/router.config.ts
index be65055..07f3283 100644
--- a/config/router.config.ts
+++ b/config/router.config.ts
@@ -4,7 +4,6 @@ import home from './HomePage/router_home';
 import juryRoom from './JuryRoom/router_menuJury.config';
 import approvalForm from './router_approval_form';
 import partyMemberTopic from './router_partyMemberTopic';
-import partyManagement from './router_partyManagement';
 export default [
   //========================================================================登陆
   ...transfer,//跳转、登陆
@@ -112,7 +111,6 @@ export default [
           },
           ...home,//各角色主页
           ...menuaZhaoBiao,//项目菜单所有路由
-          ...partyManagement,//党建攻坚管理端
           {//问卷调查
             name: 'Questionnaire',
             icon: 'UnorderedListOutlined',
diff --git a/config/router_partyManagement.ts b/config/router_partyManagement.ts
deleted file mode 100644
index 9d864f6..0000000
--- a/config/router_partyManagement.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-export default [
-  {
-    name: 'partyMemberTopicManage',
-    path: '/partyMemberTopicManage',
-    routes: [
-      {//活动维护
-        name: 'EventMaintenance',
-        path: '/partyMemberTopicManage/EventMaintenance',
-        component: './PartyMemberTopic/Management/EventMaintenance',
-      },
-      { //意见收集管理
-        name: 'OpinionCollection',
-        path: '/partyMemberTopicManage/OpinionCollection',
-        component: './PartyMemberTopic/Management/OpinionCollection',
-      },
-      { //物资采购专业线数据维护
-        name: 'ProLineMaintenance',
-        path: '/partyMemberTopicManage/ProLineMaintenance',
-        component: './PartyMemberTopic/Management/ProLineMaintenance',
-      },
-    ]
-  }
-];
\ No newline at end of file
diff --git a/config/router_partyMemberTopic.ts b/config/router_partyMemberTopic.ts
index c8f8d9b..45847b2 100644
--- a/config/router_partyMemberTopic.ts
+++ b/config/router_partyMemberTopic.ts
@@ -43,6 +43,11 @@ export default [
         path: '/partyMemberTopic/newsDetail',
         component: './PartyMemberTopic/NewsDetail',
       },
+      {//管理端首页
+        name: 'manage',
+        path: '/partyMemberTopic/manage',
+        component: './PartyMemberTopic/Management/Manage',
+      },
     ]
-  }
+  },
 ];
\ No newline at end of file
diff --git a/src/assets/topic/topic_right_manager.jpg b/src/assets/topic/topic_right_manager.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..7fce1c7d4d5b162d6c46407117064ec0b988ab25
GIT binary patch
literal 31714
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

literal 0
HcmV?d00001

diff --git a/src/components/richText/wang/index.tsx b/src/components/richText/wang/index.tsx
index e0efd6c..683782b 100644
--- a/src/components/richText/wang/index.tsx
+++ b/src/components/richText/wang/index.tsx
@@ -196,13 +196,19 @@ const BraftText: React.FC = (props) => {
 
     // 重新设置编辑器内容
     echo && editor.txt.html(echo);
-    value && editor.txt.html(value);
 
     return () => {
       // 组件销毁时销毁编辑器  注:class写法需要在componentWillUnmount中调用
       editor.destroy()
+      setLoading(false);
+      setContent('');
     }
-  }, [value, echo]);
+  }, [echo]);
+
+  useEffect(() => {
+    // 重新设置编辑器内容
+    value && editor.txt.html(value);
+  }, [value])
   /**
   *提供给父级的内容
   **/
diff --git a/src/pages/PartyMemberTopic/Home/index.less b/src/pages/PartyMemberTopic/Home/index.less
index 8b559f8..1ffaefb 100644
--- a/src/pages/PartyMemberTopic/Home/index.less
+++ b/src/pages/PartyMemberTopic/Home/index.less
@@ -340,6 +340,10 @@
                     color: #c9c9c9;
                 }
 
+                .right-manager {
+                    margin-top: 12px;
+                }
+
                 // .right-graph {
                 //     padding-top: 26px;
 
diff --git a/src/pages/PartyMemberTopic/Home/index.tsx b/src/pages/PartyMemberTopic/Home/index.tsx
index 5499f16..221f2d7 100644
--- a/src/pages/PartyMemberTopic/Home/index.tsx
+++ b/src/pages/PartyMemberTopic/Home/index.tsx
@@ -11,6 +11,7 @@ import topic_other from '@/assets/topic/topic_other.png'
 import topic_project_picture from '@/assets/topic/topic_project_picture.jpg'
 import topic_bottom_button from '@/assets/topic/topic_bottom_button.png'
 import topic_right_material from '@/assets/topic/topic_right_material.png'
+import topic_right_manager from '@/assets/topic/topic_right_manager.jpg'
 import topic_partymember from '@/assets/topic/topic_partymember.png'
 import topic_partybranch from '@/assets/topic/topic_partybranch.png'
 import topic_totalamount from '@/assets/topic/topic_totalamount.png'
@@ -25,7 +26,7 @@ import topic_interview from '@/assets/topic/topic_interview.png'
 import topic_assure from '@/assets/topic/topic_assure.png'
 import topic_difficult from '@/assets/topic/topic_difficult.png'
 import { getHomeActivity, getHomeBanner, getHomeContact, getHomeGraceful, getHomeProject, getHomeRight, submitAdvice } from './service';
-import { chunk, formatTime, getImageUrl } from '../utils';
+import { chunk, formatTime, getImageUrl, managerAuthority } from '../utils';
 import ExtendUpload from '@/utils/ExtendUpload';
 import { getSessionUserData } from '@/utils/session';
 
@@ -589,6 +590,14 @@ const Home: React.FC<{}> = () => {
                             
                             
                         
+ {managerAuthority("ebtp-party-admin") ? null : ( + <> + +
+ window.open("/partyMemberTopic/manage")} /> +
+ + )}
diff --git a/src/pages/PartyMemberTopic/Management/EventMaintenance/components/EventMaintenanceModal.tsx b/src/pages/PartyMemberTopic/Management/EventMaintenance/components/EventMaintenanceModal.tsx index 2c59719..56ab3f6 100644 --- a/src/pages/PartyMemberTopic/Management/EventMaintenance/components/EventMaintenanceModal.tsx +++ b/src/pages/PartyMemberTopic/Management/EventMaintenance/components/EventMaintenanceModal.tsx @@ -1,7 +1,11 @@ -import React, { useRef } from 'react'; -import { Modal, Card, Col, Form, Input, Row, Space, Typography, Select } from 'antd'; +import React, { useEffect, useRef, useState } from 'react'; +import { Modal, Col, Form, Input, Row, Select, Spin, message } from 'antd'; import BraftText from '@/components/richText/wang'; import ExtendUpload from '@/utils/ExtendUpload'; +import { isEmpty, isNotEmpty } from '@/pages/PartyMemberTopic/utils'; +import { getSessionUserData } from '@/utils/session'; +import moment from 'moment'; +import { saveEventData } from '../service'; const layout = { labelCol: { span: 3 }, @@ -17,23 +21,95 @@ const modalHeight = window.innerHeight * 96 / 100; interface EventMaintenanceModalProps { modalVisible: boolean; onCancel: () => void; + record: any; } const EventMaintenanceModal: React.FC = (props) => { - const { modalVisible, onCancel } = props; + const { modalVisible, onCancel, record } = props; const [form] = Form.useForm(); const { Option } = Select; + const { TextArea } = Input; const braftRef = useRef(null); - const onFinish = (values: any) => { - console.log(values); + //userData + const userData = getSessionUserData(); + //只读 true只读 false编辑 + const readOnly: boolean = record.editCode == "2"; + //上传文件id + const [imageId, setImageId] = useState(''); + //富文本正文图片objectId + const [contentImageId, setContentImageId] = useState(''); + //活动类型选择 + const [typeSelect, setTypeSelect] = useState(''); + //loading + const [loading, setLoading] = useState(false); + + //保存 + const onSubmit = () => { + if (isNotEmpty(typeSelect) && typeSelect != "3" && isEmpty(form.getFieldValue("image"))) { + message.error("请上传主图"); + return; + } + form.validateFields().then(values => { + const data = { + banner: null, + createBy: null, + id: null, + image: null, + secordTitle: null, + sendTime: null, + sort: null, + status: null, + title: null, + type: null, + ...values, + content: braftRef.current.getHtml(), + contentImageId: braftRef.current.getImageId(), + createTime: null, + } + setLoading(true); + saveEventData(data).then(res => { + if (res?.code == 200) { + message.success('保存成功'); + onCancel(); + } + }).finally(() => { + setLoading(false); + }) + }) }; + const onTypeChage = (value: any) => { + setTypeSelect(value); + }; + + useEffect(() => { + if (record.editCode == "0") {//新建 + form.setFieldsValue({ + id: null, + createBy: userData?.fullName, + createTime: moment().format("YYYY-MM-DD HH:mm:ss"), + }); + } else if (record.editCode == "1" || record.editCode == "2") {//编辑 查看 + form.setFieldsValue(record); + setImageId(record?.image); + setContentImageId(record?.contentImageId); + onTypeChage(record?.type); + } + return () => { + setImageId(''); + setContentImageId(''); + setTypeSelect(''); + setLoading(false); + }; + }, [record?.id]) return ( onCancel()} + onOk={() => onSubmit()} + okButtonProps={{ loading: loading, hidden: readOnly }} okText="保存" maskClosable={false} style={{ maxHeight: modalHeight }} @@ -42,58 +118,73 @@ const EventMaintenanceModal: React.FC = (props) => { cancelText="返回" width={'70%'} > -
- - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - -
+ + + + + + + + {typeSelect == "2" && +