瀏覽代碼

添加给联系人发送信息

kyoyue 11 月之前
父節點
當前提交
b28fed0713

+ 1 - 0
src/api/sys/captcha.ts

@@ -5,6 +5,7 @@ import { defHttp } from '@/utils/http/axios';
 
 enum Api {
   GetCaptcha = '/sys-api/captcha',
+  // GetCaptcha = '/captcha',
   SendEmailCaptcha = '/sys-api/captcha/email',
   SendSmsCaptcha = '/sys-api/captcha/sms',
 }

+ 24 - 0
src/api/wechat/model/tesModel.ts

@@ -0,0 +1,24 @@
+import { BaseListResp } from '@/api/model/baseModel';
+
+/**
+ *  @description: Tes info response
+ */
+export interface TesInfo {
+  // id?: number;
+  // createdAt?: number;
+  // updatedAt?: number;
+  // status?: number;
+  // name?: string;
+  // publicIp?: string;
+  // privateIp?: string;
+  // adminPort?: string;
+  senderWxId?: any;
+  receiverWxId?: any;
+  msg?: any;
+}
+
+/**
+ *  @description: Tes list response
+ */
+
+export type TesListResp = BaseListResp<TesInfo>;

+ 20 - 0
src/api/wechat/tes.ts

@@ -0,0 +1,20 @@
+import { defHttp } from '@/utils/http/axios';
+import { ErrorMessageMode } from '/#/axios';
+import { BaseDataResp, BaseListReq, BaseResp, BaseIDsReq, BaseIDReq } from '@/api/model/baseModel';
+import { TesInfo, TesListResp } from './model/tesModel';
+
+enum Api {
+  SendWxMsg = '/wechat-api/wxhook/sendTextMsg'
+}
+
+/**
+ *  @description: 发送信息给联系人
+ */
+export const sendWxMsg = (params: TesInfo, mode: ErrorMessageMode = 'notice') => {
+  return defHttp.post<BaseResp>(
+    { url: Api.SendWxMsg, params: params },
+    {
+      errorMessageMode: mode,
+    },
+  );
+};

+ 2 - 1
src/components/Drawer/src/typing.ts

@@ -8,7 +8,8 @@ export interface DrawerInstance {
 }
 
 export interface ReturnMethods extends DrawerInstance {
-  openDrawer: <T = any>(open?: boolean, data?: T, openOnSet?: boolean) => void;
+  openDrawer: <T = any>(open?: boolean, data?: T, openOnSet?: boolean) => void; 
+  openDrawerMsg: <T = any>(open?: boolean, data?: T, openOnSet?: boolean) => void;
   closeDrawer: () => void;
   getOpen?: ComputedRef<boolean>;
 }

+ 16 - 0
src/components/Drawer/src/useDrawer.ts

@@ -89,6 +89,22 @@ export function useDrawer(): UseDrawerReturnType {
         dataTransferRef[unref(uid)] = toRaw(data);
       }
     },
+    openDrawerMsg: <T = any>(open = true, data?: T, openOnSet = true): void => {
+      getInstance()?.setDrawerProps({
+        open,
+      });
+      if (!data) return;
+
+      if (openOnSet) {
+        dataTransferRef[unref(uid)] = null;
+        dataTransferRef[unref(uid)] = toRaw(data);
+        return;
+      }
+      const equal = isEqual(toRaw(dataTransferRef[unref(uid)]), toRaw(data));
+      if (!equal) {
+        dataTransferRef[unref(uid)] = toRaw(data);
+      }
+    },
     closeDrawer: () => {
       getInstance()?.setDrawerProps({ open: false });
     },

+ 1 - 0
src/views/wechat/contact/ContactDrawer.vue

@@ -54,6 +54,7 @@
 
       async function handleSubmit() {
         const values = await validate();
+        console.log(values,'values')
         setDrawerProps({ confirmLoading: true });
         values['id'] = unref(isUpdate) ? Number(values['id']) : 0;
         let result = unref(isUpdate) ? await updateContact(values) : await createContact(values);

+ 83 - 0
src/views/wechat/contact/SendMsgDrawer.vue

@@ -0,0 +1,83 @@
+<template>
+  <BasicDrawer
+    v-bind="$attrs"
+    @register="registerDrawerMsg"
+    showFooter
+    title="发送信息"
+    width="500px"
+    @ok="handleSubmit"
+  >
+    <BasicForm @register="registerForm" />
+  </BasicDrawer>
+</template>
+
+<script lang="ts">
+  import { defineComponent, ref, computed } from 'vue';
+  import { message } from 'ant-design-vue';
+  import { BasicForm, useForm } from '@/components/Form/index';
+  import { formSchema } from './send-msg.data'; // 假设存在一个send-msg.data.ts文件来定义表单结构
+  import { BasicDrawer, useDrawerInner } from '@/components/Drawer';
+  // import { useI18n } from 'vue-i18n';
+
+  // 假设存在一个发送消息的API函数
+  import { sendWxMsg } from '@/api/wechat/tes';
+
+  let senderWxId: any;
+  let receiverWxId: any;
+  export default defineComponent({
+    name: 'SendMsgDrawer',
+    components: { BasicDrawer, BasicForm },
+    emits: ['success', 'register'],
+    setup(_, { emit }) {
+      // const { t } = useI18n();
+      
+      const [registerForm, { resetFields,  validate }] = useForm({
+        // 假设表单结构由send-msg.data.ts文件中的formSchema定义
+        // 这里省略了具体的表单结构,你可以根据需要定义
+        // schemas: formSchema,
+        // 其他表单配置,根据实际需要添加
+        labelWidth: 160,
+        baseColProps: { span: 24 },
+        layout: 'vertical',
+        schemas: formSchema,
+        showActionButtonGroup: false,
+      });
+
+      const [registerDrawerMsg, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => {
+        resetFields();
+        setDrawerProps({ confirmLoading: false });
+        
+        senderWxId = data.record.wxWxid
+        receiverWxId = data.record.wxid
+      });
+
+      // const getTitle = computed(() => t('sendMsgDrawer.title'));
+
+      async function handleSubmit() {
+        const values = await validate();
+        setDrawerProps({ confirmLoading: true });
+        // 发送消息
+        const result = await sendWxMsg({
+          senderWxId,
+          receiverWxId,
+          msg: values.msg,
+        });
+
+        if (result.code === 0) {
+          closeDrawer();
+          message.success('发送成功!');
+          emit('success');
+        }
+
+        setDrawerProps({ confirmLoading: false });
+      }
+
+      return {
+        registerDrawerMsg,
+        registerForm,
+        // getTitle,
+        handleSubmit,
+      };
+    },
+  });
+</script>

+ 2 - 2
src/views/wechat/contact/contact.data.ts

@@ -15,7 +15,7 @@ export const columns: BasicColumn[] = [
   {
     title: t('wechat.contact.type'),
     dataIndex: 'type',
-    width: 100,
+    width: 50,
   },
   {
     title: t('wechat.contact.wxid'),
@@ -30,7 +30,7 @@ export const columns: BasicColumn[] = [
   {
     title: t('wechat.contact.lag'),
     dataIndex: 'lag',
-    width: 100,
+    width: 80,
   },
 ];
 

+ 23 - 4
src/views/wechat/contact/index.vue

@@ -17,11 +17,15 @@
           {{ t('wechat.contact.addContact') }}
         </a-button>
       </template>
-      <template #bodyCell="{ column, record }">
+      <template #bodyCell="{ column, record }" >
         <template v-if="column.key === 'action'">
-          <TableAction
+          <TableAction 
             :actions="[
               {
+                icon: 'ant-design:comment-outlined',
+                onClick: handleMsg.bind(null, record),
+              },
+              {
                 icon: 'clarity:note-edit-line',
                 onClick: handleEdit.bind(null, record),
               },
@@ -40,6 +44,7 @@
       </template>
     </BasicTable>
     <ContactDrawer @register="registerDrawer" @success="handleSuccess" />
+    <SendMsgDrawer  @register="registerDrawerMsg" @success="handleSuccess1"/>
   </div>
 </template>
 <script lang="ts">
@@ -51,6 +56,7 @@
 
   import { useDrawer } from '@/components/Drawer';
   import ContactDrawer from './ContactDrawer.vue';
+  import SendMsgDrawer from './SendMsgDrawer.vue'
   import { useI18n } from 'vue-i18n';
 
   import { columns, searchFormSchema } from './contact.data';
@@ -58,13 +64,14 @@
 
   export default defineComponent({
     name: 'ContactManagement',
-    components: { BasicTable, ContactDrawer, TableAction, Button },
+    components: { BasicTable,SendMsgDrawer, ContactDrawer, TableAction, Button },
     setup() {
       const { t } = useI18n();
       const selectedIds = ref<number[] | string[]>();
       const showDeleteButton = ref<boolean>(false);
 
       const [registerDrawer, { openDrawer }] = useDrawer();
+      const [registerDrawerMsg,{ openDrawerMsg }] = useDrawer();
       const [registerTable, { reload }] = useTable({
         title: t('wechat.contact.contactList'),
         api: getContactList,
@@ -79,7 +86,7 @@
         showIndexColumn: false,
         clickToRowSelect: false,
         actionColumn: {
-          width: 30,
+          width: 60,
           title: t('common.action'),
           dataIndex: 'action',
           fixed: undefined,
@@ -106,6 +113,12 @@
           isUpdate: true,
         });
       }
+      function handleMsg(record: Recordable) {
+        console.log(record,'"')
+         openDrawerMsg(true, {
+          record,
+        });
+      }
 
       async function handleDelete(record: Recordable) {
         const result = await deleteContact({ ids: [record.id] });
@@ -134,15 +147,21 @@
       async function handleSuccess() {
         await reload();
       }
+      async function handleSuccess1() {
+        await reload();
+      }
 
       return {
         t,
         registerTable,
         registerDrawer,
+        registerDrawerMsg,
         handleCreate,
+        handleMsg,
         handleEdit,
         handleDelete,
         handleSuccess,
+        handleSuccess1,
         handleBatchDelete,
         showDeleteButton,
       };

+ 43 - 0
src/views/wechat/contact/send-msg.data.ts

@@ -0,0 +1,43 @@
+// send-msg.data.ts
+import { FormSchema } from '@/components/Table';
+import { useI18n } from '@/hooks/web/useI18n';
+const { t } = useI18n();
+
+// 定义表单结构
+export const formSchema: FormSchema[] =[
+  {
+    field: 'msg',
+    label: t('信息'),
+    component: 'Input',
+    required: true,
+  },
+  // {
+  //   // 文本信息
+  //   name: 'textMessage',
+  //   component: 'Input',
+  //   label:t('信息'),
+  //   rules: [{ required: true, message: 'Please enter text message', trigger: 'blur' }],
+  // },
+  // {
+  //   // 图片信息
+  //   field: 'imageMessage',
+  //   component: 'Upload',
+  //   label: t('图片'),
+  //   // required: true,
+  //   uploadConfig: {
+  //     accept: 'image/*',
+  //     maxSize: 5 * 1024 * 1024, // 5MB
+  //   },
+  // },
+  // {
+  //   // 文件信息
+  //   field: 'fileMessage',
+  //   component: 'Upload',
+  //   label: t('文件'),
+  //   // required: true,
+  //   uploadConfig: {
+  //     accept: '*/*',
+  //     maxSize: 10 * 1024 * 1024, // 10MB
+  //   },
+  // },
+];

+ 11 - 5
vite.config.ts

@@ -15,14 +15,20 @@ export default defineApplicationConfig({
     },
     server: {
       proxy: {
-        '/sys-api': {
-          target: 'http://localhost:9100',
+        "/api":{
+          target: 'http://localhost:19101',
           changeOrigin: true,
           ws: true,
-          rewrite: (path) => path.replace(new RegExp(`^/sys-api`), ''),
-          // only https
-          // secure: false
+          rewrite: (path) => path.replace(new RegExp(`^/api`), ''),
         },
+        // '/sys-api': {
+        //   target: 'http://localhost:9100',
+        //   changeOrigin: true,
+        //   ws: true,
+        //   rewrite: (path) => path.replace(new RegExp(`^/sys-api`), ''),
+        //   // only https
+        //   // secure: false
+        // },
         '/fms-api': {
           target: 'http://localhost:9102',
           changeOrigin: true,

+ 65 - 0
wechat/etc/wechat.yaml

@@ -0,0 +1,65 @@
+Name: Wechat.api
+Host: 0.0.0.0
+Port: 19101
+Timeout: 30000
+
+Auth:
+  AccessSecret: "jS6VKDtsJf3z1n2VKDtsJf3z1n2"
+  AccessExpire: 259200
+
+CROSConf:
+  Address: '*'
+
+Log:
+  ServiceName: WechatApiLogger
+  Mode: console
+#  Path: D:\code\gooki\sa\logs\Wechat\api
+  Path: .
+  Level: info
+  Compress: false
+  KeepDays: 7
+  StackCoolDownMillis: 100
+
+DatabaseConf:
+  Type: mysql
+  Host: 192.168.66.57
+  Port: 3306
+  DBName: wechat
+  Username: root
+  Password: simple-admin.
+  MaxOpenConn: 100
+  SSLMode: disable
+  CacheTime: 5
+
+CoreRpc:
+  # Target: k8s://default/core-rpc-svc:9101
+  Endpoints:
+    - 192.168.66.57:9101
+  Enabled: true
+
+RedisConf:
+  Host: 192.168.66.57:6379
+
+CasbinDatabaseConf:
+  Type: mysql
+  Host: 192.168.66.57
+  Port: 3306
+  DBName: wechat-admin
+  Username: root
+  Password: simple-admin.
+  MaxOpenConn: 100
+  SSLMode: disable
+  CacheTime: 5
+
+CasbinConf:
+  ModelText: |
+    [request_definition]
+    r = sub, obj, act
+    [policy_definition]
+    p = sub, obj, act
+    [role_definition]
+    g = _, _
+    [policy_effect]
+    e = some(where (p.eft == allow))
+    [matchers]
+    m = r.sub == p.sub && keyMatch2(r.obj,p.obj) && r.act == p.act

二進制
wechat/wechat-api