Browse Source

fix(): 开发短信管理页面

tags/PMS_Frontend_v1.0.6-develop
fengxiang 2 years ago
parent
commit
06657480af
  1. 31
      src/pages/OperationCenter/OperationSales/AdsMgm/index.scss
  2. 12
      src/pages/OperationCenter/OperationSales/AdsMgm/loadable.jsx
  3. 4
      src/pages/OperationCenter/OperationSales/AppPushMgm/index.scss
  4. 5
      src/pages/OperationCenter/OperationSales/AppPushMgm/loadable.jsx
  5. 41
      src/pages/OperationCenter/OperationSales/InformationMgm/index.scss
  6. 137
      src/pages/OperationCenter/OperationSales/InformationMgm/loadable.jsx
  7. 263
      src/pages/OperationCenter/OperationSales/ShortMessageMgm/index.scss
  8. 363
      src/pages/OperationCenter/OperationSales/ShortMessageMgm/loadable.jsx
  9. 2
      src/services/OperationCenter/OperationMarket/index.js
  10. 12
      src/services/OperationCenter/OperationMarket/shortMessage.js

31
src/pages/OperationCenter/OperationSales/AdsMgm/index.scss

@ -14,7 +14,7 @@
display: flex;
width: 100%;
height: 100%;
padding: 10px 0 0 10px;
padding-top: 10px;
}
.full-group {
@ -28,7 +28,7 @@
.search-group {
display: block;
width: 375px;
padding: 10px;
padding: 10px 10px 20px 20px;
.title {
width: 100%;
@ -414,9 +414,32 @@
}
}
.modal-set {
.modal-ads {
.ant-select-selector,
.ant-picker,
.ant-input {
background-color: var(--color-search-list-item-bg) !important;
box-shadow: none !important;
color: var(--color-search-list-item-value);
border-color: var(--color-search-list-item-bd) !important;
}
.btn-box {
margin-top: 20px;
text-align: right;
text-align: center;
.ant-btn+.ant-btn {
margin-left: 20px;
}
.cancel {
border: 1px solid var(--button-default-bg);
background: var(--button-default-bg);
span {
color: #ffffff;
}
}
}
}

12
src/pages/OperationCenter/OperationSales/AdsMgm/loadable.jsx

@ -321,7 +321,7 @@ function AdsMgm() {
//
const paginationProps = {
className: "pagination-common",
position: ["bottomCenter"],
// position: ["bottomCenter"],
showQuickJumper: true,
showSizeChanger: true,
current: pageInfo.pageNum,
@ -888,7 +888,7 @@ function AdsMgm() {
onClick={handleSearch}
loading={loading}
>
搜索
查询
</Button>
</div>
</div>
@ -1274,7 +1274,7 @@ function AdsMgm() {
footer={null}
width={450}
onCancel={() => setModalObj({ ...modalObj, visible: false })}
className="modal-set"
className="modal-ads"
>
<div>
<Input
@ -1283,6 +1283,12 @@ function AdsMgm() {
onChange={(e) => setModalObj({ ...modalObj, name: e.target.value })}
/>
<div className="btn-box">
<Button
className="cancel"
onClick={() => setModalObj({ ...modalObj, visible: false })}
>
取消
</Button>
<Button type="primary" onClick={handleComfirm}>
确定
</Button>

4
src/pages/OperationCenter/OperationSales/AppPushMgm/index.scss

@ -14,7 +14,7 @@
display: flex;
width: 100%;
height: 100%;
padding: 10px 0 0 10px;
padding-top: 10px;
}
.full-group {
@ -28,7 +28,7 @@
.search-group {
display: block;
width: 375px;
padding: 10px;
padding: 10px 10px 20px 20px;
.title {
width: 100%;

5
src/pages/OperationCenter/OperationSales/AppPushMgm/loadable.jsx

@ -233,7 +233,8 @@ function AppPushMgm() {
//
const paginationProps = {
position: ["bottomCenter"],
className: "pagination-common",
// position: ["bottomCenter"],
showQuickJumper: true,
showSizeChanger: true,
current: pageInfo.pageNum,
@ -505,7 +506,7 @@ function AppPushMgm() {
onClick={handleSearch}
loading={loading}
>
搜索
查询
</Button>
</div>
</div>

41
src/pages/OperationCenter/OperationSales/InformationMgm/index.scss

@ -15,7 +15,7 @@
display: flex;
width: 100%;
height: 100%;
padding: 10px 0 0 10px;
padding-top: 10px;
}
.full-group,
@ -30,7 +30,7 @@
.search-group {
display: block;
width: 375px;
padding: 10px;
padding: 10px 10px 20px 20px;
.title {
width: 100%;
@ -276,6 +276,9 @@
.ant-input {
width: 120px;
}
.gap {
margin: 0 5px;
}
}
@ -513,6 +516,13 @@
.r-txt {
min-width: 85px;
text-align: right;
&.required::before {
margin-right: 4px;
color: #f56c6c;
font-family: SimSun, sans-serif;
content: "*";
}
}
.r-con {
@ -527,9 +537,32 @@
}
}
.modal-set {
.modal-info {
.ant-select-selector,
.ant-picker,
.ant-input {
background-color: var(--color-search-list-item-bg) !important;
box-shadow: none !important;
color: var(--color-search-list-item-value);
border-color: var(--color-search-list-item-bd) !important;
}
.btn-box {
margin-top: 20px;
text-align: right;
text-align: center;
.ant-btn+.ant-btn {
margin-left: 20px;
}
.cancel {
border: 1px solid var(--button-default-bg);
background: var(--button-default-bg);
span {
color: #ffffff;
}
}
}
}

137
src/pages/OperationCenter/OperationSales/InformationMgm/loadable.jsx

@ -392,7 +392,8 @@ function InformationMgm() {
//
const paginationProps = {
position: ["bottomCenter"],
className: "pagination-common",
// position: ["bottomCenter"],
showQuickJumper: true,
showSizeChanger: true,
current: pageInfo.pageNum,
@ -728,7 +729,75 @@ function InformationMgm() {
newObj["general"] = general;
newObj["content"] = content;
}
console.log(newObj);
// console.log(newObj);
if (!newObj?.coverUrl?.length) {
message.error("请上传封面图片");
return;
}
if (rowData?.coverType == 1 && newObj?.coverUrl?.length < 3) {
message.error("请上传三张封面图片");
return;
}
if (!newObj?.title) {
message.error("请输入文章标题");
return;
}
if (!newObj?.author) {
message.error("请输入文章作者");
return;
}
if (!newObj?.areaId?.length) {
message.error("请选择区域");
return;
}
if (!newObj?.releaseType?.length) {
message.error("请选择发布渠道");
return;
}
if (!newObj?.shareTitle) {
message.error("请输入分享标题");
return;
}
if (!newObj?.shareDescribe) {
message.error("请输入分享描述");
return;
}
if (!newObj?.shareImgUrl) {
message.error("请上传分享缩略图");
return;
}
if (!newObj?.introduction) {
message.error("请输入简介");
return;
}
if (!newObj?.categoryId) {
message.error("请选择分类");
return;
}
if (!newObj?.readBasics) {
message.error("请输入阅读数基础值");
return;
}
if (!newObj?.readMultiple) {
message.error("请输入阅读数放大倍数");
return;
}
if (!newObj?.pointBasics) {
message.error("请输入点赞数基础值");
return;
}
if (!newObj?.pointMultiple) {
message.error("请输入点赞数放大倍数");
return;
}
if (newObj?.isReprint == 1 && !newObj?.jumpUrl) {
message.error("请输入原文链接");
return;
}
if (newObj?.isReprint == 0 && !newObj?.general) {
message.error("请输入内容");
return;
}
ajax[newObj?.informationId ? "doInfoEdit" : "doInfoInsert"](newObj).then(
(res) => {
@ -940,7 +1009,7 @@ function InformationMgm() {
onClick={handleSearch}
loading={loading}
>
搜索
查询
</Button>
</div>
</div>
@ -1030,7 +1099,7 @@ function InformationMgm() {
<div className="edit-group form-group">
<div className="lt-box">
<div className="row-line">
<div className="r-txt">封面图片</div>
<div className="r-txt required">封面图片</div>
<div className="r-con">
<Radio.Group
value={rowData?.coverType + ""}
@ -1090,7 +1159,7 @@ function InformationMgm() {
</div>
</div>
<div className="row-line">
<div className="r-txt">标题</div>
<div className="r-txt required">标题</div>
<div className="r-con">
<Input.TextArea
showCount
@ -1103,7 +1172,7 @@ function InformationMgm() {
</div>
</div>
<div className="row-line">
<div className="r-txt">作者</div>
<div className="r-txt required">作者</div>
<div className="r-con">
<Input
className="row-sm"
@ -1116,7 +1185,7 @@ function InformationMgm() {
</div>
</div>
<div className="row-line">
<div className="r-txt">区域</div>
<div className="r-txt required">区域</div>
<div className="r-con">
<Cascader
className="row-sm"
@ -1136,7 +1205,7 @@ function InformationMgm() {
</div>
</div>
<div className="row-line">
<div className="r-txt">发布渠道</div>
<div className="r-txt required">发布渠道</div>
<div className="r-con">
<Checkbox.Group
options={[
@ -1150,7 +1219,7 @@ function InformationMgm() {
</div>
</div>
<div className="row-line">
<div className="r-txt">分享标题</div>
<div className="r-txt required">分享标题</div>
<div className="r-con">
<Input
className="row-lg"
@ -1163,7 +1232,7 @@ function InformationMgm() {
</div>
</div>
<div className="row-line">
<div className="r-txt">分享描述</div>
<div className="r-txt required">分享描述</div>
<div className="r-con">
<Input
className="row-lg"
@ -1178,7 +1247,7 @@ function InformationMgm() {
</div>
</div>
<div className="row-line">
<div className="r-txt">分享缩略图</div>
<div className="r-txt required">分享缩略图</div>
<div className="r-con">
<div>
<div
@ -1218,7 +1287,7 @@ function InformationMgm() {
</div>
<div className="rt-box">
<div className="row-line">
<div className="r-txt">简介</div>
<div className="r-txt required">简介</div>
<div className="r-con">
<Input.TextArea
showCount
@ -1231,7 +1300,7 @@ function InformationMgm() {
</div>
</div>
<div className="row-line">
<div className="r-txt">是否置顶</div>
<div className="r-txt required">是否置顶</div>
<div className="r-con">
<Radio.Group
value={rowData?.isStick + ""}
@ -1243,7 +1312,7 @@ function InformationMgm() {
</div>
</div>
<div className="row-line">
<div className="r-txt">分类</div>
<div className="r-txt required">分类</div>
<div className="r-con">
<Cascader
className="row-sm"
@ -1261,7 +1330,7 @@ function InformationMgm() {
</div>
</div>
<div className="row-line">
<div className="r-txt">
<div className="r-txt required">
<Tooltip
placement="topLeft"
title="说明:前台展示[阅读数]=基础值+用户实际操作值"
@ -1277,9 +1346,9 @@ function InformationMgm() {
value={rowData?.readBasics || ""}
onChange={(e) => handleForm("readBasics", e.target.value)}
/>
<span>+</span>
<Input disabled value={rowData?.userRead} />
<span>×</span>
<span className="gap">+</span>
<Input disabled value={rowData?.userRead || 0} />
<span className="gap">×</span>
<Input
placeholder="放大倍数"
value={rowData?.readMultiple || ""}
@ -1291,7 +1360,7 @@ function InformationMgm() {
</div>
</div>
<div className="row-line">
<div className="r-txt">
<div className="r-txt required">
<Tooltip
placement="topLeft"
title="说明:前台展示[点赞数]=基础值+用户实际操作值"
@ -1309,9 +1378,9 @@ function InformationMgm() {
handleForm("pointBasics", e.target.value)
}
/>
<span>+</span>
<Input disabled value={rowData?.userPoint} />
<span>×</span>
<span className="gap">+</span>
<Input disabled value={rowData?.userPoint || 0} />
<span className="gap">×</span>
<Input
placeholder="放大倍数"
value={rowData?.pointMultiple || ""}
@ -1324,7 +1393,7 @@ function InformationMgm() {
</div>
{rowData?.isReprint == 1 ? (
<div className="row-line">
<div className="r-txt">原文链接</div>
<div className="r-txt required">原文链接</div>
<div className="r-con">
<Input
className="row-lg"
@ -1345,6 +1414,8 @@ function InformationMgm() {
onChange={(e, str) => handleForm("upperTime", str)}
/>
</div>
</div>
<div className="row-line">
<div className="r-txt">定时下架时间</div>
<div className="r-con">
<DatePicker
@ -1376,7 +1447,7 @@ function InformationMgm() {
</div>
</div>
<div className="row-box">
<div className="r-txt">内容</div>
<div className="r-txt required">内容</div>
<div className="r-con">
<MyEditor
content={content}
@ -1524,10 +1595,13 @@ function InformationMgm() {
</div>
</div>
</div>
{/* <div className="extra-group">
{/* {rowData?.isReprint != 1 ? (
<div className="extra-group">
<div className="row-box">
<div className="r-txt">上传资源</div>
<div className="r-con r-sm">{rowData?.attachmentPath || "-"}</div>
<div className="r-con r-sm">
{rowData?.attachmentPath || "-"}
</div>
</div>
<div className="row-box">
<div className="r-txt">内容</div>
@ -1535,7 +1609,8 @@ function InformationMgm() {
<div dangerouslySetInnerHTML={{ __html: rowData?.content }} />
</div>
</div>
</div> */}
</div>
) : null} */}
</div>
</div>
{/* 设置 */}
@ -1569,7 +1644,7 @@ function InformationMgm() {
footer={null}
width={450}
onCancel={() => setModalObj({ ...modalObj, visible: false })}
className="modal-set"
className="modal-info"
>
<div>
<Input
@ -1578,6 +1653,12 @@ function InformationMgm() {
onChange={(e) => setModalObj({ ...modalObj, name: e.target.value })}
/>
<div className="btn-box">
<Button
className="cancel"
onClick={() => setModalObj({ ...modalObj, visible: false })}
>
取消
</Button>
<Button type="primary" onClick={handleComfirm}>
确定
</Button>

263
src/pages/OperationCenter/OperationSales/ShortMessageMgm/index.scss

@ -1,5 +1,260 @@
@import "@/assets/css/mixin.scss";
$color-container-bg : var(--color-container-bg);
$color-user-list-bg : var(--color-user-list-bg);
$color-text : var(--color-text);
$color-primary : var(--color-primary);
.short-message-mgm {
width: 100%;
height: 100%;
overflow-y: auto;
@include scrollBar(#8bb3e3, #3471c4);
.hidden {
display: none !important;
}
.mgm-wraper {
display: flex;
width: 100%;
height: 100%;
padding-top: 10px;
}
.full-group {
width: 100%;
padding: 15px 15px 0;
border-radius: 6px;
background: var(--color-user-list-bg);
box-shadow: 0px 3px 8px 0px rgb(0 0 0 / 8%);
}
.search-group {
display: block;
width: 375px;
padding: 10px 10px 20px 20px;
.title {
width: 100%;
font-size: 16px;
font-family: Microsoft YaHei, Microsoft YaHei-Bold;
font-weight: 700;
text-align: left;
color: var(--color-text);
margin-bottom: 20px;
}
.ant-select-selector,
.ant-picker,
.ant-input {
background-color: var(--color-search-list-item-bg) !important;
box-shadow: none !important;
color: var(--color-search-list-item-value);
border-color: var(--color-search-list-item-bd) !important;
}
.form-box {
width: 100%;
display: flex;
align-items: center;
margin-bottom: 20px;
.form-txt {
color: var(--color-search-list-item-text);
flex: 0 0 25%;
max-width: 25%;
text-align: right;
padding-right: 6px;
}
.form-con {
flex: 1;
width: 220px;
}
.form-long {
flex: 1;
min-width: 220px;
}
}
.form-btn {
display: flex;
flex-flow: row nowrap;
justify-content: space-between;
margin: 40px 10px 10px;
padding: 0 3px;
.ant-btn+.ant-btn {
margin-left: 10px;
}
.ant-btn span {
font-size: 16px;
font-family: Microsoft YaHei, Microsoft YaHei-Regular;
font-weight: 400;
text-align: center;
color: #ffffff;
}
.reset {
width: 90px;
height: 36px;
border-radius: 4px;
background: var(--button-default-bg);
}
.submit {
width: calc(100% - 100px);
height: 36px;
border-radius: 4px;
}
}
}
.row-operate {
display: flex;
justify-content: flex-end;
}
.ant-btn+.ant-btn {
margin-left: 10px;
}
.green {
background-color: #67c23a;
border-color: #67c23a;
}
.result-group {
width: calc(100% - 375px);
padding-bottom: 15px;
padding: 20px;
background: var(--color-user-list-bg);
border-top-left-radius: 20px;
box-shadow: 0px 3px 8px 0px rgba(0, 0, 0, 0.08);
.row-head {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 12px;
.number-wrapper {
display: inline-flex;
align-items: center;
font-size: 14px;
.letter {
color: var(--color-text);
font-size: 14px;
}
.total-number {
color: var(--color-primary);
font-weight: bold;
margin: 0 4px;
font-size: 14px;
}
}
}
.cc-result-flow {
width: 100%;
height: calc(100% - 34px - 13px);
.yisa-table {
width: 100%;
height: calc(100% - 32px - 15px);
overflow-y: auto !important;
@include scrollBar(#8bb3e3, #3471c4);
.ant-table-thead {
th {
background: var(--color-table-header-bg) !important;
}
}
.ant-table-tbody {
td {
background: var(--color-table-body-bg) !important;
border-bottom-color: var(--color-table-border-bottom-color);
}
tr:nth-child(even) {
td {
background: var(--color-table-body-bg-nth-child-even) !important;
}
}
}
.row-pic {
width: 100%;
display: flex;
align-items: center;
justify-content: flex-start;
.ant-image {
margin-right: 3px;
}
}
}
}
}
}
.modal-short {
.ant-select-selector,
.ant-picker,
.ant-input {
background-color: var(--color-search-list-item-bg) !important;
box-shadow: none !important;
color: var(--color-search-list-item-value);
border-color: var(--color-search-list-item-bd) !important;
}
.row-box {
width: 100%;
display: flex;
margin-bottom: 16px;
.r-txt {
padding-right: 8px;
min-width: 80px;
text-align: right;
&.required::before {
margin-right: 4px;
color: #f56c6c;
font-family: SimSun, sans-serif;
content: "*";
}
}
.r-con {
flex: 1;
.text {
margin-bottom: 8px;
}
}
}
.btn-box {
margin-top: 20px;
text-align: center;
.ant-btn+.ant-btn {
margin-left: 20px;
}
.cancel {
border: 1px solid var(--button-default-bg);
background: var(--button-default-bg);
span {
color: #ffffff;
}
}
}
}

363
src/pages/OperationCenter/OperationSales/ShortMessageMgm/loadable.jsx

@ -1,15 +1,360 @@
import React, { useState, useRef, useEffect } from "react";
// import { message, Pagination, Table, Space, Modal, } from "antd";
// import { dictionary, utils } from "@/config/common";
// import moment from 'moment'
import {
message,
Input,
Select,
Button,
DatePicker,
Pagination,
Table,
Modal,
} from "antd";
import { ResultFlowResult } from "@/components";
// import { useSessionStorageState, useUpdateEffect, useSize, useUpdate } from 'ahooks';
// import ajax from "@/services"
// import { FormInput, FormSelect, OptionPanel, ResultPanel, FormSliderPicker, AreaCascader, ImgResize, ImgZoom, } from "@/components"
// import "./index.scss";
// import errorImg from "@/assets/images/layout/error.png"
// import { useLocation } from "react-router-dom";
import ajax from "@/services/OperationCenter/OperationMarket";
import { dictionary } from "@/config/common";
import moment from "moment";
import "./index.scss";
//
function ShortMessageMgm() {
return <div>ShortMessageMgm</div>
//
const defaultData = {
phoneNumber: "", //
msgType: "", //
times: "", //
};
//
const [pageInfo, setPageInfo] = useState({
pageNum: 1,
pageSize: 15,
});
//
const [formData, setFormData] = useState(defaultData);
// -
const [holdData, setHoldData] = useState(formData);
// 访isAjax
const [isAjax, setIsAjax] = useState(false);
//
const [loading, setLoading] = useState(false);
//
const [tabLoading, setTabLoading] = useState(false);
//
const [resultData, setResultData] = useState({
total: 0,
list: [],
});
//
const [typeList, setTypeList] = useState([]);
//
const [visible, setVisible] = useState(false);
const [modalObj, setModalObj] = useState({
phoneNumber: "", //
content: "", //
});
// 访
useEffect(() => {
getSelectList();
}, []);
// 访
useEffect(() => {
getData();
}, [isAjax]);
//
const columns = [
{
title: "手机号",
dataIndex: "phoneNumber",
align: "center",
},
{
title: "消息类型",
dataIndex: "msgType",
align: "center",
render: (val, row, index) => {
return getTypeText(val);
},
},
{
title: "内容",
dataIndex: "content",
align: "center",
},
{
title: "操作人",
dataIndex: "operatorId",
align: "center",
},
{
title: "时间",
dataIndex: "updatedTime",
align: "center",
sorter: (a, b) =>
moment(a.updatedTime).diff(moment(b.updatedTime), "seconds"),
},
];
//
const getTypeText = (val) => {
const obj = typeList.filter((v, i) => v.sms_id == val);
return obj?.length ? obj[0].sms_name : "-";
};
//
const paginationProps = {
className: "pagination-common",
// position: ["bottomCenter"],
showQuickJumper: true,
showSizeChanger: true,
current: pageInfo.pageNum,
total: resultData?.total,
showTotal: () => `${resultData.total || 0}`,
pageSize: pageInfo.pageSize,
pageSizeOptions: Array.from(
new Set([...[15], ...(dictionary?.pageSizeOptions || [])])
),
onChange: (current, size) => {
setPageInfo({
...pageInfo,
...{ pageNum: pageInfo.pageSize == size ? current : 1, pageSize: size },
});
setIsAjax(!isAjax);
},
};
//
const getData = () => {
let postData = { ...formData };
if (!loading) {
postData = { ...holdData };
}
//
const newObj = {
phoneNumber: postData?.phoneNumber,
msgType: postData?.msgType,
beginTime: postData?.times?.length
? postData?.times[0].format("YYYY-MM-DD HH:mm:ss")
: "",
endTime: postData?.times?.length
? postData?.times[1].format("YYYY-MM-DD HH:mm:ss")
: "",
};
// console.log(postData, newObj);
setTabLoading(true);
ajax.getSmsList({ ...newObj, ...pageInfo }).then(
(res) => {
if (parseInt(res?.status) === 20000) {
setResultData(res?.data || {});
} else {
message.error(res?.message);
}
setLoading(false);
setTabLoading(false);
},
(err) => {
console.log(err);
setLoading(false);
setTabLoading(false);
}
);
};
//
const handleSearch = () => {
setLoading(true);
setPageInfo({ ...pageInfo, ...{ pageNum: 1 } });
setHoldData(formData);
setIsAjax(!isAjax);
};
//
const getSelectList = () => {
ajax.getSmsMsgType().then(
(res) => {
if (parseInt(res?.status) === 20000) {
setTypeList(res?.data?.list || []);
} else {
message.error(res?.message);
}
},
(err) => {
console.log(err);
}
);
};
// -
const handleComfirm = () => {
if (!modalObj?.phoneNumber) {
message.error("请输入手机号");
return;
}
if (!modalObj?.content) {
message.error("请输入内容");
return;
}
ajax.doSmsSend(modalObj).then(
(res) => {
if (parseInt(res?.status) === 20000) {
message.success(res?.message);
setVisible(false);
setPageInfo({ ...pageInfo, ...{ pageNum: 1 } });
setIsAjax(!isAjax);
} else {
message.error(res?.message);
}
},
(err) => {
console.log(err);
}
);
};
return (
<div className="short-message-mgm">
{/* 主页 */}
<div className="mgm-wraper">
<div className="search-group">
<div class="title">查询条件</div>
<div className="form-box">
<div className="form-txt">手机号</div>
<Input
className="form-con"
placeholder="请输入手机号"
value={formData?.phoneNumber}
onChange={(e) =>
setFormData({ ...formData, phoneNumber: e.target.value })
}
/>
</div>
<div className="form-box">
<div className="form-txt">类型</div>
<Select
className="form-con"
allowClear
fieldNames={{
value: "sms_id",
label: "sms_name",
}}
options={typeList || []}
placeholder="全部"
value={formData?.msgType || undefined}
onChange={(e) => setFormData({ ...formData, msgType: e })}
/>
</div>
<div className="form-box">
<div className="form-txt">时间</div>
<DatePicker.RangePicker
className="form-long"
showTime
value={formData?.times || null}
onChange={(e, str) => setFormData({ ...formData, times: e })}
/>
</div>
<div className="form-btn">
<Button className="reset" onClick={() => setFormData(defaultData)}>
重置
</Button>
<Button
className="submit"
type="primary"
onClick={handleSearch}
loading={loading}
>
查询
</Button>
</div>
</div>
<div className="result-group">
<div className="row-head">
<span className="number-wrapper">
<span className="letter">共查询到</span>
<span className="total-number"> {resultData.total || 0} </span>
<span className="letter">条结果</span>
</span>
<div>
<Button
type="primary"
onClick={() => {
setModalObj({ phoneNumber: "", content: "" });
setVisible(true);
}}
>
发送消息
</Button>
</div>
</div>
<ResultFlowResult
ajaxLoad={tabLoading}
resultData={resultData?.list || []}
>
<Table
// bordered
className="yisa-table"
rowKey={(row) => row.id}
dataSource={resultData?.list || []}
columns={columns}
pagination={false}
loading={tabLoading}
/>
<Pagination {...paginationProps} className="pagination-common" />
</ResultFlowResult>
</div>
</div>
<Modal
title="发送短信消息"
open={visible}
// centered
footer={null}
width={772}
onCancel={() => setVisible(false)}
className="modal-short"
>
<div>
<div className="row-box">
<div className="r-txt">发送对象</div>
<div className="r-con">
<div className="text">指定用户</div>
<Input.TextArea
placeholder="请输入手机号,多个手机号用,分隔。例:13400000001,13400000002"
autoSize={{ minRows: 2, maxRows: 2 }}
value={modalObj.phoneNumber}
onChange={(e) =>
setModalObj({ ...modalObj, phoneNumber: e.target.value })
}
/>
</div>
</div>
<div className="row-box">
<div className="r-txt required">内容</div>
<div className="r-con">
<Input.TextArea
placeholder="请输入内容"
autoSize={{ minRows: 2, maxRows: 2 }}
value={modalObj.content}
onChange={(e) =>
setModalObj({ ...modalObj, content: e.target.value })
}
/>
</div>
</div>
<div className="btn-box">
<Button className="cancel" onClick={() => setVisible(false)}>
取消
</Button>
<Button type="primary" onClick={handleComfirm}>
发送
</Button>
</div>
</div>
</Modal>
</div>
);
}
export default ShortMessageMgm;

2
src/services/OperationCenter/OperationMarket/index.js

@ -9,9 +9,11 @@
import advertisement from "./advertisement";
import information from "./information";
import appPush from "./appPush";
import shortMessage from "./shortMessage";
export default {
...advertisement,
...information,
...appPush,
...shortMessage,
};

12
src/services/OperationCenter/OperationMarket/shortMessage.js

@ -0,0 +1,12 @@
import ajax from "@/config/ajax";
// --短信管理--
export default {
// 消息类型
getSmsMsgType: (data) =>
ajax({ url: "/api/ope/sms/message_type", type: "get", data }),
// 列表
getSmsList: (data) => ajax({ url: "/api/ope/sms/list", type: "get", data }),
// 发送
doSmsSend: (data) =>
ajax({ url: "/api/ope/sms/send_message", type: "post", data }),
};
Loading…
Cancel
Save