Zhenxing.Lu 7 小時之前
父節點
當前提交
b9524a97b8

+ 1 - 1
src/api/sys/department.ts

@@ -4,7 +4,7 @@ import { BaseDataResp, BaseListReq, BaseResp, BaseIDsReq, BaseIDReq } from '@/ap
 import { DepartmentInfo, DepartmentListResp } from './model/departmentModel';
 
 enum Api {
-  CreateDepartment = '/sys-api/department/create',
+  CreateDepartment = '/wechat-api/department/create',
   UpdateDepartment = '/sys-api/department/update',
   GetDepartmentList = '/sys-api/department/list',
   DeleteDepartment = '/sys-api/department/delete',

+ 74 - 0
src/api/wechat/apiKey.ts

@@ -0,0 +1,74 @@
+import { defHttp } from '@/utils/http/axios';
+import { ErrorMessageMode } from '/#/axios';
+import { BaseDataResp, BaseListReq, BaseResp, BaseIDsReq, BaseIDReq } from '@/api/model/baseModel';
+import { ApiKeyInfo, ApiKeyListResp } from './model/apiKeyModel';
+
+enum Api {
+  CreateApiKey = '/wechat-api/api_key/create',
+  UpdateApiKey = '/wechat-api/api_key/update',
+  GetApiKeyList = '/wechat-api/api_key/list',
+  DeleteApiKey = '/wechat-api/api_key/delete',
+  GetApiKeyById = '/wechat-api/api_key',
+}
+
+/**
+ * @description: Get api key list
+ */
+
+export const getApiKeyList = (params: BaseListReq, mode: ErrorMessageMode = 'notice') => {
+  return defHttp.post<BaseDataResp<ApiKeyListResp>>(
+    { url: Api.GetApiKeyList, params },
+    { errorMessageMode: mode },
+  );
+};
+
+/**
+ *  @description: Create a new api key
+ */
+export const createApiKey = (params: ApiKeyInfo, mode: ErrorMessageMode = 'notice') => {
+  return defHttp.post<BaseResp>(
+    { url: Api.CreateApiKey, params: params },
+    {
+      errorMessageMode: mode,
+      successMessageMode: mode,
+    },
+  );
+};
+
+/**
+ *  @description: Update the api key
+ */
+export const updateApiKey = (params: ApiKeyInfo, mode: ErrorMessageMode = 'notice') => {
+  return defHttp.post<BaseResp>(
+    { url: Api.UpdateApiKey, params: params },
+    {
+      errorMessageMode: mode,
+      successMessageMode: mode,
+    },
+  );
+};
+
+/**
+ *  @description: Delete api keys
+ */
+export const deleteApiKey = (params: BaseIDsReq, mode: ErrorMessageMode = 'notice') => {
+  return defHttp.post<BaseResp>(
+    { url: Api.DeleteApiKey, params: params },
+    {
+      errorMessageMode: mode,
+      successMessageMode: mode,
+    },
+  );
+};
+
+/**
+ *  @description: Get api key By ID
+ */
+export const getApiKeyById = (params: BaseIDReq, mode: ErrorMessageMode = 'notice') => {
+  return defHttp.post<BaseDataResp<ApiKeyInfo>>(
+    { url: Api.GetApiKeyById, params: params },
+    {
+      errorMessageMode: mode,
+    },
+  );
+};

+ 25 - 0
src/api/wechat/model/apiKeyModel.ts

@@ -0,0 +1,25 @@
+import { BaseListResp } from '@/api/model/baseModel';
+
+/**
+ *  @description: ApiKey info response
+ */
+export interface ApiKeyInfo {
+  id?: number;
+  createdAt?: number;
+  updatedAt?: number;
+  title?: string;
+  key?: string;
+  organization_id?: number;
+  agent_id?: number;
+  agent_info?: *AgentInfo;
+  custom_agent_base?: string;
+  custom_agent_key?: string;
+  openai_base?: string;
+  openai_key?: string;
+}
+
+/**
+ *  @description: ApiKey list response
+ */
+
+export type ApiKeyListResp = BaseListResp<ApiKeyInfo>;

+ 12 - 13
src/locales/lang/en/wechat.ts

@@ -293,19 +293,18 @@ export default {
     editCreditBalance: 'Edit Balance',
     creditBalanceList: 'Balance List',
   },
-  xunji: {
-    status: 'Status',
-    appKey: 'AppKey',
-    appSecret: 'AppSecret',
-    token: 'Token',
-    encodingKey: 'EncodingKey',
-    agentId: 'AgentId',
+  apiKey: {
+    title: 'Title',
+    key: 'Key',
     organizationId: 'OrganizationId',
-    wxid: 'Wxid',
-    apiBase: 'ApiBase',
-    apiKey: 'ApiKey',
-    addXunji: 'Add Xunji',
-    editXunji: 'Edit Xunji',
-    xunjiList: 'Xunji List',
+    agentId: 'AgentId',
+    agentInfo: 'AgentInfo',
+    customAgentBase: 'CustomAgentBase',
+    customAgentKey: 'CustomAgentKey',
+    openaiBase: 'OpenaiBase',
+    openaiKey: 'OpenaiKey',
+    addApiKey: 'Add ApiKey',
+    editApiKey: 'Edit ApiKey',
+    apiKeyList: 'ApiKey List',
   },
 };

+ 12 - 13
src/locales/lang/zh-CN/wechat.ts

@@ -307,19 +307,18 @@ export default {
     editCreditBalance: '编辑余额',
     creditBalanceList: '余额列表',
   },
-  xunji: {
-    status: 'Status',
-    appKey: 'AppKey',
-    appSecret: 'AppSecret',
-    token: 'Token',
-    encodingKey: 'EncodingKey',
-    agentId: 'AgentId',
+  apiKey: {
+    title: 'Title',
+    key: 'Key',
     organizationId: 'OrganizationId',
-    wxid: 'Wxid',
-    apiBase: 'ApiBase',
-    apiKey: 'ApiKey',
-    addXunji: '添加 Xunji',
-    editXunji: '编辑 Xunji',
-    xunjiList: 'Xunji 列表',
+    agentId: 'AgentId',
+    agentInfo: 'AgentInfo',
+    customAgentBase: 'CustomAgentBase',
+    customAgentKey: 'CustomAgentKey',
+    openaiBase: 'OpenaiBase',
+    openaiKey: 'OpenaiKey',
+    addApiKey: '添加 ApiKey',
+    editApiKey: '编辑 ApiKey',
+    apiKeyList: 'ApiKey 列表',
   },
 };

+ 6 - 1
src/views/agent/agent_list/index.vue

@@ -3,7 +3,7 @@
     <div class="content">
       <div class="title">我的智能体</div>
       <iframe
-        src="https://wxadminapi-debug.gkscrm.com/wechat-api/api/fastgpt/set_token?username=zhenxing"
+        :src="`${host}/wechat-api/api/fastgpt/set_token?username=${token}`"
         frameborder="0"
         width="100%"
         height="100%"
@@ -14,6 +14,11 @@
   </div>
 </template>
 <script lang="ts" setup>
+import { useUserStore } from '@/store/modules/user'
+import { computed } from 'vue';
+const host = import.meta.env.VITE_GLOB_API_URL
+const userStore = useUserStore()
+const token = computed(() => userStore.token)
 </script>
 <style lang="scss" scoped>
   .container {

+ 9 - 1
src/views/agent/chat/index.vue

@@ -3,7 +3,7 @@
     <div class="content">
       <div class="title">AI对话</div>
       <iframe
-        src="https://wxadminapi-debug.gkscrm.com/wechat-api/api/fastgpt/set_token?username=zhenxing"
+        :src="`${host}/wechat-api/api/fastgpt/set_token?username=${token}`"
         frameborder="0"
         width="100%"
         height="100%"
@@ -13,6 +13,14 @@
     </div>
   </div>
 </template>
+<script lang="ts" setup>
+import { useUserStore } from '@/store/modules/user'
+import { computed } from 'vue';
+
+const host = import.meta.env.VITE_GLOB_API_URL
+const userStore = useUserStore()
+const token = computed(() => userStore.token)
+</script>
 <style lang="scss" scoped>
   .container {
     height: 100%;

+ 9 - 1
src/views/agent/dataset/index.vue

@@ -2,7 +2,7 @@
   <div class="container">
     <div class="content">
       <iframe
-        src="https://wxadminapi-debug.gkscrm.com/wechat-api/api/fastgpt/set_token?username=zhenxing"
+        :src="`${host}/wechat-api/api/fastgpt/set_token?username=${token}`"
         frameborder="0"
         width="100%"
         height="100%"
@@ -12,6 +12,14 @@
     </div>
   </div>
 </template>
+<script lang="ts" setup>
+import { useUserStore } from '@/store/modules/user'
+import { computed } from 'vue';
+
+const host = import.meta.env.VITE_GLOB_API_URL
+const userStore = useUserStore()
+const token = computed(() => userStore.token)
+</script>
 <style lang="scss" scoped>
   .container {
     height: 100%;

+ 8 - 1
src/views/agent/work_list/index.vue

@@ -3,7 +3,7 @@
     <div class="content">
       <div class="title">我的工作流</div>
       <iframe
-        src="https://wxadminapi-debug.gkscrm.com/wechat-api/api/fastgpt/set_token?username=zhenxing"
+        :src="`${host}/wechat-api/api/fastgpt/set_token?username=${token}`"
         frameborder="0"
         width="100%"
         height="100%"
@@ -13,6 +13,13 @@
     </div>
   </div>
 </template>
+<script lang="ts" setup>
+import { useUserStore } from '@/store/modules/user'
+import { computed } from 'vue';
+const host = import.meta.env.VITE_GLOB_API_URL
+const userStore = useUserStore()
+const token = computed(() => userStore.token)
+</script>
 <style lang="scss" scoped>
   .container {
     position: relative;

+ 62 - 0
src/views/wechat/api_key/ApiKeyDrawer.vue

@@ -0,0 +1,62 @@
+<template>
+  <BasicDrawer
+    v-bind="$attrs"
+    @register="registerDrawer"
+    showFooter
+    :title="getTitle"
+    width="35%"
+    @ok="handleSubmit"
+  >
+    <BasicForm @register="registerForm" />
+  </BasicDrawer>
+</template>
+<script lang="ts" setup>
+  import { ref, computed, unref } from 'vue';
+  import { BasicForm, useForm } from '@/components/Form/index';
+  import { formSchema } from './apiKey.data';
+  import { BasicDrawer, useDrawerInner } from '@/components/Drawer';
+  import { useI18n } from 'vue-i18n';
+
+  import { createApiKey, updateApiKey } from '@/api/wechat/apiKey';
+
+  const emit = defineEmits(['success', 'register']);
+  const isUpdate = ref(true);
+  const { t } = useI18n();
+
+  const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({
+    labelWidth: 160,
+    baseColProps: { span: 24 },
+    layout: 'vertical',
+    schemas: formSchema,
+    showActionButtonGroup: false,
+  });
+
+  const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => {
+    await resetFields();
+    setDrawerProps({ confirmLoading: false });
+
+    isUpdate.value = !!data?.isUpdate;
+
+    if (unref(isUpdate)) {
+      await setFieldsValue({
+        ...data.record,
+      });
+    }
+  });
+
+  const getTitle = computed(() =>
+    !unref(isUpdate) ? t('wechat.apiKey.addApiKey') : t('wechat.apiKey.editApiKey'),
+  );
+
+  async function handleSubmit() {
+    const values = await validate();
+    setDrawerProps({ confirmLoading: true });
+    values['id'] = unref(isUpdate) ? Number(values['id']) : 0;
+    let result = unref(isUpdate) ? await updateApiKey(values) : await createApiKey(values);
+    if (result.code === 0) {
+      closeDrawer();
+      emit('success');
+    }
+    setDrawerProps({ confirmLoading: false });
+  }
+</script>

+ 142 - 0
src/views/wechat/api_key/apiKey.data.ts

@@ -0,0 +1,142 @@
+import { BasicColumn, FormSchema } from '@/components/Table';
+import { useI18n } from '@/hooks/web/useI18n';
+import { formatToDateTime } from '@/utils/dateUtil';
+
+const { t } = useI18n();
+
+export const columns: BasicColumn[] = [
+  {
+    title: t('名称'),
+    dataIndex: 'title',
+    width: 100,
+  },
+  {
+    title: t('API Key'),
+    dataIndex: 'key',
+    width: 100,
+  },
+  // {
+  //   title: t('wechat.apiKey.organizationId'),
+  //   dataIndex: 'organization_id',
+  //   width: 100,
+  // },
+  // {
+  //   title: t('wechat.apiKey.agentId'),
+  //   dataIndex: 'agent_id',
+  //   width: 100,
+  // },
+  {
+    title: t('AI 角色'),
+    dataIndex: 'agent_info.name',
+    width: 100,
+    customRender: ({ record }) => {
+      return record.agent_info.name == null ? '定制 AI 角色' : record.agent_info.name
+    },
+  },
+  // {
+  //   title: t('wechat.apiKey.customAgentBase'),
+  //   dataIndex: 'custom_agent_base',
+  //   width: 100,
+  // },
+  // {
+  //   title: t('wechat.apiKey.customAgentKey'),
+  //   dataIndex: 'custom_agent_key',
+  //   width: 100,
+  // },
+  // {
+  //   title: t('wechat.apiKey.openaiBase'),
+  //   dataIndex: 'openai_base',
+  //   width: 100,
+  // },
+  // {
+  //   title: t('wechat.apiKey.openaiKey'),
+  //   dataIndex: 'openai_key',
+  //   width: 100,
+  // },
+  {
+    title: t('创建时间'),
+    dataIndex: 'createdAt',
+    width: 70,
+    customRender: ({ record }) => {
+      return formatToDateTime(record.createdAt);
+    },
+  },
+];
+
+export const searchFormSchema: FormSchema[] = [
+  {
+    field: 'key',
+    label: t('wechat.apiKey.key'),
+    component: 'Input',
+    colProps: { span: 8 },
+  },
+  {
+    field: 'organizationId',
+    label: t('wechat.apiKey.organizationId'),
+    component: 'Input',
+    colProps: { span: 8 },
+  },
+];
+
+export const formSchema: FormSchema[] = [
+  {
+    field: 'id',
+    label: 'ID',
+    component: 'Input',
+    show: false,
+  },
+  {
+    field: 'title',
+    label: t('名称'),
+    component: 'Input',
+    required: true,
+  },
+  // {
+  //   field: 'key',
+  //   label: t('wechat.apiKey.key'),
+  //   component: 'Input',
+  //   required: true,
+  // },
+  // {
+  //   field: 'organization_id',
+  //   label: t('wechat.apiKey.organizationId'),
+  //   component: 'InputNumber',
+  //   required: true,
+  // },
+  // {
+  //   field: 'agent_id',
+  //   label: t('wechat.apiKey.agentId'),
+  //   component: 'InputNumber',
+  //   required: true,
+  // },
+  // {
+  //   field: 'agent_info',
+  //   label: t('wechat.apiKey.agentInfo'),
+  //   component: 'Input',
+  //   required: true,
+  // },
+  {
+    field: 'custom_agent_base',
+    label: t('模型服务地址'),
+    component: 'Input',
+    required: false,
+  },
+  {
+    field: 'custom_agent_key',
+    label: t('模型服务密钥'),
+    component: 'Input',
+    required: false,
+  },
+  // {
+  //   field: 'openai_base',
+  //   label: t('wechat.apiKey.openaiBase'),
+  //   component: 'Input',
+  //   required: false,
+  // },
+  // {
+  //   field: 'openai_key',
+  //   label: t('wechat.apiKey.openaiKey'),
+  //   component: 'Input',
+  //   required: false,
+  // },
+];

+ 251 - 0
src/views/wechat/api_key/index.vue

@@ -0,0 +1,251 @@
+<template>
+  <div>
+    <BasicTable @register="registerTable">
+      <template #tableTitle>
+        <Button
+          type="primary"
+          danger
+          preIcon="ant-design:delete-outlined"
+          v-if="showDeleteButton"
+          @click="handleBatchDelete"
+        >
+          {{ t('common.delete') }}
+        </Button>
+      </template>
+      <template #toolbar>
+        <a-button type="primary" @click="handleCreate">
+          {{ t('wechat.apiKey.addApiKey') }}
+        </a-button>
+      </template>
+      <template #bodyCell="{ column, record }">
+        <template v-if="column.key === 'action'">
+          <TableAction
+            :actions="[
+              {
+                label: t('common.edit'),
+                onClick: handleEdit.bind(null, record),
+              },
+              {
+                label: '选择 AI 角色',
+                onClick: handleEditMode.bind(null, record),
+              },
+              {
+                label: '令牌详情',
+                onClick: handleTokenList.bind(null, record),
+              },
+              {
+                label: t('common.delete'),
+                color: 'error' as 'error',
+                popConfirm: {
+                  title: t('common.deleteConfirm'),
+                  placement: 'left',
+                  confirm: handleDelete.bind(null, record),
+                },
+              },
+            ]"
+          />
+        </template>
+      </template>
+    </BasicTable>
+    <ApiKeyDrawer @register="registerDrawer" @success="handleSuccess" />
+    <Modal
+      width="70vw"
+      v-model:open="tokenVisible"
+      title="令牌详情"
+      @ok="tokenVisible = false"
+    >
+      <Table
+        :loading="tokenTableLoading"
+        :dataSource="tokenDataSource"
+        :columns="tokenColumns"
+        :pagination="tokenTablePagination"
+        :scroll="{ y: '50vh' }"
+      ></Table>
+    </Modal>
+    <SelectAIAgentModal @register="registerAIAgentModal" @ok="handleUpdateAgent" />
+  </div>
+</template>
+<script lang="ts" setup>
+  import { createVNode, ref, reactive } from 'vue';
+  import { Modal, Table } from 'ant-design-vue';
+  import { ExclamationCircleOutlined } from '@ant-design/icons-vue/lib/icons';
+  import { BasicTable, useTable, TableAction } from '@/components/Table';
+  import { Button } from '@/components/Button';
+  import { useModal } from '/@/components/Modal';
+  import { useDrawer } from '@/components/Drawer';
+  import ApiKeyDrawer from './ApiKeyDrawer.vue';
+  import { useI18n } from 'vue-i18n';
+  import SelectAIAgentModal from '@/views/components/SelectAIAgentModal.vue';
+  import { formatToDateTime } from "@/utils/dateUtil";
+
+  import { columns, searchFormSchema } from './apiKey.data';
+  import { getApiKeyList, deleteApiKey, updateApiKey } from '@/api/wechat/apiKey';
+  import { getUsageDetailList } from '@/api/wechat/usageDetail';
+  import type { UsageDetailInfo } from '@/api/wechat/model/usageDetailModel';
+
+  defineOptions({ name: 'ApiKeyManagement' });
+
+  const { t } = useI18n();
+  const selectedIds = ref<number[] | string[]>();
+  const showDeleteButton = ref<boolean>(false);
+  const tokenVisible = ref(false);
+  const tokenTableLoading = ref(false);
+  const tokenDataSource = ref<UsageDetailInfo[]>([]);
+  const accountId = ref<number>();
+
+  const tokenTablePagination = reactive({
+    pageSize: 20,
+    total: 0,
+    hideOnSinglePage: true
+  });
+
+  const tokenColumns = [{
+    title: t('wechat.usageDetail.botId'),
+    dataIndex: 'botId',
+    key: 'botId'
+  }, {
+    title: t('wechat.usageDetail.receiverId'),
+    dataIndex: 'receiverId',
+    key: 'receiverId'
+  }, {
+    title: t('wechat.usageDetail.app'),
+    dataIndex: 'App',
+    key: 'App'
+  }, {
+    title: t('wechat.usageDetail.request'),
+    dataIndex: 'request',
+    key: 'request',
+    ellipsis: true,
+  }, {
+    title: t('wechat.usageDetail.response'),
+    dataIndex: 'response',
+    key: 'response',
+    ellipsis: true,
+  }, {
+    title: t('wechat.usageDetail.totalTokens'),
+    dataIndex: 'totalTokens',
+    key: 'totalTokens',
+  }, {
+    title: t('wechat.usageDetail.promptTokens'),
+    dataIndex: 'promptTokens',
+    key: 'promptTokens',
+  }, {
+    title: t('wechat.usageDetail.completionTokens'),
+    dataIndex: 'completionTokens',
+    key: 'completionTokens',
+  },{
+    title: t('wechat.usageDetail.createTime'),
+    dataIndex: 'createdAt',
+    customRender: ({ record }) => {
+      return formatToDateTime(record.createdAt);
+    }
+  },];
+
+  const [registerDrawer, { openDrawer }] = useDrawer();
+  const [registerAIAgentModal, { openModal: openAIAgentModal, closeModal: closeAIAgentModal }] = useModal();
+  const [registerTable, { reload }] = useTable({
+    title: t('wechat.apiKey.apiKeyList'),
+    api: getApiKeyList,
+    columns,
+    formConfig: {
+      labelWidth: 120,
+      schemas: searchFormSchema,
+    },
+    useSearchForm: false,
+    showTableSetting: true,
+    bordered: false,
+    showIndexColumn: false,
+    clickToRowSelect: false,
+    actionColumn: {
+      width: 130,
+      title: t('common.action'),
+      dataIndex: 'action',
+      fixed: 'right',
+    },
+    rowKey: 'id',
+    rowSelection: {
+      type: 'checkbox',
+      columnWidth: 20,
+      onChange: (selectedRowKeys, _selectedRows) => {
+        selectedIds.value = selectedRowKeys as number[];
+        showDeleteButton.value = selectedRowKeys.length > 0;
+      },
+    },
+  });
+
+  function handleCreate() {
+    openDrawer(true, {
+      isUpdate: false,
+    });
+  }
+
+  function handleEdit(record: Recordable) {
+    openDrawer(true, {
+      record,
+      isUpdate: true,
+    });
+  }
+
+  async function handleDelete(record: Recordable) {
+    const result = await deleteApiKey({ ids: [record.id] });
+    if (result.code === 0) {
+      await reload();
+    }
+  }
+
+  async function handleBatchDelete() {
+    Modal.confirm({
+      title: t('common.deleteConfirm'),
+      icon: createVNode(ExclamationCircleOutlined),
+      async onOk() {
+        const result = await deleteApiKey({ ids: selectedIds.value as number[] });
+        if (result.code === 0) {
+          showDeleteButton.value = false;
+          await reload();
+        }
+      },
+      onCancel() {
+        console.log('Cancel');
+      },
+    });
+  }
+
+  async function handleSuccess() {
+    await reload();
+  }
+
+  //编辑模式
+  function handleEditMode(record: Recordable) {
+    accountId.value = record.id;
+    const name = record.agentInfo?.name == null ? '定制 AI 角色' : record.agentInfo?.name;
+    const id = record.agentInfo?.id == null ? 0 : record.agentInfo?.id;
+    openAIAgentModal(true, {
+      accountId: record.id,
+      name,
+      id,
+      organizationId: record.organizationId
+    })
+  }
+
+  async function handleTokenList(record: Recordable) {
+    tokenVisible.value = true;
+    tokenTableLoading.value = true;
+    try {
+      const res = await getUsageDetailList({ botId: record.key, page: 1, pageSize: 1000 });
+      tokenDataSource.value = res.data.data;
+      tokenTablePagination.total = res.data.total;
+    } catch(e) {
+      console.error(e);
+    } finally {
+      tokenTableLoading.value = false;
+    }
+  }
+
+  async function handleUpdateAgent(params) {
+    params.agent_id = params.agentId;
+    delete params.agentId;
+    await updateApiKey(params);
+    closeAIAgentModal();
+    reload();
+  }
+</script>

+ 1 - 1
src/views/wechat/sop_task/add_sop/components/sopTaskName.vue

@@ -58,7 +58,7 @@
                 @change="handleTableChange"
               />
             </TabPane>
-            <TabPane key="3" tab="企微" v-if="false">
+            <TabPane key="3" tab="企微">
               <WxTable
                 v-model:alertVisible="alertVisible"
                 :columns="columns"

+ 0 - 1
src/views/wechat/wx/WxDrawer.vue

@@ -18,7 +18,6 @@
   <BasicModal
     @register="registerModal"
     v-bind="$attrs"
-    :visible="true"
     title="扫码登陆"
     :helpMessage="['扫码完成后请等待页面刷新']"
     :destroyOnClose="true"

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

@@ -11,7 +11,7 @@ export const columns: BasicColumn[] = [
     title: '租户名称',
     dataIndex: 'organizationName',
     resizable: true,
-    // width: 180,
+    width: 180,
   },
   {
     title: '微信类型',
@@ -29,7 +29,7 @@ export const columns: BasicColumn[] = [
     title: t('wechat.wx.wxid'),
     dataIndex: 'wxid',
     resizable: true,
-    // width: 180,
+    width: 180,
   },
   {
     title: t('wechat.wx.headBig'),