yinxiangke 4 тижнів тому
батько
коміт
8a7bc617ee

+ 2 - 1
.env.development

@@ -1,5 +1,6 @@
 # 乔功
-VITE_API_BASE_URL=http://192.168.100.134:8080/api
+# VITE_API_BASE_URL=http://192.168.100.134:8080/api
+# VITE_API_BASE_URL=http://192.168.101.12:8080/api
 # 高运甲
 # VITE_API_BASE_URL=http://192.168.100.89:8080/api
 # VITE_API_BASE_URL=http://192.168.101.12:8080/api

+ 42 - 1
src/api/my.js

@@ -98,6 +98,12 @@ export function deptList(data = {}) {
 export function applyDept(data = {}) {
   return request.post('/dept',data)
 }
+
+// 修改部门
+export function uploadDept(data = {}) {
+  return request.put('/dept',data)
+}
+
 // 删除部门
 export function deleteDept(data = {}) {
   return request.del(`/dept/${data}`)
@@ -134,4 +140,39 @@ export function employeeList(data = {}) {
 // 根据手机号查询员工
 export function selectUserByPhone(data = {}) {
   return request.get('/auth/user/selectUserByPhone',data)
-}
+}
+
+// 新增工单
+export function issue(data = {}) {
+  return request.post('/issue',data)
+}
+// 查询我的工单列b
+export function issueList(data = {}) {
+  return request.get('/issue/list',data)
+}
+
+
+// 删除工单
+export function deleteIssue(data = {}) {
+  return request.del(`/issue/${data}`)
+}
+
+// 查询问题列表
+export function faqList(data = {}) {
+  return request.get('/faq/list',data)
+}
+// 获取详情
+export function getfaq(data = {}) {
+  return request.del(`/faq/${data}`)
+}
+
+// 提现
+export function applyWithdraw(data = {}) {
+  return request.post('/withdraw/apply',data)
+}
+
+// 提现列b
+
+export function withdrawList(data = {}) {
+  return request.get('/withdraw/list',data)
+}

+ 34 - 2
src/locales/en.js

@@ -114,6 +114,7 @@ export default {
     warning:"Warning",
     bankTransferSuccess:"Bank Transfer Success, please wait for the administrator to confirm",
     submitSuccess:"Submit Success",
+    qingxuanze:"Please Select",
   },
   login: {
     smsLogin: 'Captcha Login',
@@ -227,6 +228,7 @@ export default {
     myWorkflow: 'My Workflow',
     incomeDetails: 'Income Details',
     usageRecord: 'Usage Record',
+    withdrawHistory: 'Withdraw History',
     openMembershipDetails: 'Open Membership Details',
     publishDemandRecord: 'Publish Demand Record',
     myDemandRecord: 'My Demand Record',
@@ -237,6 +239,7 @@ export default {
     daifukuan: 'Pending Payment',
     yiwancheng: 'Completed',
     yiquxiao: 'Cancelled',
+    shenhewtg: 'Review not approved',
     dingdanhao: 'Order Number',
     goumaishichang: 'Purchase Duration',
     youxiaoqi: 'Validity Period',
@@ -251,9 +254,38 @@ export default {
     orderNumber: 'Order Number',
     details: ' Details',
     vipEndTime: 'VIP End Time',
-    businessManagement:'Enterprise information management',
+    businessManagement:'Enterprise Management',
     serviceManagement:'Customer Service Management',
     jieshuxuqiu: 'Should this requirement be closed',
-    shifoushanchu:'Delete?'
+    shifoushanchu:'Delete?',
+    gongdan:'Work Order',
+    tijiaogongdan:'Submit Work Order',
+    lishigongdan:'Historical Work Orders',
+    changjianwenti:'Common Questions',
+    gongdanleixing:'Work Order Type',
+    gongdanbiaoti:'Work Order Title',
+    gongdanneirong:'Work Order Content',
+    zhanghaowenti:'Account Questions',
+    zhifuwenti:'Payment Questions',
+    kechengwenti:'Course Questions',
+    gongzuoliuwenti:'Workflow Questions',
+    qitawenti:'Other Questions',
+    fenpei:'Assign',
+    fenpeichenggong:'Assigned Successfully',
+    wodeyuangong:'My Staff',
+    qsryssdygsjh:`Please enter the employee's phone number for search`,
+    bumenguanli:'Organization Management',
+    tianjiayuangong:'Add Staff',
+    yuangong:'Staff',
+    bumen:'Department',
+    qxzbm:'Please Select The Department',
+    qxzyg:'Please Select The Staff',
+    tianjiabumen:'Add Department',
+    bianjibumen:'Edit Department',
+    qsrbmmc:'Please Enter The Department Name',
+    mbsl:'MiBi Quantity',
+    fenpeimibi:'Assign MiBi',
+    qsryfpdmbsl:'Please Enter The Employee\'s MiBi Quantity',
+    lookVoucher:'View Voucher',
   }
 }

+ 32 - 1
src/locales/zh-CN.js

@@ -120,6 +120,7 @@ export default {
     warning: "警告",
     bankTransferSuccess:"凭证已上传成功,等待客服确认",
     submitSuccess:"提交成功",
+    qingxuanze:'请选择',
   },
   login: {
     smsLogin: '验证码登录',
@@ -231,6 +232,7 @@ export default {
     myWorkflow: '我的工作流',
     incomeDetails: '收益明细',
     usageRecord: '使用记录',
+    withdrawHistory: '提现记录',
     openMembershipDetails: '开通会员明细',
     publishDemandRecord: '发布需求记录',
     myDemandRecord: '我的报名记录',
@@ -241,6 +243,7 @@ export default {
     daifukuan: '待付款',
     yiwancheng: '已完成',
     yiquxiao: '已取消',
+    shenhewtg: '审核未通过',
     dingdanhao: '订单号',
     goumaishichang: '购买时长',
     youxiaoqi: '有效期',
@@ -259,7 +262,35 @@ export default {
     serviceManagement:'客服管理',
     jieshuxuqiu:'是否结束该需求',
     shifoushanchu:'是否删除?',
-    
+    gongdan:'工单',
+    tijiaogongdan:'提交工单',
+    lishigongdan:'历史工单',
+    changjianwenti:'常见问题',
+    gongdanleixing:'工单类型',
+    gongdanbiaoti:'工单标题',
+    gongdanneirong:'工单内容',
+    zhanghaowenti:'账号问题',
+    zhifuwenti:'支付问题',
+    kechengwenti:'课程问题',
+    gongzuoliuwenti:'工作流问题',
+    qitawenti:'其它问题',
+    fenpei:'分配',
+    fenpeichenggong:'分配成功',
+    wodeyuangong:'我的员工',
+    qsryssdygsjh: '请输入要搜索的员工手机号',
+    bumenguanli:'部门管理',
+    tianjiayuangong:'添加员工',
+    yuangong:'员工',
+    bumen:'部门',
+    qxzbm:'请选择部门',
+    qxzyg:'请选择员工',
+    tianjiabumen:'添加部门',
+    bianjibumen:'编辑部门',
+    qsrbmmc:'请输入部门名称',
+    mbsl:'米币数量',
+    fenpeimibi:'分配米币',
+    qsryfpdmbsl:'请输入要分配的米币数量',
+    lookVoucher:'查看凭证'
   }
 
 }

+ 4 - 3
src/pages/Member.vue

@@ -80,10 +80,11 @@ onMounted(() => {
 })
 
 </script>
-<style>
-body {}
-</style>
 <style lang="scss">
+  ul,li {
+    margin: 0;
+    padding: 0;
+  }
 .member {
   max-width: 1246px;
   margin: 0 auto;

+ 135 - 71
src/pages/Personal/BusinessManagement.vue

@@ -2,10 +2,10 @@
   <div class="businessManagement">
     <div class="businessManagement-left">
       <div class="title flex-between">
-        <div class="title_f">部门管理</div>
-        <div class="title_btn flex-center">
+        <div class="title_f">{{ $t('personalCenter.bumenguanli') }}</div>
+        <div @click="changeDialogVisible('personalCenter.tianjiabumen')" class="title_btn flex-center">
           <img src="/src/assets/imgs/my/jia2@2x.png" alt="">
-          <div class="">新增</div>
+          <div class="">{{ $t('common.add') }}</div>
         </div>
       </div>
       <el-tree ref="treeRef2" :data="dataSource" node-key="deptId" default-expand-all :expand-on-click-node="false"
@@ -14,17 +14,11 @@
           <div class="custom-tree-node flex-center-between flex_1">
             <div class="">{{ node.label }}</div>
             <div @click.stop="" v-if="data.isBtn" class="flex-align-center custom-tree-node-right">
-              <el-input v-model="node.label" placeholder="请输入" @keydown="(e) => changeLabel(e, data,node)" />
+              <!-- <el-input v-model="node.label" placeholder="请输入" @keydown="(e) => changeLabel(e, data, node)" /> -->
               <img @click.stop="changeNode(data, index, 0)" src="/src/assets/imgs/my/jia2@2x.png" alt="">
 
               <img @click.stop="changeNode(data, index, 1)" src="/src/assets/imgs/my/bianji@2x.png" alt="">
               <img @click.stop="changeNode(data, index, 2)" src="/src/assets/imgs/my/shanchu@2x.png" alt="">
-              <!-- <el-button type="primary" link @click="append(data)">
-                Append
-              </el-button>
-              <el-button style="margin-left: 4px" type="danger" link @click="remove(node, data)">
-                Delete
-              </el-button> -->
             </div>
           </div>
         </template>
@@ -33,17 +27,18 @@
     <div class="businessManagement-right">
       <div class="title gap10">
         <div class="line_vertical"></div>
-        <div class="">我的员工</div>
+        <div class="">{{ $t('personalCenter.wodeyuangong') }}</div>
       </div>
       <div class="flex-center-between businessManagement-right-search">
         <div class="flex-align-center businessManagement-right-search-left">
           <img src="/src/assets/imgs/my/search@2x.png" alt="">
-          <input @input="changePhone" type="text" placeholder="请输入要搜索的员工手机号" maxlength="11" v-model="form.userPhone">
+          <input @input="changePhone" type="text" :placeholder="`${$t('personalCenter.qsryssdygsjh')}`" maxlength="11"
+            v-model="form.userPhone">
         </div>
         <div class="flex-align-center businessManagement-right-search-right">
-          <div class="flex-center gradient" @click="dialogVisible = true">
+          <div class="flex-center gradient" @click="changeDialogVisible('personalCenter.tianjiayuangong')">
             <img src="/src/assets/imgs/my/jia1@2x.png" alt="">
-            <span>添加</span>
+            <span>{{ $t('common.add') }}</span>
           </div>
         </div>
       </div>
@@ -53,17 +48,17 @@
             <el-avatar :size="52" :src="item.userAvatar" />
             <div class="list_left_con">
               <div class="">{{ item.nickName }}</div>
-              <div class="">米币:{{ item.points || 0 }}</div>
+              <div class="">{{ $t('common.mibi') }}:{{ item.points || 0 }}</div>
             </div>
           </div>
           <div class="list_right">
             <div @click="changeEmployee(item, index, 1)" class="">
               <img src="/src/assets/imgs/my/jifen@2x.png" alt="">
-              <span>分配</span>
+              <span>{{ $t('personalCenter.fenpei') }}</span>
             </div>
             <div @click="changeEmployee(item, index, 2)" class="">
               <img src="/src/assets/imgs/my/shanchu@2x.png" alt="">
-              <span>删除</span>
+              <span>{{ $t('common.delete') }}</span>
             </div>
           </div>
         </li>
@@ -75,28 +70,51 @@
       <el-empty v-else :description="$t('common.empty')" />
     </div>
 
-    <el-dialog v-model="dialogVisible" title="添加员工" width="600">
-      <el-form :model="formInline" :rules="rules" class="demo-form-inline" ref="ruleFormRef">
-        <el-row :gutter="0">
+    <el-dialog v-model="dialogVisible" :title="$t(`${title}`)" width="600">
+      <el-form :model="formInline" :rules="rules" label-width="110px" ref="ruleFormRef">
+        <template v-if="title == 'personalCenter.tianjiayuangong'">
+          <el-row :gutter="0">
+            <el-col :span="24">
+              <el-form-item :label="$t('personalCenter.bumen')" prop="deptId">
+                <el-tree-select v-model="formInline.deptId" :data="dataSource" :props="defaultProps"
+                  :placeholder="$t('common.qingxuanze')" />
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row :gutter="0">
+            <el-col :span="24">
+              <el-form-item :label="$t('personalCenter.yuangong')" prop="userPhone">
+                <el-select v-model="formInline.userPhone" filterable remote reserve-keyword
+                  :placeholder="$t('common.placeholderInput')" :remote-method="remoteMethod">
+                  <el-option v-for="item in options" :key="item.userPhone" :label="item.nickName"
+                    :value="item.userPhone" />
+                </el-select>
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </template>
+        <template v-else-if="title == 'personalCenter.fenpeimibi'">
+          <el-row :gutter="0">
+            <el-col :span="24">
+              <el-form-item :label="$t('common.mibi')">
+                <el-input v-model="formInline.number" :placeholder="$t('common.placeholderInput')" />
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row :gutter="0">
+            <el-col :span="24">
+              <el-form-item :label="$t('personalCenter.mbsl')" prop="points">
+                <el-input v-model="formInline.points" :placeholder="$t('common.placeholderInput')" />
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </template>
+        <el-row :gutter="0" v-else>
           <el-col :span="24">
-            <el-form-item label="部门" prop="deptId">
-              <el-tree-select v-model="formInline.deptId" :data="dataSource" :props="defaultProps" />
+            <el-form-item :label="$t('personalCenter.bumen')" prop="deptName">
+              <el-input v-model="formInline.deptName" :placeholder="$t('common.placeholderInput')" />
             </el-form-item>
           </el-col>
-
-        </el-row>
-        <el-row :gutter="0">
-          <el-col :span="24">
-            <el-form-item label="员工" prop="userPhone">
-              <!-- <el-input v-model="formInline.userPhone" placeholder="Approved by" clearable /> -->
-              <el-select v-model="formInline.userPhone" filterable remote reserve-keyword placeholder="请输入"
-                :remote-method="remoteMethod">
-                <el-option v-for="item in options" :key="item.userPhone" :label="item.nickName"
-                  :value="item.userPhone" />
-              </el-select>
-            </el-form-item>
-          </el-col>
-
         </el-row>
       </el-form>
 
@@ -104,10 +122,8 @@
 
       <template #footer>
         <div class="dialog-footer flex-center">
-          <el-button @click="dialogVisible = false">Cancel</el-button>
-          <el-button type="primary" @click="confirmSubAccount(ruleFormRef)">
-            Confirm
-          </el-button>
+          <el-button @click="dialogVisible = false">{{ $t('common.cancel') }}</el-button>
+          <el-button type="primary" @click="confirmSubAccount(ruleFormRef)">{{ $t('common.confirm') }}</el-button>
         </div>
       </template>
     </el-dialog>
@@ -118,10 +134,16 @@
 
 import { ref, onMounted } from 'vue';
 
-import { deptList, employeeList, applyDept, deleteDept, addSubAccount, deleteSubAccount, selectUserByPhone, allocatePoints, getAvailablePoints } from '@/api/my';
+import { deptList, employeeList, applyDept, deleteDept, addSubAccount, deleteSubAccount, selectUserByPhone, allocatePoints, getAvailablePoints, uploadDept } from '@/api/my';
+
+import DGTMessage from '@/utils/message'
 
 import Pagination from '@/components/Pagination.vue'
 
+import { useI18n } from 'vue-i18n'
+
+const { t } = useI18n()
+
 const list = ref([]);
 
 const dataSource = ref([])
@@ -139,33 +161,53 @@ const form = ref({
   userPhone: ''
 })
 
+const title = ref('personalCenter.tianjiayuangong')
+
 const dialogVisible = ref(false);
 
 const ruleFormRef = ref(null);
 
 const formInline = ref({
   deptId: '',
-  userPhone: ''
+  userPhone: '',
+  deptName: '',
+  number: 0,
+  points: 0
 })
 
 const options = ref([])
 
 const rules = ref({
-  deptId: [{ required: true, message: 'Please input Activity name', trigger: 'change' }],
-  userPhone: [{ required: true, message: 'Please input Activity name', trigger: 'change' }]
+  deptId: [{ required: true, message: t('personalCenter.qxzbm'), trigger: 'change' }],
+  userPhone: [{ required: true, message: t('personalCenter.qxzyg'), trigger: 'change' }],
+  deptName: [{ required: true, message: t('personalCenter.qsrbmmc'), trigger: 'blur' }],
+  points: [{ required: true, message: t('personalCenter.qsryfpdmbsl'), trigger: 'blur' }]
 })
 
+const changeDialogVisible = (txt) => {
+  title.value = txt;
+
+  dialogVisible.value = true;
+}
+
 const changeEmployee = async (item, index, type) => {
   if (type == 1) {
     let res = await getAvailablePoints();
-    console.log(res)
-    let result = await allocatePoints({
-      points: 1,
-      userId: item.userId
-    })
-    if (result.code === 200) {
-      getemployeeList();
+    if (res.code === 200) {
+      if (res.data.points) {
+        changeDialogVisible('personalCenter.fenpeimibi');
+      }
     }
+
+    console.log(res.data.points)
+    // let result = await allocatePoints({
+    //   points: 1,
+    //   userId: item.userId
+    // })
+    // if (result.code === 200) {
+    //   DGTMessage.success(t('personalCenter.fenpeichenggong'));
+    //   getemployeeList();
+    // }
   } else if (type == 2) {
     let res = await deleteSubAccount(item.userId)
     if (res.code == 200) {
@@ -179,12 +221,27 @@ const confirmSubAccount = async (formEl) => {
   if (!formEl) return;
   await formEl.validate(async (valid, fields) => {
     if (valid) {
-      let res = await addSubAccount(formInline.value);
 
-      getemployeeList();
-      dialogVisible.value = false;
-    } else {
-      console.log('error submit!', fields)
+      let api = title.value == 'personalCenter.tianjiayuangong' ? addSubAccount(formInline.value) : title.value == 'personalCenter.tianjiabumen' ? applyDept({
+        deptName: formInline.value.deptName,
+        parentId: formInline.value.deptId
+      }) : uploadDept({
+        deptName: formInline.value.deptName,
+        deptId: formInline.value.deptId
+      })
+      let res = await api;
+      if (res.code === 200) {
+        DGTMessage.success(`${t('common.success')}`)
+        title.value == 'personalCenter.tianjiayuangong' ? getemployeeList() : getList();
+
+        dialogVisible.value = false;
+        setTimeout(() => {
+          formInline.value.deptId = null;
+          formInline.value.deptName = '';
+          formInline.value.parentId = null;
+        }, 500)
+      }
+
     }
   })
 
@@ -214,7 +271,7 @@ const handlePageChange = (pageNum) => {
 }
 
 const getList = async () => {
-  let res = await deptList();
+  let res = await deptList({ pageSize: 100 });
   addFieldsToAllElements(res.rows);
   dataSource.value = res.rows;
   getemployeeList();
@@ -237,29 +294,28 @@ const addFieldsToAllElements = (arr) => {
 
 const getemployeeList = async () => {
   let res = await employeeList(form.value);
-  console.log(res.rows);
   list.value = res.rows;
   form.value.total = res.total;
 }
 
 const changeNode = async (item, index, type) => {
-  console.log(item, index, type)
+  formInline.value.deptId = item.deptId
   if (type == 0) {
-    let res = await applyDept({
-      deptName: '测试部门1730',
-      parentId: item.deptId
-    })
-    getList()
+    changeDialogVisible('personalCenter.tianjiabumen')
   } else if (type == 1) {
-
+    formInline.value.deptName = item.deptName
+    changeDialogVisible('personalCenter.bianjibumen')
   } else if (type == 2) {
     let res = await deleteDept(item.deptId);
-    getList()
+    if (res.code === 200) {
+      DGTMessage.success(`${t('common.success')}`)
+      getList()
+    }
   }
 }
 
-const changeLabel = async (e, data,node) => {
-  console.log(e, data,node);
+const changeLabel = async (e, data, node) => {
+  console.log(e, data, node);
 }
 
 const handleNodeClick = (data) => {
@@ -272,6 +328,12 @@ onMounted(() => {
 })
 </script>
 <style lang="scss" scoped>
+ul,
+li {
+  margin: 0;
+  padding: 0;
+}
+
 .businessManagement {
   padding: 16px 0;
   display: flex;
@@ -308,7 +370,7 @@ onMounted(() => {
       }
     }
 
-    ::v-deep .el-tree {
+    :deep(.el-tree) {
       background: transparent;
     }
   }
@@ -327,7 +389,7 @@ onMounted(() => {
       padding: 16px 0;
 
       .businessManagement-right-search-left {
-        width: 278px;
+        width: 420px;
         height: 32px;
         padding: 0 12px;
         background: #F5F7FA;
@@ -341,6 +403,7 @@ onMounted(() => {
         }
 
         input {
+          flex: 1;
           font-size: 14px;
           border: none;
           outline: none;
@@ -430,8 +493,9 @@ onMounted(() => {
         cursor: pointer;
         align-items: center;
         justify-content: center;
-        width: 62px;
+        min-width: 62px;
         height: 32px;
+        padding: 0 8px;
         background: #FFFFFF;
         border-radius: 4px;
         font-size: 14px;

+ 4 - 0
src/pages/Personal/Collection.vue

@@ -87,6 +87,10 @@ onMounted(() => {
 })
 </script>
 <style scoped lang="scss">
+  ul,li {
+    margin: 0;
+    padding: 0;
+  }
 .collection {
   padding-bottom: 20px;
 

+ 4 - 0
src/pages/Personal/Demand.vue

@@ -315,6 +315,10 @@ onMounted(() => {
 
 </script>
 <style scoped lang="scss">
+  ul,li {
+    margin: 0;
+    padding: 0;
+  }
 .demand {
   padding-bottom: 20px;
 

+ 26 - 21
src/pages/Personal/Invoice.vue

@@ -4,10 +4,10 @@
       <div class="line_vertical"></div>
       <div class="">{{ $t('personalCenter.myInvoice') }}</div>
     </div>
-    <ul class="invoice-list">
-      <li v-for="(item, index) in list" :key="index">
+    <div class="invoice-list">
+      <div v-for="(item, index) in list" :key="index" class="li">
         <div class="">
-          <div class="btn">{{ item.invoiceStatusName }}</div>
+          <div class="btn" :class="{'btn-active':item.invoiceStatus == 2}">{{ item.invoiceStatusName }}</div>
         </div>
         <div class="invoice-list-t flex-center-between">
           <div class="">{{ item.content.name }}</div>
@@ -28,8 +28,8 @@
             <span>{{ $t('common.viewDetails') }}</span>
           </div>
         </div>
-      </li>
-    </ul>
+      </div>
+    </div>
     <template v-if="list.length">
       <Pagination :total="form.total" :page-size="form.pageSize" :current-page="form.pageNum"
         @page-change="handlePageChange" />
@@ -41,12 +41,12 @@
         <el-row :gutter="16">
           <el-col :span="12">
             <el-form-item label="购方名称">
-              <el-input v-model="invoiceData.invoiceTitle" />
+              <el-input v-model="invoiceData.invoiceTitle" disabled />
             </el-form-item>
           </el-col>
           <el-col :span="12" v-if="invoiceData.invoiceType">
             <el-form-item label="购方税号">
-              <el-input v-model="invoiceData.taxNumber" />
+              <el-input v-model="invoiceData.taxNumber" disabled />
             </el-form-item>
           </el-col>
         </el-row>
@@ -54,38 +54,38 @@
           <el-row :gutter="16">
             <el-col :span="12">
               <el-form-item label="公司地址">
-                <el-input v-model="invoiceData.otherInfo.address" />
+                <el-input v-model="invoiceData.otherInfo.address" disabled />
               </el-form-item>
             </el-col>
             <el-col :span="12">
               <el-form-item label="公司电话">
-                <el-input v-model="invoiceData.otherInfo.mobile" />
+                <el-input v-model="invoiceData.otherInfo.mobile" disabled />
               </el-form-item>
             </el-col>
           </el-row>
           <el-row :gutter="16">
             <el-col :span="12">
               <el-form-item label="公司开户行">
-                <el-input v-model="invoiceData.otherInfo.bank" />
+                <el-input v-model="invoiceData.otherInfo.bank" disabled />
               </el-form-item>
             </el-col>
             <el-col :span="12">
               <el-form-item label="开户行账号">
-                <el-input v-model="invoiceData.otherInfo.account" />
+                <el-input v-model="invoiceData.otherInfo.account" disabled />
               </el-form-item>
             </el-col>
           </el-row>
         </template>
 
       </el-form>
-      <!-- <template #footer>
+      <template #footer>
         <div class="dialog-footer">
-          <el-button @click="dialogVisible = false">Cancel</el-button>
-          <el-button type="primary" @click="dialogVisible = false">
-            Confirm
+          <!-- <el-button @click="dialogVisible = false">Cancel</el-button> -->
+          <el-button type="primary" @click="handleClick">
+            下载发票
           </el-button>
         </div>
-      </template> -->
+      </template>
     </el-dialog>
 
 
@@ -99,7 +99,9 @@ const list = ref([])
 const form = ref({
   pageNum: 1,
   pageSize: 10,
-  total: 0
+  total: 0,
+  orderByColumn: 'id',
+  isAsc: 'desc'
 })
 
 const dialogVisible = ref(false);
@@ -111,17 +113,17 @@ const lookItem = (item) => {
 }
 
 // 查看发票
-const handleClick = (item) => {
-  location.href = item.invoiceUrl;
+const handleClick = () => {
+  location.href = invoiceData.value.invoiceUrl;
 }
 
 
 // 获取列表
 const getList = async () => {
   let res = await invoiceList(form.value)
-  console.log(res.rows)
   res.rows.forEach(element => {
     element.content = JSON.parse(element.content)
+    element.otherInfo = JSON.parse(element.otherInfo)
   });
   list.value = res.rows || [];
   form.value.total = res.total;
@@ -149,7 +151,7 @@ onMounted(() => {
   }
 
   .invoice-list {
-    li {
+    .li {
       padding: 16px;
       margin-bottom: 16px;
       background: #F5F7FA;
@@ -165,6 +167,9 @@ onMounted(() => {
         border-radius: 4px;
         margin-bottom: 8px;
       }
+      .btn-active {
+        background: #1FB362;
+      }
 
       &:last-child {
         margin-bottom: 0;

+ 4 - 0
src/pages/Personal/MemberDetails.vue

@@ -55,6 +55,10 @@ onMounted(() => {
 })
 </script>
 <style scoped lang="scss">
+  ul,li {
+    margin: 0;
+    padding: 0;
+  }
 .member-details {
   padding-bottom: 20px;
 

+ 44 - 22
src/pages/Personal/Orders.vue

@@ -7,11 +7,12 @@
             <div class="order-list-top flex-center-between">
               <div class="order-list-top-l flex-align-center">
                 <el-tag
-                  :type="item.orderStatus == 0 ? 'primary' : item.orderStatus == 1 ? 'success' : item.orderStatus == 2 ? 'danger' : ''">{{
+                  :type="item.orderStatus == 0 ? 'primary' : item.orderStatus == 1 ? 'success' : item.orderStatus == 2 ? 'info' : item.orderStatus == 5 ? 'danger' : ''">{{
                     item.orderStatus == 0 ?
                       $t('personalCenter.daifukuan') : item.orderStatus == 1 ? $t('personalCenter.yiwancheng') :
                         item.orderStatus == 2 ?
-                          $t('personalCenter.yiquxiao') : '' }}</el-tag>
+                          $t('personalCenter.yiquxiao') : item.orderStatus == 5 ? $t('personalCenter.shenhewtg') : ''
+                  }}</el-tag>
                 <div class="">{{ $t('personalCenter.dingdanhao') }}: {{ item.orderNo }}</div>
               </div>
               <div class="order-list-top-r">{{ $t('common.orderTime') }}: {{ item.createTime }}</div>
@@ -30,16 +31,15 @@
               <div class="order-list-main-r flex">
                 <div class="order-list-con flex-center-between flex_1">
 
-
+                  <div class="mi_price">
+                    <div class="">X{{ item.orderNum }}</div>
+                    <div class="">数量</div>
+                  </div>
                   <div class="mi_price price">
                     <div class="">{{ item.amount || 0 }}{{ item.amountUnit }}</div>
                     <div class="">{{ item.payMethodName }}</div>
                   </div>
-                  <div class="mi_price">
-                    <div class="">{{ item.orderNum }}</div>
-                    <div class=""></div>
-                    <!-- <div class="">{{ item.payMethod == 'BMI' ? $t('common.baomibi') : $t('common.mibi') }}</div> -->
-                  </div>
+
                   <div class="">
                     <div v-if="item.invoiceStatus == 0 && item.orderStatus == 1" @click="applyInvoices(item, index)"
                       class="blue btn">
@@ -49,7 +49,10 @@
 
                     <div class="gradient btn" v-else-if="item.orderStatus == 0" @click="pay(item)">
                       <img src="/src/assets/imgs/my/order1@2x.png" alt="">
-                      <div class="">{{ $t('common.goPay') }}</div>
+                      <div class="">{{ $t('personalCenter.lookVoucher') }}</div>
+                    </div>
+                    <div class="" v-else-if="item.orderStatus == 5">
+                      <el-text class="mx-1" type="danger" size="large">拒绝原因:{{ item.transferSug }}</el-text>
                     </div>
                     <div class="btn_kong" v-else></div>
                     <template v-if="false">
@@ -175,6 +178,13 @@
         </div>
       </template>
     </el-dialog>
+
+    <el-image-viewer
+        v-if="showPreview"
+        :url-list="srcList"
+        show-progress
+        @close="showPreview = false"
+      />
   </div>
 </template>
 <script lang="ts" setup>
@@ -222,7 +232,9 @@ const form = ref({
   pageNum: 1,
   pageSize: 10,
   total: 0,
-  orderStatus: ''
+  orderStatus: '',
+  orderByColumn: 'create_time',
+  isAsc: 'desc'
 })
 const dialogVisible = ref(false)
 const ruleFormRef = ref<FormInstance>()
@@ -282,19 +294,23 @@ const handleClick = (tab: TabsPaneContext) => {
   form.value.orderStatus = tab.props.name;
   getList()
 }
-
+const imageRef = ref()
+const showPreview = ref(false)
+const srcList = ref([])
 const pay = async (item, index) => {
-  confirmBuy({
-    callback: getList,
-    appStore,
-    router,
-    type: 'baoMiBalance',
-    price: item.amount,
-    t,
-    productId: item.orderId,
-    orderType: item.orderType,
-    payMethod: item.payMethod
-  })
+  srcList.value = [item.orderImage]
+  showPreview.value = true;
+  // confirmBuy({
+  //   callback: getList,
+  //   appStore,
+  //   router,
+  //   type: 'baoMiBalance',
+  //   price: item.amount,
+  //   t,
+  //   productId: item.orderId,
+  //   orderType: item.orderType,
+  //   payMethod: item.payMethod
+  // })
 }
 
 // 申请开票
@@ -321,6 +337,12 @@ onMounted(() => {
 
 </script>
 <style scoped lang="scss">
+ul,
+li {
+  margin: 0;
+  padding: 0;
+}
+
 .order {
   padding-bottom: 16px;
 

+ 143 - 27
src/pages/Personal/Wallet.vue

@@ -1,13 +1,13 @@
 <template>
   <div class="wallet-page">
-    <ul class="wallet-list flex-between">
-      <li class="gradient flex-center-between" v-for="(item, index) in 2" :key="index">
+    <div class="wallet-list flex-between">
+      <div class="gradient flex-center-between li" v-for="(item, index) in 2" :key="index">
         <div class="wallet-list-li-left">
           <div class="">{{ index == 0 ? $t('common.mibi') : $t('common.baomibi') }} {{ $t('personalCenter.yue') }}</div>
           <div class="">{{ index == 0 ? userInfo?.pointsBalance || 0 || 0 : userInfo?.baoMiBalance || 0 }}</div>
         </div>
         <div class="wallet-list-li-right flex-align-center">
-          <div class="flex-align-center btn" v-if="index == 1">
+          <div @click="show = true" class="flex-align-center btn" v-if="index == 1">
             <img src="/src/assets/imgs/my/tixian@2x.png" alt="">
             <div class="">{{ $t('personalCenter.shenqingtixian') }}</div>
           </div>
@@ -17,25 +17,45 @@
             </div>
           </div>
         </div>
-      </li>
-    </ul>
+      </div>
+    </div>
     <el-tabs v-model="form.changeType" class="demo-tabs" @tab-click="handleClick">
       <el-tab-pane :label="$t(tab.label)" v-for="tab in tabs" :key="tab.name" :name="tab.name">
-        <div class="tabs flex-align-center">
+        <div class="tabs flex-align-center" v-if="form.changeType != 3">
           <div @click="changeType(index)" :class="{ active: index + 1 == form.balanceType }" class="tab"
             v-for="(item, index) in 2">{{
               index == 0 ? $t('common.mibi') : $t('common.baomibi') }}{{ $t('personalCenter.details') }}
           </div>
         </div>
-        <ul class="wallet-page-list" v-if="list?.length">
-          <li v-for="(item, index) in list" :key="index">
-            <div class="title">
-              <div class="">{{ item.bizTypeName }}</div>
-              <div class="">{{ item.createTime }}</div>
+        <template v-if="form.changeType == 3">
+          <div class="wallet-page-list">
+            <div class="lis" v-for="(item, index) in list" :key="index">
+              <div class="flex-center-between">
+                <div class="">{{ item.applyStatus == 0 ? '待审核' : item.applyStatus == 1 ? '已通过' : '未通过' }}</div>
+                <div class="">¥{{ item.applyAmount }}</div>
+              </div>
+              
+              <div class="flex-center-between">
+                <div class="">订单号:{{ item.applyNo }}</div>
+                <div class="">手续费:{{ item.feeAmount }}</div>
+              </div>
+              <div class="">申请时间:{{ item.createTime }}</div>
             </div>
-            <div class="price" :class="{green:form.changeType == 1}">{{ form.changeType == 1 ? '+' : '' }}{{ item.balanceChange }}</div>
-          </li>
-        </ul>
+          </div>
+        </template>
+        <template v-else>
+          <div class="wallet-page-list" v-if="list?.length">
+            <div v-for="(item, index) in list" :key="index" class="li">
+              <div class="title">
+                <div class="">{{ item.bizTypeName }}</div>
+                <div class="">{{ item.createTime }}</div>
+              </div>
+              <div class="price" :class="{ green: form.changeType == 1 }">{{ form.changeType == 1 ? '+' : '' }}{{
+                item.balanceChange }}</div>
+            </div>
+          </div>
+        </template>
+
       </el-tab-pane>
     </el-tabs>
     <template v-if="list?.length">
@@ -97,7 +117,49 @@
         </div>
       </template>
     </el-dialog>
+    <el-dialog v-model="show" title="提现申请" width="500">
+      <el-form ref="ruleFormRef" :model="ruleForm" :rules="rules" label-width="auto">
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="提现金额" prop="applyAmount">
+              <el-input v-model="ruleForm.applyAmount" :placeholder="$t('common.placeholderInput')" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="提现方式" prop="settleType">
 
+              <el-select v-model="ruleForm.settleType" placeholder="Select" style="width: 100%">
+                <el-option label="支付宝" value="alipay" />
+                <el-option label="银行卡" value="bank_card" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="名称" prop="withdrawPerson">
+              <el-input v-model="ruleForm.withdrawPerson" :placeholder="$t('common.placeholderInput')" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="账号" prop="receiveAccount">
+              <el-input v-model="ruleForm.receiveAccount" :placeholder="$t('common.placeholderInput')" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer flex-center">
+          <el-button @click="show = false">{{ $t('common.cancel') }}</el-button>
+          <el-button class="gradient" type="primary" @click="submitForm(ruleFormRef)">{{
+            $t('common.confirm') }}</el-button>
+        </div>
+      </template>
+    </el-dialog>
   </div>
 </template>
 <script lang="ts" setup>
@@ -111,7 +173,7 @@ import { getUserInfo } from '@/api/auth'
 
 import { payConfigDearch, calRate } from '@/api/order'
 
-import { recordList } from '@/api/my'
+import { recordList, applyWithdraw, withdrawList } from '@/api/my'
 
 import { createOrder } from '@/api/order.js'
 
@@ -127,7 +189,8 @@ const appStore = useAppStore();
 
 const tabs = ref([
   { label: 'personalCenter.incomeDetails', name: 1 },
-  { label: 'personalCenter.usageRecord', name: 2 }
+  { label: 'personalCenter.usageRecord', name: 2 },
+  { label: 'personalCenter.withdrawHistory', name: 3 },
 ])
 const list = ref([])
 
@@ -153,7 +216,49 @@ const configTxt = ref({})
 const userInfo = ref({})//用户信息
 
 const dialogVisible = ref(false);
-const transformationIndex = ref(0)
+
+const transformationIndex = ref(0);
+
+const show = ref(false);
+
+const ruleForm = ref({
+  applyAmount: null,
+  settleType: "alipay",
+  withdrawPerson: "",
+  receiveAccount: ""
+})
+
+const ruleFormRef = ref()
+const rules = ref({
+  applyAmount: [
+    { required: true, message: 'Please input Activity name', trigger: 'blur' }
+  ],
+  settleType: [
+    { required: true, message: 'Please input Activity name', trigger: 'blur' }
+  ],
+  withdrawPerson: [
+    { required: true, message: 'Please input Activity name', trigger: 'blur' }
+  ],
+  receiveAccount: [
+    { required: true, message: 'Please input Activity name', trigger: 'blur' }
+  ],
+})
+
+const submitForm = async (formEl) => {
+  if (!formEl) return
+  await formEl.validate(async (valid, fields) => {
+    if (valid) {
+      let res = await applyWithdraw(ruleForm.value);
+      if (res.code === 200) {
+        show.value = false;
+        appStore.USERINFO();
+        DGTMessage.success(t('common.success'));
+      }
+    } else {
+      console.log('error submit!', fields)
+    }
+  })
+}
 
 // 确认转换
 const confirmTransformation = async () => {
@@ -202,20 +307,19 @@ const handleChange = async () => {
 }
 // 米币暴米币切换
 const changeType = (index) => {
-  // list.value = []
   form.value.pageNum = 1;
   form.value.balanceType = index + 1;
   getList()
 }
 
 const handleClick = (tab: TabsPaneContext) => {
-  // list.value = []
   form.value.pageNum = 1;
   form.value.changeType = tab.props.name;
   getList()
 }
 const getList = async () => {
-  let res = await await recordList(form.value);
+  let api = form.value.changeType == 3 ? withdrawList(form.value) : recordList(form.value)
+  let res = await api;
   list.value = res.rows;
   form.value.total = res.total;
 }
@@ -243,6 +347,8 @@ onMounted(() => {
   padding-bottom: 16px;
 
   .tabs {
+    margin-bottom: 16px;
+
     .tab {
       cursor: pointer;
       color: #2D71FF;
@@ -264,7 +370,7 @@ onMounted(() => {
     gap: 16px;
     padding: 16px;
 
-    li {
+    .li {
       flex: 1;
       padding: 16px;
       border-radius: 16px;
@@ -311,9 +417,8 @@ onMounted(() => {
 }
 
 .wallet-page-list {
-  margin-top: 16px;
 
-  li {
+  .li {
     display: flex;
     align-items: center;
     justify-content: space-between;
@@ -344,10 +449,21 @@ onMounted(() => {
       font-weight: bold;
       color: #F52929;
     }
+
     .green {
       color: #1FB362;
     }
   }
+  .lis {
+    padding: 16px;
+    border-radius: 16px;
+    background: #F5F7FA;
+    margin-bottom: 16px;
+
+    &:last-child {
+      margin-bottom: 0;
+    }
+  }
 }
 
 .input {
@@ -373,18 +489,18 @@ onMounted(() => {
 
 .inputStyle {
 
-  ::v-deep .el-input__wrapper {
+  :deep(.el-input__wrapper) {
     background-color: transparent;
     box-shadow: none;
     padding: 0;
   }
 
-  ::v-deep .el-input__inner {
+  :deep(.el-input__inner) {
     font-size: 28px;
   }
 
-  ::v-deep .el-input-number__increase,
-  ::v-deep .el-input-number__decrease {
+  :deep(.el-input-number__increase),
+  :deep(.el-input-number__decrease)  {
     display: none;
   }
 }

+ 4 - 0
src/pages/Personal/Workflow.vue

@@ -139,6 +139,10 @@ onMounted(() => {
 
 </script>
 <style scoped lang="scss">
+  ul,li {
+    margin: 0;
+    padding: 0;
+  }
 .workflow {
   padding: 16px 0 20px;
 

+ 237 - 60
src/pages/PersonalCenter.vue

@@ -32,6 +32,14 @@
               <span>{{ appStore?.userInfo?.baoMiBalance || 0 }}</span>
               <span>{{ $t('common.baomibi') }}</span>
             </div>
+
+
+            <div class="">
+
+              <el-button type="primary">充值</el-button>
+            </div>
+
+
             <div class="personal-user-line"></div>
             <div class="personal-user-li">
               <span>{{ collectCount }}</span>
@@ -59,12 +67,15 @@
     <div class="personal-main">
       <div class="personal-left">
         <div class="personal-left-list">
-          <div @click="toPath(item, index)" :class="{ active: index == navIndex }" class="personal-left-li"
-            v-for="(item, index) in navList" :key="index">
-            <img v-if="index == navIndex" :src="item.iconActive" alt="">
-            <img v-else :src="item.icon" alt="">
-            <div class="">{{ $t(item.name) }}</div>
-          </div>
+          <template v-for="(item, index) in navList" :key="index">
+            <div v-if="item.show" @click="toPath(item, index)" :class="{ active: index == navIndex }"
+              class="personal-left-li">
+              <img v-if="index == navIndex" :src="item.iconActive" alt="">
+              <img v-else :src="item.icon" alt="">
+              <div class="">{{ $t(item.name) }}</div>
+            </div>
+          </template>
+
         </div>
       </div>
       <div class="personal-right">
@@ -79,31 +90,49 @@
 
     <div class="workOrder-dot" @click="show = true">
       <img src="/src/assets/imgs/my/icon9a@2x.png" alt="">
-      <div class="">工单</div>
+      <div class="">{{ $t('personalCenter.gongdan') }}</div>
     </div>
 
-    <el-dialog v-model="show" title="工单" width="784">
-      <el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
-        <el-tab-pane v-for="tab in tabs" :key="tab.name" :label="tab.label" :name="tab.name">
-          <el-form ref="ruleFormRef" :model="ruleForm" :rules="rules">
-            <el-form-item label="工单类型" prop="issueCategory">
-              <el-input v-model="ruleForm.issueCategory" />
-            </el-form-item>
-            <el-form-item label="工单标题" prop="issueTitle">
-              <el-input v-model="ruleForm.issueTitle" />
-            </el-form-item>
-            <el-form-item label="工单内容" prop="issueContent">
-              <el-input v-model="ruleForm.issueContent" />
-            </el-form-item>
-          </el-form>
+    <el-dialog v-model="show" :title="`${$t('personalCenter.gongdan')}`" width="784">
+      <el-tabs v-model="activeName" @tab-click="handleClick">
+        <el-tab-pane v-for="tab in tabs" :key="tab.name" :label="`${$t(tab.label)}`" :name="tab.name">
+          <template v-if="activeName == 0">
+            <el-form ref="ruleFormRef" :model="ruleForm" :rules="rules" label-width="160px">
+              <el-form-item :label="`${$t('personalCenter.gongdanleixing')}`" prop="issueCategory">
+                <el-select v-model="ruleForm.issueCategory" :placeholder="`${$t('common.qingxuanze')}`"
+                  style="width: 100%">
+                  <el-option v-for="item in workTypeList" :key="item.value" :label="`${$t(item.label)}`"
+                    :value="item.value" />
+                </el-select>
+              </el-form-item>
+              <el-form-item :label="`${$t('personalCenter.gongdanbiaoti')}`" prop="issueTitle">
+                <el-input v-model="ruleForm.issueTitle" :placeholder="`${$t('common.placeholderInput')}`" />
+              </el-form-item>
+              <el-form-item :label="`${$t('personalCenter.gongdanneirong')}`" prop="issueContent">
+                <el-input v-model="ruleForm.issueContent" :placeholder="`${$t('common.placeholderInput')}`" />
+              </el-form-item>
+            </el-form>
+          </template>
+          <template v-else>
+            <el-collapse v-model="workName" accordion>
+              <el-collapse-item :title="item.issueTitle || item.question" :name="item.id"
+                v-for="(item, index) in workList" :key="index">
+                <div>{{ item.issueContent || item.answer }}</div>
+              </el-collapse-item>
+            </el-collapse>
+            <template v-if="workList && workList.length">
+              <Pagination :total="workForm.total" :page-size="workForm.pageSize" :current-page="workForm.pageNum"
+                @page-change="handlePageChange" />
+            </template>
+            <el-empty v-else :description="$t('common.empty')" />
+          </template>
+
         </el-tab-pane>
       </el-tabs>
       <template #footer v-if="activeName == 0">
-        <div class="dialog-footer">
-          <el-button @click="dialogVisible = false">Cancel</el-button>
-          <el-button type="primary" @click="submitForm(ruleFormRef)">
-            Confirm
-          </el-button>
+        <div class="dialog-footer flex-center">
+          <el-button @click="show = false">{{ $t('common.cancel') }}</el-button>
+          <el-button type="primary" @click="submitForms(ruleFormRef)">{{ $t('common.confirm') }}</el-button>
         </div>
       </template>
     </el-dialog>
@@ -155,7 +184,14 @@
               <el-input v-model="userInfo.verifyCode" :placeholder="$t('common.placeholderInput')" class="inputStyle"
                 :input-style="{
                   backgroundColor: 'transparent',
-                }" />
+                }">
+                <template #append>
+                  <el-button type="primary" :disabled="smsCountdown > 0" @click="sendSmsCode" style="width:140px"
+                    :class="{ 'countdown-btn': smsCountdown > 0 }" size="small">
+                    {{ smsCountdown > 0 ? `${smsCountdown}s` : $t('login.sendCaptcha') }}
+                  </el-button>
+                </template>
+              </el-input>
             </el-form-item>
           </el-col>
         </el-row>
@@ -165,7 +201,11 @@
               <el-input v-model="userInfo.name" :placeholder="$t('common.placeholderInput')" class="inputStyle"
                 :input-style="{
                   backgroundColor: 'transparent',
-                }" />
+                }">
+                <template #append>
+                  <el-button :icon="Refresh" />
+                </template>
+              </el-input>
             </el-form-item>
           </el-col>
           <el-col :span="12">
@@ -173,7 +213,7 @@
               <el-input v-model="userInfo.name" :placeholder="$t('common.placeholderInput')" class="inputStyle"
                 :input-style="{
                   backgroundColor: 'transparent',
-                }" />
+                }" disabled />
             </el-form-item>
           </el-col>
 
@@ -184,7 +224,11 @@
               <el-input v-model="userInfo.name" :placeholder="$t('common.placeholderInput')" class="inputStyle"
                 :input-style="{
                   backgroundColor: 'transparent',
-                }" />
+                }">
+              <template #append>
+                  <el-button :icon="Refresh" />
+                </template>  
+              </el-input>
             </el-form-item>
 
           </el-col>
@@ -193,7 +237,7 @@
               <el-input v-model="userInfo.name" :placeholder="$t('common.placeholderInput')" class="inputStyle"
                 :input-style="{
                   backgroundColor: 'transparent',
-                }" />
+                }" disabled />
             </el-form-item>
           </el-col>
         </el-row>
@@ -203,7 +247,11 @@
               <el-input v-model="userInfo.name" :placeholder="$t('common.placeholderInput')" class="inputStyle"
                 :input-style="{
                   backgroundColor: 'transparent',
-                }" />
+                }">
+              <template #append>
+                  <el-button :icon="Refresh" />
+                </template>  
+              </el-input>
             </el-form-item>
           </el-col>
           <el-col :span="12">
@@ -211,7 +259,7 @@
               <el-input v-model="userInfo.name" :placeholder="$t('common.placeholderInput')" class="inputStyle"
                 :input-style="{
                   backgroundColor: 'transparent',
-                }" />
+                }" disabled />
             </el-form-item>
           </el-col>
         </el-row>
@@ -222,7 +270,11 @@
               <el-input v-model="userInfo.name" :placeholder="$t('common.placeholderInput')" class="inputStyle"
                 :input-style="{
                   backgroundColor: 'transparent',
-                }" />
+                }">
+               <template #append>
+                  <el-button :icon="Refresh" />
+                </template> 
+              </el-input>
             </el-form-item>
           </el-col>
           <el-col :span="12">
@@ -230,7 +282,7 @@
               <el-input v-model="userInfo.name" :placeholder="$t('common.placeholderInput')" class="inputStyle"
                 :input-style="{
                   backgroundColor: 'transparent',
-                }" />
+                }" disabled />
             </el-form-item>
           </el-col>
         </el-row>
@@ -269,7 +321,7 @@
 </template>
 <script setup lang="ts">
 
-import { Plus } from '@element-plus/icons-vue'
+import { Plus,Refresh } from '@element-plus/icons-vue'
 
 import { useAppStore } from '@/pinia/appStore'
 
@@ -282,7 +334,7 @@ import { useRoute, useRouter } from 'vue-router'
 
 import { getUserInfo, updateUserInfo } from '@/api/auth.js'
 
-import { checkIn, queryCollectCount } from '@/api/my.js'
+import { checkIn, queryCollectCount, issue, issueList, faqList, getfaq } from '@/api/my.js'
 
 import DGTMessage from '@/utils/message'
 
@@ -290,6 +342,19 @@ import { useI18n } from 'vue-i18n'
 
 import FileUploader from '@/components/FileUploader.vue'
 
+import Pagination from '@/components/Pagination.vue'
+
+
+import type { FormInstance, FormRules } from 'element-plus'
+
+interface RuleForm {
+  issueCategory: string
+  issueTitle: string
+  issueContent: string
+}
+
+const ruleFormRef = ref(null);
+
 const { t } = useI18n()
 
 const appStore = useAppStore();
@@ -303,50 +368,57 @@ const navList = ref([
     name: 'personalCenter.myWallet',
     path: '/personal-center/wallet',
     icon: '/src/assets/imgs/my/icon1@2x.png',
-    iconActive: '/src/assets/imgs/my/icon1a@2x.png'
+    iconActive: '/src/assets/imgs/my/icon1a@2x.png',
+    show: true
   },
   {
     name: 'personalCenter.membershipInfo',
     path: '/personal-center/member-details',
     icon: '/src/assets/imgs/my/icon2@2x.png',
-    iconActive: '/src/assets/imgs/my/icon2a@2x.png'
+    iconActive: '/src/assets/imgs/my/icon2a@2x.png',
+    show: true
   },
   {
     name: 'personalCenter.myCollection',
     path: '/personal-center/collection',
     icon: '/src/assets/imgs/my/icon3@2x.png',
-    iconActive: '/src/assets/imgs/my/icon3a@2x.png'
+    iconActive: '/src/assets/imgs/my/icon3a@2x.png',
+    show: true
   },
   {
     name: 'personalCenter.myDemand',
     path: '/personal-center/demand',
     icon: '/src/assets/imgs/my/icon4@2x.png',
-    iconActive: '/src/assets/imgs/my/icon4a@2x.png'
+    iconActive: '/src/assets/imgs/my/icon4a@2x.png',
+    show: true
   },
   {
     name: 'personalCenter.myOrders',
     path: '/personal-center/orders',
     icon: '/src/assets/imgs/my/icon5@2x.png',
-    iconActive: '/src/assets/imgs/my/icon5a@2x.png'
+    iconActive: '/src/assets/imgs/my/icon5a@2x.png',
+    show: true
   },
   {
     name: 'personalCenter.myInvoice',
     path: '/personal-center/invoice',
     icon: '/src/assets/imgs/my/icon6@2x.png',
-    iconActive: '/src/assets/imgs/my/icon6a@2x.png'
+    iconActive: '/src/assets/imgs/my/icon6a@2x.png',
+    show: true
   },
   {
     name: 'personalCenter.myWorkflow',
     path: '/personal-center/workflow',
     icon: '/src/assets/imgs/my/icon7@2x.png',
-    iconActive: '/src/assets/imgs/my/icon7a@2x.png'
+    iconActive: '/src/assets/imgs/my/icon7a@2x.png',
+    show: true
   },
   {
     name: 'personalCenter.businessManagement',
     path: '/personal-center/business-management',
     icon: '/src/assets/imgs/my/icon8@2x.png',
     iconActive: '/src/assets/imgs/my/icon8a@2x.png',
-    show: true,
+    show: false
   },
   // {
   //   name: 'personalCenter.serviceManagement',
@@ -361,23 +433,55 @@ const dialogVisible = ref(false)
 const show = ref(false)
 
 const tabs = ref([
-  { label: '提交工单', name: 0 },
-  { label: '历史工单', name: 1 },
-  { label: '常见问题', name: 2 }
+  { label: 'personalCenter.tijiaogongdan', name: 0 },
+  { label: 'personalCenter.lishigongdan', name: 1 },
+  { label: 'personalCenter.changjianwenti', name: 2 }
 ])
 
+const workList = ref([])
+
+const workForm = ref({
+  pageNum: 1,
+  pageSize: 10,
+  total: 0,
+})
+
 const activeName = ref(0)
 
-const ruleForm = ref({
+const workName = ref(null)
+
+const workTypeList = ref([
+  {
+    value: 'account',
+    label: 'personalCenter.zhanghaowenti'
+  },
+  {
+    value: 'payment',
+    label: 'personalCenter.zhifuwenti'
+  },
+  {
+    value: 'course',
+    label: 'personalCenter.kechengwenti'
+  },
+  {
+    value: 'workflow',
+    label: 'personalCenter.gongzuoliuwenti'
+  },
+  {
+    value: 'other',
+    label: 'personalCenter.qitawenti'
+  }
+])
+
+const ruleForm = ref<RuleForm>({
   issueCategory: '',
   issueTitle: '',
   issueContent: ''
 })
 
-const rules = ref({
+const rules = ref<FormRules<RuleForm>>({
   issueCategory: [
     {
-      type: 'date',
       required: true,
       message: '请选择工单类型',
       trigger: 'change',
@@ -430,13 +534,80 @@ const userInfo = ref({})//用户信息
 
 const coverImage = ref([]);
 
-const ruleFormRef = ref()
+// 验证码倒计时
+const smsCountdown = ref(0)
+const passwordresetCountdown = ref(0)
+const emailCountdown = ref(0)
+
+// 发送短信验证码
+const sendSmsCode = async () => {
+  if (!smsForm.account) {
+    ElMessage.warning('请先输入手机号或邮箱')
+    return
+  }
+
+  // 验证手机号格式
+  if (!PHONE_REGEX.test(smsForm.account) && !EMAIL_REGEX.test(smsForm.account)) {
+    ElMessage.warning('请输入正确的手机号或邮箱')
+    return
+  }
+
+  let res = null;
+  if (PHONE_REGEX.test(smsForm.account)) {
+    res = await getSmsCode({
+      phone: smsForm.account
+    })
+  } else if (EMAIL_REGEX.test(smsForm.account)) {
+    res = await getEmailCode({
+      email: smsForm.account
+    })
+  }
+
+  if (res.code !== 200) {
+    return
+  }
+
+  // 模拟发送验证码
+  ElMessage.success('验证码发送成功')
+
+  // 开始倒计时
+  smsCountdown.value = 60
+  const timer = setInterval(() => {
+    smsCountdown.value--
+    if (smsCountdown.value <= 0) {
+      clearInterval(timer)
+    }
+  }, 1000)
+}
+
+
+const handlePageChange = () => {
+
+}
+
+const handleClick = async (tab) => {
+  activeName.value = tab.props.name
+  getList()
+}
+
+const getList = async () => {
+  let api = activeName.value == 1 ? issueList(workForm.value) : faqList(workForm.value);
+  let res = await api;
+  workList.value = res.rows;
+  workForm.value.total = res.total;
+}
 
-const submitForm = async (formEl: any) => {
-  if (!formEl) return
+
+const submitForms = async (formEl) => {
+  let res = await issue(ruleForm.value);
+  console.log(res);
+  if (res.code === 200) {
+    show.value = false;
+  }
+  if (!formEl) return;
   await formEl.validate(async (valid, fields) => {
     if (valid) {
-      console.log('submit!')
+
     }
   })
 }
@@ -479,6 +650,12 @@ const getInfo = async () => {
     dynamicTags.value = res.user.skillTags.split(',')
   }
   userInfo.value = res.user;
+  navList.value.forEach(item => {
+    if (item.name === 'personalCenter.businessManagement' && res.user.isCompanyAuth == 1) {
+      item.show = true;
+    }
+  })
+  // isCompanyAuth
 }
 
 const collectCount = ref(0)
@@ -714,7 +891,7 @@ div {
   border-radius: 4px;
   border: 1px solid #F2F6FC;
 
-  ::v-deep .el-input__wrapper {
+  :deep(.el-input__wrapper) {
     background-color: transparent;
   }
 }
@@ -725,10 +902,10 @@ div {
   align-items: center;
   justify-content: center;
   flex-direction: column;
-  right: 100px;
-  bottom: 90px;
-  width: 64px;
-  height: 64px;
+  right: 80px;
+  bottom: 70px;
+  width: 84px;
+  height: 84px;
   position: fixed;
   color: #2D71FF;
   font-size: 14px;

Різницю між файлами не показано, бо вона завелика
+ 380 - 228
src/styles/index.scss