index.vue 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. <template>
  2. <PageWrapper contentBackground>
  3. <template #footer>
  4. <a-tabs v-model:activeKey="searchInfo.type" @change="tabChange">
  5. <a-tab-pane key="1" :tab="t('routes.product.type.1')" />
  6. <a-tab-pane key="2" :tab="t('routes.product.type.2')" />
  7. <a-tab-pane key="3" :tab="t('routes.product.type.3')" />
  8. </a-tabs>
  9. </template>
  10. <div class="desc-wrap-BasicTable">
  11. <BasicTable @register="registerTimeTable">
  12. <template #toolbar>
  13. <a-button
  14. type="primary"
  15. v-if="getCheckPerm('firmware-add')"
  16. @click="
  17. () => {
  18. openAddModal(true, searchInfo.type);
  19. }
  20. "
  21. >{{ t('routes.product.addVstive') }}</a-button
  22. >
  23. </template>
  24. <template #action="{ record }">
  25. <TableAction
  26. :actions="[
  27. {
  28. label: '编辑',
  29. //icon: 'ep:edit',
  30. ifShow: getCheckPerm('firmware-update'),
  31. onClick: handleEdit.bind(null, record),
  32. },
  33. {
  34. label: '删除',
  35. //icon: 'ic:outline-delete-outline',
  36. ifShow: getCheckPerm('firmware-delete'),
  37. popConfirm: {
  38. title: '是否确认删除',
  39. confirm: handleDelete.bind(null, record),
  40. },
  41. },
  42. ]"
  43. />
  44. </template>
  45. </BasicTable>
  46. </div>
  47. <AddModal @update="reload" @register="registerAddModal" />
  48. <EditModal @register="registerEditModal" @update="reload" />
  49. </PageWrapper>
  50. </template>
  51. <script lang="ts">
  52. import { defineComponent, reactive, h } from 'vue';
  53. import { BasicTable, useTable, FormProps, TableAction, BasicColumn } from '/@/components/Table';
  54. import { PageWrapper } from '/@/components/Page';
  55. import { Divider, Card, Empty, Descriptions, Steps, Tabs } from 'ant-design-vue';
  56. import { CameraList, DelAndUpload, EditAndUpload } from '/@/api/product';
  57. import { useModal } from '/@/components/Modal';
  58. import { useI18n } from '/@/hooks/web/useI18n';
  59. import AddModal from './AddModal.vue';
  60. import EditModal from './EditModal.vue';
  61. import { useMessage } from '/@/hooks/web/useMessage';
  62. import { Switch } from 'ant-design-vue';
  63. import { Time } from '/@/components/Time';
  64. import { usePermissionStore } from '/@/store/modules/permission';
  65. export default defineComponent({
  66. components: {
  67. BasicTable,
  68. AddModal,
  69. EditModal,
  70. TableAction,
  71. PageWrapper,
  72. [Divider.name]: Divider,
  73. [Card.name]: Card,
  74. Empty,
  75. [Descriptions.name]: Descriptions,
  76. [Descriptions.Item.name]: Descriptions.Item,
  77. [Steps.name]: Steps,
  78. [Steps.Step.name]: Steps.Step,
  79. [Tabs.name]: Tabs,
  80. [Tabs.TabPane.name]: Tabs.TabPane,
  81. },
  82. setup() {
  83. const { t } = useI18n();
  84. const permissionStore = usePermissionStore();
  85. const { getCheckPerm } = permissionStore;
  86. const searchInfo = reactive<Recordable>({
  87. type: '1',
  88. });
  89. const [registerAddModal, { openModal: openAddModal }] = useModal();
  90. const [registerEditModal, { openModal: openEditModal }] = useModal();
  91. const { createMessage } = useMessage();
  92. const refundTimeTableSchema: BasicColumn[] = [
  93. {
  94. title: '版本号',
  95. width: 150,
  96. dataIndex: 'version',
  97. },
  98. {
  99. title: '版本更新说明',
  100. width: 150,
  101. dataIndex: 'description',
  102. },
  103. {
  104. title: '最低版本号',
  105. width: 150,
  106. dataIndex: 'minVersion',
  107. },
  108. {
  109. title: '创建人',
  110. width: 150,
  111. dataIndex: 'createName',
  112. },
  113. {
  114. title: '创建时间',
  115. width: 150,
  116. dataIndex: 'createTime',
  117. customRender: ({ record }) => {
  118. return (
  119. record.createTime &&
  120. h(Time, {
  121. value: record.createTime,
  122. mode: 'datetime',
  123. })
  124. );
  125. },
  126. },
  127. {
  128. title: '状态',
  129. dataIndex: 'status',
  130. width: 80,
  131. ifShow: getCheckPerm('firmware-enable'),
  132. customRender: ({ record }) => {
  133. if (!Reflect.has(record, 'pendingStatus')) {
  134. record.pendingStatus = false;
  135. }
  136. return h(Switch, {
  137. checked: record.status === 'A',
  138. checkedChildren: '启用',
  139. unCheckedChildren: '禁用',
  140. loading: false,
  141. onChange: async (checked: boolean) => {
  142. record.pendingStatus = true;
  143. const newStatus = checked ? 'A' : 'I';
  144. await EditAndUpload({ ...record, status: newStatus });
  145. if (checked) {
  146. Reflect.set(record, 'status', newStatus);
  147. } else {
  148. Reflect.set(record, 'status', newStatus);
  149. }
  150. reload()
  151. createMessage.success(t('common.optSuccess'));
  152. },
  153. });
  154. },
  155. },
  156. ];
  157. const searchForm: Partial<FormProps> = {
  158. labelWidth: 100,
  159. autoSubmitOnEnter:true,
  160. schemas: [
  161. {
  162. field: 'version',
  163. label: '版本号',
  164. component: 'Input',
  165. componentProps: {
  166. maxLength: 100,
  167. },
  168. colProps: {
  169. xl: 6,
  170. xxl: 6,
  171. },
  172. },
  173. ],
  174. };
  175. const [registerTimeTable, { reload }] = useTable({
  176. api: CameraList,
  177. title: '固件列表',
  178. columns: refundTimeTableSchema,
  179. useSearchForm: true,
  180. formConfig: searchForm,
  181. showTableSetting: true,
  182. rowKey: 'id',
  183. fetchSetting: {
  184. pageField: 'pageNum',
  185. sizeField: 'pageSize',
  186. listField: 'list',
  187. totalField: 'total',
  188. },
  189. searchInfo: searchInfo,
  190. // beforeFetch:(T)=>{
  191. // T.type = searchInfo.type
  192. // console.log('beforeFetch',T,searchInfo)
  193. // return T
  194. // },
  195. actionColumn: {
  196. width: 180,
  197. title: '操作',
  198. dataIndex: 'action',
  199. slots: { customRender: 'action' },
  200. },
  201. canResize: true,
  202. });
  203. function tabChange(val: string) {
  204. console.log('tabChange', val);
  205. reload();
  206. }
  207. async function handleDelete(record: Recordable) {
  208. console.log('点击了删除', record);
  209. await DelAndUpload({ id: record.id });
  210. createMessage.success(t('common.optSuccess'));
  211. reload();
  212. }
  213. function handleOpen(record: Recordable) {
  214. console.log('点击了启用', record);
  215. }
  216. function handleEdit(record: Recordable) {
  217. console.log('record', record);
  218. openEditModal(true, {
  219. ...record,
  220. type:searchInfo.type
  221. });
  222. }
  223. return {
  224. registerTimeTable,
  225. handleDelete,
  226. handleOpen,
  227. tabChange,
  228. reload,
  229. registerAddModal,
  230. registerEditModal,
  231. openAddModal,
  232. handleEdit,
  233. getCheckPerm,
  234. t,
  235. searchInfo,
  236. };
  237. },
  238. });
  239. </script>
  240. <style lang="less" scoped>
  241. .desc-wrap-BasicTable {
  242. background-color: #f0f2f5;
  243. .vben-basic-table-form-container {
  244. padding: 0;
  245. }
  246. }
  247. </style>