From e3273e2218ff978345fb03c1cffc78aaf0114efd Mon Sep 17 00:00:00 2001
From: xingyu <xingyu4j@vip.qq.com>
Date: Tue, 22 Aug 2023 18:02:39 +0800
Subject: [PATCH] feat: add MemberTag

---
 .../member/signin/config/ConfigModal.vue      |  8 +-
 src/views/member/tag/TagModal.vue             | 58 ++++++++++++++
 src/views/member/tag/index.vue                | 77 ++++++++++++++++++-
 src/views/member/tag/tag.data.ts              | 52 +++++++++++++
 4 files changed, 190 insertions(+), 5 deletions(-)
 create mode 100644 src/views/member/tag/TagModal.vue
 create mode 100644 src/views/member/tag/tag.data.ts

diff --git a/src/views/member/signin/config/ConfigModal.vue b/src/views/member/signin/config/ConfigModal.vue
index 2409c26..3eb7520 100644
--- a/src/views/member/signin/config/ConfigModal.vue
+++ b/src/views/member/signin/config/ConfigModal.vue
@@ -5,7 +5,7 @@ import { useI18n } from '@/hooks/web/useI18n'
 import { useMessage } from '@/hooks/web/useMessage'
 import { BasicForm, useForm } from '@/components/Form'
 import { BasicModal, useModalInner } from '@/components/Modal'
-import { createNotice, getNotice, updateNotice } from '@/api/system/notice'
+import { createSignInConfig, getSignInConfig, updateSignInConfig } from '@/api/member/signin/config'
 
 defineOptions({ name: 'SignInConfigModal' })
 
@@ -27,7 +27,7 @@ const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data
   setModalProps({ confirmLoading: false })
   isUpdate.value = !!data?.isUpdate
   if (unref(isUpdate)) {
-    const res = await getNotice(data.record.id)
+    const res = await getSignInConfig(data.record.id)
     setFieldsValue({ ...res })
   }
 })
@@ -37,9 +37,9 @@ async function handleSubmit() {
     const values = await validate()
     setModalProps({ confirmLoading: true })
     if (unref(isUpdate))
-      await updateNotice(values)
+      await updateSignInConfig(values)
     else
-      await createNotice(values)
+      await createSignInConfig(values)
 
     closeModal()
     emit('success')
diff --git a/src/views/member/tag/TagModal.vue b/src/views/member/tag/TagModal.vue
new file mode 100644
index 0000000..5f9871a
--- /dev/null
+++ b/src/views/member/tag/TagModal.vue
@@ -0,0 +1,58 @@
+<script lang="ts" setup>
+import { ref, unref } from 'vue'
+import { formSchema } from './tag.data'
+import { useI18n } from '@/hooks/web/useI18n'
+import { useMessage } from '@/hooks/web/useMessage'
+import { BasicForm, useForm } from '@/components/Form'
+import { BasicModal, useModalInner } from '@/components/Modal'
+import { createMemberTag, getMemberTag, updateMemberTag } from '@/api/member/tag'
+
+defineOptions({ name: 'MemberTagModal' })
+
+const emit = defineEmits(['success', 'register'])
+const { t } = useI18n()
+const { createMessage } = useMessage()
+const isUpdate = ref(true)
+
+const [registerForm, { setFieldsValue, resetFields, validate }] = useForm({
+  labelWidth: 120,
+  baseColProps: { span: 24 },
+  schemas: formSchema,
+  showActionButtonGroup: false,
+  actionColOptions: { span: 23 },
+})
+
+const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {
+  resetFields()
+  setModalProps({ confirmLoading: false })
+  isUpdate.value = !!data?.isUpdate
+  if (unref(isUpdate)) {
+    const res = await getMemberTag(data.record.id)
+    setFieldsValue({ ...res })
+  }
+})
+
+async function handleSubmit() {
+  try {
+    const values = await validate()
+    setModalProps({ confirmLoading: true })
+    if (unref(isUpdate))
+      await updateMemberTag(values)
+    else
+      await createMemberTag(values)
+
+    closeModal()
+    emit('success')
+    createMessage.success(t('common.saveSuccessText'))
+  }
+  finally {
+    setModalProps({ confirmLoading: false })
+  }
+}
+</script>
+
+<template>
+  <BasicModal v-bind="$attrs" :title="isUpdate ? t('action.edit') : t('action.create')" @register="registerModal" @ok="handleSubmit">
+    <BasicForm @register="registerForm" />
+  </BasicModal>
+</template>
diff --git a/src/views/member/tag/index.vue b/src/views/member/tag/index.vue
index ef9fd59..3d979d1 100644
--- a/src/views/member/tag/index.vue
+++ b/src/views/member/tag/index.vue
@@ -1,3 +1,78 @@
 <script lang="ts" setup>
-defineOptions({ name: 'MemberPointConfig' })
+import TagModal from './TagModal.vue'
+import { columns, searchFormSchema } from './tag.data'
+import { useI18n } from '@/hooks/web/useI18n'
+import { useMessage } from '@/hooks/web/useMessage'
+import { useModal } from '@/components/Modal'
+import { IconEnum } from '@/enums/appEnum'
+import { BasicTable, TableAction, useTable } from '@/components/Table'
+import { deleteMemberTag, getMemberTagPage } from '@/api/member/tag'
+
+defineOptions({ name: 'MemberTag' })
+
+const { t } = useI18n()
+const { createMessage } = useMessage()
+const [registerModal, { openModal }] = useModal()
+const [registerTable, { reload }] = useTable({
+  title: '标签列表',
+  api: getMemberTagPage,
+  columns,
+  formConfig: { labelWidth: 120, schemas: searchFormSchema },
+  useSearchForm: true,
+  showTableSetting: true,
+  showIndexColumn: false,
+  actionColumn: {
+    width: 140,
+    title: t('common.action'),
+    dataIndex: 'action',
+    fixed: 'right',
+  },
+})
+
+function handleCreate() {
+  openModal(true, { isUpdate: false })
+}
+
+function handleEdit(record: Recordable) {
+  openModal(true, { record, isUpdate: true })
+}
+
+async function handleDelete(record: Recordable) {
+  await deleteMemberTag(record.id)
+  createMessage.success(t('common.delSuccessText'))
+  reload()
+}
 </script>
+
+<template>
+  <div>
+    <BasicTable @register="registerTable">
+      <template #toolbar>
+        <a-button v-auth="['system:notice:create']" type="primary" :pre-icon="IconEnum.ADD" @click="handleCreate">
+          {{ t('action.create') }}
+        </a-button>
+      </template>
+      <template #bodyCell="{ column, record }">
+        <template v-if="column.key === 'action'">
+          <TableAction
+            :actions="[
+              { icon: IconEnum.EDIT, label: t('action.edit'), auth: 'system:notice:update', onClick: handleEdit.bind(null, record) },
+              {
+                icon: IconEnum.DELETE,
+                color: 'error',
+                label: t('action.delete'),
+                auth: 'system:notice:delete',
+                popConfirm: {
+                  title: t('common.delMessage'),
+                  placement: 'left',
+                  confirm: handleDelete.bind(null, record),
+                },
+              },
+            ]"
+          />
+        </template>
+      </template>
+    </BasicTable>
+    <TagModal @register="registerModal" @success="reload()" />
+  </div>
+</template>
diff --git a/src/views/member/tag/tag.data.ts b/src/views/member/tag/tag.data.ts
new file mode 100644
index 0000000..9652b41
--- /dev/null
+++ b/src/views/member/tag/tag.data.ts
@@ -0,0 +1,52 @@
+import type { BasicColumn, FormSchema } from '@/components/Table'
+import { useRender } from '@/components/Table'
+
+export const columns: BasicColumn[] = [
+  {
+    title: '编号',
+    dataIndex: 'id',
+    width: 100,
+  },
+  {
+    title: '标签名称',
+    dataIndex: 'name',
+    width: 180,
+  },
+  {
+    title: '创建时间',
+    dataIndex: 'createTime',
+    customRender: ({ text }) => {
+      return useRender.renderDate(text)
+    },
+  },
+]
+
+export const searchFormSchema: FormSchema[] = [
+  {
+    label: '标签名称',
+    field: 'name',
+    component: 'Input',
+    colProps: { span: 8 },
+  },
+  {
+    label: '创建时间',
+    field: 'createTime',
+    component: 'RangePicker',
+    colProps: { span: 8 },
+  },
+]
+
+export const formSchema: FormSchema[] = [
+  {
+    label: '编号',
+    field: 'id',
+    show: false,
+    component: 'Input',
+  },
+  {
+    label: '标签名称',
+    field: 'name',
+    required: true,
+    component: 'Input',
+  },
+]