From ce0587d2b6cab8ae62ec7bb2fbde82f7d744c33e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=A4=9A=E5=95=A6C=E6=A2=A6?= <15709267061@163.com>
Date: Mon, 12 May 2025 19:45:27 +0800
Subject: [PATCH] update
---
src/api/system/index.js | 186 ++++++++++++++
src/components/AddCustomerServiceModal.vue | 13 +-
src/components/CreditScore.vue | 5 +-
src/components/MessageCard.vue | 18 +-
src/components/OpenTypeFun.js | 32 +++
src/components/TaskItem.vue | 23 +-
src/components/XConfirmModal.vue | 3 +-
src/components/XDropdownItem.vue | 15 +-
src/components/XDropdownList.vue | 27 ++-
src/components/XForm.vue | 1 +
src/components/XFormItem.vue | 2 +-
src/components/XInput.vue | 2 +-
src/components/XPrompt.vue | 29 +++
src/components/XSelect.vue | 51 ++++
src/components/XUpload.vue | 60 +++++
src/hooks/useTableQuery.js | 38 +--
src/pages.json | 14 ++
src/pages/accountManagement/index.vue | 163 ++++++++++++-
src/pages/addAccount/index.vue | 81 ++++++-
src/pages/beginnerTutorial/index.vue | 148 +++++++-----
src/pages/home/index.vue | 99 ++++----
src/pages/login/AccountLogin.vue | 4 +-
src/pages/messageCenter/index.vue | 62 ++++-
src/pages/richPage/index.vue | 15 +-
.../taskDetails/components/TaskDetails.vue | 22 +-
src/pages/taskDetails/index.vue | 226 +++++++++++-------
src/pages/user/components/MyTeam.vue | 19 +-
src/pages/user/index.vue | 34 ++-
.../userInfo/components/EditNickName.vue | 59 +++++
.../userInfo/components/EditPassWord.vue | 35 ++-
src/pages/userInfo/components/EditPhone.vue | 56 +++--
src/pages/userInfo/components/EditWxCode.vue | 24 +-
src/pages/userInfo/index.vue | 28 ++-
src/pages/webview/index.vue | 11 +
src/pinia/UserStore/index.js | 16 ++
src/static/icons/Delete.png | Bin 0 -> 3933 bytes
src/static/icons/Edit.png | Bin 0 -> 3125 bytes
src/static/icons/add.png | Bin 0 -> 217 bytes
src/static/icons/down.png | Bin 0 -> 326 bytes
src/static/icons/dy.png | Bin 0 -> 7381 bytes
src/static/icons/ks.png | Bin 0 -> 4963 bytes
src/static/icons/plus.png | Bin 0 -> 244 bytes
src/static/icons/prompt.png | Bin 0 -> 936 bytes
src/static/icons/sph.png | Bin 0 -> 4558 bytes
src/static/icons/tt.png | Bin 0 -> 10027 bytes
src/static/icons/xhs.png | Bin 0 -> 5156 bytes
src/utils/uils.js | 44 ++++
47 files changed, 1355 insertions(+), 310 deletions(-)
create mode 100644 src/components/OpenTypeFun.js
create mode 100644 src/components/XPrompt.vue
create mode 100644 src/components/XSelect.vue
create mode 100644 src/components/XUpload.vue
create mode 100644 src/pages/userInfo/components/EditNickName.vue
create mode 100644 src/pages/webview/index.vue
create mode 100644 src/static/icons/Delete.png
create mode 100644 src/static/icons/Edit.png
create mode 100644 src/static/icons/add.png
create mode 100644 src/static/icons/down.png
create mode 100644 src/static/icons/dy.png
create mode 100644 src/static/icons/ks.png
create mode 100644 src/static/icons/plus.png
create mode 100644 src/static/icons/prompt.png
create mode 100644 src/static/icons/sph.png
create mode 100644 src/static/icons/tt.png
create mode 100644 src/static/icons/xhs.png
diff --git a/src/api/system/index.js b/src/api/system/index.js
index f660691..878cbe6 100644
--- a/src/api/system/index.js
+++ b/src/api/system/index.js
@@ -50,6 +50,192 @@ const system = {
data: data,
});
},
+ getTaskType: async (data) => {
+ return request({
+ method: MethodsENUM.POST,
+ url: "/task/getTaskType",
+ data: data,
+ });
+ },
+ getPlatform: async (data) => {
+ return request({
+ method: MethodsENUM.POST,
+ url: "/task/getPlatform",
+ data: data,
+ });
+ },
+ getAccountStatus: async (data) => {
+ return Promise.resolve({
+ data: [
+ {
+ id: 0,
+ name: '审核中',
+ hidden: true,
+ },
+ {
+ id: 1,
+ name: '正常',
+ },
+ {
+ id: 2,
+ name: '异常',
+ },
+ {
+ id: 3,
+ name: '隐藏',
+ },
+ {
+ id: -1,
+ name: '未通过',
+ hidden: true,
+ },
+ {
+ id: -2,
+ name: '禁用',
+ hidden: true,
+ },
+ ]
+ });
+ },
+ getTask: async (data) => {
+ return request({
+ method: MethodsENUM.POST,
+ url: "/task/getTask",
+ data: data,
+ });
+ },
+ getTaskinfo: async (id) => {
+ return request({
+ method: MethodsENUM.POST,
+ url: "/task/getTaskinfo",
+ data: {id},
+ });
+ },
+ getArticleCategory: async (data) => {
+ return request({
+ method: MethodsENUM.POST,
+ url: "/article/getArticleCategory",
+ data: data,
+ });
+ },
+ getArticle: async (data) => {
+ return request({
+ method: MethodsENUM.POST,
+ url: "/article/getArticle",
+ data: data,
+ });
+ },
+ getTopArticle: async (data) => {
+ return request({
+ method: MethodsENUM.POST,
+ url: "/article/getTopArticle",
+ data: data,
+ });
+ },
+ getSingle: async (data) => {
+ return request({
+ method: MethodsENUM.POST,
+ url: "/article/getSingle",
+ data: data,
+ });
+ },
+ getAdvList: async (data) => {
+ return request({
+ method: MethodsENUM.POST,
+ url: "/index/getAdvList",
+ data: data,
+ });
+ },
+ getQrcode: async (position) => {
+ return request({
+ method: MethodsENUM.POST,
+ url: "/index/getQrcode",
+ data: {position},
+ });
+ },
+ getMessageCenter: async (data) => {
+ if (data.type === 1) {
+ return request({
+ method: MethodsENUM.POST,
+ url: "/notice/getNotice",
+ data: data,
+ });
+ } else {
+ return request({
+ method: MethodsENUM.POST,
+ url: "/notice/getNotice",
+ data: data,
+ });
+ }
+ },
+ getInfo: async () => {
+ return request({
+ method: MethodsENUM.POST,
+ url: "/user/getInfo",
+ });
+ },
+ saveInfo: async (data) => {
+ return request({
+ method: MethodsENUM.POST,
+ url: "/user/saveInfo",
+ data: data,
+ });
+ },
+ saveMobile: async (data) => {
+ return request({
+ method: MethodsENUM.POST,
+ url: "/user/saveMobile",
+ data: data,
+ });
+ },
+ savePassword: async (data) => {
+ return request({
+ method: MethodsENUM.POST,
+ url: "/user/savePassword",
+ data: data,
+ });
+ },
+ myTeamInfo: async () => {
+ return request({
+ method: MethodsENUM.POST,
+ url: "/user/myTeamInfo",
+ });
+ },
+ addAccount: async (data) => {
+ return request({
+ method: MethodsENUM.POST,
+ url: "/user/addAccount",
+ data: data
+ });
+ },
+ myAccount: async (data) => {
+ return request({
+ method: MethodsENUM.POST,
+ url: "/user/myAccount",
+ data: data
+ });
+ },
+ getAccountInfo: async (id) => {
+ return request({
+ method: MethodsENUM.POST,
+ url: "/user/getAccountInfo",
+ data: {id}
+ });
+ },
+ editAccount: async (data) => {
+ return request({
+ method: MethodsENUM.POST,
+ url: "/user/editAccount",
+ data: data
+ });
+ },
+ delAccount: async (id) => {
+ return request({
+ method: MethodsENUM.POST,
+ url: "/user/delAccount",
+ data: {id}
+ });
+ },
}
export default system;
diff --git a/src/components/AddCustomerServiceModal.vue b/src/components/AddCustomerServiceModal.vue
index a792559..88c0000 100644
--- a/src/components/AddCustomerServiceModal.vue
+++ b/src/components/AddCustomerServiceModal.vue
@@ -1,12 +1,16 @@
@@ -14,11 +18,12 @@ onMounted(() => {
-
+
微信扫码添加
-
+
请发送 [我的] 页面截图给客服
再描述您的问题
diff --git a/src/components/CreditScore.vue b/src/components/CreditScore.vue
index 06a0851..d8024a3 100644
--- a/src/components/CreditScore.vue
+++ b/src/components/CreditScore.vue
@@ -3,6 +3,9 @@ import ICON1 from '../static/icons/path1.png';
import ICON2 from '../static/icons/path2.png';
import ICON3 from '../static/icons/path3.png';
import ICON4 from '../static/icons/path4.png';
+import {useUserStore} from "../pinia/UserStore/index.js";
+
+const UserStore = useUserStore();
@@ -14,7 +17,7 @@ import ICON4 from '../static/icons/path4.png';
- 90
+ {{ UserStore?.userInfo?.score }}
信用分
diff --git a/src/components/MessageCard.vue b/src/components/MessageCard.vue
index a6e02a5..83729c7 100644
--- a/src/components/MessageCard.vue
+++ b/src/components/MessageCard.vue
@@ -2,6 +2,7 @@
import {computed} from 'vue';
import messageIcon from "../static/icons/messageIcon.png";
import XActionsheet from "./XActionsheet.vue";
+import OpenTypeFun from "./OpenTypeFun.js";
const itemList = computed(() => {
const item = [];
@@ -10,10 +11,18 @@ const itemList = computed(() => {
item.push({text: '标记已读', type: 1});
return item;
})
-const {contextRow} = defineProps({
+const {contextRow, type, data} = defineProps({
contextRow: {
type: String,
default: 'ellipsis-1'
+ },
+ type: {
+ type: Number,
+ default: 0
+ },
+ data: {
+ type: Object,
+ default: null
}
});
@@ -27,19 +36,20 @@ const selectActionsheet = (e) => {
@success="selectActionsheet"
:itemList="itemList">
- 任务编号: DF12122
+ {{ type === 0 ? '任务编号: DF12122' : data.title }}
2024-01-26 14:00
- 商家:您的回填数据1由于***未通过,请按照文档文档文档文档文档文档文档文档文档文档文档文档文档文档文档文档文档文档中操作
+ {{ data.content }}
- 置顶
+ 置顶
diff --git a/src/components/OpenTypeFun.js b/src/components/OpenTypeFun.js
new file mode 100644
index 0000000..bf1c666
--- /dev/null
+++ b/src/components/OpenTypeFun.js
@@ -0,0 +1,32 @@
+import {toPage} from "../utils/uils.js";
+
+const OpenTypeFun = async (options) => {
+ console.log('OpenTypeFun打开', options);
+ const {type, url, single_id} = options;
+ switch (type) {
+ case 0: { // 空
+ break;
+ }
+ case 1: { // 站内url
+ await toPage(url);
+ break;
+ }
+ case 2: { // 站内富文本
+ await toPage(`/pages/richPage/index?id=${single_id}`);
+ break;
+ }
+ case 3: { // 微信连接
+ break;
+ }
+ case 4: { // 外部连接
+ window.open(url);
+ break;
+ }
+ case 5: { // 弹窗
+ console.log('弹窗');
+ break;
+ }
+ }
+}
+
+export default OpenTypeFun;
diff --git a/src/components/TaskItem.vue b/src/components/TaskItem.vue
index bb71301..1bf72f7 100644
--- a/src/components/TaskItem.vue
+++ b/src/components/TaskItem.vue
@@ -1,30 +1,39 @@
-
+
- 美白祛斑洗面奶
+ {{ data.goods_name }}
- 抖音
- 三连发
+ {{ data.platform }}
+ {{ numberToCharacter(data.fb_num - 1) }}连发
¥
- 8.56
+ {{ data.real_price.toFixed(2) }}
- 剩余3个名额
+ 剩余{{ data.children_num }}个名额
- 截止时间:08月23日 14:00
+ 截止时间:{{ dayjs(data.end_time).format('MM月DD日 HH:mm') }}
diff --git a/src/components/XConfirmModal.vue b/src/components/XConfirmModal.vue
index 9c4d907..1489175 100644
--- a/src/components/XConfirmModal.vue
+++ b/src/components/XConfirmModal.vue
@@ -37,7 +37,8 @@ const success = () => {
{{ title }}
- {{ info }}
+ {{ info }}
+
diff --git a/src/components/XDropdownItem.vue b/src/components/XDropdownItem.vue
index 65f0513..b44a227 100644
--- a/src/components/XDropdownItem.vue
+++ b/src/components/XDropdownItem.vue
@@ -1,9 +1,14 @@
-
+
@@ -16,5 +21,11 @@
line-height: 140%;
letter-spacing: 0;
text-align: left;
+ background-color: #fff;
+ transition: 500ms;
+}
+
+.active {
+ background-color: rgba(106, 161, 255, 0.2);
}
diff --git a/src/components/XDropdownList.vue b/src/components/XDropdownList.vue
index ae27606..7a77a03 100644
--- a/src/components/XDropdownList.vue
+++ b/src/components/XDropdownList.vue
@@ -1,13 +1,29 @@
-
+
-
+
+ {{ option.find(v => v.id === modelValue)?.name }}
+
-
-
+
+
+ {{ v.name }}
+
diff --git a/src/components/XForm.vue b/src/components/XForm.vue
index 47ab83d..fa0d49a 100644
--- a/src/components/XForm.vue
+++ b/src/components/XForm.vue
@@ -14,6 +14,7 @@ const {model, rules} = defineProps({
const verify = () => {
Object.entries(model).forEach(([key, value]) => {
+ console.log(rules[key], key)
if (!rules[key].reg.test(value)) {
showToast({
icon: 'error',
diff --git a/src/components/XFormItem.vue b/src/components/XFormItem.vue
index 46d17f9..57d6384 100644
--- a/src/components/XFormItem.vue
+++ b/src/components/XFormItem.vue
@@ -9,7 +9,7 @@ const {label} = defineProps({
- {{ label }}
+ {{ label }}
diff --git a/src/components/XInput.vue b/src/components/XInput.vue
index 522fb53..fdfa15b 100644
--- a/src/components/XInput.vue
+++ b/src/components/XInput.vue
@@ -16,7 +16,7 @@ const modelValue = defineModel();
-
+
diff --git a/src/components/XPrompt.vue b/src/components/XPrompt.vue
new file mode 100644
index 0000000..5316c63
--- /dev/null
+++ b/src/components/XPrompt.vue
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/XSelect.vue b/src/components/XSelect.vue
new file mode 100644
index 0000000..01290ac
--- /dev/null
+++ b/src/components/XSelect.vue
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+ {{ placeholder }}
+
+
+ {{ list.find(v => v.id === modelValue)?.name }}
+
+
+
+
+
+
+
+
diff --git a/src/components/XUpload.vue b/src/components/XUpload.vue
new file mode 100644
index 0000000..67a5e40
--- /dev/null
+++ b/src/components/XUpload.vue
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+ 上传图片
+
+
+
+
+
+
+
+
diff --git a/src/hooks/useTableQuery.js b/src/hooks/useTableQuery.js
index a671112..7f41732 100644
--- a/src/hooks/useTableQuery.js
+++ b/src/hooks/useTableQuery.js
@@ -16,9 +16,14 @@ function useTableQuery({
watchParameter = false,
}) {
const loading = ref(false);
+ const vo = reactive({
+ rows: [],
+ page: 0,
+ total: 0,
+ });
const pagination = reactive({
- current: 1,
+ page: 1,
pageSize: 20,
total: 0
});
@@ -29,7 +34,7 @@ function useTableQuery({
const params = {
...parameter,
- current: pagination.current,
+ page: pagination.page,
pageSize: pagination.pageSize
}
@@ -38,34 +43,39 @@ function useTableQuery({
pagination.pageSize = data.page;
pagination.total = data.total;
- callback && callback({
+ const _vo = {
...data,
- rows: data.rows.map(v => ({...v, key: v.id})),
- current: pagination.current
- });
+ rows: data.list.map(v => ({...v, key: v.id})),
+ };
+
+ vo.page = _vo.page;
+ vo.total = _vo.total;
+ vo.rows = [...vo.rows, ..._vo.rows];
+
+ callback && callback(vo);
} finally {
loading.value = false;
}
}
const initFetchData = async () => {
- if (pagination.current === 1) {
- fetchData().then();
- } else {
- pagination.current = 1;
- pagination.total = 0;
- }
+ pagination.page = 1;
+ pagination.total = 0;
+ vo.page = 0;
+ vo.total = 0;
+ vo.rows.length = 0;
+ await fetchData();
}
watch(
- () => [pagination.current, pagination.pageSize],
+ () => [pagination.page, pagination.pageSize],
() => fetchData(),
{deep: true, immediate: immediate}
)
if (watchParameter) watch(
() => parameter,
- () => initFetchData(),
+ () => fetchData(),
{deep: true}
);
diff --git a/src/pages.json b/src/pages.json
index 2a8dbf5..411a3b6 100644
--- a/src/pages.json
+++ b/src/pages.json
@@ -156,6 +156,20 @@
"navigationBarTitleText": "收益记录",
"navigationStyle": "custom"
}
+ },
+ {
+ "path": "pages/accountManagement/index",
+ "style": {
+ "navigationBarTitleText": "帐号管理",
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "pages/addAccount/index",
+ "style": {
+ "navigationBarTitleText": "新增帐号",
+ "navigationStyle": "custom"
+ }
}
// #endif
],
diff --git a/src/pages/accountManagement/index.vue b/src/pages/accountManagement/index.vue
index 4eed695..73b395e 100644
--- a/src/pages/accountManagement/index.vue
+++ b/src/pages/accountManagement/index.vue
@@ -1,11 +1,172 @@
+
+
+
+
+
+
+
+
+ {{
+ item.name
+ }}
+
+
+
+
+
+
+
+
+
+ 新增帐号
+
+
+
+
+
+ {{ v.nickname }}
+ {{ v.account }}
+
+
+ {{ v.status_text }}
+
+
+ {{ v.status_text }}
+
+
+ {{ v.status_text }}
+
+
+
+
+
+
+
+
+
+
+
+
+
-
diff --git a/src/pages/addAccount/index.vue b/src/pages/addAccount/index.vue
index 3af4618..055cef6 100644
--- a/src/pages/addAccount/index.vue
+++ b/src/pages/addAccount/index.vue
@@ -1,11 +1,88 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 确认提交
+
+
-
diff --git a/src/pages/beginnerTutorial/index.vue b/src/pages/beginnerTutorial/index.vue
index 847467b..a1b1af9 100644
--- a/src/pages/beginnerTutorial/index.vue
+++ b/src/pages/beginnerTutorial/index.vue
@@ -1,45 +1,71 @@
@@ -48,42 +74,42 @@ const dataList = reactive([
-
-
+
+
-
+
常见问题
-
+
基础教学
-
+
+ @click="changeMinCategory(item.value)"
+ :class="['rounded-full bg-[#F2F3F5] text-center !py-[8rpx] !text-[13px] duration-500', po.category_id===item.value ? 'current' : '']">
{{ item.name }}
-
-
+
+
collapseCur=index">
- {{ item.name }}
+ {{ item.title }}
- {{ item.intro }}
+ {{ item.content }}
@@ -94,28 +120,30 @@ const dataList = reactive([
+ @click="changeMinCategory(item.value)"
+ :class="['rounded-full bg-[#F2F3F5] text-center !py-[8rpx] !text-[13px] duration-500', po.category_id===item.value ? 'current' : '']">
{{ item.name }}
-
-
-
-
-
+
+
+
+
+
-
- 掘金壁纸详细挂载教程,新手必看
-
- 掘金壁纸详细挂载教程,新手必看掘金壁纸详细挂载教程,新手必看
-
+
+ {{ item.title }}
+
+ {{ item.content }}
-
+
diff --git a/src/pages/home/index.vue b/src/pages/home/index.vue
index 76d9b93..b540499 100644
--- a/src/pages/home/index.vue
+++ b/src/pages/home/index.vue
@@ -6,15 +6,16 @@ import nav3 from '../../static/icons/icon-邀请好友.png';
import nav4 from '../../static/icons/icon-添加客服.png';
import nav5 from '../../static/icons/icon-重要消息.png';
import XDropdownList from "../../components/XDropdownList.vue";
-import XDropdownItem from "../../components/XDropdownItem.vue";
import TaskItem from "../../components/TaskItem.vue";
import useTableQuery from "../../hooks/useTableQuery.js";
import Api from "../../api/index.js";
-import {reactive, ref} from "vue";
+import {reactive, ref, onMounted} from "vue";
import {toPage} from "../../utils/uils.js";
import AddCustomerServiceModal from "../../components/AddCustomerServiceModal.vue";
+import OpenTypeFun from "../../components/OpenTypeFun.js";
const showAddCustomer = ref(false);
+const advList = reactive([]);
const nav = [
{
title: '新手教学',
@@ -46,7 +47,30 @@ const nav = [
},
];
+const taskType = reactive([]);
+const platformType = reactive([]);
+const sortType = reactive([
+ {id: 0, name: '默认排序'},
+ {id: 1, name: '价格最高'},
+ {id: 2, name: '极速打款'},
+ {id: 3, name: '素材安全'},
+ {id: 4, name: '简单上手'},
+ {id: 5, name: '最新发布'},
+]);
+
+Api.system.getTaskType().then(({data}) => {
+ taskType.length = 0;
+ taskType.push(...data);
+});
+Api.system.getPlatform().then(({data}) => {
+ platformType.length = 0;
+ platformType.push(...data);
+});
+
const po = reactive({
+ type: 0,
+ pid: 0,
+ order: 0,
});
const vo = reactive({
page: '',
@@ -55,14 +79,21 @@ const vo = reactive({
});
const {loading, pagination, initFetchData} = useTableQuery({
- api: Api.system.getData,
+ api: Api.system.getTask,
parameter: po,
callback: (data) => {
- vo.page = data.page;
- vo.total = data.total;
- vo.rows =[...vo.rows, ... data.rows];
+ Object.assign(vo, data);
}
});
+
+onMounted(() => {
+ Api.system.getAdvList({
+ position: 1,
+ }).then(({data}) => {
+ advList.length = 0;
+ advList.push(...data);
+ });
+})
@@ -73,7 +104,7 @@ const {loading, pagination, initFetchData} = useTableQuery({
@@ -83,8 +114,8 @@ const {loading, pagination, initFetchData} = useTableQuery({
-
-
+
+
@@ -109,49 +140,25 @@ const {loading, pagination, initFetchData} = useTableQuery({
-
-
- 全部任务
-
-
- 全部任务
- 宣发任务
- 评论任务
- 点赞任务
- 助力任务
- 其他任务
-
+
-
-
- 全部平台
-
-
- 全部平台
- 抖音
- 快手
- 小红书
- 今日头条
- 其他
-
+
-
-
- 默认排序
-
-
- 默认排序
- 价格最高
- 极速打款
- 素材安全
- 简单上手
- 最新发布
-
+
-
+
diff --git a/src/pages/login/AccountLogin.vue b/src/pages/login/AccountLogin.vue
index 7d09682..ea1780b 100644
--- a/src/pages/login/AccountLogin.vue
+++ b/src/pages/login/AccountLogin.vue
@@ -9,8 +9,8 @@ import {useUserStore} from "../../pinia/UserStore/index.js";
const UserStore = useUserStore();
const form = reactive({
- mobile: null,
- password: null,
+ mobile: '15709267061',
+ password: '123456',
});
const success = async () => {
diff --git a/src/pages/messageCenter/index.vue b/src/pages/messageCenter/index.vue
index d112253..4e78663 100644
--- a/src/pages/messageCenter/index.vue
+++ b/src/pages/messageCenter/index.vue
@@ -1,11 +1,12 @@
@@ -21,31 +45,43 @@ const tabs = [
- currentTab=index" height="90">
+
-
+
- 搜索
+ 搜索
-
- 只看未读
+
+ 只看未读
-
-
-
-
+ {
+ console.log('进来了???')
+ pagination.page++;
+ }"
+ class="h-[calc(100vh-500rpx)]"
+ scroll-y>
+
+
+
+
+
diff --git a/src/pages/userInfo/components/EditPassWord.vue b/src/pages/userInfo/components/EditPassWord.vue
index 1397dd2..33a0d84 100644
--- a/src/pages/userInfo/components/EditPassWord.vue
+++ b/src/pages/userInfo/components/EditPassWord.vue
@@ -1,22 +1,43 @@
@@ -26,10 +47,10 @@ const success = () => {
-
+
-
+
diff --git a/src/pages/userInfo/components/EditPhone.vue b/src/pages/userInfo/components/EditPhone.vue
index c20c2f2..4b4c11b 100644
--- a/src/pages/userInfo/components/EditPhone.vue
+++ b/src/pages/userInfo/components/EditPhone.vue
@@ -5,36 +5,44 @@ import XForm from "../../../components/XForm.vue";
import XFormItem from "../../../components/XFormItem.vue";
import XInput from "../../../components/XInput.vue";
import SendMsg from "../../../components/SendMsg.vue";
+import {useUserStore} from "../../../pinia/UserStore/index.js";
+import Api from "../../../api/index.js";
+import {showToast} from "../../../utils/uils.js";
const XFormRef = ref();
+const UserStore = useUserStore();
const show = defineModel('show');
const rules = {
- oldPhone: {
- reg: /^\[1][3-9]\d{9}$/,
+ old_mobile: {
+ reg: /^1[3-9]\d{9}$/,
msg: '请输入正确的手机号',
},
- oldVerificationCode: {
+ old_captcha: {
reg: /.+/,
+ msg: '请输入正确验证码',
+ },
+ new_mobile: {
+ reg: /^1[3-9]\d{9}$/,
msg: '请输入正确的手机号',
},
- newPhone: {
- reg: /^\[1][3-9]\d{9}$/,
- msg: '请输入正确的手机号',
- },
- newVerificationCode: {
+ new_captcha: {
reg: /.+/,
- msg: '请输入正确的手机号',
+ msg: '请输入正确验证码',
},
};
const form = reactive({
- oldPhone: null,
- oldVerificationCode: null,
- newPhone: null,
- newVerificationCode: null,
+ old_mobile: null,
+ old_captcha: null,
+ new_mobile: null,
+ new_captcha: null,
});
-const success = () => {
+const success = async () => {
XFormRef.value.verify();
+ const {msg} = await Api.system.saveMobile(form);
+ showToast(msg);
+ show.value = false;
+ await UserStore.getUserInfo();
}
@@ -44,16 +52,26 @@ const success = () => {
-
+
-
+
+
-
-
+
+
-
+
+
diff --git a/src/pages/userInfo/components/EditWxCode.vue b/src/pages/userInfo/components/EditWxCode.vue
index 6c22b60..f9c4add 100644
--- a/src/pages/userInfo/components/EditWxCode.vue
+++ b/src/pages/userInfo/components/EditWxCode.vue
@@ -1,25 +1,37 @@
@@ -28,7 +40,7 @@ const success = () => {
-
+
diff --git a/src/pages/userInfo/index.vue b/src/pages/userInfo/index.vue
index 05fabf8..e595ab8 100644
--- a/src/pages/userInfo/index.vue
+++ b/src/pages/userInfo/index.vue
@@ -3,23 +3,32 @@ import {defineAsyncComponent, ref} from "vue";
import Right from "../../static/icons/right.png";
import Avatar from "../../static/images/Avatar.png";
import XNav from "../../components/XNav.vue";
+import {useUserStore} from "../../pinia/UserStore/index.js";
+import {onShow} from "@dcloudio/uni-app";
// #ifdef APP-PLUS
+import EditNickName from './components/EditNickName.vue';
import EditWxCode from './components/EditWxCode.vue';
import EditPhone from './components/EditPhone.vue';
import EditPassWord from './components/EditPassWord.vue';
// #endif
// #ifndef APP-PLUS
+const EditNickName = defineAsyncComponent(() => import('./components/EditNickName.vue'));
const EditWxCode = defineAsyncComponent(() => import('./components/EditWxCode.vue'));
const EditPhone = defineAsyncComponent(() => import('./components/EditPhone.vue'));
const EditPassWord = defineAsyncComponent(() => import('./components/EditPassWord.vue'));
// #endif
+const UserStore = useUserStore();
const showTool = ref(false);
const tool = ref('EditWxCode');
const tools = [
+ {
+ key: 'EditNickName',
+ component: EditNickName,
+ },
{
key: 'EditWxCode',
component: EditWxCode,
@@ -38,6 +47,10 @@ const openTools = (key) => {
tool.value = key;
showTool.value = true;
}
+
+onShow(() => {
+ UserStore.getUserInfo();
+})
@@ -52,9 +65,9 @@ const openTools = (key) => {
-
+
昵称
- 酷酷猛吃
+ {{ UserStore?.userInfo?.nickname }}
@@ -63,21 +76,14 @@ const openTools = (key) => {
手机号
- 178****0214
+ {{ UserStore?.userInfo?.mobile }}
微信号
- za395739
-
-
-
-
-
- 昵称
- 酷酷猛吃
+ {{ UserStore?.userInfo?.wechat }}
diff --git a/src/pages/webview/index.vue b/src/pages/webview/index.vue
new file mode 100644
index 0000000..63cf316
--- /dev/null
+++ b/src/pages/webview/index.vue
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
diff --git a/src/pinia/UserStore/index.js b/src/pinia/UserStore/index.js
index 3d9b870..d7f07cc 100644
--- a/src/pinia/UserStore/index.js
+++ b/src/pinia/UserStore/index.js
@@ -1,15 +1,31 @@
import {defineStore} from "pinia";
import {ref, reactive} from "vue";
+import {clearObject, toPage} from "../../utils/uils.js";
+import Api from "../../api/index.js";
export const useUserStore = defineStore('UserStore', () => {
const isLogin = ref(false);
const token = ref(null);
const userInfo = reactive({});
+ const logout = async () => {
+ isLogin.value = false;
+ token.value = null;
+ clearObject(userInfo);
+ await toPage("/pages/login/index");
+ }
+
+ const getUserInfo = async () => {
+ const {data} = await Api.system.getInfo();
+ Object.assign(userInfo, data);
+ }
+
return {
isLogin,
userInfo,
token,
+ logout,
+ getUserInfo,
}
}, {
persist: {
diff --git a/src/static/icons/Delete.png b/src/static/icons/Delete.png
new file mode 100644
index 0000000000000000000000000000000000000000..3156080b30e62829773c69b6efaf11586611b106
GIT binary patch
literal 3933
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
literal 0
HcmV?d00001
diff --git a/src/static/icons/down.png b/src/static/icons/down.png
new file mode 100644
index 0000000000000000000000000000000000000000..8fad31c9ffa65da5662d10385dd16c935c910f4e
GIT binary patch
literal 326
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
literal 0
HcmV?d00001
diff --git a/src/static/icons/plus.png b/src/static/icons/plus.png
new file mode 100644
index 0000000000000000000000000000000000000000..24e2b85458619bb5edf3027b3acd5e5cbe4c7a8f
GIT binary patch
literal 244
zcmeAS@N?(olHy`uVBq!ia0vp^#vshW1|+Q(8fXD2mSQK*5Dp-y;YjHK@>hGhIEG|2
zzP+)L^RR({+e7Pzl1;}ZexH!ec~iCe$m0sG*jXWcyPtgMuZ-6`*vanHdS}uVx!fIl
zzr9w?xi@cL+MGzEwt1}*p+{CIxrrLC>Iii0(Mk#tT-*f`nw8Z*&9FiwTkQDjt@1g4
z8t+d#F|(%0JJvWUBvva;E3x?4gY(&C|8EskPf5%^Hglfgm7f03^P!qC%*%HTkv(uQ
SDC0HI*$kepelF{r5}E*+OJJ!0
literal 0
HcmV?d00001
diff --git a/src/static/icons/prompt.png b/src/static/icons/prompt.png
new file mode 100644
index 0000000000000000000000000000000000000000..bb8f6e7a3933736010423fcf4602dbac64f42517
GIT binary patch
literal 936
zcmV;Z16TZsP)up5XeH1GrW+2aA)fs}BC7QpxJWU6Rs&@AB@xeLS5`T(R&TrlrV;|nYuSAK+4ujv^0gJPfeIq
zRDjr}T8-x*YNiPxL;<2^ql^?Kh$${+PDZ-qx0nZPPO$l5k|ziPEO-2C%sa${ka!!I
zkobHG=0{-@fa%ed`i;a-Xi7r?cFg|YrI98p(G@BrbnK9)mkF)*Ji4@m`Q?tUJz+B0
zfpL&%#qhyHQzD@C&;R&$6jZd~D}2-QtdTDAi?I}3w0R*zaKjk*)##20
zBwqjkBRN!Vxbwp#kk^=KOAzT?v*mVdLIvhCc&QSz^AIW_h0u(8gLa`I>R`1})D&4~
zR)GjNu$L1UYvVWJK)(HJ5z;G3Y7%d=UZ4bGg{w3>AB!*n)vohhdC>=S80fxc7Kj9l
zoj5nF<-ln@RFbxv6Z?T^x~~A2Yz82lw5@2UTm~YUxB|lZh=I;9HnsbTkrUgv+|?uk
zlvTDd*eS*fM7SA$UI~oDoEH8)?=({r#@2UC-9ja)Aryblayn9~&ZXy^uGU>)9(kOJ
z7JwZIdYZSZ#6IVH4zmjn$EFIE33M0y7U$ePM+`BG@M+}22pQpxYa@lPJ0@hi+B
zzS{G#CtQ2NwWNs`k?7Y4rSQ}UqXe}AgETMoThl=%o*H4yfrfc;+7VdFK!Df?LnVYI
zebs`a)@H^>a;{ps
z;Bc6;`YAzjfv8ltRObJn%h)~r6>
zvZ42&Ss?yjKQ##P3ad(CYOHK$3E;!e5w4vKe{KWVK33uMG5i7fu^q*`4XYaf0000<
KMNUMnLSTaMv8uEH
literal 0
HcmV?d00001
diff --git a/src/static/icons/sph.png b/src/static/icons/sph.png
new file mode 100644
index 0000000000000000000000000000000000000000..1cdb1492dbaf2f0212d36648f90c59cf81f15fa7
GIT binary patch
literal 4558
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
W27PaXojAe$2GCU1QTc*44fr2x6YK5(
literal 0
HcmV?d00001
diff --git a/src/static/icons/xhs.png b/src/static/icons/xhs.png
new file mode 100644
index 0000000000000000000000000000000000000000..e3c4cef7d48dacb2c73f1f3f0f058ffd27eb9fc4
GIT binary patch
literal 5156
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
literal 0
HcmV?d00001
diff --git a/src/utils/uils.js b/src/utils/uils.js
index b0e4106..1f67067 100644
--- a/src/utils/uils.js
+++ b/src/utils/uils.js
@@ -1,3 +1,6 @@
+import {BASEURL} from "./request.js";
+import {useUserStore} from "../pinia/UserStore/index.js";
+
export const showToast = (options) => {
if (typeof options === 'string') {
uni.showToast({
@@ -25,6 +28,12 @@ export const toPage = async (url) => {
}
}
+export const clearObject = (obj) => {
+ Object.keys(obj).forEach(key => {
+ delete obj[key];
+ });
+};
+
export const backPage = () => {
uni.navigateBack().then();
}
@@ -117,3 +126,38 @@ export const download = (urls) => {
});
// #endif
}
+
+export const numberToCharacter = (number) => {
+ return ['一', '二', '三', '四', '五'][number];
+}
+
+export const uploadFile = ({count}) => {
+ const UserStore = useUserStore();
+ return new Promise((resolve, reject) => {
+ uni.chooseImage({
+ count: count,
+ success: ({tempFilePaths}) => {
+ const file = tempFilePaths[0];
+ uni.uploadFile({
+ url: BASEURL + '/upload/upload',
+ filePath: file,
+ name: "file",
+ header: {
+ token: UserStore.token
+ },
+ success: ({data}) => {
+ resolve(JSON.parse(data));
+ },
+ fail: (err) => {
+ showToast(err.errMsg);
+ reject(err);
+ }
+ });
+ },
+ fail: (err) => {
+ showToast(err.errMsg);
+ reject(err);
+ }
+ });
+ });
+}