Browse Source

新增版本信息和更新日志

master
许孟阳 2 weeks ago
parent
commit
5b7332293f
  1. 2
      java/src/main/java/vip/xumy/idle/server/worker/ActivityCountWorker.java
  2. 9
      src/components/dialog.vue
  3. 12
      src/components/drawer.vue
  4. 1
      src/config/i18n/zh.ts
  5. 1
      src/config/icons.ts
  6. 13
      src/tool/random.ts
  7. 5
      src/tool/websocket.ts
  8. 2
      src/views/index.vue
  9. 2
      src/views/menu.vue
  10. 3
      src/views/version/index.ts
  11. 107
      src/views/version/update-log.vue
  12. 48
      src/views/version/version.vue

2
java/src/main/java/vip/xumy/idle/server/worker/ActivityCountWorker.java

@ -23,7 +23,7 @@ public class ActivityCountWorker { @@ -23,7 +23,7 @@ public class ActivityCountWorker {
@Autowired
private IActivityCountMapper countMapper;
@Scheduled(cron = "0 * * * * ?")
// @Scheduled(cron = "0 * * * * ?")
public void aliveCount() {
ActivityCount count = new ActivityCount();
count.setTime(DateUtil.format());

9
src/components/dialog.vue

@ -1,9 +1,9 @@ @@ -1,9 +1,9 @@
<template>
<teleport to="#app">
<div class="dialog" v-show="show" @contextmenu.prevent="console.log('禁用浏览器默认右键功能')">
<div class="title" v-if="showHeader">
<span>{{ title }}</span>
<div class="title" v-if="title">
<i class="close" @click="show = false; emit('close')"></i>
<span>{{ title }}</span>
</div>
<slot />
</div>
@ -97,7 +97,9 @@ onMounted(() => { @@ -97,7 +97,9 @@ onMounted(() => {
color: white;
border-bottom: 1px solid #fff;
.close {
}
.close {
cursor: pointer;
position: absolute;
top: 0.5rem;
@ -107,6 +109,5 @@ onMounted(() => { @@ -107,6 +109,5 @@ onMounted(() => {
height: 2rem;
background-image: url(@/assets/icons/close.png);
background-size: cover;
}
}
</style>

12
src/components/drawer.vue

@ -1,11 +1,10 @@ @@ -1,11 +1,10 @@
<template>
<teleport to="#app">
<div class="drawer" @click="show = false" v-show="show"
@contextmenu.prevent="console.log('禁用浏览器默认右键功能')">
<div class="drawer" @click="show = false" v-show="show" @contextmenu.prevent="console.log('禁用浏览器默认右键功能')">
<div class="content" :style="style" @click.native.stop>
<div class="title" v-if="showHeader">
<span>{{ title }}</span>
<i class="close" @click="show = false; emit('close')"></i>
<span>{{ title }}</span>
</div>
<slot />
</div>
@ -104,9 +103,11 @@ onBeforeUnmount(() => { @@ -104,9 +103,11 @@ onBeforeUnmount(() => {
.content {
position: absolute;
height: 100%;
background: rgba(0, 0, 0, 0.7);
padding: v-bind('prop.padding');
width: v-bind('prop.width');
overflow: auto;
}
}
@ -122,7 +123,9 @@ onBeforeUnmount(() => { @@ -122,7 +123,9 @@ onBeforeUnmount(() => {
color: white;
margin-bottom: 0.5rem;
.close {
}
.close {
cursor: pointer;
position: absolute;
top: 0.5rem;
@ -132,6 +135,5 @@ onBeforeUnmount(() => { @@ -132,6 +135,5 @@ onBeforeUnmount(() => {
height: 2rem;
background-image: url(@/assets/icons/close.png);
background-size: cover;
}
}
</style>

1
src/config/i18n/zh.ts

@ -175,5 +175,6 @@ export default class Zh { @@ -175,5 +175,6 @@ export default class Zh {
illustrated = ['装备图鉴(I)'];
version = ['版本信息和更新日志(V)'];
update = ['版本更新通知', '检测到有服务器有新版本,是否刷新刷新页面更新版本?', '刷新页面', '暂时不管'];
}

1
src/config/icons.ts

@ -9,6 +9,7 @@ export const menu_icons = { @@ -9,6 +9,7 @@ export const menu_icons = {
musicPlay: require('@/assets/icons/menu/music-play.png'),
musicPause: require('@/assets/icons/menu/music-pause.png'),
illustrated: require('@/assets/icons/menu/illustrated.png'),
extras: require('@/assets/icons/menu/extras.png'),
};
export const attr_icon_urls = {

13
src/tool/random.ts

@ -57,3 +57,16 @@ export const randomDungeonDifficulty = () => { @@ -57,3 +57,16 @@ export const randomDungeonDifficulty = () => {
}
return 1;
};
export const uuid = () => {
var s: any = [];
var hexDigits = "0123456789abcdef";
for (var i = 0; i < 36; i++) {
s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
}
s[14] = "4"; // 代表UUID版本
s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); // 时钟序列
s[8] = s[13] = s[18] = s[23] = "-";
var uuid = s.join("");
return uuid;
}

5
src/tool/websocket.ts

@ -1,17 +1,20 @@ @@ -1,17 +1,20 @@
let websocket: WebSocket;
const msgHandlersMap = {};
let lastUrl;
let closeFlag = false;
export const openWebSocket = (url) => {
if (websocket && websocket.readyState === WebSocket.OPEN) {
if (lastUrl == url) {
return;
}
closeFlag = false;
websocket.close();
}
websocket = new WebSocket(url);
lastUrl = url;
websocket.onopen = () => {
console.log('websocket已连接');
closeFlag = true;
};
websocket.onmessage = (msg) => {
const event = JSON.parse(msg.data);
@ -25,9 +28,11 @@ export const openWebSocket = (url) => { @@ -25,9 +28,11 @@ export const openWebSocket = (url) => {
};
websocket.onclose = () => {
console.log('websocket已断开');
if(closeFlag){
setTimeout(() => {
openWebSocket(url);
}, 2000);
}
};
};

2
src/views/index.vue

@ -6,7 +6,6 @@ @@ -6,7 +6,6 @@
<Menu />
</div>
<EquipTips />
<Version />
</template>
<script lang="ts" setup>
@ -16,7 +15,6 @@ import { useI18n } from "vue3-i18n"; @@ -16,7 +15,6 @@ import { useI18n } from "vue3-i18n";
import Message from "./message";
import Menu from "./menu.vue";
import { EquipTips } from "@/components";
import Version from "./version.vue";
const { t } = useI18n();
const { state, commit, dispatch } = useStore();

2
src/views/menu.vue

@ -8,6 +8,7 @@ @@ -8,6 +8,7 @@
<Dungeon />
<Music />
<Illustrated />
<Version/>
</div>
</template>
@ -23,6 +24,7 @@ import SaveGame from "./save-game.vue"; @@ -23,6 +24,7 @@ import SaveGame from "./save-game.vue";
import Archive from "./archive.vue";
import Music from "./music.vue";
import Illustrated from "./illustrated";
import Version from "./version";
const { t } = useI18n();
const { state, commit, dispatch } = useStore();

3
src/views/version/index.ts

@ -0,0 +1,3 @@ @@ -0,0 +1,3 @@
import Version from './version.vue';
export default Version;

107
src/views/version/update-log.vue

@ -0,0 +1,107 @@ @@ -0,0 +1,107 @@
<template>
<div class="version">
<div class="title">当前版本{{ curVersion }}</div>
<div v-for="log in updateLogs">
<div class="title">{{ log.date }}({{ log.version }})</div>
<div v-if="log.desc" class="desc">-{{ log.desc }}</div>
<div v-if="log.adjust" class="sub-title">
<span>功能</span>
<div class="item" v-for="adjust in log.adjust">-{{ adjust }}</div>
</div>
<div v-if="log.tuning" class="sub-title">
<span>优化</span>
<div class="item" v-for="tuning in log.tuning">-{{ tuning }}</div>
</div>
<div v-if="log.bug" class="sub-title">
<span>BUG</span>
<div class="item" v-for="bug in log.bug">-{{ bug }}</div>
</div>
</div>
</div>
</template>
<script lang="ts" setup>
import { useStore } from "vuex";
import { reactive, onMounted, ref } from "vue";
import { useI18n } from "vue3-i18n";
const { t } = useI18n();
const { state, commit, dispatch } = useStore();
const curVersion = '测试版';
const updateLogs: any = [{
date: '2025-04-22', version: '测试版', desc: '新增装备图鉴',
adjust: [
'新增版本信息和更新日志',
],
}, {
date: '2025-04-21', version: '测试版',
adjust: [
'新增装备图鉴',
'商店免费刷新次数增加为10次',
'新增版本更新提醒',
'新增在线人数统计(后台统计,界面不显示)',
],
bug: [
'修复了强化失败后可SL存档恢复强化等级的BUG',
]
}, {
date: '2025-04-20', version: '测试版',
adjust: [
'增加垫刀功能',
],
bug: [
'修复强化12成功率异常问题',
]
}, {
date: '2025-04-18', version: '测试版',
adjust: [
'商店界面添加玩家金币数量显示',
],
tuning: [
'怪物名称前缀添加副本难度',
'调整部分弹框UI显示位置'
],
bug: [
'修复购买了独特装备后刷新商店仍提示确认BUG',
'修复金币过大是显示超长UI错乱BUG'
]
}, {
date: '2025-04-18', version: '测试版初版发布',
adjust: [
'通过副本获得装备与金币',
'副本分简单、普通、困难、极难四个难度,普通难度外副本通关后变为普通难度,普通难度副本通关后回继续挑战副本',
'通用装备分为四个等级:破旧、普通、神器、史诗', '主角默认每秒回血 2%',
'默认暴击伤害 150%',
'完成副本时可能掉落独特级别(5 个词条)的装备(通关后 2.5%掉落率,无尽挑战不会掉落)'
]
}]
onMounted(() => { });
</script>
<style lang="scss" scoped>
.version {
text-align: start;
padding: 1rem 2rem;
.title {
font-size: 1.5rem;
margin-top: 1rem;
font-weight: bold;
}
.sub-title {
font-size: 1.3rem;
font-weight: bold;
padding-left: 1rem;
margin-top: 0.5rem;
margin-bottom: 0.5rem;
}
.item {
font-size: 0.9rem;
font-weight: normal;
}
}
</style>

48
src/views/version.vue → src/views/version/version.vue

@ -1,4 +1,13 @@ @@ -1,4 +1,13 @@
<template>
<Tooltip :infos="[t('version.0')]" width="8rem">
<img class="menu-img" :src="menu_icons.extras" @click="showMenu">
</Tooltip>
<Drawer :title="t('version.0')" v-model="showVersion" width="35%">
<UpdateLog />
</Drawer>
<Dialog :title="t('update.0')" v-model="showUpdate" top="5rem" left="5rem">
<div class="nitofy">
<div class="confirm">{{ t('update.1') }}</div>
@ -13,29 +22,23 @@ @@ -13,29 +22,23 @@
<script lang="ts" setup>
import { useStore } from "vuex";
import { reactive, onMounted, ref } from "vue";
import { onBeforeUnmount, onMounted, ref, computed } from "vue";
import { useI18n } from "vue3-i18n";
import { openWebSocket, registerHandler } from "@/tool/websocket";
import Dialog from "@/components/dialog.vue";
import { Tooltip, Drawer } from "@/components";
import { menu_icons } from "@/config";
import { uuid } from "@/tool";
import UpdateLog from "./update-log.vue";
const { t } = useI18n();
const { state, commit, dispatch } = useStore();
const showUpdate = ref(false);
const showVersion = computed(() => {
return state.curMenu == 'version';
});
const message = ref('');
const uuid = () => {
var s: any = [];
var hexDigits = "0123456789abcdef";
for (var i = 0; i < 36; i++) {
s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
}
s[14] = "4"; // UUID
s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); //
s[8] = s[13] = s[18] = s[23] = "-";
var uuid = s.join("");
return uuid;
}
let url = 'ws://' + window.location.host;
if (process.env.VUE_APP_BASE_URL) {
url = 'ws://' + process.env.VUE_APP_BASE_URL.substring(7);
@ -54,7 +57,22 @@ const onUpdate = (msg) => { @@ -54,7 +57,22 @@ const onUpdate = (msg) => {
}
registerHandler('update', 'version', onUpdate)
onMounted(() => { });
const showMenu = () => {
state.curMenu = showVersion.value ? null : 'version';
}
const keydown = (e) => {
if (e.keyCode == 86 && !e.ctrlKey) {
showMenu();
}
}
onMounted(() => {
document.addEventListener('keydown', keydown);
});
onBeforeUnmount(() => {
document.removeEventListener('keydown', keydown);
})
</script>
<style lang="scss" scoped>
.nitofy {
Loading…
Cancel
Save