videovipFakeMarquee.js 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. /** VIP 点播页虚拟下单跑马灯:文案与时间偏移生成 */
  2. const PREFIX_POOL =
  3. '用花张林李王刘陈杨赵黄周吴徐孙胡朱高郭何罗蒋沈韩喻柏窦彭潘袁邓';
  4. function randInt(min, max) {
  5. return min + Math.floor(Math.random() * (max - min + 1));
  6. }
  7. /** 脱敏片段:4~6 位掩码 + 末位随机数字或字母 */
  8. export function randomMaskedIdTail() {
  9. const maskLen = randInt(4, 6);
  10. const chars =
  11. '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
  12. const suffix = chars[randInt(0, chars.length - 1)];
  13. return '*'.repeat(maskLen) + suffix;
  14. }
  15. /** 时间偏移文案:均在 10 分钟内;30% 秒 / 70% 分钟 */
  16. export function randomTimeOffsetPhrase() {
  17. const roll = Math.random();
  18. if (roll < 0.3) {
  19. const sec = randInt(5, 59);
  20. return `${sec}秒前`;
  21. }
  22. const min = randInt(1, 10);
  23. return `${min}分钟前`;
  24. }
  25. /** 生成一条虚拟下单文案:[一字昵称]+[脱敏ID]+[时间]已下单 */
  26. export function generateFakeOrderLine() {
  27. const payload = generateFakeOrderPayload();
  28. return `${payload.nickname}${payload.maskedId}${payload.timeOffset}${payload.suffix}`;
  29. }
  30. /** 结构化虚拟文案:便于前端分段单独控制样式 */
  31. export function generateFakeOrderPayload() {
  32. return {
  33. type: 'virtual',
  34. nickname: PREFIX_POOL[randInt(0, PREFIX_POOL.length - 1)],
  35. maskedId: randomMaskedIdTail(),
  36. timeOffset: randomTimeOffsetPhrase(),
  37. suffix: '已下单',
  38. };
  39. }
  40. /** 初始化临时下单池(50~100 条,尽量不重复) */
  41. export function buildFakeOrderPool() {
  42. const targetSize = randInt(50, 100);
  43. const pool = [];
  44. const seen = new Set();
  45. let guard = 0;
  46. while (pool.length < targetSize && guard < targetSize * 20) {
  47. guard++;
  48. const line = generateFakeOrderPayload();
  49. const key = `${line.nickname}${line.maskedId}${line.timeOffset}${line.suffix}`;
  50. if (seen.has(key)) continue;
  51. seen.add(key);
  52. pool.push(line);
  53. }
  54. while (pool.length < Math.min(targetSize, 50)) {
  55. pool.push(generateFakeOrderPayload());
  56. }
  57. return pool;
  58. }