Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp
This commit is contained in:
210
Yi.Bbs.Vue3/src/assets/styles/login.css
Normal file
210
Yi.Bbs.Vue3/src/assets/styles/login.css
Normal file
@@ -0,0 +1,210 @@
|
|||||||
|
@charset "UTF-8";
|
||||||
|
* {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*公共CSS*/
|
||||||
|
.box {
|
||||||
|
width: 100vw;
|
||||||
|
height: 100vh;
|
||||||
|
background-color: #1d4359;
|
||||||
|
}
|
||||||
|
|
||||||
|
.box .content {
|
||||||
|
box-shadow: 0px 1px 6px #3b4859;
|
||||||
|
}
|
||||||
|
|
||||||
|
.box .content .login-wrapper h1 {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.box .content .login-wrapper .login-form .form-item {
|
||||||
|
margin: 20px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.box .content .login-wrapper .login-form .form-item span {
|
||||||
|
display: block;
|
||||||
|
margin: 5px 20px;
|
||||||
|
font-weight: 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
.box .content .login-wrapper .login-form .form-item .input-item {
|
||||||
|
width: 100%;
|
||||||
|
border-radius: 40px;
|
||||||
|
padding: 20px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
font-size: 20px;
|
||||||
|
font-weight: 200;
|
||||||
|
}
|
||||||
|
|
||||||
|
.box .content .login-wrapper .login-form .form-item .input-item:focus {
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.box .content .login-wrapper .login-form .login-btn {
|
||||||
|
width: 100%;
|
||||||
|
border-radius: 40px;
|
||||||
|
color: #fff;
|
||||||
|
border: 0;
|
||||||
|
font-weight: 100;
|
||||||
|
margin-top: 10px;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.box .content .login-wrapper .divider {
|
||||||
|
width: 100%;
|
||||||
|
margin: 20px 0;
|
||||||
|
text-align: center;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.box .content .login-wrapper .divider span:nth-child(1) {
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.box .content .login-wrapper .divider span:nth-child(3) {
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.box .content .login-wrapper .divider .line {
|
||||||
|
display: inline-block;
|
||||||
|
max-width: 30%;
|
||||||
|
width: 30%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.box .content .login-wrapper .divider .divider-text {
|
||||||
|
vertical-align: middle;
|
||||||
|
margin: 0px 20px;
|
||||||
|
line-height: 0px;
|
||||||
|
display: inline-block;
|
||||||
|
width: 100px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.box .content .login-wrapper .other-login-wrapper {
|
||||||
|
width: 100%;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.box .content .login-wrapper .other-login-item {
|
||||||
|
cursor: pointer;
|
||||||
|
border: 1px solid #d6dee4;
|
||||||
|
padding: 10px;
|
||||||
|
margin: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*一般大于手机的尺寸CSS*/
|
||||||
|
@media (min-width: 767px) {
|
||||||
|
.box {
|
||||||
|
background-color: #f0f2f5;
|
||||||
|
}
|
||||||
|
.box .content {
|
||||||
|
width: 85vw;
|
||||||
|
height: 90vh;
|
||||||
|
background: url("@/assets/login_images/login_two.jpg") no-repeat;
|
||||||
|
background-size: 90% 100%;
|
||||||
|
position: absolute;
|
||||||
|
right: 15%;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
border-radius: 20px;
|
||||||
|
background-color: #fff;
|
||||||
|
}
|
||||||
|
.box .content .login-wrapper {
|
||||||
|
width: 25vw;
|
||||||
|
position: absolute;
|
||||||
|
right: 15%;
|
||||||
|
top: 50%;
|
||||||
|
transform: translateY(-50%);
|
||||||
|
}
|
||||||
|
.box .content .login-wrapper h1 {
|
||||||
|
text-align: center;
|
||||||
|
font-size: 45px;
|
||||||
|
color: #516473;
|
||||||
|
margin-bottom: 40px;
|
||||||
|
}
|
||||||
|
.box .content .login-wrapper .login-form {
|
||||||
|
margin: 10px 0;
|
||||||
|
}
|
||||||
|
.box .content .login-wrapper .login-form .form-item span {
|
||||||
|
color: #516473;
|
||||||
|
}
|
||||||
|
.box .content .login-wrapper .login-form .form-item .input-item {
|
||||||
|
height: 60px;
|
||||||
|
border: 1px solid #d6dee4;
|
||||||
|
}
|
||||||
|
.box .content .login-wrapper .login-form .login-btn {
|
||||||
|
height: 50px;
|
||||||
|
background-color: #3b4859;
|
||||||
|
font-size: 20px;
|
||||||
|
}
|
||||||
|
.box .content .login-wrapper .divider .line {
|
||||||
|
border-bottom: 1px solid #d6dee4;
|
||||||
|
}
|
||||||
|
.box .content .login-wrapper .other-login-item {
|
||||||
|
border-radius: 20px;
|
||||||
|
}
|
||||||
|
.box .content .login-wrapper .other-login-item img {
|
||||||
|
cursor: pointer;
|
||||||
|
width: 40px;
|
||||||
|
height: 40px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*手机端CSS*/
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
.box .content {
|
||||||
|
width: 100vw;
|
||||||
|
height: 100vh;
|
||||||
|
background: url("@/assets/login_images/login_bg_phone.png") no-repeat;
|
||||||
|
background-size: 100% 100%;
|
||||||
|
display: flex;
|
||||||
|
align-items: flex-start;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
.box .content .login-wrapper {
|
||||||
|
width: 70%;
|
||||||
|
height: 60%;
|
||||||
|
padding-top: 15%;
|
||||||
|
}
|
||||||
|
.box .content .login-wrapper h1 {
|
||||||
|
font-size: 30px;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.box .content .login-wrapper .login-form .form-item {
|
||||||
|
margin: 10px 0;
|
||||||
|
}
|
||||||
|
.box .content .login-wrapper .login-form .form-item span {
|
||||||
|
color: #71818d;
|
||||||
|
}
|
||||||
|
.box .content .login-wrapper .login-form .form-item .input-item {
|
||||||
|
height: 30px;
|
||||||
|
border: 1px solid #71818d;
|
||||||
|
background-color: transparent;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.box .content .login-wrapper .login-form .login-btn {
|
||||||
|
height: 40px;
|
||||||
|
background-color: #eb5f5d;
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
.box .content .login-wrapper .divider .line {
|
||||||
|
border-bottom: 1px solid #fff;
|
||||||
|
}
|
||||||
|
.box .content .login-wrapper .divider .divider-text {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.box .content .login-wrapper .other-login-item {
|
||||||
|
border-radius: 15px;
|
||||||
|
}
|
||||||
|
.box .content .login-wrapper .other-login-item img {
|
||||||
|
cursor: pointer;
|
||||||
|
width: 35px;
|
||||||
|
height: 35px;
|
||||||
|
}
|
||||||
|
}
|
||||||
1
Yi.Bbs.Vue3/src/assets/styles/login.min.css
vendored
Normal file
1
Yi.Bbs.Vue3/src/assets/styles/login.min.css
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
*{margin:0;padding:0}.box{width:100vw;height:100vh;background-color:#1d4359}.box .content{box-shadow:0px 1px 6px #3b4859}.box .content .login-wrapper h1{text-align:center}.box .content .login-wrapper .login-form .form-item{margin:20px 0}.box .content .login-wrapper .login-form .form-item span{display:block;margin:5px 20px;font-weight:100}.box .content .login-wrapper .login-form .form-item .input-item{width:100%;border-radius:40px;padding:20px;box-sizing:border-box;font-size:20px;font-weight:200}.box .content .login-wrapper .login-form .form-item .input-item:focus{outline:none}.box .content .login-wrapper .login-form .login-btn{width:100%;border-radius:40px;color:#fff;border:0;font-weight:100;margin-top:10px;cursor:pointer}.box .content .login-wrapper .divider{width:100%;margin:20px 0;text-align:center;display:flex;align-items:center;justify-content:center}.box .content .login-wrapper .divider span:nth-child(1){flex:1}.box .content .login-wrapper .divider span:nth-child(3){flex:1}.box .content .login-wrapper .divider .line{display:inline-block;max-width:30%;width:30%}.box .content .login-wrapper .divider .divider-text{vertical-align:middle;margin:0px 20px;line-height:0px;display:inline-block;width:100px}.box .content .login-wrapper .other-login-wrapper{width:100%;display:flex;justify-content:center;align-items:center}.box .content .login-wrapper .other-login-item{cursor:pointer;border:1px solid #d6dee4;padding:10px;margin:10px}@media (min-width: 767px){.box{background-color:#f0f2f5}.box .content{width:85vw;height:90vh;background:url("@/assets/login_images/login_two.jpg") no-repeat;background-size:90% 100%;position:absolute;right:15%;top:50%;left:50%;transform:translate(-50%, -50%);border-radius:20px;background-color:#fff}.box .content .login-wrapper{width:25vw;position:absolute;right:15%;top:50%;transform:translateY(-50%)}.box .content .login-wrapper h1{text-align:center;font-size:45px;color:#516473;margin-bottom:40px}.box .content .login-wrapper .login-form{margin:10px 0}.box .content .login-wrapper .login-form .form-item span{color:#516473}.box .content .login-wrapper .login-form .form-item .input-item{height:60px;border:1px solid #d6dee4}.box .content .login-wrapper .login-form .login-btn{height:50px;background-color:#3b4859;font-size:20px}.box .content .login-wrapper .divider .line{border-bottom:1px solid #d6dee4}.box .content .login-wrapper .other-login-item{border-radius:20px}.box .content .login-wrapper .other-login-item img{cursor:pointer;width:40px;height:40px}}@media (max-width: 768px){.box .content{width:100vw;height:100vh;background:url("@/assets/login_images/login_bg_phone.png") no-repeat;background-size:100% 100%;display:flex;align-items:flex-start;justify-content:center}.box .content .login-wrapper{width:70%;height:60%;padding-top:15%}.box .content .login-wrapper h1{font-size:30px;color:#fff}.box .content .login-wrapper .login-form .form-item{margin:10px 0}.box .content .login-wrapper .login-form .form-item span{color:#71818d}.box .content .login-wrapper .login-form .form-item .input-item{height:30px;border:1px solid #71818d;background-color:transparent;color:#fff}.box .content .login-wrapper .login-form .login-btn{height:40px;background-color:#eb5f5d;font-size:16px}.box .content .login-wrapper .divider .line{border-bottom:1px solid #fff}.box .content .login-wrapper .divider .divider-text{color:#fff}.box .content .login-wrapper .other-login-item{border-radius:15px}.box .content .login-wrapper .other-login-item img{cursor:pointer;width:35px;height:35px}}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<el-badge :value="props.badge ?? ''" class="box-card">
|
<el-badge class="box-card">
|
||||||
<el-card shadow="never" :style="{ 'border-color': discuss.color }">
|
<el-card shadow="never" :style="{ 'border-color': discuss.color }">
|
||||||
<el-row>
|
<el-row>
|
||||||
<!-- 头部 -->
|
<!-- 头部 -->
|
||||||
@@ -69,6 +69,12 @@
|
|||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
</el-card>
|
</el-card>
|
||||||
|
<div class="pinned" v-if="props.badge">
|
||||||
|
<div class="icon">
|
||||||
|
<el-icon><Upload /></el-icon>
|
||||||
|
</div>
|
||||||
|
<div class="text">{{ props.badge ?? "" }}</div>
|
||||||
|
</div>
|
||||||
</el-badge>
|
</el-badge>
|
||||||
</template>
|
</template>
|
||||||
<script setup>
|
<script setup>
|
||||||
@@ -170,10 +176,28 @@ onMounted(() => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.box-card {
|
.box-card {
|
||||||
|
position: relative;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
min-height: 15rem;
|
min-height: 15rem;
|
||||||
/* right: calc(1px + var(--el-badge-size)/ 2) !important; */
|
/* right: calc(1px + var(--el-badge-size)/ 2) !important; */
|
||||||
/* top: 0 !important; */
|
/* top: 0 !important; */
|
||||||
|
.pinned {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
position: absolute;
|
||||||
|
top: 10px;
|
||||||
|
right: 10px;
|
||||||
|
padding: 5px 15px;
|
||||||
|
border-radius: 5px;
|
||||||
|
color: rgb(8, 119, 229);
|
||||||
|
background-color: #ecf5ff;
|
||||||
|
font-size: 14px;
|
||||||
|
.icon {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
margin-right: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.item-title {
|
.item-title {
|
||||||
|
|||||||
@@ -84,6 +84,7 @@ import useUserStore from "@/stores/user.js";
|
|||||||
import useConfigStore from "@/stores/config";
|
import useConfigStore from "@/stores/config";
|
||||||
import useAuths from "@/hooks/useAuths";
|
import useAuths from "@/hooks/useAuths";
|
||||||
import { Session } from "@/utils/storage";
|
import { Session } from "@/utils/storage";
|
||||||
|
import signalR from "@/utils/signalR";
|
||||||
|
|
||||||
const { getToken, clearStorage } = useAuths();
|
const { getToken, clearStorage } = useAuths();
|
||||||
const configStore = useConfigStore();
|
const configStore = useConfigStore();
|
||||||
@@ -103,6 +104,7 @@ const logout = async () => {
|
|||||||
}).then(async () => {
|
}).then(async () => {
|
||||||
//异步
|
//异步
|
||||||
await userStore.logOut();
|
await userStore.logOut();
|
||||||
|
await signalR.close();
|
||||||
//删除成功后,跳转到主页
|
//删除成功后,跳转到主页
|
||||||
router.push("/login");
|
router.push("/login");
|
||||||
ElMessage({
|
ElMessage({
|
||||||
|
|||||||
@@ -31,6 +31,14 @@ const router = createRouter({
|
|||||||
path: "/register",
|
path: "/register",
|
||||||
component: () => import("../views/Register.vue"),
|
component: () => import("../views/Register.vue"),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "qq",
|
||||||
|
path: "/qq",
|
||||||
|
component: () => import("../views/qqAuth/index.vue"),
|
||||||
|
meta: {
|
||||||
|
title: "QQ授权",
|
||||||
|
},
|
||||||
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -55,7 +63,7 @@ const router = createRouter({
|
|||||||
{
|
{
|
||||||
name: "discuss",
|
name: "discuss",
|
||||||
path: "/discuss/:plateId?/:isPublish?",
|
path: "/discuss/:plateId?/:isPublish?",
|
||||||
component: () => import("../views/Discuss.vue"),
|
component: () => import("../views/discuss/index.vue"),
|
||||||
meta: {
|
meta: {
|
||||||
title: "板块",
|
title: "板块",
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -14,10 +14,6 @@ const socketStore = defineStore("socket", {
|
|||||||
this.onlineNum = value;
|
this.onlineNum = value;
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
persist: {
|
|
||||||
key: "onlineInfo",
|
|
||||||
storage: window.sessionStorage,
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
|
|
||||||
export default socketStore;
|
export default socketStore;
|
||||||
|
|||||||
84
Yi.Bbs.Vue3/src/views/discuss/components/tabs.vue
Normal file
84
Yi.Bbs.Vue3/src/views/discuss/components/tabs.vue
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
<template>
|
||||||
|
<div class="tabs">
|
||||||
|
<div class="left">
|
||||||
|
<div
|
||||||
|
class="items"
|
||||||
|
v-for="item in leftList"
|
||||||
|
@click="handleClick(item)"
|
||||||
|
:class="[modelValue === item.name ? 'active-tab' : '']"
|
||||||
|
>
|
||||||
|
{{ item.label }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="center"></div>
|
||||||
|
<div class="right">
|
||||||
|
<template v-for="(item, index) in rightList">
|
||||||
|
<div
|
||||||
|
class="items"
|
||||||
|
@click="handleClick(item)"
|
||||||
|
:class="[modelValue === item.name ? 'active-tab' : '']"
|
||||||
|
>
|
||||||
|
{{ item.label }}
|
||||||
|
</div>
|
||||||
|
<div class="line" v-if="index < rightList.length - 1">|</div>
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { computed, defineProps, defineEmits } from "vue";
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
modelValue: {
|
||||||
|
type: String,
|
||||||
|
default: "",
|
||||||
|
},
|
||||||
|
tabList: {
|
||||||
|
type: Array,
|
||||||
|
default: () => [],
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const emit = defineEmits(["update:modelValue"], ["tab-change"]);
|
||||||
|
|
||||||
|
const leftList = computed(() =>
|
||||||
|
props.tabList.filter((item) => item.position === "left")
|
||||||
|
);
|
||||||
|
const rightList = computed(() =>
|
||||||
|
props.tabList.filter((item) => item.position === "right")
|
||||||
|
);
|
||||||
|
const handleClick = (item) => {
|
||||||
|
emit("update:modelValue", item.name);
|
||||||
|
emit("tab-change", item);
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
.tabs {
|
||||||
|
display: flex;
|
||||||
|
background-color: #fff;
|
||||||
|
padding: 1rem;
|
||||||
|
margin: 1rem 0rem;
|
||||||
|
color: #8c8c8c;
|
||||||
|
.left {
|
||||||
|
width: 100px;
|
||||||
|
}
|
||||||
|
.center {
|
||||||
|
flex: 3;
|
||||||
|
}
|
||||||
|
.right {
|
||||||
|
width: 200px;
|
||||||
|
display: flex;
|
||||||
|
.line {
|
||||||
|
margin: 0 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.items {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.active-tab {
|
||||||
|
color: #409eff;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -47,28 +47,10 @@
|
|||||||
</div>
|
</div>
|
||||||
</el-form>
|
</el-form>
|
||||||
</div>
|
</div>
|
||||||
|
<Tabs v-model="activeName" :tabList="tabList" @tab-change="handleClick" />
|
||||||
<el-tabs v-model="activeName" @tab-change="handleClick">
|
<div class="div-item" v-for="i in topDiscussList">
|
||||||
<el-tab-pane label="最新" name="new"> </el-tab-pane>
|
<DisscussCard :discuss="i" badge="置顶" />
|
||||||
<el-tab-pane label="推荐" name="suggest"> </el-tab-pane>
|
</div>
|
||||||
<el-tab-pane label="最热" name="host"> </el-tab-pane>
|
|
||||||
</el-tabs>
|
|
||||||
|
|
||||||
<el-collapse class="collapse-list" style="background-color: #f0f2f5">
|
|
||||||
<el-collapse-item>
|
|
||||||
<template #title>
|
|
||||||
<div class="collapse-top">
|
|
||||||
已置顶主题<el-icon class="header-icon">
|
|
||||||
<info-filled />
|
|
||||||
</el-icon>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
<div class="div-item" v-for="i in topDiscussList">
|
|
||||||
<DisscussCard :discuss="i" badge="置顶" />
|
|
||||||
</div>
|
|
||||||
</el-collapse-item>
|
|
||||||
</el-collapse>
|
|
||||||
<el-divider v-show="topDiscussList.length > 0" />
|
|
||||||
<template v-if="isDiscussFinished">
|
<template v-if="isDiscussFinished">
|
||||||
<div class="div-item" v-for="i in discussList">
|
<div class="div-item" v-for="i in discussList">
|
||||||
<DisscussCard :discuss="i" />
|
<DisscussCard :discuss="i" />
|
||||||
@@ -77,6 +59,9 @@
|
|||||||
<template v-else>
|
<template v-else>
|
||||||
<Skeleton :isBorder="true" />
|
<Skeleton :isBorder="true" />
|
||||||
</template>
|
</template>
|
||||||
|
<div class="div-item" v-for="i in discussList">
|
||||||
|
<DisscussCard :discuss="i" />
|
||||||
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<el-pagination
|
<el-pagination
|
||||||
v-model:current-page="query.skipCount"
|
v-model:current-page="query.skipCount"
|
||||||
@@ -113,12 +98,13 @@ import { getPermission } from "@/utils/auth";
|
|||||||
import useAuths from "@/hooks/useAuths";
|
import useAuths from "@/hooks/useAuths";
|
||||||
import { Session } from "@/utils/storage";
|
import { Session } from "@/utils/storage";
|
||||||
import Skeleton from "@/components/Skeleton/index.vue";
|
import Skeleton from "@/components/Skeleton/index.vue";
|
||||||
|
import Tabs from "./components/tabs.vue";
|
||||||
|
|
||||||
const { getToken, clearStorage } = useAuths();
|
const { getToken, clearStorage } = useAuths();
|
||||||
//数据定义
|
//数据定义
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const activeName = ref("new");
|
const activeName = ref("suggest");
|
||||||
//主题内容
|
//主题内容
|
||||||
const discussList = ref([]);
|
const discussList = ref([]);
|
||||||
const isDiscussFinished = ref(false);
|
const isDiscussFinished = ref(false);
|
||||||
@@ -133,7 +119,7 @@ const query = reactive({
|
|||||||
type: activeName.value,
|
type: activeName.value,
|
||||||
});
|
});
|
||||||
|
|
||||||
const handleClick = async (tab, event) => {
|
const handleClick = async (item) => {
|
||||||
query.type = activeName.value;
|
query.type = activeName.value;
|
||||||
await loadDiscussList();
|
await loadDiscussList();
|
||||||
};
|
};
|
||||||
@@ -212,6 +198,12 @@ watch(
|
|||||||
},
|
},
|
||||||
{ immediate: true }
|
{ immediate: true }
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const tabList = ref([
|
||||||
|
{ label: "全部文章", name: "suggest", position: "left" },
|
||||||
|
{ label: "最新", name: "new", position: "right" },
|
||||||
|
{ label: "最热", name: "host", position: "right" },
|
||||||
|
]);
|
||||||
</script>
|
</script>
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
.discuss-box {
|
.discuss-box {
|
||||||
@@ -235,6 +227,10 @@ watch(
|
|||||||
padding: 1rem;
|
padding: 1rem;
|
||||||
margin: 1rem 0rem;
|
margin: 1rem 0rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.header-tab {
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
.collapse-top {
|
.collapse-top {
|
||||||
padding-left: 2rem;
|
padding-left: 2rem;
|
||||||
}
|
}
|
||||||
@@ -278,6 +274,7 @@ watch(
|
|||||||
margin: 0.5rem 0;
|
margin: 0.5rem 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 禁用状态下的样式 */
|
/* 禁用状态下的样式 */
|
||||||
.el-button.el-button--disabled {
|
.el-button.el-button--disabled {
|
||||||
opacity: 0.6;
|
opacity: 0.6;
|
||||||
@@ -139,7 +139,7 @@
|
|||||||
<div>其他方式登录</div>
|
<div>其他方式登录</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="icon-list">
|
<div class="icon-list">
|
||||||
<div class="icon">
|
<div class="icon" @click="handleQQLogin">
|
||||||
<img src="@/assets/login_images/QQ.png" alt="" />
|
<img src="@/assets/login_images/QQ.png" alt="" />
|
||||||
</div>
|
</div>
|
||||||
<div class="icon">
|
<div class="icon">
|
||||||
@@ -302,6 +302,14 @@ onMounted(async () => {
|
|||||||
const handleContact = () => {
|
const handleContact = () => {
|
||||||
router.push("/contact");
|
router.push("/contact");
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const handleQQLogin = () => {
|
||||||
|
window.open(
|
||||||
|
"https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=101951505&redirect_uri=https://ccnetcore.com/qq&state=true&scope=get_user_info",
|
||||||
|
undefined,
|
||||||
|
"width=500,height=500,left=50,top=50"
|
||||||
|
);
|
||||||
|
};
|
||||||
</script>
|
</script>
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
.login {
|
.login {
|
||||||
@@ -425,6 +433,7 @@ const handleContact = () => {
|
|||||||
display: flex;
|
display: flex;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
.icon {
|
.icon {
|
||||||
|
cursor: pointer;
|
||||||
width: 25px;
|
width: 25px;
|
||||||
height: 25px;
|
height: 25px;
|
||||||
margin: 0 10px;
|
margin: 0 10px;
|
||||||
|
|||||||
34
Yi.Bbs.Vue3/src/views/qqAuth/index.vue
Normal file
34
Yi.Bbs.Vue3/src/views/qqAuth/index.vue
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
<template>
|
||||||
|
<div class="message">{{ message }}</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { ref, watch } from "vue";
|
||||||
|
import { useRoute } from "vue-router";
|
||||||
|
|
||||||
|
const route = useRoute();
|
||||||
|
|
||||||
|
const code = ref(route.query.code);
|
||||||
|
|
||||||
|
const message = ref("");
|
||||||
|
watch(
|
||||||
|
() => code.value,
|
||||||
|
(val) => {
|
||||||
|
if (val) {
|
||||||
|
message.value = "授权成功";
|
||||||
|
// window.close();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ immediate: true }
|
||||||
|
);
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
.message {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
font-size: 20px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
Reference in New Issue
Block a user