index.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. <template>
  2. <div class="admin-NewsConfig">
  3. <!-- 按钮组合 -->
  4. <div class="my-Config-top">
  5. <el-button size="medium" type="primary" @click="back">返回</el-button>
  6. </div>
  7. <div class="my-Config-content">
  8. <el-form :model="configData" :rules="configRules" ref="News" label-width="110px"
  9. class="my-Config-content-form">
  10. <el-form-item label="标题:" prop="title">
  11. <el-input type="textarea" v-model="configData.title" placeholder="请输入标题"></el-input>
  12. </el-form-item>
  13. <el-form-item label="关键字:" prop="keyword">
  14. <el-input v-model="configData.keyword" placeholder="请输入关键字"></el-input>
  15. </el-form-item>
  16. <el-form-item prop="startTime" label="开始时间:" porp="startTime">
  17. <div>
  18. <el-date-picker
  19. class="my-form-width"
  20. type="date"
  21. format="yyyy-MM-dd"
  22. value-format="yyyy-MM-dd"
  23. placeholder="选择日期"
  24. v-model="configData.startTime"
  25. style="width: 100%;"></el-date-picker>
  26. </div>
  27. </el-form-item>
  28. <el-form-item label="访问次数:" prop="visits">
  29. <el-input placeholder="请输入访问次数" v-model="configData.visits"></el-input>
  30. </el-form-item>
  31. <el-form-item label="新闻分类:" prop="newsClassifyId">
  32. <mySelect label="name"
  33. id="newsClassifyId"
  34. @select-change="handleSelectDoChange"
  35. placeholder="请选择新闻分类"></mySelect>
  36. </el-form-item>
  37. <el-form-item label="图片:" prop="pic">
  38. <upload-file :imageUrl="configData.pic"
  39. :showBtnFlag="false"
  40. @getFileUrl="getImageUrl"></upload-file>
  41. <h5 class="picture-size-h5">(最佳尺寸为400*400像素)</h5>
  42. </el-form-item>
  43. <el-form-item label="描述:" prop="intro">
  44. <el-input type="textarea" placeholder="请输入描述" :rows="6"
  45. v-model="configData.intro"></el-input>
  46. </el-form-item>
  47. </el-form>
  48. <div class="my-Config-editor">
  49. <mta-st-quill-editor
  50. class="admin-quill-editor"
  51. ref="editorQuill"
  52. :value="configData.content"
  53. quillEditorRef="quillEditorRef1"
  54. flg="1"
  55. @syncValue="syncValue" />
  56. </div>
  57. </div>
  58. <div class="my-Config-bottom">
  59. <el-button
  60. v-if="queryData && queryData.code === 'add'"
  61. type="primary"
  62. size="medium"
  63. @click="handleAdd('News')"
  64. >新增
  65. </el-button>
  66. <div v-else>
  67. <el-button size="medium" type="primary" @click="handleSave('News')">保存</el-button>
  68. <el-button size="medium" type="primary" @click="back">关闭</el-button>
  69. </div>
  70. </div>
  71. </div>
  72. </template>
  73. <script>
  74. import uploadFile from '@/components/Admin/Common/uploadFile';
  75. import MtaStQuillEditor from '@/components/management/QuillEditor.vue';
  76. import mySelect from '../components/Select';
  77. import * as commonTools from '@/utils/admin/tools';
  78. import * as HYZXService from '@/api/news';
  79. import * as NewsClassifyApi from '@/api/newsClassify';
  80. import Vue from 'vue';
  81. const selectData = {
  82. options: [],
  83. newsClassifyId: null,
  84. placeholder: '请选择新闻资讯分类',
  85. };
  86. let selectServiceData = Vue.observable(selectData);
  87. export default {
  88. name: 'NewsConfig',
  89. components: {
  90. uploadFile,
  91. MtaStQuillEditor,
  92. mySelect,
  93. },
  94. provide: {
  95. selectServiceData: selectServiceData,
  96. },
  97. computed: {
  98. newsClassifyId() {
  99. return selectServiceData.newsClassifyId;
  100. },
  101. },
  102. data() {
  103. return {
  104. defaultValue: new Date(),
  105. configData: {
  106. content: '',
  107. intro: '',
  108. pic: '',
  109. startTime: '',
  110. newsClassifyId: '',
  111. title: '',
  112. visits: '',
  113. keyword: '',
  114. },
  115. configRules: {
  116. title: [
  117. { required: true, message: '标题不能为空', trigger: 'blur' },
  118. ],
  119. keyword: [
  120. { required: true, message: '关键字不能为空', trigger: 'blur' },
  121. ],
  122. startTime: [
  123. { required: true, message: '开始时间不能为空', trigger: 'blur' },
  124. ],
  125. intro: [
  126. { required: true, message: '描述不能为空', trigger: 'blur' },
  127. ],
  128. pic: [
  129. { required: true, message: '图片不能为空', trigger: 'blur' },
  130. ],
  131. visits: [
  132. { required: true, message: '访问次数不能为空', trigger: 'blur' },
  133. ],
  134. content: [
  135. { required: true, message: '行业详情不能为空', trigger: 'blur' },
  136. ],
  137. newsClassifyId: [
  138. { required: true, message: '请选择新闻分类', trigger: 'blur' },
  139. ],
  140. },
  141. queryData: null,
  142. userId: null,
  143. };
  144. },
  145. methods: {
  146. handleSelectDoChange(data) {
  147. console.log('change', data);
  148. this.configData.newsClassifyId = data;
  149. },
  150. back() {
  151. window.history.go(-1);
  152. },
  153. getImageUrl(data) {
  154. this.configData.pic = data;
  155. },
  156. syncValue(flg, content) {
  157. if (flg === '1') {
  158. this.configData.content = content;
  159. }
  160. },
  161. handleSave(formName) {
  162. this.$refs[formName].validate((valid) => {
  163. if (valid) {
  164. this.saveAddNews();
  165. } else {
  166. return false;
  167. }
  168. });
  169. },
  170. handleAdd(formName) {
  171. this.$refs[formName].validate((valid) => {
  172. if (valid) {
  173. this.addAddNews();
  174. } else {
  175. return false;
  176. }
  177. });
  178. },
  179. initPageData(data) {
  180. selectServiceData.newsClassifyId = data.newsClassifyId;
  181. this.configData.newsClassifyId = data.newsClassifyId;
  182. this.$refs.editorQuill.setContent(data.content);
  183. this.configData.intro = data.intro;
  184. this.configData.pic = data.pic;
  185. this.configData.startTime = data.startTime;
  186. this.configData.title = data.title;
  187. this.configData.visits = data.visits;
  188. this.configData.keyword = data.keyword;
  189. },
  190. async recoverPage() {
  191. const opt = {
  192. iiId: this.queryData.iiId,
  193. };
  194. const loading = this.$loading({ background: 'rgba(0, 0, 0, 0.7)' });
  195. try {
  196. // 新闻资讯分类
  197. const { data: newsClassifyArr } = await NewsClassifyApi.getNewsClassifySearch();
  198. selectServiceData.options = newsClassifyArr;
  199. const res = await HYZXService.getNewsInfo(opt);
  200. if (res.code === 0) {
  201. this.initPageData(res.data);
  202. }
  203. loading.close();
  204. } catch (err) {
  205. loading.close();
  206. }
  207. },
  208. async addAddNews() {
  209. const loading = this.$loading({ background: 'rgba(0, 0, 0, 0.7)' });
  210. try {
  211. const res = await this.handleAddNews();
  212. loading.close();
  213. if (res.code === 0 && res.data) {
  214. this.$message.success('新增成功');
  215. this.back();
  216. }
  217. } catch (e) {
  218. loading.close();
  219. }
  220. },
  221. async saveAddNews() {
  222. const loading = this.$loading({ background: 'rgba(0, 0, 0, 0.7)' });
  223. try {
  224. const res = await this.handleSaveNews();
  225. loading.close();
  226. if (res.code === 0 && res.data) {
  227. this.$message.success('保存成功');
  228. this.back();
  229. }
  230. } catch (e) {
  231. loading.close();
  232. }
  233. },
  234. getOptions() {
  235. return Object.assign({}, this.configData, { userId: this.userId });
  236. },
  237. handleAddNews() {
  238. const opt = this.getOptions();
  239. return HYZXService.getNewsAdd(opt);
  240. },
  241. handleSaveNews() {
  242. const opt = this.getOptions();
  243. const newOpt = Object.assign(opt, { iiId: this.queryData.iiId });
  244. return HYZXService.getNewsUpdate(newOpt);
  245. },
  246. async initPage() {
  247. // 新闻资讯分类
  248. const loading = this.$loading({ background: 'rgba(0, 0, 0, 0.7)' });
  249. try {
  250. const { data: newsClassifyArr } = await NewsClassifyApi.getNewsClassifySearch();
  251. selectServiceData.options = newsClassifyArr;
  252. loading.close();
  253. } catch (e) {
  254. loading.close();
  255. }
  256. },
  257. clearPageData() {
  258. selectServiceData.options = [];
  259. selectServiceData.newsClassifyId = null;
  260. this.$refs.News.resetFields();
  261. this.$refs.editorQuill.setContent('');
  262. },
  263. },
  264. created() {
  265. this.queryData = this.$route.query;
  266. const userAuth = commonTools.getUserAuth();
  267. this.userId = userAuth && userAuth.userId;
  268. },
  269. mounted() {
  270. if (this.queryData.code === 'editor' && this.queryData.iiId) {
  271. this.recoverPage();
  272. } else {
  273. this.initPage();
  274. }
  275. },
  276. beforeDestroy() {
  277. this.clearPageData();
  278. },
  279. };
  280. </script>
  281. <style lang="scss" scoped>
  282. .admin-NewsConfig {
  283. padding: 20px;
  284. .my-Config-top {
  285. display: flex;
  286. justify-content: flex-end;
  287. margin-bottom: 20px;
  288. }
  289. .my-Config-content {
  290. display: flex;
  291. justify-content: space-between;
  292. &-form {
  293. .form-timer {
  294. .timer-wrap {
  295. display: flex;
  296. flex-direction: row;
  297. }
  298. .line {
  299. margin: 0 5px;
  300. width: 20px;
  301. text-align: center;
  302. box-sizing: border-box;
  303. }
  304. }
  305. .el-form-item:nth-last-child(1) {
  306. margin-bottom: 0;
  307. }
  308. }
  309. .my-Config-editor {
  310. flex: 1;
  311. margin-left: 30px;
  312. .admin-quill-editor {
  313. height: 100%;
  314. ::v-deep .quill-editor {
  315. height: 100%;
  316. display: flex;
  317. flex-direction: column;
  318. background: #FFF;
  319. }
  320. }
  321. }
  322. }
  323. .my-Config-bottom {
  324. margin-top: 20px;
  325. text-align: center;
  326. }
  327. }
  328. </style>