formIndex.vue 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. <template>
  2. <el-row class="main animate__animated animate__backInLeft">
  3. <el-col :span="24" class="info">
  4. <el-col :span="24" class="tab">
  5. <el-col
  6. :span="8"
  7. :class="['list', item.id == tabActive ? 'tabActive' : '']"
  8. v-for="(item, index) in tabList"
  9. :key="index"
  10. @click="tabChange(item)"
  11. >
  12. <span>{{ item.title }}</span>
  13. <span></span>
  14. </el-col>
  15. </el-col>
  16. <el-col :span="24" class="infoForm">
  17. <el-col :span="24" class="form" v-if="tabActive == '1'">
  18. <el-col :span="24" class="formMess">
  19. <el-form
  20. ref="formRef"
  21. :model="form"
  22. :rules="rules"
  23. label-width="auto"
  24. label-position="top"
  25. >
  26. <el-form-item label="问题类型" prop="type">
  27. <el-radio-group v-model="form.type" size="large">
  28. <el-radio-button label="投诉反馈" value="1" />
  29. <el-radio-button label="意见建议" value="2" />
  30. <el-radio-button label="咨询反馈" value="3" />
  31. </el-radio-group>
  32. </el-form-item>
  33. <el-row :gutter="20">
  34. <el-col :span="12">
  35. <el-form-item label="姓名" prop="name">
  36. <el-input v-model="form.name" placeholder="请输入姓名" />
  37. </el-form-item>
  38. <el-form-item label="电话" prop="phone">
  39. <el-input v-model="form.phone" type="number" placeholder="请输入电话" />
  40. </el-form-item>
  41. <el-form-item label="邮箱" prop="email">
  42. <el-input v-model="form.email" placeholder="请输入电子邮箱" />
  43. </el-form-item>
  44. </el-col>
  45. <el-col :span="12">
  46. <el-form-item label="地址" :required="true">
  47. <el-row :gutter="20" class="addressStyle">
  48. <el-col :span="12">
  49. <el-input v-model="form.street" placeholder="街或路" />
  50. </el-col>
  51. <el-col :span="12">
  52. <el-input v-model="form.community" placeholder="小区" />
  53. </el-col>
  54. </el-row>
  55. <el-row :gutter="20">
  56. <el-col :span="8">
  57. <el-input v-model="form.building" placeholder="楼栋" />
  58. </el-col>
  59. <el-col :span="8">
  60. <el-input v-model="form.unit" placeholder="单元" />
  61. </el-col>
  62. <el-col :span="8">
  63. <el-input v-model="form.room" placeholder="室" />
  64. </el-col>
  65. </el-row>
  66. </el-form-item>
  67. <el-form-item>
  68. <el-input
  69. v-model="form.address"
  70. type="textarea"
  71. rows="4"
  72. placeholder="点击粘贴地址"
  73. />
  74. </el-form-item>
  75. </el-col>
  76. </el-row>
  77. <el-form-item label="反馈详情" prop="description">
  78. <el-input
  79. v-model="form.description"
  80. placeholder="请输入反馈详情"
  81. type="textarea"
  82. :autosize="{ minRows: 6, maxRows: 8 }"
  83. />
  84. </el-form-item>
  85. <el-form-item>
  86. <el-button type="primary" @click="toSubmit">提交反馈</el-button>
  87. <el-button type="primary" plain @click="toRest">清空内容</el-button>
  88. </el-form-item>
  89. </el-form>
  90. </el-col>
  91. </el-col>
  92. <!-- <el-col :span="24" class="list" v-else-if="tabActive == '2'">
  93. <suggestion-index />
  94. </el-col> -->
  95. <el-col :span="24" class="back" v-else-if="tabActive == '3'">
  96. <respond-index />
  97. </el-col>
  98. </el-col>
  99. </el-col>
  100. </el-row>
  101. </template>
  102. <script setup lang="ts">
  103. import { ref, reactive } from 'vue'
  104. /* 意见记录 */
  105. import suggestionIndex from './suggestionIndex.vue'
  106. /* 热点回应 */
  107. import respondIndex from './respondIndex.vue'
  108. import { myzj } from '@/api/api'
  109. import { ElMessageBox } from 'element-plus'
  110. import { onMounted } from 'vue'
  111. const tabList = ref([
  112. {
  113. id: '1',
  114. title: '投诉与建议',
  115. },
  116. // {
  117. // id: '2',
  118. // title: '投诉与建议记录',
  119. // },
  120. {
  121. id: '3',
  122. title: '热点回应',
  123. },
  124. ])
  125. const tabActive = ref('1')
  126. const form = ref({
  127. type: '1',
  128. name: '',
  129. phone: '',
  130. email: '',
  131. description: '',
  132. street: '',
  133. community: '',
  134. building: '',
  135. unit: '',
  136. room: '',
  137. address: '',
  138. })
  139. const rules = reactive({
  140. type: [{ required: true, message: '请选择问题类型', trigger: 'changge' }],
  141. name: [{ required: true, message: '请输入姓名', trigger: 'blur' }],
  142. phone: [{ required: true, message: '请输入电话', trigger: 'blur' }],
  143. email: [{ required: true, message: '请输入电子邮箱 ', trigger: 'blur' }],
  144. description: [{ required: true, message: '请输入反馈详情 ', trigger: 'blur' }],
  145. })
  146. const formRef = ref()
  147. /* 选择 */
  148. const tabChange = (event: { id: string }) => {
  149. tabActive.value = event.id
  150. }
  151. /* 提交 */
  152. const toSubmit = async () => {
  153. await formRef.value.validate((valid: boolean, fields: object) => {
  154. if (valid) {
  155. toCreateQuestion()
  156. console.log('submit!')
  157. } else {
  158. console.log('error submit!', fields)
  159. }
  160. })
  161. }
  162. const toCreateQuestion = async () => {
  163. const result = await myzj.questionCreate(form.value)
  164. if (result.errcode == 0) {
  165. ElMessageBox.alert('添加成功', '提示', {
  166. confirmButtonText: '确定',
  167. callback: () => {
  168. resetForm()
  169. },
  170. })
  171. }
  172. }
  173. /* 清空内容 */
  174. const toRest = () => {
  175. resetForm()
  176. }
  177. /* 重置表单 */
  178. const resetForm = () => {
  179. form.value = {
  180. type: '1',
  181. name: '',
  182. phone: '',
  183. email: '',
  184. description: '',
  185. street: '',
  186. community: '',
  187. building: '',
  188. unit: '',
  189. room: '',
  190. address: '',
  191. }
  192. }
  193. </script>
  194. <style scoped lang="scss">
  195. .main {
  196. padding: 0 17%;
  197. .info {
  198. .tab {
  199. display: flex;
  200. align-items: center;
  201. justify-content: center;
  202. padding: 0 15%;
  203. margin: 0 0 40px 0;
  204. .list {
  205. display: flex;
  206. flex-direction: column;
  207. align-items: center;
  208. justify-content: center;
  209. text-align: center;
  210. span {
  211. display: inline-block;
  212. }
  213. span:first-child {
  214. color: rgb(102, 102, 102);
  215. // font-family: '黑体';
  216. font-size: 18px;
  217. font-weight: 500;
  218. line-height: 26px;
  219. letter-spacing: 0px;
  220. margin: 0 0 10px 0;
  221. }
  222. span:last-child {
  223. width: 180px;
  224. border-bottom: 4px solid transparent;
  225. }
  226. }
  227. .list:hover {
  228. cursor: pointer;
  229. span:first-child {
  230. color: rgb(25, 25, 26);
  231. }
  232. span:last-child {
  233. border-bottom: 4px solid rgb(21, 134, 255);
  234. }
  235. }
  236. .tabActive {
  237. span:first-child {
  238. color: rgb(25, 25, 26);
  239. }
  240. span:last-child {
  241. border-bottom: 4px solid rgb(21, 134, 255);
  242. }
  243. }
  244. }
  245. .infoForm {
  246. .form {
  247. padding: 0 10%;
  248. .formMess {
  249. border-radius: 10px;
  250. background: rgba(238, 227, 70, 0.5);
  251. padding: 40px 70px;
  252. }
  253. .addressStyle {
  254. margin: 0 0 10px 0;
  255. }
  256. }
  257. }
  258. }
  259. }
  260. </style>