generated from wzp/v3-admin-vite
feat: adding
This commit is contained in:
parent
faf0ea874d
commit
280ba2291e
@ -5,7 +5,7 @@ NODE_ENV = development
|
|||||||
|
|
||||||
## 后端接口公共路径(如果解决跨域问题采用反向代理就只需写公共路径)
|
## 后端接口公共路径(如果解决跨域问题采用反向代理就只需写公共路径)
|
||||||
# VITE_BASE_API = 'http://192.168.1.1:8001'
|
# VITE_BASE_API = 'http://192.168.1.1:8001'
|
||||||
VITE_BASE_API = 'http://wzpmc.cn:8002'
|
VITE_BASE_API = 'http://127.0.0.1:8001'
|
||||||
|
|
||||||
## 路由模式 hash 或 html5
|
## 路由模式 hash 或 html5
|
||||||
VITE_ROUTER_HISTORY = 'hash'
|
VITE_ROUTER_HISTORY = 'hash'
|
||||||
|
@ -1,18 +1,19 @@
|
|||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { computed, onMounted, ref } from "vue"
|
import { computed, onMounted, onUnmounted, ref } from "vue"
|
||||||
import { useRoute, useRouter } from "vue-router"
|
import { useRoute, useRouter } from "vue-router"
|
||||||
import { useTagsViewStore } from "@/store/modules/tags-view"
|
import { useTagsViewStore } from "@/store/modules/tags-view"
|
||||||
import { ElCountdown, ElMessage, FormInstance, FormRules } from "element-plus"
|
import { ElMessage, FormInstance, FormRules } from "element-plus"
|
||||||
import { useUserStore } from "@/store/modules/user"
|
import { useUserStore } from "@/store/modules/user"
|
||||||
import { verify } from "@/api/users"
|
import { getToken } from "@/utils/cache/cookies"
|
||||||
|
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
const tagsViewStore = useTagsViewStore()
|
const tagsViewStore = useTagsViewStore()
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
const user = useUserStore()
|
const user = useUserStore()
|
||||||
const valueTime = ref<number>(new Date().getTime() + 1000000000)
|
|
||||||
const storeInformation = ref<{ name: string; phone: string }>({ name: "", phone: "00000000000" })
|
const storeInformation = ref<{ name: string; phone: string }>({ name: "", phone: "00000000000" })
|
||||||
const storeInformationForm = ref<FormInstance>()
|
const storeInformationForm = ref<FormInstance>()
|
||||||
|
const need = ref<boolean>(false)
|
||||||
|
const waiting = ref<boolean>(false)
|
||||||
|
|
||||||
const key = computed(() => {
|
const key = computed(() => {
|
||||||
return route.path
|
return route.path
|
||||||
@ -28,34 +29,78 @@ const valueRules: FormRules = {
|
|||||||
{ len: 11, message: "手机号长度为11", trigger: "blur" }
|
{ len: 11, message: "手机号长度为11", trigger: "blur" }
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
const finished = () => {
|
|
||||||
ElMessage.error("超时未添加店铺信息!")
|
|
||||||
user.logout()
|
|
||||||
router.push("/login")
|
|
||||||
}
|
|
||||||
const upload = () => {
|
const upload = () => {
|
||||||
if (!storeInformationForm.value?.validate()) {
|
if (!storeInformationForm.value?.validate()) {
|
||||||
ElMessage.error("数据存在错误!")
|
ElMessage.error("数据存在错误!")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
verify(Number.parseInt(user.token), storeInformation.value.name, storeInformation.value.phone)
|
webSocket.value?.send(
|
||||||
.then(() => {
|
JSON.stringify({
|
||||||
ElMessage.success("上传成功,等待管理员审核!")
|
type: "addVerifyInfo",
|
||||||
})
|
verifyName: storeInformation.value.name,
|
||||||
.catch((err) => {
|
verifyPhone: storeInformation.value.phone
|
||||||
ElMessage.error("上传失败,请重试!")
|
|
||||||
console.log(err)
|
|
||||||
})
|
})
|
||||||
|
)
|
||||||
|
ElMessage.warning("正在上传,请稍后...")
|
||||||
}
|
}
|
||||||
|
const webSocket = ref<WebSocket>()
|
||||||
|
const timerId = ref<number>()
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
valueTime.value = new Date().getTime() + (user.countdown as number) * 1000
|
if (user.roleId === 5) {
|
||||||
|
webSocket.value = new WebSocket(
|
||||||
|
import.meta.env.VITE_BASE_API.replace("http", "ws").replace("https", "wss") + "/api/auth/websocket/" + getToken()
|
||||||
|
)
|
||||||
|
webSocket.value.onclose = () => {
|
||||||
|
ElMessage.error("WebSocket连接被顿开,已登出,请尝试重新登录或联系网站管理员!")
|
||||||
|
user.logout()
|
||||||
|
router.push("/login")
|
||||||
|
}
|
||||||
|
webSocket.value.onmessage = (evt: MessageEvent) => {
|
||||||
|
const data = JSON.parse(evt.data)
|
||||||
|
console.log(data)
|
||||||
|
if (data.data.info == "pong") {
|
||||||
|
if (data.data.time == -2) {
|
||||||
|
if (!need.value) {
|
||||||
|
ElMessage.warning("请提交店铺消息!")
|
||||||
|
need.value = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (data.data.info == "验证信息添加成功,请耐心等待管理员审核") {
|
||||||
|
ElMessage.success(data.data.info)
|
||||||
|
waiting.value = true
|
||||||
|
}
|
||||||
|
if (data.data.info == "管理员未同意你的验证信息,你可以重新进行验证") {
|
||||||
|
ElMessage.error(data.data.info)
|
||||||
|
waiting.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
webSocket.value.onerror = (evt) => {
|
||||||
|
console.log(evt)
|
||||||
|
ElMessage.error("WebSocket连接出现错误,已自动断开并登出,请尝试重新登录或联系网站管理员!")
|
||||||
|
if (!webSocket.value?.CLOSING) {
|
||||||
|
webSocket.value?.close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
timerId.value = window.setInterval(() => {
|
||||||
|
webSocket.value?.send(JSON.stringify({ type: "ping" }))
|
||||||
|
webSocket.value?.send(JSON.stringify({ type: "getTime" }))
|
||||||
|
}, 1000)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
onUnmounted(() => {
|
||||||
|
if (!webSocket.value?.CLOSING) {
|
||||||
|
webSocket.value?.close()
|
||||||
|
}
|
||||||
|
if (timerId.value) {
|
||||||
|
window.clearInterval(timerId.value)
|
||||||
|
}
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<section class="app-main">
|
<section class="app-main">
|
||||||
<div v-if="(user.countdown as number) >= 0" style="margin: 10px 10px 10px 10px">
|
<div v-if="user.roleId === 5 && need && false" style="margin: 10px 10px 10px 10px">
|
||||||
<el-countdown title="你需要在时间范围内添加店铺信息" :value="valueTime" :rules="valueRules" @finish="finished" />
|
|
||||||
<div style="width: 30%; margin-top: 10px">
|
<div style="width: 30%; margin-top: 10px">
|
||||||
<el-form :model="storeInformation" :rules="valueRules" title="店铺信息" ref="storeInformationForm">
|
<el-form :model="storeInformation" :rules="valueRules" title="店铺信息" ref="storeInformationForm">
|
||||||
<el-form-item prop="name" label="店铺名称">
|
<el-form-item prop="name" label="店铺名称">
|
||||||
@ -66,7 +111,7 @@ onMounted(() => {
|
|||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
</div>
|
</div>
|
||||||
<el-button type="success" @click="upload">提交</el-button>
|
<el-button type="success" :disabled="waiting" @click="upload">提交</el-button>
|
||||||
</div>
|
</div>
|
||||||
<router-view v-slot="{ Component }" v-else>
|
<router-view v-slot="{ Component }" v-else>
|
||||||
<transition name="fade-transform" mode="out-in">
|
<transition name="fade-transform" mode="out-in">
|
||||||
|
@ -108,6 +108,9 @@ export const asyncRoutes: RouteRecordRaw[] = [
|
|||||||
path: "/store",
|
path: "/store",
|
||||||
component: Layout,
|
component: Layout,
|
||||||
redirect: "/store",
|
redirect: "/store",
|
||||||
|
meta: {
|
||||||
|
roles: ["add:store", "show:store"]
|
||||||
|
},
|
||||||
children: [
|
children: [
|
||||||
{
|
{
|
||||||
path: "store",
|
path: "store",
|
||||||
|
@ -9,7 +9,7 @@ import { loginApi } from "@/api/login"
|
|||||||
import { type ILoginRequestData } from "@/api/login/types/login"
|
import { type ILoginRequestData } from "@/api/login/types/login"
|
||||||
import { type RouteRecordRaw } from "vue-router"
|
import { type RouteRecordRaw } from "vue-router"
|
||||||
import asyncRouteSettings from "@/config/async-route"
|
import asyncRouteSettings from "@/config/async-route"
|
||||||
import { getUserInfoApi, getRemainderTime } from "@/api/users"
|
import { getUserInfoApi } from "@/api/users"
|
||||||
|
|
||||||
export const useUserStore = defineStore("user", () => {
|
export const useUserStore = defineStore("user", () => {
|
||||||
/** Token即用户id */
|
/** Token即用户id */
|
||||||
@ -17,7 +17,6 @@ export const useUserStore = defineStore("user", () => {
|
|||||||
const roles = ref<string[]>([])
|
const roles = ref<string[]>([])
|
||||||
const username = ref<string>("")
|
const username = ref<string>("")
|
||||||
const roleId = ref<number>(-1)
|
const roleId = ref<number>(-1)
|
||||||
const countdown = ref<number>()
|
|
||||||
|
|
||||||
const permissionStore = usePermissionStore()
|
const permissionStore = usePermissionStore()
|
||||||
const tagsViewStore = useTagsViewStore()
|
const tagsViewStore = useTagsViewStore()
|
||||||
@ -32,7 +31,7 @@ export const useUserStore = defineStore("user", () => {
|
|||||||
loginApi(loginData)
|
loginApi(loginData)
|
||||||
.then((res) => {
|
.then((res) => {
|
||||||
if (res.status == 202) {
|
if (res.status == 202) {
|
||||||
setToken("null1")
|
setToken(res.data.data.id.toString())
|
||||||
resolve(res.data.data)
|
resolve(res.data.data)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -61,11 +60,6 @@ export const useUserStore = defineStore("user", () => {
|
|||||||
// 塞入一个没有任何作用的默认角色,不然路由守卫逻辑会无限循环
|
// 塞入一个没有任何作用的默认角色,不然路由守卫逻辑会无限循环
|
||||||
roles.value = asyncRouteSettings.defaultRoles
|
roles.value = asyncRouteSettings.defaultRoles
|
||||||
}
|
}
|
||||||
if (roleId.value == 5) {
|
|
||||||
getRemainderTime(Number.parseInt(res.data.data.id)).then((response) => {
|
|
||||||
countdown.value = response.data.data.remainderTime
|
|
||||||
})
|
|
||||||
}
|
|
||||||
resolve(res)
|
resolve(res)
|
||||||
})
|
})
|
||||||
.catch((error) => {
|
.catch((error) => {
|
||||||
@ -118,8 +112,7 @@ export const useUserStore = defineStore("user", () => {
|
|||||||
logout,
|
logout,
|
||||||
resetToken,
|
resetToken,
|
||||||
hasRole,
|
hasRole,
|
||||||
roleId,
|
roleId
|
||||||
countdown
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -47,19 +47,73 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="orderAction">
|
<div class="orderAction">
|
||||||
<el-button type="warning" @click="submit">添加</el-button>
|
<el-button type="warning" @click="submit">添加</el-button>
|
||||||
|
<el-button type="danger" @click="showUploadDialog = true">批量上传</el-button>
|
||||||
</div>
|
</div>
|
||||||
|
<el-dialog v-model="showUploadDialog" title="批量上传" width="50%">
|
||||||
|
<div v-if="step == 1">
|
||||||
|
<el-text>第一步·下载模板</el-text>
|
||||||
|
<div>
|
||||||
|
<el-link :href="templateUrl">点我下载模板</el-link>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-if="step == 2">
|
||||||
|
<el-text>第二步·上传数据</el-text>
|
||||||
|
<el-upload
|
||||||
|
drag
|
||||||
|
ref="upload"
|
||||||
|
:action="actionUrl"
|
||||||
|
:limit="1"
|
||||||
|
:on-exceed="handleExceed"
|
||||||
|
:auto-upload="false"
|
||||||
|
:with-credentials="true"
|
||||||
|
>
|
||||||
|
<el-icon><upload-filled /></el-icon>
|
||||||
|
<div>将文件拖到这里,或者 <em>点击这里以上传</em></div>
|
||||||
|
</el-upload>
|
||||||
|
</div>
|
||||||
|
<template #footer>
|
||||||
|
<span class="dialog-footer">
|
||||||
|
<el-button
|
||||||
|
@click="
|
||||||
|
() => {
|
||||||
|
showUploadDialog = false
|
||||||
|
step = 1
|
||||||
|
}
|
||||||
|
"
|
||||||
|
>取消</el-button
|
||||||
|
>
|
||||||
|
<el-button type="success" v-if="step > 1" @click="step -= 1">上一步</el-button>
|
||||||
|
<el-button type="primary" v-if="step < 2" @click="step += 1">下一步</el-button>
|
||||||
|
<el-button type="danger" v-if="step == 2" @click="confirmData">确认</el-button>
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
</el-dialog>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { onMounted, ref, watch } from "vue"
|
import { onMounted, ref, watch } from "vue"
|
||||||
import { IOrder } from "@/api/order/types/order"
|
import { IOrder } from "@/api/order/types/order"
|
||||||
import { ElLoading, ElMessage, FormInstance, FormRules } from "element-plus"
|
import {
|
||||||
|
ElLoading,
|
||||||
|
ElMessage,
|
||||||
|
FormInstance,
|
||||||
|
FormRules,
|
||||||
|
genFileId,
|
||||||
|
UploadInstance,
|
||||||
|
UploadProps,
|
||||||
|
UploadRawFile
|
||||||
|
} from "element-plus"
|
||||||
import { addOrderApi, getOrderUserInfoApi } from "@/api/order"
|
import { addOrderApi, getOrderUserInfoApi } from "@/api/order"
|
||||||
import { LoadingInstance } from "element-plus/es/components/loading/src/loading"
|
import { LoadingInstance } from "element-plus/es/components/loading/src/loading"
|
||||||
import { IStore } from "@/api/store/types/store"
|
import { IStore } from "@/api/store/types/store"
|
||||||
import { getAllStoreApi } from "@/api/store"
|
import { getAllStoreApi } from "@/api/store"
|
||||||
|
const templateUrl = ref<string>(import.meta.env.VITE_BASE_API + "/order/downloadTemplate")
|
||||||
|
const actionUrl = ref<string>(import.meta.env.VITE_BASE_API + "/order/uploadBatch")
|
||||||
|
const upload = ref<UploadInstance>()
|
||||||
const loading = ref<LoadingInstance>()
|
const loading = ref<LoadingInstance>()
|
||||||
|
const showUploadDialog = ref<boolean>(false)
|
||||||
|
const step = ref<number>(1)
|
||||||
const form = ref<IOrder>({
|
const form = ref<IOrder>({
|
||||||
orderNo: "",
|
orderNo: "",
|
||||||
wangNo: "",
|
wangNo: "",
|
||||||
@ -162,6 +216,16 @@ onMounted(() => {
|
|||||||
ElMessage.error("获取店铺失败!")
|
ElMessage.error("获取店铺失败!")
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
const confirmData = () => {
|
||||||
|
upload.value!.submit()
|
||||||
|
ElMessage.success("上传成功!")
|
||||||
|
}
|
||||||
|
const handleExceed: UploadProps["onExceed"] = (files) => {
|
||||||
|
upload.value!.clearFiles()
|
||||||
|
const file = files[0] as UploadRawFile
|
||||||
|
file.uid = genFileId()
|
||||||
|
upload.value!.handleStart(file)
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
|
@ -1,12 +0,0 @@
|
|||||||
<script lang="ts" setup>
|
|
||||||
import { useRoute, useRouter } from "vue-router"
|
|
||||||
|
|
||||||
const route = useRoute()
|
|
||||||
const router = useRouter()
|
|
||||||
|
|
||||||
router.replace({ path: "/" + route.params.path, query: route.query })
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<div />
|
|
||||||
</template>
|
|
@ -224,7 +224,7 @@ const handleChangePage = () => {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
if (user.roleId === 4) {
|
if (user.roleId === 4) {
|
||||||
getVerifyMessage(Number.parseInt(user.token)).then((response) => {
|
getVerifyMessage(Number.parseInt(getToken()!)).then((response) => {
|
||||||
for (const datum of response.data.data) {
|
for (const datum of response.data.data) {
|
||||||
for (const valueElement of showTableData.value) {
|
for (const valueElement of showTableData.value) {
|
||||||
if (valueElement.id === datum.storeId) {
|
if (valueElement.id === datum.storeId) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user