版本更新
Some checks failed
CI / Test (ubuntu-latest) (push) Has been cancelled
CI / Test (windows-latest) (push) Has been cancelled
CI / Lint (ubuntu-latest) (push) Has been cancelled
CI / Lint (windows-latest) (push) Has been cancelled
CI / Check (ubuntu-latest) (push) Has been cancelled
CI / Check (windows-latest) (push) Has been cancelled
CodeQL / Analyze (${{ matrix.language }}) (none, javascript-typescript) (push) Has been cancelled
Deploy Website on push / Deploy Push Playground Ftp (push) Has been cancelled
Deploy Website on push / Deploy Push Docs Ftp (push) Has been cancelled
Deploy Website on push / Deploy Push Antd Ftp (push) Has been cancelled
Deploy Website on push / Deploy Push Element Ftp (push) Has been cancelled
Deploy Website on push / Deploy Push Naive Ftp (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
CI / CI OK (push) Has been cancelled

This commit is contained in:
hahwu 2026-02-06 15:29:41 +08:00
parent 86037f0933
commit 487753fdc5
13 changed files with 950 additions and 29 deletions

View File

@ -4,15 +4,13 @@
// 访: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "chrome",
"name": "vben admin antd dev",
"request": "launch",
"url": "http://localhost:5666",
"env": { "NODE_ENV": "development" },
"sourceMaps": true,
"webRoot": "${workspaceFolder}"
},
"name": "Launch Edge",
"request": "launch",
"type": "msedge",
"url": "http://localhost:5666",
"webRoot": "${workspaceFolder}",
"runtimeArgs": ["--do-not-de-elevate"]
}
]
}

View File

@ -75,6 +75,7 @@ export interface UserOrder {
Param: string;
CreateTimeStr?: string;
PayTimeStr?: string;
PayStatus?:number;
}
export async function getUserLogAssetApi(data: UserLogAssetParam) {

View File

@ -6,3 +6,6 @@ export interface scripts_params{
export async function copywritingscript(params :scripts_params) {
return requestClient.post('/scripts/copywriting', params, {timeout: 180000});
}
export async function copyonlinescript(params :scripts_params) {
return requestClient.post('/scripts/copyonline', params, {timeout: 1800000});
}

View File

@ -55,6 +55,7 @@ export interface languageType {
en_US: string;
zh_CN: string;
pt_BR: string;
es_LATAM?: string;
url?: string;
}

View File

@ -0,0 +1,792 @@
[
{
"no": 1,
"inGameGlossary": "Merge",
"introduction": "Core gameplay. Combine two items together, they'll turn into a new higher-level item.",
"screenshot": "",
"zhCN": "合成",
"ptBR": "Combinar",
"notes": "",
"esLATAM": "Combinar"
},
{
"no": 2,
"inGameGlossary": "Pet Coin",
"introduction": "Pet Coin is an in-game soft currency earned by completing orders, and it's used to progress the story.",
"screenshot": "",
"zhCN": "宠物币",
"ptBR": "Moeda Pet",
"notes": "",
"esLATAM": "Moneda de mascota"
},
{
"no": 3,
"inGameGlossary": "Time-limited Event",
"introduction": "",
"screenshot": "",
"zhCN": "限时事件",
"ptBR": "Evento por tempo limitado",
"notes": "",
"esLATAM": "Evento de duración limitada"
},
{
"no": 4,
"inGameGlossary": "Meowment",
"introduction": "Meowment or Meowment: Merge & Makeover is the name of this game. It is created by combining Meow and Moment.",
"screenshot": "",
"zhCN": "喵喵喵之家",
"ptBR": "Meowment",
"notes": "",
"esLATAM": "Meowment"
},
{
"no": 5,
"inGameGlossary": "Energy",
"introduction": "Energy is one of the in-game basic resources. Used to produce products.",
"screenshot": "",
"zhCN": "体力",
"ptBR": "Energia",
"notes": "",
"esLATAM": "Energía"
},
{
"no": 6,
"inGameGlossary": "Diamond",
"introduction": "Energy is an in-game soft currency earned by charging or some events.",
"screenshot": "",
"zhCN": "钻石",
"ptBR": "Diamante",
"notes": "",
"esLATAM": "Diamante"
},
{
"no": 7,
"inGameGlossary": "Scissors",
"introduction": "Scissorsis a tool to divide one product to two with lower level.",
"screenshot": "",
"zhCN": "分离器",
"ptBR": "Tesoura",
"notes": "",
"esLATAM": "Tijera"
},
{
"no": 8,
"inGameGlossary": "Magic Wand",
"introduction": "Magic Wand a tool to upgrade one product to higher level.",
"screenshot": "",
"zhCN": "魔术棒",
"ptBR": "Varinha mágica",
"notes": "",
"esLATAM": "Varita mágica"
},
{
"no": 9,
"inGameGlossary": "Piggy Bank",
"introduction": "Piggy Bank is an item that player can save diamond in it by finishing orders.",
"screenshot": "",
"zhCN": "小猪存钱罐",
"ptBR": "Cofrinho",
"notes": "Its in-game image is a piggy bank. Can this image be incorporated into the name? (P.S. If adding it makes the name too long, please keep the original name.)",
"esLATAM": "Alcancía"
},
{
"no": 10,
"inGameGlossary": "Main Scene",
"introduction": "The scene shows entrance to other functions.",
"screenshot": "",
"zhCN": "主场景",
"ptBR": "Cena Principal",
"notes": "",
"esLATAM": "Escena principal"
},
{
"no": 11,
"inGameGlossary": "Merge Scene",
"introduction": "The scene players merging and finishing orders.",
"screenshot": "",
"zhCN": "合成场景",
"ptBR": "Cena de Combinação",
"notes": "",
"esLATAM": "Escena de combinación"
},
{
"no": 12,
"inGameGlossary": "Story Scene/Decorate Scene",
"introduction": "Players spend Pet Coins and materrials to finish decoration and unlock story.",
"screenshot": "",
"zhCN": "装饰场景",
"ptBR": "Cena de História/Decoração",
"notes": "",
"esLATAM": "Escena histórica/Escena de decoración"
},
{
"no": 13,
"inGameGlossary": "Pet Home",
"introduction": "The scene players can pet the kitten.",
"screenshot": "",
"zhCN": "宠物室",
"ptBR": "Casa dos Pets",
"notes": "",
"esLATAM": "Casa de las Mascotas"
},
{
"no": 14,
"inGameGlossary": "Pet Playroom",
"introduction": "The main room in Pet Home where players can play with the kitten.",
"screenshot": "",
"zhCN": "休息室",
"ptBR": "Sala de Brincadeiras",
"notes": "",
"esLATAM": "Sala de Juegos"
},
{
"no": 15,
"inGameGlossary": "Kitchen",
"introduction": "The second room in Pet Playroom where players can buy foods and feeding the kitten.",
"screenshot": "",
"zhCN": "厨房",
"ptBR": "Cozinha",
"notes": "",
"esLATAM": "Cocina"
},
{
"no": 16,
"inGameGlossary": "Bathroom",
"introduction": "The third room in Pet Playroom where players can buy soaps and washing the kitten.",
"screenshot": "",
"zhCN": "浴室",
"ptBR": "Banheiro",
"notes": "",
"esLATAM": "Baño"
},
{
"no": 17,
"inGameGlossary": "Cloakroom",
"introduction": "The fourth room in Pet Playroom where players can decorate the kitten.",
"screenshot": "",
"zhCN": "试衣间",
"ptBR": "Vestiário",
"notes": "",
"esLATAM": "Guardarropa"
},
{
"no": 18,
"inGameGlossary": "Food Shop",
"introduction": "The shop in Kitchen where players can by Food.",
"screenshot": "",
"zhCN": "美食屋",
"ptBR": "Loja de Alimentos",
"notes": "",
"esLATAM": "Tienda de Alimentos"
},
{
"no": 19,
"inGameGlossary": "Soap Shop",
"introduction": "The shop in Bathroom where players can by Soap.",
"screenshot": "",
"zhCN": "香皂铺",
"ptBR": "Loja de Sabonetes",
"notes": "",
"esLATAM": "Tienda de Jabones"
},
{
"no": 20,
"inGameGlossary": "Pet Treasure",
"introduction": "Players can saving Pet Coins into the treasure box by finishing orders after they finished the Pet Home.Once they saved at least 200 Pet Coins and have at least 5 friends, they will be able to play a mini game and get reward.",
"screenshot": "",
"zhCN": "宠物宝藏",
"ptBR": "Tesouro dos Pets",
"notes": "",
"esLATAM": "Tesoro de las Mascotas"
},
{
"no": 21,
"inGameGlossary": "Visit",
"introduction": "Players can go to visit another player every time they petted the kitten 5 times. They will finish a mini game and get reward.",
"screenshot": "",
"zhCN": "拜访",
"ptBR": "Visita",
"notes": "",
"esLATAM": "Visitar"
},
{
"no": 22,
"inGameGlossary": "CAT TEASER",
"introduction": "One of the visiting mini games. Try to catch the kitten and get better reward.",
"screenshot": "",
"zhCN": "愿猫上钩",
"ptBR": "Pega o Gato",
"notes": "The English original refers to a mini-game where players \"try to catch the kitten and get better rewards.\" The current translation \"Brinquedo de Gato\" literally means \"cat toy,\" failing to accurately convey the game's action (teasing or catching).",
"esLATAM": "Captura al Gatito"
},
{
"no": 23,
"inGameGlossary": "CAT TREASURE",
"introduction": "One of the visiting mini games. Try to find three same items and get better reward.",
"screenshot": "",
"zhCN": "猫猫秘宝",
"ptBR": "Tesouro do Gato",
"notes": "",
"esLATAM": "Tesoro del Gato"
},
{
"no": 24,
"inGameGlossary": "HIDE & SEEK",
"introduction": "One of the visiting mini games. Try to find the kitten and get better reward.",
"screenshot": "",
"zhCN": "捉迷藏",
"ptBR": "Esconde-esconde",
"notes": "",
"esLATAM": "Escondidas"
},
{
"no": 25,
"inGameGlossary": "Little Helper",
"introduction": "Let the kitten peoduce products when players are offline.",
"screenshot": "",
"zhCN": "小猫打工",
"ptBR": "Ajuda Felina",
"notes": "The English original means \"let the kitten produce products when players are offline.\" The current translation \"Ajudante\" simply means \"assistant,\" which is too generic and does not highlight the role of the kitten.",
"esLATAM": "Gatito Ayudante"
},
{
"no": 26,
"inGameGlossary": "Flight Device",
"introduction": "A special decoration used when the kitten works.",
"screenshot": "",
"zhCN": "飞行器",
"ptBR": "Aparelho de Voo",
"notes": "",
"esLATAM": "Dispositivo de Vuelo"
},
{
"no": 27,
"inGameGlossary": "Merge",
"introduction": "Drag one product to another same product to make them a higer level product.",
"screenshot": "",
"zhCN": "合成",
"ptBR": "Combinar",
"notes": "",
"esLATAM": "Combinar"
},
{
"no": 28,
"inGameGlossary": "Board",
"introduction": "The area players can play merging.",
"screenshot": "",
"zhCN": "棋盘",
"ptBR": "Tabuleiro",
"notes": "",
"esLATAM": "Tablero"
},
{
"no": 29,
"inGameGlossary": "Order",
"introduction": "Request specific product. Players can submit requested products to finish one order and get reward such as Pet Coin,Cat Food or Materials.",
"screenshot": "",
"zhCN": "订单",
"ptBR": "Pedido",
"notes": "",
"esLATAM": "Pedido"
},
{
"no": 30,
"inGameGlossary": "Producer",
"introduction": "Click the producer will spend energy and get its products. Different producer can provide different products.",
"screenshot": "",
"zhCN": "发射器",
"ptBR": "Produtor",
"notes": "The English original refers to \"click the producer to spend energy and get its products.\" The current translation \"Gerador\" means \"generator,\" which may not be accurate in the game context; the Chinese translation \"发射器\" leans more towards an action-oriented term.",
"esLATAM": "Productor"
},
{
"no": 31,
"inGameGlossary": "Product",
"introduction": "Items gotten from producers. Products can be merged to upgarde.",
"screenshot": "",
"zhCN": "产物",
"ptBR": "Produto",
"notes": "The English original specifically means \"items obtained from producers.\" The current translation \"Item\" is too generic and does not reflect the \"product\" nature of being produced.",
"esLATAM": "Producto"
},
{
"no": 32,
"inGameGlossary": "Bubble",
"introduction": "Randomly appear when merging products. Player can open the bubble by watching ADs or paying diamonds to get an extra product in the bubble.",
"screenshot": "",
"zhCN": "气泡",
"ptBR": "Bolha",
"notes": "",
"esLATAM": "Burbuja"
},
{
"no": 33,
"inGameGlossary": "Material",
"introduction": "Can be gotten by finishing orders. Some decorating steps will need to spend materials.",
"screenshot": "",
"zhCN": "材料",
"ptBR": "Material",
"notes": "",
"esLATAM": "Material"
},
{
"no": 34,
"inGameGlossary": "Shop",
"introduction": "Where players can buy items by cash or diamond.",
"screenshot": "",
"zhCN": "商店",
"ptBR": "Loja",
"notes": "",
"esLATAM": "Tienda"
},
{
"no": 35,
"inGameGlossary": "Weekly Gift",
"introduction": "Every time players login for the first time that day they will get a gift which loops every 7 days.",
"screenshot": "",
"zhCN": "七日签到礼",
"ptBR": "Presente semanal",
"notes": "",
"esLATAM": "Regalo Semanal"
},
{
"no": 36,
"inGameGlossary": "Endless Gift",
"introduction": "One special pack that play can buy it endless times everyday.",
"screenshot": "",
"zhCN": "无尽礼包",
"ptBR": "Presente infinito",
"notes": "",
"esLATAM": "Regalo Infinito"
},
{
"no": 37,
"inGameGlossary": "Storage",
"introduction": "Where players can save items from board.",
"screenshot": "",
"zhCN": "仓库",
"ptBR": "Inventário",
"notes": "",
"esLATAM": "Almacén"
},
{
"no": 38,
"inGameGlossary": "Hall of Honor",
"introduction": "A special page in Storage that saving retired producers.",
"screenshot": "",
"zhCN": "荣誉室",
"ptBR": "Salão de Honra",
"notes": "The English original means \"Hall of Honor.\" The current translation \"Hall da Fama\" means \"Hall of Fame,\" which slightly deviates from the concept of \"honor\" (\"Fama\" emphasizes fame rather than honor).",
"esLATAM": "Salón de Honor"
},
{
"no": 39,
"inGameGlossary": "Level",
"introduction": "Players' level. It needs EXP gotten from finishing decorations and petting the kitten,",
"screenshot": "",
"zhCN": "等级",
"ptBR": "Nível",
"notes": "",
"esLATAM": "Nivel\nNv. (Abbreviation)"
},
{
"no": 40,
"inGameGlossary": "Bonding Map",
"introduction": "The player's level list.",
"screenshot": "",
"zhCN": "心路历程",
"ptBR": "Caminho do Coração",
"notes": "The English original refers to \"the player's level list.\" The current translation \"Mapa de Afinidade\" means \"Affinity Map,\" which does not match the concept of a level list; the Chinese translation \"心路历程\" also emphasizes growth.",
"esLATAM": "Mapa de Vínculo"
},
{
"no": 41,
"inGameGlossary": "Level Up Reward",
"introduction": "The items players can get aftering leveling up.",
"screenshot": "",
"zhCN": "升级奖励",
"ptBR": "Recompensa de Nível",
"notes": "",
"esLATAM": "Recompensa de Nivel"
},
{
"no": 42,
"inGameGlossary": "Collection",
"introduction": "Where players can check what items they have collected in game.",
"screenshot": "",
"zhCN": "图鉴",
"ptBR": "Coleção",
"notes": "",
"esLATAM": "Colección"
},
{
"no": 43,
"inGameGlossary": "Daily Task",
"introduction": "Refresh every day for players to finish and get reward.",
"screenshot": "",
"zhCN": "日常任务",
"ptBR": "Tarefa diária",
"notes": "",
"esLATAM": "Tarea Diaria"
},
{
"no": 44,
"inGameGlossary": "Booster Mode",
"introduction": "Activate Booster Mode allows players to spend more energy every click and get higher level products directly.",
"screenshot": "",
"zhCN": "多倍生产",
"ptBR": "Modo Turbo",
"notes": "",
"esLATAM": "Modo Turbo"
},
{
"no": 45,
"inGameGlossary": "Friend",
"introduction": "One page that makes players able to play with other players.",
"screenshot": "",
"zhCN": "好友",
"ptBR": "Amigo",
"notes": "",
"esLATAM": "Amigo"
},
{
"no": 46,
"inGameGlossary": "Ranking",
"introduction": "A page in Friend for players to check the ranking.",
"screenshot": "",
"zhCN": "排行榜",
"ptBR": "Classificação",
"notes": "",
"esLATAM": "Clasificación"
},
{
"no": 47,
"inGameGlossary": "Timeline",
"introduction": "A page in Friend for players to check the recent events with friends.",
"screenshot": "",
"zhCN": "时间线",
"ptBR": "Linha do Tempo",
"notes": "",
"esLATAM": "Línea de Tiempo"
},
{
"no": 48,
"inGameGlossary": "Player ID",
"introduction": "Player's ID can be checked in menu.",
"screenshot": "",
"zhCN": "玩家ID",
"ptBR": "ID do Jogador",
"notes": "",
"esLATAM": "ID de Jugador"
},
{
"no": 49,
"inGameGlossary": "Device ID",
"introduction": "Player's Device ID can be checked in the below of Setting page.",
"screenshot": "",
"zhCN": "设备ID",
"ptBR": "ID do Dispositivo",
"notes": "",
"esLATAM": "ID de Dispositivo"
},
{
"no": 50,
"inGameGlossary": "Friend Code",
"introduction": "Player's Friend Code can be checked on Add Friend page.",
"screenshot": "",
"zhCN": "好友码",
"ptBR": "Código de Amigo",
"notes": "",
"esLATAM": "Clave de Amigo"
},
{
"no": 51,
"inGameGlossary": "Nickname",
"introduction": "Can be setted by players.",
"screenshot": "",
"zhCN": "玩家昵称",
"ptBR": "Apelido",
"notes": "",
"esLATAM": "Apodo"
},
{
"no": 52,
"inGameGlossary": "Avatar",
"introduction": "Can be setted by players.",
"screenshot": "",
"zhCN": "头像",
"ptBR": "Avatar",
"notes": "",
"esLATAM": "Avatar"
},
{
"no": 53,
"inGameGlossary": "Frame",
"introduction": "Can be setted by players.",
"screenshot": "",
"zhCN": "头像框",
"ptBR": "Moldura",
"notes": "",
"esLATAM": "Marco"
},
{
"no": 54,
"inGameGlossary": "Emoji",
"introduction": "Can be sent in particular events by players.",
"screenshot": "",
"zhCN": "表情",
"ptBR": "Emoji",
"notes": "",
"esLATAM": "Emoji"
},
{
"no": 55,
"inGameGlossary": "Card",
"introduction": "A collection item in game.",
"screenshot": "",
"zhCN": "卡片",
"ptBR": "Carta",
"notes": "",
"esLATAM": "Carta"
},
{
"no": 56,
"inGameGlossary": "Card Pack",
"introduction": "Where players can get random cards.",
"screenshot": "",
"zhCN": "卡包",
"ptBR": "Pacote de Cartas",
"notes": "",
"esLATAM": "Paquete de Cartas"
},
{
"no": 57,
"inGameGlossary": "Album",
"introduction": "One group of cards. Players can get reward when they collected all cards in one Album.",
"screenshot": "",
"zhCN": "相册",
"ptBR": "Álbum",
"notes": "",
"esLATAM": "Álbum"
},
{
"no": 58,
"inGameGlossary": "Card Rarity",
"introduction": "The star mark on the card.",
"screenshot": "",
"zhCN": "卡片稀有度",
"ptBR": "Raridade da Carta",
"notes": "",
"esLATAM": "Rareza de la Carta"
},
{
"no": 59,
"inGameGlossary": "Star",
"introduction": "Gotten when players get a repeated card,",
"screenshot": "",
"zhCN": "星星",
"ptBR": "Estrela",
"notes": "",
"esLATAM": "Estrella"
},
{
"no": 60,
"inGameGlossary": "Star Exchange",
"introduction": "Stars can be uesd to exchange Card Packs.",
"screenshot": "",
"zhCN": "星星兑换",
"ptBR": "Troca de Estrelas",
"notes": "",
"esLATAM": "Cambio de Estrellas"
},
{
"no": 61,
"inGameGlossary": "Master Card",
"introduction": "Can be exchanged into any no-Golden Card.",
"screenshot": "",
"zhCN": "银色万能卡",
"ptBR": "Carta Mestre",
"notes": "",
"esLATAM": "Carta Maestra"
},
{
"no": 62,
"inGameGlossary": "Golden Master Card",
"introduction": "Can be exchanged into any Card.",
"screenshot": "",
"zhCN": "金色万能卡",
"ptBR": "Carta Mestre Dourada",
"notes": "",
"esLATAM": "Carta Maestra Dorada"
},
{
"no": 63,
"inGameGlossary": "Kitten's Gift",
"introduction": "Every time players finish the progress bar the kitten will send a random Time-limited Event.",
"screenshot": "",
"zhCN": "小猫赠礼",
"ptBR": "Presente do Gatinho",
"notes": "",
"esLATAM": "Regalo del Gatito"
},
{
"no": 64,
"inGameGlossary": "Chest Rain",
"introduction": "One of the Time-limited Events. Players can get a chest after finishing an order.",
"screenshot": "",
"zhCN": "宝箱雨",
"ptBR": "Chuva de Baús",
"notes": "",
"esLATAM": "Lluvia de Baúles"
},
{
"no": 65,
"inGameGlossary": "Turbo Boost",
"introduction": "One of the Time-limited Events. Enable players to use higher level Booster Mode.",
"screenshot": "",
"zhCN": "超级加倍",
"ptBR": "Impulso Turbo",
"notes": "",
"esLATAM": "Impulso Turbo"
},
{
"no": 66,
"inGameGlossary": "Bonus Coins",
"introduction": "One of the Time-limited Events. Players can get extra Pet Coins after finishing an order.",
"screenshot": "",
"zhCN": "猫币猎手",
"ptBR": "Moedas Bônus",
"notes": "",
"esLATAM": "Bonificación de Monedas"
},
{
"no": 67,
"inGameGlossary": "Super Producer",
"introduction": "One of the Time-limited Events. Producer can produce unlimited times.",
"screenshot": "",
"zhCN": "超级发射器",
"ptBR": "Super Produtor",
"notes": "",
"esLATAM": "Super Productor"
},
{
"no": 68,
"inGameGlossary": "Power Order",
"introduction": "One of the Time-limited Events. Players can get an extra order rewarding Card Pack.",
"screenshot": "",
"zhCN": "超级订单",
"ptBR": "Super Pedido",
"notes": "The English original refers to \"an extra order rewarding Card Pack.\" The current translation \"Pedido de Poder\" means \"Power Order,\" which is too abstract and does not convey the \"super\" or \"enhanced\" meaning.",
"esLATAM": "Super Pedido"
},
{
"no": 69,
"inGameGlossary": "Scene Rush",
"introduction": "One of the Time-limited Events. Players can get a Wheel of Fortune after finishing a scene,",
"screenshot": "",
"zhCN": "场景冲刺",
"ptBR": "Corrida de Cenas",
"notes": "",
"esLATAM": "Escena Frenética"
},
{
"no": 70,
"inGameGlossary": "Pack Boost",
"introduction": "One of the Time-limited Events. Players can get extra cards when opening Card Packs.",
"screenshot": "",
"zhCN": "卡包加成",
"ptBR": "Chuva de Cartas",
"notes": "The English original means \"players can get extra cards when opening Card Packs.\" The current translation \"Pacote de Impulso\" means \"Boost Pack,\" which might be misunderstood as a type of card pack rather than a boost effect.",
"esLATAM": "Potenciador de Paquetes"
},
{
"no": 71,
"inGameGlossary": "Meow Mania",
"introduction": "One of the Time-limited Events. Players can get extra reward by finishing a mini game.",
"screenshot": "",
"zhCN": "连击快手",
"ptBR": "Meow Mania",
"notes": "",
"esLATAM": "Miaumanía"
},
{
"no": 72,
"inGameGlossary": "Card-copy Cat",
"introduction": "One of the Time-limited Events. Players can get extra card reward when visiting other players.",
"screenshot": "",
"zhCN": "宠物怪盗",
"ptBR": "Gato Copiador",
"notes": "",
"esLATAM": "Gato Copiador"
},
{
"no": 73,
"inGameGlossary": "Golden Card Trade",
"introduction": "One of the Time-limited Events. Players can trade Specific golden cards.",
"screenshot": "",
"zhCN": "金卡交换",
"ptBR": "Troca de Cartas Douradas",
"notes": "The English original means \"players can trade specific golden cards.\" The current translation \"Troca de Ouro\" means \"Gold Trade,\" which could be misinterpreted as trading gold currency rather than golden cards.",
"esLATAM": "Cambio de Cartas Doradas"
},
{
"no": 74,
"inGameGlossary": "Mass Merge",
"introduction": "One of the Time-limited Events. Players can merge all same products together.",
"screenshot": "",
"zhCN": "一网打尽",
"ptBR": "Combinação em Massa",
"notes": "",
"esLATAM": "Combinación Masiva"
},
{
"no": 75,
"inGameGlossary": "Maneki",
"introduction": "One of the Time-limited Events. Players can get more and more extra Pet Coins by finishing orders quickly.",
"screenshot": "",
"zhCN": "招财猫",
"ptBR": "Maneki",
"notes": "",
"esLATAM": "Maneki"
},
{
"no": 76,
"inGameGlossary": "Lucky Cat",
"introduction": "One of the Time-limited Events. Chances for players to get free Bubble when merging.",
"screenshot": "",
"zhCN": "好运猫",
"ptBR": "Gato da Sorte",
"notes": "",
"esLATAM": "Gato de la Suerte"
},
{
"no": 77,
"inGameGlossary": "Recycling Day",
"introduction": "One of the Time-limited Events. Players can sell products at a higher price.",
"screenshot": "",
"zhCN": "回收日",
"ptBR": "Dia da Reciclagem",
"notes": "",
"esLATAM": "Día de Reciclaje"
},
{
"no": 78,
"inGameGlossary": "Wheel of Fortune",
"introduction": "Get a random reward from the Wheel.",
"screenshot": "",
"zhCN": "奖励转盘",
"ptBR": "Roda da Fortuna",
"notes": "",
"esLATAM": "Rueda de la Fortuna"
},
{
"no": 79,
"inGameGlossary": "Pets' Championship",
"introduction": "An event opening everyday. Players can get score by finishing orders to get event reward and higher ranking,",
"screenshot": "",
"zhCN": "锦标赛",
"ptBR": "Campeonato de Pets",
"notes": "",
"esLATAM": "Campeonato de Mascotas"
}
]

View File

@ -10,6 +10,7 @@ import { ref,onMounted } from 'vue';
import addServerModal from './addServer.vue';
import dayjs from 'dayjs';
import { $t } from '#/locales'
const appId = ref<number>(1);
const [BaseForm, BaseFormApi] = useVbenForm({
//
commonConfig: {
@ -33,6 +34,7 @@ const [BaseForm, BaseFormApi] = useVbenForm({
const serverResponse = await getServerListApi({AppId:value});
ServerList.value = Array.isArray(serverResponse) ? serverResponse : [];
const app = appList.value.find((item) => item.AppId === value);
appId.value = value;
if (!app) return;
const updateTime = dayjs((app.Update ?? 0) * 1000).format('YYYY-MM-DD HH:mm:ss')
BaseFormApi.setFieldValue("update", updateTime)
@ -122,6 +124,10 @@ onMounted(async() => {
]);
const serverResponse = await getServerListApi({AppId:app.AppId});
ServerList.value = Array.isArray(serverResponse) ? serverResponse : [];
setInterval(async () => {
const serverResponse = await getServerListApi({AppId:appId.value});
ServerList.value = Array.isArray(serverResponse) ? serverResponse : [];
}, 60000);
}catch(e){
appList.value = serverList;
//console.log(e);

View File

@ -1,6 +1,6 @@
<script lang="ts" setup>
import type { VxeGridProps, VxeGridListeners } from '#/adapter/vxe-table';
import { Button, notification,Image } from 'ant-design-vue';
import { Button, notification,Image, Popover } from 'ant-design-vue';
import { Page } from '@vben/common-ui';
import { getLanguageList, saveLanguageList, deleteLanguageItem } from '#/api/core/statistics';
import { useVbenVxeGrid } from '#/adapter/vxe-table';
@ -28,12 +28,14 @@ let en_USVisible: boolean = true;
let chineseVisible: boolean = true;
let pt_BRVisible: boolean = true;
let actionVisible: boolean = true;
let es_LATAMVisible: boolean = true;
let total: languageType = {
Id: 1,
key: '',
en_US: '',
zh_CN: '',
pt_BR: '',
es_LATAM: '',
};
const startDate = dayjs().subtract(7, 'day').startOf('day');
const endDate = dayjs().endOf('day');
@ -50,6 +52,7 @@ const formOptions: VbenFormProps = {
{ label: 'en_US', value: 'en_US' },
{ label: 'zh_CN', value: 'zh_CN' },
{ label: 'pt_BR', value: 'pt_BR' },
{ label: 'es_LATAM', value: 'es_LATAM' },
],
placeholder: 'key',
showSearch: true,
@ -119,6 +122,8 @@ const gridOptions: VxeGridProps<languageType> = {
title: 'zh_CN', filters: [{ data: "" }], filterRender: { name: "input" }, visible: chineseVisible
},
{ editRender: { name: 'input' }, field: 'pt_BR', title: 'pt_BR', filters: [{ data: "" }], filterRender: { name: "input" }, visible: pt_BRVisible },
{ editRender: { name: 'input' }, field: 'es_LATAM', title: 'es_LATAM', filters: [{ data: "" }], filterRender: { name: "input" }, visible: es_LATAMVisible, slots: { default: 'es_LATAM' } },
{ slots: { default: 'action' }, title: $t('page.common.action'), width: 150 },
],
scrollY: {
@ -227,6 +232,10 @@ const gridOptions: VxeGridProps<languageType> = {
const s = item?.pt_BR || '';
return sum + (s.trim() === '' ? 1 : 0);
}, 0);
const emptyEsLATAMCount = (response.data || []).reduce((sum: number, item: languageType) => {
const s = item?.es_LATAM || '';
return sum + (s.trim() === '' ? 1 : 0);
}, 0);
const emptyZhCnCount = (response.data || []).reduce((sum: number, item: languageType) => {
const s = item?.zh_CN || '';
return sum + (s.trim() === '' ? 1 : 0);
@ -262,6 +271,8 @@ const gridOptions: VxeGridProps<languageType> = {
title: 'zh_CN', filters: [{ data: "" }], filterRender: { name: "input" }, visible: chineseVisible
},
{ editRender: { name: 'input' }, field: 'pt_BR', title: 'pt_BR', filters: [{ data: "" }], filterRender: { name: "input" }, visible: pt_BRVisible },
{ editRender: { name: 'input' }, field: 'es_LATAM', title: 'es_LATAM', filters: [{ data: "" }], filterRender: { name: "input" }, visible: es_LATAMVisible },
{ slots: { default: 'action' }, title: $t('page.common.action'), width: 150, visible: actionVisible },
],
pagerConfig: {
@ -275,6 +286,7 @@ const gridOptions: VxeGridProps<languageType> = {
en_US: total.en_US,
zh_CN: emptyZhCnCount + '/' + length + ' empty cells',
pt_BR: emptyPtBRCount + '/' + length + ' empty cells',
es_LATAM: emptyEsLATAMCount + '/' + length + ' empty cells',
}],
});
return {
@ -289,6 +301,10 @@ const gridOptions: VxeGridProps<languageType> = {
isArrow: true,
isTab: true,
isEnter: true,
isEdit: true,
},
mouseConfig: {
selected: true,
},
footerData: [{
Id: '字符数统计',
@ -340,6 +356,7 @@ const gridEvents: VxeGridListeners<languageType> = {
} else {
newData.push({ ...(row as languageType) });
}
saveAll();
} else {
console.log('Cell not changed:', prop);
}
@ -366,7 +383,7 @@ function saveAll() {
saveLanguageList(op).then((response) => {
console.log('Save response:', response);
op = [];
GridApi.reload();
// GridApi.reload();
});
}

View File

@ -3,9 +3,11 @@ import { ref } from 'vue';
import { useVbenDrawer } from '@vben/common-ui';
import { VbenIcon } from '../../../../../../packages/@core/ui-kit/shadcn-ui';
import { Timeline } from 'ant-design-vue';
import { copywritingscript } from '#/api/core/scripts';
import { copywritingscript,copyonlinescript } from '#/api/core/scripts';
import type { scriptsRecord } from '#/model/type';
const data = ref();
const timestamp = ref(0);
const title = ref('');
const end = ref(false);
const pendinglabel = ref('脚本运行中...');
const stepList = ref<scriptsRecord[]>([]);
@ -14,21 +16,40 @@ const [Drawer, drawerApi] = useVbenDrawer({
drawerApi.close();
},
onConfirm() {
console.log('onConfirm');
drawerApi.close();
},
onOpenChange(open: boolean) {
if (open) {
data.value = drawerApi.getData<Record<string, any>>();
stepList.value = [];
end.value = false;
title.value = `脚本执行详情 - ${data.value.scriptName || ''}`;
drawerApi.setState({
title: title.value,
});
pendinglabel.value = '脚本运行中...';
// 使 nextTick
//
timestamp.value = Date.now();
const timer = setInterval(() => {
const elapsed = Math.floor((Date.now() - timestamp.value) / 1000);
drawerApi.setState({
title: `${title.value} - 运行时间: ${elapsed}`,
});
if (end.value) {
clearInterval(timer);
}
}, 1000);
setTimeout(() => {
switch (data.value.scriptInstanceId) {
case 1:
console.log('running script copywriting');
runningStep(copywritingscript, stepList.value.length);
break;
case 2:
console.log('running script copyonline');
runningStep(copyonlinescript, stepList.value.length);
break;
}
}, 0);
}

View File

@ -23,6 +23,21 @@ function startScript(id: number) {
drawerApi.open();
}
function startScript2(id: number) {
notification.success({
message: '脚本已启动',
description: 'US环境同步自动化脚本已成功启动正在运行中。',
});
drawerApi.setState({
title: 'US环境同步自动化脚本',
});
drawerApi.setData({
scriptLaber: 'US环境同步自动化脚本',
scriptInstanceId: id,
});
drawerApi.open();
}
</script>
<template>
@ -69,6 +84,27 @@ function startScript(id: number) {
</div>
</div>
</div>
<div class="p-5">
<div class="card-box p-4 py-6 flex justify-between h-12">
<div class="flex flex-col justify-center md:mt-0 lg:w-1/12">
<h1 class="text-md font-semibold md:text-ml text-center">
<span>US环境同步自动化脚本</span>
</h1>
</div>
<div class="flex flex-col justify-center md:mt-0 lg:w-3/12">
<h1 class="text-md font-semibold md:text-ml text-center">
<Tag color="green">DB</Tag><Tag>环境</Tag><Tag>QA</Tag>
</h1>
</div>
<div class="flex flex-col justify-center md:mt-0 lg:w-1/12">
<h1 class="text-md font-semibold md:text-ml text-center">
<Button type="primary" @click="startScript2(2)">Start</Button>
</h1>
</div>
</div>
</div>
</Page>

View File

@ -10,6 +10,14 @@ import type { VbenFormProps } from '#/adapter/form';
import { ItemData } from '#/store/item';
import { eventModal } from '#/component';
import dayjs from 'dayjs';
// props
const props = defineProps<{
uid: number;
serverId?: string;
app?: number;
}>();
const state = inject('globalState', globalState);
const [Modal, modalApi] = useVbenModal({
connectedComponent: eventModal,
@ -138,12 +146,12 @@ const gridEvents: VxeGridListeners<RowType> = {
};
const gridOptions: VxeGridProps<RowType> = {
columns: [
{ field: 'Uid', title: 'Uid', align: 'center' },
// { field: 'Uid', title: 'Uid', align: 'center' },
{ field: 'change_type', title: '变化类型', formatter: ({ cellValue }) => formatType(cellValue), align: 'center' },
{ field: 'change_num', title: '变化数值', align: 'center' },
{ field: 'change_num', title: '变化数值', align: 'center', width: 120 },
{ field: 'change_after', title: '变化后数值', align: 'center' },
{ field: 'change_reason', title: '原因', align: 'center' },
{ field: 'item_id', title: '道具名称', formatter: ({ cellValue }) => formatItemName(cellValue), align: 'center' },
{ field: 'item_id', title: '道具id', align: 'center' },
{ field: 'timestamp', title: '时间', formatter: ({ cellValue }) => new Date(cellValue * 1000).toLocaleString(), align: 'center' },
],
stripe: true,
@ -180,6 +188,7 @@ const gridOptions: VxeGridProps<RowType> = {
console.log(formValues.StartTime.unix());
const r = await getUserLogAssetApi({
Id: uid,
AppId: props.app,
Event: formValues.Event,
StartTime: formValues.StartTime.unix(),
EndTime: formValues.EndTime.unix(),

View File

@ -5,11 +5,11 @@ import { useVbenVxeGrid } from '#/adapter/vxe-table';
import { inject } from 'vue';
import type { VxeGridListeners } from 'vxe-table';
import { globalState } from '#/store/globalState';
import { $t } from '#/locales';
import type { VxeGridProps } from '#/adapter/vxe-table';
import type { VbenFormProps } from '#/adapter/form';
import { Page, useVbenModal } from '@vben/common-ui';
import { assetModal } from '#/component';
import { Tag } from 'ant-design-vue';
import dayjs from 'dayjs';
const state = inject('globalState', globalState);
const [Modal, modalApi] = useVbenModal({
@ -17,6 +17,12 @@ const [Modal, modalApi] = useVbenModal({
class: 'width:1800px;',
});
// props
const props = defineProps<{
uid: number;
serverId?: string;
app?: number;
}>();
const startDate = dayjs().startOf('day');
const endDate = dayjs().endOf('day');
interface RowType {
@ -92,11 +98,11 @@ const gridEvents: VxeGridListeners<RowType> = {
};
const gridOptions: VxeGridProps<RowType> = {
columns: [
{ field: 'Uid', title: 'Uid' },
{ field: 'Event', title: '事件类型', formatter: ({ cellValue }) => $t('page.log.event.' + `${cellValue}`) || cellValue },
{ field: 'Label', title: 'Label' },
// { field: 'Uid', title: 'Uid' },
{ field: 'Label', title: '事件类型',width:120 },
{ field: 'Event', title: '事件类型',width:120, slots: { default: 'event' } },
{ field: 'Param', title: '参数' },
{ field: 'Timestamp', title: '时间', formatter: ({ cellValue }) => new Date(cellValue * 1000).toLocaleString() },
{ field: 'Timestamp', title: '时间',width:180, formatter: ({ cellValue }) => new Date(cellValue * 1000).toLocaleString() },
],
stripe: true,
height: '800px',
@ -142,6 +148,7 @@ const gridOptions: VxeGridProps<RowType> = {
}
// 使 unix
return await getUserlogEventApi({
AppId: props.app,
Id: Uid,
Event: formValues.Event,
StartTime: startTimeUnix,
@ -159,13 +166,33 @@ const gridOptions: VxeGridProps<RowType> = {
};
const [Grid] = useVbenVxeGrid({ formOptions, gridOptions, gridEvents });
function getTag(event:string){
switch(event){
case 'func_exec_error':
return ["error"];
default:
return ['success'];
}
}
function getTagColor(tag:string){
switch(tag){
case 'error':
return "red";
default:
return "green";
}
}
</script>
<template>
<div>
<Page class="h-[800px]">
<Grid />
<Grid>
<template #event="{ row }">
<Tag v-for="(label, index) in getTag(row.Event)" :key="index" :color="getTagColor(label)">{{ label }}</Tag>
</template>
</Grid>
</Page>
<Modal class="w-[800px]"> </Modal>
</div>

View File

@ -12,6 +12,7 @@ import { getUserlogOrderApi } from '#/api/core/log';
import { getAppListApi } from '#/api/core/server';
import { globalState } from '#/store/globalState';
import { rechargeData } from '#/store/recharge';
import { Tag } from 'ant-design-vue';
const state = inject('globalState', globalState);
@ -61,7 +62,7 @@ const gridOptions: VxeGridProps<RowType> = {
return rechargeData[cellValue] || cellValue;
},
},
{ field: 'CreateTimeStr', title: '创建时间' },
{ field: 'PayStatus', title: '支付状态', slots: { default: 'status' } },
{ field: 'PayTimeStr', title: '支付时间' },
{
field: 'PayType',
@ -101,13 +102,14 @@ const gridOptions: VxeGridProps<RowType> = {
const Uid = Number.parseInt(formValues.Uid, 10);
state.uid = Uid;
state.Event = formValues.Event;
return await getUserlogOrderApi({
const r = await getUserlogOrderApi({
Id: Uid,
Event: formValues.Event,
CurrentPage: page.currentPage,
PageSize: page.pageSize,
AppId: 1,
});
return r
},
},
},
@ -145,6 +147,14 @@ onMounted(async () => {
<template>
<Page auto-content-height class="h-[800px]">
<Grid />
<Grid>
<template #status="{ row }">
<Tag color="gray" v-if="row.PayStatus === 0">未支付</Tag>
<Tag color="blue" v-else-if="row.PayStatus === 1">已支付</Tag>
<Tag color="red" v-else-if="row.PayStatus === 2">支付失败</Tag>
<Tag color="green" v-else-if="row.PayStatus === 3">已发货</Tag>
<Tag v-else>未知态{{row.ProductId}}</Tag>
</template>
</Grid>
</Page>
</template>

View File

@ -7,7 +7,6 @@ import { useVbenModal, useVbenForm, WorkbenchTrends } from '@vben/common-ui';
import { message, Card, Tabs } from 'ant-design-vue';
import { getUserlogInfoApi } from '#/api/core/log';
import { userGmApi, userBanApi } from '#/api/core/user';
import { calendar } from '#/component/index';
import type { dataType } from '#/component/index';
// cal-heatmap
import 'cal-heatmap/cal-heatmap.css';
@ -269,6 +268,7 @@ const [Modal, modalApi] = useVbenModal({
const r = await getUserlogInfoApi({
Id: data.value.uid,
Node: data.value.Node,
AppId: data.value.AppId,
});
trendItems = [];
let id = 0;
@ -513,13 +513,13 @@ watch(
</Tabs.TabPane>
<Tabs.TabPane key="2" tab="操作日志">
<eventTable :uid="info.Uid" :serverId="data?.Node" />
<eventTable :uid="info.Uid" :serverId="data?.Node" :app="data?.AppId" />
</Tabs.TabPane>
<Tabs.TabPane key="3" tab="资产日志">
<assetTable :uid="info.Uid" :serverId="data?.Node" />
<assetTable :uid="info.Uid" :serverId="data?.Node" :app="data?.AppId" />
</Tabs.TabPane>
<Tabs.TabPane key="4" tab="订单日志">
<orderTable :uid="info.Uid" :serverId="data?.Node" />
<orderTable :uid="info.Uid" :serverId="data?.Node" :app="data?.AppId" />
</Tabs.TabPane>
</Tabs>