从零开始实现放置游戏(四)——实现后台管理系统(2)数值配置的增删查改

简介:  上一章我们将RMS后台管理系统搭建完毕,本章我们就在这个系统上实现录入游戏配置的功能。目前我们需要配置四项,每个等级的人物属性,每个等级的升级经验,游戏地图,地图中的怪物。下面我们以游戏地图配置为例子,实现对它的增删查改功能。

上一章我们将RMS后台管理系统搭建完毕,本章我们就在这个系统上实现录入游戏配置的功能。目前我们需要配置四项,每个等级的人物属性,每个等级的升级经验,游戏地图,地图中的怪物。下面我们以游戏地图配置为例子,实现对它的增删查改功能。


一、数据访问层的实现


  首先,我们需要定义地图类,这个类在各个模块通用,因此要定义在facade模块中。我们新建一个包com.idlewow.map.model,在其中新建WowMap类,代码如下:


package com.idlewow.map.model;
import com.idlewow.common.model.BaseModel;
import lombok.Data;
import java.io.Serializable;
@Data
public class WowMap extends BaseModel implements Serializable {
    private String name;
    private Integer occupy;
    private String description;
}


 然后,我们在core模块中实现数据访问层的逻辑。新建com.idlewow.map.mapper包,并新建一个接口类WowMapMapper,在接口中定义我们需要用到的一些增删查改方法,代码如下:


package com.idlewow.map.mapper;
import com.idlewow.map.model.WowMap;
import com.idlewow.query.model.WowMapQueryParam;
import java.util.List;
public interface WowMapMapper {
    int insert(WowMap wowMap);
    int batchInsert(List<WowMap> list);
    int update(WowMap levelProp);
    int delete(String id);
    WowMap find(String id);
    List<WowMap> list(WowMapQueryParam queryParam);
    int count(WowMapQueryParam queryParam);
}


Mapper接口类,只定义了方法,具体实现需要我们在该包下新建一个WowMapMapper.xml文件,在这个文件中,通过SQL语句实现接口中的方法:


WowMapMapper.xml


 最后,我们新建com.idlewow.map.manager包,新建一个类WowMapManager,此类通过调用mapper来实现具体业务:


package com.idlewow.map.manager;
import com.idlewow.common.model.PageList;
import com.idlewow.map.mapper.WowMapMapper;
import com.idlewow.map.model.WowMap;
import com.idlewow.query.model.WowMapQueryParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class WowMapManager {
    @Autowired
    WowMapMapper wowMapMapper;
    public void insert(WowMap wowMap) {
        int effected = wowMapMapper.insert(wowMap);
        if (effected == 0) {
            throw new RuntimeException("sql effected 0 rows");
        }
    }
    public void batchInsert(List<WowMap> list) {
        int splitSize = 100;
        int index = 0;
        int total = list.size();
        while (index <= total) {
            int end = index + splitSize;
            if (end > total) {
                end = total;
            }
            List<WowMap> sublist = list.subList(index, end);
            int effected = wowMapMapper.batchInsert(sublist);
            if (effected == 0) {
                throw new RuntimeException("sql effected 0 rows");
            }
            index += splitSize;
        }
    }
    public void update(WowMap t) {
        int effected = wowMapMapper.update(t);
        if (effected == 0) {
            throw new RuntimeException("sql effected 0 rows");
        }
    }
    public void delete(String id) {
        int effected = wowMapMapper.delete(id);
        if (effected == 0) {
            throw new RuntimeException("sql effected 0 rows");
        }
    }
    public WowMap find(String id) {
        WowMap wowMap = wowMapMapper.find(id);
        return wowMap;
    }
    public PageList<WowMap> list(WowMapQueryParam queryParam) {
        PageList<WowMap> pageList = new PageList<WowMap>();
        int count = wowMapMapper.count(queryParam);
        List<WowMap> list = wowMapMapper.list(queryParam);
        pageList.setTotalCount(count);
        pageList.setData(list);
        pageList.setPageParam(queryParam.getPageParam());
        return pageList;
    }
}


 另外,@Componet注解需要依赖spring-context包。还有我们写SQL的xml文件是资源文件,但为了方便查看编辑,我们直接把它放在了代码目录下,所以编译的时候不会被打包,需要在pom中添加配置如下:


  </dependencies>
        ........
        ........
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.1.6.RELEASE</version>
        </dependency>
    </dependencies>
    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                    <include>**/*.properties</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>


 这样,我们的数据访问层逻辑就全部实现了。通过在RMS模块的controller中注入manager,即可实现对底层数据的访问。


二、controller层的实现


  在com.idlewow.rms.controller包中,新建类MapController,在Contoller中,我们初步实现了对数据的增删查改。注意,这里list()方法,返回的字符串“/manage/map/list",代表视图所在路径,根据spring-mvc.xml中配置的视图路由解析规则,即返回/WEB-INF/views/manage/map/list.jsp页面。但如果在该方法上加上注解@ResponseBody,则代表直接返回该字符串,不会去寻找视图。在post方法中,我们就是直接返回数据的json串。代码如下:


 MapController.java


 其中, CommonResult类是我定义的一个通用的结果返回类,PageList和PageParam是分页相关的辅助类,WowMapQueryParam是列表查询的参数类。


  另外,前端列表展示使用了layui的datatable,需要给他返回对应的数据结构。因此,我们定义一个抽象类BaseController,实现对列表数据结构的转换,同时提供查询当前登录用户的方法。其他的Controller如无特殊情况均继承BaseController,代码如下:


LayuiDataTable.java
BaseController.java


写完控制器,前端页面,我们直接套用x-admin的模板。在/WEB-INF/views/manage/map目录下,创建页面:


list.jsp
edit.jsp
add.jsp


 在/js/wow/manage/map目录下,创建相应的js脚本:


 list.js
edit.js
 add.js


三、项目启动


  本次,我们修改了facade和core项目,这两个项目是作为jar包被rms模块引用的,因此必须先将其编译打包,这里我们用第(二)章定义的打包命令直接将整个项目重新打包。以后凡是jar包项目有改动,我们启动web项目前,都先重新打包一遍。


  另外,maven的编译插件可能默认的jdk版本是1.5,我们在pom中配置一下,配成1.8,配置如下:


  <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            …………
            …………
        </plugins>
    </build>


OK,全部搞定之后,我们运行一下,看下效果:


微信图片_20220423172011.gif


小结


  本章,我们初步实现了后台管理系统数据配置的增删查改,但还有很多功能不完善。


  比如,添加、编辑时的数据没有进行校验;单个录入数据太麻烦,想要通过excel批量录入;出现异常时缺乏相应的日志记录,等等。


  这些内容,我们都将在后面的章节中持续完善。

相关文章
|
定位技术
从零开始实现放置游戏(一)——游戏设计
想要做一款成功的游戏,离不开优秀的策划,设计,玩法,美术,等等等等。这其中需要学习的东西太多。然而多想无益,这些东西越学越多,只有先尽快做出成品,然后不断迭代,才能更加深入了了解。因此,这里我们直接参考已有的成功案例,并加入一些我们自己的理解,适当改良。
从零开始实现放置游戏(一)——游戏设计
|
前端开发 JavaScript Java
从零开始实现放置游戏(三)——实现后台管理系统(1)后台管理系统搭建
上一章已经把整体的代码框架搭建完毕。然而整个游戏的功能非常的多,这就要求我们必须思路清晰,把所有功能依次分解开,逐步实现。
从零开始实现放置游戏(三)——实现后台管理系统(1)后台管理系统搭建
|
缓存 NoSQL 数据库
从零开始实现放置游戏(十六)——道具系统(1)道具字典
道具系统是游戏的核心系统之一,常见的业务功能包括 “角色背包”, “道具商店”, “怪物掉落” 等,都依赖道具系统。     在实现这些功能之前,首先要解决的问题就是要定义我们的游戏世界中,到底会有哪些道具, 以及这些道具是如何分类的?     这就是我们这期要做的“道具字典“。首先必须要有一个“字典”来说明这个道具是什么,接下来才能有“背包”系统,来表示角色的背包里有些什么道具,数量有多少。
从零开始实现放置游戏(十六)——道具系统(1)道具字典
|
SQL IDE Java
从零开始实现放置游戏(二)——整体框架搭建
上一篇,我们讲解了游戏的大概背景,知道了要做什么内容。现在已经可以开始搭建游戏的代码框架。
从零开始实现放置游戏(二)——整体框架搭建
|
存储 前端开发 算法
从零开始实现放置游戏(十五)——实现战斗挂机(6)在线打怪练级
 本章初步实现游戏的核心功能——战斗逻辑。   战斗系统牵涉的范围非常广,比如前期人物的属性、怪物的配置等,都是在为战斗做铺垫。   战斗中,人物可以施放魔法、技能,需要技能系统支持。   战斗胜利后,进行经验、掉落结算。又需要背包、装备系统支持。装备系统又需要随机词缀附魔系统。   可以说是本游戏最硬核的系统。   因为目前技能、背包、装备系统都还没有实现。我们先初步设计实现一个简易战斗逻辑。   战斗动作仅包括普通攻击,有可能产生未命中、闪避和暴击。
从零开始实现放置游戏(十五)——实现战斗挂机(6)在线打怪练级
|
XML 前端开发 Java
从零开始实现放置游戏(十)——实现战斗挂机(1)hessian服务端搭建
 前面实现RMS系统时,我们让其直接访问底层数据库。后面我们在idlewow-game模块实现游戏逻辑时,将不再直接访问底层数据,而是通过hessian服务暴露接口给表现层。   本章,我们先把hessian服务搭好,并做一个简单的测试,这里以用户注册接口为例。   先简单介绍下,实现hessian接口,只需要在facade模块暴露接口,然后在core模块实现接口,最后在hessain模块配置好接口路由,将其启动即可。
【面试】基于二叉树层次遍历相关问题的求解
1.遍历二叉树指定层次的所有结点   2.统计指定层的搜索结点个数   3.对二叉树进行层次遍历   4.找到二叉树中每一层的第一个结点或最后一个结点
119 0
【面试】基于二叉树层次遍历相关问题的求解
|
JavaScript 前端开发 Java
从零开始实现放置游戏(九)——实现后台管理系统(7)地图选择控件
前面做了地图怪物的添加,删除,查询等功能。但添加怪物的时候,需要选择怪物所在地图。前几张的源代码中,我忘了把这部分改回去,所以如果想要成功添加,需要自己改一下html界面,手动填写怪物所在地图的ID。然而,我们配置的时候,地图ID并不是固定的,而是数据库自增的。所以这里最好做成一个弹窗,点击后弹出一个地图列表,让我们手动选择怪物所在地图。   本章我们就实现这样一个弹窗控件,实现对地图的选择。后面如果有选择怪物,选择装备等需求,都可照猫画虎。
从零开始实现放置游戏(九)——实现后台管理系统(7)地图选择控件
【小型系统】简单的刷票系统(突破IP限制进行投票)
相信大家平时肯定会收到朋友发来的链接,打开一看,哦,需要投票。投完票后弹出一个页面(恭喜您,您已经投票成功),再次点击的时候发现,啊哈,您的IP(***.***.***.***)已经投过票了,不能重复投票。这时候,我们可能会想,能不能突破ip地址的限制进行刷票呢?有了这样的想法,那就去做吧,下面我将介绍我这个简单的刷票系统,仅供有需求的园友们参考。
496 0
【小型系统】简单的刷票系统(突破IP限制进行投票)
|
IDE Java 应用服务中间件
从零开始实现放置游戏(五)——实现后台管理系统(3)实现切面日志
 上一章,我们初步实现了后台管理系统的增删查改功能。然而还有很多功能不完善。这一章,我们先把系统日志搭建起来,不管是生产问题排查,还是方便开发调试,日志都是必不可少的核心功能。所谓切面日志,比如说,我们想把每个方法的入参都记录日志,那需要在每个方法里都写一行记录参数的语句,非常繁琐。所以需要提取出切面“方法执行前”,“方法执行后”等等,然后在这个切面里进行编程,记录入参的语句只需要写一次。
从零开始实现放置游戏(五)——实现后台管理系统(3)实现切面日志

热门文章

最新文章