modelForm.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540
  1. <style lang="scss" scoped>
  2. .content{
  3. display:flex;
  4. padding:0;
  5. .content-item{
  6. flex:1;
  7. padding:20px;
  8. &.middle{
  9. border-left:2px solid #D8D8D8;
  10. border-right:2px solid #D8D8D8;
  11. }
  12. &.right,&.middle{
  13. flex:2;
  14. }
  15. .item-title{
  16. font-size: 14px;
  17. font-weight: bold;
  18. color: #666666;
  19. margin-bottom:20px;
  20. }
  21. .el-row{
  22. margin-top:20px;
  23. }
  24. .model{
  25. width:80px;
  26. height:80px;
  27. display:flex;
  28. flex-direction: column;
  29. align-items: center;
  30. justify-content: space-evenly;
  31. &:hover{
  32. cursor: pointer;
  33. background:#F5FAFF;
  34. }
  35. img{
  36. height:28px;
  37. width:28px;
  38. }
  39. span{
  40. font-size:14px;
  41. color:#666666;
  42. // margin-top:19px;
  43. }
  44. }
  45. .el-form{
  46. margin-bottom:20px;
  47. .el-form-item{
  48. background:#F5FAFF;
  49. padding:10px 20px;
  50. margin-bottom:5px;
  51. /deep/.el-form-item__label{
  52. font-size:16px;
  53. color:#666666;
  54. }
  55. /deep/.el-form-item__content{
  56. margin-right:160px;
  57. position:relative;
  58. font,.drag{
  59. position:absolute;
  60. right:-145px;
  61. }
  62. font{
  63. top:0px;
  64. color:#3895FE;
  65. font-size: 12px;
  66. span{
  67. margin-left: 5px;
  68. }
  69. }
  70. .drag{
  71. right:-160px;
  72. bottom:-3px;
  73. }
  74. div{
  75. font-size:16px;
  76. color:#333333;
  77. }
  78. .el-radio,.el-checkbox{
  79. margin-right: 32px;
  80. height: 32px;
  81. line-height: 32px;
  82. }
  83. .el-radio-group,.el-checkbox-group{
  84. display:flex;
  85. flex-direction: column;
  86. }
  87. }
  88. /deep/.el-form-item__label{
  89. float: none;
  90. }
  91. &.text{
  92. /deep/.el-form-item__content{
  93. // margin-left:60px;
  94. }
  95. }
  96. }
  97. }
  98. // 右边
  99. .item-main{
  100. margin:34px;
  101. // height:600px;
  102. // background: #FFFFFF;
  103. border: 1px solid #DDDDDD;
  104. box-shadow: 0px 5px 10px 0px rgba(0, 0, 0, 0.13);
  105. border-radius: 20px;
  106. .el-form.over_y{
  107. max-height:calc( 100vh - 340px);
  108. }
  109. }
  110. // label样式
  111. .edit_label {
  112. /deep/.el-input__inner{
  113. background:#F5FAFF;
  114. border:0px;
  115. padding:0px;
  116. }
  117. }
  118. /deep/.opicon{
  119. font-weight: bold;
  120. padding:5px;
  121. color:#3895FE;
  122. }
  123. .tpl_title{
  124. font-size: 18px;
  125. margin-bottom:20px;
  126. }
  127. .tpl_form{
  128. margin:20px;
  129. border:1px solid #ccc;
  130. border-radius: 20px;
  131. /deep/.el-form-item{
  132. background:none;
  133. }
  134. /deep/.el-form-item__content{
  135. width:100%;
  136. }
  137. }
  138. .survey_logo{
  139. position: relative;
  140. top:15px;
  141. left: 20px;
  142. }
  143. }
  144. }
  145. </style>
  146. <template>
  147. <section>
  148. <p><span>信息管理></span>新增模板</p>
  149. <div class="content">
  150. <div class="content-item">
  151. <div class='item-title'>模板组件</div>
  152. <el-row>
  153. <el-col :span='12'>
  154. <div class='model' @click="addWidget(0)">
  155. <img src="../../assets/slt_small.png" alt="">
  156. <span>单行文本</span>
  157. </div>
  158. </el-col>
  159. <el-col :span='12'>
  160. <div class='model' @click="addWidget(1)">
  161. <img src="../../assets/mlt_small.png" alt="">
  162. <span>多行文本</span>
  163. </div>
  164. </el-col>
  165. </el-row>
  166. <el-row>
  167. <el-col :span='12'>
  168. <div class='model' @click="addWidget(2)">
  169. <img src="../../assets/radio_small.png" alt="">
  170. <span>单选统计</span>
  171. </div>
  172. </el-col>
  173. <el-col :span='12'>
  174. <div class='model' @click="addWidget(3)">
  175. <img src="../../assets/checked_small.png" alt="">
  176. <span>多选统计</span>
  177. </div>
  178. </el-col>
  179. </el-row>
  180. <el-row>
  181. <el-col :span='12'>
  182. <div class='model' @click="addWidget(4)">
  183. <img src="../../assets/upload_small.png" alt="">
  184. <span>图片上传</span>
  185. </div>
  186. </el-col>
  187. <el-col :span='12'>
  188. <div class='model' @click="addWidget(5)">
  189. <img src="../../assets/file_small.png" alt="">
  190. <span>文件上传</span>
  191. </div>
  192. </el-col>
  193. </el-row>
  194. </div>
  195. <div class="content-item middle">
  196. <div class='item-title'>编辑模板-{{title}}</div>
  197. <el-form size="small" label-width="" label-position="top" class='over_y'>
  198. <!-- handle=".dargBtn" 触发拖拽事件的按钮类名 filter=".undraggable" 不可拖拽的元素的类名 -->
  199. <vuedraggable class="wrapper" v-model="widgetList" handle=".dargBtn">
  200. <transition-group>
  201. <el-form-item v-for="(item,index) in widgetList" :key="index">
  202. <section v-if="item.type=='input'">
  203. <el-input :readonly="item.edit" v-model="item.label" :class="item.edit?'edit_label':''"></el-input>
  204. <el-input placeholder='请输入' v-model="item.placeholder"></el-input>
  205. <font>
  206. <span @click="item.edit=!item.edit">{{item.edit?'编辑':'保存'}}</span>
  207. <span @click="widgetList.splice(index,1)">删除</span>
  208. </font>
  209. <el-button type='primary' class='dargBtn drag'>拖拽移动顺序</el-button>
  210. </section>
  211. <section v-if="item.type=='textarea'">
  212. <el-input :readonly="item.edit" v-model="item.label" :class="item.edit?'edit_label':''"></el-input>
  213. <el-input type="textarea" placeholder='请输入' v-model="item.placeholder"></el-input>
  214. <font>
  215. <span @click="item.edit=!item.edit">{{item.edit?'编辑':'保存'}}</span>
  216. <span @click="widgetList.splice(index,1)">删除</span>
  217. </font>
  218. <el-button type='primary' class='dargBtn drag'>拖拽移动顺序</el-button>
  219. </section>
  220. <section v-if="item.type=='radio'">
  221. <el-input :readonly="item.edit" v-model="item.label" :class="item.edit?'edit_label':''"></el-input>
  222. <el-radio-group v-model="radio">
  223. <el-radio :label="iitem.label" v-for="(iitem,index) in item.items" :key="index">
  224. <el-input :readonly="item.edit" v-model="iitem.label" :class="item.edit?'edit_label':''"></el-input>
  225. <template v-if="!item.edit">
  226. <i class="el-icon-minus opicon" @click="minusOption(item.items,index)"></i><i class="el-icon-plus opicon" @click="plusOption(item.items,index)"></i>
  227. </template>
  228. </el-radio>
  229. </el-radio-group>
  230. <font>
  231. <span @click="item.edit=!item.edit">{{item.edit?'编辑':'保存'}}</span>
  232. <span @click="widgetList.splice(index,1)">删除</span>
  233. </font>
  234. <el-button type='primary' class='dargBtn drag'>拖拽移动顺序</el-button>
  235. </section>
  236. <section v-if="item.type=='checkbox'">
  237. <el-input :readonly="item.edit" v-model="item.label" :class="item.edit?'edit_label':''"></el-input>
  238. <el-radio-group v-model="radio">
  239. <el-checkbox :label="iitem.label" v-for="(iitem,index) in item.items" :key="index">
  240. <el-input :readonly="item.edit" v-model="iitem.label" :class="item.edit?'edit_label':''"></el-input>
  241. <template v-if="!item.edit">
  242. <i class="el-icon-minus opicon" @click="minusOption(item.items,index)"></i><i class="el-icon-plus opicon" @click="plusOption(item.items,index)"></i>
  243. </template>
  244. </el-checkbox>
  245. </el-radio-group>
  246. <font>
  247. <span @click="item.edit=!item.edit">{{item.edit?'编辑':'保存'}}</span>
  248. <span @click="widgetList.splice(index,1)">删除</span>
  249. </font>
  250. <el-button type='primary' class='dargBtn drag'>拖拽移动顺序</el-button>
  251. </section>
  252. <section v-if="item.type=='image'">
  253. <el-input :readonly="item.edit" v-model="item.label" :class="item.edit?'edit_label':''"></el-input>
  254. <el-upload
  255. action="https://jsonplaceholder.typicode.com/posts/"
  256. list-type="picture-card"
  257. :on-preview="handlePictureCardPreview"
  258. :on-remove="handleRemove">
  259. <i class="el-icon-plus"></i>
  260. </el-upload>
  261. <font>
  262. <span @click="item.edit=!item.edit">{{item.edit?'编辑':'保存'}}</span>
  263. <span @click="widgetList.splice(index,1)">删除</span>
  264. </font>
  265. <el-button type='primary' class='dargBtn drag'>拖拽移动顺序</el-button>
  266. </section>
  267. <section v-if="item.type=='file'">
  268. <el-input :readonly="item.edit" v-model="item.label" :class="item.edit?'edit_label':''"></el-input>
  269. <el-upload
  270. class="upload-demo"
  271. ref="upload"
  272. action="https://jsonplaceholder.typicode.com/posts/"
  273. :on-preview="handlePreview"
  274. :on-remove="handleRemove"
  275. :file-list="fileList"
  276. :auto-upload="false">
  277. <!-- <el-button slot="trigger" size="small" type="primary">选取文件</el-button> -->
  278. <el-button style="margin-left: 10px;" size="small" type="primary" plain @click="submitUpload">添加文件</el-button>
  279. <!-- <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div> -->
  280. </el-upload>
  281. <font>
  282. <span @click="item.edit=!item.edit">{{item.edit?'编辑':'保存'}}</span>
  283. <span @click="widgetList.splice(index,1)">删除</span>
  284. </font>
  285. <el-button type='primary' class='dargBtn drag'>拖拽移动顺序</el-button>
  286. </section>
  287. </el-form-item>
  288. </transition-group>
  289. </vuedraggable>
  290. <div v-if="this.widgetList.length">
  291. <el-button size="medium" type="primary" @click="save">保存</el-button>
  292. </div>
  293. </el-form>
  294. </div>
  295. <div class="content-item right">
  296. <div class='item-title'>效果预览</div>
  297. <div class='item-main'>
  298. <img src="../../assets/survey_logo.png" alt="" class="survey_logo">
  299. <h5 align='center' class="tpl_title">{{title}}</h5>
  300. <el-form ref="form" :model="form" class="tpl_form over_y">
  301. <el-form-item v-for="(item,index) in widgetList" :key="index" :label="item.label">
  302. <el-input v-if="item.type=='input'" v-model="form.label" :placeholder="item.placeholder"></el-input>
  303. <el-input v-if="item.type=='textarea'" type="textarea" v-model="form.label" :placeholder="item.placeholder"></el-input>
  304. <el-radio-group v-if="item.type=='radio'">
  305. <el-radio :label="iitem.label" v-for="(iitem,index) in item.items" :key="index">{{iitem.label}}</el-radio>
  306. </el-radio-group>
  307. <el-radio-group v-if="item.type=='checkbox'">
  308. <el-checkbox :label="iitem.label+'22'" v-for="(iitem,index) in item.items" :key="index">{{iitem.label}}</el-checkbox>
  309. </el-radio-group>
  310. <el-upload
  311. v-if="item.type=='image'"
  312. action="https://jsonplaceholder.typicode.com/posts/"
  313. list-type="picture-card"
  314. :on-preview="handlePictureCardPreview"
  315. :on-remove="handleRemove">
  316. <i class="el-icon-plus"></i>
  317. </el-upload>
  318. <el-upload
  319. v-if="item.type=='file'"
  320. class="upload-demo"
  321. ref="upload"
  322. action="https://jsonplaceholder.typicode.com/posts/"
  323. :on-preview="handlePreview"
  324. :on-remove="handleRemove"
  325. :file-list="fileList"
  326. :auto-upload="false">
  327. <!-- <el-button slot="trigger" size="small" type="primary">选取文件</el-button> -->
  328. <el-button style="margin-left: 10px;" size="small" type="primary" plain @click="submitUpload">添加文件</el-button>
  329. <!-- <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div> -->
  330. </el-upload>
  331. </el-form-item>
  332. <el-form-item v-if="this.widgetList.length">
  333. <el-button size="medium" type="primary" @click="dialogVisible = false">提交</el-button>
  334. </el-form-item>
  335. </el-form>
  336. </div>
  337. </div>
  338. </div>
  339. </section>
  340. </template>
  341. <script>
  342. import vuedraggable from 'vuedraggable';
  343. export default {
  344. components: {vuedraggable},
  345. data(){
  346. return{
  347. title:this.$route.query.title,
  348. edit:0,
  349. form:{name:'',page:1,page_size:20},
  350. total:1,
  351. list:[{name:'2333'}],
  352. loading:false,
  353. checkList:[],
  354. input:'',
  355. dialogVisible:false,
  356. defaultProps:{},
  357. data: [{
  358. id: 1,
  359. label: '一级 1'
  360. }, {
  361. id: 2,
  362. label: '一级 2',
  363. children: [{
  364. id: 5,
  365. label: '二级 2-1'
  366. }, {
  367. id: 6,
  368. label: '二级 2-2'
  369. }]
  370. }],
  371. stdWidgetList:[
  372. {type:"input",label:"请输入标题",placeholder:"请输入",edit:true},
  373. {type:"textarea",label:"请输入标题",placeholder:"请输入",edit:true},
  374. {type:"radio",label:"请输入标题",placeholder:"请输入",edit:true,
  375. items:[{label:"选项",value:"选项值"},{label:"选项1",value:"选项值"}]
  376. },
  377. {type:"checkbox",label:"请输入标题",placeholder:"请输入",edit:true,
  378. items:[{label:"选项",value:"选项值"},{label:"选项1",value:"选项值"}]
  379. },
  380. {type:"image",label:"请输入标题",placeholder:"请输入",edit:true},
  381. {type:"file",label:"请输入标题",placeholder:"请输入",edit:true}
  382. ],
  383. widgetList:[],
  384. }
  385. },
  386. methods:{
  387. save(){
  388. let id = this.$route.query.id;
  389. let params = {
  390. name:this.title,
  391. widget:JSON.stringify(this.widgetList)
  392. }
  393. if(id){
  394. params.id = id;
  395. this.$api.editTemplate(params).then(res=>{
  396. if(res.data.code==0){
  397. this.$message({
  398. type:"success",
  399. message:"成功!"
  400. })
  401. }else{
  402. this.$message.error("失败!")
  403. }
  404. this.$router.push('/message/template')
  405. })
  406. }else{
  407. this.$api.addTemplate(params).then(res=>{
  408. if(res.data.code==0){
  409. this.$message({
  410. type:"success",
  411. message:"成功!"
  412. })
  413. }else{
  414. this.$message.error("失败!")
  415. }
  416. this.$router.push('/message/template')
  417. })
  418. }
  419. },
  420. addWidget(i){
  421. console.log(i)
  422. this.widgetList.push(JSON.parse(JSON.stringify(this.stdWidgetList[i])))
  423. console.log(this.widgetList)
  424. },
  425. minusOption(options,index){
  426. if(options.length<=1){
  427. this.$message.error("选项不能少于1个!")
  428. }else{
  429. options.splice(index,1)
  430. }
  431. },
  432. plusOption(options,index){
  433. if(options.length>=10){
  434. this.$message.error("选项不能超过10个!")
  435. }else{
  436. options.splice(index+1,0,{label:"选项"+(index+1),value:"选项值"})
  437. }
  438. },
  439. gopage(size){
  440. if(size){
  441. this.form.page_size=size
  442. }
  443. this.form.page=this.$refs.pageButton.page
  444. this.getData()
  445. },
  446. handleSelectionChange(val) {
  447. this.multipleSelection = val;
  448. },
  449. gopage1(size){
  450. if(size){
  451. this.form1.page_size=size
  452. }
  453. this.form1.page=this.$refs.pageButton1.page
  454. this.getJl()
  455. },
  456. open(data) {
  457. this.dialogFormVisible=true;
  458. this.message={...data}
  459. },
  460. download(){
  461. let array=this.multipleSelection,ids=[];
  462. for(let i=0;i<array.length;i++){
  463. ids.push(array[i].id)
  464. }
  465. ids=ids.join(',')
  466. this.$api.downloadMon({ids:ids}).then(res=>{
  467. var elink = document.createElement('a');
  468. let blob=new Blob([res.data], {type: 'application/vnd.ms-excel'});
  469. let objUrl=URL.createObjectURL(blob);
  470. console.log(res.headers['content-disposition'])
  471. let file_name=res.headers['content-disposition'].split('=')[1];
  472. elink.download = file_name;
  473. elink.style.display = 'none';
  474. elink.href = objUrl;
  475. document.body.appendChild(elink);
  476. elink.click();
  477. document.body.removeChild(elink);
  478. })
  479. },
  480. prview(id){
  481. this.form1.enterprise_id=id;
  482. this.getJl();
  483. this.dialogFormVisible1=true
  484. },
  485. getJl(){
  486. var parm=this.form1;
  487. this.$api.getMonitjobList(parm).then(res=>{
  488. this.data=res.data.data.list
  489. this.total1=res.data.data.total
  490. })
  491. },
  492. detail(id){
  493. this.$router.push({ path: '/company/detail', query: { id: id,page:this.form.page,page_size:this.form.page_size } });
  494. },
  495. getData(){
  496. let id = this.$route.query.id;
  497. if(id){
  498. this.$api.getTemplate({id:id}).then(res=>{
  499. if(res.data.code==0){
  500. this.widgetList = res.data.data.widget;
  501. }
  502. })
  503. }
  504. },
  505. del(id){
  506. this.$confirm('确定删除吗', '提示', {
  507. type: 'warning'
  508. }).then(() => {
  509. this.$api.deleteEnterprise({id:id}).then((res)=>{
  510. this.$message({
  511. message: '删除成功',
  512. type: 'success'
  513. })
  514. this.getData()
  515. })
  516. })
  517. },
  518. permission(name){
  519. let permissions=this.info.permissions||[];
  520. let list=[];
  521. for(let i=0;i<permissions.length;i++){
  522. list.push(permissions[i].name)
  523. }
  524. if(list.indexOf(name)<0){
  525. return false;
  526. }else{
  527. return true;
  528. }
  529. },
  530. },
  531. created(){
  532. this.getData();
  533. }
  534. }
  535. </script>