contentOperation.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720
  1. <template>
  2. <div class="m-container">
  3. <h2>
  4. <el-page-header @back="onCancel"
  5. :content="(pageType == 'create' ? '添加' : '修改') + typeChange(type)"></el-page-header>
  6. </h2>
  7. <div class="m-core">
  8. <el-form :model="form"
  9. :rules="rules"
  10. ref="form"
  11. label-width="120px"
  12. style="width: 100%">
  13. <el-form-item label="标题"
  14. prop="title">
  15. <el-input v-model.trim="form.title"></el-input>
  16. </el-form-item>
  17. <el-form-item label="排序值">
  18. <el-input v-model.trim="form.order"></el-input>
  19. </el-form-item>
  20. <el-form-item label="适用范围"
  21. prop="tenantId">
  22. <el-select v-model="form.tenantId">
  23. <el-option label="对内"
  24. value="1"></el-option>
  25. <el-option label="对外"
  26. value="2"></el-option>
  27. </el-select>
  28. </el-form-item>
  29. <!-- banner图 && app按钮管理,才需要添加版本号 -->
  30. <el-form-item label="版本号"
  31. v-if="type == 3 || type == 6">
  32. <el-input v-model="form.memo"></el-input>
  33. </el-form-item>
  34. <!-- -->
  35. <el-form-item v-if="type == 3 || type == 6"
  36. label="链接地址">
  37. <el-input v-model.trim="form.linkUrl"></el-input>
  38. </el-form-item>
  39. <el-form-item v-else
  40. label="链接地址"
  41. prop="linkUrl">
  42. <el-input v-model.trim="form.linkUrl"></el-input>
  43. </el-form-item>
  44. <el-form-item label="封面图"
  45. prop="coverImage">
  46. <el-upload class="avatar-uploader"
  47. action="/api-web/uploadFile"
  48. :headers="headers"
  49. :show-file-list="false"
  50. accept=".jpg, .jpeg, .png"
  51. :on-success="handleAvatarSuccess"
  52. :before-upload="beforeAvatarUpload">
  53. <img v-if="form.coverImage"
  54. :src="form.coverImage"
  55. class="avatar" />
  56. <i v-else
  57. class="el-icon-plus avatar-uploader-icon"></i>
  58. </el-upload>
  59. <p class="imageSize"
  60. v-if="imageSize">上传图片尺寸为:{{ imageSize }}</p>
  61. </el-form-item>
  62. <el-form-item label="内容"
  63. prop="content">
  64. <!-- bidirectional data binding(双向数据绑定) -->
  65. <quill-editor class="ql-editor"
  66. v-model="form.content"
  67. ref="myQuillEditor"
  68. :options="editorOption"
  69. @change="onEditorChange($event)"></quill-editor>
  70. <el-upload class="ivu-upload"
  71. :show-upload-list="false"
  72. :headers="headers"
  73. :on-success="handleSuccess"
  74. accept=".jpg, .jpeg, .png"
  75. :max-size="2048"
  76. multiple
  77. action="/api-web/uploadFile">
  78. <Button icon="ios-cloud-upload-outline"></Button>
  79. </el-upload>
  80. </el-form-item>
  81. <el-form-item>
  82. <el-button @click="onSubmit('form')"
  83. type="primary">立即{{ pageType == "create" ? '创建' : '修改' }}</el-button>
  84. <el-button @click="onReSet('form')">重置</el-button>
  85. <el-button @click="onLook">预览</el-button>
  86. </el-form-item>
  87. </el-form>
  88. </div>
  89. <el-dialog title="插入视屏"
  90. width="500px"
  91. :visible.sync="dialogFormVisible">
  92. <el-form :model="dialogForm"
  93. ref="diologForm"
  94. :rules="dialogFormRules">
  95. <el-form-item label="封面图地址"
  96. label-width="90px">
  97. <el-input v-model="dialogForm.poster"
  98. style="width: 100%;"
  99. autocomplete="off"></el-input>
  100. </el-form-item>
  101. <el-form-item label="视屏类型"
  102. label-width="90px">
  103. <el-radio-group v-model="formRadio">
  104. <el-radio :label="1">外部连接</el-radio>
  105. <el-radio :label="2">上传</el-radio>
  106. </el-radio-group>
  107. </el-form-item>
  108. <el-form-item v-if="formRadio == 1" label="视屏地址"
  109. label-width="90px"
  110. prop="url">
  111. <el-input v-model="dialogForm.url"
  112. style="width: 100%;"
  113. autocomplete="off"></el-input>
  114. </el-form-item>
  115. <el-form-item v-if="formRadio == 2" label="上传视屏"
  116. label-width="90px"
  117. prop="videoUrl">
  118. <!-- <el-input v-model="dialogForm.url"
  119. style="width: 100%;"
  120. autocomplete="off"></el-input> -->
  121. <el-upload
  122. class="upload-demo"
  123. style="display: inline-block"
  124. v-loading="uploadLoading"
  125. action="/api-web/uploadFile"
  126. :before-upload="beforeUpload"
  127. :on-success="handleUploadSuccess"
  128. :on-error="handleUploadError"
  129. :show-file-list="false"
  130. :limit="1"
  131. accept=".mp4, .m4a"
  132. :on-exceed="handleExceed">
  133. <video style="width: 120px; height: 120px" v-if="dialogForm.videoUrl" controls="controls" type="video/mp4" preload="auto" :src="dialogForm.videoUrl"></video>
  134. <i v-else class="el-icon-plus avatar-uploader-icon"></i>
  135. </el-upload>
  136. <p class="imageSize" >只能上传mp4/m4a文件, 且不超过100M</p>
  137. </el-form-item>
  138. </el-form>
  139. <div slot="footer"
  140. class="dialog-footer">
  141. <el-button @click="dialogFormVisible = false">取 消</el-button>
  142. <el-button type="primary"
  143. @click="onVideoComfirm('diologForm')">确 定</el-button>
  144. </div>
  145. </el-dialog>
  146. <el-dialog width="375px"
  147. :visible.sync="lookVisible">
  148. <div class="sd-container">
  149. <h2>{{ dataInfo.title }}</h2>
  150. <div class="titleInfo">
  151. <!-- <p>{{ dataInfo.tenantId == 2 ? '' : '大雅乐盟' }}</p> -->
  152. <p>{{ typeCheck(dataInfo.type) }}</p>
  153. <p>{{ dataInfo.updateTime }}</p>
  154. </div>
  155. <div class="msgWrap quill-editor ql-editor" v-html="dataInfo.content"></div>
  156. </div>
  157. </el-dialog>
  158. </div>
  159. </template>
  160. <script>
  161. import { newsQueryId, newsAdd, newsUpdate } from "@/api/contentManager";
  162. import store from "@/store";
  163. import { getToken } from "@/utils/auth";
  164. import { vaildStudentUrl } from "@/utils/validate";
  165. // import E from 'wangeditor'
  166. // require styles
  167. import "quill/dist/quill.core.css";
  168. import "quill/dist/quill.snow.css";
  169. import "quill/dist/quill.bubble.css";
  170. import Quill from "quill";
  171. import { quillEditor } from "vue-quill-editor";
  172. // 工具栏配置
  173. const toolbarOptions = [
  174. ["bold", "italic", "underline", "strike"], // 加粗 斜体 下划线 删除线
  175. ["blockquote", "code-block"], // 引用 代码块
  176. [{ header: 1 }, { header: 2 }], // 1、2 级标题
  177. [{ list: "ordered" }, { list: "bullet" }], // 有序、无序列表
  178. [{ script: "sub" }, { script: "super" }], // 上标/下标
  179. [{ indent: "-1" }, { indent: "+1" }], // 缩进
  180. // [{'direction': 'rtl'}], // 文本方向
  181. [{ size: ["small", false, "large", "huge"] }], // 字体大小
  182. [{ header: [1, 2, 3, 4, 5, 6, false] }], // 标题
  183. [{ color: [] }, { background: [] }], // 字体颜色、字体背景颜色
  184. [{ font: [] }], // 字体种类
  185. [{ align: [] }], // 对齐方式
  186. ["clean"], // 清除文本格式
  187. ["image", "video"] // 链接、图片、视频
  188. // ["link", "image", "video"] // 链接、图片、视频
  189. ];
  190. // 标题
  191. const titleConfig = {
  192. "ql-bold": "加粗",
  193. "ql-color": "颜色",
  194. "ql-font": "字体",
  195. "ql-code": "插入代码",
  196. "ql-italic": "斜体",
  197. // 'ql-link': '添加链接',
  198. "ql-background": "背景颜色",
  199. "ql-size": "字体大小",
  200. "ql-strike": "删除线",
  201. "ql-script": "上标/下标",
  202. "ql-underline": "下划线",
  203. "ql-blockquote": "引用",
  204. "ql-header": "标题",
  205. "ql-indent": "缩进",
  206. "ql-list": "列表",
  207. "ql-align": "文本对齐",
  208. "ql-direction": "文本方向",
  209. "ql-code-block": "代码块",
  210. "ql-formula": "公式",
  211. "ql-image": "图片",
  212. "ql-video": "视频",
  213. "ql-clean": "清除字体样式",
  214. "ql-upload": "文件"
  215. };
  216. // 这里引入修改过的video模块并注册
  217. import Video from "../quill/video.js";
  218. import dayjs from 'dayjs'
  219. Quill.register(Video, true);
  220. export default {
  221. name: "contentOperation",
  222. components: {
  223. quillEditor
  224. },
  225. data () {
  226. let that = this;
  227. const query = this.$route.query
  228. const url = query.type == 7 ? vaildStudentUrl() + "/#/knowledge" : vaildStudentUrl() + "/#/specialdetail"
  229. console.log(url)
  230. return {
  231. categoryList: [],
  232. type: query.type,
  233. pageType: query.pageType,
  234. organId: null,
  235. headers: {
  236. Authorization: getToken()
  237. },
  238. content: null,
  239. dialogFormVisible: false,
  240. formRadio: 1,
  241. lookVisible: false,
  242. dataInfo: {
  243. title: '知识库13',
  244. type: query.type,
  245. updateTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
  246. content: null
  247. },
  248. editorIndex: 0, // 光标位置
  249. editorOption: {
  250. placeholder: "请输入内容",
  251. modules: {
  252. toolbar: {
  253. container: toolbarOptions,
  254. handlers: {
  255. image: function (value) {
  256. if (value) {
  257. // 调用iview图片上传
  258. document.querySelector(".ivu-upload .el-upload").click();
  259. } else {
  260. this.quill.format("image", false);
  261. }
  262. },
  263. video: function (value) {
  264. if (value) {
  265. that.dialogFormVisible = true;
  266. let editor = that.$refs.myQuillEditor.quill;
  267. // 光标所在位置
  268. that.editorIndex = editor.getSelection().index;
  269. } else {
  270. this.quill.format("image", false);
  271. }
  272. }
  273. }
  274. }
  275. }
  276. },
  277. dialogForm: {
  278. poster: null,
  279. url: null,
  280. videoUrl: null
  281. },
  282. uploadLoading: false,
  283. fileList: [],
  284. dialogFormRules: {
  285. url: [{ required: true, message: "请输入视屏地址", trigger: "blur" }],
  286. videoUrl: [{required: true, message: "请上传视屏", trigger: 'blur'}]
  287. },
  288. form: {
  289. title: null,
  290. order: null,
  291. coverImage: null,
  292. linkUrl: url,
  293. type: query.type,
  294. status: 1,
  295. content: null,
  296. tenantId: null,
  297. },
  298. rules: {
  299. title: [
  300. { required: true, message: "请输入标题", trigger: "blur" },
  301. { min: 2, max: 30, message: "长度在 2 到 30 个字符", trigger: "blur" }
  302. ],
  303. linkUrl: [
  304. { required: true, message: "请输入连接地址", trigger: "blur" }
  305. ],
  306. coverImage: [
  307. { required: true, message: "请选择封面图", trigger: "blur" }
  308. ],
  309. content: [{ required: true, message: "请编辑内容", trigger: "blur" }],
  310. tenantId: [{ required: true, message: "请选择适用范围", trigger: "blur" }]
  311. },
  312. imageSize: null
  313. };
  314. },
  315. created () { },
  316. mounted () {
  317. this.init();
  318. },
  319. activated () {
  320. const query = this.$route.query
  321. if (query.pageType == "create") {
  322. this.form = {
  323. title: null,
  324. order: null,
  325. coverImage: null,
  326. linkUrl: query.type == 7 ? vaildStudentUrl() + "/#/knowledge" : vaildStudentUrl() + "/#/specialdetail",
  327. type: query.type,
  328. status: 1,
  329. content: null,
  330. tenantId: null
  331. };
  332. this.$refs["form"].resetFields();
  333. }
  334. this.type = query.type;
  335. this.pageType = query.pageType;
  336. this.init();
  337. },
  338. methods: {
  339. init () {
  340. this.getList();
  341. this.addQuillTitle();
  342. // this.form.type
  343. let tempTitle = {
  344. 1: "468px * 552px",
  345. 2: "456px * 288px",
  346. 3: "686px * 140px",
  347. 4: null,
  348. 5: null,
  349. 6: null,
  350. 7: null,
  351. };
  352. this.imageSize = tempTitle[this.form.type];
  353. },
  354. onVideoComfirm (formName) {
  355. this.$refs[formName].validate(valid => {
  356. if (valid) {
  357. let dialogForm = this.dialogForm;
  358. // 获取富文本组件实例
  359. let quill = this.editor;
  360. // 插入图片,res为服务器返回的图片链接地址
  361. const params = {
  362. poster: dialogForm.poster,
  363. url: this.formRadio == 1 ? dialogForm.url : dialogForm.videoUrl
  364. }
  365. quill.insertEmbed(this.editorIndex, "video", params);
  366. // 调整光标到最后
  367. quill.setSelection(this.editorIndex + 1);
  368. this.dialogFormVisible = false;
  369. this.dialogForm = {
  370. poster: null,
  371. url: null,
  372. videoUrl: null
  373. };
  374. } else {
  375. return false;
  376. }
  377. });
  378. },
  379. addQuillTitle () {
  380. const oToolBar = document.querySelector(".ql-toolbar"),
  381. aButton = oToolBar.querySelectorAll("button"),
  382. aSelect = oToolBar.querySelectorAll("select");
  383. aButton.forEach(function (item) {
  384. if (item.className === "ql-script") {
  385. item.value === "sub" ? (item.title = "下标") : (item.title = "上标");
  386. } else if (item.className === "ql-indent") {
  387. item.value === "+1"
  388. ? (item.title = "向右缩进")
  389. : (item.title = "向左缩进");
  390. } else {
  391. item.title = titleConfig[item.classList[0]];
  392. }
  393. });
  394. aSelect.forEach(function (item) {
  395. item.parentNode.title = titleConfig[item.classList[0]];
  396. });
  397. },
  398. onSubmit (formName) {
  399. this.$refs[formName].validate(valid => {
  400. if (valid) {
  401. if (this.pageType == "create") {
  402. if (this.form.id) {
  403. // 判断有没有Id,如果有则删除
  404. delete this.form.id;
  405. }
  406. // return false
  407. newsAdd(this.form).then(res => {
  408. this.messageTips("添加", res);
  409. });
  410. } else if (this.pageType == "update") {
  411. newsUpdate(this.form).then(res => {
  412. this.messageTips("修改", res);
  413. });
  414. }
  415. } else {
  416. return false;
  417. }
  418. });
  419. },
  420. messageTips (title, res) {
  421. if (res.code == 200) {
  422. this.$message.success(title + "成功");
  423. this.$router.push({
  424. path: "/contentManager/contentManager",
  425. query: {
  426. type: this.typeIndex(this.type)
  427. }
  428. });
  429. } else {
  430. this.$message.error(res.msg);
  431. }
  432. },
  433. onCancel () {
  434. this.$router.push({
  435. path: "/contentManager/contentManager",
  436. query: {
  437. type: this.typeIndex(this.type)
  438. }
  439. });
  440. },
  441. handleSuccess (res) {
  442. // 获取富文本组件实例
  443. let quill = this.editor;
  444. // 如果上传成功
  445. if (res.code) {
  446. // 获取光标所在位置
  447. let length = quill.getSelection().index;
  448. // 插入图片,res为服务器返回的图片链接地址
  449. quill.insertEmbed(length, "image", res.data.url);
  450. // 调整光标到最后
  451. quill.setSelection(length + 1);
  452. } else {
  453. // 提示信息,需引入Message
  454. this.$message.error("图片插入失败");
  455. }
  456. },
  457. onReSet (formName) {
  458. this.$refs[formName].resetFields();
  459. },
  460. onLook() {
  461. // 预览
  462. let dataInfo = this.dataInfo
  463. dataInfo.title = this.form.title
  464. dataInfo.content = this.form.content
  465. // 处理图片显示问题
  466. setTimeout(() => {
  467. let imgNode = document.querySelectorAll(".msgWrap img");
  468. if (imgNode.length > 0) {
  469. imgNode.forEach(item => {
  470. item.style.width = "100%";
  471. });
  472. }
  473. let videoNode = document.querySelectorAll(".msgWrap .ql-video");
  474. if (videoNode.length > 0) {
  475. videoNode.forEach(item => {
  476. item.style.width = "100%";
  477. item.style.height = "195px";
  478. });
  479. }
  480. }, 500);
  481. this.lookVisible = true
  482. },
  483. getList () {
  484. if (this.pageType == "create") {
  485. return;
  486. } else {
  487. newsQueryId({ id: this.$route.query.id }).then(res => {
  488. if (res.code == 200) {
  489. let result = res.data;
  490. let form = this.form;
  491. this.form = {
  492. id: result.id,
  493. title: result.title,
  494. order: result.order,
  495. coverImage: result.coverImage,
  496. linkUrl: result.linkUrl,
  497. type: result.type,
  498. status: result.status,
  499. memo: result.memo,
  500. content: result.content,
  501. tenantId: result.tenantId.toString()
  502. };
  503. this.dataInfo.updateTime = result.updateTime
  504. }
  505. });
  506. }
  507. },
  508. handleAvatarSuccess (res, file) {
  509. this.form.coverImage = res.data.url;
  510. },
  511. beforeAvatarUpload (file) {
  512. const imageType = {
  513. "image/png": true,
  514. "image/jpeg": true
  515. };
  516. const isImage = imageType[file.type];
  517. const isLt2M = file.size / 1024 / 1024 < 2;
  518. if (!isImage) {
  519. this.$message.error("只能上传图片格式!");
  520. }
  521. if (!isLt2M) {
  522. this.$message.error("上传头像图片大小不能超过 2MB!");
  523. }
  524. return isImage && isLt2M;
  525. },
  526. typeChange (type) {
  527. let tempTitle = {
  528. 1: "精彩活动",
  529. 2: "热门资讯",
  530. 4: "专项训练",
  531. 5: "闪页管理",
  532. 3: "BANNER管理",
  533. 6: "APP按钮管理",
  534. 7: "知识库管理"
  535. };
  536. return tempTitle[type];
  537. },
  538. typeCheck(type) {
  539. // 精彩活动 1 0
  540. // 热门资讯 2 1
  541. // 专项训练 4 2
  542. // 闪页管理 5 3
  543. // BANNER管理 3 4
  544. // APP按钮管理 6 5
  545. // 知识库 7 5
  546. let params = {
  547. 1: '精彩活动',
  548. 2: '热门资讯',
  549. 4: '专项训练',
  550. 7: '知识库'
  551. }
  552. return params[type] ? params[type] : '大雅乐盟'
  553. },
  554. typeIndex (type) {
  555. let tempTitle = {
  556. 1: 0,
  557. 2: 1,
  558. 3: 4,
  559. 4: 2,
  560. 5: 3,
  561. 6: 5
  562. };
  563. return tempTitle[type];
  564. },
  565. onEditorChange ({ quill, html, text }) {
  566. this.form.content = html;
  567. },
  568. beforeUpload(file) {
  569. // const isJPG = file.type === 'image/jpeg';
  570. const isLt2M = file.size / 1024 / 1024 < 100;
  571. // if (!isJPG) {
  572. // this.$message.error('上传头像图片只能是 JPG 格式!');
  573. // }
  574. if (!isLt2M) {
  575. this.$message.error('上传视屏大小不能超过 100MB!');
  576. }
  577. this.uploadLoading = true
  578. return isLt2M;
  579. },
  580. handleUploadError(file) {
  581. this.uploadLoading = false
  582. this.$message.error('上传视屏失败')
  583. },
  584. handleUploadSuccess(file, fileList) {
  585. this.uploadLoading = false
  586. this.$message.success('上传视屏成功')
  587. console.log(file, fileList)
  588. this.dialogForm.videoUrl = file.data.url;
  589. },
  590. handleExceed(files, fileList) {
  591. this.$message.error('您已上传过视屏')
  592. // this.$message.warning(`当前限制选择 1 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`);
  593. }
  594. },
  595. computed: {
  596. editor () {
  597. return this.$refs.myQuillEditor.quill;
  598. }
  599. }
  600. };
  601. </script>
  602. <style lang="scss" scoped>
  603. .m-container {
  604. min-width: 100%;
  605. }
  606. .el-input {
  607. width: 400px;
  608. }
  609. /deep/.ql-editor {
  610. min-height: 300px;
  611. padding: 0;
  612. }
  613. /deep/.ql-container .ql-editor {
  614. max-height: 500px;
  615. }
  616. .el-button--primary {
  617. background: #14928a;
  618. border-color: #14928a;
  619. color: #fff;
  620. &:hover,
  621. &:active,
  622. &:focus {
  623. background: #14928a;
  624. border-color: #14928a;
  625. color: #fff;
  626. }
  627. }
  628. .el-row {
  629. margin-top: 40px;
  630. }
  631. .el-col {
  632. display: flex;
  633. align-items: center;
  634. margin-bottom: 20px;
  635. justify-content: flex-end;
  636. margin-right: 50%;
  637. }
  638. .el-input-group {
  639. width: 200px;
  640. margin: 0 20px;
  641. }
  642. /deep/.el-tree-node__content {
  643. height: 40px !important;
  644. }
  645. /deep/.avatar-uploader .el-upload, /deep/.upload-demo .el-upload {
  646. border-radius: 6px;
  647. cursor: pointer;
  648. position: relative;
  649. overflow: hidden;
  650. }
  651. .avatar-uploader .el-upload:hover {
  652. border-color: #409eff;
  653. }
  654. .avatar-uploader-icon {
  655. border: 1px dashed #d9d9d9;
  656. font-size: 28px;
  657. color: #8c939d;
  658. width: 120px;
  659. height: 120px;
  660. line-height: 120px;
  661. text-align: center;
  662. }
  663. .avatar {
  664. width: 120px;
  665. height: 120px;
  666. display: block;
  667. }
  668. .ivu-upload {
  669. display: none;
  670. }
  671. .sd-container {
  672. // padding: 15px;
  673. h2 {
  674. height: auto;
  675. font-weight: 500;
  676. color: rgba(68, 68, 68, 1);
  677. line-height: 37px;
  678. font-size: 26px;
  679. margin-bottom: 10px;
  680. }
  681. .titleInfo {
  682. height: 15px;
  683. line-height: 15px;
  684. display: flex;
  685. flex-direction: row;
  686. justify-content: space-between;
  687. color: #444;
  688. margin-bottom: 25px;
  689. }
  690. .imgWrap {
  691. /* width: 100;
  692. height: 1.45rem; */
  693. margin-bottom: 0.15rem;
  694. p {
  695. font-size: 0.16rem;
  696. font-family: PingFangSC;
  697. font-weight: 400;
  698. color: rgba(68, 68, 68, 1);
  699. line-height: 0.28rem;
  700. text-indent: 0.32rem;
  701. }
  702. img {
  703. width: 100%;
  704. }
  705. }
  706. }
  707. </style>