answer.vue 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. <template>
  2. <el-dialog title="新增活动内容" width="800px" :modal="true" :visible.sync="showBool" :before-close="formCancel">
  3. <zj-form-container ref="formRef" :form-data="formData" :styleSwitch="false">
  4. <zj-form-module title="" label-width="100px" :showHade="false" :form-data="formData"
  5. :form-items="formItems">
  6. </zj-form-module>
  7. </zj-form-container>
  8. <div slot="footer" class="dialog-footer">
  9. <el-button size="mini" @click="formCancel">取 消</el-button>
  10. <el-button size="mini" @click="formConfirm">确 定</el-button>
  11. </div>
  12. </el-dialog>
  13. </template>
  14. <script>
  15. import ImageUpload from '@/components/file-upload'
  16. export default {
  17. props:{
  18. defaultData:{
  19. type: Object,
  20. default: ()=>({}),
  21. },
  22. },
  23. components: {
  24. ImageUpload
  25. },
  26. data() {
  27. return {
  28. showBool:true,
  29. formData: Object.assign({
  30. question: "",
  31. type: 1,
  32. isRequire: true,
  33. answer: [],
  34. }, this.defaultData),
  35. }
  36. },
  37. computed: {
  38. formItems() {
  39. return [{
  40. md: 24,
  41. name: 'slot-component',
  42. formItemAttributes: {
  43. label: '',
  44. prop: '',
  45. },
  46. render: (h, { props, onInput }) => {
  47. return <div/>
  48. }
  49. },{
  50. md: 24,
  51. isShow: true,
  52. name: 'el-input',
  53. attributes: { placeholder: '请输入' },
  54. formItemAttributes: {
  55. label: '名称',
  56. prop: 'question',
  57. rules: [{ required: true, message: '请输入', trigger: 'blur' }]
  58. },
  59. },
  60. {
  61. md: 24,
  62. isShow: true,
  63. name: 'el-radio',
  64. options: [{ label: "单选题", value: 1 }, { label: "多选题", value: 2 }, { label: "填写", value: 3 }, { label: "图片", value: 4 }, { label: "视频", value: 5 }],
  65. attributes: { filterable: true, placeholder: '请选择', disabled: this.formData.id ? true : false },
  66. formItemAttributes: {
  67. label: '类型',
  68. prop: 'type',
  69. rules: [{ required: true, message: '请选择', trigger: 'blur' }]
  70. },
  71. events: {
  72. change: (newVal) => {
  73. if (!!~[1,2].indexOf(newVal)) {
  74. this.formData.answer = []
  75. } else {
  76. setTimeout(() => {
  77. this.formData.answer = [
  78. {
  79. option_name: "",
  80. option_value: "",
  81. option_files: [],
  82. option_limit: '',
  83. }
  84. ]
  85. }, 250);
  86. }
  87. }
  88. }
  89. },
  90. {
  91. md: 24,
  92. isShow: true,
  93. name: 'el-radio',
  94. options: [{ label: "是", value: true }, { label: "否", value: false }],
  95. attributes: { filterable: true, placeholder: '请选择', disabled: this.formData.id ? true : false },
  96. formItemAttributes: {
  97. label: '是否必填',
  98. prop: 'isRequire',
  99. rules: [{ required: true, message: '请选择', trigger: 'blur' }]
  100. }
  101. },
  102. ...(()=>{
  103. if(!!~[1, 2].indexOf(this.formData.type)){
  104. return [{
  105. md: 24,
  106. name: 'slot-component',
  107. attributes: { placeholder: '请输入' },
  108. formItemAttributes: {
  109. label: '试题选项',
  110. prop: 'answer',
  111. rules: [{ required: true, message: '请添加选项', trigger: 'blur' }]
  112. },
  113. render: (h, { props, onInput }) => {
  114. var { value } = props
  115. return (
  116. <div>
  117. <div>
  118. <el-button size="mini" onClick={() => {
  119. this.formData.answer.push({
  120. option_name: "",
  121. option_value: "",
  122. option_files: [],
  123. option_limit: '',
  124. })
  125. }} type="primary">添加</el-button>
  126. </div>
  127. {this.formData.answer.map((item, index) => {
  128. item.option_name = `选项${index + 1}`
  129. return (
  130. <div>
  131. <div style="display: flex;justify-content: space-between;">
  132. <span style="font-weight: bold;">{this.formData.answer[index].option_name}</span>
  133. <span style="color: red;" onClick={() => {
  134. this.formData.answer.splice(index, 1)
  135. }}>删除</span>
  136. </div>
  137. <div class="redbordererr">
  138. <el-form-item
  139. label=""
  140. lebel-width="0px"
  141. prop={`answer.${index}.option_value`}
  142. rules={[{ required: true, message: '请填写', trigger: 'blur' }]}
  143. >
  144. <el-input type="textarea" rows={2} placeholder="请输入内容" value={this.formData.answer[index].option_value} onInput={(val) => { this.formData.answer[index].option_value = val }}></el-input>
  145. </el-form-item>
  146. </div>
  147. <div style="margin-top:5px">
  148. <ImageUpload fileList={this.formData.answer[index].option_files} uid={`questionFiles_ImageUpload_${index}`} limit={1} isUpdate={false} />
  149. </div>
  150. <br />
  151. </div>
  152. )
  153. })}
  154. </div>
  155. )
  156. }
  157. }]
  158. }else if(!!~[3].indexOf(this.formData.type)){
  159. return [{
  160. md: 24,
  161. name: 'slot-component',
  162. attributes: { placeholder: '请输入' },
  163. formItemAttributes: {
  164. label: '限制字数',
  165. prop: 'answer',
  166. rules: []
  167. },
  168. render: (h, { props, onInput }) => {
  169. var { value } = props
  170. return (
  171. <div>
  172. {this.formData.answer.map((item, index) => {
  173. return (
  174. <div>
  175. <div>
  176. <el-input type='number' placeholder="请输入限制长度" value={this.formData.answer[index].option_limit} onInput={(val) => { this.formData.answer[index].option_limit = val }}></el-input>
  177. </div>
  178. </div>
  179. )
  180. })}
  181. </div>
  182. )
  183. }
  184. }]
  185. }
  186. return []
  187. })()]
  188. },
  189. },
  190. methods: {
  191. formCancel() {
  192. this.$emit("close", this.formData)
  193. },
  194. formConfirm() {
  195. this.$refs.formRef.validate((valid, invalidFields, errLabels) => {
  196. if (valid) {
  197. this.$emit("confirm", this.formData)
  198. }
  199. })
  200. },
  201. }
  202. }
  203. </script>
  204. <style lang="scss" scoped>
  205. ::v-deep .el-dialog__body{
  206. padding: 30px 20px 0 20px !important
  207. }
  208. ::v-deep .dialog-footer{
  209. padding: 0 !important
  210. }
  211. </style>