Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
L
loveisland
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
刘小敏
loveisland
Commits
d68561b1
Commit
d68561b1
authored
May 26, 2026
by
刘小敏
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
数据中心js优化;3D试戴AI指令根据不同佩戴方式的耳饰区分AI指令;
parent
0c953e5c
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
93 additions
and
11 deletions
+93
-11
AiImgGen.php
addons/shopro/job/AiImgGen.php
+5
-1
GoodsService.php
addons/shopro/service/goods/GoodsService.php
+26
-0
Ai.php
addons/shopro/service/user/Ai.php
+59
-7
config.php
application/config.php
+3
-0
dashboard.js
public/assets/js/backend/shopro/dashboard.js
+0
-3
No files found.
addons/shopro/job/AiImgGen.php
View file @
d68561b1
...
...
@@ -64,14 +64,18 @@ class AiImgGen extends BaseJob
return
false
;
}
$this
->
debug_log
(
'[AI图片异步队列] AI生成图片接口入参 :用户ID:'
.
$user_id
.
' tryondata:'
.
json_encode
(
$tryOn
->
toArray
()));
// 合成AI图
$aiService
=
new
Ai
();
$res
=
$aiService
->
generateImage
(
$tryOn
->
toArray
(),
$user_id
,
'url'
);
$this
->
debug_log
(
'[AI图片异步队列] AI生成图片接口出参 :用户ID:'
.
$user_id
.
' res:'
.
json_encode
(
$res
));
// 我的试戴
if
(
$res
[
'code'
]
===
0
)
{
AiTryOnModel
::
where
(
'id'
,
$id
)
->
where
(
'user_id'
,
$user_id
)
->
update
([
'ai_status'
=>
2
,
'ai_err_msg'
=>
$res
[
'msg'
]]);
$job
->
delete
();
return
false
;
...
...
addons/shopro/service/goods/GoodsService.php
View file @
d68561b1
...
...
@@ -581,4 +581,30 @@ class GoodsService
return
$count
>
0
?
1
:
0
;
}
/**
* 判断商品分类是否在AI试戴的分类ID数组中
*
* @param string $cateIds 商品分类IDS
* @param string $allowCateIds AI允许试戴分类IDS
* return int
*/
public
function
isCateAllowedAi
(
$cateIds
,
$allowCateIds
)
{
if
(
empty
(
$cateIds
)
||
empty
(
$allowCateIds
))
{
return
0
;
}
$cateIdArray
=
array_map
(
'trim'
,
explode
(
','
,
$cateIds
));
$allowIdArray
=
array_map
(
'trim'
,
explode
(
','
,
$allowCateIds
));
foreach
(
$cateIdArray
as
$cateId
)
{
if
(
in_array
(
$cateId
,
$allowIdArray
))
{
return
1
;
}
}
return
0
;
}
}
addons/shopro/service/user/Ai.php
View file @
d68561b1
...
...
@@ -4,6 +4,8 @@ namespace addons\shopro\service\user;
use
addons\shopro\library\HttpClient
as
Http
;
use
addons\shopro\notification\ai\AiVideoSuccess
;
use
addons\shopro\service\commission\Goods
;
use
addons\shopro\service\goods\GoodsService
;
use
app\admin\model\shopro\AiTryon
as
AiTryOnModel
;
use
app\admin\model\shopro\user\User
;
use
think\Config
;
...
...
@@ -119,6 +121,50 @@ class Ai
return
0
;
}
}
/**
* 根据商品分类判断AI耳饰类型
*
* 根据商品分类ID判断应该使用什么类型的AI指令
* - earlobe: 耳垂款式,AI指令戴到耳垂正中间
* - clip: 耳骨夹款式,戴到耳骨上
* - mix: 叠戴耳饰,根据款式叠戴到耳垂和耳廓上
*
* @param int $goodsId 商品ID
* @return string 耳饰类型:earlobe / clip / mix
*/
public
function
getAiEarringType
(
$goodsId
)
{
$goodsService
=
new
GoodsService
();
$goods
=
$goodsService
->
up
()
->
whereIds
(
$goodsId
)
->
find
();
if
(
!
$goods
||
empty
(
$goods
->
category_ids
))
{
return
'earlobe'
;
}
$categoryIds
=
$goods
->
category_ids
;
$allowCateEarlobe
=
config
(
'shopro.ai_earlobe'
)
?:
''
;
$allowCateClip
=
config
(
'shopro.ai_clip'
)
?:
''
;
$allowCateMix
=
config
(
'shopro.ai_mix'
)
?:
''
;
$prompt_clip
=
'1:1 原样复刻图 1 人物容貌、姿势、场景与光影色调。将图 2 的耳骨夹精准佩戴在耳廓外侧合适位置,紧密贴合耳部轮廓、比例适配,佩戴稳固,无悬空、变形、拉伸、重复问题。人像轻度自然修肤,保留皮肤原生细节,五官比例不变,杜绝网红假脸与 AI 建模违和感。仅外露耳朵佩戴饰品,隐耳不添加配饰。画质高清细腻,统一原图风格,呈现真实珠宝实拍效果。'
;
$prompt_mix
=
'1:1 原样复刻图 1 人物容貌、姿势、场景与光影色调。将图 2 的叠戴耳饰组合佩戴于耳部不同位置,错落搭配、贴合耳部肌肤,整体比例协调,佩戴稳固,无悬空、变形、拉伸、错位问题。人像轻度自然修肤,保留皮肤原生细节,五官比例不变,杜绝网红假脸与 AI 建模违和感。仅外露耳朵佩戴饰品,隐耳不添加配饰。画质高清细腻,统一原图风格,呈现真实珠宝实拍效果。'
;
$prompt_earlobe
=
'1:1 原样复刻图 1 人物容貌、姿势、场景与光影色调。将图 2 的耳坠(耳钉式)精准佩戴在耳垂正中,贴合肌肤、比例适配,针部完全穿过耳垂,无悬空变形拉伸重复问题。人像轻度自然修肤,保留皮肤原生细节,五官比例不变,杜绝网红假脸与 AI 建模违和感。仅外露耳朵佩戴饰品,隐耳不添加配饰。画质高清细腻,统一原图风格,呈现真实珠宝实拍效果。'
;
if
(
$goodsService
->
isCateAllowedAi
(
$categoryIds
,
$allowCateClip
))
{
return
$prompt_clip
;
}
if
(
$goodsService
->
isCateAllowedAi
(
$categoryIds
,
$allowCateMix
))
{
return
$prompt_mix
;
}
if
(
$goodsService
->
isCateAllowedAi
(
$categoryIds
,
$allowCateEarlobe
))
{
return
$prompt_earlobe
;
}
return
$prompt_earlobe
;
}
/**
* AI 生成图片
...
...
@@ -130,16 +176,19 @@ class Ai
public
function
generateImage
(
$param
=
[],
$userId
=
0
,
$response_format
=
'b64_json'
)
{
try
{
$url
=
$this
->
ark_host
.
'/api/v3/images/generations'
;
// $prompt = '严格复刻图片1 人物所有样貌特征、肢体姿势、场景背景、光影氛围一丝不变,精准匹配图片2 耳饰饰品佩戴到人物对应耳部位置,饰品贴合肌肤轮廓、尺寸比例适配、定点标准不跑偏、不悬空不变形不拉伸不重复生成;人物做原生自然轻度磨皮,柔和流畅瘦脸修容,保留真实皮肤纹理与面部细节,拒绝过度美颜、拒绝网红假脸、拒绝锥脸畸形,五官原生比例不改动,无建模感、无生硬 AI 违和感,整体色调光影统一,高清超清细节拉满,纯真人电商珠宝实拍大片质感,原图风格画质全程不变。';
// $prompt = '严格复刻图 1 人物样貌、姿势、背景与光影,将图 2 耳饰精准贴合佩戴于耳部,比例适配贴合不形变。人物自然轻磨皮柔和修脸,保留原生五官与皮肤细节,不假脸无 AI 违和感,色调光影统一,高清实拍珠宝电商质感。';
// 单耳戴
$prompt
=
'1:1 原样复刻图 1 人物容貌、姿势、场景与光影色调。将图 2 的耳坠(耳钉式)精准佩戴在耳垂正中,贴合肌肤、比例适配,针部完全穿过耳垂,无悬空变形拉伸重复问题。人像轻度自然修肤,保留皮肤原生细节,五官比例不变,杜绝网红假脸与 AI 建模违和感。仅外露耳朵佩戴饰品,隐耳不添加配饰。画质高清细腻,统一原图风格,呈现真实珠宝实拍效果。'
;
$prompt
=
$this
->
getAiEarringType
(
$param
[
'goods_id'
]);
// $prompt = '1:1 原样复刻图 1 人物容貌、姿势、场景与光影色调。将图 2 的耳坠(耳钉式)精准佩戴在耳垂正中,贴合肌肤、比例适配,针部完全穿过耳垂,无悬空变形拉伸重复问题。人像轻度自然修肤,保留皮肤原生细节,五官比例不变,杜绝网红假脸与 AI 建模违和感。仅外露耳朵佩戴饰品,隐耳不添加配饰。画质高清细腻,统一原图风格,呈现真实珠宝实拍效果。';
// 单耳照 漏两耳戴
// 第一版 精细指令
// $prompt = '严格复刻图片1 人物所有样貌特征、肢体姿势、场景背景、光影氛围一丝不变,精准匹配图片2 耳饰饰品佩戴到人物对应耳部位置,饰品贴合肌肤轮廓、尺寸比例适配、定点标准不跑偏、不悬空不变形不拉伸不重复生成;人物做原生自然轻度磨皮,柔和流畅瘦脸修容,保留真实皮肤纹理与面部细节,拒绝过度美颜、拒绝网红假脸、拒绝锥脸畸形,五官原生比例不改动,无建模感、无生硬 AI 违和感,整体色调光影统一,高清超清细节拉满,纯真人电商珠宝实拍大片质感,原图风格画质全程不变。';
// 第二版 简化高效指令
// $prompt = '严格复刻图 1 人物样貌、姿势、背景与光影,将图 2 耳饰精准贴合佩戴于耳部,比例适配贴合不形变。人物自然轻磨皮柔和修脸,保留原生五官与皮肤细节,不假脸无 AI 违和感,色调光影统一,高清实拍珠宝电商质感。';
// 第三版 单耳照 漏两耳戴 精细指令
// $prompt = '1:1 复刻图 1 人物五官样貌、肢体姿态、场景背景与光影色调,全程无改动。将图 2 耳饰精准佩戴在人物耳垂正中,饰品贴合耳部肌肤,比例尺寸协调,位置端正不偏移,杜绝悬空、变形、拉伸、重复生成瑕疵。人像仅做自然轻度磨皮、柔和修容,保留原生皮肤纹理与面部细节,五官比例不变,杜绝网红假脸、锥脸畸形与 AI 建模违和感。若原图仅单侧露耳,需调整人物角度,露出另一只耳朵并佩戴同款耳饰,保证双侧佩戴对称自然。画质高清细腻,整体光影色调与原图统一,呈现真实电商珠宝实拍质感。';
$url
=
$this
->
ark_host
.
'/api/v3/images/generations'
;
$params
=
[
'headers'
=>
[
'Authorization'
=>
'Bearer '
.
$this
->
api_key
,
...
...
@@ -247,7 +296,8 @@ class Ai
// $prompt = '人物自然微动,轻微转头,微笑,眨眼,动作柔和流畅,画面稳定不闪烁、不抖动、不扭曲,真实人像质感,高清清晰,饰品完美展示,整体自然优雅,无变形、无穿模、无悬浮';
// $prompt = '人物轻动转头,自然微笑眨眼,动作流畅柔和,画面稳定无抖动扭曲,真人高清质感,饰品完整清晰展示,整体优雅自然,无变形穿模悬浮';
// $prompt = '人物微动转头微笑,不要眨眼,动作顺滑画面稳定,高清真人质感,饰品清晰展示,无变形悬浮穿模';
$prompt
=
'人物全程全脸出镜,真人实拍质感,自然轻微转头浅笑,双目全程不眨眼,饰品完美展示,画面流畅稳定无卡顿,饰品轮廓细节清晰锐利,杜绝变形、悬浮、穿模问题,整体画质高清细腻。'
;
// $prompt = '人物全程全脸出镜,真人实拍质感,自然轻微转头浅笑,双目全程不眨眼,饰品完美展示,画面流畅稳定无卡顿,饰品轮廓细节清晰锐利,杜绝变形、悬浮、穿模问题,整体画质高清细腻。';
$prompt
=
'人物自然微动,轻微转头,微笑,动作柔和流畅,画面稳定不闪烁、不抖动、不扭曲,真实人像质感,高清清晰,饰品完美展示,整体自然优雅,无变形、无穿模、无悬浮'
;
$params
=
[
'headers'
=>
[
'Authorization'
=>
'Bearer '
.
$this
->
api_key
,
...
...
@@ -304,4 +354,6 @@ class Ai
];
}
}
}
application/config.php
View file @
d68561b1
...
...
@@ -321,6 +321,9 @@ return [
'api_host'
=>
Env
::
get
(
'app.api_host'
,
''
),
// 允许试戴的商品分类IDS
'allow_tryon_cate'
=>
Env
::
get
(
'app.allow_tryon_cate'
,
''
),
'ai_earlobe'
=>
Env
::
get
(
'app.ai_earlobe'
,
''
),
'ai_clip'
=>
Env
::
get
(
'app.ai_clip'
,
''
),
'ai_mix'
=>
Env
::
get
(
'app.ai_mix'
,
''
),
],
];
public/assets/js/backend/shopro/dashboard.js
View file @
d68561b1
...
...
@@ -894,7 +894,6 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'moment'], function (
return
{
onChangeDateTime
,
statistics
,
chartOption
,
initChart
,
drawX
,
...
...
@@ -903,8 +902,6 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'moment'], function (
loadStatistics
,
updateGmvChart
,
updateOrderChart
,
loadFunnel
,
loadPriceDistribution
,
loadRecentOrders
,
refreshAllData
,
switchPeriod
,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment