newsInfo-detail.vue 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. <style scoped>
  2. .user-panel {
  3. margin: 10px auto;
  4. }
  5. </style>
  6. <template>
  7. <el-dialog
  8. :visible.sync="showDialog"
  9. :title="title"
  10. :modal-append-to-body="false"
  11. style="text-align: left"
  12. :width="'800px'"
  13. @close="closeDialog"
  14. :close-on-click-modal="false"
  15. >
  16. <div class="user-panel" v-loading="loading">
  17. <el-form
  18. ref="form"
  19. :model="formModel"
  20. :rules="ruleValidate"
  21. :label-width="'100px'"
  22. :inline="true"
  23. >
  24. <el-row>
  25. <el-form-item label="企业" prop="companyId">
  26. <el-select
  27. v-model="formModel.companyId"
  28. filterable
  29. placeholder="请选择"
  30. style="width: 90%"
  31. :filter-method="filterMethod"
  32. >
  33. <el-option
  34. v-for="company in companyInfoList"
  35. :key="company.id"
  36. :label="company.companyName"
  37. :value="company.id"
  38. ></el-option>
  39. </el-select>
  40. </el-form-item>
  41. </el-row>
  42. <el-row>
  43. <el-form-item label="新闻类型" prop="newsTypeId">
  44. <el-select-tree
  45. :props="props"
  46. :options="newsTypeList"
  47. v-model="formModel.newsTypeId"
  48. size=""
  49. height="200"
  50. ></el-select-tree>
  51. </el-form-item>
  52. </el-row>
  53. <el-row>
  54. <el-form-item label="标题" prop="title">
  55. <el-input
  56. v-model="formModel.title"
  57. placeholder="请输入标题"
  58. style="width: 300px"
  59. ></el-input>
  60. </el-form-item>
  61. </el-row>
  62. <el-row>
  63. <el-form-item label="图片" prop="picUrl">
  64. <el-upload
  65. class="avatar-uploader"
  66. name="photoFile"
  67. :action="uploadImgUrl"
  68. :show-file-list="false"
  69. :headers="headers"
  70. :data="uploadData"
  71. :on-success="handleAvatarSuccess"
  72. :before-upload="beforeAvatarUpload"
  73. accept="image/png,image/jpeg"
  74. >
  75. <img v-if="fileUrl" :src="fileUrl" class="avatar" />
  76. <i v-else class="el-icon-plus avatar-uploader-icon"></i>
  77. </el-upload>
  78. </el-form-item>
  79. </el-row>
  80. <el-row>
  81. <el-form-item label="内容" prop="content">
  82. <mce-editor
  83. ref="editor"
  84. uploadName="upfile"
  85. v-model="formModel.content"
  86. :url="uploadUrl"
  87. :config="editorConfig"
  88. ></mce-editor>
  89. </el-form-item>
  90. </el-row>
  91. <el-form-item label="排序号" prop="sortNo">
  92. <el-input-number
  93. v-model="formModel.sortNo"
  94. :min="1"
  95. style="width: 300px"
  96. ></el-input-number>
  97. </el-form-item>
  98. <el-row>
  99. <el-form-item label="是否首页展示(轮播)" prop="topFlag">
  100. <el-radio-group v-model="formModel.topFlag">
  101. <el-radio :label="true">是</el-radio>
  102. <el-radio :label="false">否</el-radio>
  103. </el-radio-group>
  104. </el-form-item>
  105. </el-row>
  106. </el-form>
  107. </div>
  108. <span slot="footer" class="dialog-footer">
  109. <el-button @click="closeDialog">取 消</el-button>
  110. <el-button type="primary" @click="handleSubmit" :loading="submitting"
  111. >确 定</el-button
  112. >
  113. </span>
  114. </el-dialog>
  115. </template>
  116. <script>
  117. import Constant from "@/constant";
  118. import newsInfoApi from "@/api/base/newsInfo";
  119. import newsTypeApi from "@/api/base/newsType";
  120. import companyInfoApi from "@/api/base/companyInfo";
  121. import SelectTree from "@/components/SelectTree";
  122. import MceEditor from "@/components/Tinymce";
  123. import { getToken } from "@/utils/auth";
  124. export default {
  125. props: ["businessKey", "title"],
  126. components: {
  127. "mce-editor": MceEditor,
  128. "el-select-tree": SelectTree,
  129. },
  130. data() {
  131. return {
  132. formModel: {},
  133. ruleValidate: {
  134. companyId: [{ required: true, message: "请选择", trigger: "blur" }],
  135. newsTypeId: [{ required: true, message: "请选择", trigger: "blur" }],
  136. title: [{ required: true, message: "不能为空", trigger: "blur" }],
  137. sortNo:[
  138. { required: true, message: "不能为空", trigger: "blur" },
  139. ]
  140. },
  141. showDialog: true,
  142. loading: false,
  143. submitting: false,
  144. editorConfig: {
  145. height: 500,
  146. width: 600,
  147. },
  148. uploadUrl: Constant.serverUrl + "/tinymce/upload?token=" + getToken(),
  149. newsInfoList: [],
  150. newsTypeList: [],
  151. props: {
  152. // 配置项(必选)
  153. value: "id",
  154. label: "name",
  155. },
  156. companyInfoList: [],
  157. //上传图片start
  158. uploadImgUrl: Constant.serverUrl + "/uploadPicture",
  159. uploadData: {
  160. subFolder: "newsInfo",
  161. },
  162. fileUrl: "",
  163. headers: {
  164. Authorization: getToken(),
  165. },
  166. //上传图片end
  167. };
  168. },
  169. created() {
  170. var self = this;
  171. newsTypeApi.list().then(function (response) {
  172. var jsonData = response.data;
  173. if (jsonData.result) {
  174. if (jsonData.data != null && jsonData.data != "") {
  175. self.newsTypeList = jsonData.data;
  176. }
  177. }
  178. });
  179. },
  180. methods: {
  181. closeDialog() {
  182. this.$emit("close", false);
  183. },
  184. handleSubmit() {
  185. var self = this;
  186. this.$refs["form"].validate((valid) => {
  187. if (valid) {
  188. (function () {
  189. var id = self.formModel.id;
  190. self.formModel.content = self.$refs.editor.getContent();
  191. if (id == null || id.length == 0) {
  192. return newsInfoApi.add(self.formModel);
  193. } else {
  194. return newsInfoApi.update(self.formModel);
  195. }
  196. })().then(function (response) {
  197. var jsonData = response.data;
  198. if (jsonData.result) {
  199. self.$message({
  200. message: "保存成功!",
  201. type: "success",
  202. });
  203. self.$emit("close", true);
  204. } else {
  205. self.$message({
  206. message: jsonData.message + "",
  207. type: "warning",
  208. });
  209. self.$emit("close", false);
  210. }
  211. });
  212. }
  213. });
  214. },
  215. filterMethod(query, item) {
  216. var self = this;
  217. var formData = new FormData();
  218. formData.append("pageSize", 5);
  219. formData.append("companyName", query);
  220. companyInfoApi.list(formData).then(function (response) {
  221. var jsonData = response.data;
  222. if (jsonData.result) {
  223. self.companyInfoList = jsonData.data;
  224. }
  225. });
  226. },
  227. handleAvatarSuccess(res, file) {
  228. this.loading = false;
  229. var self = this;
  230. self.formModel.picUrl = res.data;
  231. self.fileUrl = res.data + "?x-oss-process=image/resize,m_lfit,w_200";
  232. },
  233. beforeAvatarUpload(file) {
  234. this.loading = true;
  235. // const isJPG = file.type === "image/jpeg";
  236. const isLt2M = file.size / 1024 / 1024 < 2;
  237. // if (!isJPG) {
  238. // this.$message.error("上传图片只能是 JPG 格式!");
  239. // }
  240. if (!isLt2M) {
  241. this.$message.error("上传图片大小不能超过 2MB!");
  242. }
  243. return isLt2M;
  244. },
  245. },
  246. mounted: function () {
  247. var self = this;
  248. (function () {
  249. if (self.businessKey.length == 0) {
  250. return newsInfoApi.create();
  251. } else {
  252. return newsInfoApi.edit(self.businessKey);
  253. }
  254. })()
  255. .then((response) => {
  256. var jsonData = response.data;
  257. self.loading = false;
  258. if (jsonData.result) {
  259. self.formModel = jsonData.data;
  260. if (self.formModel.content != null) {
  261. self.$refs.editor.setContent(self.formModel.content);
  262. }
  263. if (self.formModel.topFlag != null) {
  264. self.formModel.topFlag = false;
  265. }
  266. if (self.formModel.companyName != null) {
  267. var formData = new FormData();
  268. formData.append("pageSize", 5);
  269. formData.append("companyName", self.formModel.companyName);
  270. companyInfoApi.list(formData).then(function (response) {
  271. var jsonData = response.data;
  272. if (jsonData.result) {
  273. self.companyInfoList = jsonData.data;
  274. }
  275. });
  276. }
  277. let picUrl = self.formModel.picUrl;
  278. if (picUrl != null) {
  279. self.fileUrl =
  280. picUrl +
  281. "?x-oss-process=image/resize,m_lfit,w_200";
  282. }
  283. } else {
  284. self.$message.error(jsonData.message + "");
  285. }
  286. })
  287. .catch((error) => {
  288. self.$message.error(error + "");
  289. });
  290. },
  291. };
  292. </script>