baijunde 9 ヶ月 前
コミット
980d252dad

+ 4 - 1
.env.development

@@ -5,7 +5,10 @@ VUE_APP_TITLE = 夜来香后台管理系统
 ENV = 'development'
 
 # 若依管理系统/开发环境
-VUE_APP_BASE_API = 'https://test.baoxianzhanggui.com/nightFragrance'
+# VUE_APP_BASE_API = 'https://test.baoxianzhanggui.com/nightFragrance'
+VUE_APP_BASE_API = 'https://city.baoxianzhanggui.com/nightFragrance'
+# VUE_APP_BASE_API = 'http://192.168.0.36:8087'
+
 
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 1 - 0
.env.production

@@ -7,3 +7,4 @@ ENV = 'production'
 # 若依管理系统/生产环境
 # VUE_APP_BASE_API = '/prod-api'
 VUE_APP_BASE_API = 'https://test.baoxianzhanggui.com/nightFragrance'
+VUE_APP_BASE_API = 'https://city.baoxianzhanggui.com/nightFragrance'

+ 2 - 1
.env.staging

@@ -8,4 +8,5 @@ ENV = 'staging'
 
 # 若依管理系统/测试环境
 # VUE_APP_BASE_API = '/stage-api'
-VUE_APP_BASE_API = 'https://test.baoxianzhanggui.com/nightFragrance'
+# VUE_APP_BASE_API = 'https://test.baoxianzhanggui.com/nightFragrance'
+VUE_APP_BASE_API = 'https://city.baoxianzhanggui.com/nightFragrance'

+ 9 - 0
src/api/public.js

@@ -6,4 +6,13 @@ export function upload(data) {
       method: 'post',
       data: data
     })
+}
+
+//上传视频
+export function uploadvideo(data) {
+    return request({
+      url: '/common/uploadVi',
+      method: 'post',
+      data: data
+    })
 }

+ 21 - 2
src/api/system/js.js

@@ -21,7 +21,7 @@ export function getJs(cOpenId) {
 // 新增技师
 export function addJs(data) {
   return request({
-    url: '/api/js/v1/wx/add',
+    url: '/api/js/v1/pc/add',
     method: 'post',
     data: data
   })
@@ -113,4 +113,23 @@ export function getJsData(query) {
     method: 'get',
     params:query
   })
-}
+}
+
+// 技师二维码
+export function getJscode(query) {
+  return request({
+    url: '/weChat/getJSwxQrCodeDh',
+    method: 'get',
+    params:query
+  })
+}
+
+
+// 技师解绑
+export function unbind(query) {
+  return request({
+    url: '/api/js/v1/pc/unbind',
+    method: 'get',
+    params:query
+  })
+}

+ 36 - 1
src/views/index.vue

@@ -86,6 +86,40 @@
           }}
         </div>
       </div>
+      <div class="contrast_data">
+        <div class="top">昨日浏览量</div>
+        <div class="center">
+          {{ upOrderNum.pageViews}}
+        </div>
+        <!-- <div class="bnottom">{{ jsNum }}%,同上月对比</div> -->
+        <div class="bnottom">
+          <!-- {{ getAmount.slice(0,6)}}%,同上月对比 -->
+          <!-- {{
+            typeof jsNum === "string" && jsNum.length > 0
+              ? jsNum.slice(0, 6) +
+                (jsNum.length > 6 ? "" : "") +
+                "%,同上月对比"
+              : "数据无效"
+          }} -->
+        </div>
+      </div>
+      <div class="contrast_data">
+        <div class="top">昨日关注数</div>
+        <div class="center">
+          {{ upOrderNum.followers }}
+        </div>
+        <!-- <div class="bnottom">{{ jsNum }}%,同上月对比</div> -->
+        <div class="bnottom">
+          <!-- {{ getAmount.slice(0,6)}}%,同上月对比 -->
+          <!-- {{
+            typeof jsNum === "string" && jsNum.length > 0
+              ? jsNum.slice(0, 6) +
+                (jsNum.length > 6 ? "" : "") +
+                "%,同上月对比"
+              : "数据无效"
+          }} -->
+        </div>
+      </div>
     </div>
     <div class="chart">
       <div class="left">
@@ -244,6 +278,7 @@ export default {
       data.deptId = deptId;
       block(data).then((res) => {
         this.upOrderNum = res;
+        console.log(res);
         this.Turnover = this.computed(res.turnover, res.upTurnover);
 
         this.order = this.computed(res.orderNum, res.upOrderNum);
@@ -325,7 +360,7 @@ export default {
     display: flex;
     justify-content: space-between;
     .contrast_data {
-      width: 18%;
+      width: 13%;
       height: 150px;
       background: linear-gradient(to right, #338aef, #3498f2);
       padding: 10px;

+ 2 - 2
src/views/order/index.vue

@@ -530,10 +530,10 @@ export default {
         });
       });
     },
-    /** 导出按钮操作 */
+    /** 导出按钮操作VUE_APP_BASE_API = 'https://city.baoxianzhanggui.com/nightFragrance' */
     handleExport() {
       this.download(
-        "https://test.baoxianzhanggui.com/nightFragrance/api/order/v1/wx/export",
+        "https://city.baoxianzhanggui.com/nightFragrance/api/order/v1/wx/export",
         {
           ...this.queryParams,
         },

+ 80 - 6
src/views/technician/details/details.vue

@@ -58,6 +58,23 @@
           </div>
         </div>
       </el-form-item>
+      <el-form-item label="视频:">
+        <el-upload
+          class="video-uploader"
+          action="#"
+          :http-request="handleVideoUpload"
+          :before-upload="beforeVideoUpload"
+          :show-file-list="false"
+          accept="video/*"
+        >
+           <template v-if="!jsInfos.cVideo">
+        <i class="el-icon-plus video-uploader-icon"></i>
+        <div class="el-upload__text">点击上传视频,或拖拽视频到此处</div>
+        <div class="el-upload__tip">支持MP4、AVI等格式,大小不超过100MB</div>
+      </template>
+      <video v-else :src="jsInfos.cVideo" controls class="video-preview" style="width: 300px;height: 200px;"></video>
+        </el-upload>
+      </el-form-item>
       <div class="title">详细信息</div>
       <el-form-item label="昵称:">
         <el-input v-model="jsInfos.cNickName"></el-input>
@@ -166,10 +183,12 @@
         </el-upload>
       </el-form-item>
 
-
       <el-form-item label="评分:">
         <el-input v-model="jsInfos.nStar"></el-input>
       </el-form-item>
+      <el-form-item label="点赞数:">
+        <el-input v-model="jsInfos.nZan"></el-input>
+      </el-form-item>
       <el-form-item label="佣金比例:">
         <el-input v-model="jsInfos.nBili"></el-input>
       </el-form-item>
@@ -209,11 +228,18 @@
       <el-form-item label="地址:">
         <el-input v-model="jsInfos.name"></el-input>
       </el-form-item>
+      <el-form-item label="是否推荐:" prop="nB1">
+        <el-radio-group v-model="jsInfos.nB1">
+          <el-radio :label="0">否</el-radio>
+          <el-radio :label="1">是</el-radio>
+        </el-radio-group>
+      </el-form-item>
       <Map
         :newAddress="newAddress"
         :dataObj="addr"
         @uploadAddress="uploadAddressData"
       />
+
       <!-- <el-form-item label="是否带头像框:" prop="nB1">
         <el-radio-group v-model="jsInfos.nB1">
           <el-radio :label="0">否</el-radio>
@@ -286,8 +312,8 @@
           <el-date-picker
             v-model="complainForm.dTime"
             type="datetime"
-             placeholder="选择日期时间"
-              :picker-options="pickerOptions"
+            placeholder="选择日期时间"
+            :picker-options="pickerOptions"
           >
           </el-date-picker>
         </el-form-item>
@@ -315,7 +341,7 @@ import {
   block,
   getDept,
 } from "@/api/system/js";
-import { upload } from "@/api/public";
+import { upload,uploadvideo } from "@/api/public";
 import Map from "@/components/map/map.vue";
 export default {
   components: {
@@ -325,14 +351,14 @@ export default {
     return {
       pickerOptions: {
         disabledDate(time) {
-          return time.getTime() > Date.now()
+          return time.getTime() > Date.now();
         },
       },
       options: [],
       value: "",
       dialogFormVisible: false,
       jsInfos: {},
-      dz:"",
+      dz: "",
       uploadInfos: {
         cSfzImg: [],
         cImgList: [],
@@ -348,6 +374,7 @@ export default {
       show: false,
       addr: {},
       newAddress: "太原",
+      cVideo:''
     };
   },
   mounted() {
@@ -357,6 +384,50 @@ export default {
     this.getDept();
   },
   methods: {
+    beforeVideoUpload(file) {
+      const isVideo = file.type.includes("video/");
+      const isLtSize = file.size / 1024 / 1024 < 100; // 假设限制100MB
+
+      if (!isVideo) {
+        this.$message.error("只能上传视频文件!");
+      }
+      if (!isLtSize) {
+        this.$message.error("视频大小不能超过100MB!");
+      }
+
+      return isVideo && isLtSize;
+    },
+
+    handleVideoUpload(options) {
+      const { file } = options;
+      // 这里处理视频上传逻辑,可以使用axios或其他方法
+      console.log("上传视频:", file);
+
+      // 示例:模拟上传
+      const formData = new FormData();
+      formData.append("video", file);
+      uploadvideo(formData).then((response) => {
+        console.log(response);
+        this.jsInfos.cVideo =process.env.VUE_APP_BASE_API +response.fileName;
+        console.log(this.cVideo);
+        
+        // this.uploadInfos.cImgList.push(response.fileName);
+        // this.jsInfos.cImgList.push(
+        //   process.env.VUE_APP_BASE_API + response.fileName
+        // );
+
+        // this.updataImg22.push(response.fileName);
+      });
+
+      // axios.post('/api/upload/video', formData, {
+      //   onUploadProgress: progressEvent => {
+      //     const percent = Math.round((progressEvent.loaded * 100) / progressEvent.total);
+      //     // 可以在这里更新进度条
+      //   }
+      // }).then(response => {
+      //   // 上传成功处理
+      // })
+    },
     uploadAddressData(payload) {
       this.jsInfos.latitude = payload.latitude;
       this.jsInfos.longitude = payload.longitude;
@@ -622,6 +693,7 @@ export default {
         this.jsInfos.cImgList.push(
           process.env.VUE_APP_BASE_API + response.fileName
         );
+
         // this.updataImg22.push(response.fileName);
       });
     },
@@ -721,11 +793,13 @@ export default {
             message: "提交成功",
             type: "success",
           });
+          this.$router.go(-1);
         } else {
           this.$message({
             message: res.msg,
             type: "success",
           });
+          this.$router.go(-1);
         }
       });
     },

+ 89 - 57
src/views/technician/technician/index.vue

@@ -47,7 +47,7 @@
           v-model="queryParams.nStatus"
           placeholder="请选择"
           style="width: 100px"
-          clearable 
+          clearable
         >
           <el-option
             v-for="item in serviceState"
@@ -63,7 +63,7 @@
           v-model="queryParams.nSex"
           placeholder="请选择"
           style="width: 100px"
-          clearable 
+          clearable
         >
           <el-option
             v-for="item in sex"
@@ -88,17 +88,18 @@
       </el-form-item>
     </el-form>
     <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['system:comment:add']"
+          >新增</el-button
+        >
+      </el-col>
       <!-- <el-col :span="1.5">
-          <el-button
-            type="primary"
-            plain
-            icon="el-icon-plus"
-            size="mini"
-            @click="handleAdd"
-            v-hasPermi="['system:comment:add']"
-          >新增</el-button>
-        </el-col>
-        <el-col :span="1.5">
           <el-button
             type="success"
             plain
@@ -179,7 +180,11 @@
       <el-table-column label="头像" align="center">
         <template slot-scope="scope">
           <div style="width: 100%">
-            <img :src="scope.row.cPortrait" style="width: 100%;height: 100px;" alt="" />
+            <img
+              :src="scope.row.cPortrait"
+              style="width: 100%; height: 100px"
+              alt=""
+            />
           </div>
         </template>
       </el-table-column>
@@ -240,6 +245,13 @@
             @click="handleDetail(scope.row)"
             >详情</el-button
           >
+          <el-button size="mini" type="text" @click="unbindJs(scope.row)" v-if="scope.row.cOpenId"
+            >解绑</el-button
+          >
+          <el-button size="mini" type="text" @click="bindWchart(scope.row)" v-else
+            >绑定微信</el-button
+          >
+         
           <!-- <el-button
               size="mini"
               type="text"
@@ -280,7 +292,6 @@
           <el-input v-model="form.cNickName" placeholder="请输入昵称" />
         </el-form-item>
         <el-form-item label="头像" prop="cPortrait">
-          <!-- <el-input v-model="form.cPortrait" type="textarea" placeholder="请输入内容" /> -->
           <el-upload
             action="#"
             class="avatar-uploader"
@@ -288,7 +299,11 @@
             :before-upload="beforeAvatarUpload"
             :show-file-list="false"
           >
-            <img v-if="form.cPortrait" :src="form.cPortrait" class="avatar" />
+            <img
+              v-if="form.cPortrait !== ''"
+              :src="baseUrl + form.cPortrait"
+              class="avatar"
+            />
             <i v-else class="el-icon-plus avatar-uploader-icon"></i>
           </el-upload>
         </el-form-item>
@@ -343,10 +358,6 @@
             </div>
           </div>
         </el-form-item>
-
-        <!-- <el-form-item label="地址" prop="cAddress">
-            <el-input v-model="form.cAddress" type="textarea" placeholder="请输入内容" />
-          </el-form-item> -->
         <el-form-item label="个人简介" prop="cJianjie">
           <el-input
             v-model="form.cJianjie"
@@ -363,25 +374,6 @@
         <el-form-item label="已服务数量" prop="nNum">
           <el-input v-model="form.nNum" placeholder="请输入已服务数量" />
         </el-form-item>
-        <!-- <el-form-item label="添加评论" prop="nNum">
-            <el-input v-model="form.nNum" placeholder="请输入评论" />
-          </el-form-item> -->
-
-        <!-- <el-form-item label="上岗状态" prop="nStatus2" >
-            <el-radio-group v-model="form.nStatus2">
-              <el-radio :label="-1">未上岗</el-radio>
-              <el-radio :label="0">已上岗</el-radio>
-            </el-radio-group>
-          </el-form-item> -->
-        <!-- <el-form-item label="审核状态" prop="nTong">
-            <el-radio-group v-model="form.nTong">
-              <el-radio :label="0">未通过</el-radio>
-              <el-radio :label="1">已通过</el-radio>
-            </el-radio-group>
-          </el-form-item> -->
-        <!-- <el-form-item label="注册时间" prop="cTime">
-            <el-input v-model="form.cTime" placeholder="请输入注册时间" />
-          </el-form-item> -->
         <el-form-item label="是否带头像框" prop="nB1">
           <el-radio-group v-model="form.nB1">
             <el-radio :label="0">否</el-radio>
@@ -400,19 +392,7 @@
             <el-radio :label="1">是</el-radio>
           </el-radio-group>
         </el-form-item>
-        <!-- <el-form-item label="创建时间" prop="dtCreateTime">
-            <el-date-picker clearable
-              v-model="form.dtCreateTime"
-              type="date"
-              value-format="yyyy-MM-dd"
-              placeholder="请选择创建时间">
-            </el-date-picker>
-          </el-form-item> -->
       </el-form>
-      <div slot="footer" style="text-align: justify; margin-bottom: 20px">
-        <el-button type="primary" @click="submitForm">上 岗</el-button>
-        <el-button @click="cancel">下 岗</el-button>
-      </div>
       <div slot="footer" class="dialog-footer">
         <el-button type="primary" @click="submitForm">确 定</el-button>
         <el-button @click="cancel">取 消</el-button>
@@ -436,7 +416,6 @@
         >
       </span>
     </el-dialog>
-    <!-- 查看技师详情 -->
     <el-drawer
       title="技师详情"
       :visible.sync="drawer"
@@ -538,6 +517,12 @@
         <el-button type="primary" @click="returnJs(jsInfos.id)">退回</el-button>
       </div>
     </el-drawer>
+    <!-- 绑定微信 -->
+    <el-dialog :visible.sync="isBindWchart" style="height: 500px;">
+      <div style="width: 200px; height: 200px; margin: 0 auto">
+        <img :src="codeUrl" style="width: 200px; height: 200px;" alt="" />
+      </div>
+    </el-dialog>
   </div>
 </template>
   
@@ -550,13 +535,17 @@ import {
   updateJs,
   auditJs,
   repulseJs,
+  getJscode,
+  unbind
 } from "@/api/system/js";
 import { upload } from "@/api/public";
 import Details from "../details/details.vue";
+import axios from "axios";
 export default {
   name: "Js",
   data() {
     return {
+      baseUrl: process.env.VUE_APP_BASE_API,
       isDisabled: false,
       auditShow: false,
       drawer: false,
@@ -612,7 +601,7 @@ export default {
       rules: {},
       imgsList: [],
       imagesUrl: "",
-      imgList: [],
+      // imgList: [],
       updataImg1: [],
       updataImg11: [],
       imgList2: [],
@@ -634,12 +623,37 @@ export default {
       ],
       jsInfos: "",
       ifTong: 0,
+      isBindWchart: false,
+      codeUrl: "",
     };
   },
   created() {
     this.getList();
   },
   methods: {
+    //扫码绑定技师
+    bindWchart(row) {
+      let loticket = encodeURIComponent(row.ticket);
+      this.isBindWchart = true;
+      let data = {
+        ticket: loticket,
+        id:row.id
+      }
+      getJscode(data).then(res => {
+        console.log(res);
+        this.codeUrl = this.baseUrl + res
+      } )
+    },
+    //解绑技师
+    unbindJs(row){
+      let data = {
+        id:row.id
+      }
+      unbind(data).then(res => {
+        this.$modal.msgSuccess("解绑成功");
+        this.getList();
+      })
+    },
     /** 导出按钮操作 */
     handleExport() {
       this.download(
@@ -754,7 +768,7 @@ export default {
       const formData = new FormData();
       formData.append("file", file.file);
       upload(formData).then((response) => {
-        this.imgList.push(response.fileName);
+        // this.imgList.push(response.fileName);
         this.updataImg1.push(process.env.VUE_APP_BASE_API + response.fileName);
         this.updataImg11.push(response.fileName);
       });
@@ -796,8 +810,12 @@ export default {
       const formData = new FormData();
       formData.append("file", file.file);
       upload(formData).then((response) => {
+        // console.log(response);
+
+        this.form.cPortrait = response.fileName;
         this.queryParams.cPortrait = response.fileName;
-        this.form.cPortrait = process.env.VUE_APP_BASE_API + response.fileName;
+        // this.form.cPortrait = process.env.VUE_APP_BASE_API + response.fileName;
+        console.log(this.form.cPortrait);
       });
     },
     beforeAvatarUpload(file) {
@@ -847,7 +865,7 @@ export default {
     },
     // 取消按钮
     cancel() {
-      this.imgList = [];
+      // this.imgList = [];
       this.open = false;
       this.reset();
     },
@@ -887,7 +905,7 @@ export default {
     /** 重置按钮操作 */
     resetQuery() {
       this.resetForm("queryForm");
-      this.queryParams.cPhone = ''
+      this.queryParams.cPhone = "";
       // this.reset()
       this.handleQuery();
     },
@@ -960,14 +978,20 @@ export default {
             updateJs(this.form).then((response) => {
               this.$modal.msgSuccess("修改成功");
               this.open = false;
-              this.imgList = [];
+              // this.imgList = [];
               this.imgList2 = [];
               this.getList();
             });
           } else {
+            this.form.cPortrait = this.queryParams.cPortrait;
+            this.form.cImgList = this.updataImg11;
+            this.form.cSfzImg = this.updataImg22;
             addJs(this.form).then((response) => {
               this.$modal.msgSuccess("新增成功");
               this.open = false;
+              this.form = {};
+              this.updataImg11 = [];
+              this.updataImg22 = [];
               this.getList();
             });
           }
@@ -1127,4 +1151,12 @@ export default {
   justify-content: center;
   height: 300px;
 }
+::v-deep .el-dialog{
+  width: 300px;
+  height: auto !important;
+  // margin-top: 500px ;
+}
+::v-deep .el-dialog:not(.is-fullscreen){
+  margin-top: 20vh !important;
+}
 </style>