|
@@ -0,0 +1,174 @@
|
|
|
+import { css, cx } from "@linaria/core";
|
|
|
+import { useAuth } from "@queenjs-modules/auth";
|
|
|
+import {
|
|
|
+ IconCamera,
|
|
|
+ IconDashboard,
|
|
|
+ IconDownload,
|
|
|
+ IconSettings
|
|
|
+} from "@queenjs/icons";
|
|
|
+import { Avatar, Divider } from "ant-design-vue";
|
|
|
+import { defineComponent } from "vue";
|
|
|
+import { array, object } from "vue-types";
|
|
|
+
|
|
|
+export default defineComponent({
|
|
|
+ setup() {
|
|
|
+ const auth = useAuth();
|
|
|
+
|
|
|
+ const footerOptions: TextListProps[] = [
|
|
|
+ {
|
|
|
+ label: "退出",
|
|
|
+ icon: IconDownload,
|
|
|
+ onClick: auth.actions.logout,
|
|
|
+ },
|
|
|
+ ];
|
|
|
+ const menuOptions = [
|
|
|
+ {
|
|
|
+ link: "/workbench/design",
|
|
|
+ label: "我的推广",
|
|
|
+ icon: IconDashboard,
|
|
|
+ suffix: "7",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ link: "/workstage/material",
|
|
|
+ label: "我的素材",
|
|
|
+ icon: IconCamera,
|
|
|
+ suffix: "32",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ link: "/settings",
|
|
|
+ label: "设置",
|
|
|
+ icon: IconSettings,
|
|
|
+ },
|
|
|
+ ];
|
|
|
+ return () => {
|
|
|
+ const { userInfo } = auth.store;
|
|
|
+
|
|
|
+ return (
|
|
|
+ <div class={cx(rootStyles, "p-30px h-1/1 flex flex-col")}>
|
|
|
+ <div class="mt-20px">
|
|
|
+ <router-link to="/">
|
|
|
+ <img
|
|
|
+ class="w-150px"
|
|
|
+ src={require("@/assets/imgs/Logo.png")}
|
|
|
+ alt=""
|
|
|
+ />
|
|
|
+ </router-link>
|
|
|
+ </div>
|
|
|
+ <div class="my-50px flex items-center">
|
|
|
+ <Avatar size={76} src={userInfo.avatar} />
|
|
|
+ <div class="ml-20px flex-1">
|
|
|
+ <p class="mb-10px text-16px font-bold">{userInfo.name}</p>
|
|
|
+ <div class="text-12px text-gray">
|
|
|
+ {userInfo.desc || "这个人很懒,什么都没留下..."}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <router-link to="/">
|
|
|
+ <TextListItem
|
|
|
+ option={{
|
|
|
+ label: "资源中心",
|
|
|
+ suffix: <span class="icon_new">new</span>,
|
|
|
+ icon: (
|
|
|
+ <img
|
|
|
+ class="w-18px mr-10px"
|
|
|
+ src={require("@/assets/imgs/img-source.png")}
|
|
|
+ alt=""
|
|
|
+ />
|
|
|
+ ),
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ </router-link>
|
|
|
+ <Divider />
|
|
|
+ <div class="flex-1">
|
|
|
+ {menuOptions?.map((option, index) => (
|
|
|
+ <router-link to={option.link} key={index}>
|
|
|
+ <TextListItem key={index} option={option} />
|
|
|
+ </router-link>
|
|
|
+ ))}
|
|
|
+ </div>
|
|
|
+ <div class="mb-30px">
|
|
|
+ <TextList options={footerOptions} />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ );
|
|
|
+ };
|
|
|
+ },
|
|
|
+});
|
|
|
+
|
|
|
+const rootStyles = css`
|
|
|
+ .icon_new {
|
|
|
+ border-radius: 14px;
|
|
|
+ padding: 5px 10px;
|
|
|
+ text-transform: uppercase;
|
|
|
+ font-size: 12px;
|
|
|
+ line-height: 1;
|
|
|
+ background: linear-gradient(90deg, #9788ff 0%, #7e6bff 100%);
|
|
|
+ color: #fff;
|
|
|
+ }
|
|
|
+ .router-link-exact-active {
|
|
|
+ background-color: #fff;
|
|
|
+ display: block;
|
|
|
+ > div {
|
|
|
+ color: @inf-text-color;
|
|
|
+ }
|
|
|
+ }
|
|
|
+`;
|
|
|
+
|
|
|
+type TextListProps = {
|
|
|
+ label?: string;
|
|
|
+ suffix?: any;
|
|
|
+ icon?: any;
|
|
|
+ link?: string;
|
|
|
+ onClick?: () => void;
|
|
|
+};
|
|
|
+
|
|
|
+const TextList = defineComponent({
|
|
|
+ props: {
|
|
|
+ options: array<TextListProps>(),
|
|
|
+ },
|
|
|
+ setup(props) {
|
|
|
+ return () => {
|
|
|
+ return (
|
|
|
+ <div>
|
|
|
+ {props.options?.map((option, index) => (
|
|
|
+ <TextListItem key={index} option={option} />
|
|
|
+ ))}
|
|
|
+ </div>
|
|
|
+ );
|
|
|
+ };
|
|
|
+ },
|
|
|
+});
|
|
|
+
|
|
|
+const TextListItem = defineComponent({
|
|
|
+ props: { option: object<TextListProps>() },
|
|
|
+ setup(props) {
|
|
|
+ return () => {
|
|
|
+ const { option = {} } = props;
|
|
|
+ return (
|
|
|
+ <div
|
|
|
+ class={cx("flex items-center justify-between", itemStyles)}
|
|
|
+ onClick={() => option.onClick?.()}
|
|
|
+ >
|
|
|
+ {option.icon && <option.icon class="mr-8px text-20px" />}
|
|
|
+ <div class="flex-1">{option.label}</div>
|
|
|
+ {option.suffix && typeof option.suffix == "string" ? (
|
|
|
+ <span>{option.suffix}</span>
|
|
|
+ ) : (
|
|
|
+ option.suffix
|
|
|
+ )}
|
|
|
+ </div>
|
|
|
+ );
|
|
|
+ };
|
|
|
+ },
|
|
|
+});
|
|
|
+
|
|
|
+const itemStyles = css`
|
|
|
+ margin-top: 10px;
|
|
|
+ border-radius: 4px;
|
|
|
+ padding: 10px 25px 10px 20px;
|
|
|
+ color: @inf-text-sub-color;
|
|
|
+ cursor: pointer;
|
|
|
+ &:hover {
|
|
|
+ background: #fff;
|
|
|
+ }
|
|
|
+`;
|