pansl 2 роки тому
батько
коміт
bb2e0a4e93

+ 57 - 0
src/api/applet/index.ts

@@ -0,0 +1,57 @@
+import http from '@/api/http';
+/**
+ * 用户小程序列表
+ */
+export function channelMiniprogramList(params?: object) {
+  return http.get('/channel/miniprogram/list', params);
+}
+/**
+ * 小程序列表
+ */
+export function manageMiniprogramIndex(params: object) {
+  return http.get('/manage/miniprogram/index', params);
+}
+/**
+ * 小程序列表
+ */
+export function manageMiniprogramShow(id: number | string, params?: object) {
+  return http.get(`/manage/miniprogram/show/${id}`, params);
+}
+/**
+ * 小程序类型
+ */
+export function manageMiniprogramTypelist(params?: object) {
+  return http.get('/manage/miniprogram/typelist', params);
+}
+
+/**
+ * 添加小程序
+ */
+export function manageMiniprogramStore(params: object) {
+  return http.post('/manage/miniprogram/store', params);
+}
+/**
+ * 更新小程序
+ */
+export function manageMiniprogramUpdate(id: number | string, params: object) {
+  return http.post(`/manage/miniprogram/update/${id}`, params);
+}
+/**
+ * 分配小程序
+ */
+export function manageMiniprogramAllocation(
+  id: number | string,
+  params: object
+) {
+  return http.post(`/manage/miniprogram/allocation/${id}`, params);
+}
+
+/**
+ * 小程序分配详情
+ */
+export function manageMiniprogramAllocationDetail(
+  id: number | string,
+  params?: object
+) {
+  return http.get(`/manage/miniprogram/allocation/${id}`, params);
+}

+ 8 - 4
src/components/Upload/myUpload.vue

@@ -44,7 +44,7 @@
 <script lang="ts" setup>
 import { ref, watch } from "vue";
 import { ElLoading, ElMessage } from "element-plus";
-import request from '@/api/http';
+import http from '@/api/http';
 import { Close, Upload, Download, Plus, Link } from "@element-plus/icons-vue";
 const emits = defineEmits(["fileSuccess", "fileRemove"]);
 interface Props {
@@ -96,6 +96,12 @@ watch(
 
 // 文件变化Handle 这里监听上传文件的变化是一个一个接收到变化的,所以文件也是一个一个上传到服务器上面的
 const handleChange = async (file: any, fileList: any[]) => {
+  console.log(fileList, 'fileListfileList');
+  console.log(file, 'filefilefile', /^[0-9_][0-9_]*$/.test(file.name));
+  if (!/^[0-9]+_/.test(file.name)) {
+    ElMessage.error(`文件上传格式错误`);
+    return false
+  }
   // 防止多次执行change
   const rawFile = file.raw;
   const list = props.acceptTypeDesc.split("/");
@@ -128,9 +134,7 @@ const handleChange = async (file: any, fileList: any[]) => {
     });
     // 上传到服务器上面
     const requestURL: string = props.action;
-    request("post", requestURL, formData, {
-      headers: { "Content-Type": "multipart/form-data" },
-    })
+    http.post(requestURL, formData)
       .then(async (res: any) => {
         if (res.code == 0) {
           loadingInstance.close();

+ 5 - 3
src/directives/index.ts

@@ -1,6 +1,8 @@
-import type { App } from 'vue'
+import type { App } from 'vue';
 
-import action from './permission/action'
+import action from './permission/action';
+import formatNumber from './mydirectives/index';
 export function bootstrapDirectives(app: App): void {
-  app.directive('action', action)
+  app.directive('action', action);
+  app.directive('format-number', formatNumber);
 }

+ 32 - 0
src/directives/mydirectives/index.ts

@@ -0,0 +1,32 @@
+/**
+ * 使用v-format-number="{ chunkSizes: [3, 4, 4], separator: '-' }"
+ */
+function check(el: any, binding: any) {
+  const inputEl = el.tagName === 'INPUT' ? el : el.querySelector('input');
+  inputEl.addEventListener('input', function () {
+    const maxLength = binding.value.maxLength || 11;
+    const separator = binding.value.separator || ' ';
+    const chunkSizes = binding.value.chunkSizes || [4, 4, 4, 4];
+    let trimmed = inputEl.value.replace(/\s+/g, '').slice(0, maxLength);
+    let chunks = [];
+    let i = 0;
+    chunkSizes.forEach(chunkSize => {
+      let chunk = trimmed.slice(i, i + chunkSize);
+      if (chunk.length > 0) {
+        chunks.push(chunk);
+      }
+      i += chunkSize;
+    });
+    inputEl.value = chunks.join(separator);
+  });
+}
+
+export default {
+  mounted(el: any, binding: any) {
+    check(el, binding);
+  },
+
+  updated(el: any, binding: any) {
+    check(el, binding);
+  }
+};

+ 1 - 1
src/router/modules/applet.ts

@@ -11,7 +11,7 @@ const router: RouteRecordRaw[] = [
         path: 'applet',
         name: 'applet-account',
         meta: { title: '小程序管理', icon: 'home' },
-        component: () => import('@/views/appletManage/applet/index.vue')
+        component: () => import('@/views/appletManage/index.vue')
       }
     ]
   }

+ 1 - 1
src/router/modules/caster.ts

@@ -10,7 +10,7 @@ const router: RouteRecordRaw[] = [
       {
         path: 'index',
         name: 'user-account',
-        meta: { title: '添加投手', icon: 'home' },
+        meta: { title: '添加优化师', icon: 'home' },
         component: () => import('@/views/user/caster/index.vue')
       }
     ]

+ 0 - 180
src/views/appletManage/applet/form/create.vue

@@ -1,180 +0,0 @@
-<template>
-  <el-form :model="formData" label-width="120px" ref="ruleForm" :rules="rules" v-loading="loading" class="pr-4">
-    <div class="flex flex-row justify-between">
-      <div class="w-full">
-        <el-form-item label="小程序名称" prop="email">
-          <el-input v-model="formData.email" placeholder="请输入小程序名称" />
-        </el-form-item>
-        <el-form-item label="所属公司" prop="username">
-          <el-input v-model="formData.username" placeholder="请输入所属公司" />
-        </el-form-item>
-        <el-form-item label="对应剧场名称" v-if="!props.primary" prop="password">
-          <el-input v-model="formData.password" clearable type="password" autocomplete="new-password" size="large"
-            placeholder="请输入对应剧场名称" show-password class="h-12 text-base" />
-        </el-form-item>
-        <el-form-item label="类型" prop="miniProgramIds">
-          <el-select class="w-full" v-model="formData.miniProgramIds" remote filterable multiple
-            :remote-method="remoteMethod" clearable placeholder="选择类型">
-            <el-option v-for="item in cpList" :key="item.cp_id" :label="item.cp_name" :value="item.cp_name" />
-          </el-select>
-        </el-form-item>
-        <el-form-item label="APP ID" v-if="!props.primary" prop="repassword">
-          <el-input v-model="formData.repassword" clearable type="password" autocomplete="new-password" size="large"
-            placeholder="请输入APP ID" show-password class="h-12 text-base" />
-        </el-form-item>
-        <el-form-item label="APP 密钥" v-if="!props.primary" prop="repassword">
-          <el-input v-model="formData.repassword" clearable type="password" autocomplete="new-password" size="large"
-            placeholder="请输入APP 密钥" show-password class="h-12 text-base" />
-        </el-form-item>
-        <el-form-item label="状态" prop="status">
-          <el-switch v-model="formData.status" :active-value="1" :inactive-value="2" />
-        </el-form-item>
-        <el-form-item label="备注" prop="remark">
-          <el-input v-model="formData.remark" placeholder="请填写备注" type="textarea" />
-        </el-form-item>
-      </div>
-    </div>
-    <div class="flex justify-end">
-      <el-button type="primary" @click="submitForm(ruleForm)">{{ $t('system.confirm') }}</el-button>
-    </div>
-  </el-form>
-</template>
-
-<script lang="ts" setup>
-import { useCreate } from '@/hook/curd/useCreate';
-import { useShow } from '@/hook/curd/useShow';
-import { cpManageCpList, cpOptions } from '@/api/cp/index'
-import { advertiserGetAdvertiser, advertiserAdd, advertiserUpdateAdvertiser } from '@/api/advertiser/index'
-import type { FormInstance, FormRules } from 'element-plus'
-const ruleForm = ref<FormInstance>()
-import { onMounted, ref } from 'vue';
-const props = defineProps({
-  primary: String | Number,
-});
-const formData = ref({ status: 2, miniProgramIds: [] })
-//自定义校验规则
-const validatePasswordConfirmation = (
-  rule: any,
-  value: any,
-  callback: any
-) => {
-  if (value === '') {
-    callback(new Error('请再次输入密码'));
-  } else if (value !== ruleForm.password) {
-    callback(new Error('两次密码不匹配'));
-  } else {
-    callback();
-  }
-};
-const rules = reactive({
-  miniProgramIds: [{ required: true, message: '请选择小程序' }],
-  email: [
-    {
-      required: true,
-      message: '请输入登录账号',
-      trigger: 'blur'
-    },
-    {
-      type: 'email',
-      message: '邮箱格式不正确',
-      trigger: 'blur'
-    }
-  ],
-  remark: [
-    {
-      required: true,
-      message: '请输入备注',
-      trigger: 'blur'
-    }
-  ],
-  username: [
-    {
-      required: true,
-      message: '请输入用户名',
-      trigger: 'blur'
-    }
-  ],
-  password: [
-    {
-      required: true,
-      message: '请输入密码',
-      trigger: 'blur'
-    },
-    {
-      pattern: /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,20}$/,
-      message:
-        '必须包含大小写字母和数字的组合,可以使用特殊字符,长度在6-20之间'
-    }
-  ],
-  repassword: [
-    {
-      required: true,
-      message: '请再次输入密码',
-      trigger: 'blur'
-    },
-    { validator: validatePasswordConfirmation, trigger: 'blur' }
-  ]
-});
-const loading = ref(false)
-
-const remoteMethod = (query: string) => {
-  if (query) {
-    initCpOtion({ cp_name: query })
-  } else {
-    initCpOtion({})
-  }
-}
-
-const initCpOtion = (params: object) => {
-  cpOptions(params).then(res => {
-    cpList.value = res.data;
-  })
-}
-
-const passwordRules = [
-  {
-    required: true,
-    message: '密码必须填写'
-  },
-  {
-    pattern: /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,20}$/,
-    message: '必须包含大小写字母和数字的组合,可以使用特殊字符,长度在6-20之间'
-  }
-];
-const submitForm = (formEl: FormInstance | undefined) => {
-  console.log(formData.value, 'formData.valueformData.value');
-  if (!formEl) return;
-  formEl
-    .validate(valid => {
-      if (valid) {
-        let api;
-        if (props.primary) {
-          api = advertiserUpdateAdvertiser
-        } else {
-          api = advertiserAdd
-        }
-        api({ ...formData.value }).then(res => {
-          console.log(res);
-          ElMessage.success(res.message)
-          emit('close')
-        })
-      } else {
-        loading.value = false;
-      }
-    })
-    .then(() => { });
-}
-
-if (props.primary) {
-  advertiserGetAdvertiser({ id: props.primary }).then(res => {
-    console.log(res, 'props.primary');
-    formData.value = res.data
-  })
-}
-
-const emit = defineEmits(['close']);
-const cpList = ref();
-onMounted(() => {
-  initCpOtion({})
-});
-</script>

+ 0 - 118
src/views/appletManage/applet/form/depotsTransfer.vue

@@ -1,118 +0,0 @@
-<template>
-  <el-form :model="form" label-width="130px" ref="ruleForm" :rules="rules" v-loading="loading" class="pr-4">
-    <div class="flex flex-row justify-between">
-      <div class="w-full">
-        <el-form-item label="小程序名称" prop="email">
-          <el-input v-model="form.email" placeholder="请填写登录账号" />
-        </el-form-item>
-        <el-form-item label="状态" prop="username">
-          <el-switch v-model="form.delivery" />
-        </el-form-item>
-        <el-form-item label="分配至投手公司" prop="username">
-          <div>
-            <el-transfer v-model="form.depotsValue" :props="{
-              key: 'channel_id',
-              label: 'remark',
-            }" :titles="['未分配', '已分配']" filterable @right-check-change="transferChange" :filter-method="filterMethod"
-              filter-placeholder="搜索" :data="dataObj" />
-          </div>
-        </el-form-item>
-      </div>
-    </div>
-    <div class="flex justify-end">
-      <el-button type="primary" size="default" @click="doSave">确定</el-button>
-    </div>
-  </el-form>
-</template>
-
-<script lang="ts" setup>
-import { bookDistribute, bookDistributeSave } from '@/api/bookManage/index';
-
-const props = defineProps({
-  primary: Object,
-});
-const loading = ref(false)
-const rules = reactive({
-  miniProgramIds: [{ required: true, message: '请选择小程序' }],
-  email: [
-    {
-      required: true,
-      message: '请输入登录账号',
-      trigger: 'blur'
-    },
-    {
-      type: 'email',
-      message: '邮箱格式不正确',
-      trigger: 'blur'
-    }
-  ],
-  remark: [
-    {
-      required: true,
-      message: '请输入备注',
-      trigger: 'blur'
-    }
-  ],
-  username: [
-    {
-      required: true,
-      message: '请输入用户名',
-      trigger: 'blur'
-    }
-  ],
-});
-const form = ref({})
-const dataObj = ref([])
-const channels = ref([])
-const emit = defineEmits(['close']);
-const transferChange = (e) => {
-  let arr = JSON.parse(JSON.stringify(dataObj.value))
-  const checkArr = arr.filter(el => e.includes(el.channel_id)).map(el => {
-    return {
-      channel_id: el.channel_id,
-      is_enabled: el.is_enabled
-    }
-  })
-  console.log(channels);
-  channels.value = checkArr
-
-}
-const filterMethod = (query, item) => {
-  return item.remark.includes(query)
-}
-const doSave = () => {
-  console.log(form.value.depotsValue, 'channels.value', toRaw(channels.value));
-  if (toRaw(channels.value).length <= 0) {
-    ElMessage.warning('请选择商户')
-  } else {
-    bookDistributeSave(props.primary.id, { channels: channels.value }).then(res => {
-      console.log(res);
-      ElMessage.success(res.message)
-      emit('close', false)
-    })
-  }
-}
-
-
-onMounted(async () => {
-  let { data } = await bookDistribute(props.primary.id, {});
-  console.log(data);
-  dataObj.value = data
-})
-
-</script>
-
-<style lang="scss" scoped>
-::v-deep(.el-input__wrapper) {
-  display: flex;
-  width: 180px;
-  flex: none;
-}
-
-.wrapper {
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  width: 100%;
-}
-</style>

+ 145 - 0
src/views/appletManage/form/create.vue

@@ -0,0 +1,145 @@
+<template>
+  <el-form :model="formData" label-width="120px" ref="ruleForm" :rules="rules" v-loading="loading" class="pr-4">
+    <div class="flex flex-row justify-between">
+      <div class="w-full">
+        <el-form-item label="小程序名称" prop="name">
+          <el-input v-model="formData.name" placeholder="请输入小程序名称" />
+        </el-form-item>
+        <el-form-item label="所属公司" prop="company">
+          <el-input v-model="formData.company" placeholder="请输入所属公司" />
+        </el-form-item>
+        <el-form-item label="对应剧场名称" prop="play_name">
+          <el-input v-model="formData.play_name" clearable size="large" placeholder="请输入对应剧场名称" />
+        </el-form-item>
+        <el-form-item label="类型" prop="type">
+          <el-select class="w-full" v-model="formData.type" filterable clearable placeholder="选择类型">
+            <el-option v-for="item in appletType" :key="item.value" :label="item.name" :value="item.value" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="APP ID" prop="appid">
+          <el-input v-model="formData.appid" clearable size="large" placeholder="请输入APP ID" />
+        </el-form-item>
+        <el-form-item label="APP 密钥" prop="appsecret">
+          <el-input v-model="formData.appsecret" clearable size="large" placeholder="请输入APP 密钥" />
+        </el-form-item>
+        <el-form-item label="状态" prop="status">
+          <el-switch v-model="formData.status" :active-value="1" :inactive-value="2" />
+        </el-form-item>
+        <el-form-item label="备注" prop="remark">
+          <el-tooltip placement="top">
+            <template #content> 鼠标移到账号上面显示备注内容<br /> </template>
+            <el-input v-model="formData.remark" placeholder="请填写备注" type="textarea" />
+          </el-tooltip>
+        </el-form-item>
+      </div>
+    </div>
+    <div class="flex justify-end">
+      <el-button type="primary" @click="submitForm(ruleForm)">{{ $t('system.confirm') }}</el-button>
+    </div>
+  </el-form>
+</template>
+
+<script lang="ts" setup>
+import { useCreate } from '@/hook/curd/useCreate';
+import { useShow } from '@/hook/curd/useShow';
+import type { FormInstance, FormRules } from 'element-plus'
+import { manageMiniprogramStore, manageMiniprogramTypelist, manageMiniprogramShow, manageMiniprogramUpdate } from '@/api/applet/index'
+const ruleForm = ref<FormInstance>()
+import { onMounted, ref } from 'vue';
+const props = defineProps({
+  primary: String | Number,
+});
+const formData = ref({ status: 2, miniProgramIds: [] })
+const rules = reactive({
+  type: [{ required: true, message: '请选择类型' }],
+  appid: [
+    {
+      required: true,
+      message: '请输入APP ID',
+      trigger: 'blur'
+    }
+  ],
+  remark: [
+    {
+      required: true,
+      message: '请输入备注',
+      trigger: 'blur'
+    }
+  ],
+  appsecret: [
+    {
+      required: true,
+      message: '请输入APP 密钥',
+      trigger: 'blur'
+    }
+  ],
+  name: [
+    {
+      required: true,
+      message: '请输入小程序名称',
+      trigger: 'blur'
+    }
+  ],
+  company: [
+    {
+      required: true,
+      message: '请输入所属公司',
+      trigger: 'blur'
+    },
+  ],
+  play_name: [
+    {
+      required: true,
+      message: '请输入对应剧场名称',
+      trigger: 'blur'
+    },
+  ]
+});
+const loading = ref(false)
+const appletType = ref([])
+
+const initAppletType = () => {
+  manageMiniprogramTypelist().then(res => {
+    console.log(res, 'channelMiniprogramListchannelMiniprogramList');
+    appletType.value = res.data
+  })
+}
+const submitForm = (formEl: FormInstance | undefined) => {
+  console.log(formData.value, 'formData.valueformData.value');
+  if (!formEl) return;
+  formEl
+    .validate(valid => {
+      if (valid) {
+        if (props.primary) {
+          manageMiniprogramUpdate(props.primary, { ...formData.value }).then(res => {
+            console.log(res);
+            ElMessage.success(res.message)
+            emit('close')
+          })
+        } else {
+          manageMiniprogramStore({ ...formData.value }).then(res => {
+            console.log(res);
+            ElMessage.success(res.message)
+            emit('close')
+          })
+        }
+      } else {
+        loading.value = false;
+      }
+    })
+    .then(() => { });
+}
+
+if (props.primary) {
+  manageMiniprogramShow(props.primary).then(res => {
+    console.log(res, 'props.primary');
+    formData.value = res.data
+  })
+}
+
+const emit = defineEmits(['close']);
+const cpList = ref();
+onMounted(() => {
+  initAppletType()
+});
+</script>

+ 106 - 0
src/views/appletManage/form/depotsTransfer.vue

@@ -0,0 +1,106 @@
+<template>
+  <el-form :model="form" label-width="130px" ref="ruleForm" :rules="rules" v-loading="loading" class="pr-4">
+    <div class="flex flex-row justify-between">
+      <div class="w-full">
+        <el-form-item label="小程序名称" prop="email">
+          <el-input v-model="form.name" disabled placeholder="请填写登录账号" />
+        </el-form-item>
+        <el-form-item label="状态" prop="status">
+          <el-switch v-model="form.status" disabled :active-value="1" :inactive-value="0" />
+        </el-form-item>
+        <el-form-item label="分配至投手公司" prop="username">
+          <div>
+            <el-transfer v-model="form.depotsValue" :props="{
+              key: 'id',
+              label: 'username',
+            }" :titles="['未分配', '已分配']" filterable :left-default-checked="leftChecked"
+              :right-default-checked="rightChecked" @right-check-change="transferChange($event, 'right')"
+              @left-check-change="transferChange($event, 'left')" :filter-method="filterMethod" filter-placeholder="搜索"
+              :data="dataObj" />
+          </div>
+        </el-form-item>
+      </div>
+    </div>
+    <div class="flex justify-end">
+      <el-button type="primary" size="default" @click="doSave">确定</el-button>
+    </div>
+  </el-form>
+</template>
+
+<script lang="ts" setup>
+import { manageMiniprogramAllocationDetail, manageMiniprogramShow, manageMiniprogramAllocation } from '@/api/applet/index'
+
+const props = defineProps({
+  primary: Object,
+});
+const loading = ref(false)
+const rules = reactive({
+  miniProgramIds: [{ required: true, message: '请选择小程序' }],
+});
+const form = ref({})
+const dataObj = ref([])
+const leftChecked = ref([])
+const rightChecked = ref([])
+const channels = ref([])
+const emit = defineEmits(['close']);
+const params = ref({})
+const transferChange = (e, type) => {
+  console.log(e, 'transferChangetransferChange');
+  let arr = JSON.parse(JSON.stringify(dataObj.value))
+  const checkArr = arr.filter(el => e.includes(el.id)).map(el => el.id)
+  channels.value = checkArr
+  params.value = { uids: channels.value.join(','), action: type == 'left' ? 'off' : 'on' }
+  console.log(params.value, channels.value, 'checkArrcheckArr');
+}
+const filterMethod = (query, item) => {
+  return item.username.includes(query)
+}
+const doSave = () => {
+  console.log(form.value.depotsValue, 'channels.value', toRaw(channels.value));
+  if (toRaw(channels.value).length <= 0) {
+    ElMessage.warning('请选择投手公司')
+  } else {
+    manageMiniprogramAllocation(props.primary.id, params.value).then(res => {
+      console.log(res);
+      ElMessage.success(res.message)
+      emit('close', false)
+    })
+  }
+}
+
+
+onMounted(() => {
+  manageMiniprogramAllocationDetail(props.primary.id).then(res => {
+    console.log(res, 'manageMiniprogramAllocationDetail');
+    dataObj.value = res.data.all
+    let timer = setTimeout(() => {
+      if (res.data.on?.length > 0) {
+        form.value.depotsValue = res.data.on.map(el => el.id)
+        rightChecked.value = res.data.on.map(el => el.id)
+        clearTimeout(timer)
+      }
+    }, 10);
+  });
+  manageMiniprogramShow(props.primary.id).then(res => {
+    console.log(res, 'props.primary');
+    form.value = res.data
+  })
+
+})
+
+</script>
+
+<style lang="scss" scoped>
+::v-deep(.el-input__wrapper) {
+  display: flex;
+  width: 180px;
+  flex: none;
+}
+
+.wrapper {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  width: 100%;
+}
+</style>

+ 17 - 17
src/views/appletManage/applet/index.vue

@@ -1,33 +1,36 @@
 <template>
   <div class="flex flex-col justify-between w-full sm:flex-row">
-    <!-- <Department v-model="query.department_id" @searchDepartmentUsers="search" v-if="hasRoles" class="dark:bg-regal-dark" /> -->
     <div :class="hasRoles ? 'w-full ml-0 sm:ml-2 mt-2 sm:mt-0' : 'w-full'">
       <Search :search="search" :reset="reset">
         <template v-slot:body>
           <el-form-item label="小程序名称">
-            <el-input v-model="query.email" clearable />
+            <el-input v-model="query.name" clearable />
           </el-form-item>
           <el-form-item label="所属公司">
-            <el-input v-model="query.username" clearable />
+            <el-input v-model="query.company" clearable />
           </el-form-item>
           <el-form-item label="对应剧场名称">
-            <el-input v-model="query.username" clearable />
+            <el-input v-model="query.play_name" clearable />
           </el-form-item>
         </template>
       </Search>
       <div class="table-default">
         <Operate :show="open" />
         <el-table :data="tableData" class="mt-3" v-loading="loading">
-          <el-table-column prop="username" label="ID" />
-          <el-table-column prop="username" label="小程序名称" />
-          <el-table-column prop="username" label="所属公司" />
-          <el-table-column prop="username" label="对应剧场名称" />
-          <el-table-column prop="status" label="状态">
+          <el-table-column prop="id" label="ID" />
+          <el-table-column prop="name" label="小程序名称">
             <template #default="scope">
-              <Status v-model="scope.row.status" :id="scope.row.id" :api="api" />
+              <el-tooltip placement="top" v-if="scope.row.remark">
+                <template #content> {{ scope.row.remark }}<br /> </template>
+                <span>{{ scope.row.name }}</span>
+              </el-tooltip>
+              <span v-else>{{ scope.row.name }}</span>
             </template>
           </el-table-column>
-          <el-table-column prop="created_at" label="类型" />
+          <el-table-column prop="company" label="所属公司" />
+          <el-table-column prop="play_name" label="对应剧场名称" />
+          <el-table-column prop="status_name" label="状态" />
+          <el-table-column prop="type_name" label="类型" />
           <el-table-column label="操作" width="200">
             <template #default="scope">
               <el-button link type="primary" size="small" @click="opendepots(scope.row)">分配</el-button>
@@ -43,7 +46,7 @@
       </Dialog>
 
       <Dialog v-model="visible" :title="title" destroy-on-close>
-        <Create @close="close(reset)" :primary="id" :api="api" />
+        <Create @close="close(search)" :primary="id" :api="api" />
       </Dialog>
     </div>
   </div>
@@ -59,11 +62,12 @@ import { useOpen } from '@/hook/curd/useOpen';
 import Department from './components/department.vue';
 import { useUserStore } from '@/stores/modules/user';
 import { isUndefined } from '@/support/helper';
+import { manageMiniprogramIndex } from '@/api/applet/index'
 
 const userStore = useUserStore();
 const applet = ref([{ id: 1, name: '微信', value: 'wx' }, { id: 2, name: '抖音', value: 'dy' }])
 
-const api = 'users';
+const api = '/manage/miniprogram/index';
 const depotsVisible = ref(false)
 const depotsData = ref({})
 
@@ -87,9 +91,5 @@ const closeDeptos = () => {
 
 onMounted(() => {
   search();
-
-  deleted(reset);
-
-  hasRoles.value = !isUndefined(userStore.getRoles);
 });
 </script>

+ 19 - 21
src/views/user/caster/create.vue

@@ -2,8 +2,8 @@
   <el-form :model="formData" label-width="100px" ref="ruleForm" :rules="rules" v-loading="loading" class="pr-4">
     <div class="flex flex-row justify-between">
       <div class="w-full">
-        <el-form-item label="登录账号" prop="email">
-          <el-input v-model="formData.email" placeholder="请填写登录账号" />
+        <el-form-item label="邮箱" prop="email">
+          <el-input v-model="formData.email" placeholder="请填写邮箱" />
         </el-form-item>
         <el-form-item label="用户名" prop="username">
           <el-input v-model="formData.username" placeholder="请填写用户名" />
@@ -17,16 +17,19 @@
             placeholder="确认密码" show-password :prefix-icon="Lock" class="h-12 text-base" />
         </el-form-item>
         <el-form-item label="绑定小程序" prop="miniProgramIds">
-          <el-select class="w-full" v-model="formData.miniProgramIds" remote filterable multiple
-            :remote-method="remoteMethod" clearable placeholder="选择小程序">
-            <el-option v-for="item in cpList" :key="item.cp_id" :label="item.cp_name" :value="item.cp_name" />
+          <el-select class="w-full" v-model="formData.miniProgramIds" filterable multiple clearable placeholder="选择小程序">
+            <el-option v-for="item in applet" :key="item.miniprogram_id" :label="item.name"
+              :value="item.miniprogram_id" />
           </el-select>
         </el-form-item>
         <el-form-item label="状态" prop="status">
           <el-switch v-model="formData.status" :active-value="1" :inactive-value="2" />
         </el-form-item>
         <el-form-item label="备注" prop="remark">
-          <el-input v-model="formData.remark" placeholder="请填写备注" type="textarea" />
+          <el-tooltip placement="top">
+            <template #content> 鼠标移到账号上面显示备注内容<br /> </template>
+            <el-input v-model="formData.remark" placeholder="请填写备注" type="textarea" />
+          </el-tooltip>
         </el-form-item>
       </div>
     </div>
@@ -40,14 +43,15 @@
 import { Lock, Message, Key } from '@element-plus/icons-vue'
 import { useCreate } from '@/hook/curd/useCreate';
 import { useShow } from '@/hook/curd/useShow';
-import { cpManageCpList, cpOptions } from '@/api/cp/index'
 import { advertiserGetAdvertiser, advertiserAdd, advertiserUpdateAdvertiser } from '@/api/advertiser/index'
 import type { FormInstance, FormRules } from 'element-plus'
+import { channelMiniprogramList } from '@/api/applet/index'
 const ruleForm = ref<FormInstance>()
 import { onMounted, ref } from 'vue';
 const props = defineProps({
   primary: String | Number,
 });
+const applet = ref([])
 const formData = ref({ status: 2, miniProgramIds: [] })
 //自定义校验规则
 const validatePasswordConfirmation = (
@@ -57,7 +61,8 @@ const validatePasswordConfirmation = (
 ) => {
   if (value === '') {
     callback(new Error('请再次输入密码'));
-  } else if (value !== ruleForm.password) {
+  } else if (value !== formData.value.password) {
+    console.log(formData.value.password, 'ruleForm.password');
     callback(new Error('两次密码不匹配'));
   } else {
     callback();
@@ -68,7 +73,7 @@ const rules = reactive({
   email: [
     {
       required: true,
-      message: '请输入登录账号',
+      message: '请输入邮箱',
       trigger: 'blur'
     },
     {
@@ -114,17 +119,10 @@ const rules = reactive({
 });
 const loading = ref(false)
 
-const remoteMethod = (query: string) => {
-  if (query) {
-    initCpOtion({ cp_name: query })
-  } else {
-    initCpOtion({})
-  }
-}
-
-const initCpOtion = (params: object) => {
-  cpOptions(params).then(res => {
-    cpList.value = res.data;
+const initApplet = () => {
+  channelMiniprogramList().then(res => {
+    console.log(res, 'channelMiniprogramListchannelMiniprogramList');
+    applet.value = res.data
   })
 }
 
@@ -172,6 +170,6 @@ if (props.primary) {
 const emit = defineEmits(['close']);
 const cpList = ref();
 onMounted(() => {
-  initCpOtion({})
+  initApplet()
 });
 </script>

+ 16 - 7
src/views/user/caster/index.vue

@@ -11,16 +11,17 @@
           </el-form-item>
           <el-form-item label="小程序">
             <el-select v-model="query.miniProgramId" filterable clearable placeholder="选择小程序">
-              <el-option v-for="item in applet" :key="item.id" :label="item.name" :value="item.value" />
+              <el-option v-for="item in applet" :key="item.miniprogram_id" :label="item.name"
+                :value="item.miniprogram_id" />
             </el-select>
           </el-form-item>
         </template>
       </Search>
       <div class="table-default">
-        <Operate :show="open" />
+        <Operate :show="open" v-action="'channel.Advertiser.addAdvertiser'" />
         <el-table :data="tableData" class="mt-3" v-loading="loading">
           <el-table-column prop="id" label="ID" />
-          <el-table-column prop="email" label="账号">
+          <el-table-column prop="email" label="邮箱">
             <template #default="scope">
               <el-tooltip placement="top" v-if="scope.row.remark">
                 <template #content> {{ scope.row.remark }}<br /> </template>
@@ -38,7 +39,7 @@
               </div>
             </template>
           </el-table-column>
-          <el-table-column prop="status" label="状态">
+          <el-table-column prop="status" label="状态" v-action="'channel.Advertiser.enable'">
             <template #default="scope">
               <Status v-model="scope.row.status" :id="scope.row.id" :api="statusapi" />
             </template>
@@ -46,7 +47,7 @@
           <el-table-column prop="created_at" label="创建时间" />
           <el-table-column label="操作" width="200">
             <template #default="scope">
-              <Update @click="open(scope.row.id)" />
+              <Update @click="open(scope.row.id)" v-action="'channel.Advertiser.updateAdvertiser'" />
             </template>
           </el-table-column>
         </el-table>
@@ -55,7 +56,7 @@
       </div>
 
       <Dialog v-model="visible" :title="title" destroy-on-close>
-        <Create @close="close(reset)" :primary="id" />
+        <Create @close="close(search)" :primary="id" />
       </Dialog>
     </div>
   </div>
@@ -66,16 +67,24 @@ import { computed, onMounted, ref } from 'vue';
 import Create from './create.vue';
 import { useGetList } from '@/hook/curd/useGetList';
 import { useOpen } from '@/hook/curd/useOpen';
+import { channelMiniprogramList } from '@/api/applet/index'
 
 const statusapi = 'users';
-const applet = ref([{ id: 1, name: '微信', value: 'wx' }, { id: 2, name: '抖音', value: 'dy' }])
+const applet = ref([])
 const api = 'channel/advertiser/listAdvertiser';
 const { data, query, search, reset, loading } = useGetList(api);
 const { open, close, title, visible, id } = useOpen();
 
 const tableData = computed(() => data.value?.data);
+const initApplet = () => {
+  channelMiniprogramList().then(res => {
+    console.log(res, 'channelMiniprogramListchannelMiniprogramList');
+    applet.value = res.data
+  })
+}
 
 onMounted(() => {
+  initApplet();
   search();
 });
 </script>

+ 1 - 1
src/views/videoManage/index.vue

@@ -125,7 +125,7 @@ const addApi = 'contentManage/book/edit_author';
 let multipleSelection = reactive([]);
 const { data, query, search, reset, loading } = useGetList(api);
 const { deleted } = useDestroy();
-const depotsVisible = ref(true)
+const depotsVisible = ref(false)
 const uploadBooksVisible = ref(false)
 const depotsData = ref({})
 const opendepots = (data) => {