index.vue 14 KB

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