feat(editor): 完成英雄配置编辑器全功能开发

本提交新增完整的英雄配置可视化编辑器:
1.  初始化前后端项目结构,配置monorepo工作区
2.  实现后端API服务,支持读取游戏配置、导出hexport.ts文件
3.  开发前端Vue应用,包含完整的英雄增删改、属性配置、技能编辑功能
4.  实现多类型编辑器组件:基础属性、普攻/大招编辑、触发技能、光环、复活、属性加成等
5.  清理冗余的配置元数据文件
This commit is contained in:
panFD
2026-09-02 23:35:40 +08:00
parent 6fed56d3c7
commit a2dc40997c
28 changed files with 4641 additions and 66 deletions

View File

@@ -0,0 +1,72 @@
<template>
<div>
<div v-for="(group, sid) in model" :key="sid" class="skill-block">
<div class="head">
<span>技能 {{ sid }} — {{ skillName(sid) }}</span>
<el-button type="danger" size="small" text @click="removeGroup(sid)">删除组</el-button>
</div>
<div v-for="(entry, idx) in group" :key="idx" style="border-top: 1px dashed #eee; padding-top: 8px; margin-top: 8px">
<div class="form-grid">
<el-form-item label="等级 lv">
<el-input-number v-model="entry.lv" :min="1" :max="20" :controls="false" style="width: 100%" />
</el-form-item>
<el-form-item label="SkillLv">
<el-select v-model="entry.s_lv">
<el-option v-for="n in 5" :key="n" :label="`Lv${n}`" :value="n" />
</el-select>
</el-form-item>
<el-form-item label="t_num (1=每次,3≈33%,4≈25%)">
<el-input-number v-model="entry.t_num" :min="1" :controls="false" style="width: 100%" />
</el-form-item>
<el-form-item label="组名(仅第1档)" v-if="idx === 0">
<el-input v-model="entry.name" />
</el-form-item>
</div>
<el-form-item label="overrides">
<OverrideEditor v-model="entry.overrides" />
</el-form-item>
<el-form-item label="描述">
<el-input v-model="entry.desc" type="textarea" :rows="2" />
</el-form-item>
<el-button type="danger" size="small" text @click="group.splice(idx, 1)">删除档位</el-button>
</div>
<el-button size="small" @click="addEntry(group)" style="margin-top: 6px">+ 添加档位</el-button>
</div>
<div style="display: flex; gap: 8px; align-items: center">
<el-select v-model="newSid" placeholder="选择触发技能" filterable style="width: 240px">
<el-option v-for="s in skillOptions" :key="s.uuid" :label="`${s.uuid} ${s.name}`" :value="s.uuid" />
</el-select>
<el-button size="small" type="primary" @click="addGroup">+ 新增触发组</el-button>
</div>
</div>
</template>
<script setup>
import { ref } from 'vue'
import OverrideEditor from './OverrideEditor.vue'
import { defaultTriggerEntry } from '../constants'
const props = defineProps({
model: { type: Object, required: true }, // TriggerGrouped
skillOptions: { type: Array, default: () => [] },
skillMap: { type: Object, default: () => ({}) },
})
const newSid = ref(null)
function skillName(sid) {
return props.skillMap[sid]?.name || ''
}
function addGroup() {
if (!newSid.value) return
if (!props.model[newSid.value]) props.model[newSid.value] = []
props.model[newSid.value].push(defaultTriggerEntry(6))
newSid.value = null
}
function removeGroup(sid) {
delete props.model[sid]
}
function addEntry(group) {
const lastLv = group.length ? group[group.length - 1].lv : 6
group.push({ lv: lastLv + 3, s_lv: 2, name: '', t_num: 3, overrides: {}, desc: '' })
}
</script>