AddArticle.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388
  1. <style lang="scss" scoped>
  2. .preview {
  3. .aname{
  4. text-align: center;
  5. margin-bottom: 20px;
  6. color: #333;
  7. font-size: 16px;
  8. }
  9. .ainfo{
  10. display: flex;
  11. margin-bottom: 10px;
  12. p{
  13. width: 60%;
  14. margin-left: 15px;
  15. line-height: 26px;
  16. }
  17. }
  18. b{
  19. color: #333;
  20. }
  21. div{
  22. line-height: 26px;
  23. margin-bottom: 10px;
  24. overflow: auto;
  25. }
  26. }
  27. .content .title {
  28. height: 32px;
  29. font-size: 14px;
  30. font-weight: bold;
  31. color: #333333;
  32. border-bottom: 1px solid #d8d8d8;
  33. margin-bottom: 25px;
  34. }
  35. .el-form {
  36. font-size: 14px;
  37. font-weight: 400;
  38. color: #666666;
  39. .el-select,
  40. .el-range-editor--small.el-input__inner {
  41. width: 100%;
  42. }
  43. }
  44. /deep/.el-tabs__header {
  45. margin: 0;
  46. .el-tabs__active-bar {
  47. height: 0px;
  48. }
  49. .el-tabs__item {
  50. width: 160px;
  51. height: 40px;
  52. text-align: center;
  53. border-radius: 8px 8px 0px 0px;
  54. color: #333333;
  55. background: #ececec;
  56. margin-right: 10px;
  57. }
  58. .el-tabs__item.is-active {
  59. background: #3895fe;
  60. color: #ffffff;
  61. }
  62. }
  63. .el-button {
  64. width: 120px;
  65. height: 36px;
  66. }
  67. // 上传
  68. /deep/.avatar-uploader .el-upload {
  69. width: 148px;
  70. height: 148px;
  71. line-height: 148px;
  72. border: 1px dashed #d9d9d9;
  73. border-radius: 6px;
  74. cursor: pointer;
  75. position: relative;
  76. overflow: hidden;
  77. .avatar {
  78. width: 100%;
  79. height: 100%;
  80. }
  81. }
  82. .avatar-uploader .el-upload:hover {
  83. border-color: #409eff;
  84. }
  85. .avatar-uploader-icon {
  86. font-size: 28px;
  87. color: #8c939d;
  88. width: 68px;
  89. height: 68px;
  90. line-height: 68px;
  91. text-align: center;
  92. }
  93. .avatar {
  94. width: 68px;
  95. height: 68px;
  96. display: block;
  97. }
  98. /deep/.speaker_avatar .el-upload {
  99. width: 80px;
  100. height: 80px;
  101. line-height: 80px;
  102. }
  103. .hotel_imgs {
  104. /deep/.el-upload--picture-card {
  105. width: 79px;
  106. height: 79px;
  107. line-height: 79px;
  108. }
  109. }
  110. </style>
  111. <template>
  112. <section>
  113. <p><span>会议管理></span>新增文章</p>
  114. <div class="content" v-loading='loading' element-loading-background="rgba(0, 0, 0, 0)">
  115. <!-- <div class="title">新增会议</div> -->
  116. <el-form
  117. ref="form"
  118. size="small"
  119. label-width="140px"
  120. class="over_y"
  121. :model="form"
  122. :rules="rules"
  123. >
  124. <el-form-item label="文章名称:" prop="name">
  125. <el-input
  126. placeholder="请输入文章名称"
  127. v-model="form.name"
  128. clearable
  129. ></el-input>
  130. </el-form-item>
  131. <el-row>
  132. <el-col :span="10">
  133. <el-form-item label="文章来源:" prop="journal_id">
  134. <el-select :disabled='disabled'
  135. placeholder="请选择"
  136. v-model="form.journal_id"
  137. filterable
  138. >
  139. <el-option
  140. v-for="(item, index) in journalList"
  141. :key="index"
  142. :label="item.name"
  143. :value="item.id"
  144. ></el-option>
  145. </el-select>
  146. </el-form-item>
  147. </el-col>
  148. <el-col :span="6">
  149. <el-form-item label="作者:" prop="author">
  150. <el-input v-model="form.author" placeholder=""> </el-input>
  151. </el-form-item>
  152. </el-col>
  153. <el-col :span="8" >
  154. <el-form-item label="出版时间:" prop="publish_time">
  155. <el-date-picker
  156. v-model="form.publish_time"
  157. type="date"
  158. value-format="yyyy-MM-dd"
  159. range-separator="至"
  160. start-placeholder="开始日期"
  161. end-placeholder="结束日期"
  162. >
  163. </el-date-picker>
  164. </el-form-item>
  165. </el-col>
  166. </el-row>
  167. <el-form-item label="文章简介:">
  168. <el-input
  169. type="textarea"
  170. v-model="form.desc"
  171. :rows="3"
  172. placeholder="请输入文章简介"
  173. ></el-input>
  174. </el-form-item>
  175. <el-form-item label="封面图:" prop="img">
  176. <el-upload
  177. class="avatar-uploader"
  178. action="/api/admin/uploadfile"
  179. :show-file-list="false"
  180. :on-progress='handleAvatarProgress'
  181. :on-success="handleAvatarSuccess"
  182. >
  183. <img v-if="form.img" :src="form.img" class="avatar" />
  184. <i v-else class="el-icon-plus avatar-uploader-icon"></i>
  185. </el-upload>
  186. <span style="font-size: 12px; color: red"
  187. >建议图片尺寸为:210*160, 图片大小请控制在2M以内!</span
  188. >
  189. </el-form-item>
  190. <el-form-item label="文章详情:">
  191. <!-- <fuEditor :value="form.content" ref="editor"></fuEditor> -->
  192. <vue-ueditor-wrap ref="editor" v-model="form.content" :config="myConfig"></vue-ueditor-wrap>
  193. </el-form-item>
  194. <el-form-item style="position: fixed; bottom: 20px; right: 60px">
  195. <el-button type="primary" @click="view">预览</el-button>
  196. <el-button type="success" @click="save(2)">发布</el-button>
  197. <!-- <el-button type="default" @click="save(1)">保存</el-button> -->
  198. <el-button type='info' plain @click="$router.go(-1)">返回</el-button>
  199. <!-- <el-button type="danger" plain>删除</el-button> -->
  200. </el-form-item>
  201. </el-form>
  202. </div>
  203. <el-dialog
  204. title=""
  205. :visible.sync="open"
  206. width="414px">
  207. <div class="preview">
  208. <p class="aname">{{form.name}}</p>
  209. <div class="ainfo">
  210. <img width="100" :src="form.img" alt="">
  211. <p>
  212. 发布单位:{{journal_name}} <br>
  213. 作者:{{form.author}} <br>
  214. 发表时间:{{form.publish_time}}
  215. </p>
  216. </div>
  217. <b>文章简介</b>
  218. <div class="adesc">{{form.desc}}</div>
  219. <b>文章内容</b>
  220. <div v-html="form.content"></div>
  221. </div>
  222. <!-- <span slot="footer" class="dialog-footer">
  223. <el-button type="primary" @click="open = false">确 定</el-button>
  224. </span> -->
  225. </el-dialog>
  226. </section>
  227. </template>
  228. <script>
  229. export default {
  230. components: {
  231. },
  232. data() {
  233. return {
  234. // msg: '<h2>Vue + UEditor + v-model双向绑定</h2>',
  235. myConfig: {
  236. // 编辑器自动被内容撑高
  237. autoHeightEnabled: true,
  238. // 初始容器高度
  239. initialFrameHeight: 500,
  240. // 初始容器宽度
  241. initialFrameWidth: '100%',
  242. // 上传文件接口,实现上传图片功能必须的配置,这个地址会在后端配置的时候产生,此处先放上结果
  243. serverUrl: '/api/admin/ueditor/upload',
  244. },
  245. form: {},
  246. journalList: [],
  247. journal_name:'',
  248. imageUrl: "",
  249. open:false,
  250. loading:false,
  251. rules: {
  252. name: [{ required: true, message: "请输入标题", trigger: "blur" }],
  253. journal_id: [
  254. { required: true, message: "请选择来源", trigger: "change" },
  255. ],
  256. author: [{ required: true, message: "请选择模板", trigger: "blur" }],
  257. publish_time: [
  258. { required: true, message: "发布时间", trigger: "blur" },
  259. ],
  260. img: [{ required: true, message: "封面图", trigger: "blur" }],
  261. },
  262. disabled:false
  263. };
  264. },
  265. methods: {
  266. //封面
  267. handleAvatarProgress(){
  268. this.loading=true
  269. },
  270. handleAvatarSuccess(res, file) {
  271. // this.form.img = file.response.data;
  272. this.$set(this.form,'img',file.response.data)
  273. this.loading=false
  274. },
  275. //主讲人
  276. handleAvatarSuccess1(index, res, file) {
  277. var speaker = this.form.speaker[index];
  278. speaker.img = file.response.data;
  279. this.$set(this.form.speaker, index, speaker);
  280. // console.log(this.form.img)
  281. },
  282. beforeAvatarUpload() {},
  283. handleClick() {},
  284. addSpeaker() {
  285. this.form.speaker.push({ name: "", intruduce: "" });
  286. },
  287. gopage(size) {
  288. if (size) {
  289. this.form.page_size = size;
  290. }
  291. this.form.page = this.$refs.pageButton.page;
  292. this.getData();
  293. },
  294. getData() {
  295. this.$api.searchJournalList().then((res) => {
  296. this.journalList = res.data.data;
  297. });
  298. let id = this.$route.query.id;
  299. if (id) {
  300. this.loading = true;
  301. this.$api.getArticle({ id: id }).then((res) => {
  302. this.form = res.data.data;
  303. this.loading = false;
  304. });
  305. }
  306. },
  307. /**预览 */
  308. view(){
  309. // console.log(this.$refs.editor)
  310. var content=this.$refs.editor.innerValue
  311. this.form.content=content;
  312. let journal=this.journalList.filter(item=>item.id == this.form.journal_id)
  313. if(journal.length>0){
  314. this.journal_name=journal[0].name
  315. }
  316. this.open=true;
  317. },
  318. save(status) {
  319. let id = this.$route.query.id;
  320. let parm = this.form;
  321. parm.status=status
  322. var content=this.$refs.editor.innerValue
  323. parm.content=content;
  324. this.$refs["form"].validate((valid) => {
  325. if (valid) {
  326. if (id) {
  327. parm.id = id;
  328. this.$api.updateArticle(parm).then((res) => {
  329. if (res.data.code == 0) {
  330. this.$message({
  331. type: "success",
  332. message: status==1?"保存成功!":"发布成功!",
  333. });
  334. this.$router.go(-1)
  335. } else {
  336. this.$message.error(status==1?"保存失败!":"发布失败!");
  337. }
  338. });
  339. } else {
  340. this.$api.addArticle(parm).then((res) => {
  341. if (res.data.code == 0) {
  342. this.$message({
  343. type: "success",
  344. message: status==1?"保存成功!":"发布成功!",
  345. });
  346. this.$router.go(-1)
  347. } else {
  348. this.$message.error(status==1?"保存失败!":"发布失败!");
  349. }
  350. });
  351. }
  352. } else {
  353. this.$message.error("有必填项没有填!");
  354. }
  355. });
  356. },
  357. del(id) {
  358. this.$confirm("确定删除吗", "提示", {
  359. type: "warning",
  360. }).then(() => {
  361. this.$api.deleteEnterprise({ id: id }).then((res) => {
  362. this.$message({
  363. message: "删除成功",
  364. type: "success",
  365. });
  366. this.getData();
  367. });
  368. });
  369. },
  370. },
  371. created() {
  372. if(this.$route.query.jid){
  373. this.form.journal_id=Number(this.$route.query.jid)
  374. this.disabled=true
  375. }
  376. this.getData();
  377. },
  378. };
  379. </script>