ymy před 1 rokem
rodič
revize
9625cfbcba

+ 1 - 1
.env.development

@@ -17,7 +17,7 @@ VITE_APP_MONITRO_ADMIN = 'http://localhost:9090/admin/applications'
 VITE_APP_XXL_JOB_ADMIN = 'http://localhost:9100/xxl-job-admin'
 
 #上传地址
-VITE_APP_UPLOAD_URL = 'http://192.168.2.28:9000/lsf/'
+VITE_APP_UPLOAD_URL = 'https://minio.lzlxylsf.com/lsf/'
 
 #统一登录地址
 VITE_APP_LOGIN_URL = 'https://sso.benyuntech.com/#/'

+ 1 - 1
.env.production

@@ -20,7 +20,7 @@ VITE_APP_BASE_API = '/szzs'
 VITE_BUILD_COMPRESS = gzip
 
 #上传地址
-VITE_APP_UPLOAD_URL = '/data/access/lsf/'
+VITE_APP_UPLOAD_URL = 'https://minio.lzlxylsf.com/lsf/'
 
 #统一登录地址
 # 正式

+ 20 - 4
src/components/mapMaker/index.vue

@@ -16,6 +16,7 @@
   const address = ref('') //详情值
   const emit = defineEmits();
   const _id = ref('')
+  let localsearch = ref(null);
   const geocoder = ref('');
   const props = defineProps({
     propConfig:{},
@@ -81,8 +82,19 @@
     if(callback) {
       callback()
     }
-  }
 
+    const config = {
+      pageCapacity: 10,	//每页显示的数量
+      onSearchComplete: localSearchResult	//接收数据的回调函数
+    };
+    localsearch = new T.LocalSearch(map.value, config);
+  }
+  const localSearchResult = result => {
+    if(Number(result.count) > 0){
+      let arr = result.pois[0].lonlat.split(',');
+      map.value.panTo(new T.LngLat(arr[0],arr[1]), zoom.value);
+    }
+  }
   const getLngLat = lnglat => {
     map.value.clearOverLays();
     var marker = new T.Marker(new T.LngLat(lnglat.lng, lnglat.lat));
@@ -122,7 +134,8 @@
             }
             if(address){
               zoom.value = 17;
-              geocoder.value.getPoint(address, searchResult);
+              // geocoder.value.getPoint(address, searchResult);
+              localsearch.search(address);
             }
           }
           if(!map.value){
@@ -175,7 +188,8 @@
             address.value = props.parentValue.addrInfo
             zoom.value = 17;
           }
-          geocoder.value.getPoint(area.value + address.value, searchResult);
+          // geocoder.value.getPoint(area.value + address.value, searchResult);
+          localsearch.search(area.value + address.value);
         }
       }
     })
@@ -186,7 +200,9 @@
           area.value = props.parentValue.addrCodeInfo.replaceAll('/','');
         }
         zoom.value = 17;
-        geocoder.value.getPoint(area.value + address.value, searchResult);
+        localsearch.search(area.value + address.value);
+        // geocoder.value.getPoint(area.value + address.value, searchResult);
+        
       }
     })
   })

+ 1 - 1
src/layout/components/AppMain.vue

@@ -24,7 +24,7 @@ const tagsViewStore = useTagsViewStore()
   // min-height: calc(100vh - 50px);
   width: 100%;
   position: relative;
-  overflow: hidden;
+  // overflow: hidden;
 }
 
 .fixed-header + .app-main {

+ 2 - 1
src/main.js

@@ -19,7 +19,7 @@ import useUserStore from '@/store/modules/user'
 // 注册指令
 import plugins from './plugins' // plugins
 import request from '@/utils/request'
-import { download } from '@/utils/request'
+import { download,downloadBy } from '@/utils/request'
 
 // svg图标
 import 'virtual:svg-icons-register'
@@ -74,6 +74,7 @@ app.config.globalProperties.useDict = useDict
 app.config.globalProperties.getConfigKey = getConfigKey
 app.config.globalProperties.updateConfigByKey = updateConfigByKey
 app.config.globalProperties.download = download
+app.config.globalProperties.downloadBy = downloadBy
 app.config.globalProperties.parseTime = parseTime
 app.config.globalProperties.resetForm = resetForm
 app.config.globalProperties.handleTree = handleTree

+ 2 - 0
src/store/modules/user.js

@@ -11,6 +11,7 @@ const useUserStore = defineStore(
       name: '',
       avatar: '',
       roles: [],
+      userInfo:{},
       permissions: []
     }),
     actions: {
@@ -64,6 +65,7 @@ const useUserStore = defineStore(
             } else {
               this.roles = ['ROLE_DEFAULT']
             }
+            this.userInfo = user;
             this.name = user.userName
             this.avatar = avatar;
             resolve(res)

+ 5 - 1
src/utils/auth.js

@@ -3,7 +3,11 @@ import Cookies from 'js-cookie'
 const TokenKey = 'Admin_szzs-Token'
 
 export function getToken() {
-  return Cookies.get(TokenKey)
+  if (import.meta.env.VITE_APP_ENV === 'development') {
+    return 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpblR5cGUiOiJsb2dpbiIsImxvZ2luSWQiOiJzeXNfdXNlcjoxIiwicm5TdHIiOiJiVzRlWTdXUlRDSTBFbTVxc3JycklLTm42bUtjcEZlQiIsInVzZXJJZCI6MX0.CIBiXtHTTShN8RqnXR6-zliSsINxVyTHRQDQR37CiuU'
+  } else {
+    return Cookies.get(TokenKey)
+  }
 }
 
 export function setToken(token) {

+ 27 - 0
src/utils/request.js

@@ -146,4 +146,31 @@ export function download(url, params, filename, config) {
   })
 }
 
+// 通用下载方法2
+export function downloadBy(url, params, filename, config) {
+  downloadLoadingInstance = ElLoading.service({ text: "正在下载数据,请稍候", background: "rgba(0, 0, 0, 0.7)", })
+  return service.post(url, params, {
+    transformRequest: [(params) => { return JSON.stringify(params) }],
+    headers: { 'Content-Type': 'application/json;charset=utf-8' },
+    responseType: 'blob',
+    ...config
+  }).then(async (data) => {
+    const isBlob = blobValidate(data);
+    if (isBlob) {
+      const blob = new Blob([data])
+      saveAs(blob, filename)
+    } else {
+      const resText = await data.text();
+      const rspObj = JSON.parse(resText);
+      const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default']
+      ElMessage.error(errMsg);
+    }
+    downloadLoadingInstance.close();
+  }).catch((r) => {
+    console.error(r)
+    ElMessage.error('下载文件出现错误,请联系管理员!')
+    downloadLoadingInstance.close();
+  })
+}
+
 export default service

+ 64 - 0
src/views/base/adManage/components/broadcastState.vue

@@ -0,0 +1,64 @@
+<template>
+  <div>
+      <el-tag type="success" v-if="state === 1">播放正常</el-tag>
+      <el-tag type="warning" v-else>播放停止</el-tag>
+      <br v-if="listingState">
+      <span v-if="listingState">{{ listingState }}</span>
+      <br v-if="timeState">
+      <span v-if="timeState">{{ timeState }}</span>
+  </div>
+</template>
+
+<script setup>
+  import { computed,getCurrentInstance,nextTick  } from "vue";
+  const props = defineProps({
+    propConfig:{},
+    propValue:{},
+    parentValue:{}
+  })
+  const listingState = computed({
+    get() {
+      let n = ''
+      if(props.parentValue.onState == '下架'){
+        n = '已下架'
+      }
+      return n;
+    }
+  })
+  const timeState = computed({
+    get() {
+      let n = '';
+      if(props.parentValue.planStartTime && props.parentValue.planEndTime){
+        let date = new Date();
+        if(!(date >= new Date(props.parentValue.planStartTime) && date < new Date(props.parentValue.planEndTime))){
+          n = '已过期'
+        }
+      }else{
+        n = '未设置时间段'
+      }
+      return n;
+    }
+  })
+  const state = computed({
+    get() {
+      let v = 1;
+      if(props.parentValue.onState == '下架'){
+        v = 0;
+      }
+      if(props.parentValue.planStartTime && props.parentValue.planEndTime){
+        let date = new Date();
+        if(!(date >= new Date(props.parentValue.planStartTime) && date < new Date(props.parentValue.planEndTime))){
+          v = 0
+        }
+      }else{
+        v = 0;
+      }
+      return v;
+    }
+  })
+
+</script>
+
+<style lang="scss" scoped>
+  
+</style>

+ 7 - 0
src/views/base/adManage/index.vue

@@ -23,6 +23,7 @@
   import goodsImg from "./components/goodsImg.vue";
   import equipList from "./components/equipList.vue";
   import rangTime from './components/rangTime.vue';
+  import broadcastState from './components/broadcastState.vue'
   import {list,upDownShelves,detailHandle,updateTime} from '@/api/base/adManage'
   import Format from '@/benyun/utils/dateFormat'
 
@@ -140,6 +141,12 @@
         width:150,
         component:shallowRef(rangTime)
       },
+      {
+        title:'播放状态',
+        field:'bState',
+        width:150,
+        component:shallowRef(broadcastState)
+      },
       {
         title:'申请时间',
         field:'planCreateTime'

+ 1 - 1
src/views/base/adPlan/components/auModal.vue

@@ -7,7 +7,7 @@
             <el-image style="width: 60px; height: 60px" :src="goodsImgHandle(value.goodsImg)" fit="contain" />
             <div class="goods-txt">
               <div class="goods-title">{{ value.goodsName }}</div>
-              <div class="goods-price">¥{{ value.goodsPrice }}</div>
+              <!-- <div class="goods-price">¥{{ value.goodsPrice }}</div> -->
             </div>
           </div>
         </el-descriptions-item>

+ 24 - 2
src/views/base/adPutIn/index.vue

@@ -56,10 +56,19 @@
     },
     tool:{
       tools:{
-        export:true,
+        // export:true,
         search:true,
         refresh:true
-      }
+      },
+      customTools:[{
+        name: '导出', 
+        icon: 'bottom',
+        event:{
+          click:() =>{
+            loadDown()
+          }
+        }
+      }]
     },
     table:{
       attr:{
@@ -107,6 +116,19 @@
   const isSearch = ref(false)
   const timeNum = ref(0);
 
+  //导出
+  const loadDown = () => {
+    let data = proxy.$refs.view.getQuery();
+    data.pageNum = data.pageNo;
+    delete data.pageNo;
+    if(data.time && data.time.length > 0) {
+      data.startTime = data.time[0]
+      data.endTime = data.time[1]
+    }
+    delete data.time;
+    proxy.downloadBy('/plan/statistics/export',data,`广告投放_${new Date().getTime()}.xlsx`)
+  }
+
   const pagination = () => {
     if(isSearch.value){
       queryList();

+ 1 - 0
src/views/base/merchantManage/components/upload.vue

@@ -5,6 +5,7 @@
     <div class="uopload-box" v-if="pathImg">
       <div class="upload-img">
         <!-- <img :src="pathUrl + pathImg" style="width: 60px;" /> -->
+        
         <el-image
           style="width: 60px; height: 60px"
           :src="pathUrl + pathImg"

+ 16 - 3
src/views/base/merchantManage/index.vue

@@ -43,12 +43,21 @@
     },
     tool:{
       tools:{
-        export:true,
+        // export:true,
         add:true,
         // delete:true,
         search:true,
         refresh:true
-      }
+      },
+      customTools:[{
+        name: '导出', 
+        icon: 'bottom',
+        event:{
+          click:() =>{
+            loadDown()
+          }
+        }
+      }]
     },
     table:{
       attr:{
@@ -235,7 +244,11 @@
     delete config.value.modal.tool.tools.add;
     proxy.$refs.view.initFormTool();
   }
-
+  //导出
+  const loadDown = () => {
+    let data = proxy.$refs.view.getQuery();
+    proxy.download('/commercial/export',data,`商户管理_${new Date().getTime()}.xlsx`)
+  }
   const clickHandle = n => {
     if(n == 'onAdd'){
       config.value.modal.tool.tools.add = true;

+ 25 - 3
src/views/base/orderManage/index.vue

@@ -21,7 +21,7 @@ const config = ref({
       [{
         span:8,
         // label:'设备名称',
-        labelWidth:16,
+        labelWidth:1,
         prop:'text',
         component:'by-input',
         compConfig:{ 
@@ -50,11 +50,20 @@ const config = ref({
   },
   tool:{
     tools:{
-      export:true,
+      // export:true,
       // add:true,
       search:true,
       refresh:true
-    }
+    },
+    customTools:[{
+      name: '导出', 
+      icon: 'bottom',
+      event:{
+        click:() =>{
+          loadDown()
+        }
+      }
+    }]
   },
   table:{
     attr:{
@@ -109,6 +118,19 @@ const load = ref(false)
 const isSearch = ref(false)
 const timeNum = ref(0);
 
+//导出
+const loadDown = () => {
+    let data = proxy.$refs.view.getQuery();
+    data.pageNum = data.pageNo;
+    delete data.pageNo;
+    if(data.time && data.time.length > 0) {
+      data.startTime = data.time[0]
+      data.endTime = data.time[1]
+    }
+    delete data.time;
+    proxy.downloadBy('/order/export',data,`订单管理_${new Date().getTime()}.xlsx`)
+  }
+
 const pagination = () => {
   if(isSearch.value){
     queryList();

+ 25 - 3
src/views/base/productManage/index.vue

@@ -22,7 +22,7 @@
         [{
           span:8,
           // label:'设备名称',
-          labelWidth:16,
+          labelWidth:1,
           prop:'text',
           component:'by-input',
           compConfig:{ 
@@ -51,11 +51,20 @@
     },
     tool:{
       tools:{
-        export:true,
+        // export:true,
         // add:true,
         search:true,
         refresh:true
-      }
+      },
+      customTools:[{
+        name: '导出', 
+        icon: 'bottom',
+        event:{
+          click:() =>{
+            loadDown()
+          }
+        }
+      }]
     },
     table:{
       attr:{
@@ -99,6 +108,19 @@
   const isSearch = ref(false)
   const timeNum = ref(0);
 
+  //导出
+  const loadDown = () => {
+    let data = proxy.$refs.view.getQuery();
+    data.pageNum = data.pageNo;
+    delete data.pageNo;
+    if(data.time && data.time.length > 0) {
+      data.startTime = data.time[0]
+      data.endTime = data.time[1]
+    }
+    delete data.time;
+    proxy.downloadBy('/goods/export',data,`商品管理_${new Date().getTime()}.xlsx`)
+  }
+
   const pagination = () => {
     if(isSearch.value){
       queryList();

+ 20 - 3
src/views/base/shopManage/components/appletView.vue

@@ -58,12 +58,12 @@
         [{
           span:8,
           // label:'设备名称',
-          labelWidth:16,
+          labelWidth:1,
           prop:'searchText',
           component:'by-input',
           compConfig:{ 
             attr:{
-              placeholder:'请输入小程序名称',
+              placeholder:'请输入小程序名称、应用ID、所属商户',
               prefixIcon:'vxe-icon-search'
             }
           }
@@ -72,12 +72,20 @@
     },
     tool:{
       tools:{
-        export:true,
+        // export:true,
         add:true,
         search:true,
         refresh:true
       },
       customTools:[{
+        name: '导出', 
+        icon: 'bottom',
+        event:{
+          click:() =>{
+            loadDown()
+          }
+        }
+      }, {
         name: '操作日志', 
         icon: 'Notebook',
         event:{
@@ -293,6 +301,15 @@
 
     })
   }
+
+  //导出
+  const loadDown = () => {
+    let data = proxy.$refs.view.getQuery();
+    data.pageNum = data.pageNo;
+    delete data.pageNo;
+    proxy.download('/app/export',data,`小程序_${new Date().getTime()}.xlsx`)
+  }
+
   const handleCurrentChange = v => {
     logPage.value.pageNo = v;
     initLog()

+ 19 - 2
src/views/base/shopManage/components/offlineShop.vue

@@ -41,12 +41,21 @@
     },
     tool:{
       tools:{
-        export:true,
+        // export:true,
         add:true,
         delete:true,
         search:true,
         refresh:true
-      }
+      },
+      customTools:[{
+        name: '导出', 
+        icon: 'bottom',
+        event:{
+          click:() =>{
+            loadDown()
+          }
+        }
+      }]
     },
     table:{
       attr:{
@@ -191,6 +200,14 @@
   const isSearch = ref(false)
   const timeNum = ref(0);
 
+  //导出
+  const loadDown = () => {
+    let data = proxy.$refs.view.getQuery();
+    data.pageNum = data.pageNo;
+    delete data.pageNo;
+    proxy.download('/store/export',data,`线下店铺_${new Date().getTime()}.xlsx`)
+  }
+
   //店铺新增设备
   const addEquipHandle = row => {
     proxy.$refs.noAddEquipView.setShow(true);

+ 25 - 7
src/views/base/userManage/index.vue

@@ -52,10 +52,19 @@
     },
     tool:{
       tools:{
-        export:true,
+        // export:true,
         search:true,
         refresh:true
-      }
+      },
+      customTools:[{
+        name: '导出', 
+        icon: 'bottom',
+        event:{
+          click:() =>{
+            loadDown()
+          }
+        }
+      }]
     },
     table:{
       attr:{
@@ -103,6 +112,15 @@
   const isSearch = ref(false)
   const timeNum = ref(0);
 
+  //导出
+  const loadDown = () => {
+    let data = proxy.$refs.view.getQuery();
+    data.pageNum = data.pageNo;
+    delete data.pageNo;
+
+    proxy.downloadBy('/dluser/export',data,`用户管理_${new Date().getTime()}.xlsx`)
+  }
+
   const pagination = () => {
     if(isSearch.value){
       queryList();
@@ -136,11 +154,11 @@
     load.value = true;
     data.pageNum = data.pageNo;
     delete data.pageNo;
-    if(data.time && data.time.length > 0) {
-      data.startTime = data.time[0]
-      data.endTime = data.time[1]
-    }
-    delete data.time;
+    // if(data.time && data.time.length > 0) {
+    //   data.startTime = data.time[0]
+    //   data.endTime = data.time[1]
+    // }
+    // delete data.time;
     list(data).then(res => {
       load.value = false;
       proxy.$refs.view.setTableValue(res.data.records);

+ 4 - 1
src/views/monitor/operlog/index.vue

@@ -223,7 +223,10 @@ const { queryParams, form } = toRefs(data);
 /** 查询登录日志 */
 function getList() {
   loading.value = true;
-  list(proxy.addDateRange(queryParams.value, dateRange.value)).then(response => {
+  let params=queryParams.value?queryParams.value:{};
+  params.beginTime = dateRange.value[0];
+  params.endTime = dateRange.value[1];
+  list(proxy.addDateRange(queryParams.value)).then(response => {
     operlogList.value = response.rows;
     total.value = response.total;
     loading.value = false;

+ 19 - 6
src/views/system/user/index.vue

@@ -203,8 +203,8 @@
             </el-row>
             <el-row>
                <el-col :span="12">
-                  <el-form-item label="手机号码" prop="phonenumber">
-                     <el-input v-model="form.phonenumber" placeholder="请输入手机号码" maxlength="11" />
+                  <el-form-item label="手机号码" prop="phonenumber" :rules="form.userId && userStore.userId !== 1?[]:phonenumberRules">
+                     <el-input v-model="form.phonenumber" placeholder="请输入手机号码" maxlength="11" :readonly="form.userId && userStore.userId !== 1" />
                   </el-form-item>
                </el-col>
                <el-col :span="12">
@@ -333,11 +333,15 @@
 <script setup name="User">
 import { getToken } from "@/utils/auth";
 import { changeUserStatus, listUser, resetUserPwd, delUser, getUser, updateUser, addUser, deptTreeSelect } from "@/api/system/user";
+import useUserStore from '@/store/modules/user'
+import { onMounted } from "vue";
 
 const router = useRouter();
 const { proxy } = getCurrentInstance();
 const { sys_normal_disable, sys_user_sex } = proxy.useDict("sys_normal_disable", "sys_user_sex");
 
+const userStore = useUserStore().userInfo;
+
 const userList = ref([]);
 const open = ref(false);
 const loading = ref(true);
@@ -389,16 +393,16 @@ const data = reactive({
     status: undefined,
     deptId: undefined
   },
+  phonenumberRules: [{ pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "请输入正确的手机号码", trigger: "blur" }],
   rules: {
     userName: [{ required: true, message: "用户名称不能为空", trigger: "blur" }, { min: 2, max: 20, message: "用户名称长度必须介于 2 和 20 之间", trigger: "blur" }],
     nickName: [{ required: true, message: "用户昵称不能为空", trigger: "blur" }],
     password: [{ required: true, message: "用户密码不能为空", trigger: "blur" }, { min: 5, max: 20, message: "用户密码长度必须介于 5 和 20 之间", trigger: "blur" }],
-    email: [{ type: "email", message: "请输入正确的邮箱地址", trigger: ["blur", "change"] }],
-    phonenumber: [{ pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "请输入正确的手机号码", trigger: "blur" }]
+    email: [{ type: "email", message: "请输入正确的邮箱地址", trigger: ["blur", "change"] }]
   }
 });
 
-const { queryParams, form, rules } = toRefs(data);
+const { queryParams, form, rules, phonenumberRules } = toRefs(data);
 
 /** 通过条件过滤节点  */
 const filterNode = (value, data) => {
@@ -587,7 +591,16 @@ function submitForm() {
   proxy.$refs["userRef"].validate(valid => {
     if (valid) {
       if (form.value.userId != undefined) {
-        updateUser(form.value).then(response => {
+         let data = {}
+         for(const key in form.value){
+            if(key != 'phonenumber'){
+               data[key] = form.value[key]
+            }
+         }
+         if(!(form.userId && userStore.userId !== 1)){
+            data.phonenumber = form.value.phonenumber
+         }
+        updateUser(data).then(response => {
           proxy.$modal.msgSuccess("修改成功");
           open.value = false;
           getList();

+ 2 - 2
src/views/system/user/profile/index.vue

@@ -9,9 +9,9 @@
                  </div>
                </template>
                <div>
-                  <div class="text-center">
+                  <!-- <div class="text-center">
                      <userAvatar :user="state.user" />
-                  </div>
+                  </div> -->
                   <ul class="list-group list-group-striped">
                      <li class="list-group-item">
                         <svg-icon icon-class="user" />用户名称

+ 2 - 1
vite.config.js

@@ -35,7 +35,8 @@ export default defineConfig(({ mode, command }) => {
         //   rewrite: (p) => p.replace(/^\/dev-api/, '')
         // },
         '/szzs': {
-          target: 'http://192.168.2.39:80/',
+          // target: 'http://192.168.2.39:80/',
+          target:'https://digit.lzlxylsf.com/',
           changeOrigin: true,
           // rewrite: (p) => p.replace(/^\/szzs/, '')
         }