瀏覽代碼

fix(官网运营): 页面

tangning 3 年之前
父節點
當前提交
bc2f6b8f92

+ 1 - 1
.env.development

@@ -6,7 +6,7 @@ VITE_PUBLIC_PATH = /
 
 # Cross-domain proxy, you can configure multiple
 # Please note that no line breaks
-VITE_PROXY = [["/basic-api","http://localhost:3000"],["/upload","http://localhost:3300/upload"],["/newV4","http://v4-test.4dkankan.com/manage"]]
+VITE_PROXY = [["/basic-api","http://localhost:3000"],["/upload","http://v4-test.4dkankan.com/manage/service/manage/common/upload/files"],["/newV4","http://v4-test.4dkankan.com/manage"]]
 # VITE_PROXY=[["/api","https://vvbin.cn/test"]]
 
 # Delete console

+ 1 - 0
package.json

@@ -53,6 +53,7 @@
     "pinia": "2.0.0",
     "qrcode": "^1.4.4",
     "qs": "^6.10.1",
+    "tinymce": "^5.10.2",
     "resize-observer-polyfill": "^1.5.1",
     "sortablejs": "^1.14.0",
     "vue": "^3.2.21",

+ 2 - 2
src/api/account/index.ts

@@ -8,7 +8,7 @@ import { Result } from '/#/axios';
 enum Api {
   pageList = '/newV4/service/manage/user/list',
   getIncrementListByUserId = '/newV4/service/manage/user/getIncrementListByUserId',
-  IncrementDelay = '/newV4/service/manage/user/IncrementDelay',
+  IncrementDelay = '/newV4/service/manage/user/incrementDelay',
   addUserIncrement = '/newV4/service/manage/user/addUserIncrement',
   addDownNum = '/newV4/service/manage/user/addDownNum',
   getCameraDetail = '/newV4/service/manage/user/getCameraDetail',
@@ -88,7 +88,7 @@ defHttp.post<userList>({
 
 //相机解绑
 export const UnbindCameraApi = (params: PageParams) =>
-defHttp.post<userList>({
+defHttp.get<userList>({
   url: Api.unbindCamera,
   params: params,
   headers: {

+ 170 - 47
src/api/operate/index.ts

@@ -7,6 +7,7 @@ import {
   RentListGetResultModel,
   checkDownLoadResult,
   sceneDownloadResult,
+  ResultDetail,
   addCameraParams,
   updateParams,
 } from './model';
@@ -14,6 +15,23 @@ import { Result } from '/#/axios';
 
 enum Api {
   pageList = '/newV4/service/manage/news/pageNews',
+  newDisplay = '/newV4/service/manage/news/display',
+  newPutTop = '/newV4/service/manage/news/putTop',
+  newUpdateNews = '/newV4/service/manage/news/updateNews',
+  newAddNews = '/newV4/service/manage/news/addNews',
+  newDelete = '/newV4/service/manage/news/delete',
+  publicNews = '/newV4/service/manage/news/publicNews',
+  newGetNewsDetail = '/newV4/service/manage/news/getNewsDetail',
+  //招聘
+  employNoteList = '/newV4/service/manage/employNote/list',
+  addOrUpdate = '/newV4/service/manage/employNote/addOrUpdate',
+  employNoteDelete = '/newV4/service/manage/employNote/delete',
+  employNoteIsPush = '/newV4/service/manage/employNote/isPush',
+  employNoteIsTop = '/newV4/service/manage/employNote/isTop',
+  //留言
+  intercomMessageList = '/newV4/service/manage/intercomMessage/list',
+  intercomMessageHandle = '/newV4/service/manage/intercomMessage/handle',
+
   operateSceneList = '/newV4/service/manage/scene/list',
   sceneMove = '/newV4/service/manage/scene/move',
   sceneDelete = '/newV4/service/manage/scene/delete',
@@ -40,6 +58,88 @@ export const ListApi = (params: PageParams) =>
       ignoreCancelToken: true,
     },
   });
+//显示隐藏
+export const NewDisplay = (params: PageParams) =>
+  defHttp.post<RentListGetResultModel>({
+    url: Api.newDisplay,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+//新闻管理/修改是否置顶
+export const NewPutTop = (params: PageParams) =>
+  defHttp.post<RentListGetResultModel>({
+    url: Api.newPutTop,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+//新闻管理/获取新闻详情
+export const NewsDetail = (params: PageParams) =>
+  defHttp.post<ResultDetail>({
+    url: Api.newGetNewsDetail,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+//新闻管理/修改是否发布
+export const NewPublicNews = (params: PageParams) =>
+  defHttp.post<RentListGetResultModel>({
+    url: Api.publicNews,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+//新闻管理/新增新闻
+export const newAddNews = (params: PageParams) =>
+  defHttp.post<RentListGetResultModel>({
+    url: Api.newAddNews,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+//新闻管理/新增新闻
+export const newUpdateNews = (params: PageParams) =>
+  defHttp.post<RentListGetResultModel>({
+    url: Api.newUpdateNews,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+//新闻管理/新增新闻
+export const newDelete = (params: PageParams) =>
+  defHttp.post<RentListGetResultModel>({
+    url: Api.newDelete,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
 
 export const operateSceneList = (params: operateList) =>
   defHttp.post<Result>({
@@ -141,51 +241,74 @@ export const sceneCopy = (params: sceneControlParams) =>
       ignoreCancelToken: true,
     },
   });
-// export const unDeviceApi = (params: PageParams) =>
-//   defHttp.post<RentListGetResultModel>({
-//     url: Api.unbindDevice,
-//     params,
-//     headers: {
-//       // @ts-ignore
-//       ignoreCancelToken: true,
-//     },
-//   });
-// export const allCompanyApi = (params: PageParams) =>
-//   defHttp.post<RentListGetResultModel>({
-//     url: Api.allCompany,
-//     params,
-//     headers: {
-//       // @ts-ignore
-//       ignoreCancelToken: true,
-//     },
-//   });
-
-// export const addCameraApi = (params: addCameraParams) =>
-//   defHttp.post<RentListGetResultModel>({
-//     url: Api.addCamera,
-//     params,
-//     headers: {
-//       // @ts-ignore
-//       ignoreCancelToken: true,
-//     },
-//   });
-
-// export const editCameraApi = (params: addCameraParams) =>
-//   defHttp.post<RentListGetResultModel>({
-//     url: Api.editCamera,
-//     params,
-//     headers: {
-//       // @ts-ignore
-//       ignoreCancelToken: true,
-//     },
-//   });
+// 招聘管理/列表
+export const employNoteList = (params: PageParams) =>
+  defHttp.post<RentListGetResultModel>({
+    url: Api.employNoteList,
+    params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+// 招聘管理/新增或修改
+export const addOrUpdate = (params: PageParams) =>
+  defHttp.post<RentListGetResultModel>({
+    url: Api.addOrUpdate,
+    params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
 
-// export const updateLiveRoomInfoApi = (params: updateParams) =>
-//   defHttp.post<Result>({
-//     url: Api.updateLiveRoomInfo,
-//     params,
-//     headers: {
-//       // @ts-ignore
-//       ignoreCancelToken: true,
-//     },
-//   });
+// 招聘管理/删除
+export const employNoteDelete = (params: PageParams) =>
+  defHttp.post<RentListGetResultModel>({
+    url: Api.employNoteDelete,
+    params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+// 招聘管理/发布撤回
+export const employNoteIsPush = (params: addCameraParams) =>
+  defHttp.post<RentListGetResultModel>({
+    url: Api.employNoteIsPush,
+    params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+// 招聘管理/置顶撤回
+export const employNoteIsTop = (params: addCameraParams) =>
+  defHttp.post<RentListGetResultModel>({
+    url: Api.employNoteIsTop,
+    params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+// 留言管理/列表
+export const intercomMessageList = (params: updateParams) =>
+  defHttp.post<Result>({
+    url: Api.intercomMessageList,
+    params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+// 留言管理/列表
+export const intercomMessageHandle = (params: updateParams) =>
+  defHttp.post<Result>({
+    url: Api.intercomMessageHandle,
+    params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });

+ 18 - 0
src/api/operate/model.ts

@@ -27,6 +27,24 @@ export interface sceneMoveParams {
 export interface sceneControlParams {
   num: string;
 }
+export interface ResultDetail{
+  content: string,
+  coverImageUrl: string,
+  createTime: string,
+  createrId: number;
+  display: number;
+  id: number;
+  isPublic: number;
+  isTop: number;
+  newType: number;
+  publicTime: string,
+  source: string,
+  tbStatus: number;
+  title: string,
+  topTime: string,
+  updateTime: string,
+  updaterId: number;
+}
 export interface addCameraParams {
   address: string;
   balance: string;

+ 2 - 1
src/api/order/index.ts

@@ -58,7 +58,7 @@ export const CameraItem = (params: getItemParams) =>
  */
 
 export const CameraExport = (params: PageParams) =>
-  defHttp.post<Result>({
+  defHttp.get<Result>({
     url: Api.cameraExport,
     params: params,
     // data: params,
@@ -66,6 +66,7 @@ export const CameraExport = (params: PageParams) =>
       // @ts-ignore
       ignoreCancelToken: true,
     },
+    responseType: 'blob'
   });
 
 /**

+ 3 - 2
src/api/product/index.ts

@@ -13,6 +13,7 @@ enum Api {
   spaceSdkDel = '/newV4/service/manage/spaceSdk/delete',
   addAndUpload = '/newV4/service/manage/cameraVersion/addAndUpload',
   editAndUpload = '/newV4/service/manage/cameraVersion/update',
+  delAndUpload = '/newV4/service/manage/cameraVersion/delete',
   appFileAgentList = '/newV4/service/manage/appFile/agentList',
   spaceSdkUpload = '/newV4/service/manage/spaceSdk/upload',
   appFileAdd = '/newV4/service/manage/appFile/add',
@@ -66,11 +67,11 @@ defHttp.post<Result>({
 
 
 /**
- * @description: 编辑固件
+ * @description: 删除固件
  */
  export const DelAndUpload = (params: PageParams) =>
  defHttp.post<Result>({
-   url: Api.editAndUpload,
+   url: Api.delAndUpload,
    params,
    // data: params,
    headers: {

+ 1 - 1
src/components/Tinymce/src/Editor.vue

@@ -304,7 +304,7 @@
           return;
         }
         const content = editor?.getContent() ?? '';
-        const val = content?.replace(getUploadingImgName(name), `<img src="${url}"/>`) ?? '';
+        const val = content?.replace(getUploadingImgName(name), `<img src="${url}" style="width:100%" />`) ?? '';
         setValue(editor, val);
       }
 

+ 2 - 2
src/components/Tinymce/src/ImgUpload.vue

@@ -52,9 +52,9 @@
       function handleChange(info: Recordable) {
         const file = info.file;
         const status = file?.status;
-        const url = file?.response?.url;
+        const url = file?.response?.url || file?.response?.data;
         const name = file?.name;
-
+        console.log(info,'info')
         if (status === 'uploading') {
           if (!uploading) {
             emit('uploading', name);

+ 8 - 0
src/store/modules/other.ts

@@ -30,6 +30,14 @@ export const otherInfoStore = defineStore({
       Persistent.removeLocal(LOCK_INFO_KEY, true);
       this.overviewInfo = null;
     },
+    async updateOverviewInfo(){
+      if(this.getOverviewInfo.id){
+        const overviewInfo = await this.getUserInfoAction();
+        this.setOverviewInfo({
+          ...overviewInfo,
+        })
+      }
+    },
     // Unlock
     async unLock(password?: string) {
       const userStore = useUserStore();

+ 1 - 1
src/utils/http/axios/index.ts

@@ -91,7 +91,7 @@ const transform: AxiosTransform = {
     if (joinPrefix) {
       config.url = `${urlPrefix}${config.url}`;
     }
-    console.log('urlPrefix',apiUrl)
+    console.log('urlPrefix',apiUrl,config)
     if (apiUrl && isString(apiUrl)) {
       config.url = `${apiUrl}${config.url}`;
     }

+ 14 - 3
src/views/account/index.vue

@@ -51,8 +51,8 @@ export default defineComponent({
       labelWidth: 100,
       schemas: [
         {
-          field: 'version',
-          label: '版本号',
+          field: 'userName',
+          label: '用户账号',
           component: 'Input',
           componentProps: {
             maxLength: 100,
@@ -61,7 +61,18 @@ export default defineComponent({
             xl: 6,
             xxl: 6,
           },
-        },
+        },{
+          field: 'email',
+          label: '用户邮箱',
+          component: 'Input',
+          componentProps: {
+            maxLength: 100,
+          },
+          colProps: {
+            xl: 8,
+            xxl: 8,
+          },
+        }
       ],
     };
     const [registerTimeTable, { reload }] = useTable({

+ 33 - 31
src/views/account/overview/caremModal.vue

@@ -2,7 +2,7 @@
   <BasicModal
     v-bind="$attrs"
     @register="register"
-    title="权益详情"
+    title="相机详情"
     :width="800"
     @visible-change="handleVisibleChange"
     @ok="handleSubmit"
@@ -15,7 +15,7 @@
               :actions="[
                  {
                    label: '解绑',
-                   icon: 'mdi:account-edit-outline',
+                   icon: 'clarity:unlink-line',
                    onClick: handleDelete.bind(null, record, 'edit'),
                  },
               ]"
@@ -28,7 +28,7 @@
 </template>
 <script lang="ts">
   import { defineComponent, nextTick, onMounted, reactive, computed,h } from 'vue';
-  import { BasicTable, useTable, BasicColumn } from '/@/components/Table';
+  import { BasicTable, useTable, BasicColumn,TableAction } from '/@/components/Table';
   import { BasicModal, useModalInner } from '/@/components/Modal';
   import { BasicForm } from '/@/components/Form/index';
   import { Time } from '/@/components/Time';
@@ -40,7 +40,7 @@
 
   const { t } = useI18n();
   export default defineComponent({
-    components: { BasicModal, BasicForm, BasicTable },
+    components: { BasicModal, BasicForm, BasicTable,TableAction },
     props: {
       userData: { type: Object },
     },
@@ -56,47 +56,43 @@
         id:'',
         type:'down',//down-下载,equity-权益
       })
-            const columns: BasicColumn[] = [
+      const columns: BasicColumn[] = [
         {
-          title: '会员权益ID',
-          dataIndex: 'id',
-          width: 80,
-        },
-        {
-          title: '授权相机S/N吗',
-          width: 160,
+          title: 'sn码',
           dataIndex: 'snCode',
+          width: 120,
         },
         {
-          title: '购买日期',
-          dataIndex: 'incrementStartTime',
-          width: 180,
+          title: '激活时间',
+          dataIndex: 'activatedTime',
+          width: 150,
           customRender: ({ record }) => {
-            return record.incrementStartTime
+            return record.activatedTime
               ? h(Time, {
-                  value: record.incrementStartTime,
-                  mode: 'date',
+                  value: record.activatedTime,
+                  mode: 'datetime',
                 })
               : '-';
           },
         },
         {
-          title: '到期日期',
-          dataIndex: 'incrementEndTime',
-          width: 180,
+          title: '出库时间',
+          dataIndex: 'outTime',
+          width: 150,
           customRender: ({ record }) => {
-            return record.incrementEndTime
+            return record.outTime
               ? h(Time, {
-                  value: record.incrementEndTime,
-                  mode: 'date',
+                  value: record.outTime,
+                  mode: 'datetime',
                 })
               : '-';
           },
         },
         {
           title: t('common.operating'),
-          dataIndex: '',
+          dataIndex: 'action',
           slots: { customRender: 'action' },
+          fixed: 'right',
           width: 80,
         },
       ];
@@ -106,16 +102,22 @@
           reload,
         },
       ] = useTable({
-        title: `查看相机详情`,
+        title: `查看相机列表`,
         rowKey: 'phone',
         searchInfo:{
           userId:overviewInfo.value?.id
         },
-        api: DetailsApi,
+        api: GetCameraDetailApi,
         columns: columns,
+        rowKey: 'id',
+        fetchSetting: {
+          pageField: 'pageNum',
+          sizeField: 'pageSize',
+          listField: 'list',
+          totalField: 'total',
+        },
         showIndexColumn: false,
         bordered: true,
-        pagination: false,
       });
 
       onMounted(() => {});
@@ -130,10 +132,10 @@
       async function handleDelete (record: Recordable) {
         createConfirm({
           iconType: 'warning',
-          title: () => h('span', '续费提示'),
-          content: () => h('span', `您确定给权益ID${record.id}续期1年!`),
+          title: () => h('span', '温馨提示'),
+          content: () => h('span', `您确定解绑该相机!`),
           onOk: async () => {
-            await await IncrementDelayApi({id:record.id,year:1})
+            await await UnbindCameraApi({cameraId:record.id})
             createMessage.success(t('common.optSuccess'));
             reload()
           },

+ 13 - 7
src/views/account/overview/interesModal.vue

@@ -14,8 +14,8 @@
             <TableAction
               :actions="[
                  {
-                   label: '解绑',
-                   icon: 'mdi:account-edit-outline',
+                   label: '续费',
+                   icon: 'carbon:renew',
                    onClick: handleDelete.bind(null, record, 'edit'),
                  },
               ]"
@@ -28,7 +28,7 @@
 </template>
 <script lang="ts">
   import { defineComponent, nextTick, onMounted, reactive, computed,h } from 'vue';
-  import { BasicTable, useTable, BasicColumn } from '/@/components/Table';
+  import { BasicTable, useTable, BasicColumn,TableAction } from '/@/components/Table';
   import { BasicModal, useModalInner } from '/@/components/Modal';
   import { BasicForm } from '/@/components/Form/index';
   import { Time } from '/@/components/Time';
@@ -40,7 +40,7 @@
 
   const { t } = useI18n();
   export default defineComponent({
-    components: { BasicModal, BasicForm, BasicTable },
+    components: { BasicModal, BasicForm, BasicTable,TableAction },
     props: {
       userData: { type: Object },
     },
@@ -107,11 +107,17 @@
         },
       ] = useTable({
         title: `查看相机详情`,
-        rowKey: 'phone',
         searchInfo:{
-          userId:overviewInfo.value?.id
+          id:overviewInfo.value?.id
+        },
+        api: DetailsApi,        
+        rowKey: 'id',
+        fetchSetting: {
+          pageField: 'pageNum',
+          sizeField: 'pageSize',
+          listField: 'list',
+          totalField: 'total',
         },
-        api: DetailsApi,
         columns: columns,
         showIndexColumn: false,
         bordered: true,

+ 125 - 0
src/views/operate/components/message/addModal.vue

@@ -0,0 +1,125 @@
+<template>
+  <BasicModal
+    v-bind="$attrs"
+    @register="register"
+    title="处理留言"
+    @visible-change="handleVisibleChange"
+    okText="完成处理"
+    @cancel="resetFields"
+    @ok="handleSubmit"
+  >
+    <div class="pt-2px pr-3px">
+      <BasicForm @register="registerForm" :model="model" >
+        <template #text="{ model, field }">
+          {{ model[field]  }}
+        </template>
+      </BasicForm>
+    </div>
+  </BasicModal>
+</template>
+<script lang="ts">
+  import { defineComponent, ref, nextTick, onMounted, reactive, h } from 'vue';
+  import { BasicModal, useModalInner } from '/@/components/Modal';
+  import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { uploadApi } from '/@/api/product/index';
+  import { newAddNews, addOrUpdate } from '/@/api/operate'
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import { Tinymce } from '/@/components/Tinymce/index';
+  import { intercomMessageHandle } from '/@/api/operate'
+
+  const { t } = useI18n();
+  export default defineComponent({
+    components: { BasicModal, BasicForm },
+    props: {
+      userData: { type: Object },
+    },
+    emits: ['update', 'register'],
+    setup(props, { emit }) {
+      const modelRef = ref({});
+      const fileFlow = reactive({
+        coverImageUrl:''
+      })
+      const { createMessage } = useMessage();
+      const schemas: FormSchema[] = [
+        {
+          field: 'id',
+          component: 'Input',
+          show:false,
+          label: 'id',
+          required: false,
+        },{
+            field: 'noteContent',
+            component: 'InputTextArea',
+            required: true,
+            label: '备注',
+            componentProps: {
+              maxLength: 200,
+              placeholder: '请备注处理结果',
+            },
+            colProps: {
+              span: 22,
+            },
+        },
+      ];
+      const [registerForm, { validate, resetFields, setFieldsValue, updateSchema }] = useForm({
+        labelWidth: 120,
+        schemas,
+        showActionButtonGroup: false,
+        actionColOptions: {
+          span: 24,
+        },
+      });
+      onMounted(() => {});
+      let addListFunc = () => {};
+      const [register, { closeModal }] = useModalInner((data) => {
+        data && onDataReceive(data);
+      });
+      async function onDataReceive(data) {
+        modelRef.value = data
+        resetFields();
+        setFieldsValue(data);
+      }
+      function NewTypeChange(val){
+        console.log('NewTypeChange',val)
+        updateSchema([
+          { field: 'content', ifShow:val == 2,},
+          { field: 'newsUrl', ifShow:val != 2,},
+        ])
+      } 
+      const handleSubmit = async () => {
+        const params = await validate();
+        const apiData = {
+          ...params as any,
+          coverImageUrl:params.coverImageUrl && params.coverImageUrl[0],
+          content:params.newType == 1?params.newsUrl:params.content
+        }
+        try {
+          await intercomMessageHandle(apiData);
+          closeModal();
+          resetFields();
+          createMessage.success(t('common.optSuccess'));
+          emit('update');
+        } catch (error) {
+          console.log('not passing', error);
+        }
+      };
+      function handleVisibleChange(v) {
+        v && props.userData && nextTick(() => onDataReceive(props.userData));
+      }
+      return {
+        register,
+        schemas,
+        registerForm,
+        model: modelRef,
+        fileFlow,
+        NewTypeChange,
+        handleVisibleChange,
+        handleSubmit,
+        addListFunc,
+        resetFields,
+        t,
+      };
+    },
+  });
+</script>

+ 208 - 0
src/views/operate/components/new/addModal.vue

@@ -0,0 +1,208 @@
+<template>
+  <BasicModal
+    v-bind="$attrs"
+    @register="register"
+    title="新增新闻"
+    :width="1000"
+    @visible-change="handleVisibleChange"
+    @cancel="resetFields"
+    @ok="handleSubmit"
+  >
+    <div class="pt-2px pr-3px">
+      <BasicForm @register="registerForm" :model="model" >
+        <template #text="{ model, field }">
+          {{ model[field]  }}
+        </template>
+      </BasicForm>
+    </div>
+  </BasicModal>
+</template>
+<script lang="ts">
+  import { defineComponent, ref, nextTick, onMounted, reactive, h } from 'vue';
+  import { BasicModal, useModalInner } from '/@/components/Modal';
+  import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { uploadApi } from '/@/api/product/index';
+  import { newAddNews, NewsDetail } from '/@/api/operate'
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import { Tinymce } from '/@/components/Tinymce/index';
+
+  const { t } = useI18n();
+  export default defineComponent({
+    components: { BasicModal, BasicForm },
+    props: {
+      userData: { type: Object },
+    },
+    emits: ['update', 'register'],
+    setup(props, { emit }) {
+      const modelRef = ref({});
+      const fileFlow = reactive({
+        coverImageUrl:''
+      })
+      const { createMessage } = useMessage();
+      const schemas: FormSchema[] = [
+        {
+          field: 'id',
+          component: 'Input',
+          show:false,
+          label: 'id',
+          required: false,
+        },{
+            field: 'title',
+            component: 'Input',
+            required: true,
+            label: '新闻标题',
+            colProps: {
+              span: 22,
+            },
+        },{
+            field: 'source',
+            component: 'Input',
+            label: '新闻来源',
+            required: true,
+            colProps: {
+              span: 22,
+            },
+        },
+        {
+          field: 'coverImageUrl',
+          component: 'Upload',
+          label: '封面',
+          required: true,
+          rules: [{ required: true, message: t('common.uploadMessge') }],
+          // helpMessage: t('routes.corporation.uploadHelp'),
+          itemProps: {
+            validateTrigger: 'onBlur',
+          },
+          componentProps: {
+            api: uploadApi,
+            maxNumber: 1,
+            maxSize: 10,
+            accept: ['jpeg','jpg','png'],
+            afterFetch: function (data) {
+              console.log('uploadApi',data)
+              Reflect.set(data, 'url', data.data);
+              fileFlow.coverImageUrl = data.data
+              return data;
+            },
+          },
+
+          colProps: {
+            span: 22,
+          },
+        },
+        {
+          field: 'newType',
+          label: '类型',
+          component: 'RadioButtonGroup',
+          required: true,
+          defaultValue: 1,
+          componentProps: {
+            onChange: NewTypeChange,
+            options: [
+              { label: '链接', value: 1 },
+              { label: '图文', value: 2 },
+            ],
+          },
+        },{
+            field: 'newsUrl',
+            component: 'Input',
+            label: '新闻链接',
+            required: true,
+            colProps: {
+              span: 22,
+            },
+        },
+        {
+          field: 'content',
+          label: '新闻内容',
+          component: 'Input',
+          required: true,
+          ifShow:false,
+          colProps: {
+            span: 22,
+          },
+          render: ({ model, field }) => {
+            return h(Tinymce, {
+              value: model[field],
+              maxlength: 200,
+              onChange: (value: string) => {
+                model[field] = value;
+              },
+              showImageUpload: true,
+            });
+          },
+        },
+      ];
+      const [registerForm, { validate, resetFields, setFieldsValue, updateSchema }] = useForm({
+        labelWidth: 120,
+        schemas,
+        showActionButtonGroup: false,
+        actionColOptions: {
+          span: 24,
+        },
+      });
+      onMounted(() => {});
+      let addListFunc = () => {};
+      const [register, { closeModal }] = useModalInner((data) => {
+        data && onDataReceive(data);
+      });
+      async function onDataReceive(data) {
+        modelRef.value = data
+        resetFields();
+        if(data.newType){
+          NewTypeChange(data.newType)
+        }
+        if(data.id){
+          const detail = await NewsDetail({id:data.id})
+          setFieldsValue({
+            ...detail,
+            coverImageUrl:detail.coverImageUrl?[detail.coverImageUrl]:''
+          });
+        }else{
+          setFieldsValue(data);
+        }
+      }
+      function NewTypeChange(val){
+        console.log('NewTypeChange',val)
+        updateSchema([
+          { field: 'content', ifShow:val == 2,},
+          { field: 'newsUrl', ifShow:val != 2,},
+        ])
+      } 
+      const handleSubmit = async () => {
+        const params = await validate();
+        const apiData = {
+          ...params as any,
+          coverImageUrl:params.coverImageUrl && params.coverImageUrl[0],
+          content:params.newType == 1?params.newsUrl:params.content
+        }
+        try {
+          await newAddNews(apiData);
+          closeModal();
+          resetFields();
+          createMessage.success(t('common.optSuccess'));
+          emit('update');
+        } catch (error) {
+          console.log('not passing', error);
+        }
+      };
+      function handleVisibleChange(v) {
+        v && props.userData && nextTick(() => onDataReceive(props.userData));
+      }
+      return {
+        register,
+        schemas,
+        registerForm,
+        model: modelRef,
+        fileFlow,
+        NewTypeChange,
+        handleVisibleChange,
+        handleSubmit,
+        addListFunc,
+        resetFields,
+        t,
+      };
+    },
+  });
+</script>

+ 180 - 0
src/views/operate/components/recruit/addModal.vue

@@ -0,0 +1,180 @@
+<template>
+  <BasicModal
+    v-bind="$attrs"
+    @register="register"
+    title="新增职位"
+    @visible-change="handleVisibleChange"
+    @cancel="resetFields"
+    @ok="handleSubmit"
+  >
+    <div class="pt-2px pr-3px">
+      <BasicForm @register="registerForm" :model="model" >
+        <template #text="{ model, field }">
+          {{ model[field]  }}
+        </template>
+      </BasicForm>
+    </div>
+  </BasicModal>
+</template>
+<script lang="ts">
+  import { defineComponent, ref, nextTick, onMounted, reactive, h } from 'vue';
+  import { BasicModal, useModalInner } from '/@/components/Modal';
+  import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { uploadApi } from '/@/api/product/index';
+  import { newAddNews, addOrUpdate } from '/@/api/operate'
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import { Tinymce } from '/@/components/Tinymce/index';
+
+  const { t } = useI18n();
+  export default defineComponent({
+    components: { BasicModal, BasicForm },
+    props: {
+      userData: { type: Object },
+    },
+    emits: ['update', 'register'],
+    setup(props, { emit }) {
+      const modelRef = ref({});
+      const fileFlow = reactive({
+        coverImageUrl:''
+      })
+      const { createMessage } = useMessage();
+      const schemas: FormSchema[] = [
+        {
+          field: 'id',
+          component: 'Input',
+          show:false,
+          label: 'id',
+          required: false,
+        },{
+            field: 'workName',
+            component: 'Input',
+            required: true,
+            label: '职位名称',
+            colProps: {
+              span: 22,
+            },
+        },{
+            field: 'workAddress',
+            component: 'Input',
+            required: true,
+            label: '工作地点',
+            colProps: {
+              span: 22,
+            },
+        },{
+            field: 'salary',
+            component: 'Input',
+            label: '薪资待遇',
+            required: true,
+            componentProps: {
+              maxLength: 5,
+              placeholder: '招聘人数',
+              max: 999,
+              min: 0,
+            },
+            colProps: {
+              span: 22,
+            },
+        },{
+            field: 'employNum',
+            component: 'InputNumber',
+            required: true,
+            label: '招聘人数',
+            defaultValue:1,
+            componentProps: {
+              maxLength: 5,
+              placeholder: '招聘人数',
+              max: 999,
+              min: 1,
+            },
+            colProps: {
+              span: 22,
+            },
+        },{
+            field: 'workContent',
+            component: 'InputTextArea',
+            required: true,
+            label: '工作职责',
+            componentProps: {
+              maxLength: 500,
+              placeholder: '请输入职位要求',
+            },
+            colProps: {
+              span: 22,
+            },
+        },{
+            field: 'qualification',
+            component: 'InputTextArea',
+            required: true,
+            label: '任职资格',
+            componentProps: {
+              maxLength: 500,
+              placeholder: '请输入任职资格',
+            },
+            colProps: {
+              span: 22,
+            },
+        },
+      ];
+      const [registerForm, { validate, resetFields, setFieldsValue, updateSchema }] = useForm({
+        labelWidth: 120,
+        schemas,
+        showActionButtonGroup: false,
+        actionColOptions: {
+          span: 24,
+        },
+      });
+      onMounted(() => {});
+      let addListFunc = () => {};
+      const [register, { closeModal }] = useModalInner((data) => {
+        data && onDataReceive(data);
+      });
+      async function onDataReceive(data) {
+        modelRef.value = data
+        resetFields();
+        setFieldsValue(data);
+      }
+      function NewTypeChange(val){
+        console.log('NewTypeChange',val)
+        updateSchema([
+          { field: 'content', ifShow:val == 2,},
+          { field: 'newsUrl', ifShow:val != 2,},
+        ])
+      } 
+      const handleSubmit = async () => {
+        const params = await validate();
+        const apiData = {
+          ...params as any,
+          coverImageUrl:params.coverImageUrl && params.coverImageUrl[0],
+          content:params.newType == 1?params.newsUrl:params.content
+        }
+        try {
+          await addOrUpdate(apiData);
+          closeModal();
+          resetFields();
+          createMessage.success(t('common.optSuccess'));
+          emit('update');
+        } catch (error) {
+          console.log('not passing', error);
+        }
+      };
+      function handleVisibleChange(v) {
+        v && props.userData && nextTick(() => onDataReceive(props.userData));
+      }
+      return {
+        register,
+        schemas,
+        registerForm,
+        model: modelRef,
+        fileFlow,
+        NewTypeChange,
+        handleVisibleChange,
+        handleSubmit,
+        addListFunc,
+        resetFields,
+        t,
+      };
+    },
+  });
+</script>

+ 8 - 13
src/views/operate/data.tsx

@@ -4,32 +4,27 @@ import { Badge } from 'ant-design-vue';
 
 export const refundTimeTableSchema: BasicColumn[] = [
   {
-    title: '时间',
+    title: '联系方式',
     width: 150,
-    dataIndex: 't1',
+    dataIndex: 'contact',
   },
   {
-    title: '当前进度',
+    title: '留言内容',
     width: 150,
-    dataIndex: 't2',
+    dataIndex: 'content',
   },
   {
     title: '状态',
     width: 150,
-    dataIndex: 't3',
+    dataIndex: 'state',
     customRender: ({ record }) => {
-      return <Badge status="success" text={record.t3} />;
+      return <Badge status={record.state==1?'warning':'success'} text={record.state == 1?'待处理':'已处理'} />;
     },
   },
   {
-    title: '操作员ID	',
+    title: '备注',
     width: 150,
-    dataIndex: 't4',
-  },
-  {
-    title: '耗时',
-    width: 150,
-    dataIndex: 't5',
+    dataIndex: 'noteContent',
   },
 ];
 

+ 93 - 18
src/views/operate/messageList.vue

@@ -1,34 +1,49 @@
 <template>
-  <PageWrapper title="单号:234231029431" contentBackground>
-    <template #extra>
-      <a-button> 操作一 </a-button>
-      <a-button> 操作二 </a-button>
-      <a-button type="primary"> 主操作 </a-button>
-    </template>
-
+  <PageWrapper  contentBackground>
     <template #footer>
-      <a-tabs default-active-key="1">
-        <a-tab-pane key="1" tab="详情" />
-        <a-tab-pane key="2" tab="规则" />
+      <a-tabs v-model:activeKey="state" @change="changeTable">
+        <a-tab-pane :key="1" tab="待处理" />
+        <a-tab-pane :key="0" tab="已处理" />
       </a-tabs>
     </template>
 
     <div class="pt-4 m-4 desc-wrap">
-      <BasicTable @register="registerTimeTable" />
+      <BasicTable @register="registerTimeTable" >
+        
+        <template #action="{ record }">
+          <TableAction
+            stopButtonPropagation
+            :actions="[
+              {
+                label: '处理',
+                icon: 'icon-park-outline:door-handle',
+                ifShow:record.state == 1,
+                onClick: handleWithdraw.bind(null, record),
+              },
+            ]"
+          />
+      </template>
+      </BasicTable>
     </div>
+    <addMessgeModal @register="register" @update="reload" />
   </PageWrapper>
 </template>
 <script lang="ts">
-  import { defineComponent } from 'vue';
-  import { BasicTable, useTable } from '/@/components/Table';
+  import { defineComponent, ref } from 'vue';
+  import { BasicTable, useTable, TableAction, FormProps } from '/@/components/Table';
   import { PageWrapper } from '/@/components/Page';
   import { Divider, Card, Empty, Descriptions, Steps, Tabs } from 'ant-design-vue';
-
+  import { intercomMessageList, intercomMessageHandle } from '/@/api/operate'
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import addMessgeModal from './components/message/addModal.vue'
+  import { useModal } from '/@/components/Modal';
   import { refundTimeTableSchema, refundTimeTableData } from './data';
   export default defineComponent({
     components: {
       BasicTable,
       PageWrapper,
+      TableAction,
+      addMessgeModal,
       [Divider.name]: Divider,
       [Card.name]: Card,
       Empty,
@@ -40,17 +55,77 @@
       [Tabs.TabPane.name]: Tabs.TabPane,
     },
     setup() {
-      const [registerTimeTable] = useTable({
-        title: '退货进度',
+      const { t } = useI18n();
+      const [register, { openModal }] = useModal();
+      const state = ref<number>(1); //未处理,0已处理(默认1)
+      const searchForm: Partial<FormProps> = {
+        labelWidth: 100,
+        schemas: [
+          {
+            field: 'sceneName',
+            label: '提交时间',
+            component: 'RangePicker',
+            componentProps: {
+              maxLength: 100,
+              format: 'YYYY-MM-DD HH:mm',
+              showTime: true,
+            },
+            colProps: {
+              xl: 11,
+              xxl: 11,
+            },
+          },
+          {
+            field: 'type',
+            label: t('routes.operate.newsTitle'),
+            component: 'Input',
+            colProps: {
+              xl: 6,
+              xxl: 6,
+            },
+          },
+        ],
+      };
+      const [registerTimeTable,{reload}] = useTable({
+        api: intercomMessageList,
+        // title: '',
+        rowKey: 'id',
+        fetchSetting: {
+          pageField: 'pageNum',
+          sizeField: 'pageSize',
+          listField: 'list',
+          totalField: 'total',
+        },
+        searchInfo: { state },
         columns: refundTimeTableSchema,
-        pagination: false,
+        formConfig: searchForm,
         dataSource: refundTimeTableData,
         showIndexColumn: false,
+        // pagination: { pageSize: 20 },
         scroll: { y: 300 },
+        actionColumn: {
+          width: 100,
+          title: '操作',
+          ifShow:state.value == 1,
+          dataIndex: 'action',
+          slots: { customRender: 'action' },
+        },
       });
-
+      function changeTable(val: string) {
+        state.value = val;
+        reload();
+      }
+      async function handleWithdraw(record: Recordable) {
+        openModal(true,record)
+      }
       return {
         registerTimeTable,
+        handleWithdraw,
+        changeTable,
+        state,
+        reload,
+        register,
+        openModal,
       };
     },
   });

+ 89 - 49
src/views/operate/newsList.vue

@@ -1,78 +1,95 @@
-<template>
+ <template>
+  <div>
     <BasicTable @register="registerTable">
       <template #toolbar>
-        <a-button type="primary" @click="exportExcel"> 导出</a-button>
+        <a-button type="primary" @click="openModal(true)"> 新增新闻</a-button>
       </template>
-      <template #bodyCell="{ column, record }">
-        <template v-if="column.key === 'action'">
+        <template #action="{ record }">
           <TableAction
             stopButtonPropagation
             :actions="[
               {
+                label: '撤回',
+                icon: 'icon-park-outline:folder-withdrawal-one',
+                ifShow:record.isPublic == 1,
+                onClick: handleWithdraw.bind(null, record),
+              },{
+                label: '发布',
+                icon: 'arcticons:efa-publish',
+                ifShow:record.isPublic == 0,
+                onClick: handlePublish.bind(null, record),
+              },{
+                label: '编辑',
+                icon: 'ep:edit',
+                ifShow:record.isPublic == 0,
+                onClick: handleEdit.bind(null, record),
+              },{
                 label: '删除',
                 icon: 'ic:outline-delete-outline',
-                onClick: handleDelete.bind(null, record),
-              },
-            ]"
-            :dropDownActions="[
-              {
-                label: '启用',
                 popConfirm: {
-                  title: '是否启用?',
-                  confirm: handleOpen.bind(null, record),
+                  title: '是否确认删除',
+                  confirm: handleDelete.bind(null, record),
                 },
               },
             ]"
           />
-        </template>
       </template>
     </BasicTable>
+    <addNewModal @register="register" @update="reload" />
+
+  </div>
 </template>
 <script lang="ts">
   import { defineComponent, h } from 'vue';
   import { BasicTable, useTable, TableAction, BasicColumn, TableImg, FormProps } from '/@/components/Table';
   import { PageWrapper } from '/@/components/Page';
   import { Time } from '/@/components/Time';
-  import { ListApi } from '/@/api/operate'
+  import { ListApi, NewDisplay, NewPutTop, NewPublicNews, newDelete } from '/@/api/operate'
+  import { useModal } from '/@/components/Modal';
   import { Descriptions } from 'ant-design-vue';
   import { useI18n } from '/@/hooks/web/useI18n';
   import { useMessage } from '/@/hooks/web/useMessage';
   import { Switch } from 'ant-design-vue';
-
+  import addNewModal from './components/new/addModal.vue'
   export default defineComponent({
     components: { 
       BasicTable, 
       TableAction, 
       PageWrapper,
       TableImg,
+      addNewModal,
       [Descriptions.name]: Descriptions,
       [Descriptions.Item.name]: Descriptions.Item,
     },
     setup() {
       const { t } = useI18n();
       const { createMessage } = useMessage();
+      const [register, { openModal }] = useModal();
       const columns: BasicColumn[] = [
         
         {
           title: '新闻标题',
-          dataIndex: 'newsTitle',
+          dataIndex: 'title',
           ellipsis: false,
           width: 250,
         },
         {
           title: '来源',
-          dataIndex: 'orderSn',
+          dataIndex: 'source',
           ellipsis: false,
           width: 120,
         },
         {
           title: '类型',
-          dataIndex: 'nickName',
+          dataIndex: 'newType',
           width: 80,
+          customRender: ({ record }) => {
+            return  record.newType == 1?'链接':'图文'
+          },
         },
         {
           title: '创建人',
-          dataIndex: 'brandName',
+          dataIndex: 'creater',
           width: 80,
         },
         {
@@ -105,58 +122,50 @@
         },
         {
           title: '是否显示',
-          dataIndex: 'isOnSale',
+          dataIndex: 'display',
           width: 80,
           customRender: ({ record }) => {
             if (!Reflect.has(record, 'pendingStatus')) {
               record.pendingStatus = false;
             }
             return h(Switch, {
-              checked: record.isOnSale === 1,
-              checkedChildren: '上架',
-              unCheckedChildren: '下架',
+              checked: record.display === 1,
+              checkedChildren: '显示',
+              unCheckedChildren: '隐藏',
               loading: false,
               onChange: async (checked: boolean) => {
                 record.pendingStatus = true;
                 const id: string = record.id || '';
                 const newStatus = checked ? 1 : 0;
-                if (checked) {
-                  Reflect.set(record, 'isOnSale', newStatus);
-                  await EnSaleApi([id]);
-                } else {
-                  Reflect.set(record, 'isOnSale', newStatus);
-                  await UnSaleApi([id]);
-                }
+                Reflect.set(record, 'display', newStatus);
+                await NewDisplay({id:id,display:newStatus});
                 createMessage.success(t('common.optSuccess'));
+                // reload()
               },
             });
           },
         },
         {
           title: '置顶',
-          dataIndex: 'isOnSale',
+          dataIndex: 'isTop',
           width: 80,
           customRender: ({ record }) => {
             if (!Reflect.has(record, 'pendingStatus')) {
               record.pendingStatus = false;
             }
             return h(Switch, {
-              checked: record.isOnSale === 1,
+              checked: record.isTop === 1,
               checkedChildren: '是',
               unCheckedChildren: '否',
               loading: false,
               onChange: async (checked: boolean) => {
                 record.pendingStatus = true;
-                // const id: string = record.id || '';
+                const id: string = record.id || '';
                 const newStatus = checked ? 1 : 0;
-                if (checked) {
-                  Reflect.set(record, 'isOnSale', newStatus);
-                  // await EnSaleApi([id]);
-                } else {
-                  Reflect.set(record, 'isOnSale', newStatus);
-                  // await UnSaleApi([id]);
-                }
+                // Reflect.set(record, 'isOnSale', newStatus);
+                await NewPutTop({id,isTop:newStatus});
                 createMessage.success(t('common.optSuccess'));
+                reload()
               },
             });
           },
@@ -190,7 +199,7 @@
           },
         ],
       };
-      const [registerTable] = useTable({
+      const [registerTable,{reload}] = useTable({
         api: ListApi,
         title: '新闻列表',
         columns: columns,
@@ -199,22 +208,53 @@
         showTableSetting: true,
         showIndexColumn:false,
         rowKey: 'id',
+        fetchSetting: {
+          pageField: 'pageNum',
+          sizeField: 'pageSize',
+          listField: 'list',
+          totalField: 'total',
+        },
+        actionColumn: {
+          width: 220,
+          title: '操作',
+          dataIndex: 'action',
+          slots: { customRender: 'action' },
+        },
         canResize: false,
       });
-      function handleDelete(record: Recordable) {
-        console.log('点击了删除', record);
+      async function handleDelete(record: Recordable) {
+        await newDelete({id:record.id})
+        createMessage.success(t('common.optSuccess'));
+        reload();
+      }
+      async function handlePublish(record: Recordable) {
+        console.log('点击了发布', record);
+        await NewPublicNews({id:record.id,isPublic:1})
+        createMessage.success(t('common.optSuccess'));
+        reload();
+      }
+      function handleEdit(record: Recordable) {
+        console.log('点击了编辑', record);
+        openModal(true,record)
       }
-      function handleOpen(record: Recordable) {
-        console.log('点击了启用', record);
+      async function handleWithdraw(record: Recordable) {
+        await NewPublicNews({id:record.id,isPublic:0})
+        createMessage.success(t('common.optSuccess'));
+        reload();
       }
-      function exportExcel(record: Recordable) {
-        console.log('点击了导出', record);
+      function hendleAddNew(){
+        console.log('新增新闻');
       }
       return {
         registerTable,
         handleDelete,
-        handleOpen,
-        exportExcel,
+        handleEdit,
+        handleWithdraw,
+        handlePublish,
+        hendleAddNew,
+        reload,
+        register,
+        openModal,
       };
     },
   });

+ 126 - 152
src/views/operate/recruitList.vue

@@ -1,83 +1,94 @@
-<template>
-  <PageWrapper
-    title="可展开表格"
-    content="TableAction组件可配置stopButtonPropagation来阻止操作按钮的点击事件冒泡,以便配合Table组件的expandRowByClick"
-  >
-    <BasicTable @register="registerTable">
+ <template>
+  <div>
+    <BasicTable @register="registerTable" @editEnd="editEnd">
       <template #toolbar>
-        <a-button type="primary" @click="exportExcel"> 导出</a-button>
+        <a-button type="primary" @click="openModal(true)"> 新增职位</a-button>
       </template>
-      <!-- <template #expandedRowRender="{ record }">
-        <div>
-          <a-descriptions title="信息组" :column="3">
-            <a-descriptions-item label="负责人"> 林东东{{record.no}} </a-descriptions-item>
-            <a-descriptions-item label="角色码"> 1234567 </a-descriptions-item>
-            <a-descriptions-item label="所属部门"> XX公司 - YY部 </a-descriptions-item>
-            <a-descriptions-item label="过期时间"> 2017-08-08 </a-descriptions-item>
-            <a-descriptions-item label="描述" :span="2">
-              这段描述很长很长很长很长很长很长很长很长很长很长很长很长很长很长...
-            </a-descriptions-item>
-            <a-descriptions-item label="商品图片" :span="1">
-              <TableImg style="margin: 0"
-                :size="120"
-                :simpleShow="true"
-                :imgList="[record.appListPicUrl || 'http://zfb-4dkankan.oss-cn-shenzhen.aliyuncs.com/sceneLogo/1653644220202_3ee8b3c006e74012a82f2b286b2f4914.png']"
-              />
-            </a-descriptions-item>
-          </a-descriptions>
-        </div>
-      </template> -->
-      <template #bodyCell="{ column, record }">
-        <template v-if="column.key === 'action'">
+        <template #action="{ record }">
           <TableAction
             stopButtonPropagation
             :actions="[
               {
+                label: '编辑',
+                icon: 'ep:edit',
+                ifShow:record.isPush == 0,
+                onClick: handleEdit.bind(null, record),
+              },{
                 label: '删除',
                 icon: 'ic:outline-delete-outline',
-                onClick: handleDelete.bind(null, record),
-              },
-            ]"
-            :dropDownActions="[
-              {
-                label: '启用',
                 popConfirm: {
-                  title: '是否启用?',
-                  confirm: handleOpen.bind(null, record),
+                  title: '是否确认删除',
+                  confirm: handleDelete.bind(null, record),
                 },
               },
             ]"
           />
-        </template>
       </template>
     </BasicTable>
-  </PageWrapper>
+    <addRecruitModal @register="register" @update="reload" />
+  </div>
 </template>
 <script lang="ts">
   import { defineComponent, h } from 'vue';
   import { BasicTable, useTable, TableAction, BasicColumn, TableImg, FormProps } from '/@/components/Table';
   import { PageWrapper } from '/@/components/Page';
   import { Time } from '/@/components/Time';
+  import { employNoteList, addOrUpdate, employNoteIsTop, NewPublicNews, employNoteIsPush } from '/@/api/operate'
+  import { useModal } from '/@/components/Modal';
   import { Descriptions } from 'ant-design-vue';
   import { useI18n } from '/@/hooks/web/useI18n';
   import { useMessage } from '/@/hooks/web/useMessage';
   import { Switch } from 'ant-design-vue';
-
+  import addRecruitModal from './components/recruit/addModal.vue'
   export default defineComponent({
     components: { 
       BasicTable, 
       TableAction, 
       PageWrapper,
       TableImg,
+      addRecruitModal,
       [Descriptions.name]: Descriptions,
       [Descriptions.Item.name]: Descriptions.Item,
     },
     setup() {
       const { t } = useI18n();
       const { createMessage } = useMessage();
+      const [register, { openModal }] = useModal();
       const columns: BasicColumn[] = [
+        
+        {
+          title: '职位名称',
+          dataIndex: 'workName',
+          ellipsis: false,
+          width: 250,
+        },
+        {
+          title: '工作地点',
+          dataIndex: 'workAddress',
+          ellipsis: false,
+          width: 80,
+        },
+        {
+          title: '薪资待遇',
+          dataIndex: 'salary',
+          ellipsis: false,
+          width: 80,
+        },
         {
-          title: '时间',
+          title: '招聘人数',
+          dataIndex: 'employNum',
+          width: 150,
+          edit: true,
+          editRule: async (text) => {
+            if (text < 1) {
+              return '招聘人数应大于0';
+            }
+            return '';
+          },
+          editComponent: 'InputNumber',
+        },
+        {
+          title: '创建时间',
           dataIndex: 'createTime',
           width: 150,
           customRender: ({ record }) => {
@@ -91,87 +102,51 @@
           },
         },
         {
-          title: '订单号',
-          dataIndex: 'orderSn',
-          ellipsis: false,
-          width: 180,
-        },
-        {
-          title: '用户名',
-          dataIndex: 'nickName',
-          width: 80,
-        },
-        {
-          title: '订单金额',
-          dataIndex: 'brandName',
-          width: 80,
-        },
-        {
-          title: '支付方式',
-          dataIndex: 'orderType',
-          slots: { customRender: 'orderType' },
-          width: 80,
-        },
-        {
-          title: '订单状态',
-          dataIndex: 'orderStatus',
-          slots: { customRender: 'orderStatus' },
+          title: '状态',
+          dataIndex: 'isPush',
           width: 80,
-        },
-        {
-          title: '上架状态',
-          dataIndex: 'isOnSale',
-          width: 180,
           customRender: ({ record }) => {
             if (!Reflect.has(record, 'pendingStatus')) {
               record.pendingStatus = false;
             }
             return h(Switch, {
-              checked: record.isOnSale === 1,
-              checkedChildren: '上架',
-              unCheckedChildren: '下架',
+              checked: record.isPush === 1,
+              checkedChildren: '已发布',
+              unCheckedChildren: '未发布',
               loading: false,
               onChange: async (checked: boolean) => {
                 record.pendingStatus = true;
                 const id: string = record.id || '';
                 const newStatus = checked ? 1 : 0;
-                if (checked) {
-                  Reflect.set(record, 'isOnSale', newStatus);
-                  // await EnSaleApi([id]);
-                } else {
-                  Reflect.set(record, 'isOnSale', newStatus);
-                  // await UnSaleApi([id]);
-                }
+                Reflect.set(record, 'isPush', newStatus);
+                await employNoteIsPush({id:id,isPush:newStatus});
                 createMessage.success(t('common.optSuccess'));
+                // reload()
               },
             });
           },
         },
         {
           title: '置顶',
-          dataIndex: 'isOnSale',
-          width: 180,
+          dataIndex: 'isTop',
+          width: 80,
           customRender: ({ record }) => {
             if (!Reflect.has(record, 'pendingStatus')) {
               record.pendingStatus = false;
             }
             return h(Switch, {
-              checked: record.isOnSale === 1,
+              checked: record.isTop === 1,
               checkedChildren: '是',
               unCheckedChildren: '否',
               loading: false,
               onChange: async (checked: boolean) => {
                 record.pendingStatus = true;
-                // const id: string = record.id || '';
+                const id: string = record.id || '';
                 const newStatus = checked ? 1 : 0;
-                if (checked) {
-                  Reflect.set(record, 'isOnSale', newStatus);
-                  // await EnSaleApi([id]);
-                } else {
-                  Reflect.set(record, 'isOnSale', newStatus);
-                  // await UnSaleApi([id]);
-                }
+                // Reflect.set(record, 'isOnSale', newStatus);
+                await employNoteIsTop({id,isTop:newStatus});
                 createMessage.success(t('common.optSuccess'));
+                reload()
               },
             });
           },
@@ -182,92 +157,91 @@
         schemas: [
           {
             field: 'sceneName',
-            label: t('routes.scenes.anchorRoom'),
-            component: 'Input',
+            label: t('routes.operate.releaseTime'),
+            component: 'RangePicker',
             componentProps: {
               maxLength: 100,
+              format: 'YYYY-MM-DD HH:mm',
+              showTime: true,
             },
             colProps: {
-              xl: 5,
-              xxl: 5,
+              xl: 11,
+              xxl: 11,
             },
           },
           {
             field: 'type',
-            label: t('common.type'),
-            component: 'ApiSelect',
-            colProps: {
-              xl: 5,
-              xxl: 5,
-            },
-            componentProps: {
-              // api: brandTypeListApi,
-              resultField: 'list',
-              labelField: 'name',
-              valueField: 'brandType',
-              params: {
-                page: 1,
-                limit: 1000,
-              },
-            },
-          },
-          {
-            field: 'livestreamStatus',
-            label: t('routes.scenes.livestreamStatus'),
-            component: 'Select',
+            label: t('routes.operate.newsTitle'),
+            component: 'Input',
             colProps: {
-              xl: 5,
-              xxl: 5,
-            },
-            componentProps: {
-              options: [
-                {
-                  label: t('common.all'),
-                  value: '',
-                  key: '0',
-                },
-                {
-                  label: t('common.yes'),
-                  value: 1,
-                  key: '1',
-                },
-                {
-                  label: t('common.no'),
-                  value: 0,
-                  key: '2',
-                },
-              ],
+              xl: 6,
+              xxl: 6,
             },
           },
         ],
       };
-      const [registerTable] = useTable({
-        api: ()=>{
-          return []
-        },
-        title: '可展开表格演示',
-        titleHelpMessage: ['已启用expandRowByClick', '已启用stopButtonPropagation'],
+      const [registerTable,{reload}] = useTable({
+        api: employNoteList,
+        title: '新闻列表',
         columns: columns,
         useSearchForm: true,
         formConfig: searchForm,
         showTableSetting: true,
+        showIndexColumn:false,
         rowKey: 'id',
+        fetchSetting: {
+          pageField: 'pageNum',
+          sizeField: 'pageSize',
+          listField: 'list',
+          totalField: 'total',
+        },
+        actionColumn: {
+          width: 220,
+          title: '操作',
+          dataIndex: 'action',
+          slots: { customRender: 'action' },
+        },
         canResize: false,
       });
-      function handleDelete(record: Recordable) {
-        console.log('点击了删除', record);
+      async function handleDelete(record: Recordable) {
+        await newDelete({id:record.id})
+        createMessage.success(t('common.optSuccess'));
+        reload();
+      }
+      async function handlePublish(record: Recordable) {
+        console.log('点击了发布', record);
+        await NewPublicNews({id:record.id,isPublic:1})
+        createMessage.success(t('common.optSuccess'));
+        reload();
+      }
+      function handleEdit(record: Recordable) {
+        console.log('点击了编辑', record);
+        openModal(true,record)
       }
-      function handleOpen(record: Recordable) {
-        console.log('点击了启用', record);
+      async function handleWithdraw(record: Recordable) {
+        await NewPublicNews({id:record.id,isPublic:0})
+        createMessage.success(t('common.optSuccess'));
+        reload();
       }
-      function exportExcel(record: Recordable) {
-        console.log('点击了导出', record);
+      function hendleAddNew(){
+        console.log('新增新闻');
       }
+      async function editEnd({record, index, key, value}){
+          console.log('editEnd',record, index, key, value)
+          await addOrUpdate(record)
+          createMessage.success(t('common.optSuccess'));
+        }
       return {
         registerTable,
         handleDelete,
-        handleOpen,
-        exportExcel,
+        handleEdit,
+        handleWithdraw,
+        handlePublish,
+        hendleAddNew,
+        reload,
+        register,
+        openModal,
+        editEnd,
       };
     },
   });

+ 3 - 3
src/views/order/cameraList.vue

@@ -58,7 +58,7 @@
   import { useI18n } from '/@/hooks/web/useI18n';
   import { useMessage } from '/@/hooks/web/useMessage';
   import { Switch } from 'ant-design-vue';
-  import { CameraList,CameraItem } from '/@/api/order'
+  import { CameraList,CameraItem, CameraExport } from '/@/api/order'
 
   export default defineComponent({
     components: { 
@@ -211,8 +211,8 @@
       function handleOpen(record: Recordable) {
         console.log('点击了启用', record);
       }
-      function exportExcel(record: Recordable) {
-        CameraItem({id:1129}).then(res => {
+      function exportExcel() {
+        CameraExport().then(res => {
           console.log('点击了导出', res);
         })
       }

+ 92 - 2
src/views/product/sdk/index.vue

@@ -52,11 +52,12 @@
 </template>
 <script lang="ts">
 import { defineComponent, reactive, h } from 'vue';
+import { Time } from '/@/components/Time';
 import { BasicTable, useTable, FormProps, TableAction, BasicColumn } from '/@/components/Table';
 import { PageWrapper } from '/@/components/Page';
-import { Divider, Card, Empty, Descriptions, Steps, Tabs } from 'ant-design-vue';
+import { Divider, Card, Empty, Descriptions, Steps, Tabs,Switch } from 'ant-design-vue';
 import { SpaceSdkList, SpaceSdkDelete, SpaceSdkOnline } from '/@/api/product';
-import { sdkTableSchema } from '../data';
+import { SpaceSdkTop } from '/@/api/product/index';
 import { useModal } from '/@/components/Modal';
 import { useI18n } from '/@/hooks/web/useI18n';
 import AddModal from './AddModal.vue';
@@ -104,6 +105,85 @@ export default defineComponent({
         },
       ],
     };
+    const sdkTableSchema: BasicColumn[] = [
+      {
+        title: '版本号',
+        width: 80,
+        dataIndex: 'version',
+      },
+      {
+        title: '版本更新说明',
+        width: 240,
+        dataIndex: 'imprintCh',
+      },
+      {
+        title: '版本更新说明',
+        width: 150,
+        ifShow:true,
+        dataIndex: 'status',
+      },
+      {
+        title: '首次发布时间',
+        width: 120,
+        dataIndex: 'publishTime',
+        customRender: ({ record }) => {
+          return (
+            record.publishTime &&
+            h(Time, {
+              value: record.publishTime,
+              mode: 'datetime',
+            })
+          );
+        },
+      },{
+        title: '创建人',
+        width: 80,
+        dataIndex: 'recStatus',
+      },{
+        title: '创建时间',
+        width: 120,
+        dataIndex: 'createTime',
+        customRender: ({ record }) => {
+          return (
+            record.createTime &&
+            h(Time, {
+              value: record.createTime,
+              mode: 'datetime',
+            })
+          );
+        },
+      },{
+        title: '置顶',
+        dataIndex: 'isTop',
+        width: 80,
+        customRender: ({ record }) => {
+          if (!Reflect.has(record, 'isTop')) {
+            record.pendingStatus = false;
+          }
+          return h(Switch, {
+            checked: record.isTop == 1 ? true : false,
+            checkedChildren: '启用',
+            unCheckedChildren: '禁用',
+            loading: false,
+            onChange: async (checked: boolean) => {
+              record.pendingStatus = true;
+              const newStatus = checked?1:0;
+              await SpaceSdkTop({...record,isTop:newStatus});
+              Reflect.set(record, 'isTop', checked);
+              createMessage.success(t('common.optSuccess'));
+              reload()
+            },
+          });
+        },
+      },{
+        title: '发布状态',
+        dataIndex: 'status',
+        width: 80,
+        customRender: ({ record }) => {
+          return renderType(record.status)
+        },
+      },
+    ];
     const [registerTimeTable, { reload }] = useTable({
       api: SpaceSdkList,
       title: 'SDK列表',
@@ -132,6 +212,16 @@ export default defineComponent({
       console.log('tabChange', val);
       reload();
     }
+    function renderType(type: number): string {
+      switch (type) {
+        case 0:
+          return t(`routes.product.statusType.0`);
+        case 1:
+          return t(`routes.product.statusType.1`);
+        default:
+          return t(`routes.product.statusType.1`);
+      }
+    }
     async function handleDelete(record: Recordable) {
       console.log('点击了删除', record);
       await SpaceSdkDelete({ id: record.id });

+ 5 - 0
yarn.lock

@@ -10123,6 +10123,11 @@ tinycolor2@^1.4.2:
   resolved "https://registry.npmmirror.com/tinycolor2/-/tinycolor2-1.4.2.tgz"
   integrity sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==
 
+tinymce@^5.10.2:
+  version "5.10.5"
+  resolved "https://registry.npmmirror.com/tinymce/-/tinymce-5.10.5.tgz#02aef6a67e915f1559e51fa8fb007270d9666778"
+  integrity sha512-nFKtLhmoRtExBxUfv06JlkbQWux5D+d115vxSRAqUmccZdrtpFvOIYwZmikvulLdM9pfEpvO0B+RQ2qFV/+R7w==
+
 tmp@^0.0.33:
   version "0.0.33"
   resolved "https://registry.npmmirror.com/tmp/-/tmp-0.0.33.tgz"