123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193 |
- import { css, cx } from "@linaria/core";
- import { IconMore } from "@queenjs/icons";
- import { Image, View } from "@queenjs/ui";
- import { Divider, Dropdown, Menu, Tag } from "ant-design-vue";
- import { EyeOutlined } from "@ant-design/icons-vue";
- import dayjs from "dayjs";
- import { defineUI } from "queenjs";
- import { any, bool } from "vue-types";
- import { useAuth } from "@queenjs-modules/auth";
- export default defineUI({
- props: {
- record: any(),
- isPc: bool().def(false),
- },
- emits: ["edit", "preview", "menu"],
- setup(props, { emit }) {
- const auth = useAuth();
- return () => {
- const { record, isPc } = props;
-
- const isSys = (auth.store.userInfo.roles || []).indexOf("system") > -1;
- return (
- <div class={cx(itemStyles, "relative")}>
- <View ratio={1} class="overflow-hidden relative">
- <Image
- class="h-1/1 w-1/1 !object-contain bg-[#ebebeb]"
- src={record?.thumbnail}
- />
- {isSys && (
- <Tag
- color="#E88B00"
- // color="rgba(0, 0, 0, 0.4)"
- class="absolute top-0 left-0 z-1 !rounded-none"
- >
- {record.published ? "已发布" : "未发布"}
- </Tag>
- )}
- <div class="absolute inset-0 flex items-center justify-center opacity-0 hover:opacity-100 transition-opacity">
- <div
- class="text-white icon_action w-60px leading-60px orange cursor-pointer rounded-1/2 text-center transition-opacity hover:opacity-90 active:opacity-80"
- onClick={() => emit("edit", props.record)}
- >
- 编辑
- </div>
- {isPc ? (
- <div
- class="text-white icon_action w-60px leading-60px ml-10px cursor-pointer rounded-1/2 text-center transition-opacity hover:opacity-90 active:opacity-80"
- onClick={() => emit("menu", "copyLink")}
- >
- 链接
- </div>
- ) : (
- <div
- class="text-white icon_action w-60px leading-60px ml-10px cursor-pointer rounded-1/2 text-center transition-opacity hover:opacity-90 active:opacity-80"
- onClick={() => emit("menu", "share")}
- >
- 分享
- </div>
- )}
- </div>
- </View>
- <div class="item_footer rounded-b-4px flex items-center justify-between p-15px">
- <div class="flex-1 w-0">
- <div class="text-white text-bold truncate text-14px">
- {record.title}
- </div>
- <div class="flex items-center text-opacity-60 text-white text-12px mt-5px">
- {dayjs(record.updateTime).format("YYYY.MM.DD")}
- {/* 发布 */}
- <Divider type="vertical"></Divider>
- {record.views || 0} <EyeOutlined class={"ml-6px"} />
- </div>
- </div>
- <Dropdown
- placement="bottom"
- overlay={
- <Menu class={cx("w-90px", menuStyles)}>
- {/* <Menu.Item>复制</Menu.Item> */}
- <Menu.Item
- onClick={() => {
- emit("menu", "send");
- }}
- >
- 发送到
- </Menu.Item>
- <Menu.Item>
- <div onClick={() => emit("menu", "stat")}>统计分析</div>
- </Menu.Item>
- <Menu.Item>
- <div onClick={() => emit("menu", "copy")}>复制作品</div>
- </Menu.Item>
- <Menu.Item>
- <div onClick={() => emit("menu", "edit")}>编辑</div>
- </Menu.Item>
- {/* <Menu.Item>
- <div onClick={() => emit("menu", "rename")}>重命名</div>
- </Menu.Item> */}
- <Menu.Item>
- <div onClick={() => emit("menu", "delete")}>删除</div>
- </Menu.Item>
- {isSys && !record.published && (
- <Menu.Item>
- <div onClick={() => emit("menu", "publish")}>
- 发布平台
- </div>
- </Menu.Item>
- )}
- {isSys && record.published && (
- <Menu.Item>
- <div onClick={() => emit("menu", "unpublish")}>
- 取消平台发布
- </div>
- </Menu.Item>
- )}
- {/* {isSys && (
- <Menu.Item>
- <div onClick={() => emit("menu", "thumbnail")}>
- 替换封面
- </div>
- </Menu.Item>
- )} */}
- </Menu>
- }
- >
- <IconMore class="ml-10px text-22px cursor-pointer" />
- </Dropdown>
- </div>
- </div>
- );
- };
- },
- });
- const itemStyles = css`
-
- > div {
- font-size: 0;
- > div * {
- font-size: 14px;
- }
- }
- .item_footer {
- background: #414141;
- }
- .icon_action {
- background-color: rgba(0, 0, 0, 0.8);
- &.orange {
- background-color: rgba(232, 139, 0, 0.8);
- }
- }
- `;
- const menuStyles = css`
- .ant-dropdown-menu-item,
- .ant-dropdown-menu-submenu-title {
- font-size: 12px;
- }
- `;
|