index.vue 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. <template>
  2. <div id="index">
  3. <el-row>
  4. <el-col :span="24" class="main">
  5. <span v-if="display == 'list'">
  6. <el-col :span="24" class="top">
  7. <el-button type="primary" size="mini" @click="add">添加</el-button>
  8. </el-col>
  9. <el-col :span="24" class="list">
  10. <data-table :fields="fields" :opera="opera" :data="list" :total="total" @query="search" @edit="toEdit" @delete="toDelete"></data-table>
  11. </el-col>
  12. </span>
  13. <span v-else>
  14. <el-col :span="24" class="top">
  15. <el-button type="primary" size="mini" @click="back">返回</el-button>
  16. </el-col>
  17. <el-col :span="24" class="detail">
  18. <data-form :data="form" :fields="formFields" @save="toSave" :rules="rules">
  19. <template #custom="{ item, form }">
  20. <template v-if="item.model == 'create_date'">
  21. <el-date-picker
  22. v-model="form.create_date"
  23. type="datetime"
  24. placeholder="请选择"
  25. format="yyyy-MM-dd HH:mm:ss"
  26. value-format="yyyy-MM-dd HH:mm:ss"
  27. >
  28. </el-date-picker>
  29. </template>
  30. <template v-else-if="item.model == 'province'">
  31. <el-select v-model="form.province" placeholder="请选择" filterable clearable @change="changePro">
  32. <el-option v-for="(i, index) in provinceList" :key="index" :label="i.name" :value="i.code"></el-option>
  33. </el-select>
  34. </template>
  35. <template v-else-if="item.model == 'place'">
  36. <el-select v-model="form.place" placeholder="请选择" filterable clearable>
  37. <el-option v-for="(i, index) in placeList" :key="index" :label="i.name" :value="i.code"></el-option>
  38. </el-select>
  39. </template>
  40. </template>
  41. </data-form>
  42. </el-col>
  43. </span>
  44. </el-col>
  45. </el-row>
  46. </div>
  47. </template>
  48. <script>
  49. import dataForm from '@/components/form.vue';
  50. import dataTable from '@/components/data-table.vue';
  51. import { mapState, createNamespacedHelpers } from 'vuex';
  52. const { mapActions: place } = createNamespacedHelpers('place');
  53. const { mapActions: trainlive } = createNamespacedHelpers('trainlive');
  54. export default {
  55. metaInfo() {
  56. return { title: this.$route.meta.title };
  57. },
  58. name: 'index',
  59. props: {},
  60. components: {
  61. dataTable,
  62. dataForm,
  63. },
  64. data: function() {
  65. return {
  66. display: 'list',
  67. opera: [
  68. {
  69. label: '编辑',
  70. method: 'edit',
  71. },
  72. {
  73. label: '删除',
  74. method: 'delete',
  75. },
  76. ],
  77. fields: [
  78. { label: '房间号', prop: 'room_id' },
  79. { label: '标题', prop: 'title' },
  80. { label: '开始时间', prop: 'create_date' },
  81. { label: '负责人', prop: 'user' },
  82. { label: '联系电话', prop: 'phone' },
  83. ],
  84. list: [],
  85. total: 0,
  86. // 添加
  87. formFields: [
  88. { label: '标题', model: 'title' },
  89. { label: '开始时间', model: 'create_date', custom: true },
  90. { label: '省份', model: 'province', custom: true },
  91. { label: '市区', model: 'place', custom: true },
  92. { label: '主办方', model: 'sponsor' },
  93. { label: '负责人', model: 'user' },
  94. { label: '联系电话', model: 'phone' },
  95. { label: '信息简介', model: 'brief', type: 'textarea' },
  96. ],
  97. form: {},
  98. rules: {},
  99. // 省份
  100. provinceList: [],
  101. // 市区
  102. placeList: [],
  103. };
  104. },
  105. async created() {
  106. await this.search();
  107. await this.searchType();
  108. },
  109. methods: {
  110. ...place({ palcequery: 'query', palcefetch: 'fetch' }),
  111. ...trainlive(['query', 'fetch', 'create', 'update', 'delete']),
  112. // 查询
  113. async search({ skip = 0, limit = 10, ...info } = {}) {
  114. let res = await this.query({ skip, limit, ...info });
  115. if (this.$checkRes(res)) {
  116. this.$set(this, `list`, res.data);
  117. this.$set(this, `total`, res.total);
  118. }
  119. },
  120. // 添加
  121. add() {
  122. this.display = true;
  123. },
  124. // 提交
  125. async toSave({ data }) {
  126. if (data.id) {
  127. let res = await this.update(data);
  128. if (this.$checkRes(res)) {
  129. this.$message({
  130. message: '修改信息成功',
  131. type: 'success',
  132. });
  133. this.back();
  134. }
  135. } else {
  136. let res = await this.create(data);
  137. if (this.$checkRes(res)) {
  138. this.$checkRes(res, '创建成功', '创建失败');
  139. this.$alert(`房间号:${res.data.room_id}` + `密码:${res.data.password};`, '成功', {
  140. dangerouslyUseHTMLString: true,
  141. confirmButtonText: '确定',
  142. type: 'success',
  143. center: true,
  144. callback: action => {
  145. this.back();
  146. },
  147. });
  148. }
  149. }
  150. },
  151. // 修改
  152. toEdit({ data }) {
  153. this.$set(this, `form`, data);
  154. this.display = 'detail';
  155. },
  156. // 删除
  157. async toDelete({ data }) {
  158. this.$confirm('您确定要删除此信息吗?', '提示', {
  159. confirmButtonText: '确定',
  160. cancelButtonText: '取消',
  161. type: 'warning',
  162. })
  163. .then(async () => {
  164. let res = await this.delete(data.id);
  165. if (this.$checkRes(res)) {
  166. this.$message({
  167. message: '删除信息成功',
  168. type: 'success',
  169. });
  170. this.search();
  171. }
  172. })
  173. .catch(() => {});
  174. },
  175. // 返回
  176. back() {
  177. this.form = {};
  178. this.display = 'list';
  179. this.search();
  180. },
  181. // 查询省市
  182. async searchType() {
  183. let res = await this.palcequery({ level: 1 });
  184. this.$set(this, `provinceList`, res.data);
  185. },
  186. // 选择市
  187. async changePro(value) {
  188. let parent = value;
  189. let res = await this.palcequery({ level: 2, parent });
  190. this.$set(this, `placeList`, res.data);
  191. },
  192. },
  193. computed: {
  194. ...mapState(['user']),
  195. },
  196. watch: {},
  197. };
  198. </script>
  199. <style lang="less" scoped>
  200. .main {
  201. padding: 0 16px 0 0;
  202. .top {
  203. text-align: right;
  204. padding: 0 0 10px 0;
  205. }
  206. }
  207. </style>