{"id":27884671,"url":"https://github.com/code-jio/dataanalyse","last_synced_at":"2025-10-13T10:37:45.210Z","repository":{"id":163361920,"uuid":"571586021","full_name":"Code-jio/DataAnalyse","owner":"Code-jio","description":"半自动化数据分析工具（持续更新中）","archived":false,"fork":false,"pushed_at":"2023-01-07T06:27:38.000Z","size":8953,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-05-05T06:46:14.021Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Code-jio.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2022-11-28T13:01:34.000Z","updated_at":"2023-06-07T07:56:42.000Z","dependencies_parsed_at":null,"dependency_job_id":"ec4525b3-986d-4482-99fd-b4e40f39bd17","html_url":"https://github.com/Code-jio/DataAnalyse","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Code-jio/DataAnalyse","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Code-jio%2FDataAnalyse","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Code-jio%2FDataAnalyse/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Code-jio%2FDataAnalyse/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Code-jio%2FDataAnalyse/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Code-jio","download_url":"https://codeload.github.com/Code-jio/DataAnalyse/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Code-jio%2FDataAnalyse/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279014651,"owners_count":26085555,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-13T02:00:06.723Z","response_time":61,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-05-05T06:38:45.277Z","updated_at":"2025-10-13T10:37:45.205Z","avatar_url":"https://github.com/Code-jio.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 一款基于 webpack+vue3+element-plus+websocket 框架的半自动化数据分析工具\n\n### 运行环境要求\n\n```bash\nnode版本 v16.13.0\nnpm版本  8.0.0以上\n```\n\n### 命令介绍\n\n```bash\nnpm start       启动项目\nnpm run dev     运行dev环境\nnpm run build   打包\n```\n\n### 开发模式\n\n\u003e 1. 由 vuex 实现全局状态管理，eventBus 辅助实现兄弟间组件数据沟通（由于体量原因，暂未实现模块化）。\n\u003e\n\u003e 2. 在/router/index.js 中创造对应页面的路由。\n\u003e\n\u003e 3. 模块化、组件化开发，合理掌握组件粒度。\n\u003e\n\u003e 4. 由 webpack 实现打包优化，优化 elemen-plus 组件加载，html、js、css 样式、静态资源处理等（详见/config/webpack.config.js）。\n\n### 接口地址\n\n[ws://172.16.100.240:20002]()\n\n### 本地安装\n\n```js\nnpm install\n```\n\n### 开发工具\n\nvscode\n\n### 目录说明\n\n```\n├── config  webpack的配置文件\n│   └── webpack.config.js  webpack运行的配置文件\n├── dist  生产代码文件夹\n│   ├── static  js与css的资源文件夹\n│   │   ├── css  打包后的css文件夹\n│   │   └── js  打包后的js文件夹\n│   ├── favicon.ico  网页图标\n│   └── index.html  打包后的html入口文件\n├── public  公共文件\n│   ├── favicon.ico  网页图标\n│   └── index.html  html入口文件\n├── src\n│   ├── assets 静态资源文件夹\n│   │   └── iamges 图片文件夹\n│   ├── components 公共组件文件夹\n│   ├── router 路由文件夹\n│   │   └── index.js 全局路由管理\n│   ├── store 全局状态管理\n│   │   └── index.js vuex主要内容（由于体量原因，暂未实现模块化）\n│   ├── service api请求文件夹\n│   │   ├── proto ProtoBuffer Api文件夹\n│   │   │   ├── msg_v_1.proto proto文件\n│   │   │   └── proto_main.js proto文件经过ProtoBuffer转化后的Api文件\n│   │   └── websocket 所有请求地址放置处\n│   │   │   ├── send.js 发送指令的Api文件\n│   │   │   └── websocket.js websocket主体文件，包含websocket创建、连接、解析等等操作\n│   ├── styles 样式文件夹\n│   │   ├── element  字体图标\n│   │   │   └──index.scss element-plus自定义样式\n│   │   ├── common.css 自定义公共样式\n│   │   ├── localize elment-plus的样式本地化\n│   │   └── preset.css 全局的预设样式\n│   ├── views vue页面\n│   │   └── Home 主页文件夹\n│   │   │   └── Home.vue 描述主页的vue文件\n│   │   │   └── components 针对当前页面的 组件文件夹\n│   │   │   │   ├── AlgorithmPicker.vue 算法选择组件\n│   │   │   │   ├── BarChart.vue 柱状图组件\n│   │   │   │   ├── LineChart.vue 折线图组件\n│   │   │   │   ├── PhotoList.vue 图片列表组件\n│   │   │   │   ├── SampleList.vue 样本列表组件\n│   │   │   │   ├── ShowTags.vue 标签展示组件\n│   │   │   │   └── TimePicker.vue 时间选择组件\n│   ├── utils\n│   │   ├── da taTransform  数据转换\n│   │   ├── eventBus.js  中央事件总线（用于兄弟组件之间的数据传递\n│   │   ├── subscribeTable.js  消息订阅表\n│   │   └── utils.js  自定义工具函数\n│   ├── App.vue  vue入口文件\n│   └── main.js  项目全局入口文件\n├── .gitignore  git排除文件\n├── .eslintrc.js  eslint配置\n├── babel.config.js  babel配置\n├── package-lock.json   记录实际安装的各个npm 包的具体来源和版本号的json文件\n└── package.json   记录本项目所需要的各种模块\n```\n\n### 通信方式（长连接-消息序列化）\n\n#### 简介\n\n本系统主要是用 Websocket+ProtoBuffer 作为通信手段，其中 Protobuffer 主要定义前后端沟通交流的数据结构和构建序列化消息，Websocket 则主要为二者提供全双工通信，保持双方的实时沟通和数据交流。该功能主要内容位于/src/service 文件，而 websocket.js 提供创建 websocket 长连接，以及在长连接的条件下接收数据消息，并对其进行反序列化，值得注意的是，proto_main.js 文件（proto_main.js 文件是由同目录下 msg_v_1.proto 文件提取出得 API 编译组成）为该功能提供消息反序列化 API 支持。\n\n#### 功能说明\n\n该功能的实现主要由 websocket.js 文件完成，其中 websocket.js 主要负责管理 websocket 长连接和已接收数据消息的反序列化，由 proto_main.js 提供 API 支持。\n\n在 websocket.js 创建出 SocketManager 自执行函数，函数内部创建 Websocket 对象实现长连接，并且在本函数内部创建一系列 WebsocketAPI（如 onOpen、onMessage、onSend 等等）并将其绑定到 Websocket 对象上。在开启长连接的前提下，接收到服务器消息时，首先数据消息进行 ArrayBuffer 类型判断，判断通过后对该数据消息进行首层解析，解析后将获得 mainPacket，根据 mainPacket 下的 messageType 的属性值判断消息类型，根据消息类型的不同采取不同的 API 进行第二层解析，将解析后的数据通过处理后即可在页面或组件中直接使用。\n\n#### 字段说明\n\n##### 首层输入项参数：\n\n| 字段     | 说明         | 类型   | 备注                     | 是否必填 |\n| -------- | ------------ | ------ | ------------------------ | -------- |\n| cmd_code | 控制命令编码 | Number | 枚举编号 ×224+本类别编号 | 是       |\n| params   | 参数         | String |                          | 是       |\n\n##### 首层返回值：\n\n| 字段    | 说明 | 类型        | 备注                        | 是否必填 |\n| ------- | ---- | ----------- | --------------------------- | -------- |\n| content |      | ArrayBuffer | 此数据为主包的 content 内容 |          |\n\n##### 第二层输入项参数：\n\n| 字段             | 说明           | 类型        | 备注                     | 是否必填 |\n| ---------------- | -------------- | ----------- | ------------------------ | :------- |\n| accessPointId    | 接入点         | Number      | 枚举编号 ×224+本类别编号 |          |\n| check            | 字段校验码     | String      |                          |          |\n| content          | 内容包         | ArrayBuffer |                          | 是       |\n| destEntityId     | 目标实体 id    | Number      | 枚举编号 ×224+本类别编号 | 是       |\n| messageType      | 消息类型       | Number      | 枚举编号                 | 是       |\n| originEntityType | 消息源实体类型 | Number      | 枚举编号                 | 是       |\n| originEntityId   | 消息源实体 id  | Number      | 枚举编号 ×224+本类别编号 | 是       |\n| time             | 时间戳         | Number      |                          | 是       |\n| token            | 通行证         | String      |                          |          |\n\n##### 首层返回值：\n\n| 字段 | 说明 | 类型        | 备注             | 是否必填 |\n| ---- | ---- | ----------- | ---------------- | -------- |\n| data |      | ArrayBuffer | 此数据为主包内容 |          |\n\n#### 消息订阅表说明：\n\n由于本系统与狼蛛共用同一数据接口，在日常运行中偶尔会接受来自于狼蛛系统的广播消息，但用户可能并不需要此类消息或数据，这时可能会造成数据冗余，那么适时合理接收广播消息就是本消息订阅功能的存在意义。\n\n```js\nlet subs_Table = new Array(16);\nsubs_Table = [\n  0b00000000, // 0-7\n  0b00000000, // 8-15\n  0b00000000, // 16-23\n  0b00000000, // 24-31\n  0b00000000, // 32-39\n  0b00000000, // 40-47\n  0b00000000, // 48-55\n  0b00000000, // 56-63\n  0b00000000, // 64-71\n  0b00000000, // 72-79\n  0b00000000, // 80-87\n  0b00000000, // 88-95\n  0b00000000, // 96-103\n  0b00000000, // 104-111\n  0b00000000, // 112-119\n  0b00000000, // 120-127\n];\nexport default new Uint8Array(subs_Table);\n```\n\n此消息订阅表为长度固定为 16 的二进制数组，数组元素为固定长度为 8 的二进制数字，每个元素初始状态皆为 0b00000000，背后代表了 8 条消息的订阅与否，整个消息订阅表从数组首个元素的第一位开始一直到最后一个元素的第八位结束，分别代表了 8\\*16=128（对应着 proto 文件中的 MessageType）条二进制消息的订阅状态（0 代表该消息未被订阅，1 代表该消息已订阅）。在本系统中我们拒绝接受所有广播消息，只需将所有数组元素的每一位置 0 即可。\n\n在确认登陆成功之后，才会向后台发送此条消息，如果想要重新确认需要接受的广播消息，只需将修改后的消息订阅表发送至后台即可。\n\n#### 注意事项：\n\n值得注意的是，在解析到 SS_SIGNAL_SAMPLE 类型的消息时，proto_main.js 给出的解析方法会默认将数据按照 B64 格式解析，所以我们确定要接收非图像类数据的时候，需要使用另外的解析方法，例如：\n\n```js\nif (ssSignalSample.originEntityType === proto.EntityType.SS_SEISMIC) {\n  let sampleValue = proto.ss_signal_sample\n    .deserializeBinary(content)\n    .getSampleValue();\n  ssSignalSample.sampleValue = sampleValue;\n}\n```\n\n### 运行截图\n\n#### 首页\n\n![](https://p.ipic.vip/tptooo.png)\n\n### 版本内容更新\n\n```\n1.0.0:创建基础数据分析视图（2022.12.12）\n        消息订阅表发送的异步处理 （12.30）\n        开启vuex模块化（1.7）\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcode-jio%2Fdataanalyse","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcode-jio%2Fdataanalyse","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcode-jio%2Fdataanalyse/lists"}