Merge remote-tracking branch 'origin/main'

# Conflicts:
#	DigitalHumanWeb/src/app/(main)/robot/components/RobotList.tsx
main
lvchenpeng 4 months ago
commit 1624a1f271

@ -26,7 +26,9 @@ const nextConfig = {
],
webVitalsAttribution: ['CLS', 'LCP'],
},
typescript: {
ignoreBuildErrors: true
},
async headers() {
return [
{

@ -231,7 +231,7 @@
"y-webrtc": "^10.3.0",
"yaml": "^2.5.0",
"yjs": "^13.6.18",
"zod": "^3.23.8",
"zod": "^3.24.1",
"zustand": "^4.5.5",
"zustand-utils": "^1.3.2"
},
@ -246,6 +246,7 @@
"@peculiar/webcrypto": "^1.5.0",
"@testing-library/jest-dom": "^6.4.8",
"@testing-library/react": "^16.0.0",
"@types/axios": "^0.14.4",
"@types/chroma-js": "^2.4.4",
"@types/debug": "^4.1.12",
"@types/diff": "^5.2.1",

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

@ -38,7 +38,7 @@ export interface TopActionProps {
tab?: SidebarTabKey;
}
const getUserId = (s:object) => s.user?.id
const getUserId = (s: { user?: { id?: any } }) => s.user?.id;
const TopActions = memo<TopActionProps>(() => {
const { t } = useTranslation('common');
const switchBackToChat = useGlobalStore((s) => s.switchBackToChat);
@ -76,7 +76,7 @@ const TopActions = memo<TopActionProps>(() => {
</Link>
)}
{showMarket && (
<Link aria-label={t('tab.Model')} className={value === '/model' ? cx(styles.linkUrl, styles.linkclic) : cx(styles.linkUrl)} href={`/discover/models`} onClick={() => {setValue("/model"); window.localStorage.setItem("nowChat", "")}}>
<Link aria-label={t('tab.model')} className={value === '/model' ? cx(styles.linkUrl, styles.linkclic) : cx(styles.linkUrl)} href={`/discover/models`} onClick={() => {setValue("/model"); window.localStorage.setItem("nowChat", "")}}>
<Image alt={"model"} className={cx(styles.iconImg)} preview={false} src="/images/mx.png" />
<div className={value === '/model' ? cx(styles.iconText, styles.iconSelectText) : cx(styles.iconText) }></div>
</Link>
@ -88,13 +88,13 @@ const TopActions = memo<TopActionProps>(() => {
</Link>
)}
{showMarket && (
<Link aria-label={t('tab.Plugins')} className={value === '/plugins' ? cx(styles.linkUrl, styles.linkclic) : cx(styles.linkUrl)} href={`/discover/plugins`} onClick={() => {setValue("/plugins"); window.localStorage.setItem("nowChat", "")}}>
<Link aria-label={t('tab.plugins')} className={value === '/plugins' ? cx(styles.linkUrl, styles.linkclic) : cx(styles.linkUrl)} href={`/discover/plugins`} onClick={() => {setValue("/plugins"); window.localStorage.setItem("nowChat", "")}}>
<Image alt={"plugins"} className={cx(styles.iconImg)} preview={false} src="/images/cj.png" />
<div className={value === '/plugins' ? cx(styles.iconText, styles.iconSelectText) : cx(styles.iconText) }></div>
</Link>
)}
{showMarket && (
<Link aria-label={t('tab.Power')} className={value === '/power' ? cx(styles.linkUrl, styles.linkclic) : cx(styles.linkUrl)} href={'/power'} onClick={() => {setValue("/power"); window.localStorage.setItem("nowChat", "")}}>
<Link aria-label={t('tab.power')} className={value === '/power' ? cx(styles.linkUrl, styles.linkclic) : cx(styles.linkUrl)} href={'/power'} onClick={() => {setValue("/power"); window.localStorage.setItem("nowChat", "")}}>
<Image alt={"power"} className={cx(styles.iconImg)} preview={false} src="/images/sl.png" />
<div className={value === '/power' ? cx(styles.iconText, styles.iconSelectText) : cx(styles.iconText) }></div>
</Link>

@ -11,7 +11,7 @@ import { UserOutlined } from '@ant-design/icons';
import { LayoutProps } from './type';
import { Divider, Avatar } from "antd";
const title = {
const title:{[key: string]: string } = {
"/chat": '会话',
"/discover/assistants": "助手",
"/files": "工具",

@ -528,6 +528,7 @@ const stList = [
{
date: '2024-02-03',
des: "擅长产品功能分析与用户价值观广告文案创作。",
id: '1',
title: 'XXX助手',
},
]
@ -707,13 +708,13 @@ const handleClickCard = (e) => {
window.open(e.website, '_blank');
}
const onClickAncho = (e,link) => {
const onClickAncho = (e) => {
e.preventDefault()
let srcolls = document.querySelector(link.href)
srcolls.scrollIntoView({
behavior: 'smooth',
block: 'start'
})
// let srcolls = document.querySelector(link.href)
// srcolls.scrollIntoView({
// behavior: 'smooth',
// block: 'start'
// })
}
const ApplicationSet = memo(() => {
const { styles, cx } = useStyles()
@ -725,7 +726,7 @@ const ApplicationSet = memo(() => {
request({
method: "get",
url: "/flxai/api/robot/apptoolsset/getAllAiTools",
}).then(response => {
}).then((response) => {
if (response.code === 0) {
console.log(response,"2222")
setStData(response.data);
@ -752,7 +753,8 @@ const ApplicationSet = memo(() => {
<Button className={cx(styles.btn, val==='tj'&&styles.selectBtn)} onClick={() => handleClick("tj")}></Button>
</div>
<div style={{ display: 'flex', overflowY: 'scroll' }}>
{val === 'AI' ? <>
{val === 'AI' ?
<>
<Anchor
affix={false}
getContainer={getContainer}
@ -1087,7 +1089,7 @@ const ApplicationSet = memo(() => {
</div>
<div className={styles.cardCotain}>
<div>
<Image alt="" clasName={styles.desImg} preview={false} src="/images/detaicon.png" />
<Image alt="" className={styles.desImg} preview={false} src="/images/detaicon.png" />
<span className={styles.zsds}></span>
<span>{e.date}</span>
</div>

@ -2,7 +2,7 @@ import { createStyles } from 'antd-style';
import { imageUrl } from '@/const/url';
export const useStyles = createStyles(({ css, token, stylish, cx }, withBackground: boolean) => ({
export const useStyles = createStyles(({ css, token, cx }, withBackground: boolean) => ({
background: css`
padding: 24px;
@ -34,7 +34,7 @@ export const useStyles = createStyles(({ css, token, stylish, cx }, withBackgrou
border-block-end: 1px solid ${token.colorBorder};
`,
preview: cx(
stylish.noScrollbar,
// stylish.noScrollbar,
css`
overflow: hidden scroll;

@ -46,7 +46,7 @@ const ShareText = memo(() => {
const data = [
["question", "answer"],
];
let arrItem = [];
let arrItem:string[] = [];
messagesNew.forEach((chat)=> {
if (chat.role === 'assistant') {
arrItem.push(chat.content)

@ -72,7 +72,7 @@ interface HeaderProps {
identifier: string;
mobile?: boolean;
}
const getUserId = (s) => s.user?.id
const getUserId = (s: { user?: { id?: any } }) => s.user?.id;
const Header = memo<HeaderProps>(({ identifier, data, mobile }) => {
const { styles, theme } = useStyles();
const router = useRouter()

@ -70,7 +70,7 @@ interface HeaderProps {
mobile?: boolean;
}
const getUserId = (s) => s.user?.id
const getUserId = (s: { user?: { id?: any } }) => s.user?.id;
const Header = memo<HeaderProps>(({ identifier, data, mobile }) => {
const { styles, theme } = useStyles();

@ -67,7 +67,7 @@ interface HeaderProps {
identifier: string;
mobile?: boolean;
}
const getUserId = (s) => s.user?.id
const getUserId = (s: { user?: { id?: any } }) => s.user?.id;
const Header = memo<HeaderProps>(({ identifier, data, mobile }) => {
const { styles, theme } = useStyles();

@ -3,7 +3,7 @@ import Link from 'next/link';
import { memo } from 'react';
import urlJoin from 'url-join';
import { DiscoverModelItem } from '@/typesgpt-4o-mini';
import { DiscoverModelItem } from '@/types/discover';
import Card from '../../models/features/Card';

@ -30,9 +30,9 @@ const Page = async ({ params, searchParams }: Props) => {
const { t: td } = await translation('discover', searchParams?.hl);
const mobile = isMobileDevice();
const discoverService = new DiscoverService();
console.log(params.slug,"3333333")
// console.log(params.slug,"3333333")
const items = await discoverService.getAssistantCategory(locale, params.slug);
console.log("8272772727",items)
// console.log("8272772727",items)
const ld = ldModule.generate({
description: t('discover.assistants.description'),
title: [td(`category.assistant.${params.slug}`), t('discover.assistants.title')].join(' · '),

@ -78,7 +78,7 @@ export interface AssistantCardProps
variant?: 'default' | 'compact';
}
const getUserId = (s) => s.user?.id
const getUserId = (s: { user?: { id?: any } }) => s.user?.id
const AssistantCard = memo<AssistantCardProps>(
({ showCategory, className, meta, createdAt, author, variant, ...rest }) => {
@ -91,7 +91,7 @@ const AssistantCard = memo<AssistantCardProps>(
const isCompact = variant === 'compact';
const userId = getUserId(useUserStore.getState())
// console.log(tags,avatar,author,9383737)
console.log(userId,"9999999999")
// console.log(userId,"9999999999")
const [val, setVal] = useState('')
const handleCollect = (e) => {
console.log(e,"8844848")
@ -116,7 +116,7 @@ const AssistantCard = memo<AssistantCardProps>(
method: "post",
url: "/flxai/api/robot/appaiassistant",
}).then(response => {
console.log(response,"222222222")
// console.log(response,"222222222")
if (response.code === 0) {
message.success(t('collectSuccess'));
setVal("1")

@ -22,7 +22,7 @@ export interface ListProps {
mobile?: boolean;
searchKeywords?: string;
}
const getUserId = (s) => s.user?.id
const getUserId = (s: { user?: { id?: any } }) => s.user?.id
const List = memo<ListProps>(({ category, mobile, searchKeywords, items = [] }) => {
const { t } = useTranslation('discover');
@ -30,8 +30,8 @@ const List = memo<ListProps>(({ category, mobile, searchKeywords, items = [] })
const [stData, setStData] = useState(items)
const recentLength = mobile ? 4 : 8;
const userId = getUserId(useUserStore.getState())
console.log(userId,'zhushou---3837373266262266')
console.log('zhushou--------------',items)
// console.log(userId,'zhushou---3837373266262266')
// console.log('zhushou--------------',items)
const { all, recent, last } = useMemo(() => {
return {
all: stData,
@ -65,7 +65,7 @@ const List = memo<ListProps>(({ category, mobile, searchKeywords, items = [] })
res?.data?.forEach((item) => {
array2Object[item.identifier] = item;
});
console.log('chajian22222222222222222222222222222--------------')
// console.log('chajian22222222222222222222222222222--------------')
setStData(stData.map((item)=> {
const matchingItem = array2Object[item.identifier];
if (matchingItem) {
@ -80,7 +80,7 @@ const List = memo<ListProps>(({ category, mobile, searchKeywords, items = [] })
};
fetchData();
}, []); // 空数组[]意味着仅在组件挂载时调用一次
console.log(category,recent,last,"92929292")
// console.log(category,recent,last,"92929292")
const handleClickCard = (item) => {
console.log(item)
router.push(urlJoin('/discover/assistant/', item.identifier))

@ -36,7 +36,7 @@ const Page = async ({ params, searchParams }: Props) => {
const discoverService = new DiscoverService();
const list = await discoverService.getProviderList(locale);
const cate = list.find((cate) => cate.identifier === params.slug);
console.log(params.slug,"3333333")
// console.log(params.slug,"3333333")
const items = await discoverService.getModelCategory(locale, params.slug);
const ld = ldModule.generate({
description: t('discover.models.description'),

@ -80,7 +80,7 @@ const useStyles = createStyles(({ css, token, isDarkMode }) => ({
export interface ModelCardProps extends DiscoverModelItem, FlexboxProps {
showCategory?: boolean;
}
const getUserId = (s) => s.user?.id
const getUserId = (s: { user?: { id?: any } }) => s.user?.id
const ModelCard = memo<ModelCardProps>(({ className, meta, socialData, identifier, ...rest }) => {
const { title, description, functionCall, vision, tokens, category, id, displayName, enabled } = meta;
const { conversations, likes, tokens: socialDataToken } = socialData;
@ -93,7 +93,7 @@ const ModelCard = memo<ModelCardProps>(({ className, meta, socialData, identifie
const userId = getUserId(useUserStore.getState())
const [val, setVal] = useState(status)
const handleCollect = (e) => {
console.log(e,"8844848")
// console.log(e,"8844848")
e.preventDefault()
e.stopPropagation()
const params = {
@ -118,7 +118,7 @@ const ModelCard = memo<ModelCardProps>(({ className, meta, socialData, identifie
method: "post",
url: "/flxai/api/robot/appaimodel",
}).then(response => {
console.log(response,"222222222")
// console.log(response,"222222222")
if (response.code === 0) {
message.success(d('collectSuccess'));
setVal("1")

@ -2,7 +2,7 @@
import { Empty } from 'antd';
// import Link from 'next/link';
import { memo, useState } from 'react';
import { memo, useEffect, useState } from 'react';
import { useTranslation } from 'react-i18next';
import urlJoin from 'url-join';
import { useRouter } from 'next/navigation';
@ -21,54 +21,60 @@ export interface ListProps {
mobile?: boolean;
searchKeywords?: string;
}
const getUserId = (s) => s.user?.id
const getUserId = (s: { user?: { id?: any } }) => s.user?.id
const List = memo<ListProps>(async ({ category, searchKeywords, items = [] }) => {
const { t } = useTranslation('discover');
const router = useRouter()
const userId = getUserId(useUserStore.getState())
const [stData, setStData] = useState(items)
console.log(userId,'models---3837373266262266')
console.log('models---99999999',items)
if(category === "collect") {
const res = await request({
method: "get",
params: {
userid: userId
},
url: "/flxai/api/robot/appaimodel/getAllAiModel",
})
setStData(res?.data.map((item)=> {
item.classify = 'collect';
return item
}))
// items = res.data;
// items = items.map((item)=> {
// item.classify = 'collect';
// return item
// })
} else {
const res = await request({
method: "get",
params: {
userid: userId
},
url: "/flxai/api/robot/appaimodel/getAllAiModel",
})
const array2Object = {};
res?.data?.forEach(item => {
array2Object[item.identifier] = item;
});
setStData(stData.map((item)=> {
const matchingItem = array2Object[item.identifier];
if (matchingItem) {
matchingItem.status = '1';
return matchingItem
} else {
item.status = '0';
return item
}
}))
}
// console.log(userId,'models---3837373266262266')
// console.log('models---99999999',items)
useEffect(() => {
const fetchData = async() => {
if(category === "collect") {
const res = await request({
method: "get",
params: {
userid: userId
},
url: "/flxai/api/robot/appaimodel/getAllAiModel",
})
setStData(res?.data.map((item)=> {
item.classify = 'collect';
return item
}))
// items = res.data;
// items = items.map((item)=> {
// item.classify = 'collect';
// return item
// })
} else {
const res = await request({
method: "get",
params: {
userid: userId
},
url: "/flxai/api/robot/appaimodel/getAllAiModel",
})
const array2Object = {};
res?.data?.forEach(item => {
array2Object[item.identifier] = item;
});
setStData(stData.map((item)=> {
const matchingItem = array2Object[item.identifier];
if (matchingItem) {
matchingItem.status = '1';
return matchingItem
} else {
item.status = '0';
return item
}
}))
}
};
fetchData();
}, []); // 空数组[]意味着仅在组件挂载时调用一次
const handleClickCard = (item) => {
console.log(item)
router.push(urlJoin('/discover/model/', item.identifier))

@ -28,7 +28,7 @@ const Page = async ({ searchParams }: Props) => {
const mobile = isMobileDevice();
const discoverService = new DiscoverService();
const items = await discoverService.getModelList(locale);
console.log("8272772727",'jiangxucong')
// console.log("8272772727",'jiangxucong')
const ld = ldModule.generate({
description: t('discover.models.description'),

@ -80,7 +80,7 @@ interface PluginCardProps
showCategory?: boolean;
variant?: 'default' | 'compact';
}
const getUserId = (s) => s.user?.id
const getUserId = (s: { user?: { id?: any } }) => s.user?.id
const PluginCard = memo<PluginCardProps>(
({ className, showCategory, meta, createdAt, author, variant, ...rest }) => {
const { avatar, title, description, tags = [], category } = meta;
@ -91,11 +91,11 @@ const PluginCard = memo<PluginCardProps>(
const { message } = App.useApp();
const isCompact = variant === 'compact';
const userId = getUserId(useUserStore.getState())
console.log(status,"9383737-------------------------------------")
console.log(manifest,locale,"plugins9999999999-------------------")
// console.log(status,"9383737-------------------------------------")
// console.log(manifest,locale,"plugins9999999999-------------------")
const [val, setVal] = useState('')
const handleCollect = (e) => {
console.log(e,"8844848")
// console.log(e,"8844848")
e.preventDefault()
e.stopPropagation()
const params = {
@ -118,7 +118,7 @@ const PluginCard = memo<PluginCardProps>(
method: "post",
url: "/flxai/api/robot/appaiplugin",
}).then(response => {
console.log(response,"222222222")
// console.log(response,"222222222")
if (response.code === 0) {
message.success(t('collectSuccess'));
setVal("1")
@ -128,9 +128,9 @@ const PluginCard = memo<PluginCardProps>(
})
}
const renderElement = () => {
console.log(classify,'66666----------------------')
// console.log(classify,'66666----------------------')
if (classify !== 'collect') {
console.log(status,"222222222--------------------------")
// console.log(status,"222222222--------------------------")
if(status === "1" || val === "1") {
return <div className={styles.collectBtn} onClick={(e) => {e.stopPropagation()}}><StarOutlined style={{color: '#FFAD01'}}/></div>
} else {

@ -22,15 +22,15 @@ export interface ListProps {
mobile?: boolean;
searchKeywords?: string;
}
const getUserId = (s) => s.user?.id
const getUserId = (s: { user?: { id?: any } }) => s.user?.id
const List = memo<ListProps>(({ category, mobile, searchKeywords, items = [] }) => {
const { t } = useTranslation('discover');
const router = useRouter()
const [stData, setStData] = useState(items)
const recentLength = mobile ? 4 : 8;
const userId = getUserId(useUserStore.getState())
console.log(userId,'chajian---3837373266262266')
console.log('chajian33333333--------------',items)
// console.log(userId,'chajian---3837373266262266')
// console.log('chajian33333333--------------',items)
const { all, recent, last } = useMemo(() => {
return {
all: stData,
@ -64,7 +64,7 @@ const List = memo<ListProps>(({ category, mobile, searchKeywords, items = [] })
res?.data?.forEach((item) => {
array2Object[item.identifier] = item;
});
console.log('chajian22222222222222222222222222222--------------')
// console.log('chajian22222222222222222222222222222--------------')
setStData(stData.map((item)=> {
const matchingItem = array2Object[item.identifier];
if (matchingItem) {
@ -80,7 +80,7 @@ const List = memo<ListProps>(({ category, mobile, searchKeywords, items = [] })
fetchData();
}, []); // 空数组[]意味着仅在组件挂载时调用一次
console.log('chajian999999999999999--------------',stData)
// console.log('chajian999999999999999--------------',stData)
const handleClickCard = (item) => {
console.log(item)

@ -502,50 +502,52 @@ const RobotList = memo<{ mobile?: boolean }>(() => {
return (
<>
<div style={{display: value === 1 ? 'block': 'none'}}>
<div style={{display: value === 1 ? 'block': 'none',height: '100%'}}>
<div style={{ fontSize: '20px', height: '70px', lineHeight: '70px', marginLeft: '60px' }}>
<Button className={styles.buttonStyle} onClick={()=>handleSwitch(2)} shape="round" size="small" style={{marginLeft: '24px'}} type="link" variant="solid">
</Button>
</div>
<List
dataSource={data}
grid={{
gutter: 80,
lg: 5,
md: 4,
sm: 2,
xl: 5,
xs: 1,
xxl: 5,
}}
renderItem={() => (
<List.Item className={styles.listStyle}>
<Card className={styles.cardStyle} style={{padding: '0 !important'}}>
<div style={{background: '#EFEFEF', padding: '20px 0', textAlign: 'center'}}>
<Image className={cx(styles.iconRobotImg)} preview={false} src="/images/robot.png" />
</div>
<div style={{marginTop: '30px'}}>
<Flex justify='space-between' style={{height: '100%'}}>
<div style={{fontWeight: '700', lineHeight: '36px'}}>
Oliva
</div>
<div>
<Button onClick={()=>handleSwitch(2)} style={{color: '#005EFF',paddingRight: '0'}} type="link">
<span className={styles.buttonEdit}></span>
</Button>
<Button style={{color: '#FF0C0C', paddingRight: '0'}} type="link">
<span className={styles.buttonDelete}></span>
</Button>
</div>
</Flex>
</div>
</Card>
</List.Item>
)}
style={{marginTop: '10px', padding: '0 50px', height: 'calc(100vh - 150px)', overflowY: 'scroll'}}
/>
<div style={{height: '100%'}}>
<List
dataSource={data}
grid={{
gutter: 80,
lg: 5,
md: 4,
sm: 2,
xl: 5,
xs: 1,
xxl: 5,
}}
renderItem={() => (
<List.Item className={styles.listStyle}>
<Card className={styles.cardStyle} style={{padding: '0 !important'}}>
<div style={{background: '#EFEFEF', padding: '20px 0', textAlign: 'center'}}>
<Image className={cx(styles.iconRobotImg)} preview={false} src="/images/robot.png" />
</div>
<div style={{marginTop: '30px'}}>
<Flex justify='space-between' style={{height: '100%'}}>
<div style={{fontWeight: '700', lineHeight: '36px'}}>
Oliva
</div>
<div>
<Button onClick={()=>handleSwitch(2)} style={{color: '#005EFF',paddingRight: '0'}} type="link">
<span className={styles.buttonEdit}></span>
</Button>
<Button style={{color: '#FF0C0C', paddingRight: '0'}} type="link">
<span className={styles.buttonDelete}></span>
</Button>
</div>
</Flex>
</div>
</Card>
</List.Item>
)}
style={{marginTop: '10px', padding: '0 50px', height: 'calc(100vh - 150px)', overflowY: 'scroll'}}
/>
</div>
</div>
<div style={{display: value === 2 ? 'block': 'none',height: '100%'}}>
<Flex justify='space-between' style={{margin: '15px 0'}} >

@ -3,28 +3,21 @@
import { Icon } from '@lobehub/ui';
import { Button } from 'antd';
import { SendHorizonal } from 'lucide-react';
import Link from 'next/link';
// import Link from 'next/link';
import { useRouter } from 'next/navigation';
import { memo } from 'react';
import { useTranslation } from 'react-i18next';
import { Flexbox } from 'react-layout-kit';
import { featureFlagsSelectors, useServerConfigStore } from '@/store/serverConfig';
// import { featureFlagsSelectors, useServerConfigStore } from '@/store/serverConfig';
const Actions = memo<{ mobile?: boolean }>(({ mobile }) => {
const { t } = useTranslation('welcome');
const router = useRouter();
const { showMarket } = useServerConfigStore(featureFlagsSelectors);
// const { showMarket } = useServerConfigStore(featureFlagsSelectors);
return (
<Flexbox gap={16} horizontal={!mobile} justify={'center'} width={'100%'} wrap={'wrap'}>
{showMarket && (
<Link href={'/discover'}>
<Button block={mobile} size={'large'} style={{ minWidth: 160 }} type={'default'}>
{t('button.market')}
</Button>
</Link>
)}
<Button
block={mobile}
onClick={() => router.push('/chat')}

@ -1,9 +1,10 @@
import axios from 'axios';
// 创建axios实例
// 创建一个Axios实例并配置基础URL和请求超时时间
const service = axios.create({
baseURL: 'http://192.168.7.3:18080', // 设置基础URL
timeout: '60000' ,// 设置请求超时时间
// withCredentials: true,
baseURL: 'http://192.168.7.3:18080', // 设置基础URL
timeout: 60000, // 设置请求超时时间(单位为毫秒)
// withCredentials: true, // 如果需要发送跨域请求时携带凭证如Cookies可以取消注释此行
});
// service.defaults.withCredentials = true;
// 请求拦截器

@ -21,6 +21,7 @@ const CustomTextLogo = memo<FlexboxProps & { size: number }>(({ size, style, ...
<Flexbox
height={size}
style={{
color: '#ffffff',
fontSize: size / 1.5,
fontWeight: 'bolder',
userSelect: 'none',

Binary file not shown.

After

Width:  |  Height:  |  Size: 342 KiB

@ -0,0 +1,5 @@
.bg {
background: url('./bg1.jpg') no-repeat center center;
background-size: 100% 100%;
position: relative;
}

@ -2,15 +2,15 @@ import { Icon } from '@lobehub/ui';
import { Loader2 } from 'lucide-react';
import { memo } from 'react';
import { Center, Flexbox } from 'react-layout-kit';
import './index.css';
import { ProductLogo } from '@/components/Branding';
const FullscreenLoading = memo<{ title?: string }>(({ title }) => {
return (
<Flexbox height={'100%'} style={{ position: 'relative', userSelect: 'none' }} width={'100%'}>
<Flexbox className="bg" height={'100%'} style={{ position: 'relative', userSelect: 'none' }} width={'100%'}>
<Center flex={1} gap={16} width={'100%'}>
<ProductLogo size={48} type={'combine'} />
<Center gap={12} horizontal style={{ fontSize: 15, lineHeight: 1.5, opacity: 0.66 }}>
<Center gap={12} horizontal style={{ color: '#ffffff', fontSize: 15, lineHeight: 1.5, opacity: 0.66 }}>
<Icon icon={Loader2} size={{ fontSize: 16 }} spin />
{title}
</Center>

@ -4,7 +4,7 @@
export const LOBE_CHAT_CLOUD = 'LobeChat Cloud';
export const BRANDING_NAME = 'LobeChat';
export const BRANDING_LOGO_URL = '';
export const BRANDING_NAME = '集智AI';
export const BRANDING_LOGO_URL = '/images/logo-3d.webp';
export const ORG_NAME = 'LobeHub';

@ -31,12 +31,12 @@ export const getLeftActionList: getActionList = (mobile) =>
[
'model',
'fileUpload',
// 'knowledgeBase',
// 'temperature',
// 'history',
'knowledgeBase',
'temperature',
'history',
!mobile && 'stt',
'tools',
// 'token',
'token',
].filter(Boolean) as ActionKeys[];
export const getRightActionList: getActionList = () => ['clear'].filter(Boolean) as ActionKeys[];

@ -190,7 +190,11 @@ export default {
chat: '会话',
discover: '发现',
files: '文件',
knowledge: '知识库',
me: '我',
model: '模型',
plugins: '插件',
power: '算力',
robot: '数字人',
setting: '设置',
},

@ -148,6 +148,12 @@
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>${knife4j.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.hankcs/hanlp -->
<dependency>
<groupId>com.hankcs</groupId>
<artifactId>hanlp</artifactId>
<version>portable-1.8.6</version>
</dependency>
</dependencies>
<!-- 阿里云maven仓库 -->
<repositories>

@ -0,0 +1,93 @@
package com.pjilisense.flxai.controller;
import com.pjilisense.flxai.base.constant.Constant;
import com.pjilisense.flxai.dto.FilesDTO;
import com.pjilisense.flxai.page.PageData;
import com.pjilisense.flxai.utils.Result;
import com.pjilisense.flxai.dto.ChunksDTO;
import com.pjilisense.flxai.service.ChunksService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
/**
* ${comments}
*
* @author liushujing liushujing@philisense.com
* @since 1.0.0 2025-02-10
*/
@RestController
@RequestMapping(Constant.BASE_PATH+"chunks")
@Api(tags="${comments}")
public class ChunksController {
private static Logger logger = LoggerFactory.getLogger(ChunksController.class);
@Autowired
private ChunksService chunksService;
@GetMapping("page")
@ApiOperation("分页")
@ApiImplicitParams({
@ApiImplicitParam(name = Constant.PAGE, value = "当前页码从1开始", paramType = "query", required = true, dataType="Integer", dataTypeClass =Integer.class) ,
@ApiImplicitParam(name = Constant.LIMIT, value = "每页显示记录数", paramType = "query",required = true, dataType="Integer", dataTypeClass =Integer.class) ,
@ApiImplicitParam(name = Constant.ORDER_FIELD, value = "排序字段", paramType = "query", dataType="String", dataTypeClass =String.class) ,
@ApiImplicitParam(name = Constant.ORDER, value = "排序方式,可选值(asc、desc)", paramType = "query", dataType="String", dataTypeClass =String.class)
})
public Result<PageData<ChunksDTO>> page(@ApiIgnore @RequestParam Map<String, Object> params){
PageData<ChunksDTO> page = chunksService.page(params);
return new Result<PageData<ChunksDTO>>().ok(page);
}
@GetMapping("{id}")
@ApiOperation("信息")
public Result<ChunksDTO> get(@PathVariable("id") Long id){
ChunksDTO data = chunksService.get(id);
return new Result<ChunksDTO>().ok(data);
}
@PostMapping("/search")
@ApiOperation("模糊检索")
public Result searchByText(@RequestBody ChunksDTO dto){
List<Map<String,Object>> list =chunksService.search(dto.getUserId(),dto.getText());
return new Result().ok(list);
}
@PostMapping
@ApiOperation("保存")
public Result save(@RequestBody ChunksDTO dto){
chunksService.save(dto);
return new Result();
}
@PutMapping
@ApiOperation("修改")
public Result update(@RequestBody ChunksDTO dto){
chunksService.update(dto);
return new Result();
}
@DeleteMapping
@ApiOperation("删除")
public Result delete(@RequestBody Long[] ids){
//效验数据
chunksService.delete(ids);
return new Result();
}
}

@ -0,0 +1,126 @@
package com.pjilisense.flxai.controller;
import com.pjilisense.flxai.base.constant.Constant;
import com.pjilisense.flxai.page.PageData;
import com.pjilisense.flxai.utils.FileUtil;
import com.pjilisense.flxai.utils.Result;
import com.pjilisense.flxai.dto.DigitalImgDTO;
import com.pjilisense.flxai.service.DigitalImgService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import springfox.documentation.annotations.ApiIgnore;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.Map;
/**
* ${comments}
*
* @author liushujing liushujing@philisense.com
* @since 1.0.0 2025-02-26
*/
@RestController
@RequestMapping(Constant.BASE_PATH+"digitalimg")
@Api(tags="${comments}")
public class DigitalImgController {
private static Logger logger = LoggerFactory.getLogger(DigitalImgController.class);
@Autowired
private DigitalImgService digitalImgService;
@Autowired
FileUtil fileUtil;
@PostMapping("/uploadPicture")
public Result<String> uploadPicture(@RequestParam("file") MultipartFile file) {
if (file.isEmpty()) {
return new Result<String>().error("文件为空");
}
try {
String relfilename =fileUtil.uploadFile(file);
return new Result<String>().ok(relfilename);
} catch (RuntimeException e) {
return new Result<String>().error("上传失败: " + e.getMessage());
}
}
@PostMapping("/getPicture")
public void getPicture(HttpServletResponse response,@RequestParam(name = "id", required = true) String id) {
try {
DigitalImgDTO data = digitalImgService.get(id);
if(StringUtils.hasText(data.getImgPath())) {
fileUtil.downLoadFile(data.getImgPath(), null, response);
}
} catch (RuntimeException e) {
}
}
@GetMapping("page")
@ApiOperation("分页")
@ApiImplicitParams({
@ApiImplicitParam(name = Constant.PAGE, value = "当前页码从1开始", paramType = "query", required = true, dataType="Integer", dataTypeClass =Integer.class) ,
@ApiImplicitParam(name = Constant.LIMIT, value = "每页显示记录数", paramType = "query",required = true, dataType="Integer", dataTypeClass =Integer.class) ,
@ApiImplicitParam(name = Constant.ORDER_FIELD, value = "排序字段", paramType = "query", dataType="String", dataTypeClass =String.class) ,
@ApiImplicitParam(name = Constant.ORDER, value = "排序方式,可选值(asc、desc)", paramType = "query", dataType="String", dataTypeClass =String.class)
})
public Result<PageData<DigitalImgDTO>> page(@ApiIgnore @RequestParam Map<String, Object> params){
PageData<DigitalImgDTO> page = digitalImgService.page(params);
return new Result<PageData<DigitalImgDTO>>().ok(page);
}
@GetMapping("getAllByType")
@ApiOperation("根据类型获取全部数据")
public Result<List<DigitalImgDTO>> getAllByType(@ApiIgnore @RequestParam String imgType){
List<DigitalImgDTO> page = digitalImgService.getAllByType(imgType);
return new Result<List<DigitalImgDTO>>().ok(page);
}
@GetMapping("{id}")
@ApiOperation("信息")
public Result<DigitalImgDTO> get(@PathVariable("id") String id){
DigitalImgDTO data = digitalImgService.get(id);
return new Result<DigitalImgDTO>().ok(data);
}
@PostMapping
@ApiOperation("保存")
public Result save(@RequestBody DigitalImgDTO dto){
digitalImgService.save(dto);
return new Result();
}
@PutMapping
@ApiOperation("修改")
public Result update(@RequestBody DigitalImgDTO dto){
digitalImgService.update(dto);
return new Result();
}
@DeleteMapping
@ApiOperation("删除")
public Result delete(@RequestBody String[] ids){
digitalImgService.delete(ids);
return new Result();
}
}

@ -0,0 +1,88 @@
package com.pjilisense.flxai.controller;
import com.pjilisense.flxai.base.constant.Constant;
import com.pjilisense.flxai.page.PageData;
import com.pjilisense.flxai.utils.Result;
import com.pjilisense.flxai.dto.FileChunksDTO;
import com.pjilisense.flxai.service.FileChunksService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
/**
* ${comments}
*
* @author liushujing liushujing@philisense.com
* @since 1.0.0 2025-02-10
*/
@RestController
@RequestMapping(Constant.BASE_PATH+"filechunks")
@Api(tags="${comments}")
public class FileChunksController {
private static Logger logger = LoggerFactory.getLogger(FileChunksController.class);
@Autowired
private FileChunksService fileChunksService;
@GetMapping("page")
@ApiOperation("分页")
@ApiImplicitParams({
@ApiImplicitParam(name = Constant.PAGE, value = "当前页码从1开始", paramType = "query", required = true, dataType="Integer", dataTypeClass =Integer.class) ,
@ApiImplicitParam(name = Constant.LIMIT, value = "每页显示记录数", paramType = "query",required = true, dataType="Integer", dataTypeClass =Integer.class) ,
@ApiImplicitParam(name = Constant.ORDER_FIELD, value = "排序字段", paramType = "query", dataType="String", dataTypeClass =String.class) ,
@ApiImplicitParam(name = Constant.ORDER, value = "排序方式,可选值(asc、desc)", paramType = "query", dataType="String", dataTypeClass =String.class)
})
public Result<PageData<FileChunksDTO>> page(@ApiIgnore @RequestParam Map<String, Object> params){
PageData<FileChunksDTO> page = fileChunksService.page(params);
return new Result<PageData<FileChunksDTO>>().ok(page);
}
@GetMapping("{id}")
@ApiOperation("信息")
public Result<FileChunksDTO> get(@PathVariable("id") Long id){
FileChunksDTO data = fileChunksService.get(id);
return new Result<FileChunksDTO>().ok(data);
}
@PostMapping
@ApiOperation("保存")
public Result save(@RequestBody FileChunksDTO dto){
fileChunksService.save(dto);
return new Result();
}
@PutMapping
@ApiOperation("修改")
public Result update(@RequestBody FileChunksDTO dto){
fileChunksService.update(dto);
return new Result();
}
@DeleteMapping
@ApiOperation("删除")
public Result delete(@RequestBody Long[] ids){
fileChunksService.delete(ids);
return new Result();
}
}

@ -0,0 +1,88 @@
package com.pjilisense.flxai.controller;
import com.pjilisense.flxai.base.constant.Constant;
import com.pjilisense.flxai.page.PageData;
import com.pjilisense.flxai.utils.Result;
import com.pjilisense.flxai.dto.GlobalFilesDTO;
import com.pjilisense.flxai.service.GlobalFilesService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
/**
* ${comments}
*
* @author liushujing liushujing@philisense.com
* @since 1.0.0 2025-02-10
*/
@RestController
@RequestMapping(Constant.BASE_PATH+"globalfiles")
@Api(tags="${comments}")
public class GlobalFilesController {
private static Logger logger = LoggerFactory.getLogger(GlobalFilesController.class);
@Autowired
private GlobalFilesService globalFilesService;
@GetMapping("page")
@ApiOperation("分页")
@ApiImplicitParams({
@ApiImplicitParam(name = Constant.PAGE, value = "当前页码从1开始", paramType = "query", required = true, dataType="Integer", dataTypeClass =Integer.class) ,
@ApiImplicitParam(name = Constant.LIMIT, value = "每页显示记录数", paramType = "query",required = true, dataType="Integer", dataTypeClass =Integer.class) ,
@ApiImplicitParam(name = Constant.ORDER_FIELD, value = "排序字段", paramType = "query", dataType="String", dataTypeClass =String.class) ,
@ApiImplicitParam(name = Constant.ORDER, value = "排序方式,可选值(asc、desc)", paramType = "query", dataType="String", dataTypeClass =String.class)
})
public Result<PageData<GlobalFilesDTO>> page(@ApiIgnore @RequestParam Map<String, Object> params){
PageData<GlobalFilesDTO> page = globalFilesService.page(params);
return new Result<PageData<GlobalFilesDTO>>().ok(page);
}
@GetMapping("{id}")
@ApiOperation("信息")
public Result<GlobalFilesDTO> get(@PathVariable("id") Long id){
GlobalFilesDTO data = globalFilesService.get(id);
return new Result<GlobalFilesDTO>().ok(data);
}
@PostMapping
@ApiOperation("保存")
public Result save(@RequestBody GlobalFilesDTO dto){
globalFilesService.save(dto);
return new Result();
}
@PutMapping
@ApiOperation("修改")
public Result update(@RequestBody GlobalFilesDTO dto){
globalFilesService.update(dto);
return new Result();
}
@DeleteMapping
@ApiOperation("删除")
public Result delete(@RequestBody Long[] ids){
globalFilesService.delete(ids);
return new Result();
}
}

@ -0,0 +1,88 @@
package com.pjilisense.flxai.controller;
import com.pjilisense.flxai.base.constant.Constant;
import com.pjilisense.flxai.page.PageData;
import com.pjilisense.flxai.utils.Result;
import com.pjilisense.flxai.dto.MyDigitalHumanDTO;
import com.pjilisense.flxai.service.MyDigitalHumanService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
/**
* ${comments}
*
* @author liushujing liushujing@philisense.com
* @since 1.0.0 2025-02-26
*/
@RestController
@RequestMapping(Constant.BASE_PATH+"mydigitalhuman")
@Api(tags="${comments}")
public class MyDigitalHumanController {
private static Logger logger = LoggerFactory.getLogger(MyDigitalHumanController.class);
@Autowired
private MyDigitalHumanService myDigitalHumanService;
@GetMapping("page")
@ApiOperation("分页")
@ApiImplicitParams({
@ApiImplicitParam(name = Constant.PAGE, value = "当前页码从1开始", paramType = "query", required = true, dataType="Integer", dataTypeClass =Integer.class) ,
@ApiImplicitParam(name = Constant.LIMIT, value = "每页显示记录数", paramType = "query",required = true, dataType="Integer", dataTypeClass =Integer.class) ,
@ApiImplicitParam(name = Constant.ORDER_FIELD, value = "排序字段", paramType = "query", dataType="String", dataTypeClass =String.class) ,
@ApiImplicitParam(name = Constant.ORDER, value = "排序方式,可选值(asc、desc)", paramType = "query", dataType="String", dataTypeClass =String.class)
})
public Result<PageData<MyDigitalHumanDTO>> page(@ApiIgnore @RequestParam Map<String, Object> params){
PageData<MyDigitalHumanDTO> page = myDigitalHumanService.page(params);
return new Result<PageData<MyDigitalHumanDTO>>().ok(page);
}
@GetMapping("{id}")
@ApiOperation("信息")
public Result<MyDigitalHumanDTO> get(@PathVariable("id") Long id){
MyDigitalHumanDTO data = myDigitalHumanService.get(id);
return new Result<MyDigitalHumanDTO>().ok(data);
}
@PostMapping
@ApiOperation("保存")
public Result save(@RequestBody MyDigitalHumanDTO dto){
myDigitalHumanService.save(dto);
return new Result();
}
@PutMapping
@ApiOperation("修改")
public Result update(@RequestBody MyDigitalHumanDTO dto){
myDigitalHumanService.update(dto);
return new Result();
}
@DeleteMapping
@ApiOperation("删除")
public Result delete(@RequestBody Long[] ids){
myDigitalHumanService.delete(ids);
return new Result();
}
}

@ -0,0 +1,20 @@
package com.pjilisense.flxai.dao;
import com.pjilisense.flxai.base.dao.BaseDao;
import com.pjilisense.flxai.entity.ChunksEntity;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
import java.util.Map;
/**
* ${comments}
*
* @author liushujing liushujing@philisense.com
* @since 1.0.0 2025-02-10
*/
@Mapper
public interface ChunksDao extends BaseDao<ChunksEntity> {
List<Map<String,Object>> queryCsv(Map<String, Object> map);
}

@ -0,0 +1,16 @@
package com.pjilisense.flxai.dao;
import com.pjilisense.flxai.base.dao.BaseDao;
import com.pjilisense.flxai.entity.DigitalImgEntity;
import org.apache.ibatis.annotations.Mapper;
/**
* ${comments}
*
* @author liushujing liushujing@philisense.com
* @since 1.0.0 2025-02-26
*/
@Mapper
public interface DigitalImgDao extends BaseDao<DigitalImgEntity> {
}

@ -0,0 +1,16 @@
package com.pjilisense.flxai.dao;
import com.pjilisense.flxai.base.dao.BaseDao;
import com.pjilisense.flxai.entity.FileChunksEntity;
import org.apache.ibatis.annotations.Mapper;
/**
* ${comments}
*
* @author liushujing liushujing@philisense.com
* @since 1.0.0 2025-02-10
*/
@Mapper
public interface FileChunksDao extends BaseDao<FileChunksEntity> {
}

@ -0,0 +1,16 @@
package com.pjilisense.flxai.dao;
import com.pjilisense.flxai.base.dao.BaseDao;
import com.pjilisense.flxai.entity.GlobalFilesEntity;
import org.apache.ibatis.annotations.Mapper;
/**
* ${comments}
*
* @author liushujing liushujing@philisense.com
* @since 1.0.0 2025-02-10
*/
@Mapper
public interface GlobalFilesDao extends BaseDao<GlobalFilesEntity> {
}

@ -0,0 +1,16 @@
package com.pjilisense.flxai.dao;
import com.pjilisense.flxai.base.dao.BaseDao;
import com.pjilisense.flxai.entity.MyDigitalHumanEntity;
import org.apache.ibatis.annotations.Mapper;
/**
* ${comments}
*
* @author liushujing liushujing@philisense.com
* @since 1.0.0 2025-02-26
*/
@Mapper
public interface MyDigitalHumanDao extends BaseDao<MyDigitalHumanEntity> {
}

@ -0,0 +1,64 @@
package com.pjilisense.flxai.dto;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.OffsetDateTime;
import java.util.Date;
import java.util.Map;
import java.util.UUID;
/**
* ${comments}
*
* @author liushujing liushujing@philisense.com
* @since 1.0.0 2025-02-10
*/
@Data
@ApiModel(value = "${comments}")
public class ChunksDTO implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "$column.comments")
private UUID id;
@ApiModelProperty(value = "$column.comments")
private String text;
@ApiModelProperty(value = "$column.comments")
private String abstractx;
@ApiModelProperty(value = "$column.comments")
private Map<String,Object> metadata;
@ApiModelProperty(value = "$column.comments")
private Integer index;
@ApiModelProperty(value = "$column.comments")
private String type;
@ApiModelProperty(value = "$column.comments")
@JsonSerialize(using = com.pjilisense.flxai.wrapper.OffsetDateTimeSerializer.class)
@JsonDeserialize(using = com.pjilisense.flxai.wrapper.OffsetDateTimeDeserializer.class)
private OffsetDateTime createdAt;
@ApiModelProperty(value = "$column.comments")
@JsonSerialize(using = com.pjilisense.flxai.wrapper.OffsetDateTimeSerializer.class)
@JsonDeserialize(using = com.pjilisense.flxai.wrapper.OffsetDateTimeDeserializer.class)
private OffsetDateTime updatedAt;
@ApiModelProperty(value = "$column.comments")
private String userId;
@ApiModelProperty(value = "$column.comments")
@JsonSerialize(using = com.pjilisense.flxai.wrapper.OffsetDateTimeSerializer.class)
@JsonDeserialize(using = com.pjilisense.flxai.wrapper.OffsetDateTimeDeserializer.class)
private OffsetDateTime accessedAt;
}

@ -0,0 +1,35 @@
package com.pjilisense.flxai.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* ${comments}
*
* @author liushujing liushujing@philisense.com
* @since 1.0.0 2025-02-26
*/
@Data
@ApiModel(value = "${comments}")
public class DigitalImgDTO implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "主键")
private String id;
@ApiModelProperty(value = "名称")
private String name;
@ApiModelProperty(value = "图片存放的相对路径")
private String imgPath;
@ApiModelProperty(value = "图片类型1数字人形象2数字人场景3数字人背景")
private String imgType;
}

@ -0,0 +1,38 @@
package com.pjilisense.flxai.dto;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.OffsetDateTime;
import java.util.Date;
import java.util.UUID;
/**
* ${comments}
*
* @author liushujing liushujing@philisense.com
* @since 1.0.0 2025-02-10
*/
@Data
@ApiModel(value = "${comments}")
public class FileChunksDTO implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "$column.comments")
private String fileId;
@ApiModelProperty(value = "$column.comments")
private UUID chunkId;
@ApiModelProperty(value = "$column.comments")
@JsonSerialize(using = com.pjilisense.flxai.wrapper.OffsetDateTimeSerializer.class)
@JsonDeserialize(using = com.pjilisense.flxai.wrapper.OffsetDateTimeDeserializer.class)
private OffsetDateTime createdAt;
}

@ -0,0 +1,52 @@
package com.pjilisense.flxai.dto;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.OffsetDateTime;
import java.util.Date;
import java.util.Map;
/**
* ${comments}
*
* @author liushujing liushujing@philisense.com
* @since 1.0.0 2025-02-10
*/
@Data
@ApiModel(value = "${comments}")
public class GlobalFilesDTO implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "$column.comments")
private String hashId;
@ApiModelProperty(value = "$column.comments")
private String fileType;
@ApiModelProperty(value = "$column.comments")
private Integer size;
@ApiModelProperty(value = "$column.comments")
private String url;
@ApiModelProperty(value = "$column.comments")
private Map<String,Object> metadata;
@ApiModelProperty(value = "$column.comments")
@JsonSerialize(using = com.pjilisense.flxai.wrapper.OffsetDateTimeSerializer.class)
@JsonDeserialize(using = com.pjilisense.flxai.wrapper.OffsetDateTimeDeserializer.class)
private OffsetDateTime createdAt;
@ApiModelProperty(value = "$column.comments")
@JsonSerialize(using = com.pjilisense.flxai.wrapper.OffsetDateTimeSerializer.class)
@JsonDeserialize(using = com.pjilisense.flxai.wrapper.OffsetDateTimeDeserializer.class)
private OffsetDateTime accessedAt;
}

@ -0,0 +1,50 @@
package com.pjilisense.flxai.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* ${comments}
*
* @author liushujing liushujing@philisense.com
* @since 1.0.0 2025-02-27
*/
@Data
@ApiModel(value = "${comments}")
public class MyDigitalHumanDTO implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "主键")
private String id;
@ApiModelProperty(value = "用户表ID")
private String userid;
@ApiModelProperty(value = "数字形象ID数字图片表ID")
private String imageid;
@ApiModelProperty(value = "场景ID数字图片表ID")
private String sceneimgid;
@ApiModelProperty(value = "背景ID数字图片表ID")
private String bkimgid;
@ApiModelProperty(value = "选择的声音ID")
private String voiceid;
@ApiModelProperty(value = "编辑后的图片")
private String videoimg;
@ApiModelProperty(value = "视频存放目录")
private String videodir;
@ApiModelProperty(value = "声音存放目录")
private String voicedir;
}

@ -0,0 +1,67 @@
package com.pjilisense.flxai.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.pjilisense.flxai.handle.JsonbTypeHandler;
import com.pjilisense.flxai.handle.UUIDTypeHandler;
import lombok.Data;
import java.time.OffsetDateTime;
import java.util.Date;
import java.util.Map;
import java.util.UUID;
/**
* ${comments}
*
* @author liushujing liushujing@philisense.com
* @since 1.0.0 2025-02-10
*/
@Data
@TableName("chunks")
public class ChunksEntity {
/**
* $column.comments
*/
@TableField(typeHandler = UUIDTypeHandler.class)
private UUID id;
/**
* $column.comments
*/
private String text;
/**
* $column.comments
*/
@TableField(value="abstract")
private String abstractx;
/**
* $column.comments
*/
@TableField(value = "metadata", typeHandler = JsonbTypeHandler.class)
private Map<String,Object> metadata;
/**
* $column.comments
*/
private Integer index;
/**
* $column.comments
*/
private String type;
/**
* $column.comments
*/
private OffsetDateTime createdAt;
/**
* $column.comments
*/
private OffsetDateTime updatedAt;
/**
* $column.comments
*/
private String userId;
/**
* $column.comments
*/
private OffsetDateTime accessedAt;
}

@ -0,0 +1,34 @@
package com.pjilisense.flxai.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.util.Date;
/**
* ${comments}
*
* @author liushujing liushujing@philisense.com
* @since 1.0.0 2025-02-26
*/
@Data
@TableName("digital_img")
public class DigitalImgEntity {
/**
*
*/
private String id;
/**
*
*/
private String name;
/**
*
*/
private String imgPath;
/**
* 123
*/
private String imgType;
}

@ -0,0 +1,35 @@
package com.pjilisense.flxai.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.pjilisense.flxai.handle.UUIDTypeHandler;
import lombok.Data;
import java.time.OffsetDateTime;
import java.util.Date;
import java.util.UUID;
/**
* ${comments}
*
* @author liushujing liushujing@philisense.com
* @since 1.0.0 2025-02-10
*/
@Data
@TableName("file_chunks")
public class FileChunksEntity {
/**
* $column.comments
*/
private String fileId;
/**
* $column.comments
*/
@TableField(typeHandler = UUIDTypeHandler.class)
private UUID chunkId;
/**
* $column.comments
*/
private OffsetDateTime createdAt;
}

@ -0,0 +1,51 @@
package com.pjilisense.flxai.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.pjilisense.flxai.handle.JsonbTypeHandler;
import lombok.Data;
import java.time.OffsetDateTime;
import java.util.Date;
import java.util.Map;
/**
* ${comments}
*
* @author liushujing liushujing@philisense.com
* @since 1.0.0 2025-02-10
*/
@Data
@TableName("global_files")
public class GlobalFilesEntity {
/**
* $column.comments
*/
private String hashId;
/**
* $column.comments
*/
private String fileType;
/**
* $column.comments
*/
private Integer size;
/**
* $column.comments
*/
private String url;
/**
* $column.comments
*/
@TableField(value = "metadata", typeHandler = JsonbTypeHandler.class)
private Map<String,Object> metadata;
/**
* $column.comments
*/
private OffsetDateTime createdAt;
/**
* $column.comments
*/
private OffsetDateTime accessedAt;
}

@ -0,0 +1,54 @@
package com.pjilisense.flxai.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.util.Date;
/**
* ${comments}
*
* @author liushujing liushujing@philisense.com
* @since 1.0.0 2025-02-27
*/
@Data
@TableName("my_digital_human")
public class MyDigitalHumanEntity {
/**
*
*/
private String id;
/**
* ID
*/
private String userid;
/**
* IDID
*/
private String imageid;
/**
* IDID
*/
private String sceneimgid;
/**
* IDID
*/
private String bkimgid;
/**
* ID
*/
private String voiceid;
/**
*
*/
private String videoimg;
/**
*
*/
private String videodir;
/**
*
*/
private String voicedir;
}

@ -0,0 +1,19 @@
package com.pjilisense.flxai.service;
import com.pjilisense.flxai.base.service.CrudService;
import com.pjilisense.flxai.dto.ChunksDTO;
import com.pjilisense.flxai.entity.ChunksEntity;
import java.util.List;
import java.util.Map;
/**
* ${comments}
*
* @author liushujing liushujing@philisense.com
* @since 1.0.0 2025-02-10
*/
public interface ChunksService extends CrudService<ChunksEntity, ChunksDTO> {
List<Map<String,Object>> search(String userid,String text);
}

@ -0,0 +1,18 @@
package com.pjilisense.flxai.service;
import com.pjilisense.flxai.base.service.CrudService;
import com.pjilisense.flxai.dto.DigitalImgDTO;
import com.pjilisense.flxai.entity.DigitalImgEntity;
import java.util.List;
/**
* ${comments}
*
* @author liushujing liushujing@philisense.com
* @since 1.0.0 2025-02-26
*/
public interface DigitalImgService extends CrudService<DigitalImgEntity, DigitalImgDTO> {
List<DigitalImgDTO> getAllByType(String imgType);
}

@ -0,0 +1,15 @@
package com.pjilisense.flxai.service;
import com.pjilisense.flxai.base.service.CrudService;
import com.pjilisense.flxai.dto.FileChunksDTO;
import com.pjilisense.flxai.entity.FileChunksEntity;
/**
* ${comments}
*
* @author liushujing liushujing@philisense.com
* @since 1.0.0 2025-02-10
*/
public interface FileChunksService extends CrudService<FileChunksEntity, FileChunksDTO> {
}

@ -0,0 +1,15 @@
package com.pjilisense.flxai.service;
import com.pjilisense.flxai.base.service.CrudService;
import com.pjilisense.flxai.dto.GlobalFilesDTO;
import com.pjilisense.flxai.entity.GlobalFilesEntity;
/**
* ${comments}
*
* @author liushujing liushujing@philisense.com
* @since 1.0.0 2025-02-10
*/
public interface GlobalFilesService extends CrudService<GlobalFilesEntity, GlobalFilesDTO> {
}

@ -0,0 +1,15 @@
package com.pjilisense.flxai.service;
import com.pjilisense.flxai.base.service.CrudService;
import com.pjilisense.flxai.dto.MyDigitalHumanDTO;
import com.pjilisense.flxai.entity.MyDigitalHumanEntity;
/**
* ${comments}
*
* @author liushujing liushujing@philisense.com
* @since 1.0.0 2025-02-26
*/
public interface MyDigitalHumanService extends CrudService<MyDigitalHumanEntity, MyDigitalHumanDTO> {
}

@ -0,0 +1,296 @@
package com.pjilisense.flxai.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.hankcs.hanlp.HanLP;
import com.hankcs.hanlp.seg.Segment;
import com.hankcs.hanlp.seg.common.Term;
import com.pjilisense.flxai.base.service.impl.CrudServiceImpl;
import com.pjilisense.flxai.dao.ChunksDao;
import com.pjilisense.flxai.dto.ChunksDTO;
import com.pjilisense.flxai.entity.ChunksEntity;
import com.pjilisense.flxai.service.ChunksService;
import cn.hutool.core.util.StrUtil;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.*;
/**
* ${comments}
*
* @author liushujing liushujing@philisense.com
* @since 1.0.0 2025-02-10
*/
@Service
public class ChunksServiceImpl extends CrudServiceImpl<ChunksDao, ChunksEntity, ChunksDTO> implements ChunksService {
@Override
public QueryWrapper<ChunksEntity> getWrapper(Map<String, Object> params){
String id = (String)params.get("id");
QueryWrapper<ChunksEntity> wrapper = new QueryWrapper<>();
wrapper.eq(StrUtil.isNotBlank(id), "id", id);
return wrapper;
}
@Override
public List<Map<String, Object>> search(String userid,String keyText) {
return search1( userid, keyText);
}
private List<Map<String, Object>> search1(String userid,String keyText) {
Segment seg= HanLP.newSegment();
seg.enableCustomDictionary(false);
List<Term> lst = seg.seg(keyText);
ArrayList<String> listWord=processTermList(lst);
//ArrayList<String> listSentence=processTermListx(lst);
LinkedHashSet<String> set = new LinkedHashSet<>();
set.addAll(listWord);
//set.addAll(listSentence);
listWord.clear();
//listSentence.clear();
ArrayList<String> wordList=processTermList(lst);
wordList.addAll(set);
set.clear();
HashMap<String,Object> map = new HashMap<>();
map.put("userid",userid);
map.put("wordList",wordList);
List<Map<String,Object>> list = baseDao.queryCsv(map);
List<Map<String,Object>> listRet = new ArrayList<>() ;
if(list!=null && list.size()>0) {
ArrayList<String> listText=processTermListN0Com(lst);
List<String> idList = new ArrayList<>();
for (Map<String, Object> mp: list){
String ttext = String.valueOf(mp.get("text"));
int pos = ttext.indexOf(',');
String question = ttext.substring(0,pos);
String answer = ttext.substring(pos+1);
mp.put("question",question);
mp.put("answer",answer);
List<Term> lst2 = seg.seg(question);
ArrayList<String> listQuestion=processTermListN0Com(lst2);
double similarity =calculateSimilarity(listText, listQuestion);
BigDecimal bd = new BigDecimal(similarity);
if(bd.compareTo(BigDecimal.ZERO.stripTrailingZeros())==0){
idList.add(String.valueOf(mp.get("id")));
} else {
System.out.println(bd.toString());
mp.put("similarity",bd.toString());
}
}
for(Map<String, Object> mp: list){
String id=String.valueOf(mp.get("id"));
if(!idList.contains(id)){
listRet.add(mp);
}
}
list.clear();
list.addAll(listRet);
Collections.sort(list, new Comparator<Map<String, Object>>() {
@Override
public int compare(Map<String, Object> o1, Map<String, Object> o2) {
BigDecimal bd1 = new BigDecimal(String.valueOf(o1.get("similarity")));
BigDecimal bd2 = new BigDecimal(String.valueOf(o2.get("similarity")));
return bd1.compareTo(bd2)*(-1);
}
});
}
return list;
}
private List<Map<String, Object>> search2(String userid,String keyText) {
Segment seg= HanLP.newSegment();
seg.enableCustomDictionary(false);
List<Term> lst = seg.seg(keyText);
ArrayList<String> listWord=processTermList(lst);
LinkedHashSet<String> set = new LinkedHashSet<>();
set.addAll(listWord);
listWord.clear();
ArrayList<String> wordList=processTermList(lst);
wordList.addAll(set);
set.clear();
HashMap<String,Object> map = new HashMap<>();
map.put("userid",userid);
map.put("wordList",wordList);
List<Map<String,Object>> list = baseDao.queryCsv(map);
List<Map<String,Object>> listRet = new ArrayList<>() ;
if(list!=null && list.size()>0) {
ArrayList<String> listText=processTermListN0Com(lst);
List<String> idList = new ArrayList<>();
for (Map<String, Object> mp: list){
String ttext = String.valueOf(mp.get("text"));
List<Term> lst2 = seg.seg(ttext);
ArrayList<String> listQuestion=processTermListN0Com(lst2);
double similarity =calculateSimilarity(listText, listQuestion);
BigDecimal bd = new BigDecimal(similarity);
if(bd.compareTo(BigDecimal.ZERO.stripTrailingZeros())==0){
idList.add(String.valueOf(mp.get("id")));
} else {
System.out.println(bd.toString());
mp.put("similarity",bd.toString());
}
}
for(Map<String, Object> mp: list){
String id=String.valueOf(mp.get("id"));
if(!idList.contains(id)){
listRet.add(mp);
}
}
list.clear();
list.addAll(listRet);
Collections.sort(list, new Comparator<Map<String, Object>>() {
@Override
public int compare(Map<String, Object> o1, Map<String, Object> o2) {
BigDecimal bd1 = new BigDecimal(String.valueOf(o1.get("similarity")));
BigDecimal bd2 = new BigDecimal(String.valueOf(o2.get("similarity")));
return bd1.compareTo(bd2)*(-1);
}
});
}
return list;
}
private static ArrayList<String> processTermList(List<Term> lst) {
ArrayList<String> ret = new ArrayList<>();
StringBuilder sd = new StringBuilder();
for(int i=0;i<lst.size();i++) {
Term term = lst.get(i);
if(term.nature.startsWith('w')) {
if(sd.length()>0) {
ret.add(sd.toString());
sd = sd.delete(0,sd.length());
}
continue;
}else {
String word = term.word;
if(word.length()==1) {
sd.append(word);
if(i+1< lst.size()) {
Term termx = lst.get(i+1);
if(!termx.nature.startsWith('w')) {
String wordx = termx.word;
sd.append(wordx);
if(wordx.length()>1) {
ret.add(sd.toString());
sd = sd.delete(0,sd.length());
}
i++;
}
}
} else {
sd.append(word);
ret.add(sd.toString());
sd = sd.delete(0,sd.length());
}
}
}
// System.out.println("ret=");
// for(String term : ret) {
// System.out.println(term);
// }
return ret;
}
private static ArrayList<String> processTermListN0Com(List<Term> lst) {
ArrayList<String> ret = new ArrayList<>();
StringBuilder sd = new StringBuilder();
for(int i=0;i<lst.size();i++) {
Term term = lst.get(i);
if(term.nature.startsWith('w')) {
if(sd.length()>0) {
ret.add(sd.toString());
sd = sd.delete(0,sd.length());
}
continue;
}else {
String word = term.word;
if(word.length()==1) {
sd.append(word);
if(i+1< lst.size()) {
Term termx = lst.get(i+1);
if(!termx.nature.startsWith('w')) {
String wordx = termx.word;
sd.append(wordx);
if(wordx.length()>0) {
ret.add(sd.toString());
sd = sd.delete(0,sd.length());
}
i++;
}
}
} else {
sd.append(word);
ret.add(sd.toString());
sd = sd.delete(0,sd.length());
}
}
}
// System.out.println("ret=");
// for(String term : ret) {
// System.out.println(term);
// }
return ret;
}
private static ArrayList<String> processTermListx(List<Term> lst) {
ArrayList<String> ret = new ArrayList<>();
StringBuilder sd = new StringBuilder();
for(int i=0;i<lst.size();i++) {
Term term = lst.get(i);
if(term.nature.startsWith('w')) {
if(sd.length()>0) {
ret.add(sd.toString());
sd = sd.delete(0,sd.length());
}
continue;
}else {
String word = term.word;
sd.append(word);
}
}
// System.out.println("ret=");
// for(String term : ret) {
// System.out.println(term);
// }
return ret;
}
// 创建单词频率映射
private Map<String, Integer> createFrequencyMap(List<String> words) {
Map<String, Integer> freqMap = new HashMap<>();
for (String word : words) {
freqMap.put(word, freqMap.getOrDefault(word, 0) + 1);
}
return freqMap;
}
// 计算余弦相似度
private double calculateSimilarity(List<String> words1, List<String> words2) {
// List<String> words1 = preprocessText(text1);
// List<String> words2 = preprocessText(text2);
Map<String, Integer> freqMap1 = createFrequencyMap(words1);
Map<String, Integer> freqMap2 = createFrequencyMap(words2);
double dotProduct = 0.0;
double magnitude1 = 0.0;
double magnitude2 = 0.0;
for (String word : freqMap1.keySet()) {
int freq1 = freqMap1.get(word);
magnitude1 += freq1 * freq1;
if (freqMap2.containsKey(word)) {
int freq2 = freqMap2.get(word);
dotProduct += freq1 * freq2;
}
}
for (int freq : freqMap2.values()) {
magnitude2 += freq * freq;
}
return dotProduct / (Math.sqrt(magnitude1) * Math.sqrt(magnitude2));
}
}

@ -0,0 +1,44 @@
package com.pjilisense.flxai.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.pjilisense.flxai.base.service.impl.CrudServiceImpl;
import com.pjilisense.flxai.dao.DigitalImgDao;
import com.pjilisense.flxai.dto.DigitalImgDTO;
import com.pjilisense.flxai.entity.AppToolsSetEntity;
import com.pjilisense.flxai.entity.DigitalImgEntity;
import com.pjilisense.flxai.service.DigitalImgService;
import cn.hutool.core.util.StrUtil;
import com.pjilisense.flxai.utils.ConvertUtils;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
/**
* ${comments}
*
* @author liushujing liushujing@philisense.com
* @since 1.0.0 2025-02-26
*/
@Service
public class DigitalImgServiceImpl extends CrudServiceImpl<DigitalImgDao, DigitalImgEntity, DigitalImgDTO> implements DigitalImgService {
@Override
public QueryWrapper<DigitalImgEntity> getWrapper(Map<String, Object> params){
String id = (String)params.get("id");
QueryWrapper<DigitalImgEntity> wrapper = new QueryWrapper<>();
wrapper.eq(StrUtil.isNotBlank(id), "id", id);
return wrapper;
}
@Override
public List<DigitalImgDTO> getAllByType(String imgType) {
QueryWrapper<DigitalImgEntity> wrapper = new QueryWrapper<>();
wrapper.eq(StrUtil.isNotBlank(imgType), "img_type", imgType);
wrapper.orderByAsc("id");
List<DigitalImgEntity> entityList =baseDao.selectList(wrapper);
return ConvertUtils.sourceToTarget(entityList, DigitalImgDTO.class);
}
}

@ -0,0 +1,34 @@
package com.pjilisense.flxai.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.pjilisense.flxai.base.service.impl.CrudServiceImpl;
import com.pjilisense.flxai.dao.FileChunksDao;
import com.pjilisense.flxai.dto.FileChunksDTO;
import com.pjilisense.flxai.entity.FileChunksEntity;
import com.pjilisense.flxai.service.FileChunksService;
import cn.hutool.core.util.StrUtil;
import org.springframework.stereotype.Service;
import java.util.Map;
/**
* ${comments}
*
* @author liushujing liushujing@philisense.com
* @since 1.0.0 2025-02-10
*/
@Service
public class FileChunksServiceImpl extends CrudServiceImpl<FileChunksDao, FileChunksEntity, FileChunksDTO> implements FileChunksService {
@Override
public QueryWrapper<FileChunksEntity> getWrapper(Map<String, Object> params){
String id = (String)params.get("id");
QueryWrapper<FileChunksEntity> wrapper = new QueryWrapper<>();
wrapper.eq(StrUtil.isNotBlank(id), "id", id);
return wrapper;
}
}

@ -0,0 +1,34 @@
package com.pjilisense.flxai.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.pjilisense.flxai.base.service.impl.CrudServiceImpl;
import com.pjilisense.flxai.dao.GlobalFilesDao;
import com.pjilisense.flxai.dto.GlobalFilesDTO;
import com.pjilisense.flxai.entity.GlobalFilesEntity;
import com.pjilisense.flxai.service.GlobalFilesService;
import cn.hutool.core.util.StrUtil;
import org.springframework.stereotype.Service;
import java.util.Map;
/**
* ${comments}
*
* @author liushujing liushujing@philisense.com
* @since 1.0.0 2025-02-10
*/
@Service
public class GlobalFilesServiceImpl extends CrudServiceImpl<GlobalFilesDao, GlobalFilesEntity, GlobalFilesDTO> implements GlobalFilesService {
@Override
public QueryWrapper<GlobalFilesEntity> getWrapper(Map<String, Object> params){
String id = (String)params.get("id");
QueryWrapper<GlobalFilesEntity> wrapper = new QueryWrapper<>();
wrapper.eq(StrUtil.isNotBlank(id), "id", id);
return wrapper;
}
}

@ -0,0 +1,34 @@
package com.pjilisense.flxai.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.pjilisense.flxai.base.service.impl.CrudServiceImpl;
import com.pjilisense.flxai.dao.MyDigitalHumanDao;
import com.pjilisense.flxai.dto.MyDigitalHumanDTO;
import com.pjilisense.flxai.entity.MyDigitalHumanEntity;
import com.pjilisense.flxai.service.MyDigitalHumanService;
import cn.hutool.core.util.StrUtil;
import org.springframework.stereotype.Service;
import java.util.Map;
/**
* ${comments}
*
* @author liushujing liushujing@philisense.com
* @since 1.0.0 2025-02-26
*/
@Service
public class MyDigitalHumanServiceImpl extends CrudServiceImpl<MyDigitalHumanDao, MyDigitalHumanEntity, MyDigitalHumanDTO> implements MyDigitalHumanService {
@Override
public QueryWrapper<MyDigitalHumanEntity> getWrapper(Map<String, Object> params){
String id = (String)params.get("id");
QueryWrapper<MyDigitalHumanEntity> wrapper = new QueryWrapper<>();
wrapper.eq(StrUtil.isNotBlank(id), "id", id);
return wrapper;
}
}

@ -0,0 +1,146 @@
package com.pjilisense.flxai.utils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Repository;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.*;
@Repository
public class FileUtil {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Value("${file.common.uploadWindow}")
private String diskPath;
@Value("${file.common.uploadLinux}")
private String uploadLinux;
@Value("${file.common.uploadUrl}")
private String uploadUrl;
public String uploadFile(MultipartFile multipartFile){
String relPath="uploads/";
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM");
relPath = relPath+sdf.format(new Date()).substring(0,6)+"/";
//⽂件的完整名称,如spring.jpeg
String filename = multipartFile.getOriginalFilename();
//⽂件后缀,如.jpeg
assert filename != null;
String suffix = filename.substring(filename.lastIndexOf("."));
relPath =relPath+"/"+UUID.randomUUID().toString().replace("-","")+"."+suffix;
//⽬标⽂件
File descFile = new File(getFilepath(relPath));
//判断⽬标⽂件所在的⽬录是否存在
if (!descFile.getParentFile().exists()) {
descFile.getParentFile().mkdirs();
}
try (InputStream is = multipartFile.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(descFile))) {
int num = 0;
while ((num = bis.read()) != -1) {
bos.write(num);
}
} catch (Exception e) {
//log.error(e.getMessage());
throw new RuntimeException("文件上传错误,请联系管理员");
}
return relPath;
}
/**
*
* @return int 1 0
*/
public int delFile(String filepath, String fileName) {
String rootPath = getFilepath (filepath);
File file = new File(rootPath);
if (file.exists()) {
if(file.isDirectory()) {
File filex = new File(rootPath+"/"+fileName);
if(filex.exists()) {
filex.delete();
}
return 1;
} else {
file.delete();
return 1;
}
}
return 0;
}
public void downLoadFile(String filepath, String filename, HttpServletResponse response){
String rootPath = getFilepath (filepath);
File file = new File(rootPath);
if(file.exists()){
InputStream inputStream = null;
OutputStream outputStream = null;
try {
// 读到流中
if(file.isDirectory()) {
inputStream = new FileInputStream(filepath +"/"+ filename);// 文件的存放路径
} else {
inputStream = new FileInputStream(filepath);//filepath可能包含文件名
}
response.reset();
response.setContentType("application/octet-stream");
response.addHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(filename, "UTF-8"));
outputStream = response.getOutputStream();
byte[] b = new byte[1024];
int len;
//从输入流中读取一定数量的字节,并将其存储在缓冲区字节数组中,读到末尾返回-1
while ((len = inputStream.read(b)) > 0) {
outputStream.write(b, 0, len);
}
} catch (IOException e) {
//log.error(e.getMessage(), e);
}finally {
try {
inputStream.close();
inputStream.close();
} catch (IOException e) {
//log.error(e.getMessage(), e);
}
}
}
}
public String getFilepath (final String filepath) {//filepath可能包含文件名
String rootPath = getRootpath();
rootPath = rootPath +"/"+ filepath;
rootPath =rootPath.replace("//","/");
if(rootPath.endsWith("/")){
rootPath=rootPath.substring(0,rootPath.length()-1);
}
return rootPath;
}
public String getRootpath () {//filepath可能包含文件名
String rootPath = null;
if (System.getProperty("os.name").startsWith("Windows")) {
rootPath = diskPath;
} else if (System.getProperty("os.name").startsWith("Linux")) {
rootPath = uploadLinux;
}
rootPath =rootPath.replace("//","/");
if(rootPath.endsWith("/")){
rootPath=rootPath.substring(0,rootPath.length()-1);
}
return rootPath;
}
}

@ -60,4 +60,11 @@ mybatis-plus:
configuration-properties:
prefix:
blobType: BLOB
boolValue: TRUE
boolValue: TRUE
file:
common:
## windows系统下访问路径
uploadWindow: d:/ceshi/sysfile
## Linux系统下访问路径
uploadLinux: /user/img/
uploadUrl: /upload/

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.pjilisense.flxai.dao.ChunksDao">
<resultMap type="com.pjilisense.flxai.entity.ChunksEntity" id="chunksMap">
<result property="id" column="id" typeHandler="com.pjilisense.flxai.handle.UUIDTypeHandler"/>
<result property="text" column="text"/>
<result property="abstractx" column="abstract"/>
<result property="metadata" column="metadata" typeHandler="com.pjilisense.flxai.handle.JsonbTypeHandler"/>
<result property="index" column="index"/>
<result property="type" column="type"/>
<result property="createdAt" column="created_at" jdbcType="TIMESTAMP_WITH_TIMEZONE" javaType="java.time.OffsetDateTime" />
<result property="updatedAt" column="updated_at" jdbcType="TIMESTAMP_WITH_TIMEZONE" javaType="java.time.OffsetDateTime" />
<result property="userId" column="user_id"/>
<result property="accessedAt" column="accessed_at" jdbcType="TIMESTAMP_WITH_TIMEZONE" javaType="java.time.OffsetDateTime"/>
</resultMap>
<resultMap type="java.util.Map" id="BaseResultMap">
<result property="id" column="id" typeHandler="com.pjilisense.flxai.handle.UUIDTypeHandler"/>
<result property="text" column="text"/>
<result property="fid" column="fid"/>
<result property="fname" column="fname" />
</resultMap>
<select id="queryCsv" resultMap="BaseResultMap" parameterType="java.util.Map">
select a.id ,a."text" ,f.id as fid ,f."name" as fname from chunks a left join file_chunks fc on fc.chunk_id =a.id
left join files f on f.id =fc.file_id
where f.file_type ='text/plain' and a.user_id =#{userid}
<if test="wordList != null">
AND
<foreach collection="wordList" item="word" index="index" open="(" close=")" separator="or">
a."text" like '%${word}%'
</foreach>
</if>
</select>
</mapper>

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.pjilisense.flxai.dao.DigitalImgDao">
<resultMap type="com.pjilisense.flxai.entity.DigitalImgEntity" id="digitalImgMap">
<result property="id" column="id"/>
<result property="name" column="name"/>
<result property="imgPath" column="img_path"/>
<result property="imgType" column="img_type"/>
</resultMap>
</mapper>

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.pjilisense.flxai.dao.FileChunksDao">
<resultMap type="com.pjilisense.flxai.entity.FileChunksEntity" id="fileChunksMap">
<result property="fileId" column="file_id"/>
<result property="chunkId" column="chunk_id" typeHandler="com.pjilisense.flxai.handle.UUIDTypeHandler"/>
<result property="createdAt" column="created_at" jdbcType="TIMESTAMP_WITH_TIMEZONE" javaType="java.time.OffsetDateTime"/>
</resultMap>
</mapper>

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.pjilisense.flxai.dao.GlobalFilesDao">
<resultMap type="com.pjilisense.flxai.entity.GlobalFilesEntity" id="globalFilesMap">
<result property="hashId" column="hash_id"/>
<result property="fileType" column="file_type"/>
<result property="size" column="size"/>
<result property="url" column="url"/>
<result property="metadata" column="metadata" typeHandler="com.pjilisense.flxai.handle.JsonbTypeHandler"/>
<result property="createdAt" column="created_at" jdbcType="TIMESTAMP_WITH_TIMEZONE" javaType="java.time.OffsetDateTime"/>
<result property="accessedAt" column="accessed_at" jdbcType="TIMESTAMP_WITH_TIMEZONE" javaType="java.time.OffsetDateTime"/>
</resultMap>
</mapper>

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.pjilisense.flxai.dao.MyDigitalHumanDao">
<resultMap type="com.pjilisense.flxai.entity.MyDigitalHumanEntity" id="myDigitalHumanMap">
<result property="id" column="id"/>
<result property="userid" column="userid"/>
<result property="imageid" column="imageid"/>
<result property="sceneimgid" column="sceneimgid"/>
<result property="bkimgid" column="bkimgid"/>
<result property="voiceid" column="voiceid"/>
<result property="videoimg" column="videoimg"/>
<result property="videodir" column="videodir"/>
<result property="voicedir" column="voicedir"/>
</resultMap>
<resultMap type="java.util.Map" id="BaseResultMap">
<result property="id" column="id"/>
<result property="userid" column="userid"/>
<result property="imageid" column="imageid"/>
<result property="sceneimgid" column="sceneimgid"/>
<result property="bkimgid" column="bkimgid"/>
<result property="voiceid" column="voiceid"/>
<result property="videoimg" column="videoimg"/>
<result property="videodir" column="videodir"/>
<result property="voicedir" column="voicedir"/>
</resultMap>
</mapper>

@ -0,0 +1,45 @@
/**
* Copyright (c) 2018 All rights reserved.
* <p>
* https://www.renren.io
* <p>
*
*/
package test.com.pjilisense.flxai.controller;
import com.alibaba.fastjson.JSON;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import test.com.pjilisense.flxai.TestUtils;
import java.util.HashMap;
import java.util.Map;
public class ChunksControllerTest {
@BeforeEach
public void setUpTestDataWithinTransaction() {
// set up test data within the transaction
}
@AfterEach
public void tearDownWithinTransaction() {
// execute "tear down" logic within the transaction
}
@Test
public void testGetAllAiTools() {
String url = TestUtils.WebconnectURL+"/api/robot/chunks/search";
String charset = TestUtils.UTF8;
try {
Map<String, Object> params = new HashMap<String, Object>();
params.put("text","开源项目");
params.put("userId","2f3c5337-cf1a-40ce-bbe3-ec45455d82f1");
String body = TestUtils.doPost(url, JSON.toJSONString(params), charset);
System.out.println(body);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Loading…
Cancel
Save