loveProject-detail.vue 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. <template>
  2. <el-dialog
  3. :visible.sync="showDialog"
  4. :title="title"
  5. :modal-append-to-body="false"
  6. style="text-align: left"
  7. @close="closeDialog"
  8. :close-on-click-modal="false"
  9. >
  10. <div class="user-panel" v-loading="loading">
  11. <el-form
  12. ref="form"
  13. :model="formModel"
  14. :rules="ruleValidate"
  15. :label-width="'100px'"
  16. >
  17. <el-form-item label="标题" prop="title">
  18. <el-input
  19. v-model="formModel.title"
  20. placeholder="请输入标题"
  21. style="width: 90%"
  22. ></el-input>
  23. </el-form-item>
  24. <el-form-item label="联系人" prop="contacts">
  25. <el-input
  26. v-model="formModel.contacts"
  27. placeholder="请输入标题"
  28. style="width: 90%"
  29. ></el-input>
  30. </el-form-item>
  31. <el-form-item label="联系电话" prop="contactPhone">
  32. <el-input
  33. v-model="formModel.contactPhone"
  34. placeholder="请输入标题"
  35. style="width: 90%"
  36. ></el-input>
  37. </el-form-item>
  38. <el-form-item label="回馈方式" prop="type">
  39. <el-select v-model="formModel.feedbackMethodArray" multiple filterable placeholder="请选择" style="width: 90%">
  40. <el-option
  41. v-for="item in typeList"
  42. :key="item.id"
  43. :label="item.name"
  44. :value="item.id">
  45. </el-option>
  46. </el-select>
  47. </el-form-item>
  48. <el-form-item label="内容" prop="content">
  49. <mce-editor
  50. ref="editor"
  51. uploadName="upfile"
  52. v-model="formModel.content"
  53. :url="uploadUrl1"
  54. style="width: 90%"
  55. ></mce-editor>
  56. </el-form-item>
  57. <el-form-item label="图片" prop="image">
  58. <el-upload
  59. style="width:300px"
  60. class="avatar-uploader"
  61. name="photoFile"
  62. :action="uploadUrl"
  63. :headers="headers"
  64. :data="uploadData"
  65. :show-file-list="false"
  66. :on-success="handleAvatarSuccess">
  67. <img v-if="fileUrl" :src="fileUrl" class="avatar">
  68. <i v-else class="el-icon-plus avatar-uploader-icon"></i>
  69. </el-upload>
  70. </el-form-item>
  71. </el-form>
  72. </div>
  73. <span slot="footer" class="dialog-footer">
  74. <el-button @click="closeDialog">取 消</el-button>
  75. <el-button type="primary" @click="handleSubmit" :loading="submitting"
  76. >确 定</el-button
  77. >
  78. </span>
  79. </el-dialog>
  80. </template>
  81. <script>
  82. import Constant from "@/constant";
  83. import { getToken } from "@/utils/auth"; // get token from cookie
  84. import MceEditor from "@/components/Tinymce";
  85. import loveProjectApi from "@/api/base/loveProject";
  86. import dataDictionaryApi from "@/api/sys/dataDictionary";
  87. import feedbackMethodApi from "@/api/base/feedbackMethod";
  88. export default {
  89. props: ["businessKey", "title"],
  90. data() {
  91. return {
  92. showPwd: true,
  93. ruleValidate: {
  94. category: [
  95. { required: true, message: "类型不能为空", trigger: "blur" },
  96. ],
  97. title: [
  98. { required: true, message: "标题不能为空", trigger: "blur" },
  99. ],
  100. amount: [
  101. { required: true, message: "数量不能为空", trigger: "blur" },
  102. ],
  103. studentName: [
  104. { required: true, message: "学生姓名不能为空", trigger: "blur" },
  105. ],
  106. studentType: [
  107. { required: true, message: "学生类型不能为空", trigger: "blur" },
  108. ],
  109. },
  110. roleList: [],
  111. formModel: {},
  112. showDialog: true,
  113. loading: false,
  114. submitting: false,
  115. categoryList:[],
  116. typeList:[],
  117. //上传地址
  118. uploadUrl: Constant.serverUrl + "/uploadPicture",
  119. uploadData: {
  120. subFolder: "love-donation",
  121. },
  122. fileUrl: "",
  123. fileUrl1: "",
  124. headers: {
  125. Authorization: getToken(),
  126. },
  127. uploadUrl1: Constant.serverUrl + "/tinymce/upload?token=" + getToken(),
  128. };
  129. },
  130. created() {
  131. dataDictionaryApi.findByCatalogName({catalogName: "心愿类型",})
  132. .then((response) => {
  133. var jsonData = response.data;
  134. this.categoryList = jsonData.data;
  135. });
  136. feedbackMethodApi.list()
  137. .then((response) => {
  138. var jsonData = response.data;
  139. this.typeList = jsonData.data;
  140. });
  141. },
  142. methods: {
  143. closeDialog() {
  144. this.$emit("close", false);
  145. },
  146. handleSubmit() {
  147. var self = this;
  148. this.$refs["form"].validate((valid) => {
  149. if (valid) {
  150. (function () {
  151. var id = self.formModel.id;
  152. if (id == null || id.length == 0) {
  153. return loveProjectApi.add(self.formModel);
  154. } else {
  155. self.formModel.password = null;
  156. return loveProjectApi.update(self.formModel);
  157. }
  158. })().then(function (response) {
  159. var jsonData = response.data;
  160. if (jsonData.result) {
  161. self.$message({
  162. message: "保存成功!",
  163. type: "success",
  164. });
  165. self.$emit("close", true);
  166. } else {
  167. self.$message({
  168. message: jsonData.message + "",
  169. type: "warning",
  170. });
  171. self.$emit("close", false);
  172. }
  173. });
  174. }
  175. });
  176. },
  177. handleAvatarSuccess(res, file) {
  178. var self = this;
  179. self.formModel.image = res.data;
  180. self.fileUrl =
  181. res.data + "?x-oss-process=image/resize,m_lfit,h_300,w_300";
  182. },
  183. },
  184. async mounted() {
  185. var self = this;
  186. self.loading = true;
  187. (function () {
  188. if (self.businessKey != null && self.businessKey.length > 0) {
  189. return loveProjectApi.edit(self.businessKey);
  190. } else {
  191. return loveProjectApi.create();
  192. }
  193. })()
  194. .then((response) => {
  195. var jsonData = response.data;
  196. if (jsonData.result) {
  197. self.formModel = jsonData.data;
  198. self.showModal = true;
  199. let image = self.formModel.image;
  200. if (image != null) {
  201. self.fileUrl = image
  202. }
  203. if (self.formModel.content != null) {
  204. self.$refs.editor.setContent(self.formModel.content);
  205. }
  206. } else {
  207. self.$message.error(jsonData.message + "");
  208. }
  209. self.loading = false;
  210. })
  211. .catch((error) => {
  212. self.$message.error(error + "");
  213. self.loading = false;
  214. });
  215. },
  216. components: {
  217. // "el-select-tree": SelectTree
  218. "mce-editor": MceEditor,
  219. },
  220. };
  221. </script>
  222. <style scoped>
  223. .user-panel {
  224. margin: 10px auto;
  225. }
  226. .avatar-uploader .el-upload {
  227. border: 1px dashed #d9d9d9;
  228. border-radius: 6px;
  229. cursor: pointer;
  230. position: relative;
  231. overflow: hidden;
  232. }
  233. .avatar-uploader .el-upload:hover {
  234. border-color: #409EFF;
  235. }
  236. .avatar-uploader-icon {
  237. font-size: 28px;
  238. color: #8c939d;
  239. width: 178px;
  240. height: 178px;
  241. line-height: 178px;
  242. text-align: center;
  243. }
  244. .avatar {
  245. width: 178px;
  246. height: 178px;
  247. display: block;
  248. }
  249. </style>