Browse Source

只显示符合角色当前等级得怪物

master
秦汉 4 weeks ago
parent
commit
2cbf0de5a5
  1. 2
      Build_God_Admin_Frontend/Frontend/src/api/monster.ts
  2. 10
      Build_God_Admin_Frontend/Frontend/src/views/admin/MonstersView.vue
  3. 3
      Build_God_Api/Build_God_Api/DB/Monster.cs
  4. 3
      Build_God_Api/Build_God_Api/Dto/MonsterDtos.cs
  5. 5
      Build_God_Api/Build_God_Api/Services/MonsterService.cs
  6. 6
      Build_God_Game/src/api/monster.ts
  7. 4
      Build_God_Game/src/stores/monster.ts
  8. 37
      Build_God_Game/src/views/MonsterListView.vue

2
Build_God_Admin_Frontend/Frontend/src/api/monster.ts

@ -8,7 +8,7 @@ export interface Monster {
attack: number; attack: number;
defense: number; defense: number;
criticalRate: number; criticalRate: number;
level: number; levelId: number;
type: number; type: number;
icon?: string; icon?: string;
rewards?: MonsterReward[]; rewards?: MonsterReward[];

10
Build_God_Admin_Frontend/Frontend/src/views/admin/MonstersView.vue

@ -62,7 +62,7 @@ const formData = ref<Monster>({
attack: 0, attack: 0,
defense: 0, defense: 0,
criticalRate: 0, criticalRate: 0,
level: 1, levelId: 1,
type: 1, type: 1,
icon: '' icon: ''
}) })
@ -116,7 +116,7 @@ const openDialog = (monster?: Monster) => {
attack: 0, attack: 0,
defense: 0, defense: 0,
criticalRate: 0, criticalRate: 0,
level: 1, levelId: 1,
type: 1, type: 1,
icon: '' icon: ''
} }
@ -258,7 +258,7 @@ const saveMonster = async () => {
if (formData.value.name == undefined if (formData.value.name == undefined
|| formData.value.description == undefined || formData.value.description == undefined
|| formData.value.type == undefined || formData.value.type == undefined
|| formData.value.level == undefined || formData.value.levelId == undefined
) { ) {
ElMessage.error('请填写必填项') ElMessage.error('请填写必填项')
return return
@ -404,7 +404,7 @@ const fetchRewardTypes = async () => {
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="名称" prop="name" width="150"></el-table-column> <el-table-column label="名称" prop="name" width="150"></el-table-column>
<el-table-column label="等级" prop="level" width="80"></el-table-column> <el-table-column label="等级" prop="levelId" width="80"></el-table-column>
<el-table-column label="类型"> <el-table-column label="类型">
<template #default="scoped"> <template #default="scoped">
<span class="monster-type" :class="getMonsterTypeClass(scoped.row.type)"> <span class="monster-type" :class="getMonsterTypeClass(scoped.row.type)">
@ -477,7 +477,7 @@ const fetchRewardTypes = async () => {
<el-input v-model="formData.name" placeholder="怪兽名称" clearable /> <el-input v-model="formData.name" placeholder="怪兽名称" clearable />
</el-form-item> </el-form-item>
<el-form-item label="等级"> <el-form-item label="等级">
<el-input-number v-model="formData.level" /> <el-input-number v-model="formData.levelId" />
</el-form-item> </el-form-item>
<el-form-item label="类型"> <el-form-item label="类型">
<el-select v-model="formData.type"> <el-select v-model="formData.type">

3
Build_God_Api/Build_God_Api/DB/Monster.cs

@ -19,7 +19,8 @@ namespace Build_God_Api.DB
public decimal CriticalRate { get; set; } public decimal CriticalRate { get; set; }
public int Level { get; set; } [SugarColumn(DefaultValue = "10")]
public int LevelId { get; set; }
public MonsterType Type { get; set; } public MonsterType Type { get; set; }

3
Build_God_Api/Build_God_Api/Dto/MonsterDtos.cs

@ -5,7 +5,8 @@ namespace Build_God_Api.Dto
public int PageNumber { get; set; } = 1; public int PageNumber { get; set; } = 1;
public int PageSize { get; set; } = 10; public int PageSize { get; set; } = 10;
public int? MonsterType { get; set; } public int? MonsterType { get; set; }
public int? Level { get; set; } public int? LevelId { get; set; }
public int? CharacterId { get; set; }
} }
public class MonsterDto public class MonsterDto

5
Build_God_Api/Build_God_Api/Services/MonsterService.cs

@ -62,9 +62,12 @@ namespace Build_God_Api.Services
public async Task<PagedResult<Monster>> GetAll(SearchMonsterDto dto) public async Task<PagedResult<Monster>> GetAll(SearchMonsterDto dto)
{ {
var characterLevelId = await _db.Queryable<Character>().Where(c => c.Id == dto.CharacterId).Select(c => c.LevelId).FirstAsync();
var query = _db.Queryable<Monster>() var query = _db.Queryable<Monster>()
.WhereIF(dto.MonsterType != null, x => (int)x.Type == dto.MonsterType) .WhereIF(dto.MonsterType != null, x => (int)x.Type == dto.MonsterType)
.WhereIF(dto.Level != null, x => x.Level == dto.Level) .WhereIF(dto.LevelId != null, x => x.LevelId == dto.LevelId)
.WhereIF(dto.CharacterId != null, x => x.LevelId == characterLevelId)
.OrderBy(x => x.CreatedOn, OrderByType.Desc); .OrderBy(x => x.CreatedOn, OrderByType.Desc);
var list = await query.Skip((dto.PageNumber - 1) * dto.PageSize).Take(dto.PageSize).ToListAsync(); var list = await query.Skip((dto.PageNumber - 1) * dto.PageSize).Take(dto.PageSize).ToListAsync();

6
Build_God_Game/src/api/monster.ts

@ -8,7 +8,7 @@ export interface MonsterDto {
attack: number attack: number
defense: number defense: number
criticalRate: number criticalRate: number
level: number levelId: number
type: number type: number
icon?: string icon?: string
rewards?: MonsterRewardDto[] rewards?: MonsterRewardDto[]
@ -42,8 +42,8 @@ export interface BattleRewardDto {
} }
export const monsterApi = { export const monsterApi = {
getMonsterList: (): Promise<MonsterDto[]> => { getMonsterList: (characterId: number): Promise<MonsterDto[]> => {
return http.post('/monster/all', {}).then((res: any) => res.items || res) return http.post('/monster/all', { characterId }).then((res: any) => res.items || res)
}, },
getMonsterById: (id: number): Promise<MonsterDto> => { getMonsterById: (id: number): Promise<MonsterDto> => {

4
Build_God_Game/src/stores/monster.ts

@ -8,10 +8,10 @@ export const useMonsterStore = defineStore('monster', () => {
const lastBattleResult = ref<ChallengeMonsterResponse | null>(null) const lastBattleResult = ref<ChallengeMonsterResponse | null>(null)
const loading = ref(false) const loading = ref(false)
const fetchMonsters = async () => { const fetchMonsters = async (characterId: number) => {
loading.value = true loading.value = true
try { try {
const data = await monsterApi.getMonsterList() const data = await monsterApi.getMonsterList(characterId)
monsters.value = data monsters.value = data
} catch (error) { } catch (error) {
console.error('Failed to fetch monsters:', error) console.error('Failed to fetch monsters:', error)

37
Build_God_Game/src/views/MonsterListView.vue

@ -4,6 +4,7 @@ import { useRouter } from 'vue-router'
import { useMonsterStore } from '@/stores/monster' import { useMonsterStore } from '@/stores/monster'
import { useCharacterStore } from '@/stores/character' import { useCharacterStore } from '@/stores/character'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import Particles from '@/components/Particles/Particles.vue'
import defaultIcon from '@/assets/images/item-default.svg' import defaultIcon from '@/assets/images/item-default.svg'
const router = useRouter() const router = useRouter()
@ -33,13 +34,14 @@ const getMonsterTypeClass = (type: number) => {
return classes[type] || 'type-normal' return classes[type] || 'type-normal'
} }
const playerId = computed(() => characterStore.currentCharacter?.id || 0)
const playerLevel = computed(() => characterStore.currentCharacter?.levelId || 0) const playerLevel = computed(() => characterStore.currentCharacter?.levelId || 0)
const canChallenge = (monster: { level: number }) => { const canChallenge = (monster: { levelId: number }) => {
return playerLevel.value >= monster.level return playerLevel.value >= monster.levelId
} }
const handleChallenge = async (monster: { id: number; level: number }) => { const handleChallenge = async (monster: { id: number; levelId: number }) => {
if (!canChallenge(monster)) { if (!canChallenge(monster)) {
ElMessage.warning('等级不足,无法挑战') ElMessage.warning('等级不足,无法挑战')
return return
@ -52,12 +54,15 @@ const handleGoBack = () => {
} }
onMounted(async () => { onMounted(async () => {
await monsterStore.fetchMonsters() if (playerId.value) {
await monsterStore.fetchMonsters(playerId.value)
}
}) })
</script> </script>
<template> <template>
<div class="monster-list-page"> <div class="monster-list-page">
<Particles :particle-count="50" :particle-colors="['#ffffff', '#aaaaaa']" class="particles-bg" />
<div class="page-container"> <div class="page-container">
<div class="page-header"> <div class="page-header">
<span class="back-btn" @click="handleGoBack"> 返回</span> <span class="back-btn" @click="handleGoBack"> 返回</span>
@ -75,13 +80,9 @@ onMounted(async () => {
</div> </div>
<div v-else class="monster-list"> <div v-else class="monster-list">
<div <div v-for="monster in monsterStore.monsters" :key="monster.id" class="monster-card"
v-for="monster in monsterStore.monsters"
:key="monster.id"
class="monster-card"
:class="[getMonsterTypeClass(monster.type), { disabled: !canChallenge(monster) }]" :class="[getMonsterTypeClass(monster.type), { disabled: !canChallenge(monster) }]"
@click="handleChallenge(monster)" @click="handleChallenge(monster)">
>
<div class="card-inner"> <div class="card-inner">
<div class="card-header"> <div class="card-header">
<div class="card-title-row"> <div class="card-title-row">
@ -90,7 +91,7 @@ onMounted(async () => {
</div> </div>
<div class="card-info"> <div class="card-info">
<span class="card-title">{{ monster.name }}</span> <span class="card-title">{{ monster.name }}</span>
<span class="card-level">等级 {{ monster.level }}</span> <span class="card-level">等级 {{ monster.levelId }}</span>
</div> </div>
</div> </div>
<span class="type-badge" :class="getMonsterTypeClass(monster.type)"> <span class="type-badge" :class="getMonsterTypeClass(monster.type)">
@ -121,11 +122,7 @@ onMounted(async () => {
<div class="card-rewards" v-if="monster.rewards && monster.rewards.length > 0"> <div class="card-rewards" v-if="monster.rewards && monster.rewards.length > 0">
<span class="reward-label">击杀奖励:</span> <span class="reward-label">击杀奖励:</span>
<span <span v-for="reward in monster.rewards" :key="reward.id" class="reward-item">
v-for="reward in monster.rewards"
:key="reward.id"
class="reward-item"
>
{{ reward.itemName }} ×{{ reward.count }} {{ reward.itemName }} ×{{ reward.count }}
</span> </span>
<span v-if="monster.rewards.length > 2" class="reward-more">+{{ monster.rewards.length - 2 }}</span> <span v-if="monster.rewards.length > 2" class="reward-more">+{{ monster.rewards.length - 2 }}</span>
@ -151,6 +148,14 @@ onMounted(async () => {
position: relative; position: relative;
} }
.particles-bg {
position: fixed !important;
top: 0;
left: 0;
width: 100% !important;
height: 100% !important;
}
.page-container { .page-container {
max-width: 480px; max-width: 480px;
margin: 0 auto; margin: 0 auto;

Loading…
Cancel
Save