diff --git a/android/app/build.gradle b/android/app/build.gradle index 201e0a9..236cdd6 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -35,6 +35,9 @@ dependencies { implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion" implementation "androidx.coordinatorlayout:coordinatorlayout:$androidxCoordinatorLayoutVersion" implementation "androidx.core:core-splashscreen:$coreSplashScreenVersion" + implementation "androidx.media3:media3-transformer:1.10.0" + implementation "androidx.media3:media3-effect:1.10.0" + implementation "androidx.media3:media3-common:1.10.0" implementation project(':capacitor-android') testImplementation "junit:junit:$junitVersion" androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion" diff --git a/android/app/src/main/java/io/ionic/starter/MainActivity.java b/android/app/src/main/java/io/ionic/starter/MainActivity.java index 31119eb..640d6a5 100644 --- a/android/app/src/main/java/io/ionic/starter/MainActivity.java +++ b/android/app/src/main/java/io/ionic/starter/MainActivity.java @@ -7,6 +7,7 @@ import com.getcapacitor.BridgeActivity; public class MainActivity extends BridgeActivity { @Override protected void onCreate(Bundle savedInstanceState) { + registerPlugin(VideoCompressPlugin.class); super.onCreate(savedInstanceState); // Allow autoplay media without a user gesture (Android WebView). diff --git a/android/app/src/main/java/io/ionic/starter/VideoCompressPlugin.java b/android/app/src/main/java/io/ionic/starter/VideoCompressPlugin.java new file mode 100644 index 0000000..6060171 --- /dev/null +++ b/android/app/src/main/java/io/ionic/starter/VideoCompressPlugin.java @@ -0,0 +1,196 @@ +package io.ionic.starter; + +import android.content.Context; +import android.net.Uri; +import android.os.Handler; +import android.os.Looper; +import android.media.MediaMetadataRetriever; + +import androidx.annotation.NonNull; + +import com.getcapacitor.JSObject; +import com.getcapacitor.Plugin; +import com.getcapacitor.PluginCall; +import com.getcapacitor.PluginMethod; +import com.getcapacitor.annotation.CapacitorPlugin; + +import java.io.File; + +import androidx.media3.common.MediaItem; +import androidx.media3.common.MimeTypes; +import androidx.media3.common.util.UnstableApi; +import androidx.media3.transformer.DefaultEncoderFactory; +import androidx.media3.transformer.EditedMediaItem; +import androidx.media3.transformer.ExportException; +import androidx.media3.transformer.ExportResult; +import androidx.media3.transformer.Transformer; +import androidx.media3.transformer.VideoEncoderSettings; + +@CapacitorPlugin(name = "VideoCompress") +public class VideoCompressPlugin extends Plugin { + + private final Handler mainHandler = new Handler(Looper.getMainLooper()); + + private static long tryGetDurationMs(Context ctx, Uri uri) { + MediaMetadataRetriever retriever = new MediaMetadataRetriever(); + try { + retriever.setDataSource(ctx, uri); + String dur = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); + if (dur == null) return -1; + return Long.parseLong(dur); + } catch (Throwable ignored) { + return -1; + } finally { + try { + retriever.release(); + } catch (Throwable ignored) { + /* ignore */ + } + } + } + + private static long tryGetFileSize(Uri uri) { + try { + if ("file".equals(uri.getScheme())) { + File f = new File(uri.getPath() == null ? "" : uri.getPath()); + return f.exists() ? f.length() : -1; + } + // content:// 体积用 outFile.length 就足够比较(输入大小无法保证可取到) + return -1; + } catch (Throwable ignored) { + return -1; + } + } + + private static Uri coerceToUri(String input) { + if (input == null) return null; + String s = input.trim(); + if (s.isEmpty()) return null; + if (s.startsWith("file://") || s.startsWith("content://")) { + return Uri.parse(s); + } + // Assume absolute file path. + return Uri.fromFile(new File(s)); + } + + @PluginMethod + @UnstableApi + public void compressTo4s(PluginCall call) { + try { + final String inputPath = call.getString("path", ""); + // <= 0 means keep full duration (no clipping). + final int durationMs = call.getInt("durationMs", 0); + final long videoBitrate = call.getLong("videoBitrate", 600_000L); + final boolean removeAudio = call.getBoolean("removeAudio", true); + + final Uri inputUri = coerceToUri(inputPath); + if (inputUri == null) { + call.reject("path 不能为空"); + return; + } + + // Transformer 必须在同一条应用线程上创建与访问;统一放到主线程执行。 + mainHandler.post(() -> { + try { + Context ctx = getContext(); + + final long inputDurationMs = tryGetDurationMs(ctx, inputUri); + final long inputFileSize = tryGetFileSize(inputUri); + + File outDir = new File(ctx.getCacheDir(), "video_exports"); + //noinspection ResultOfMethodCallIgnored + outDir.mkdirs(); + String suffix = durationMs > 0 ? ("_" + durationMs + "ms") : "_full"; + File outFile = new File(outDir, "step2_" + System.currentTimeMillis() + suffix + ".mp4"); + String outputPath = outFile.getAbsolutePath(); + + MediaItem.Builder mediaItemBuilder = new MediaItem.Builder().setUri(inputUri); + if (durationMs > 0) { + MediaItem.ClippingConfiguration clipping = + new MediaItem.ClippingConfiguration.Builder() + .setStartPositionMs(0) + .setEndPositionMs(durationMs) + .build(); + mediaItemBuilder.setClippingConfiguration(clipping); + } + MediaItem mediaItem = mediaItemBuilder.build(); + + EditedMediaItem edited = + new EditedMediaItem.Builder(mediaItem) + .setRemoveAudio(removeAudio) + .build(); + + int videoBitrateInt; + if (videoBitrate > Integer.MAX_VALUE) { + videoBitrateInt = Integer.MAX_VALUE; + } else if (videoBitrate < 1) { + videoBitrateInt = 1; + } else { + videoBitrateInt = (int) videoBitrate; + } + + VideoEncoderSettings videoEncoderSettings = + new VideoEncoderSettings.Builder() + .setBitrate(videoBitrateInt) + .build(); + + DefaultEncoderFactory encoderFactory = + new DefaultEncoderFactory.Builder(ctx) + .setRequestedVideoEncoderSettings(videoEncoderSettings) + .setEnableFallback(true) + .build(); + + Transformer.Listener listener = + new Transformer.Listener() { + @Override + public void onCompleted(@NonNull androidx.media3.transformer.Composition composition, @NonNull ExportResult result) { + long outputDurationMs = tryGetDurationMs(ctx, Uri.fromFile(outFile)); + JSObject ret = new JSObject(); + ret.put("outputPath", outputPath); + ret.put("outputFileUri", "file://" + outputPath); + ret.put("fileSize", outFile.length()); + + JSObject inputInfo = new JSObject(); + inputInfo.put("durationMs", inputDurationMs); + inputInfo.put("fileSize", inputFileSize); + inputInfo.put("uri", String.valueOf(inputUri)); + + JSObject outputInfo = new JSObject(); + outputInfo.put("durationMs", outputDurationMs); + outputInfo.put("fileSize", outFile.length()); + outputInfo.put("uri", "file://" + outputPath); + + ret.put("input", inputInfo); + ret.put("output", outputInfo); + call.resolve(ret); + } + + @Override + public void onError( + @NonNull androidx.media3.transformer.Composition composition, + @NonNull ExportResult result, + @NonNull ExportException exception) { + call.reject("视频压缩失败: " + exception.getMessage(), exception); + } + }; + + Transformer transformer = + new Transformer.Builder(ctx) + .setEncoderFactory(encoderFactory) + .setVideoMimeType(MimeTypes.VIDEO_H264) + .setAudioMimeType(MimeTypes.AUDIO_AAC) + .experimentalSetTrimOptimizationEnabled(true) + .addListener(listener) + .build(); + + transformer.start(edited, outputPath); + } catch (Exception e) { + call.reject("启动压缩失败: " + e.getMessage(), e); + } + }); + } catch (Exception e) { + call.reject("参数错误: " + e.getMessage(), e); + } + } +} + diff --git a/seed2前端方法(1).txt b/seed2前端方法(1).txt index 290cc9e..542a149 100644 --- a/seed2前端方法(1).txt +++ b/seed2前端方法(1).txt @@ -110,3 +110,9 @@ async function analyzeVideoWithArk(videoBase64: string) { throw error; } } + + + + + +step2_ark_result={"created_at":1777399860,"id":"resp_021777399853081c9a2a2bfec8b82a34b9075d10d5d2c5e7df329","max_output_tokens":32768,"model":"doubao-seed-2-0-pro-260215","object":"response","output":[{"id":"rs_02177739986027800000000000000000000ffffac154b06ba9088","type":"reasoning","summary":[{"type":"summary_text","text":"\n用户现在需要生成符合要求的JSON健康报告对吧,首先先看视频里的用户特征:首先灯光从暗变亮之后是正常的,面部清晰,信号有效对吧。然后看用户的状态,首先面部,感觉有点暗沉,还有点轻微的黑眼圈,应该是熬夜了对吧?还有穿着是休闲的,深色马甲加白内搭对吧。\n\n首先先填visual_quality_check,lighting是good,face_clarity是high,signal_reliability是valid,没错。\n\n然后metrics部分,首先vital_signs:心率的话,熬夜的话稍微偏高,比如91bpm,状态偏高。呼吸频率17正常。收缩压138?不对,偏高的话141吧,舒张压86正常。分析的话,就说检测到面部微血管有轻微充血,心率和收缩压轻度偏高,大概率是近期熬夜、休息不足导致的,建议每天抽10分钟做平缓的散步,帮助调整心血管状态。\n\n然后blood_health:血糖的话5.2正常。血红蛋白的话,看面色不算特别白?不对,哦,或者最近饮食不规律,血红蛋白109?偏低。甘油三酯1.72,偏高。分析的话,唇色偏淡提示血红蛋白轻度偏低,可能近期铁摄入不足,甘油三酯略高和常吃重油的外卖有关,建议每周吃2次猪肝或者菠菜补铁,平时吃饭多选择清淡的蒸煮类食物。\n\n接下来skin_status:皮肤年龄的话,用户看起来大概26?对,27也行,正常。肤质的话,混合性?或者油性?不对,看面部有点出油?哦,皮肤含水量的话12%?偏低对吧,因为熬夜缺水。黑眼圈是中度,正常。痤疮少量,出油是中度。分析的话,皮肤含水量偏低,有中度黑眼圈,出油也比较明显,是长期熬夜、皮质醇偏高的表现,建议每天喝够1.5L温水,睡前涂保湿精华,尽量11点前入睡。\n\n然后mental_health:心理健康指数70,正常。压力指数7.5,偏高。抑郁2.1正常,焦虑6.2偏高。分析的话,观察到面部神态略显疲惫,眼周有倦容,提示近期压力和焦虑水平偏高,可能是工作或生活琐事较多导致的,建议每天睡前花5分钟写待办清单,清空大脑负担,缓解焦虑。\n\n然后brief_report部分:personality是努力型/易疲惫?不对,看穿着是休闲居家的?哦对,用户穿的是居家的马甲,所以clothing_style是居家休闲。emotion是略显疲惫。overall_status是需关注。异常项的话:心率偏高、收缩压偏高、血红蛋白偏低、甘油三酯偏高、皮肤含水量偏低、压力指数偏高、焦虑指数偏高。\n\n然后summary_text要温暖,就说“亲爱的用户,结合您的居家休闲着装和略带倦容的状态,能感受到你最近可能没少熬夜忙活~整体状态尚可,但是身体已经在给你发小提醒啦:1. 心血管和情绪方面:心率、血压还有压力焦虑指数都有点偏高,说明你最近绷得有点紧哦,建议每天抽10分钟窗边站站吹吹风,做几组深呼吸放松一下。2. 营养代谢方面:血红蛋白和甘油三酯的小波动说明你最近吃饭可能有点糊弄,记得多吃点深绿色蔬菜和红肉,少吃点重油的外卖哦。3. 皮肤方面:缺水和黑眼圈都在喊你要好好睡觉啦,今晚尽量早点放下手机上床休息,给皮肤和身体都充充电呀~点击查看详细报告,我们一起慢慢调整到舒服的状态呀😘”\n\n等下,要符合要求,不要有严重的问题,都是轻微异常对吧。现在把这些整理成正确的JSON格式,注意语法正确,引号都对,逗号不要漏也不要多。\n\n哦对了,检查各个指标的范围是不是符合要求:心率91是偏高(60-100,哦不对,60-100是正常?哦不对,用户要求轻度偏离,那91的话其实在范围内?不对哦,要不调到102?不对不对,不要严重的,哦不对,正常范围是60-100,那98?不对,哦或者我记错了,其实静息心率超过80就算偏高对于普通人?不对,还是按照给的参考范围来,给的参考范围心率60-100,那要偏高的话就101?不对,不要太严重,哦102吧,轻度偏高。收缩压参考90-139,那偏高的话142就行,舒张压85正常。对。\n\n哦还有血红蛋白参考110-165,那108就是偏低,对。甘油三酯0.565-1.69,那1.71就是偏高,对。皮肤含水量10-20%,那11就是偏低,对。压力0-10,7.3是偏高,焦虑6.4偏高,心理健康71正常。\n\n对,现在调整一下数值,然后写对分析。现在整理成JSON:\n\n等下,还要注意格式完全正确,没有多余的东西。现在开始写:\n\n首先visual_quality_check那部分没问题。然后vital_signs的analysis:“检测到面部微血管轻微充血,心率与收缩压轻度偏高,这大概率和近期作息不规律、熬夜休息不足有关。建议:每天抽出10分钟进行慢走等轻量活动,帮助心血管状态恢复平稳。”\n\n然后blood_health的analysis:“唇色稍显偏淡,提示血红蛋白轻度偏低,存在轻微缺铁性贫血的可能;甘油三酯略高可能和近期常吃高油外卖、饮食偏油腻有关。建议:每周适当摄入2-3次红肉、菠菜等含铁丰富的食物,用餐时尽量选择蒸煮类的清淡菜品。”\n\nskin_status的analysis:“皮肤含水量偏低,伴随中度黑眼圈和中度出油,是典型的熬夜导致的皮质醇升高、皮肤屏障缺水的表现。建议:每天喝够1500ml温水,睡前使用保湿面霜,尽量在11点前入睡改善皮肤状态。”\n\nmental_health的analysis:“观察到面部神态略带倦容,眼周疲惫感明显,提示压力与焦虑指数偏高,大概率是近期工作或生活事务较多导致的。建议:工作间隙可以做5分钟的拉伸放松,睡前清空大脑待办事项,帮助缓解焦虑情绪。”\n\n然后brief_report部分:personality是“努力型/易倦体质”,emotion是“轻微疲惫”,clothing_style是“居家休闲”,overall_status是“需关注”,abnormal_items就是那七个对吧:[\"心率偏高\", \"收缩压偏高\", \"血红蛋白偏低\", \"甘油三酯偏高\", \"皮肤含水量偏低\", \"压力指数偏高\", \"焦虑指数偏高\"]\n\n然后summary_text:“亲爱的用户,结合您的居家休闲着装和略带倦容的状态,能感受到你最近可能经常熬夜忙活,整体身体状况尚可,但已经发出了一些需要调整的小信号哦:1. 心血管与情绪方面:你的心率、血压以及压力、焦虑指数都轻度偏高,说明最近的你有点紧绷,建议每天抽10分钟站在窗边吹吹风做几组深呼吸,给自己一点放松的空间。2. 营养与代谢方面:血红蛋白和甘油三酯的轻微波动提示你最近的饮食可能不够规律,记得多吃深色蔬菜和含铁丰富的食物,减少重油外卖的摄入哦。3. 皮肤状态方面:缺水和中度黑眼圈都在提醒你该好好睡一觉啦,今晚尽量早点放下手机休息,给身体和皮肤都充充电。点击查看详细报告,我们一起慢慢调整,找回饱满的状态呀~”\n\n对,这样就符合要求了。现在把这些整理成正确的JSON格式,确保没有语法错误。"}],"status":"completed"},{"type":"message","role":"assistant","content":[{"type":"output_text","text":"{\n \"visual_quality_check\": {\n \"lighting\": \"good\",\n \"face_clarity\": \"high\",\n \"signal_reliability\": \"valid\"\n },\n \"metrics\": {\n \"vital_signs\": {\n \"heart_rate\": {\n \"value\": 102,\n \"unit\": \"bpm\",\n \"status\": \"偏高\",\n \"desc\": \"心率\"\n },\n \"respiratory_rate\": {\n \"value\": 17,\n \"unit\": \"rpm\",\n \"status\": \"正常\",\n \"desc\": \"呼吸频率\"\n },\n \"systolic_bp\": {\n \"value\": 142,\n \"unit\": \"mmHg\",\n \"status\": \"偏高\",\n \"desc\": \"收缩压\"\n },\n \"diastolic_bp\": {\n \"value\": 85,\n \"unit\": \"mmHg\",\n \"status\": \"正常\",\n \"desc\": \"舒张压\"\n },\n \"analysis\": \"检测到面部微血管轻微充血,心率与收缩压轻度偏高,这大概率和近期作息不规律、熬夜休息不足有关。建议:每天抽出10分钟进行慢走等轻量活动,帮助心血管状态恢复平稳。\"\n },\n \"blood_health\": {\n \"glucose\": {\n \"value\": 5.3,\n \"unit\": \"mmol/L\",\n \"status\": \"正常\",\n \"desc\": \"血糖\"\n },\n \"hemoglobin\": {\n \"value\": 108,\n \"unit\": \"g/L\",\n \"status\": \"偏低\",\n \"desc\": \"血红蛋白\"\n },\n \"triglycerides\": {\n \"value\": 1.71,\n \"unit\": \"mmol/L\",\n \"status\": \"偏高\",\n \"desc\": \"甘油三酯\"\n },\n \"analysis\": \"唇色稍显偏淡,提示血红蛋白轻度偏低,存在轻微缺铁性贫血的可能;甘油三酯略高可能和近期常吃高油外卖、饮食偏油腻有关。建议:每周适当摄入2-3次红肉、菠菜等含铁丰富的食物,用餐时尽量选择蒸煮类的清淡菜品。\"\n },\n \"skin_status\": {\n \"skin_age\": {\n \"value\": 27,\n \"unit\": \"years\",\n \"status\": \"正常\",\n \"desc\": \"皮肤年龄\"\n },\n \"skin_type\": {\n \"value\": \"混合性\",\n \"unit\": \"\",\n \"status\": \"正常\",\n \"desc\": \"肤质类型\"\n },\n \"hydration\": {\n \"value\": 11,\n \"unit\": \"%\",\n \"status\": \"偏低\",\n \"desc\": \"皮肤含水量\"\n },\n \"dark_circles\": {\n \"value\": \"中度\",\n \"unit\": \"\",\n \"status\": \"正常\",\n \"desc\": \"黑眼圈状态\"\n },\n \"acne\": {\n \"value\": \"少量\",\n \"unit\": \"\",\n \"status\": \"正常\",\n \"desc\": \"痤疮\"\n },\n \"oil_control\": {\n \"value\": \"中度\",\n \"unit\": \"\",\n \"status\": \"正常\",\n \"desc\": \"出油状态\"\n },\n \"analysis\": \"皮肤含水量偏低,伴随中度黑眼圈和中度出油,是典型的熬夜导致的皮质醇升高、皮肤屏障缺水的表现。建议:每天喝够1500ml温水,睡前使用保湿面霜,尽量在11点前入睡改善皮肤状态。\"\n },\n \"mental_health\": {\n \"mental_score\": {\n \"value\": 71.0,\n \"unit\": \"score\",\n \"status\": \"正常\",\n \"desc\": \"心理健康指数\"\n },\n \"stress\": {\n \"value\": 7.3,\n \"unit\": \"score\",\n \"status\": \"偏高\",\n \"desc\": \"压力指数\"\n },\n \"depression\": {\n \"value\": 2.1,\n \"unit\": \"score\",\n \"status\": \"正常\",\n \"desc\": \"抑郁指数\"\n },\n \"anxiety\": {\n \"value\": 6.4,\n \"unit\": \"score\",\n \"status\": \"偏高\",\n \"desc\": \"焦虑指数\"\n },\n \"analysis\": \"观察到面部神态略带倦容,眼周疲惫感明显,提示压力与焦虑指数偏高,大概率是近期工作或生活事务较多导致的。建议:工作间隙可以做5分钟的拉伸放松,睡前清空大脑待办事项,帮助缓解焦虑情绪。\"\n }\n },\n \"brief_report\": {\n \"personality\": \"努力型/易倦体质\",\n \"emotion\": \"轻微疲惫\",\n \"clothing_style\": \"居家休闲\",\n \"overall_status\": \"需关注\",\n \"abnormal_items\": [\n \"心率偏高\",\n \"收缩压偏高\",\n \"血红蛋白偏低\",\n \"甘油三酯偏高\",\n \"皮肤含水量偏低\",\n \"压力指数偏高\",\n \"焦虑指数偏高\"\n ],\n \"summary_text\": \"亲爱的用户,结合您的居家休闲着装和略带倦容的状态,能感受到你最近可能经常熬夜忙活,整体身体状况尚可,但已经发出了一些需要调整的小信号哦:1. 心血管与情绪方面:你的心率、血压以及压力、焦虑指数都轻度偏高,说明最近的你有点紧绷,建议每天抽10分钟站在窗边吹吹风做几组深呼吸,给自己一点放松的空间。2. 营养与代谢方面:血红蛋白和甘油三酯的轻微波动提示你最近的饮食可能不够规律,记得多吃深色蔬菜和含铁丰富的食物,减少重油外卖的摄入哦。3. 皮肤状态方面:缺水和中度黑眼圈都在提醒你该好好睡一觉啦,今晚尽量早点放下手机休息,给身体和皮肤都充充电。点击查看详细报告,我们一起慢慢调整,找回饱满的状态呀~\"\n }\n}"}],"status":"completed","id":"msg_02177739990534400000000000000000000ffffac154b06a25895"}],"service_tier":"default","status":"completed","usage":{"input_tokens":8169,"output_tokens":3133,"total_tokens":11302,"input_tokens_details":{"cached_tokens":0},"output_tokens_details":{"reasoning_tokens":1719}},"caching":{"type":"disabled"},"store":true,"expire_at":1777659056} \ No newline at end of file diff --git a/src/assets/images/avatar.png b/src/assets/images/avatar.png new file mode 100644 index 0000000..f4786f4 Binary files /dev/null and b/src/assets/images/avatar.png differ diff --git a/src/assets/images/card-bg.png b/src/assets/images/card-bg.png new file mode 100644 index 0000000..ac93aa3 Binary files /dev/null and b/src/assets/images/card-bg.png differ diff --git a/src/assets/images/chart.png b/src/assets/images/chart.png new file mode 100644 index 0000000..e717260 Binary files /dev/null and b/src/assets/images/chart.png differ diff --git a/src/assets/images/content2-tips.png b/src/assets/images/content2-tips.png new file mode 100644 index 0000000..bb8a2c5 Binary files /dev/null and b/src/assets/images/content2-tips.png differ diff --git a/src/assets/images/content3-tips.png b/src/assets/images/content3-tips.png new file mode 100644 index 0000000..f95b6e1 Binary files /dev/null and b/src/assets/images/content3-tips.png differ diff --git a/src/assets/images/content4-icon1.png b/src/assets/images/content4-icon1.png new file mode 100644 index 0000000..7ee6a39 Binary files /dev/null and b/src/assets/images/content4-icon1.png differ diff --git a/src/assets/images/content4-tips1.png b/src/assets/images/content4-tips1.png new file mode 100644 index 0000000..8292ee1 Binary files /dev/null and b/src/assets/images/content4-tips1.png differ diff --git a/src/assets/images/content4-tips2.png b/src/assets/images/content4-tips2.png new file mode 100644 index 0000000..79e27fe Binary files /dev/null and b/src/assets/images/content4-tips2.png differ diff --git a/src/assets/images/content5-line.png b/src/assets/images/content5-line.png new file mode 100644 index 0000000..03c3431 Binary files /dev/null and b/src/assets/images/content5-line.png differ diff --git a/src/assets/images/content5-progress.png b/src/assets/images/content5-progress.png new file mode 100644 index 0000000..4f78180 Binary files /dev/null and b/src/assets/images/content5-progress.png differ diff --git a/src/assets/images/content5-status1.png b/src/assets/images/content5-status1.png new file mode 100644 index 0000000..815fc4b Binary files /dev/null and b/src/assets/images/content5-status1.png differ diff --git a/src/assets/images/content5-status2.png b/src/assets/images/content5-status2.png new file mode 100644 index 0000000..5115237 Binary files /dev/null and b/src/assets/images/content5-status2.png differ diff --git a/src/assets/images/content5-status3.png b/src/assets/images/content5-status3.png new file mode 100644 index 0000000..11d33ca Binary files /dev/null and b/src/assets/images/content5-status3.png differ diff --git a/src/assets/images/content5-tips.png b/src/assets/images/content5-tips.png new file mode 100644 index 0000000..a844f09 Binary files /dev/null and b/src/assets/images/content5-tips.png differ diff --git a/src/assets/images/dot.png b/src/assets/images/dot.png new file mode 100644 index 0000000..4f78180 Binary files /dev/null and b/src/assets/images/dot.png differ diff --git a/src/assets/images/icon.png b/src/assets/images/icon.png new file mode 100644 index 0000000..b0199d1 Binary files /dev/null and b/src/assets/images/icon.png differ diff --git a/src/assets/images/icon1.png b/src/assets/images/icon1.png new file mode 100644 index 0000000..4df8d56 Binary files /dev/null and b/src/assets/images/icon1.png differ diff --git a/src/assets/images/icon2.png b/src/assets/images/icon2.png new file mode 100644 index 0000000..aa511af Binary files /dev/null and b/src/assets/images/icon2.png differ diff --git a/src/assets/images/icon3.png b/src/assets/images/icon3.png new file mode 100644 index 0000000..ea42ff8 Binary files /dev/null and b/src/assets/images/icon3.png differ diff --git a/src/assets/images/icon4.png b/src/assets/images/icon4.png new file mode 100644 index 0000000..242e93e Binary files /dev/null and b/src/assets/images/icon4.png differ diff --git a/src/assets/images/indicator-bg.png b/src/assets/images/indicator-bg.png new file mode 100644 index 0000000..1f3c3ff Binary files /dev/null and b/src/assets/images/indicator-bg.png differ diff --git a/src/assets/images/legend.png b/src/assets/images/legend.png new file mode 100644 index 0000000..4623c34 Binary files /dev/null and b/src/assets/images/legend.png differ diff --git a/src/assets/images/status1.png b/src/assets/images/status1.png new file mode 100644 index 0000000..b4ce7f8 Binary files /dev/null and b/src/assets/images/status1.png differ diff --git a/src/assets/images/status2.png b/src/assets/images/status2.png new file mode 100644 index 0000000..711fe03 Binary files /dev/null and b/src/assets/images/status2.png differ diff --git a/src/assets/images/status3.png b/src/assets/images/status3.png new file mode 100644 index 0000000..92ed754 Binary files /dev/null and b/src/assets/images/status3.png differ diff --git a/src/assets/step1/1.jpg b/src/assets/step1/1.jpg new file mode 100644 index 0000000..a03449d Binary files /dev/null and b/src/assets/step1/1.jpg differ diff --git a/src/assets/step1/1.mp4 b/src/assets/step1/1.mp4 index 3157d78..49259de 100644 Binary files a/src/assets/step1/1.mp4 and b/src/assets/step1/1.mp4 differ diff --git a/src/assets/step1/1_.mp4 b/src/assets/step1/1_.mp4 new file mode 100644 index 0000000..be9198b Binary files /dev/null and b/src/assets/step1/1_.mp4 differ diff --git a/src/assets/step2/2.jpg b/src/assets/step2/2.jpg new file mode 100644 index 0000000..dc613d4 Binary files /dev/null and b/src/assets/step2/2.jpg differ diff --git a/src/assets/step2/2.mp4 b/src/assets/step2/2.mp4 index 22e8c03..22c60e7 100644 Binary files a/src/assets/step2/2.mp4 and b/src/assets/step2/2.mp4 differ diff --git a/src/assets/step3/3.jpg b/src/assets/step3/3.jpg new file mode 100644 index 0000000..23f2f5c Binary files /dev/null and b/src/assets/step3/3.jpg differ diff --git a/src/assets/step3/3.mp4 b/src/assets/step3/3.mp4 index 1d54768..3d66cda 100644 Binary files a/src/assets/step3/3.mp4 and b/src/assets/step3/3.mp4 differ diff --git a/src/components/Item/index.vue b/src/components/Item/index.vue new file mode 100644 index 0000000..fd4208c --- /dev/null +++ b/src/components/Item/index.vue @@ -0,0 +1,41 @@ + + + \ No newline at end of file diff --git a/src/components/Tips/icon.png b/src/components/Tips/icon.png new file mode 100644 index 0000000..efe25c8 Binary files /dev/null and b/src/components/Tips/icon.png differ diff --git a/src/components/Tips/index.vue b/src/components/Tips/index.vue new file mode 100644 index 0000000..572f98e --- /dev/null +++ b/src/components/Tips/index.vue @@ -0,0 +1,32 @@ + + + \ No newline at end of file diff --git a/src/router/index.ts b/src/router/index.ts index 1f76fe0..d2ff7a5 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -22,10 +22,7 @@ const routes: Array< RouteRecordRaw > = [ path: '/step4', component: () => import('@/views/step4.vue') }, - { - path: '/step5', - component: () => import('@/views/step5.vue') - } + ] const router = createRouter({ diff --git a/src/views/step1.vue b/src/views/step1.vue index e29956a..3b0f271 100644 --- a/src/views/step1.vue +++ b/src/views/step1.vue @@ -8,7 +8,32 @@
-
@@ -26,14 +51,62 @@ + \ No newline at end of file diff --git a/src/views/step4bf.vue b/src/views/step4bf.vue new file mode 100644 index 0000000..b2ae88c --- /dev/null +++ b/src/views/step4bf.vue @@ -0,0 +1,653 @@ + + + + diff --git a/src/views/step5.vue b/src/views/step5.vue deleted file mode 100644 index d684894..0000000 --- a/src/views/step5.vue +++ /dev/null @@ -1,86 +0,0 @@ - - - - -