AddPromptInfo.vue 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. <template>
  2. <div class="NoiseTemplateWrapper TemplateWrapper">
  3. <crumbs :title="isEdit?'提示信息维护-修改':'提示信息维护-添加'"
  4. class="topBack"
  5. linkTo="PromptInfo"></crumbs>
  6. <div class="pinfo-container">
  7. <el-form :rules="rules"
  8. :model="form"
  9. label-width="130px"
  10. ref="groups">
  11. <el-form-item label="静态知识名称:" prop="name">
  12. <el-input v-model="form.name" :disabled="isEdit"></el-input>
  13. </el-form-item>
  14. <InfoParagraph v-for="(f,i) in form.prags"
  15. :data="f"
  16. :index="i"
  17. :isEdit = "isEdit"
  18. @add="addParagraph(i)"
  19. @del="delParagraph" ref="subForm"></InfoParagraph>
  20. <p class="line"></p>
  21. <el-form-item label="关联标签:" prop="tags">
  22. <el-form-item label="标签归属:">
  23. <el-select placeholder="标签归属" v-model="form.tagFor" clearable>
  24. <el-option v-for="item in Adscriptions" :label="item.name" :value="item.val" :key="item.id" ></el-option>
  25. </el-select>
  26. </el-form-item>
  27. <TagPool :pool="tagPool"
  28. :type="form.tagFor"
  29. :selected="form.selectedTags"
  30. @changeActionData="changeActionData"></TagPool>
  31. </el-form-item>
  32. </el-form>
  33. <div class="btn">
  34. <el-button
  35. type="primary"
  36. @click="submitForm"
  37. >确 定</el-button>
  38. </div>
  39. </div>
  40. </div>
  41. </template>
  42. <script>
  43. /**
  44. *
  45. */
  46. import api from '@api/icss.js';
  47. import TagPool from './PromptTagPool';
  48. import InfoParagraph from './InfoParagraph';
  49. import config from '@api/config.js';
  50. export default {
  51. name: 'AddPromptInfo',
  52. components: {
  53. TagPool,
  54. InfoParagraph
  55. },
  56. data() {
  57. const validateTags = (rule,value,callback)=>{
  58. /*if(this.form.selectedTags.length==0){
  59. this.warning('请选择关联标签!');
  60. return false;
  61. }*/
  62. callback();
  63. };
  64. return {
  65. isEdit:false,
  66. tagPool:[], //标签池数据
  67. Adscriptions:[], //归属列表
  68. editData:{
  69. id:'',
  70. tagFor:'',
  71. selectedTags:[],
  72. prags:[]
  73. },
  74. form:{
  75. name:'',
  76. tagFor:'',
  77. selectedTags:[], //关联标签
  78. prags:[{ //单个段落相关
  79. title:'',
  80. content:'',
  81. isReason:0,
  82. orderNo:0,
  83. position:[],
  84. text:''}]
  85. },
  86. rules: {
  87. name: [
  88. { required: true, message: '静态知识名称不能为空', trigger: 'change' },
  89. { validator: (rule,value,callback)=>{
  90. if(value.length>120){
  91. callback(new Error('静态知识名称不能超过120字'));
  92. }else{
  93. callback();
  94. }}, trigger: 'change' }
  95. ],
  96. tags:[
  97. { required: true,validator:validateTags, message: '关联标签必填', trigger: 'change' }
  98. ]
  99. }
  100. }
  101. },
  102. created:function(){
  103. const {isEdit,data} = this.$route.params;
  104. this.getDropList(); //标签归属列表获取
  105. if(isEdit){
  106. this.isEdit = isEdit;
  107. const id = data.id;
  108. api.getPrompDetail({id}).then((res) =>{
  109. if(res.data.code === '0') {
  110. this.form = this.parseData(res.data.data);
  111. this.editData = Object.assign({},this.form);
  112. //this.len=res.data.data.details&&res.data.data.details.length;
  113. }else{
  114. this.warning("数据获取失败");
  115. }
  116. })
  117. }
  118. },
  119. methods: {
  120. back() { this.$router.go(-1) },
  121. mapStringToNum(str){
  122. return str.split(",").map((it)=>{
  123. return +it;
  124. })
  125. },
  126. parseData(info){
  127. let detail = [];
  128. info.details.forEach((it)=>{
  129. detail.push(Object.assign({},it,{position:this.mapStringToNum(it.position),content:it.content.replace('{imageUrlPrefix}',config.imgHost),disabled:true}));
  130. });
  131. return {
  132. id:info.id,
  133. name:info.name,
  134. tagFor:info.questionList?info.questionList[0].type+'':'',
  135. selectedTags:info.questionList||[],
  136. prags:detail
  137. };
  138. },
  139. addParagraph(i){
  140. this.form.prags.push({title:'',
  141. content:'',
  142. isReason:0,
  143. orderNo:this.form.prags.length,
  144. position:[],
  145. text:''});
  146. },
  147. delParagraph(i){
  148. if(this.form.prags.length==1){
  149. this.warning('只剩一个段落,不能再删啦!');
  150. return;
  151. }
  152. this.showConfirmDialog('确定要删除该段落?', () => {
  153. this.form.prags.splice(i,1);
  154. });
  155. },
  156. /*getPgValues(i,data){
  157. this.form.prags[i] = data;
  158. //console.log(data,this.form.prags);
  159. },*/
  160. getDropList() {
  161. return api.getDropList().then((res) =>{
  162. if(res.data.code === '0') {
  163. this.Adscriptions = res.data.data[1];
  164. }
  165. })
  166. },
  167. submitForm() {
  168. //验证外层表单
  169. let goOn=true,it=null;
  170. this.$refs.groups.validate((valid) =>{
  171. if(!valid){
  172. goOn = false;
  173. return false;
  174. }
  175. });
  176. //验证段落表单
  177. for(let i=0;i<this.$refs.subForm.length;i++){
  178. it=this.$refs.subForm[i];
  179. it.$refs.form.validate((valid) =>{
  180. if(!valid){
  181. goOn = false;
  182. }
  183. });
  184. };
  185. if(!goOn){
  186. return;
  187. }
  188. if(!this.form.selectedTags||this.form.selectedTags.length==0){
  189. this.warning('请选择关联标签!');
  190. return;
  191. }
  192. //通过必填验证,提交保存
  193. const param = {
  194. id:this.editData.id||undefined,
  195. name:this.form.name,
  196. detailVOList:this.parsePosition(this.form.prags),
  197. mapVOList:this.parseTagsForSubmit(this.form.selectedTags)
  198. };
  199. this.showSaveDialog(param);
  200. },
  201. parsePosition(data){
  202. const arr = data.map((it)=>{
  203. return Object.assign({},it,{position:typeof it.position=='string'?it.position:it.position.join(","),content:it.content.replace(config.imgHost,'{imageUrlPrefix}')});
  204. });
  205. return arr;
  206. },
  207. parseTagsForSubmit(data){
  208. return data&&data.map((it)=>{
  209. return {questionId:it.id,introduceId:'',type:it.type};
  210. });
  211. },
  212. changeActionData(selectedTags){
  213. this.form.selectedTags = selectedTags;
  214. //console.log(selectedTags)
  215. },
  216. showSaveDialog(param) {
  217. this.showConfirmDialog('是否保存该静态知识?', () => {
  218. api.savePrompts(param).then((res) => {
  219. if (res.data.code === '0') {
  220. this.warning(res.data.msg || '保存成功', 'success');
  221. this.$router.push("/admin/LT-YXSJWH-TSXXWH");
  222. } else {
  223. this.warning(res.data.msg)
  224. }
  225. }).catch((err) => {
  226. this.warning(err);
  227. })
  228. });
  229. },
  230. showConfirmDialog(msg, resolve) {
  231. this.$alert(msg, '提示', {
  232. confirmButtonText: '确定',
  233. type: 'warning'
  234. }).then(() => {
  235. resolve();
  236. }).catch(() => {});
  237. },
  238. warning(msg, type) {
  239. this.$message({
  240. showClose: true,
  241. message: msg,
  242. type: type || 'warning'
  243. })
  244. },
  245. }
  246. }
  247. </script>
  248. <style lang="less">
  249. @import "../../less/common.less";
  250. .NoiseTemplateWrapper .pinfo-container{
  251. /*background: #fff;
  252. padding: 20px;*/
  253. margin: 70px 20px -20px 20px;
  254. form{
  255. padding: 20px;
  256. background: #fff;
  257. }
  258. .btn{
  259. padding: 10px 20px 20px 0;
  260. margin-top: 0;
  261. background: #fff;
  262. margin-bottom: 20px;
  263. }
  264. .el-input__inner{
  265. width: 200px;
  266. }
  267. .el-form-item__label{
  268. text-align: left;
  269. }
  270. .add-prg .el-form-item{
  271. margin-bottom: 20px;
  272. }
  273. }
  274. .line{
  275. border-top:1px #dcdfe6 solid;
  276. margin-bottom: 25px;
  277. }
  278. </style>