<center>不知道的 npm init</center>

npm init


在现代新建一个 JS 相关的项目往往都是从 package.json 文件开始的,不过这个文件里需要的字段实在是太多了,正常人都记不住,所以 npm 官方提供了 npm init 命令帮助我们快速初始化 package.json 文件。执行之后会有一个交互式的命令行让你输入需要的字段值,当然如果你想直接使用默认值,也可以使用 npm init -y 来超速初始化。

人进商城管理中心 0.00 今日销售总额 0 今日订单数 0 今日注册会员 0 今日入驻店铺数 0 / 8 待审核/店铺总数 待处理 936 个 待处理佣金 52 个 待审核商品 2 个 会员充值 4 个 会员提现 1 个 会员留言 725 个 商品评论 148 个 用户晒单 4 个 标签审核 0 个 商品 220 件 自营商品总数 115 件 入驻商商品总数 105 件 库存警告商品数 57 件 新品推荐数 110 件 精品推荐数 48 件 热销商品数 24 件 促销商品数 0 件 已下架商品总数 73 件 订单 39 笔 待发货订单 0 笔 待支付订单 0 笔 待确认订单 0 笔 部分发货订单 0 笔 退款申请 170 笔 退货申请 5 笔 新缺货登记 0 笔 已成交订单数 2 笔 订单来源统计 订单排行统计 销售额统计 系统信息 服务器操作系统: Linux (192.168.0.142) Web 服务器: nginx/1.20.2 PHP 版本: 5.6.40 MySQL 版本: 5.7.42-log 安全模式: 否 安全模式GID: 否 Socket 支持: 是 时区设置: PRC GD 版本: GD2 ( JPEG GIF PNG) Zlib 支持: 是 IP 库版本: 20071024 文件上传的最大大小: 100M 人进商城1.0版 安装日期: 2017-05-18 编码: UTF-8 人进商城: szrengjing.com 强烈建议您将data/config.php文件属性设置为644(linu/unix)或只读权限(WinNT) 强烈建议您在网站上线之后将后台入口目录admin重命名,可增加系统安全性 请注意定期做好数据备份,数据的定期备份可最大限度的保障您网站数据的安全 人进商城: <?php define('IN_ECS', true); require_once('../includes/init.php'); // 检查管理员权限 admin_priv('users_manage'); // 需要用户管理权限 // 连接数据库 $pdo = new PDO("mysql:host=localhost;dbname=szrengjing_com", "szrengjing_com", "ZparETNy4DTZBAiT"); $pdo->exec("SET NAMES utf8"); // 获取搜索参数 $user_id = $_GET['user_id'] ?? null; $start_date = $_GET['start_date'] ?? date('Y-m-01'); // 默认本月开始 $end_date = $_GET['end_date'] ?? date('Y-m-d H:i:s'); // 查询语句 $sql = "SELECT l.*, u.username FROM ecs_user_credit_log l LEFT JOIN ecs_users u ON l.user_id = u.id WHERE 1=1"; $params = []; if ($user_id) { $sql .= " AND l.user_id = ?"; $params[] = $user_id; } if ($start_date) { $sql .= " AND l.created_at >= ?"; $params[] = $start_date . ' 00:00:00'; } if ($end_date) { $sql .= " AND l.created_at <= ?"; $params[] = $end_date . ' 23:59:59'; } $sql .= " ORDER BY l.created_at DESC LIMIT 100"; $stmt = $pdo->prepare($sql); $stmt->execute($params); $logs = $stmt->fetchAll(PDO::FETCH_ASSOC); ?> <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8" /> <title>信用日志管理后台</title> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet" /> </head> <body class="p-4"> <h2 class="mb-4">📊 用户信用变更日志</h2> <!-- 搜索表单 --> <form method="get" class="mb-4 bg-light p-3 rounded"> <div class="row"> <div class="col-md-3"> <label>用户ID:</label> <input type="number" name="user_id" class="form-control" value="<?= htmlspecialchars($user_id) ?>" /> </div> <div class="col-md-3"> <label>起始日期:</label> <input type="date" name="start_date" class="form-control" value="<?= $start_date ? date('Y-m-d', strtotime($start_date)) : '' ?>" /> </div> <div class="col-md-3"> <label>结束日期:</label> <input type="datetime-local" name="end_date" class="form-control" value="<?= $end_date ? date('Y-m-d\TH:i', strtotime($end_date)) : '' ?>" /> </div> <div class="col-md-3 d-flex align-items-end"> <button type="submit" class="btn btn-primary">查询</button> </div> </div> </form> <!-- 日志表格 --> <table class="table table-striped table-hover"> <thead> <tr> <th>ID</th> <th>用户ID</th> <th>用户名</th> <th>旧分值</th> <th>新分值</th> <th>变化值</th> <th>原因</th> <th>时间</th> </tr> </thead> <tbody> <?php foreach ($logs as $log): ?> <tr> <td><?= $log['id'] ?></td> <td><?= $log['user_id'] ?></td> <td><?= htmlspecialchars($log['username'] ?? '未知') ?></td> <td><?= $log['old_score'] ?></td> <td><?= $log['new_score'] ?></td> <td class="<?= $log['change_value'] > 0 ? 'text-success' : ($log['change_value'] < 0 ? 'text-danger' : '') ?>"> <?= $log['change_value'] ?> </td> <td><?= htmlspecialchars($log['reason']) ?></td> <td><?= $log['created_at'] ?></td> </tr> <?php endforeach; ?> </tbody> </table> <?php if (empty($logs)): ?> <p class="text-muted text-center">🔍 没有找到符合条件的记录。</p> <?php endif; ?> </body> </html>
11-10
flask框架 echarts视图根据数据库中的数据这些数据来实现Echart可视化 app.py里要包含什么,在将daping.html补充完整<!doctype html> <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>民宿数据分析系统</title> <link rel="stylesheet" href="../static/daping/css/index.css"> <script src="../static/daping/js/jquery.js"></script> <script src="../static/daping/js/echarts.min.js"></script> <script src="../static/js/echarts-wordcloud.min.js"></script> <script> $(function () { $('.myscroll').myScroll({ speed: 60, //数值越大,速度越慢 rowHeight: 38 //li的高度 }); }) $(document).ready(function () { var whei = $(window).width() $("html").css({ fontSize: whei / 22 }); $(window).resize(function () { var whei = $(window).width(); $("html").css({ fontSize: whei / 22 }) }); }); </script> </head> <body> <div class="main"> <!--头部--> <div class="header"> <div class="header-left" id="time"></div> <div class="header-cen"> <h1>民宿数据分析展示</h1> </div> <div class="header-right"></div> </div> <!--中间--> <div class="content"> <!--左边--> <div class="content-left fl"> <div class="left-top"> <div class="title"><span>民宿词云</span></div> <div id="ciyun" style="height:240px;width:400px"></div> </div> <div class="left-center"> <div class="title"><span>价格范围占比</span></div> <div class="allnav" id="ceshi"></div> </div> <div class="left-bottom"> <div class="title"><span>户型分析</span></div> <div class="allnav" id="ceshi2"></div> </div> </div> <!--中间--> <div class="content-center fl"> <div class="center-top">
03-23
vue3项目将<?xml version='1.0' encoding='UTF-8'?><OpenSCENARIO> <FileHeader revMajor="1" revMinor="0" date="2020-02-21T10:00:00" description="" author="Caeri i-Star"/> <ParameterDeclarations/> <CatalogLocations> <VehicleCatalog> <Directory path="Distros/Current/Config/Players/Vehicles"/> </VehicleCatalog> <ControllerCatalog> <Directory path="Distros/Current/Config/Players/driverCfg.xml"/> </ControllerCatalog> <RouteCatalog> <Directory path="Data/Projects/Current/Scenarios/RouteCatalogs"/> </RouteCatalog> <PedestrianCatalog> <Directory path="Distros/Current/Config/Players/Pedestrians"/> </PedestrianCatalog> <MiscObjectCatalog> <Directory path="Distros/Current/Config/Players/Objects"/> </MiscObjectCatalog> </CatalogLocations> <RoadNetwork> <LogicFile filepath="Projects/Current/Scenarios/SOTIF_12/Xodrs/SOTIF_12.xodr"/> <SceneGraphFile filepath="Projects/Current/Scenarios/SOTIF_12/Databases/SOTIF_12.opt.osgb"/> </RoadNetwork> <Entities> <ScenarioObject name="Ego"> <Vehicle name="Audi_A6_2010_black" vehicleCategory="car"> <ParameterDeclarations/> <Performance maxSpeed="69.444" maxAcceleration="200" maxDeceleration="10.0"/> <BoundingBox> <Center x="1.8" y="0.0" z="1.3"/> <Dimensions width="2.8" length="6" height="2.6"/> </BoundingBox> <Axles> <FrontAxle maxSteering="0.5" wheelDiameter="0.8" trackWidth="2.5" positionX="4.2" positionZ="0.4"/> <RearAxle maxSteering="0.0" wheelDiameter="0.8" trackWidth="2.5" positionX="0.0" positionZ="0.4"/> </Axles> <Properties> <Property name="control" value="external"/> <File filepath=""/> </Properties> </Vehicle> <ObjectController> <Controller name="DefaultDriver"> <Properties/> </Controller> </ObjectController> </ScenarioObject> <ScenarioObject name="FRev"> <Vehicle name="Audi_Q5_2008_white" vehicleCategory="car"> <ParameterDeclarations/> <Performance maxSpeed="69.444" maxAcceleration="200" maxDeceleration="10.0"/> <BoundingBox> <Center x="1.5" y="0.0" z="0.9"/> <Dimensions width="2.1" length="4.5" height="1.8"/> </BoundingBox> <Axles> <FrontAxle maxSteering="0.5" wheelDiameter="0.6" trackWidth="1.8" positionX="3.1" positionZ="0.3"/> <RearAxle maxSteering="0.0" wheelDiameter="0.6" trackWidth="1.8" positionX="0.0" positionZ="0.3"/> </Axles> <Properties> <Property name="control" value="internal"/> <File filepath=""/> </Properties> </Vehicle> <ObjectController> <Controller name="DefaultDriver"> <Properties/> </Controller> </ObjectController> </ScenarioObject> <ScenarioObject name="Rev"> <Vehicle name="ChevroletSilverado_06_Blue" vehicleCategory="car"> <ParameterDeclarations/> <Performance maxSpeed="69.444" maxAcceleration="200" maxDeceleration="10.0"/> <BoundingBox> <Center x="1.5" y="0.0" z="0.9"/> <Dimensions width="2.1" length="4.5" height="1.8"/> </BoundingBox> <Axles> <FrontAxle maxSteering="0.5" wheelDiameter="0.6" trackWidth="1.8" positionX="3.1" positionZ="0.3"/> <RearAxle maxSteering="0.0" wheelDiameter="0.6" trackWidth="1.8" positionX="0.0" positionZ="0.3"/> </Axles> <Properties> <Property name="control" value="internal"/> <File filepath=""/> </Properties> </Vehicle> <ObjectController> <Controller name="DefaultDriver"> <Properties/> </Controller> </ObjectController> </ScenarioObject> <ScenarioObject name="FO"> <Vehicle name="MB_C_2011_black" vehicleCategory="car"> <ParameterDeclarations/> <Performance maxSpeed="69.444" maxAcceleration="200" maxDeceleration="10.0"/> <BoundingBox> <Center x="1.5" y="0.0" z="0.9"/> <Dimensions width="2.1" length="4.5" height="1.8"/> </BoundingBox> <Axles> <FrontAxle maxSteering="0.5" wheelDiameter="0.6" trackWidth="1.8" positionX="3.1" positionZ="0.3"/> <RearAxle maxSteering="0.0" wheelDiameter="0.6" trackWidth="1.8" positionX="0.0" positionZ="0.3"/> </Axles> <Properties> <Property name="control" value="internal"/> <File filepath=""/> </Properties> </Vehicle> <ObjectController> <Controller name="DefaultDriver"> <Properties/> </Controller> </ObjectController> </ScenarioObject> <ScenarioObject name="cube1"> <MiscObject name="RdMiscPylon03-32cm" mass="10" miscObjectCategory="obstacle"> <BoundingBox> <Center x="0.0" y="0.0" z="0.0"/> <Dimensions width="0.5" length="0.5" height="0.5"/> </BoundingBox> <Properties/> </MiscObject> </ScenarioObject> <ScenarioObject name="cube2"> <MiscObject name="RdMiscPylon03-32cm" mass="10" miscObjectCategory="obstacle"> <BoundingBox> <Center x="0.0" y="0.0" z="0.0"/> <Dimensions width="0.5" length="0.5" height="0.5"/> </BoundingBox> <Properties/> </MiscObject> </ScenarioObject> <ScenarioObject name="cube3"> <MiscObject name="RdMiscPylon03-32cm" mass="10" miscObjectCategory="obstacle"> <BoundingBox> <Center x="0.0" y="0.0" z="0.0"/> <Dimensions width="0.5" length="0.5" height="0.5"/> </BoundingBox> <Properties/> </MiscObject> </ScenarioObject> <ScenarioObject name="cube4"> <MiscObject name="RdMiscPylon03-32cm" mass="10" miscObjectCategory="obstacle"> <BoundingBox> <Center x="0.0" y="0.0" z="0.0"/> <Dimensions width="0.5" length="0.5" height="0.5"/> </BoundingBox> <Properties/> </MiscObject> </ScenarioObject> <ScenarioObject name="cube5"> <MiscObject name="RdMiscPylon03-32cm" mass="10" miscObjectCategory="obstacle"> <BoundingBox> <Center x="0.0" y="0.0" z="0.0"/> <Dimensions width="0.5" length="0.5" height="0.5"/> </BoundingBox> <Properties/> </MiscObject> </ScenarioObject> <ScenarioObject name="cube6"> <MiscObject name="RdMiscPylon03-32cm" mass="10" miscObjectCategory="obstacle"> <BoundingBox> <Center x="0.0" y="0.0" z="0.0"/> <Dimensions width="0.5" length="0.5" height="0.5"/> </BoundingBox> <Properties/> </MiscObject> </ScenarioObject> </Entities> <Storyboard> <Init> <Actions> <GlobalAction> <EnvironmentAction> <Environment name="Environment1"> <TimeOfDay animation="false" dateTime="2020-02-21T13:00:00"/> <Weather cloudState="free"> <Sun intensity="1.0" azimuth="0.0" elevation="1.571"/> <Fog visualRange="8000.0"/> <Precipitation precipitationType="dry" intensity="1"/> </Weather> <RoadCondition frictionScaleFactor="1.0"> <Properties> <Property name="state" value="dry"/> <Property name="effectScale" value="1.0"/> </Properties> </RoadCondition> </Environment> </EnvironmentAction> </GlobalAction> <Private entityRef="Ego"> <PrivateAction> <TeleportAction> <Position> <LanePosition roadId="1" laneId="-1" s="100" offset="0"> <Orientation type="relative" h="0" p="0" r="0"/> </LanePosition> </Position> </TeleportAction> </PrivateAction> <PrivateAction> <LongitudinalAction> <SpeedAction> <SpeedActionDynamics dynamicsShape="step" value="0" dynamicsDimension="time"/> <SpeedActionTarget> <AbsoluteTargetSpeed value="0"/> </SpeedActionTarget> </SpeedAction> </LongitudinalAction> </PrivateAction> </Private> <Private entityRef="FO"> <PrivateAction> <TeleportAction> <Position> <LanePosition roadId="1" laneId="-1" s="50" offset="0"> <Orientation type="relative" h="0" p="0" r="0"/> </LanePosition> </Position> </TeleportAction> </PrivateAction> <PrivateAction> <LongitudinalAction> <SpeedAction> <SpeedActionDynamics dynamicsShape="step" value="0" dynamicsDimension="time"/> <SpeedActionTarget> <AbsoluteTargetSpeed value="0"/> </SpeedActionTarget> </SpeedAction> </LongitudinalAction> </PrivateAction> </Private> <Private entityRef="Rev"> <PrivateAction> <TeleportAction> <Position> <LanePosition roadId="1" laneId="1" s="50" offset="0"> <Orientation type="relative" h="3.14" p="0" r="0"/> </LanePosition> </Position> </TeleportAction> </PrivateAction> <PrivateAction> <LongitudinalAction> <SpeedAction> <SpeedActionDynamics dynamicsShape="step" value="0" dynamicsDimension="time"/> <SpeedActionTarget> <AbsoluteTargetSpeed value="0"/> </SpeedActionTarget> </SpeedAction> </LongitudinalAction> </PrivateAction> </Private> <Private entityRef="FRev"> <PrivateAction> <TeleportAction> <Position> <LanePosition roadId="1" laneId="1" s="40" offset="0"> <Orientation type="relative" h="3.14" p="0" r="0"/> </LanePosition> </Position> </TeleportAction> </PrivateAction> <PrivateAction> <LongitudinalAction> <SpeedAction> <SpeedActionDynamics dynamicsShape="step" value="0" dynamicsDimension="time"/> <SpeedActionTarget> <AbsoluteTargetSpeed value="0"/> </SpeedActionTarget> </SpeedAction> </LongitudinalAction> </PrivateAction> </Private> <Private entityRef="cube1"> <PrivateAction> <TeleportAction> <Position> <WorldPosition x="698" y="2.3" z="0" h="0" p="0" r="0"/> </Position> </TeleportAction> </PrivateAction> <PrivateAction> <LongitudinalAction> <SpeedAction> <SpeedActionDynamics dynamicsShape="step" value="0" dynamicsDimension="time"/> <SpeedActionTarget> <AbsoluteTargetSpeed value="0"/> </SpeedActionTarget> </SpeedAction> </LongitudinalAction> </PrivateAction> </Private> <Private entityRef="cube2"> <PrivateAction> <TeleportAction> <Position> <WorldPosition x="701" y="4.4" z="0" h="0" p="0" r="0"/> </Position> </TeleportAction> </PrivateAction> <PrivateAction> <LongitudinalAction> <SpeedAction> <SpeedActionDynamics dynamicsShape="step" value="0" dynamicsDimension="time"/> <SpeedActionTarget> <AbsoluteTargetSpeed value="0"/> </SpeedActionTarget> </SpeedAction> </LongitudinalAction> </PrivateAction> </Private> <Private entityRef="cube3"> <PrivateAction> <TeleportAction> <Position> <WorldPosition x="705" y="5.1" z="0" h="0" p="0" r="0"/> </Position> </TeleportAction> </PrivateAction> <PrivateAction> <LongitudinalAction> <SpeedAction> <SpeedActionDynamics dynamicsShape="step" value="0" dynamicsDimension="time"/> <SpeedActionTarget> <AbsoluteTargetSpeed value="0"/> </SpeedActionTarget> </SpeedAction> </LongitudinalAction> </PrivateAction> </Private> <Private entityRef="cube4"> <PrivateAction> <TeleportAction> <Position> <WorldPosition x="707" y="4.5" z="0" h="0" p="0" r="0"/> </Position> </TeleportAction> </PrivateAction> <PrivateAction> <LongitudinalAction> <SpeedAction> <SpeedActionDynamics dynamicsShape="step" value="0" dynamicsDimension="time"/> <SpeedActionTarget> <AbsoluteTargetSpeed value="0"/> </SpeedActionTarget> </SpeedAction> </LongitudinalAction> </PrivateAction> </Private> <Private entityRef="cube5"> <PrivateAction> <TeleportAction> <Position> <WorldPosition x="708" y="3.6" z="0" h="0" p="0" r="0"/> </Position> </TeleportAction> </PrivateAction> <PrivateAction> <LongitudinalAction> <SpeedAction> <SpeedActionDynamics dynamicsShape="step" value="0" dynamicsDimension="time"/> <SpeedActionTarget> <AbsoluteTargetSpeed value="0"/> </SpeedActionTarget> </SpeedAction> </LongitudinalAction> </PrivateAction> </Private> <Private entityRef="cube6"> <PrivateAction> <TeleportAction> <Position> <WorldPosition x="710" y="2" z="0" h="0" p="0" r="0"/> </Position> </TeleportAction> </PrivateAction> <PrivateAction> <LongitudinalAction> <SpeedAction> <SpeedActionDynamics dynamicsShape="step" value="0" dynamicsDimension="time"/> <SpeedActionTarget> <AbsoluteTargetSpeed value="0"/> </SpeedActionTarget> </SpeedAction> </LongitudinalAction> </PrivateAction> </Private> </Actions> </Init> <Story name="Story"> <Act name="Act of Ego"> <ManeuverGroup name="Sequence of Ego" maximumExecutionCount="1"> <Actors selectTriggeringEntities="false"> <EntityRef entityRef="Ego"/> </Actors> <Maneuver name="Maneuver of Ego"> <Event name="Event1 of Ego" priority="overwrite"> <Action name="Action1"> <PrivateAction> <LongitudinalAction> <SpeedAction> <SpeedActionDynamics dynamicsShape="linear" value="4" dynamicsDimension="rate"/> <SpeedActionTarget> <AbsoluteTargetSpeed value="16.666667"/> </SpeedActionTarget> </SpeedAction> </LongitudinalAction> </PrivateAction> </Action> <StartTrigger> <ConditionGroup> <Condition name="StartCondition1 of Ego" delay="0" conditionEdge="rising"> <ByValueCondition> <SimulationTimeCondition value="0" rule="greaterThan"/> </ByValueCondition> </Condition> </ConditionGroup> </StartTrigger> </Event> <Event name="Event2 of Ego" priority="overwrite"> <Action name="Action1"> <UserDefinedAction> <CustomCommandAction type="scp"> <![CDATA[ <Camera name="VIEW_CAMERA" showOwner="true"> <Frustum far="1500.000000" fovHor="40.000000" fovVert="30.000000" near="1.000000" offsetHor="0.000000" offsetVert="0.000000"/> <PosRelative dx="-8.000000" dy="0.000000" dz="2.000000" player="Ego"/> <ViewRelative dh="0.000000" dp="0.010000" dr="0.000000" /> <Set/> </Camera> ]]> </CustomCommandAction> </UserDefinedAction> </Action> <StartTrigger> <ConditionGroup> <Condition name="StartCondition1 of Ego" delay="0" conditionEdge="rising"> <ByValueCondition> <SimulationTimeCondition value="0" rule="greaterThan"/> </ByValueCondition> </Condition> </ConditionGroup> </StartTrigger> </Event> <Event name="Event3 of Ego" priority="overwrite"> <Action name="Action1"> <PrivateAction> <LateralAction> <LaneChangeAction targetLaneOffset="0.0"> <LaneChangeActionDynamics dynamicsShape="linear" dynamicsDimension="time" value="3"/> <LaneChangeTarget> <AbsoluteTargetLane value="1"/> </LaneChangeTarget> </LaneChangeAction> </LateralAction> </PrivateAction> </Action> <StartTrigger> <ConditionGroup> <Condition name="StartCondition1" delay="0" conditionEdge="rising"> <ByEntityCondition> <TriggeringEntities triggeringEntitiesRule="all"> <EntityRef entityRef="Ego"/> </TriggeringEntities> <EntityCondition> <DistanceCondition value="1" freespace="false" alongRoute="false" rule="lessThan"> <Position> <WorldPosition x="666" y="3.6" z="0" h="0" p="0" r="0"/> </Position> </DistanceCondition> </EntityCondition> </ByEntityCondition> </Condition> </ConditionGroup> </StartTrigger> </Event> <Event name="Event2 of Ego" priority="overwrite"> <Action name="Action1"> <UserDefinedAction> <CustomCommandAction type="scp"> <![CDATA[ <Traffic> <Collision restitutionCoeff="0.1" enable="true" friction="6.0"/> </Traffic> ]]> </CustomCommandAction> </UserDefinedAction> </Action> <StartTrigger> <ConditionGroup> <Condition name="StartCondition1" delay="0" conditionEdge="rising"> <ByEntityCondition> <TriggeringEntities triggeringEntitiesRule="all"> <EntityRef entityRef="Ego"/> </TriggeringEntities> <EntityCondition> <DistanceCondition value="3" freespace="false" alongRoute="false" rule="lessThan"> <Position> <WorldPosition x="666" y="3.6" z="0" h="0" p="0" r="0"/> </Position> </DistanceCondition> </EntityCondition> </ByEntityCondition> </Condition> </ConditionGroup> </StartTrigger> </Event> </Maneuver> </ManeuverGroup> <StartTrigger> </StartTrigger> <StopTrigger> </StopTrigger> </Act> <Act name="Act of FO"> <ManeuverGroup name="Sequence of FO" maximumExecutionCount="1"> <Actors selectTriggeringEntities="false"> <EntityRef entityRef="FO"/> </Actors> <Maneuver name="Maneuver of FO"> <Event name="Event1 of FO" priority="overwrite"> <Action name="Action1"> <PrivateAction> <TeleportAction> <Position> <RelativeLanePosition entityRef="Ego" dLane="0" ds="100" offset="0"> <Orientation type="relative" h="0" p="0" r="0"/> </RelativeLanePosition> </Position> </TeleportAction> </PrivateAction> </Action> <Action name="Action2"> <PrivateAction> <LongitudinalAction> <SpeedAction> <SpeedActionDynamics dynamicsShape="step" value="0.1" dynamicsDimension="rate"/> <SpeedActionTarget> <AbsoluteTargetSpeed value="16.666667"/> </SpeedActionTarget> </SpeedAction> </LongitudinalAction> </PrivateAction> </Action> <StartTrigger> <ConditionGroup> <Condition name="StartCondition1" delay="0" conditionEdge="rising"> <ByEntityCondition> <TriggeringEntities triggeringEntitiesRule="all"> <EntityRef entityRef="Ego"/> </TriggeringEntities> <EntityCondition> <TraveledDistanceCondition value="100"/> </EntityCondition> </ByEntityCondition> </Condition> </ConditionGroup> </StartTrigger> </Event> <Event name="Event2 of FO" priority="overwrite"> <Action name="Action1"> <PrivateAction> <LateralAction> <LaneChangeAction targetLaneOffset="0.0"> <LaneChangeActionDynamics dynamicsShape="linear" dynamicsDimension="time" value="3"/> <LaneChangeTarget> <AbsoluteTargetLane value="1"/> </LaneChangeTarget> </LaneChangeAction> </LateralAction> </PrivateAction> </Action> <StartTrigger> <ConditionGroup> <Condition name="StartCondition1" delay="0" conditionEdge="rising"> <ByEntityCondition> <TriggeringEntities triggeringEntitiesRule="all"> <EntityRef entityRef="FO"/> </TriggeringEntities> <EntityCondition> <DistanceCondition value="1" freespace="false" alongRoute="false" rule="lessThan"> <Position> <WorldPosition x="666" y="3.6" z="0" h="0" p="0" r="0"/> </Position> </DistanceCondition> </EntityCondition> </ByEntityCondition> </Condition> </ConditionGroup> </StartTrigger> </Event> <Event name="Event3 of FO" priority="overwrite"> <Action name="Action1"> <PrivateAction> <LateralAction> <LaneChangeAction targetLaneOffset="0.0"> <LaneChangeActionDynamics dynamicsShape="linear" dynamicsDimension="time" value="3"/> <LaneChangeTarget> <AbsoluteTargetLane value="-1"/> </LaneChangeTarget> </LaneChangeAction> </LateralAction> </PrivateAction> </Action> <StartTrigger> <ConditionGroup> <Condition name="StartCondition1" delay="2" conditionEdge="rising"> <ByEntityCondition> <TriggeringEntities triggeringEntitiesRule="all"> <EntityRef entityRef="FO"/> </TriggeringEntities> <EntityCondition> <DistanceCondition value="3" freespace="false" alongRoute="false" rule="lessThan"> <Position> <WorldPosition x="666" y="3.6" z="0" h="0" p="0" r="0"/> </Position> </DistanceCondition> </EntityCondition> </ByEntityCondition> </Condition> </ConditionGroup> </StartTrigger> </Event> </Maneuver> </ManeuverGroup> <StartTrigger> </StartTrigger> <StopTrigger> </StopTrigger> </Act> <Act name="Act of Rev"> <ManeuverGroup name="Sequence of Rev" maximumExecutionCount="1"> <Actors selectTriggeringEntities="false"> <EntityRef entityRef="Rev"/> </Actors> <Maneuver name="Maneuver of Rev"> <Event name="Event1 of Rev" priority="overwrite"> <Action name="Action1"> <PrivateAction> <TeleportAction> <Position> <LanePosition roadId="1" laneId="1" s="1300" offset="0"> <Orientation type="relative" h="3.14" p="0" r="0"/> </LanePosition> </Position> </TeleportAction> </PrivateAction> </Action> <Action name="Action2"> <PrivateAction> <LongitudinalAction> <SpeedAction> <SpeedActionDynamics dynamicsShape="step" value="0.1" dynamicsDimension="rate"/> <SpeedActionTarget> <AbsoluteTargetSpeed value="15.666667"/> </SpeedActionTarget> </SpeedAction> </LongitudinalAction> </PrivateAction> </Action> <StartTrigger> <ConditionGroup> <Condition name="StartCondition1" delay="2" conditionEdge="rising"> <ByEntityCondition> <TriggeringEntities triggeringEntitiesRule="all"> <EntityRef entityRef="Ego"/> </TriggeringEntities> <EntityCondition> <TraveledDistanceCondition value="100"/> </EntityCondition> </ByEntityCondition> </Condition> </ConditionGroup> </StartTrigger> </Event> </Maneuver> </ManeuverGroup> <StartTrigger> </StartTrigger> <StopTrigger> </StopTrigger> </Act> <Act name="Act of FRev"> <ManeuverGroup name="Sequence of FRev" maximumExecutionCount="1"> <Actors selectTriggeringEntities="false"> <EntityRef entityRef="FRev"/> </Actors> <Maneuver name="Maneuver of FRev"> <Event name="Event1 of FRev" priority="overwrite"> <Action name="Action1"> <PrivateAction> <TeleportAction> <Position> <LanePosition roadId="1" laneId="1" s="1150" offset="0"> <Orientation type="relative" h="3.14" p="0" r="0"/> </LanePosition> </Position> </TeleportAction> </PrivateAction> </Action> <Action name="Action2"> <PrivateAction> <LongitudinalAction> <SpeedAction> <SpeedActionDynamics dynamicsShape="step" value="0.1" dynamicsDimension="rate"/> <SpeedActionTarget> <AbsoluteTargetSpeed value="15.666667"/> </SpeedActionTarget> </SpeedAction> </LongitudinalAction> </PrivateAction> </Action> <StartTrigger> <ConditionGroup> <Condition name="StartCondition1" delay="2" conditionEdge="rising"> <ByEntityCondition> <TriggeringEntities triggeringEntitiesRule="all"> <EntityRef entityRef="Ego"/> </TriggeringEntities> <EntityCondition> <TraveledDistanceCondition value="100"/> </EntityCondition> </ByEntityCondition> </Condition> </ConditionGroup> </StartTrigger> </Event> </Maneuver> </ManeuverGroup> <StartTrigger> </StartTrigger> <StopTrigger> </StopTrigger> </Act> </Story> <StopTrigger> <ConditionGroup> <Condition name="StartCondition1 of Ego" delay="0" conditionEdge="rising"> <ByValueCondition> <SimulationTimeCondition value="45" rule="greaterThan"/> </ByValueCondition> </Condition> </ConditionGroup> </StopTrigger> </Storyboard> </OpenSCENARIO> 解析成对象
最新发布
12-02
<think> 在Vue 3项目中解析OpenSCENARIO(.xosc)文件,本质上是将XML格式的文本转换为JavaScript对象。以下是几种实现方法及其详细步骤: --- ### **方法1:使用原生DOMParser(适合简单解析)** ```javascript // 在Vue组件中 const parseXOSC = (xmlString) => { const parser = new DOMParser(); const xmlDoc = parser.parseFromString(xmlString, "text/xml"); // 检查解析错误 if (xmlDoc.getElementsByTagName("parsererror").length > 0) { throw new Error("XML解析错误"); } // 手动提取数据(示例:获取所有实体名称) const entities = Array.from(xmlDoc.querySelectorAll("Entities > *")).map(entity => ({ name: entity.getAttribute('name'), type: entity.tagName })); return { entities }; }; // 文件上传处理 const handleFileUpload = (event) => { const file = event.target.files[0]; const reader = new FileReader(); reader.onload = (e) => { const scenario = parseXOSC(e.target.result); console.log(scenario); // 输出解析后的对象 }; reader.readAsText(file); }; ``` --- ### **方法2:使用专用库(推荐,复杂场景)** 安装OpenSCENARIO解析库(例如`openscenario-js`): ```bash npm install openscenario-js ``` 在Vue组件中使用: ```javascript import { OpenSCENARIO } from 'openscenario-js'; const parseWithLib = (xmlContent) => { return new OpenSCENARIO().parse(xmlContent); // 返回结构化对象 }; // 结合文件上传 const handleFileUpload = async (event) => { const file = event.target.files[0]; const text = await file.text(); const scenario = parseWithLib(text); console.log(scenario.storyboard); // 访问故事板数据 }; ``` --- ### **方法3:结合Vue响应式系统** 将解析结果绑定到Vue的响应式数据: ```vue <template> <input type="file" @change="handleFileUpload" accept=".xosc" /> <div v-if="scenario"> <h3>场景名称: {{ scenario.name }}</h3> <ul> <li v-for="(entity, index) in scenario.entities" :key="index"> {{ entity.name }} ({{ entity.type }}) </li> </ul> </div> </template> <script setup> import { ref } from 'vue'; import { OpenSCENARIO } from 'openscenario-js'; const scenario = ref(null); const handleFileUpload = async (e) => { const file = e.target.files[0]; const text = await file.text(); scenario.value = new OpenSCENARIO().parse(text); }; </script> ``` --- ### **关键注意事项** 1. **性能优化** 大型文件解析会阻塞UI,使用Web Worker: ```javascript // 创建worker:src/workers/xoscParser.js self.onmessage = (e) => { importScripts('openscenario-js'); // 动态导入库 const scenario = new self.OpenSCENARIO().parse(e.data); postMessage(scenario); }; // 组件中调用 const worker = new Worker('/workers/xoscParser.js', { type: 'module' }); worker.postMessage(xmlText); worker.onmessage = (e) => { scenario.value = e.data; }; ``` 2. **错误处理** 添加XML格式校验: ```javascript const validateXOSC = (xml) => { const xsd = fetch('/schemas/OpenSCENARIO.xsd'); // 加载XSD模式 // 使用libxmljs等工具校验 }; ``` 3. **XSD验证(可选)** 使用`libxmljs`验证文件合法性: ```bash npm install libxmljs ``` ```javascript import { parseXml } from 'libxmljs'; const validate = (xmlText) => { const xsdDoc = parseXml(xsdSchema); // 加载XSD const xmlDoc = parseXml(xmlText); const valid = xmlDoc.validate(xsdDoc); return valid ? true : xmlDoc.validationErrors; }; ``` --- ### **解析流程图** ```mermaid graph LR A[上传.xosc文件] --> B[FileReader读取为文本] B --> C{选择解析方式} C -->|原生| D[DOMParser提取数据] C -->|库| E[openscenario-js解析] D & E --> F[生成JS对象] F --> G[Vue响应式绑定] ``` §§相关问题§§ 1.Vue 3中解析大型xosc文件时如何避免界面卡顿? 2.如何将解析后的OpenSCENARIO对象渲染为3D场景? 3.如何验证xosc文件是否符合OpenSCENARIO标准? </think> 在 Vue 3 项目中解析 OpenSCENARIO (.xosc) XML 文件为 JavaScript 对象,可以通过以下方法实现: ### 方法一:使用原生 DOMParser(轻量级方案) ```javascript // 在Vue组件中 const parseXOSC = (xmlString) => { // 创建XML解析器 const parser = new DOMParser(); const xmlDoc = parser.parseFromString(xmlString, "text/xml"); // 检查解析错误 if (xmlDoc.getElementsByTagName("parsererror").length > 0) { throw new Error("XML解析错误"); } // 提取场景名称 const scenarioName = xmlDoc.querySelector("OpenSCENARIO > Storyboard > Story > Act")?.getAttribute("name") || "未命名场景"; // 提取实体数据 const entities = Array.from(xmlDoc.querySelectorAll("Entities > Vehicle")).map(veh => ({ name: veh.getAttribute("name"), type: veh.querySelector("VehicleCategory")?.textContent || "car" })); // 提取事件数据 const events = Array.from(xmlDoc.querySelectorAll("Event")).map(event => ({ name: event.getAttribute("name"), actions: Array.from(event.querySelectorAll("Action")).map(action => ({ type: action.querySelector("*")?.tagName || "未知动作" })) })); return { scenarioName, entities, events }; }; // 文件上传处理 const handleFileUpload = (event) => { const file = event.target.files[0]; const reader = new FileReader(); reader.onload = (e) => { try { const scenarioObj = parseXOSC(e.target.result); console.log("解析结果:", scenarioObj); // 这里可以存储到Vue的响应式数据中 } catch (error) { console.error("解析失败:", error.message); } }; reader.readAsText(file); }; ``` ### 方法二:使用专用库(推荐,更健壮) ```bash npm install openscenario-js # 安装专用解析库 ``` ```vue <script setup> import { ref } from 'vue'; import { OpenSCENARIO } from 'openscenario-js'; const scenarioData = ref(null); const errorMessage = ref(''); const handleFileUpload = async (event) => { const file = event.target.files[0]; try { const xmlContent = await file.text(); const parser = new OpenSCENARIO(); scenarioData.value = parser.parse(xmlContent); } catch (e) { errorMessage.value = `解析错误: ${e.message}`; } }; </script> <template> <input type="file" accept=".xosc" @change="handleFileUpload" /> <div v-if="scenarioData"> <h3>{{ scenarioData.storyboard.init.actions[0].name }}</h3> <pre>{{ JSON.stringify(scenarioData, null, 2) }}</pre> </div> <p v-if="errorMessage" class="error">{{ errorMessage }}</p> </template> ``` ### 方法三:结合 XML2JS(通用 XML 解析) ```bash npm install xml2js ``` ```javascript import { parseString } from 'xml2js'; const parseWithXML2JS = (xmlContent) => { return new Promise((resolve, reject) => { parseString(xmlContent, (err, result) => { if (err) reject(err); else resolve(transformStructure(result)); }); }); }; // 转换结构适配xosc const transformStructure = (rawObj) => { // 这里需要根据xosc结构进行转换 return { name: rawObj.OpenSCENARIO.Storyboard[0].Story[0].$.name, entities: rawObj.OpenSCENARIO.Entities[0].Vehicle.map(v => ({ name: v.$.name, type: v.VehicleCategory[0] })) }; }; // 在Vue组件中使用 const handleFile = async (file) => { const content = await file.text(); const result = await parseWithXML2JS(content); scenarioData.value = result; }; ``` ### 最佳实践建议 1. **大型文件处理**: ```javascript // 使用Web Worker避免阻塞UI const worker = new Worker('./xoscParser.worker.js'); worker.postMessage(largeXMLContent); worker.onmessage = (e) => { scenarioData.value = e.data; }; ``` 2. **错误处理增强**: ```javascript try { // 解析代码... } catch (e) { if (e instanceof DOMException) { console.error("XML格式错误:", e.message); } else { console.error("解析逻辑错误:", e.stack); } } ``` 3. **性能优化**: ```javascript // 使用虚拟滚动展示大型数据 <RecycleScroller :items="scenarioData.entities" item-size="50" key-field="name" > <template v-slot="{ item }"> <div>{{ item.name }} - {{ item.type }}</div> </template> </RecycleScroller> ``` 4. **XSD 验证(可选)**: ```javascript // 使用libxmljs验证 import { parseXml } from 'libxmljs'; const validateXOSC = (xml) => { const xsdDoc = parseXml(xsdSchema); // 加载XSD const xmlDoc = parseXml(xml); return xmlDoc.validate(xsdDoc); }; ``` 选择方案的建议: - 简单场景 ➔ 原生 DOMParser - 标准 OpenSCENARIO ➔ 专用库 - 需要深度定制 ➔ XML2JS + 转换器
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值