feat: 新增 pinia 状态管理
This commit is contained in:
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="37.07" height="36" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 198"><path fill="#41B883" d="M204.8 0H256L128 220.8L0 0h97.92L128 51.2L157.44 0h47.36Z"></path><path fill="#41B883" d="m0 0l128 220.8L256 0h-51.2L128 132.48L50.56 0H0Z"></path><path fill="#35495E" d="M50.56 0L128 133.12L204.8 0h-47.36L128 51.2L97.92 0H50.56Z"></path></svg>
|
||||||
|
After Width: | Height: | Size: 496 B |
@@ -0,0 +1,66 @@
|
|||||||
|
<template>
|
||||||
|
<div class="hello-world">
|
||||||
|
<h1>{{ msg }}</h1>
|
||||||
|
<div class="card">
|
||||||
|
<el-button type="primary" @click="count++">
|
||||||
|
点击次数: {{ count }}
|
||||||
|
</el-button>
|
||||||
|
<p class="mt-3">
|
||||||
|
这是一个使用 Element Plus 的示例组件
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="links mt-4">
|
||||||
|
<el-link href="https://vuejs.org/" target="_blank" type="primary">
|
||||||
|
Vue.js 官网
|
||||||
|
</el-link>
|
||||||
|
<el-link href="https://element-plus.org/" target="_blank" type="success">
|
||||||
|
Element Plus 官网
|
||||||
|
</el-link>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { ref } from 'vue'
|
||||||
|
|
||||||
|
defineProps({
|
||||||
|
msg: {
|
||||||
|
type: String,
|
||||||
|
default: 'Hello Vue 3 + Vite'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const count = ref(0)
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
@use '@/styles/variables.scss' as *;
|
||||||
|
|
||||||
|
.hello-world {
|
||||||
|
text-align: center;
|
||||||
|
padding: 2rem;
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
color: #2c3e50;
|
||||||
|
margin-bottom: 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card {
|
||||||
|
background: white;
|
||||||
|
padding: 2rem;
|
||||||
|
border-radius: 8px;
|
||||||
|
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
|
||||||
|
margin-bottom: 2rem;
|
||||||
|
|
||||||
|
p {
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.links {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
gap: 1rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
import { defineStore } from 'pinia'
|
||||||
|
import { ref } from 'vue'
|
||||||
|
|
||||||
|
export const useAccountStore = defineStore('account', () => {
|
||||||
|
// 存储所有账号信息
|
||||||
|
const accounts = ref([])
|
||||||
|
|
||||||
|
// 平台类型映射
|
||||||
|
const platformTypes = {
|
||||||
|
1: '小红书',
|
||||||
|
2: '视频号',
|
||||||
|
3: '抖音',
|
||||||
|
4: '快手'
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置账号列表
|
||||||
|
const setAccounts = (accountsData) => {
|
||||||
|
// 转换后端返回的数据格式为前端使用的格式
|
||||||
|
accounts.value = accountsData.map(item => {
|
||||||
|
return {
|
||||||
|
id: item[0],
|
||||||
|
type: item[1],
|
||||||
|
filePath: item[2],
|
||||||
|
name: item[3],
|
||||||
|
status: item[4] === 1 ? '正常' : '异常',
|
||||||
|
platform: platformTypes[item[1]] || '未知',
|
||||||
|
avatar: '/vite.svg' // 默认使用vite.svg作为头像
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 添加账号
|
||||||
|
const addAccount = (account) => {
|
||||||
|
accounts.value.push(account)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新账号
|
||||||
|
const updateAccount = (id, updatedAccount) => {
|
||||||
|
const index = accounts.value.findIndex(acc => acc.id === id)
|
||||||
|
if (index !== -1) {
|
||||||
|
accounts.value[index] = { ...accounts.value[index], ...updatedAccount }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除账号
|
||||||
|
const deleteAccount = (id) => {
|
||||||
|
accounts.value = accounts.value.filter(acc => acc.id !== id)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 根据平台获取账号
|
||||||
|
const getAccountsByPlatform = (platform) => {
|
||||||
|
return accounts.value.filter(acc => acc.platform === platform)
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
accounts,
|
||||||
|
setAccounts,
|
||||||
|
addAccount,
|
||||||
|
updateAccount,
|
||||||
|
deleteAccount,
|
||||||
|
getAccountsByPlatform
|
||||||
|
}
|
||||||
|
})
|
||||||
@@ -0,0 +1,69 @@
|
|||||||
|
import { defineStore } from 'pinia'
|
||||||
|
import { ref } from 'vue'
|
||||||
|
|
||||||
|
export const useAppStore = defineStore('app', () => {
|
||||||
|
// 是否是第一次进入账号管理页面
|
||||||
|
const isFirstTimeAccountManagement = ref(true)
|
||||||
|
|
||||||
|
// 是否是第一次进入素材管理页面
|
||||||
|
const isFirstTimeMaterialManagement = ref(true)
|
||||||
|
|
||||||
|
// 账号管理页面刷新状态
|
||||||
|
const isAccountRefreshing = ref(false)
|
||||||
|
|
||||||
|
// 素材列表数据
|
||||||
|
const materials = ref([])
|
||||||
|
|
||||||
|
// 设置账号管理页面已访问
|
||||||
|
const setAccountManagementVisited = () => {
|
||||||
|
isFirstTimeAccountManagement.value = false
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置素材管理页面已访问
|
||||||
|
const setMaterialManagementVisited = () => {
|
||||||
|
isFirstTimeMaterialManagement.value = false
|
||||||
|
}
|
||||||
|
|
||||||
|
// 重置所有访问状态(用于重新登录或刷新应用时)
|
||||||
|
const resetVisitStatus = () => {
|
||||||
|
isFirstTimeAccountManagement.value = true
|
||||||
|
isFirstTimeMaterialManagement.value = true
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新素材列表
|
||||||
|
const setMaterials = (materialList) => {
|
||||||
|
materials.value = materialList
|
||||||
|
}
|
||||||
|
|
||||||
|
// 添加新素材
|
||||||
|
const addMaterial = (material) => {
|
||||||
|
materials.value.push(material)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除素材
|
||||||
|
const removeMaterial = (materialId) => {
|
||||||
|
const index = materials.value.findIndex(m => m.id === materialId)
|
||||||
|
if (index > -1) {
|
||||||
|
materials.value.splice(index, 1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置账号管理页面刷新状态
|
||||||
|
const setAccountRefreshing = (status) => {
|
||||||
|
isAccountRefreshing.value = status
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
isFirstTimeAccountManagement,
|
||||||
|
isFirstTimeMaterialManagement,
|
||||||
|
isAccountRefreshing,
|
||||||
|
materials,
|
||||||
|
setAccountManagementVisited,
|
||||||
|
setMaterialManagementVisited,
|
||||||
|
resetVisitStatus,
|
||||||
|
setMaterials,
|
||||||
|
addMaterial,
|
||||||
|
removeMaterial,
|
||||||
|
setAccountRefreshing
|
||||||
|
}
|
||||||
|
})
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
import { createPinia } from 'pinia'
|
||||||
|
import { useUserStore } from './user'
|
||||||
|
import { useAccountStore } from './account'
|
||||||
|
import { useAppStore } from './app'
|
||||||
|
|
||||||
|
const pinia = createPinia()
|
||||||
|
|
||||||
|
export default pinia
|
||||||
|
export { useUserStore, useAccountStore, useAppStore }
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
import { defineStore } from 'pinia'
|
||||||
|
import { ref } from 'vue'
|
||||||
|
|
||||||
|
export const useUserStore = defineStore('user', () => {
|
||||||
|
const userInfo = ref({
|
||||||
|
name: '',
|
||||||
|
email: ''
|
||||||
|
})
|
||||||
|
|
||||||
|
const isLoggedIn = ref(false)
|
||||||
|
|
||||||
|
const setUserInfo = (info) => {
|
||||||
|
userInfo.value = info
|
||||||
|
isLoggedIn.value = true
|
||||||
|
}
|
||||||
|
|
||||||
|
const logout = () => {
|
||||||
|
userInfo.value = {
|
||||||
|
name: '',
|
||||||
|
email: ''
|
||||||
|
}
|
||||||
|
isLoggedIn.value = false
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
userInfo,
|
||||||
|
isLoggedIn,
|
||||||
|
setUserInfo,
|
||||||
|
logout
|
||||||
|
}
|
||||||
|
})
|
||||||
Reference in New Issue
Block a user