yinxiangke преди 1 месец
родител
ревизия
2d6c89c9f2

BIN
src/assets/imgs/my/arrow-left-right-fill@2x.png


+ 2 - 1
src/locales/en.js

@@ -156,6 +156,7 @@ export default {
     yue: 'Balance',
     shenqingtixian: 'Apply for Withdrawal',
     zhuanghuanmibi: 'Convert Mibit',
-    zhuanhuanbaomibi:'Convert Boom Mibit'
+    zhuanhuanbaomibi:'Convert Boom Mibit',
+    orderNumber: 'Order Number',
   }
 }

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

@@ -159,7 +159,8 @@ export default {
     yue: '余额',
     shenqingtixian: '申请提现',
     zhuanghuanmibi: '转换米币',
-    zhuanhuanbaomibi:'转换暴米币'
+    zhuanhuanbaomibi:'转换暴米币',
+    orderNumber: '订单编号',
   }
 
 }

+ 6 - 3
src/pages/Personal/Invoice.vue

@@ -7,12 +7,12 @@
     <ul class="invoice-list">
       <li v-for="(item, index) in list" :key="index">
         <div class="invoice-list-t flex-center-between">
-          <div class="">这是订单名称</div>
-          <div class="">¥5000.00</div>
+          <div class="">{{ item.content.name }}</div>
+          <div class="">¥{{ item.content.price }}</div>
         </div>
         <div class="flex-center-between invoice-list-c">
           <div class="">{{ $t('personalCenter.orderNumber') }}:</div>
-          <div class="">20251024001</div>
+          <div class="">{{ item.orderNo }}</div>
         </div>
         <div class="flex-center-between invoice-list-time">
           <div class="">{{ $t('common.orderCreateTime') }}:</div>
@@ -50,6 +50,9 @@ const form = ref({
 const getList = async () => {
   let res = await invoiceList(form.value)
   console.log(res.rows)
+  res.rows.forEach(element => {
+     element.content = JSON.parse(element.content)
+  });
   list.value = res.rows || [];
   form.value.total = res.total;
 }

+ 84 - 32
src/pages/Personal/Orders.vue

@@ -6,9 +6,9 @@
           <li v-for="(item, index) in list" :key="index">
             <div class="order-list-top flex-center-between">
               <div class="order-list-top-l flex-align-center">
-                <el-tag :type="index == 0 ? 'primary' : index == 1 ? 'success' : 'danger'">{{ index == 0 ?
-                  $t('personalCenter.daifukuan') : index == 1 ? $t('personalCenter.yiwancheng') :
-                    $t('personalCenter.yiquxiao') }}</el-tag>
+                <el-tag :type="item.orderStatus == 0 ? 'primary' : item.orderStatus == 1 ? 'success' : item.orderStatus == 3 ? 'danger' : ''">{{ item.orderStatus == 0 ?
+                  $t('personalCenter.daifukuan') : item.orderStatus == 1 ? $t('personalCenter.yiwancheng') : item.orderStatus == 3 ?
+                    $t('personalCenter.yiquxiao') : '' }}</el-tag>
                 <div class="">{{ $t('personalCenter.dingdanhao') }}: {{ item.orderNo }}</div>
               </div>
               <div class="order-list-top-r">{{ $t('common.orderTime') }}: {{ item.createTime }}</div>
@@ -18,25 +18,26 @@
                 src="https://shadow.elemecdn.com/app/element/hamburger.9cf7b091-55e9-11e9-a976-7f4d0b07eef6.png" alt="">
               <div class="order-list-con flex-center-between flex_1">
                 <div class="">
-                  <div class="title">UI界面设计教程</div>
+                  <div class="title">{{ item.orderTypeName }}</div>
                   <div class="">
                     <el-button type="primary" size="small" plain>技能标签</el-button>
                     <el-button type="primary" size="small" plain>技能标签</el-button>
                   </div>
                 </div>
                 <div class="mi_price">
-                  <div class="">29900</div>
-                  <div class="">{{ $t('common.mibi') }}</div>
+                  <div class="">{{ item.amount }}</div>
+                  <div class="">{{ item.payMethod == 'BMI' ? $t('common.baomibi') : $t('common.mibi') }}</div>
                 </div>
                 <div class="mi_price price">
-                  <div class="">¥239.20</div>
+                  <div class="">¥{{ item.discountAmount || 0 }}</div>
                   <div class="">{{ $t('common.actualAmount') }}</div>
                 </div>
-                <div class="" v-if="item.invoiceStatus == 0">
-                  <div @click="applyInvoices(item, index)" class="blue btn">
+                <div class="" >
+                  <div v-if="item.invoiceStatus == 0" @click="applyInvoices(item, index)" class="blue btn">
                     <img src="/src/assets/imgs/my/order3@2x.png" alt="">
                     <div class="">{{ $t('common.applyInvoice') }}</div>
                   </div>
+                  <div class="btn_kong" v-else></div>
                   <template v-if="false">
                     <template v-if="index == 0">
                       <div class="gradient btn">
@@ -79,81 +80,79 @@
     </template>
     <el-empty v-else :description="$t('common.empty')" />
     <el-dialog v-model="dialogVisible" title="申请开票" width="784" :before-close="handleClose">
-      <div class="">发票抬头信息</div>
-      <el-form :model="invoiceData" class="demo-form-inline" label-position="top">
+      <div class="dialog_title">发票抬头信息</div>
+      <el-form :model="invoiceData" class="demo-form-inline" label-position="top" :rules="rules" ref="ruleFormRef">
         <el-row :gutter="16">
           <el-col :span="12">
             <el-form-item label="抬头类型">
-              <el-radio-group v-model="radio1">
+              <el-radio-group v-model="invoiceData.invoiceType">
+                <el-radio value="0" size="large">个人</el-radio>
                 <el-radio value="1" size="large">企业单位</el-radio>
-                <el-radio value="2" size="large">个人</el-radio>
               </el-radio-group>
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="购方名称">
-              <el-input v-model="invoiceData.user" placeholder="Approved by" clearable />
+            <el-form-item label="购方名称" prop="invoiceTitle">
+              <el-input v-model="invoiceData.invoiceTitle" placeholder="请输入" clearable />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="16">
           <el-col :span="12">
-            <el-form-item label="购方税号">
-              <el-input v-model="invoiceData.user" placeholder="Approved by" clearable />
+            <el-form-item label="购方税号" prop="taxNumber">
+              <el-input v-model="invoiceData.taxNumber" placeholder="请输入" clearable />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="公司地址">
-              <el-input v-model="invoiceData.user" placeholder="Approved by" clearable />
+              <el-input v-model="invoiceData.otherInfo.address" placeholder="请输入" clearable />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="16">
           <el-col :span="12">
             <el-form-item label="公司电话">
-              <el-input v-model="invoiceData.user" placeholder="Approved by" clearable />
+              <el-input v-model="invoiceData.otherInfo.mobile" placeholder="请输入" clearable />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="公司开户行">
-              <el-input v-model="invoiceData.user" placeholder="Approved by" clearable />
+              <el-input v-model="invoiceData.otherInfo.bank" placeholder="请输入" clearable />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="16">
           <el-col :span="12">
             <el-form-item label="开户行账号">
-              <el-input v-model="invoiceData.user" placeholder="Approved by" clearable />
+              <el-input v-model="invoiceData.otherInfo.account" placeholder="请输入" clearable />
             </el-form-item>
           </el-col>
 
         </el-row>
-        <el-row :gutter="16">
+        <el-row :gutter="16" v-if="false">
           <el-col :span="12">
             <el-form-item label="电子邮箱">
-              <el-input v-model="invoiceData.user" placeholder="Approved by" clearable />
+              <el-input v-model="invoiceData.user" placeholder="请输入" clearable />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="联系电话">
-              <el-input v-model="invoiceData.user" placeholder="Approved by" clearable />
+              <el-input v-model="invoiceData.user" placeholder="请输入" clearable />
             </el-form-item>
           </el-col>
         </el-row>
       </el-form>
       <template #footer>
-        <div class="dialog-footer">
-          <el-button @click="dialogVisible = false">Cancel</el-button>
-          <el-button type="primary" @click="dialogVisible = false">
-            Confirm
-          </el-button>
+        <div class="dialog-footer flex-center">
+          <el-button @click="dialogVisible = 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>
-import { ref, onMounted } from 'vue'
+import { ref, onMounted, reactive } from 'vue'
 
 import type { TabsPaneContext } from 'element-plus'
 import Pagination from '@/components/Pagination.vue'
@@ -168,6 +167,13 @@ const tabs = ref([
 
 const activeName = ref('first')
 const list = ref([]);
+
+import type { FormInstance, FormRules } from 'element-plus'
+
+interface RuleForm {
+  invoiceTitle: string
+  taxNumber: string
+}
 const form = ref({
   pageNum: 1,
   pageSize: 10,
@@ -176,8 +182,9 @@ const form = ref({
   orderTypeMenu: 2
 })
 const dialogVisible = ref(false)
+const ruleFormRef = ref<FormInstance>()
 const invoiceData = ref({
-  invoiceType: '1',//发票类型(0-个人 1-企业)
+  invoiceType: '0',//发票类型(0-个人 1-企业)
   orderNo: '',//订单号
   orderId: null,
   invoiceTitle: '',//发票抬头
@@ -187,11 +194,47 @@ const invoiceData = ref({
     mobile: '',//
     bank: '',//开户行
     account: '',//账号
-
   },
   remark: '',//备注
 })
 
+const rules = reactive<FormRules<RuleForm>>({
+  invoiceTitle: [
+    { required: true, message: '请输入购方名称', trigger: 'blur' }
+  ],
+  taxNumber: [
+    { required: true, message: '请输入购方税号', trigger: 'blur' }
+  ],
+})
+
+const submitForm = async (formEl: FormInstance | undefined) => {
+  if (!formEl) return
+  let valid = await formEl.validate();
+  console.log(valid)
+  if (valid) {
+
+    let { invoiceType,
+      orderNo,
+      orderId,
+      invoiceTitle,
+      taxNumber, remark } = invoiceData.value
+    let res = await applyInvoice({
+      invoiceType,
+      orderNo,
+      orderId,
+      invoiceTitle,
+      taxNumber,
+      remark,
+      otherInfo: JSON.stringify(invoiceData.value.otherInfo)
+    });
+    console.log(res)
+    if (res.code === 200) {
+      getList()
+    }
+    dialogVisible.value = false;
+  }
+}
+
 const handleClick = (tab: TabsPaneContext) => {
   list.value = []
   form.value.pageNum = 1;
@@ -323,6 +366,9 @@ onMounted(() => {
             color: #FFFFFF;
           }
         }
+        .btn_kong {
+          width: 106px;
+        }
 
 
 
@@ -345,4 +391,10 @@ onMounted(() => {
     }
   }
 }
+.dialog_title {
+  color: #3D3D3D;
+  font-weight: bold;
+  font-size: 16px;
+  margin-bottom: 16px;
+}
 </style>

+ 15 - 9
src/pages/Personal/Wallet.vue

@@ -44,22 +44,22 @@
 
     <el-dialog v-model="dialogVisible"
       :title="`${transformationIndex == 0 ? $t('personalCenter.zhuanhuanbaomibi') : $t('personalCenter.zhuanghuanmibi')}`"
-      width="784" :before-close="handleClose">
+      width="523" :before-close="handleClose">
       <el-form :model="walletForm" label-width="auto" label-position="top">
         <el-row :gutter="16" v-if="transformationIndex">
-          <el-col :span="8">
+          <el-col :span="24">
             <el-form-item :label="$t('common.baomibi')">
               
               <el-input-number v-model="walletForm.orderAmt" :min="1" controls-position="right" size="large"
                 @change="handleChange" style="width: 100%;" />
             </el-form-item>
           </el-col>
-          <el-col :span="8">
+          <el-col :span="24">
             <el-form-item :label="$t('common.mibi')">
               <el-input v-model="walletForm.targetAmount" placeholder="请输入" readonly disabled />
             </el-form-item>
           </el-col>
-          <el-col :span="8">
+          <el-col :span="24">
             <el-form-item label="手续费率">
               <el-input v-model="walletForm.feeRate" placeholder="请输入" readonly disabled />
             </el-form-item>
@@ -81,10 +81,10 @@
         <div class="">{{ configTxt.configName }}{{ configTxt.configValue }}</div>
       </el-form>
       <template #footer>
-        <div class="dialog-footer">
-          <el-button @click="dialogVisible = false">Cancel</el-button>
-          <el-button type="primary" @click="confirmTransformation">
-            Confirm
+        <div class="dialog-footer flex-center">
+          <el-button @click="dialogVisible = false">{{ $t('common.cancel') }}</el-button>
+          <el-button class="gradient" type="primary" @click="confirmTransformation">
+            {{ $t('common.confirm') }}
           </el-button>
         </div>
       </template>
@@ -102,11 +102,16 @@ import { getUserInfo } from '@/api/auth'
 import { payConfigDearch, calRate } from '@/api/order'
 import { createOrder } from '@/api/order.js'
 
+import { useAppStore } from '@/pinia/appStore'
+
 import DGTMessage from '@/utils/message'
 
 import { useI18n } from 'vue-i18n' 
+
 const { t } = useI18n() 
 
+const appStore = useAppStore();
+
 const tabs = ref([
   { label: 'personalCenter.incomeDetails', name: 0 },
   { label: 'personalCenter.usageRecord', name: 1 }
@@ -148,7 +153,8 @@ const confirmTransformation = async () =>{
   if (res.code === 200) {
     if (res.data.paySuccess) {
       dialogVisible.value = false;
-      getInfo()
+      appStore.USERINFO();
+      DGTMessage.success(`  ${ transformationIndex.value ? t('common.zhuanhuanbaomibi') : t('common.zhuanghuanmibi')}${t('common.success')}`)
     }
   }
 }

+ 157 - 13
src/pages/PersonalCenter.vue

@@ -6,22 +6,23 @@
         <el-avatar :size="100" :src="appStore.avatarDefault" />
         <div class="personal-user-info">
           <div class="personal-username">
-            <div class="">{{ userInfo.nickName }}</div>
+            <div class="">{{ appStore.userInfo.nickName }}</div>
             <img src="/src/assets/imgs/my/vip@2x.png" alt="">
             <!-- memberType  会员类型memberType 会员类型分为企业会员(2)和个人会员(1)、免费会员(0) -->
           </div>
-          <div class="personal-user-phone mt4">{{ $t('personalCenter.phoneNumber') }}:{{ userInfo.userPhone }}</div>
-          <div class="gap10 mt4" v-if="userInfo.skillTags">
-            <el-button type="primary" size="large" plain>{{ userInfo.skillTags }}</el-button>
+          <div class="personal-user-phone mt4">{{ $t('personalCenter.phoneNumber') }}:{{ appStore.userInfo.userPhone }}
+          </div>
+          <div class="gap10 mt4" v-if="appStore.userInfo.skillTags">
+            <el-button type="primary" size="large" plain>{{ appStore.userInfo.skillTags }}</el-button>
           </div>
           <div class="personal-user-list">
             <div class="personal-user-li">
-              <span>{{ userInfo.pointsBalance }}</span>
+              <span>{{ appStore.userInfo.pointsBalance }}</span>
               <span>{{ $t('common.mibi') }}</span>
             </div>
             <div class="personal-user-line"></div>
             <div class="personal-user-li">
-              <span>{{ userInfo.baoMiBalance }}</span>
+              <span>{{ appStore.userInfo.baoMiBalance }}</span>
               <span>{{ $t('common.baomibi') }}</span>
             </div>
             <div class="personal-user-line"></div>
@@ -34,11 +35,11 @@
 
       </div>
       <div class="personal-head-right">
-        <div class="personal-head-right-li">
+        <div @click="dialogVisible = true" class="personal-head-right-li">
           <img src="/src/assets/imgs/my/bianji@2x.png" alt="">
           <div class="">{{ $t('personalCenter.editProfile') }}</div>
         </div>
-        <div @click="router.push({path:'/member'})" class="personal-head-right-li">
+        <div @click="router.push({ path: '/member' })" class="personal-head-right-li">
           <img src="/src/assets/imgs/my/huiyuan@2x.png" alt="">
           <div class="">{{ $t('personalCenter.openMembership') }}</div>
         </div>
@@ -66,20 +67,123 @@
 
       </div>
     </div>
+
+    <el-dialog v-model="dialogVisible" title="编辑资料" width="784">
+      <el-form :model="userInfo" label-width="auto" label-position="top">
+
+        <el-row :gutter="16">
+          <el-col :span="12">
+            <el-form-item label="上传头像">
+              <!-- 图片类型 -->
+            <FileUploader
+              ref="fileUploader"
+              accept="image/*"
+              :multiple="false"
+              :limit="1"
+              :auto-upload="true"
+              list-type="picture-card"
+              :data="{ directory: 'workflow' }"
+              buttonText=""
+              v-model="coverImage"
+              tip=""
+            />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="16">
+          <el-col :span="12">
+            <el-form-item label="昵称">
+              <el-input v-model="userInfo.nickName" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="联系电话">
+              <el-input v-model="userInfo.userPhone" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="16">
+          <el-col :span="12">
+            <el-form-item label="n8n账号">
+              <el-input v-model="userInfo.name" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="Coze账号">
+              <el-input v-model="userInfo.name" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="16">
+          <el-col :span="12">
+            <el-form-item label="Dify账号">
+              <el-input v-model="userInfo.name" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="FastGpt账号">
+              <el-input v-model="userInfo.name" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="技能标签">
+              <div class="flex tags flex_1">
+                <el-tag v-for="tag in dynamicTags" :key="tag" closable @close="handleClose(tag)">
+                  {{ tag }}
+                </el-tag>
+                <el-input v-if="inputVisible" ref="InputRef" v-model="inputValue" class="w-20" size="small"
+                  @keyup.enter="handleInputConfirm" @blur="handleInputConfirm" />
+                <el-button v-else class="button-new-tag" size="small" @click="showInput">
+                  + New Tag
+                </el-button>
+              </div>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer flex-center">
+          <el-button @click="dialogVisible = false">{{ $t('common.cancel') }}</el-button>
+          <el-button class="gradient" type="primary" @click="dialogVisible = false">
+            {{ $t('common.confirm') }}
+          </el-button>
+        </div>
+      </template>
+    </el-dialog>
+
   </div>
 </template>
 <script setup lang="ts">
+
 import { useAppStore } from '@/pinia/appStore'
 
-import { ref, onMounted,computed } from 'vue';
+import { ref, onMounted, computed, nextTick } from 'vue';
+
+
+import type { InputInstance } from 'element-plus'
+
 import { useRoute, useRouter } from 'vue-router'
 
 import { getUserInfo } from '@/api/auth.js'
+
 import { checkIn } from '@/api/my.js'
 
+import DGTMessage from '@/utils/message'
+
+import { useI18n } from 'vue-i18n'
+
+import FileUploader from '@/components/FileUploader.vue'
+
+const { t } = useI18n()
+
 const appStore = useAppStore();
+
 const route = useRoute()
+
 const router = useRouter()
+
 const navList = ref([
   {
     name: 'personalCenter.myWallet',
@@ -124,7 +228,10 @@ const navList = ref([
     iconActive: '/src/assets/imgs/my/icon7a@2x.png'
   }
 ])
-const navIndex = computed(()=>{
+
+const dialogVisible = ref(false)
+
+const navIndex = computed(() => {
   switch (route.name) {
     case 'Wallet':
       return 0
@@ -144,7 +251,7 @@ const navIndex = computed(()=>{
     case 'Orders':
       return 4
       break;
-     case 'Invoice':
+    case 'Invoice':
       return 5
       break;
     case 'Workflow':
@@ -158,6 +265,8 @@ const navIndex = computed(()=>{
 
 const userInfo = ref({})//用户信息
 
+const images = ref([]);
+
 const toPath = (item: any, index: number) => {
   if (item.path) {
     router.push(item.path);
@@ -166,14 +275,45 @@ const toPath = (item: any, index: number) => {
 // 签到
 const signIn = async () => {
   let res = await checkIn({ actionType: 1 });
-  console.log(res);
+  if (res.code === 200) {
+    appStore.USERINFO();
+    DGTMessage.success(`${t('common.checkIn')}${t('common.success')}`)
+  }
 }
 // 获取用户信息
 const getInfo = async () => {
   let res = await getUserInfo();
   userInfo.value = res.user;
-  console.log(res.user);
 }
+
+
+const inputValue = ref('')
+
+const dynamicTags = ref([])
+
+const inputVisible = ref(false)
+
+const InputRef = ref<InputInstance>()
+
+const handleClose = (tag: string) => {
+  dynamicTags.value.splice(dynamicTags.value.indexOf(tag), 1)
+}
+
+const showInput = () => {
+  inputVisible.value = true
+  nextTick(() => {
+    InputRef.value!.input!.focus()
+  })
+}
+
+const handleInputConfirm = () => {
+  if (inputValue.value) {
+    dynamicTags.value.push(inputValue.value)
+  }
+  inputVisible.value = false
+  inputValue.value = ''
+}
+
 onMounted(() => {
   getInfo()
 })
@@ -359,4 +499,8 @@ div {
     }
   }
 }
+.tags {
+  flex-wrap: wrap;
+  gap: 16px;
+}
 </style>