天波用户运营管理后台系统
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

385 lines
12KB

  1. <!--
  2. * @Date: 2022-08-08 10:09:47
  3. * @LastEditors: JinxChen
  4. * @LastEditTime: 2022-09-17 16:32:26
  5. * @FilePath: \TelpoUserManageAdmin\src\views\message-manage\main\add-mass\index.vue
  6. * @description: 添加群发
  7. -->
  8. <template>
  9. <div class="home-container">
  10. <div class="form-container">
  11. <!-- 表单 -->
  12. <el-form ref="form" :model="form" label-width="100px" :rules="rules">
  13. <el-form-item label="消息主题:" size="small" prop="subject">
  14. <el-input v-model="form.subject" class="input-width-400" clearable ></el-input>
  15. </el-form-item>
  16. <el-form-item label="内容模板:" size="small" required>
  17. <el-form-item prop="first">
  18. <p>{{firstData}}</p>
  19. <el-input v-model="form.first" class="input-width-600" clearable prop="first"></el-input>
  20. </el-form-item>
  21. <el-form-item prop="keyword1">
  22. <p>学习账号{{keyword1Data}}</p>
  23. <el-input v-model="form.keyword1" class="input-width-400" clearable prop="keyword1"></el-input>
  24. </el-form-item>
  25. <el-form-item prop="keyword2">
  26. <p>更新内容{{keyword2Data}}</p>
  27. <el-input v-model="form.keyword2" class="input-width-600" clearable prop="keyword1"></el-input>
  28. </el-form-item>
  29. <el-form-item prop="remark">
  30. <p>{{remarkData}}</p>
  31. <el-input v-model="form.remark" class="input-width-600" clearable prop="remark"></el-input>
  32. </el-form-item>
  33. </el-form-item>
  34. <el-form-item label="内容链接:" size="small" class="inline-form-item" prop="articleContent" required>
  35. <el-form-item prop="remark">
  36. <el-input v-model="form.articleContent" placeholder="请选择文章或者输入外部URL" class="input-width-400"></el-input>
  37. <el-select v-model="article" placeholder="选择文章" clearable filterable @change="onSelectArt">
  38. <el-option :label="item.label" :value="item.value" v-for="(item, index) in articleList" :key="index"/>
  39. </el-select>
  40. </el-form-item>
  41. </el-form-item>
  42. <el-form-item label="群发对象:" size="small" prop="selfGroupId">
  43. <el-select v-model="form.selfGroupId" placeholder="选择分组" clearable filterable @change="onSelectMass">
  44. <el-option :label="item.label" :value="item.value" v-for="(item, index) in groupList" :key="index"/>
  45. </el-select>
  46. <el-button type="primary" @click="onCheckList" disabled>查看名单</el-button>
  47. </el-form-item>
  48. </el-form>
  49. </div>
  50. <!-- 底部操作按钮 -->
  51. <div class="footer-container">
  52. <el-button type="primary" v-for="(item, index) in footBtnList" :key="index" @click="item.click">{{item.name}}</el-button>
  53. </div>
  54. <!-- 预览dialog -->
  55. <el-dialog title="预览信息" :visible.sync="previewShow">
  56. <div class="preview-container">
  57. <div class="top">
  58. <p>{{form.first}}</p>
  59. <p>学习账号:{{form.keyword1}}</p>
  60. <p>更新内容:{{form.keyword2}}</p>
  61. <p>更新时间:{{initUpdateTime}}</p>
  62. <p>{{form.remark}}</p>
  63. </div>
  64. <div class="fot">
  65. <p>详情</p>
  66. <p>></p>
  67. </div>
  68. </div>
  69. <div class="preview-btn">
  70. <el-button type="primary" @click="onConfirm">确认</el-button>
  71. </div>
  72. </el-dialog>
  73. </div>
  74. </template>
  75. <script>
  76. //import TopMenu from "@/components/TopMenu/index";
  77. import { initTime } from '@/utils/index.js';
  78. import { APIWechatFans } from '@/api/wechat-fans.js';
  79. /* import './index.scss' */
  80. export default {
  81. name: 'add-mass',
  82. components: { },
  83. data(){
  84. return {
  85. buttonList: [], // 头部按钮,例子: {name: '添加', type: 'primary', icon: 'el-icon-circle-plus', click: () => { this.AddDialog();}}
  86. firstData: '{{first.DATA}}:',
  87. keyword1Data: '{{keyword1DATA}}:',
  88. keyword2Data: '{{keyword2DATA}}:',
  89. remarkData: '{{remarkDATA}}:',
  90. form: {
  91. subject: '' /* || '财商学习通知' */, //发送主题
  92. templateId: 1, //模板id
  93. articleContent: '', //文章内容
  94. articleId: '', //文章id
  95. selfGroupId: '', //分组id
  96. first: '' /* || '家长您好,您孩子所需的财商学习内容有更新' */, //内容模板标题
  97. keyword1: '' /* || 'csds' */, //学习账号
  98. keyword2: '' /* || '财商36问' */, //更新内容
  99. remark: '' /* || '请点击内容查看详情' */, //内容详情
  100. },
  101. article: '', //选择文章
  102. // 文章列表
  103. articleList: [],
  104. // 用户分组
  105. groupList: [],
  106. // 底部操作按钮
  107. footBtnList: [
  108. { name: '立即发送', click: () => { this.onSend()}},
  109. { name: '保存', click: () => { this.onSave()} },
  110. { name: '预览', click: () => { this.onPreview()} },
  111. ],
  112. // 预览dialog
  113. previewShow: false,
  114. // form验证
  115. rules: {
  116. subject: [
  117. { required: true, message: '请输入消息主题', trigger: 'blur' },
  118. ],
  119. first: [
  120. { required: true, message: '请填写消息模板内容', trigger: 'blur' },
  121. ],
  122. keyword1: [
  123. { required: true, message: '请填写消息模板内容', trigger: 'blur' },
  124. ],
  125. keyword2: [
  126. { required: true, message: '请填写消息模板内容', trigger: 'blur' },
  127. ],
  128. remark: [
  129. { required: true, message: '请填写消息模板内容', trigger: 'blur' },
  130. ],
  131. messageSubject: [
  132. { required: true, message: '请填写消息模板内容', trigger: 'blur' },
  133. ],
  134. articleContent: [
  135. { required: true, message: '请选择文章获取填写外部URL', trigger: 'blur' },
  136. ],
  137. selfGroupId: [
  138. { required: true, message: '请选择群发分组', trigger: 'blur' },
  139. ],
  140. }
  141. }
  142. },
  143. computed: {
  144. // 初始弹窗更新时间
  145. initUpdateTime() {
  146. return initTime(new Date(), 'ymdh'); //更新时间
  147. }
  148. },
  149. activated() {
  150. this.getSelfGroups();
  151. this.getArticlesGroup();
  152. },
  153. mounted() {
  154. },
  155. created() {
  156. this.getSelfGroups();
  157. this.getArticlesGroup();
  158. },
  159. methods: {
  160. // 获取自定义分组
  161. getSelfGroups() {
  162. let reqBody = {
  163. page_index: 1,
  164. page_size: 10
  165. }
  166. APIWechatFans.SelfGroups(reqBody)
  167. .then(res => {
  168. let data = res.data;
  169. this.groupList = data.map(item => {
  170. return {
  171. label: item.name,
  172. value: item.id
  173. }
  174. })
  175. console.log("data", data);
  176. })
  177. },
  178. // 获取文章列表
  179. getArticlesGroup() {
  180. let reqBody = {
  181. page_index: 1,
  182. page_size: 100000
  183. }
  184. APIWechatFans.getArticlesGroup(reqBody)
  185. .then(res => {
  186. let data = res.data;
  187. console.log("文章data", data);
  188. this.articleList = data.map(item => {
  189. return {
  190. label: item.title,
  191. value: item.id
  192. }
  193. })
  194. })
  195. },
  196. // 查看白名单
  197. onCheckList() {},
  198. // 立即发送
  199. onSend() {
  200. // 拼接所需字段
  201. let keywordStr = this.form.keyword1 + ',' + this.form.keyword2;
  202. let reqBody = {
  203. send_now: true, //true 是立即发送, false是保存
  204. subject: this.form.subject,
  205. template_id: '1',
  206. self_group_id: this.form.selfGroupId,
  207. article_id: this.form.articleId,
  208. first: this.form.first,
  209. remark: this.form.remark,
  210. keyword: keywordStr
  211. };
  212. this.$refs['form'].validate((valid) => {
  213. if(valid) {
  214. this.addGroupSender(reqBody, '群发');
  215. } else {
  216. this.$message({
  217. type: "error",
  218. message: "请完善群发消息"
  219. });
  220. }
  221. });
  222. //this.addGroupSender(reqBody);
  223. },
  224. // 保存
  225. onSave() {
  226. // 拼接所需字段
  227. let keywordStr = this.form.keyword1 + ',' + this.form.keyword2;
  228. let reqBody = {
  229. send_now: false, //true 是立即发送, false是保存
  230. subject: this.form.subject,
  231. template_id: '1',
  232. self_group_id: this.form.selfGroupId,
  233. article_id: this.form.articleId,
  234. first: this.form.first,
  235. remark: this.form.remark,
  236. keyword: keywordStr
  237. };
  238. this.$refs['form'].validate((valid) => {
  239. if(valid) {
  240. this.addGroupSender(reqBody, '保存');
  241. } else {
  242. this.$message({
  243. type: "error",
  244. message: "请完善群发消息"
  245. });
  246. }
  247. });
  248. },
  249. // 添加群发
  250. addGroupSender(reqBody, action) {
  251. const loading = this.$loading({
  252. text: `${action}中`
  253. });
  254. APIWechatFans.addGroupSender(reqBody)
  255. .then(res => {
  256. console.log("res", res);
  257. if(res.code === 20000) {
  258. this.$message({
  259. type: "success",
  260. message: `${action}成功!`
  261. });
  262. } else {
  263. this.$message({
  264. type: "error",
  265. message: `${action}失败!${res.message}`
  266. });
  267. }
  268. }).catch(error => {
  269. this.$message({
  270. type: "error",
  271. message: '出错了!请联系管理员。'
  272. });
  273. }).finally(() => {
  274. loading.close();
  275. })
  276. },
  277. // 预览
  278. onPreview() {
  279. this.previewShow = true;
  280. },
  281. // 预览确认
  282. onConfirm() {
  283. this.previewShow = false;
  284. },
  285. // 选择文章
  286. onSelectArt(value) {
  287. if(value) {
  288. this.form.articleId = value;
  289. this.form.articleContent = this.articleList.filter(item => {
  290. return item.value === value;
  291. }).map(item => {
  292. return item.label;
  293. }).toString();
  294. }
  295. },
  296. // 选择群发对象分组
  297. onSelectMass(value) {
  298. if(value) {
  299. this.form.selfGroupId = value;
  300. console.log("选择的对象分组", value);
  301. }
  302. }
  303. }
  304. }
  305. </script>
  306. <style scoped lang="scss">
  307. .home-container {
  308. padding: 0 20px;
  309. //overflow-y: scroll;
  310. overflow-x: hidden;
  311. border: none;
  312. box-shadow: none;
  313. .form-container {
  314. height: 520px;
  315. padding: 5px 0;
  316. border: 1px solid #d8dce5;
  317. display: flex;
  318. justify-content: center;
  319. align-items: center;
  320. p {
  321. margin: 5px 0;
  322. }
  323. .input-width-400 {
  324. width: 400px;
  325. }
  326. .input-width-600 {
  327. width: 600px;
  328. }
  329. .inline-form-item {
  330. display: inline-block;
  331. }
  332. }
  333. .footer-container {
  334. height: 60px;
  335. display: flex;
  336. justify-content: center;
  337. align-items: center;
  338. .el-button {
  339. width: 120px;
  340. }
  341. }
  342. .preview-container {
  343. //height: 400px;
  344. display: flex;
  345. justify-content: flex-start;
  346. align-items: flex-start;
  347. flex-direction: column;
  348. margin: 20px;
  349. border: 1px solid #d8dce5;
  350. .top {
  351. width: 100%;
  352. display: flex;
  353. justify-content: flex-start;
  354. align-items: flex-start;
  355. flex-direction: column;
  356. padding: 0 40px;
  357. border-bottom: 1px solid #d8dce5 ;
  358. }
  359. .fot {
  360. width: 100%;
  361. padding: 0 40px;
  362. display: flex;
  363. justify-content: space-between;
  364. align-items: center;
  365. }
  366. }
  367. .preview-btn {
  368. display: flex;
  369. justify-content: center;
  370. align-items: center;
  371. }
  372. }
  373. </style>