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
f5efc586
Commit
f5efc586
authored
May 06, 2026
by
刘小敏
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
AI试戴生成视频队列程序优化
parent
056d3466
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
363 additions
and
289 deletions
+363
-289
AiTryon.php
addons/shopro/controller/user/AiTryon.php
+3
-31
helper.php
addons/shopro/helper/helper.php
+7
-0
AiVideoGen.php
addons/shopro/job/AiVideoGen.php
+125
-46
Ai.php
addons/shopro/service/user/Ai.php
+1
-1
manifest.json
addons/shopro/uniapp/manifest.json
+227
-211
No files found.
addons/shopro/controller/user/AiTryon.php
View file @
f5efc586
...
@@ -172,9 +172,8 @@ class AiTryon extends Common
...
@@ -172,9 +172,8 @@ class AiTryon extends Common
*/
*/
public
function
genVideo
()
public
function
genVideo
()
{
{
if
(
!
$this
->
request
->
isPost
())
{
if
(
!
$this
->
request
->
isPost
())
{
$this
->
error
(
''
);
$this
->
error
(
'
请用post方式请求
'
);
}
}
$params
=
$this
->
request
->
only
([
$params
=
$this
->
request
->
only
([
...
@@ -184,7 +183,8 @@ class AiTryon extends Common
...
@@ -184,7 +183,8 @@ class AiTryon extends Common
$user
=
auth_user
();
$user
=
auth_user
();
\think\Queue
::
push
(
'\addons\shopro\job\AiVideoGen@save'
,
[
'taskid'
=>
'cgt-20260430190444-vmb4q'
,
'user'
=>
$user
],
'shopro-high'
);
\think\Queue
::
push
(
'\addons\shopro\job\AiVideoGen@save'
,
[
'taskid'
=>
'cgt-20260506113558-x6wtq'
,
'user'
=>
$user
],
'shopro-high'
);
$this
->
success
(
'推送队列成功'
);
exit
;
exit
;
$userService
=
new
User
();
$userService
=
new
User
();
...
@@ -232,32 +232,4 @@ class AiTryon extends Common
...
@@ -232,32 +232,4 @@ class AiTryon extends Common
}
}
}
}
/**
* AI试戴 查询视频生成状态
*/
public
function
getGenVideoTask
()
{
// curl -X GET https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks/{id} \
// -H "Content-Type: application/json" \
// -H "Authorization: Bearer $ARK_API_KEY"
}
/**
* AI试戴视频回调函数
* 更新 AI试戴视频结果状态
*/
public
function
updateAiTryonStatus
()
{
// 记录日志
// Log::info('TASKS ID:'. $taskId .' AI生成视频回调函数接口返回:'.json_encode($result));
// // 更新表状态
// $aiTryonModel = new AiTryOnModel();
// $aiTryonModel::where('ai_task_id' , $taskId)->update(['ai_status' => 1]);
}
}
}
addons/shopro/helper/helper.php
View file @
f5efc586
...
@@ -924,3 +924,10 @@ if (!function_exists('operate_disabled')) {
...
@@ -924,3 +924,10 @@ if (!function_exists('operate_disabled')) {
}
}
}
}
// 调试输出
if
(
!
function_exists
(
'debug_echo'
))
{
function
debug_echo
(
$text
=
''
)
{
echo
PHP_EOL
.
'------'
.
$text
.
'------'
.
PHP_EOL
;
}
}
addons/shopro/job/AiVideoGen.php
View file @
f5efc586
...
@@ -7,39 +7,36 @@ use addons\shopro\library\HttpClient as Http;
...
@@ -7,39 +7,36 @@ use addons\shopro\library\HttpClient as Http;
use
app\admin\model\shopro\AiTryon
as
AiTryOnModel
;
use
app\admin\model\shopro\AiTryon
as
AiTryOnModel
;
use
think\Log
;
use
think\Log
;
use
think\queue\Job
;
use
think\queue\Job
;
//use think\Db;
//use think\exception\HttpResponseException;
//use app\admin\model\shopro\order\Order;
//use addons\shopro\service\StockSale;
//use app\admin\model\shopro\user\User;
//use app\admin\model\shopro\order\Invoice as OrderInvoice;
//use addons\shopro\service\order\OrderOper;
//use addons\shopro\facade\Activity as ActivityFacade;
/**
/**
*
订单自动操作
*
AI生成的视频保存到本地并更新数据表
*/
*/
class
AiVideoGen
extends
BaseJob
class
AiVideoGen
extends
BaseJob
{
{
// 火山引擎方舟配置
// 火山引擎方舟配置
private
$ark_host
=
'https://ark.cn-beijing.volces.com'
;
private
$ark_host
=
'https://ark.cn-beijing.volces.com'
;
private
$public_dir
=
ROOT_PATH
.
'public'
;
/**
* 保存远端视频文件到本地
*/
private
function
saveVideoLoc
(
$videoUrl
){
private
function
saveVideoLoc
(
$videoUrl
){
// 1生成存储目录(fastadmin标准uploads目录)
debug_echo
(
'videoUrl: '
.
$videoUrl
);
$public_dir
=
ROOT_PATH
.
'public'
;
// 1 生成存储目录(fastadmin标准uploads目录)
$upload_dir
=
'/uploads/ai_video/'
.
date
(
'Ymd'
)
.
'/'
;
$upload_dir
=
'/uploads/ai_video/'
.
date
(
'Ymd'
)
.
'/'
;
$dir
=
$public_dir
.
$upload_dir
;
$dir
=
$
this
->
public_dir
.
$upload_dir
;
if
(
!
is_dir
(
$dir
))
{
if
(
!
is_dir
(
$dir
))
{
mkdir
(
$dir
,
0755
,
true
);
mkdir
(
$dir
,
0755
,
true
);
}
}
// 2 生成唯一文件名
// 2 生成唯一文件名
$filename
=
md5
(
time
()
.
uniqid
())
.
'.mp4'
;
$filename
=
md5
(
time
()
.
uniqid
())
.
'.mp4'
;
$full_path
=
$public_dir
.
$upload_dir
.
$filename
;
$full_path
=
$
this
->
public_dir
.
$upload_dir
.
$filename
;
// 视频地址
//
3 加载
视频地址
$ch
=
curl_init
(
$videoUrl
);
$ch
=
curl_init
(
$videoUrl
);
$fp
=
fopen
(
$full_path
,
'wb'
);
$fp
=
fopen
(
$full_path
,
'wb'
);
...
@@ -50,14 +47,21 @@ class AiVideoGen extends BaseJob
...
@@ -50,14 +47,21 @@ class AiVideoGen extends BaseJob
curl_setopt
(
$ch
,
CURLOPT_USERAGENT
,
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
);
curl_setopt
(
$ch
,
CURLOPT_USERAGENT
,
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
);
curl_setopt
(
$ch
,
CURLOPT_TIMEOUT
,
300
);
curl_setopt
(
$ch
,
CURLOPT_TIMEOUT
,
300
);
// 4 写入文件
curl_exec
(
$ch
);
curl_exec
(
$ch
);
$error
=
curl_error
(
$ch
);
$error
=
curl_error
(
$ch
);
$http_code
=
curl_getinfo
(
$ch
,
CURLINFO_HTTP_CODE
);
// 获取HTTP状态码
curl_close
(
$ch
);
curl_close
(
$ch
);
fclose
(
$fp
);
fclose
(
$fp
);
// 5. 检查是否下载成功
// 5 严格判断:网络错误 / HTTP状态码异常 / 文件为空
if
(
$error
)
{
if
(
$error
||
$http_code
>=
400
||
filesize
(
$full_path
)
===
0
)
{
return
0
;
// 下载失败,删除产生的空文件
if
(
file_exists
(
$full_path
))
{
unlink
(
$full_path
);
}
debug_echo
(
'视频下载失败:'
.
$error
.
"HTTP状态码:
{
$http_code
}
,文件为空"
);
return
0
;
// 统一失败返回值
}
}
if
(
!
file_exists
(
$full_path
))
{
if
(
!
file_exists
(
$full_path
))
{
...
@@ -67,6 +71,35 @@ class AiVideoGen extends BaseJob
...
@@ -67,6 +71,35 @@ class AiVideoGen extends BaseJob
return
$upload_dir
.
$filename
;
return
$upload_dir
.
$filename
;
}
}
/**
* 删除本地保存的视频文件
* @param string $videoPath 绝对路径(就是 saveVideoLoc 方法返回的路径,如:/uploads/ai_video/20250820/xxx.mp4)
* @return bool 删除成功返回 true,失败/文件不存在返回 false
*/
private
function
deleteLocalVideo
(
$videoPath
)
{
// 拼接完整物理路径(和保存时一致)
$fullPath
=
$this
->
public_dir
.
ltrim
(
$videoPath
,
'/'
);
// 1. 判断文件是否存在
if
(
!
file_exists
(
$fullPath
))
{
return
false
;
}
// 2. 判断是否是文件(防止误删目录)
if
(
!
is_file
(
$fullPath
))
{
return
false
;
}
// 3. 尝试删除文件
try
{
$deleted
=
unlink
(
$fullPath
);
return
$deleted
;
}
catch
(
\Exception
$e
)
{
// 删除失败(权限不足、文件被占用等)
return
false
;
}
}
/**
/**
* AI视频结果存
* AI视频结果存
...
@@ -75,17 +108,24 @@ class AiVideoGen extends BaseJob
...
@@ -75,17 +108,24 @@ class AiVideoGen extends BaseJob
{
{
try
{
try
{
// 保存远程视频到本地
// $videoUrl = "https://ark-content-generation-cn-beijing.tos-cn-beijing.volces.com/doubao-seedance-1-5-pro/02177754334120900000000000000000000ffffac15a695855f2b.mp4?X-Tos-Algorithm=TOS4-HMAC-SHA256&X-Tos-Credential=AKLTYWJkZTExNjA1ZDUyNDc3YzhjNTM5OGIyNjBhNDcyOTQ%2F20260430%2Fcn-beijing%2Ftos%2Frequest&X-Tos-Date=20260430T100229Z&X-Tos-Expires=86400&X-Tos-Signature=c50b93d2f98c3865b9ac4a2bb5607f9c3dba01d516f8d20f496285a09b04e9d7&X-Tos-SignedHeaders=host";
$taskid
=
$data
[
'taskid'
];
$taskid
=
$data
[
'taskid'
];
// $taskid = 'cgt-202604301
84545-tghsw
';
// $taskid = 'cgt-202604301
90444-vmb4q
';
$user
=
$data
[
'user'
];
$user
=
$data
[
'user'
];
$user_id
=
isset
(
$user
[
'id'
])
?
$user
[
'id'
]
:
0
;
if
(
!
isset
(
$taskid
)
||
empty
(
$taskid
)
||
!
isset
(
$user_id
)
||
empty
(
$user_id
))
{
debug_echo
(
'入参有空值 taskid:'
.
$taskid
.
' user_id:'
.
$user_id
);
// echo "===== begin queue ai video save =====" . PHP_EOL;
// 删除队列job
debug_echo
(
'删除Job'
);
$job
->
delete
();
return
false
;
}
$url
=
$this
->
ark_host
.
'/api/v3/contents/generations/tasks/'
.
$taskid
;
$url
=
$this
->
ark_host
.
'/api/v3/contents/generations/tasks/'
.
$taskid
;
echo
'url: '
.
$url
.
PHP_EOL
;
debug_echo
(
'脚本开始执行 AI接口url:'
.
$url
);
$params
=
[
$params
=
[
'headers'
=>
[
'headers'
=>
[
'Authorization'
=>
'Bearer '
.
config
(
'shopro.ai_api_key'
),
'Authorization'
=>
'Bearer '
.
config
(
'shopro.ai_api_key'
),
...
@@ -94,66 +134,105 @@ class AiVideoGen extends BaseJob
...
@@ -94,66 +134,105 @@ class AiVideoGen extends BaseJob
'verify'
=>
false
,
// 关闭 SSL 证书验证
'verify'
=>
false
,
// 关闭 SSL 证书验证
'allow_redirects'
=>
true
'allow_redirects'
=>
true
];
];
// 发送请求
// 向AI接口 发送请求
$client
=
new
Http
();
$client
=
new
Http
();
$response
=
$client
->
get
(
$url
,
$params
);
$response
=
$client
->
get
(
$url
,
$params
);
// echo 'response:';
// print_r($response);
$content
=
$response
->
getBody
()
->
getContents
();
$content
=
$response
->
getBody
()
->
getContents
();
$content
=
trim
(
$content
);
$content
=
trim
(
$content
);
$content
=
preg_replace
(
'/[^\x20-\x7E]/'
,
''
,
$content
);
$content
=
preg_replace
(
'/[^\x20-\x7E]/'
,
''
,
$content
);
$result
=
json_decode
(
$content
,
true
);
$result
=
json_decode
(
$content
,
true
);
// 失败
//
AI接口 返回
失败
if
(
isset
(
$result
[
'error'
])){
if
(
isset
(
$result
[
'error'
])){
$code
=
$result
[
'error'
][
'code'
]
??
''
;
$code
=
$result
[
'error'
][
'code'
]
??
''
;
$message
=
$result
[
'error'
][
'message'
]
??
'未知错误'
;
$message
=
$result
[
'error'
][
'message'
]
??
'未知错误'
;
AiTryOnModel
::
where
(
'user_id'
,
$user
[
'id'
]
)
->
where
(
'ai_task_id'
,
$taskid
)
->
update
([
'ai_status'
=>
2
,
'ai_err_msg'
=>
$message
]);
AiTryOnModel
::
where
(
'user_id'
,
$user
_id
)
->
where
(
'ai_task_id'
,
$taskid
)
->
update
([
'ai_status'
=>
2
,
'ai_err_msg'
=>
$message
]);
// 记录错误日志
// 记录错误日志
Log
::
error
(
'AI生成视频队列返回:taskId: '
.
$taskid
.
'code '
.
$code
.
'message: '
.
$message
.
' result:'
.
$content
.
PHP_EOL
);
Log
::
error
(
'AI生成视频队列返回:taskId: '
.
$taskid
.
'code '
.
$code
.
'message: '
.
$message
.
' result:'
.
$content
.
PHP_EOL
);
// 删除队列job
debug_echo
(
'删除Job'
);
$job
->
delete
();
return
false
;
}
}
// AI接口 返回成功
if
(
isset
(
$result
[
'status'
])){
if
(
isset
(
$result
[
'status'
])){
debug_echo
(
'AI接口 返回成功 status有值:'
.
$result
[
'status'
]);
switch
(
$result
[
'status'
])
{
switch
(
$result
[
'status'
])
{
// 成功返回视频链接
case
'succeeded'
:
case
'succeeded'
:
// 保存远程视频到本地
// 保存远程视频到本地
$video_url
=
$this
->
saveVideoLoc
(
isset
(
$result
[
'content'
][
'video_url'
])
?
$result
[
'content'
][
'video_url'
]
:
''
);
$video_url
=
$this
->
saveVideoLoc
(
isset
(
$result
[
'content'
][
'video_url'
])
?
$result
[
'content'
][
'video_url'
]
:
''
);
echo
'--video_url--'
;
debug_echo
(
'保存本地接口返回值 video_url:'
.
$video_url
)
;
var_dump
(
$video_url
);
if
(
$video_url
===
0
){
if
(
$video_url
===
0
){
AiTryOnModel
::
where
(
'user_id'
,
$user
[
'id'
])
->
where
(
'ai_task_id'
,
$taskid
)
->
update
([
'ai_status'
=>
2
,
'ai_err_msg'
=>
'视频保存到本地失败'
]);
AiTryOnModel
::
where
(
'user_id'
,
$user_id
)
->
where
(
'ai_task_id'
,
$taskid
)
->
update
([
'ai_status'
=>
2
,
'ai_err_msg'
=>
'视频保存到本地失败'
]);
debug_echo
(
'保存本地视频失败sql:'
.
db
()
->
getLastSql
());
break
;
break
;
}
}
// 更新我的试戴
// 更新我的试戴
AiTryOnModel
::
where
(
'user_id'
,
$user
[
'id'
])
->
where
(
'ai_task_id'
,
$taskid
)
->
update
([
'ai_status'
=>
1
,
'ai_url'
=>
$video_url
]);
AiTryOnModel
::
where
(
'user_id'
,
$user_id
)
->
where
(
'ai_task_id'
,
$taskid
)
->
update
([
'ai_status'
=>
1
,
'ai_url'
=>
$video_url
,
'ai_err_msg'
=>
'视频生成成功'
]);
// echo 'sql:' . PHP_EOL;
debug_echo
(
'保存本地视频成功sql:'
.
db
()
->
getLastSql
());
// print_r( db()->getLastSql() );
// 删除队列job
debug_echo
(
'删除Job'
);
$job
->
delete
();
break
;
break
;
case
'cancelled'
:
case
'cancelled'
:
AiTryOnModel
::
where
(
'user_id'
,
$user_id
)
->
where
(
'ai_task_id'
,
$taskid
)
->
update
([
'ai_status'
=>
2
,
'ai_err_msg'
=>
'任务已取消'
]);
debug_echo
(
'AI生成视频任务 取消: taskId: '
.
$taskid
.
'userId '
.
$user_id
);
debug_echo
(
'AI生成视频任务 取消: result:'
.
json_encode
(
$result
));
debug_echo
(
'AI生成视频任务 取消: sql:'
.
db
()
->
getLastSql
());
// 删除队列job
debug_echo
(
'删除Job'
);
$job
->
delete
();
break
;
case
'failed'
:
case
'failed'
:
AiTryOnModel
::
where
(
'user_id'
,
$user_id
)
->
where
(
'ai_task_id'
,
$taskid
)
->
update
([
'ai_status'
=>
2
,
'ai_err_msg'
=>
'视频生成失败'
]);
debug_echo
(
'AI生成视频任务 失败: taskId: '
.
$taskid
.
'userId '
.
$user_id
);
debug_echo
(
'AI生成视频任务 失败: result:'
.
json_encode
(
$result
));
debug_echo
(
'AI生成视频任务 失败: sql:'
.
db
()
->
getLastSql
());
// 删除队列job
debug_echo
(
'删除Job'
);
$job
->
delete
();
break
;
case
'expired'
:
case
'expired'
:
AiTryOnModel
::
where
(
'user_id'
,
$user
[
'id'
])
->
where
(
'ai_task_id'
,
$taskid
)
->
update
([
'ai_status'
=>
2
,
'ai_err_msg'
=>
'视频生成失败'
]);
AiTryOnModel
::
where
(
'user_id'
,
$user_id
)
->
where
(
'ai_task_id'
,
$taskid
)
->
update
([
'ai_status'
=>
2
,
'ai_err_msg'
=>
'任务已过期'
]);
// Log::error('AI生成视频队列返回:taskId: ' . $taskid . 'code '.$code . 'message: ' . $message . ' result:' . $content . PHP_EOL);
debug_echo
(
'AI生成视频任务 过期: taskId: '
.
$taskid
.
'userId '
.
$user_id
);
debug_echo
(
'AI生成视频任务 过期: result:'
.
json_encode
(
$result
));
debug_echo
(
'AI生成视频任务 过期: sql:'
.
db
()
->
getLastSql
());
// 删除队列job
debug_echo
(
'删除Job'
);
$job
->
delete
();
break
;
break
;
// 排队中 / 运行中
case
'queued'
:
case
'queued'
:
case
'running'
:
case
'running'
:
AiTryOnModel
::
where
(
'user_id'
,
$user
[
'id'
])
->
where
(
'ai_task_id'
,
$taskid
)
->
update
([
'ai_err_msg'
=>
'视频生成中'
]);
break
;
break
;
}
}
}
}
// echo "===== End queue ai video save =====" . PHP_EOL ;
// Log::info('用户ID:'. $user .' AI生成视频接口返回:'.json_encode($result));
// 删除 job
$job
->
delete
();
}
catch
(
\Exception
$e
)
{
}
catch
(
\Exception
$e
)
{
// echo '---------------save video Exception---------------------'.PHP_EOL;
// print_r($e->getMessage());
// echo '---------------save video Exception---------------------'.PHP_EOL;
// 队列执行失败
// 队列执行失败
format_log_error
(
$e
,
'AiVideoGen.save'
);
debug_echo
(
'异常:'
.
$e
->
getMessage
());
format_log_error
(
$e
,
'AiVideoGen.save.'
.
isset
(
$user
[
'id'
])
??
'user_id'
.
isset
(
$video_url
)
??
'video_url'
);
debug_echo
(
'异常删除视频:'
.
$video_url
);
$this
->
deleteLocalVideo
(
$video_url
);
// 删除保存到本地的视频,如果已经保存了的话
}
}
}
}
...
...
addons/shopro/service/user/Ai.php
View file @
f5efc586
...
@@ -112,7 +112,7 @@ class Ai
...
@@ -112,7 +112,7 @@ class Ai
try
{
try
{
// 合成AI图片
// 合成AI图片
$resGenImg
=
$this
->
generateImage
(
$params
,
$userId
,
$response_format
=
'url'
);
$resGenImg
=
$this
->
generateImage
(
$params
,
$userId
,
'url'
);
if
(
$resGenImg
[
'code'
]
==
0
)
{
if
(
$resGenImg
[
'code'
]
==
0
)
{
return
$resGenImg
;
return
$resGenImg
;
}
}
...
...
addons/shopro/uniapp/manifest.json
View file @
f5efc586
{
{
"name"
:
"Shopro"
,
"name"
:
"Shopro"
,
"appid"
:
"__UNI__082C0BA"
,
"appid"
:
"__UNI__082C0BA"
,
"description"
:
"Shopro是由SheepJS团队开发,使用Uniapp+Vue3技术驱动的在线商城系统,内含诸多功能与丰富的活动,期待您的使用和反馈。"
,
"description"
:
"Shopro是由SheepJS团队开发,使用Uniapp+Vue3技术驱动的在线商城系统,内含诸多功能与丰富的活动,期待您的使用和反馈。"
,
"versionName"
:
"3.2.1"
,
"versionName"
:
"3.2.1"
,
"versionCode"
:
321
,
"versionCode"
:
321
,
"transformPx"
:
false
,
"transformPx"
:
false
,
"app-plus"
:
{
"app-plus"
:
{
"usingComponents"
:
true
,
"usingComponents"
:
true
,
"nvueCompiler"
:
"uni-app"
,
"nvueCompiler"
:
"uni-app"
,
"nvueStyleCompiler"
:
"uni-app"
,
"nvueStyleCompiler"
:
"uni-app"
,
"compilerVersion"
:
3
,
"compilerVersion"
:
3
,
"nvueLaunchMode"
:
"fast"
,
"nvueLaunchMode"
:
"fast"
,
"splashscreen"
:
{
"splashscreen"
:
{
"alwaysShowBeforeRender"
:
true
,
"alwaysShowBeforeRender"
:
true
,
"waiting"
:
true
,
"waiting"
:
true
,
"autoclose"
:
true
,
"autoclose"
:
true
,
"delay"
:
0
"delay"
:
0
},
"safearea"
:
{
"bottom"
:
{
"offset"
:
"none"
}
},
"modules"
:
{
"Payment"
:
{},
"Share"
:
{},
"VideoPlayer"
:
{},
"OAuth"
:
{}
},
"distribute"
:
{
"android"
:
{
"permissions"
:
[
"<uses-feature android:name=
\"
android.hardware.camera
\"
/>"
,
"<uses-feature android:name=
\"
android.hardware.camera.autofocus
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.ACCESS_COARSE_LOCATION
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.ACCESS_FINE_LOCATION
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.ACCESS_MOCK_LOCATION
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.ACCESS_NETWORK_STATE
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.ACCESS_WIFI_STATE
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.CALL_PHONE
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.CAMERA
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.CHANGE_NETWORK_STATE
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.CHANGE_WIFI_STATE
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.FLASHLIGHT
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.GET_ACCOUNTS
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.GET_TASKS
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.INTERNET
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.MODIFY_AUDIO_SETTINGS
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.MOUNT_UNMOUNT_FILESYSTEMS
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.READ_CONTACTS
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.READ_LOGS
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.READ_PHONE_STATE
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.READ_SMS
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.RECEIVE_BOOT_COMPLETED
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.RECORD_AUDIO
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.SEND_SMS
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.SYSTEM_ALERT_WINDOW
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.VIBRATE
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.WAKE_LOCK
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.WRITE_CONTACTS
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.WRITE_EXTERNAL_STORAGE
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.WRITE_SETTINGS
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.WRITE_SMS
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.RECEIVE_USER_PRESENT
\"
/>"
],
"minSdkVersion"
:
21
,
"schemes"
:
"shopro"
},
"ios"
:
{
"urlschemewhitelist"
:
[
"baidumap"
,
"iosamap"
],
"dSYMs"
:
false
,
"privacyDescription"
:
{
"NSPhotoLibraryUsageDescription"
:
"需要同意访问您的相册选取图片才能完善该条目"
,
"NSPhotoLibraryAddUsageDescription"
:
"需要同意访问您的相册才能保存该图片"
,
"NSCameraUsageDescription"
:
"需要同意访问您的摄像头拍摄照片才能完善该条目"
,
"NSUserTrackingUsageDescription"
:
"开启追踪并不会获取您在其它站点的隐私信息,该行为仅用于标识设备,保障服务安全和提升浏览体验"
},
"urltypes"
:
"shopro"
,
"capabilities"
:
{
"entitlements"
:
{
"com.apple.developer.associated-domains"
:
[
"applinks:shopro.sheepjs.com"
]
}
},
"idfa"
:
true
},
"sdkConfigs"
:
{
"speech"
:
{},
"ad"
:
{},
"oauth"
:
{
"apple"
:
{},
"weixin"
:
{
"appid"
:
"wxae7a0c156****b"
,
"UniversalLinks"
:
"https://shopro.sheepjs.com/uni-universallinks/__UNI__082C0BA/"
}
},
"payment"
:
{
"weixin"
:
{
"__platform__"
:
[
"ios"
,
"android"
],
"appid"
:
"wxae7a0c156****b"
,
"UniversalLinks"
:
"https://shopro.sheepjs.com/uni-universallinks/__UNI__082C0BA/"
},
"alipay"
:
{
"__platform__"
:
[
"ios"
,
"android"
]
}
},
"share"
:
{
"weixin"
:
{
"appid"
:
"wxae7a0c156****b"
,
"UniversalLinks"
:
"https://shopro.sheepjs.com/uni-universallinks/__UNI__082C0BA/"
}
}
},
"orientation"
:
[
"portrait-primary"
],
"splashscreen"
:
{
"androidStyle"
:
"common"
,
"iosStyle"
:
"common"
,
"useOriginalMsgbox"
:
true
},
"icons"
:
{
"android"
:
{
"hdpi"
:
""
,
"xhdpi"
:
""
,
"xxhdpi"
:
""
,
"xxxhdpi"
:
""
},
"ios"
:
{
"appstore"
:
""
,
"ipad"
:
{
"app"
:
""
,
"app@2x"
:
""
,
"notification"
:
""
,
"notification@2x"
:
""
,
"proapp@2x"
:
""
,
"settings"
:
""
,
"settings@2x"
:
""
,
"spotlight"
:
""
,
"spotlight@2x"
:
""
},
"iphone"
:
{
"app@2x"
:
""
,
"app@3x"
:
""
,
"notification@2x"
:
""
,
"notification@3x"
:
""
,
"settings@2x"
:
""
,
"settings@3x"
:
""
,
"spotlight@2x"
:
""
,
"spotlight@3x"
:
""
}
}
}
}
},
},
"quickapp"
:
{},
"safearea"
:
{
"quickapp-native"
:
{
"bottom"
:
{
"icon"
:
"/static/logo.png"
,
"offset"
:
"none"
"package"
:
"com.example.demo"
,
}
"features"
:
[
{
"name"
:
"system.clipboard"
}
]
},
},
"quickapp-webview"
:
{
"modules"
:
{
"icon"
:
"/static/logo.png"
,
"Payment"
:
{},
"package"
:
"com.example.demo"
,
"Share"
:
{},
"minPlatformVersion"
:
1070
,
"VideoPlayer"
:
{},
"versionName"
:
"1.0.0"
,
"OAuth"
:
{}
"versionCode"
:
100
},
},
"mp-weixin"
:
{
"distribute"
:
{
"appid"
:
"wxee40a72b94bccee5"
,
"android"
:
{
"setting"
:
{
"permissions"
:
[
"urlCheck"
:
false
,
"<uses-feature android:name=
\"
android.hardware.camera
\"
/>"
,
"minified"
:
true
,
"<uses-feature android:name=
\"
android.hardware.camera.autofocus
\"
/>"
,
"postcss"
:
true
"<uses-permission android:name=
\"
android.permission.ACCESS_COARSE_LOCATION
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.ACCESS_FINE_LOCATION
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.ACCESS_MOCK_LOCATION
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.ACCESS_NETWORK_STATE
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.ACCESS_WIFI_STATE
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.CALL_PHONE
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.CAMERA
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.CHANGE_NETWORK_STATE
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.CHANGE_WIFI_STATE
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.FLASHLIGHT
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.GET_ACCOUNTS
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.GET_TASKS
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.INTERNET
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.MODIFY_AUDIO_SETTINGS
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.MOUNT_UNMOUNT_FILESYSTEMS
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.READ_CONTACTS
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.READ_LOGS
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.READ_PHONE_STATE
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.READ_SMS
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.RECEIVE_BOOT_COMPLETED
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.RECORD_AUDIO
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.SEND_SMS
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.SYSTEM_ALERT_WINDOW
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.VIBRATE
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.WAKE_LOCK
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.WRITE_CONTACTS
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.WRITE_EXTERNAL_STORAGE
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.WRITE_SETTINGS
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.WRITE_SMS
\"
/>"
,
"<uses-permission android:name=
\"
android.permission.RECEIVE_USER_PRESENT
\"
/>"
],
"minSdkVersion"
:
21
,
"schemes"
:
"shopro"
},
"ios"
:
{
"urlschemewhitelist"
:
[
"baidumap"
,
"iosamap"
],
"dSYMs"
:
false
,
"privacyDescription"
:
{
"NSPhotoLibraryUsageDescription"
:
"需要同意访问您的相册选取图片才能完善该条目"
,
"NSPhotoLibraryAddUsageDescription"
:
"需要同意访问您的相册才能保存该图片"
,
"NSCameraUsageDescription"
:
"需要同意访问您的摄像头拍摄照片才能完善该条目"
,
"NSUserTrackingUsageDescription"
:
"开启追踪并不会获取您在其它站点的隐私信息,该行为仅用于标识设备,保障服务安全和提升浏览体验"
},
},
"optimization"
:
{
"urltypes"
:
"shopro"
,
"subPackages"
:
true
"capabilities"
:
{
"entitlements"
:
{
"com.apple.developer.associated-domains"
:
[
"applinks:shopro.sheepjs.com"
]
}
},
},
"plugins"
:
{},
"idfa"
:
true
"lazyCodeLoading"
:
"requiredComponents"
,
},
"usingComponents"
:
{},
"sdkConfigs"
:
{
"permission"
:
{},
"speech"
:
{},
"requiredPrivateInfos"
:
[
"chooseAddress"
]
"ad"
:
{},
},
"oauth"
:
{
"mp-alipay"
:
{
"apple"
:
{},
"usingComponents"
:
true
"weixin"
:
{
},
"appid"
:
"wxae7a0c156****b"
,
"mp-baidu"
:
{
"UniversalLinks"
:
"https://shopro.sheepjs.com/uni-universallinks/__UNI__082C0BA/"
"usingComponents"
:
true
}
},
"mp-toutiao"
:
{
"usingComponents"
:
true
},
"mp-jd"
:
{
"usingComponents"
:
true
},
"h5"
:
{
"template"
:
"index.html"
,
"router"
:
{
"mode"
:
"hash"
,
"base"
:
"./"
},
},
"sdkConfigs"
:
{
"payment"
:
{
"maps"
:
{}
"weixin"
:
{
"__platform__"
:
[
"ios"
,
"android"
],
"appid"
:
"wxae7a0c156****b"
,
"UniversalLinks"
:
"https://shopro.sheepjs.com/uni-universallinks/__UNI__082C0BA/"
},
"alipay"
:
{
"__platform__"
:
[
"ios"
,
"android"
]
}
},
},
"async"
:
{
"share"
:
{
"timeout"
:
20000
"weixin"
:
{
"appid"
:
"wxae7a0c156****b"
,
"UniversalLinks"
:
"https://shopro.sheepjs.com/uni-universallinks/__UNI__082C0BA/"
}
}
},
"orientation"
:
[
"portrait-primary"
],
"splashscreen"
:
{
"androidStyle"
:
"common"
,
"iosStyle"
:
"common"
,
"useOriginalMsgbox"
:
true
},
"icons"
:
{
"android"
:
{
"hdpi"
:
""
,
"xhdpi"
:
""
,
"xxhdpi"
:
""
,
"xxxhdpi"
:
""
},
},
"title"
:
"星品购"
,
"ios"
:
{
"optimization"
:
{
"appstore"
:
""
,
"treeShaking"
:
{
"ipad"
:
{
"enable"
:
true
"app"
:
""
,
}
"app@2x"
:
""
,
"notification"
:
""
,
"notification@2x"
:
""
,
"proapp@2x"
:
""
,
"settings"
:
""
,
"settings@2x"
:
""
,
"spotlight"
:
""
,
"spotlight@2x"
:
""
},
"iphone"
:
{
"app@2x"
:
""
,
"app@3x"
:
""
,
"notification@2x"
:
""
,
"notification@3x"
:
""
,
"settings@2x"
:
""
,
"settings@3x"
:
""
,
"spotlight@2x"
:
""
,
"spotlight@3x"
:
""
}
}
}
}
}
},
"quickapp"
:
{},
"quickapp-native"
:
{
"icon"
:
"/static/logo.png"
,
"package"
:
"com.example.demo"
,
"features"
:
[
{
"name"
:
"system.clipboard"
}
]
},
"quickapp-webview"
:
{
"icon"
:
"/static/logo.png"
,
"package"
:
"com.example.demo"
,
"minPlatformVersion"
:
1070
,
"versionName"
:
"1.0.0"
,
"versionCode"
:
100
},
"mp-weixin"
:
{
"appid"
:
"wxee40a72b94bccee5"
,
"setting"
:
{
"urlCheck"
:
false
,
"minified"
:
true
,
"postcss"
:
true
},
"optimization"
:
{
"subPackages"
:
true
},
"plugins"
:
{},
"lazyCodeLoading"
:
"requiredComponents"
,
"usingComponents"
:
{},
"permission"
:
{},
"requiredPrivateInfos"
:
[
"chooseAddress"
]
},
"mp-alipay"
:
{
"usingComponents"
:
true
},
"mp-baidu"
:
{
"usingComponents"
:
true
},
"mp-toutiao"
:
{
"usingComponents"
:
true
},
"mp-jd"
:
{
"usingComponents"
:
true
},
"h5"
:
{
"template"
:
"index.html"
,
"router"
:
{
"mode"
:
"hash"
,
"base"
:
"./"
},
"sdkConfigs"
:
{
"maps"
:
{}
},
"async"
:
{
"timeout"
:
20000
},
},
"vueVersion"
:
"3"
,
"title"
:
"星品购"
,
"_spaceID"
:
"192b4892-5452-4e1d-9f09-eee1ece40639"
,
"optimization"
:
{
"locale"
:
"zh-Hans"
,
"treeShaking"
:
{
"fallbackLocale"
:
"zh-Hans"
"enable"
:
true
}
}
}
},
"vueVersion"
:
"3"
,
"_spaceID"
:
"192b4892-5452-4e1d-9f09-eee1ece40639"
,
"locale"
:
"zh-Hans"
,
"fallbackLocale"
:
"zh-Hans"
}
\ No newline at end of file
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