Giter Site home page Giter Site logo

yjl9903 / resonance-market Goto Github PK

View Code? Open in Web Editor NEW
47.0 2.0 7.0 504 KB

实时 查看 / 上报 雷索纳斯市场行情

Home Page: https://resonance.breadio.wiki/

License: MIT License

Vue 60.82% TypeScript 30.87% Python 7.45% JavaScript 0.86%
resonance

resonance-market's Introduction

雷索纳斯市场 / resonance-market

resonance-market CI

API 接口

单次上传

https://resonance.breadio.wiki/api/log 这一 endpoint 上, 接受 POST 请求,请求体为 JSON 格式的对象, 包含以下字段:

{
  "name": ProductName,
  "sourceCity": CityName,
  "targetCity": CityName,
  "type": "buy" | "sell",
  "trend": "up" | "same" | "down",
  "price": number,
  "percent": number,
  "uploadedAt": number
}

其中 ProductName 为商品名称, CityName 为城市名称, 可在 全商品表格 中查看

price 为价格(整数), percent 为价格显示百分比(例如 112, 而非 1.2), uploadedAt 为上传 UNIX 时间戳, 单位为毫秒

以下为一个示例

{
  "name": "防弹背心",
  "percent": 110,
  "price": 3225,
  "sourceCity": "铁盟哨站",
  "targetCity": "修格里城",
  "trend": "up",
  "type": "sell",
  "uploadedAt": 1710595468922
}

响应

预期响应为 200 OK, 响应体为

{
  "count": 1
}

批量上报

https://resonance.breadio.wiki/api/logs 这一 endpoint 上, 接受 POST 请求,请求体为 JSON 格式的列表, 列表中每一个对象与单次上传的格式相同:

[
  {
    "name": ProductName,
    "sourceCity": CityName,
    "targetCity": CityName,
    "type": "buy" | "sell",
    "trend": "up" | "same" | "down",
    "price": number,
    "percent": number,
    "uploadedAt": number
  },
  // ...
]

各字段含义与单次上传相同

响应

预期响应为 200 OK, 响应体为

{
  "count": number
}

其中 count 为成功上传的数据条数

本地运行 或 开发测试 / Run locally or Development Test

请确保已安装 gitpnpm

Please make sure git and pnpm are installed.

  1. 对本项目进行 git clone;

    Perform git clone on this project;

    git clone https://github.com/yjl9903/resonance-market.git
    cd resonance-market
  2. 使用 pnpm 安装依赖;

    Use pnpm to install dependencies;

    pnpm install
  3. 准备开发用的 SQLite 本地数据库(位于:./sqlite.db);

    Prepare development SQLite database;

    pnpm db:prepare:dev
  4. 运行开发服务器;

    Run the development server;

    pnpm run dev

会在 http://localhost:3000 启动开发测试。

Start the development server on http://localhost:3000.

构建 / Build

本程序是一个 Nuxt 3 应用程序。所以,需自行部署者,可参考 Nuxt 的部署指南。总而言之,本程序支持借助 Node.js 在服务器上运行,也可以托管到主流的 Serverless 型的网站托管服务。我们自己选择了后者,可以参考 /.github 的相关 GitHub Actions 流程文件。

This program is a Nuxt 3 application. Therefore, those who need to deploy by themselves can refer to Nuxt's deployment guide. All in all, this program supports running on the server with Node.js, and can also be hosted on mainstream Serverless website hosting services. We chose the latter ourselves, you can refer to the related GitHub Actions process files in /.github.

# 构建生产用程序 / Build the application for production
pnpm run build
# 对生产构建进行预览 / Locally preview production build
pnpm run preview

使用协议 / License

LICENSE

本程序附带 MIT License 开源。使用本程序及其源代码时,请遵守 MIT License。

This program comes with the MIT License.

resonance-market's People

Contributors

autofix-ci[bot] avatar night-stars-1 avatar silyasilyf avatar sjfhsjfh avatar velsun3366 avatar ximu-luya avatar yjl9903 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

resonance-market's Issues

支持表格中数据点击快捷上报

现状

  1. 在表格页上报数据需横滑到最后,点击上报按钮,并且还需要选择售卖的城市,操作步骤繁琐(亲身体会)
  2. 上报时,价位百分比难以精确拖动
  3. 上报时,涨跌选择响应区域过小

计划实现功能

  • 支持从点击单元格的Tooltip中,快捷上报数据,自动填充表单
  • 支持上报表单滑动选择价位百分比的同时也支持数值百分比输入、加减1%快捷按钮,以解决难以拖动到准确位置的问题
  • 上报表单中涨跌趋势不再支持“平”选项,并优化样式

关于添加到目标城市的总收益栏

我感觉可以在每个本地城市最下面一行添加一个总收益数,可以显示到另一个城市所有材料正值利润的总和,这样的话就不用一个个加起来对比了,如果很麻烦的话当我没说。
总之谢谢你写的网站。

主分支的新更改导致项目无法在Window上启动了

Describe the bug

以下是报错

[22:00:22]  ERROR  [worker reload] [worker init] Only URLs with a scheme in: file, data, and node are supported by the default ESM loader. On Windows, absolute paths must be valid file:// URLs. Received protocol 'd:'

  at throwIfUnsupportedURLScheme (node:internal/modules/esm/load:239:11)
  at defaultLoad (node:internal/modules/esm/load:130:3)
  at ModuleLoader.load (node:internal/modules/esm/loader:409:13)
  at ModuleLoader.moduleProvider (node:internal/modules/esm/loader:291:56)
  at new ModuleJob (node:internal/modules/esm/module_job:65:26)
  at #createModuleJob (node:internal/modules/esm/loader:303:17)
  at ModuleLoader.getJobFromResolveResult (node:internal/modules/esm/loader:260:34)
  at ModuleLoader.getModuleJob (node:internal/modules/esm/loader:241:17)
  at async ModuleWrap.<anonymous> (node:internal/modules/esm/module_job:85:21)

我去Stack Overflows上找了找问题,似乎出在import()这类语句上。
但奇怪的是,昨天我切出的开发分支没有问题,现在也可以正常运行,所以我确信是新的提交中的内容造成的在Windows环境上的启动报错。

Reproduction

使用Windows启动项目

System Info

Windows 11, Node v20.11.1

Used Package Manager

None

基准价格数据丢失

Describe the bug

工厂、铁盟的金线,不显示基础收购价格
类似的情况在金箔上也有
然后就是淘金的金线是制造品,线的成本我没算明白6300,2线=3箔=1.5沙

Reproduction

No response

System Info

No response

Used Package Manager

None

[数据缺失] 部分交易基准数据缺失

举例:金箔、纯金线材,这俩到铁盟哨站和战备工厂的基准数据都没有。

原因:全商品数据那个csv,数据过时了,导致处理出来的product.json数据缺失。

@yjl9903 解决todo list:

  • 重新从数据源表中导出全商品统计csv(不再使用老黑表格中的csv)
  • 重新处理数据生成product.json(已用索思学会数据生成)
  • 回归测试,之前部分commit中直接修改了csv,重新导出数据之后是否会影响?(不再涉及csv数据)
  • 更新接口 /api/info/products 中的返回数据,以便自动更新数据脚本能够正常上报此次csv更新后的补充数据(接口数据直接来自于product.json)不影响

录入功能优化建议

1、建议出个可以把所在城市买卖价格批量录入的功能,选定城市,下拉选择商品进行录入,横向排列,每列录入一种商品。
2、价位建议增加手动输入数值的选项,另外价格和价位理论上应存在联动关系,只录入一个能自动得出另一个,基础数据可以参考老黑的雷索纳斯手册表格。

新功能:端侧过滤

Clear and concise description of the problem

我看到很多人在提导航和城市之类的
实际上我尝试了一下,更多时候仅仅是排序和导航是不足够的,以我为例,有以下情况
1、人在修城,不知道跑哪个货物(所谓城市快捷导航)
2、打开页面,按单票排序,发现发动机战备工厂的单票利润最多(单票排序)
3、但是我买了G1发现仓库还空,又没有书,所以尝试在剩余的货物中,按战备工厂单票利润倒序(子排序)
4、于是矛盾出现了,选了城市排序就要自己找第2步,选了利润排序就要自己找第3步

Suggested solution

对此提出这样的两个方案
1、新增一个模块,直接写个最优算法,让小伙伴自己输入 出发城市和目的城市(可选),前端算了给他,不显示其它城市

2、改造现在的页面
2.1 设置新增城市过滤,利润排序移动到表格列上(啊,没有看源码,写到这发现页面好像是服务端渲染来的,但是应该能移到前端的)
2.2 同时显示单位和单票利润(OR不嫌麻烦当然也可以按照排序选择显示)
2.3 浏览器缓存排序和筛选配置= =(说真的1和2感觉都没必要,缓存这个,其它的我个人是完全可以自适应的)

Additional context

还要感谢一下product这个接口没有卡验证= =,用来写了个微信通知提醒我买沙金哈哈

[功能建议] 加入ResoData跑商数据接口实现自动化更新

介绍一下自己写的 API 接口:https://github.com/kmou424/resonance-resodata

希望开发者了解一下这个项目,召集大🔥一起参与到完善工作中。目前还有很多东西需要完善,但实现数据更新就只需要补全项目中的映射表文件(在项目中有介绍)。如果有更多改进或功能方面的建议可以加入QQ群,我已经写在项目README中了。
相关后端代码不便开源,dddd

UPDATE:参与完善工作可以直接来填写在线表格,我会定期收集整理提交到GitHub:腾讯文档-商品-站点-ID映射表(https://docs.qq.com/sheet/DSnJpUE5MQUxVZWFD?tab=jyci4r)

[Proposal] 数据同步从轮询切换为 websocket 长连接

Clear and concise description of the problem

半个多月已经 110m 次请求了,20 亿 ms cpu 时间,下个月账单可能要花几十刀。

image

提案切换成 ws 长连接,服务端主动推送数据:期望减少请求数,但是 cpu 时间可能会变多。

其它优化:

  • 配置 cdn:js,css,png,...
  • 限流:/api/product, /api/log, /api/logs, /api/log/...

Suggested solution

No response

Additional context

No response

脚本抓包能直接抓到所有数据

Clear and concise description of the problem

如题,脚本抓包模拟器,能抓到当前城市所有物品买卖数据,不需要别人上传

Suggested solution

No response

Additional context

No response

价格更新日志问题

Clear and concise description of the problem

现状是,用户上报一个价格后立即添加一条新的上报记录,无论新添加的记录是否与上次相同。

有一种case是,淘金的沙金80%,35分钟前上报,有一个人跑淘金去了,发现还是80%于是又上报了一个记录,导致淘金80%这个价格的失效时间往后移了,会造成数据失真。

Suggested solution

我个人感觉可以在log中添加一个字段,例如updateValidAt,表示此条记录在某时刻被确认为生效。失效时间仍然按uploadedAt计算,updateValidAt可以用作额外展示“在xxx之前被确认为有效”。

在用户上传一条新纪录时,判断price或percent与最新一条记录一致,则仅更新最新一条记录的updateValidAt,否则创建一条新纪录,新纪录的updateValidAt为上报时间。

这个只是一个比较小的建议,如果觉得不麻烦的话,可以弄,我来负责前端的展示(展示“在xxx之前被确认为有效”、Tooltip中新增确认有效按钮),麻烦的话优先级就往下调吧。

Additional context

No response

feat: 隐藏表格最后的上报按钮

Clear and concise description of the problem

  1. 可以在每个条目里点击按钮上报
  2. 已经有自动传数据的脚本了

Suggested solution

No response

Additional context

No response

关于自动获取货价

大佬我有8个废了的号可以免费提供作为获取实时价格用途,但是就需要大佬写个爬数据的脚本,看有需要吗?正好一个点驻扎一个账号,就是不知道价格更新不出站会不会更新,

[优化] 设置信息保存在客户端本地

讨论区中提到,希望能够不用每次打开都重新选择利润排序,故可以设计将设置信息保存在本地,加载页面时就不需要再让用户额外操作了

关于改进建议(跑商计数器)

单次运输利润情况:计算方式:特产利润*特产基础数量,便于跑商,不用进货券情况下选择跑商路程,默认选择最后更新的价格(根据上涨和下跌趋势判断大于显示的利润或小于显示的利润)
UI为在目标地后面加上金额显示并辅以上下箭头
可设置收费功能(该功能需独立保存个人数据,需单独建库并使用服务器资源运算,因此需要收取少量费用)为定制个人跑商路线,登入后输入现有的数量加成数量并保存,根据该数量遍历跑商路线,提供最优解环线,考虑最优解方案因素不包括特产之外的商品,提示最优解跑商需至少需求的货车容量,疲劳值加权,最优解下单位疲劳值获利最大(默认不讲价),

自定义商品库存

  • 需要游戏内的图片解包数据
  • 单独做一个库存管理页面
  • 首页展示时,切换利润为市价或自己的库存?

建议修改金箔及金线的基准价格

关于金箔及金线的进货价不应是3000和6300,这个价格不知道是根据什么来设置的,如果完全按照沙金消耗疲劳来生产的话,这两个产品的进货基准价格应该是金箔:1350,金线:2025,希望能校正这两个产品的数据

访问不到url

Describe the bug

家里和公司的电脑都无法访问网址
7 9`08IZ(YLNLD_UV2D(2{O
68OWCF%G{BP3LVF}KU3 DB

Reproduction

No response

System Info

No response

Used Package Manager

None

修复运算符错误导致本地无法进入开发环境的情况

Describe the bug

pr https://github.com/yjl9903/resonance-market/pull/8
条件判断会一直是false

if (import.meta.dev && false) {
    const { database } = await import('~/drizzle/dev/connect');
    return database as any;
  } else {
    console.log(
      // @ts-ignore
      globalThis.__env__,
      // @ts-ignore
      globalThis.__env__?.DATABASE
    );
    return connect((globalThis as any).__env__);
  }

Reproduction

No response

System Info

No response

Used Package Manager

None

代码格式化问题

@yjl9903 话说你用的什么code format插件呀?看.vscode里是Prettier。你看我评论这里的这种span的标签,格式化得太逆天了。prettier的格式化,我个人认为很死板,目标是让代码更美观,但它的效果总是事与愿违。

详情请看(我还没弄明白怎么引用仓库中的代码):4f5c7fb#r140109772

我之前特地手动改了好久,你这个commit又给全弄回来了(笑哭

这种情况对标签开闭的判断影响太大了(也不美观),另外还有其他属性换行问题,所以我一般从来都是自己手动format。另外,我是不用分号党,现在前端主流的论点是在Typescript中已经不再需要分号了。

所以你看是不是可以把这个commit给revert了,还有那个autofix.ci,因为一个分号阻断了部署工作流hhh

关于数据上传

Clear and concise description of the problem

https://resonance.breadio.wiki/api/logs
这个链接还可以用吗

另外看介绍他的包体是这样的

  name: z.string(),
  sourceCity: z.string(),
  targetCity: z.string(),
  type: z.enum(['buy', 'sell']),
  trend: z.enum(['up', 'same', 'down']),
  price: z.number().gt(0),
  percent: z.number().gt(0).lt(200),
  uploadedAt: z.coerce.date()

其中targetCity和percent似乎是冗余信息,可以本地生成

Suggested solution

No response

Additional context

No response

支持货物出售按不同城市利润高低倒排序

Clear and concise description of the problem

在做新页面的时候,我放弃了原本我那一套表格渲染,因为之前我是直接扒的接口,和当前项目中实际存储的数据大相径庭。于是我开始基于现有的表格渲染做优化。

目前页面中并未对各城市的利润之间进行对比,仅提供了单位利润展示,我稍微改变了一下表格结构,使其支持按利润高低对货物的售出城市进行从高到低的排序。

Suggested solution

在首页中表格,每一行货物的可出售城市,将按利润从高到低排序

如果你觉得可以的话,我可以提一个PR修改当前页面中的展示。

当然,我认为可能更好的方式是可能是保留两者,让用户可以自行切换。

Additional context

实际效果如下:

image

价格失效时间应该为1小时

Describe the bug

从老黑雷索纳斯手册里了解到的数据看来,基准价格更新时间是1小时,根据玩家交易量加快,感觉应该用1小时作为失效时间。

Reproduction

No response

System Info

No response

Used Package Manager

None

可能存在的用户异常价格上报

最近有部分用户提到,似乎存在有恶意上报异常价格的用户操作。看是在前端计算并拦截还是在后端拦截。

目前暂时的想法是,单次价格变动不会超过5%,最长1小时变一次。按这个规则根据数据库中最新的一次上报记录的事件,计算合理的价格范围。

或者,既然现在都有自动化数据了,直接暂时先下掉前端的上报功能。或者仅当价格失效时可上报,限制可能存在的异常上报问题

讨论区原文:

还是建议手动上报加点限制,真的感觉有人不怀好意。刚才能源120%的金线不知道谁改成97%,后面看到自动上报是115%才发现价格不对,我屯的这批金线因为这个直接少5% 利润了

Originally posted by @Winterllling in #7 (comment)

缺少海角城的特产商品

Describe the bug

疑似缺乏单晶硅的商品数据。虽然我现在剧情还没推到海角城,但貌似大部分海角城的商品都没有录入?
Screenshot_2024 03 09_13 52 50 787
Screenshot_2024 03 09_13 55 41 422

Reproduction

No response

System Info

No response

Used Package Manager

None

[代码优化建议]

Clear and concise description of the problem

#23

Suggested solution

No response

Additional context

No response

Roadmap

数据

  • 商品基础价格
  • 价格是否失效
  • 价格变动趋势(上涨 / 下跌)
  • 单位利润
  • 单笔利润
  • 重构: 表格数据计算
  • 商品库存管理 #11
  • UI: 表格简洁模式和复杂模式,简洁模式只展示部分必要的数据(比如只显示趋势,利润,时效),复杂模式展示全部的详细数据 #10
  • #13
  • UI: 整体拖动城市面板, 修改顺序
  • #12

上报

  • 互相推算 比例 <-> 价格(精度?)
  • 选填上报时间,默认是当前时间
  • 后端:上报限流

用户

拥有管理员权限的,可以:

  • 锁定数据上报
  • 删除日志中的脏数据
  • Ban 用户 / Ban IP

优化

  • 查询接口缓存
  • Server-send events / WebSocket 实时刷新数据(暂时使用轮询)

其他

超出本项目的 scope,但是希望有朋友可以做:

  • 自动获取数据:按键精灵,抓包等等,抓到的数据使用本项目的接口上报 #2

雷索纳斯市场设定完善

听闻其他开源项目已有 科伦巴商会索思学会,我在想咱们也搞一个设定,把项目设定弄得有点像那么回事儿,感觉很有意思。

下面是我昨天晚上申请 索思学会 的数据使用权限的申请书:

尊敬的思索学会:

我谨代表雷索纳斯市场,向贵会提出申请,请求市场价格情报使用权限。我们希望能够利用您的实时看板数据,以提升我们的服务质量,更好地为各位列车长跑商服务并协助其获利。

雷索纳斯市场是一家致力于为各位列车长跑商提供优质信息展示服务的公司。我们深知市场的变化对商业活动的影响,因此希望能够获得贵会的实时价格情报,以便我们能够更及时地做出调整和决策,提高我们的竞争力和服务水平。

我们相信,通过贵会提供的市场价格情报,我们将能够更准确地为列车长们提供商品价格的波动情况,方便列车长们规划跑商策略,从而更好地满足各地交易所的需求获得更多利润。

我们承诺严格遵守贵会的使用规定,保证我们不会将数据用于任何其他目的,也不会泄露给任何第三方。我们将确保数据的安全性和保密性,以维护贵会的利益和声誉。

我们真诚地希望能够获得贵会的支持和授权,共同促进市场的发展和列车长们的跑商利益。如果贵会能够批准我们的申请,我们将不胜感激,并立即开始合作。

谢谢贵会对我们申请的关注和考虑。

此致

雷索纳斯市场 敬上

这种融入游戏设定的角色扮演,我个人感觉非常好玩,不过我不太会取名,想看看其他人有些什么样的意见。

其实我挺喜欢 科伦巴商会 这个称呼的,不过既然已经被其他项目组占用了,就想想其他的名字。

我能想到的是 7号港市场交易部 作为我们开发团队的设定,项目名称可以添加一个后缀 7号港贸易数据中心 ,或将 雷索纳斯市场 作为后缀。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.