需求分析

整个游戏的核心玩法是放置挂机,打怪练级是核心功能,先实现一个最小可运行的DEMO,那么可以先实现玩家和怪物挂机战斗这部分。像装备、道具、掉落、随机词缀、组队等功能都可以放到后面做。想实现挂机战斗,那么要有一个战斗的逻辑模块,根据输入的战斗信息,计算出战斗结果,输出给客户端播放。整体逻辑大致如下图:

这里,我们需要对游戏战斗相关的属性有个规划。我们暂时规定一级属性有力量、敏捷、智力、耐力,二级属性有生命值、护甲、攻击强度、法术强度、命中率、躲避率、暴击率。一级属性对二级属性提供加成,二级属性参与战斗逻辑计算,装备加成既可以加一级属性也可以加二级属性。人物每个等级自身四围的属性数值是固定的。人物的战斗属性由自身属性+装备加成+得出。怪物的属性比较简单,只有等级、生命值、护甲、伤害值,直接参与计算。

以上,我们需要配置人物每个等级的属性,怪物的属性。另外,人物和怪物都是在地图上移动的,因此还需要配置地图信息。要配置这些信息,我们就需要先搭建后台管理系统,通过excel,把我们的数值配置导入系统。下面,我们就开始搭建我们的rms模块。

RMS系统搭建

1.引入依赖

首先,有一些常用的工具类,插件类,几乎每个模块都要用到的,我们在父级节点idlewow的pom中引入:

注意:lombok是个IDE的插件依赖,需要有一步在Idea中安装此插件的操作。插件的安装请查看此篇:Idea插件lombok的安装和使用

  1. <dependencies>
  2. <!-- 工具类 begin -->
  3. <dependency>
  4. <groupId>org.apache.commons</groupId>
  5. <artifactId>commons-lang3</artifactId>
  6. <version>3.8.1</version>
  7. </dependency>
  8. <!-- 工具类 end   -->
  9. <!-- json序列化 begin -->
  10. <dependency>
  11. <groupId>com.alibaba</groupId>
  12. <artifactId>fastjson</artifactId>
  13. <version>1.2.57</version>
  14. </dependency>
  15. <dependency>
  16. <groupId>com.fasterxml.jackson.core</groupId>
  17. <artifactId>jackson-databind</artifactId>
  18. <version>2.9.8</version>
  19. </dependency>
  20. <dependency>
  21. <groupId>com.fasterxml.jackson.core</groupId>
  22. <artifactId>jackson-core</artifactId>
  23. <version>2.9.8</version>
  24. </dependency>
  25. <!-- json序列化 end -->
  26. <!-- lombok -->
  27. <dependency>
  28. <groupId>org.projectlombok</groupId>
  29. <artifactId>lombok</artifactId>
  30. <version>1.18.6</version>
  31. <scope>provided</scope>
  32. </dependency>
  33. </dependencies>

复制代码

idlewow-core模块需要访问数据库,添加相关依赖:

  1. <dependency>
  2. <groupId>org.mybatis</groupId>
  3. <artifactId>mybatis</artifactId>
  4. <version>3.5.1</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>mysql</groupId>
  8. <artifactId>mysql-connector-java</artifactId>
  9. <version>8.0.15</version>
  10. </dependency>

复制代码

在idlewow-rms中,我们使用springmvc+mybatis,需要添加的引用较多:

  1. <!-- spring相关 -->
  2. <dependency>
  3. <groupId>org.springframework</groupId>
  4. <artifactId>spring-context</artifactId>
  5. <version>5.1.6.RELEASE</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.springframework</groupId>
  9. <artifactId>spring-context-support</artifactId>
  10. <version>5.1.6.RELEASE</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>org.springframework</groupId>
  14. <artifactId>spring-core</artifactId>
  15. <version>5.1.6.RELEASE</version>
  16. </dependency>
  17. <dependency>
  18. <groupId>org.springframework</groupId>
  19. <artifactId>spring-web</artifactId>
  20. <version>5.1.6.RELEASE</version>
  21. </dependency>
  22. <dependency>
  23. <groupId>org.springframework</groupId>
  24. <artifactId>spring-webmvc</artifactId>
  25. <version>5.1.6.RELEASE</version>
  26. </dependency>
  27. <dependency>
  28. <groupId>org.springframework</groupId>
  29. <artifactId>spring-aop</artifactId>
  30. <version>5.1.6.RELEASE</version>
  31. </dependency>
  32. <dependency>
  33. <groupId>org.springframework</groupId>
  34. <artifactId>spring-jdbc</artifactId>
  35. <version>5.1.6.RELEASE</version>
  36. </dependency>
  37. <dependency>
  38. <groupId>org.springframework</groupId>
  39. <artifactId>spring-tx</artifactId>
  40. <version>5.1.6.RELEASE</version>
  41. </dependency>
  42. <!-- servlet相关 -->
  43. <dependency>
  44. <groupId>javax.servlet</groupId>
  45. <artifactId>javax.servlet-api</artifactId>
  46. <version>4.0.1</version>
  47. <scope>provided</scope>
  48. </dependency>
  49. <dependency>
  50. <groupId>javax.servlet</groupId>
  51. <artifactId>jstl</artifactId>
  52. <version>1.2</version>
  53. <scope>provided</scope>
  54. </dependency>
  55. <!-- AOP相关 -->
  56. <dependency>
  57. <groupId>org.aspectj</groupId>
  58. <artifactId>aspectjweaver</artifactId>
  59. <version>1.9.3</version>
  60. </dependency>
  61. <!-- 数据源相关 -->
  62. <dependency>
  63. <groupId>org.apache.commons</groupId>
  64. <artifactId>commons-dbcp2</artifactId>
  65. <version>2.6.0</version>
  66. </dependency>
  67. <dependency>
  68. <groupId>org.mybatis</groupId>
  69. <artifactId>mybatis-spring</artifactId>
  70. <version>2.0.1</version>
  71. </dependency>

复制代码

2.添加相关配置

已经引入了依赖,还有很多配置文件需要配。

首先,我们来配置一下最基本的配置,也就是web容器的配置:web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app version="2.5"
  3. xmlns="http://java.sun.com/xml/ns/javaee"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  6. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  7. <display-name>IdleWow RMS</display-name>
  8. <context-param>
  9. <param-name>contextConfigLocation</param-name>
  10. <param-value>classpath:spring/applicationContext.xml</param-value>
  11. </context-param>
  12. <listener>
  13. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  14. </listener>
  15. <!-- 字符转码过滤器 -->
  16. <filter>
  17. <filter-name>encodingFilter</filter-name>
  18. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  19. <init-param>
  20. <param-name>encoding</param-name>
  21. <param-value>UTF-8</param-value>
  22. </init-param>
  23. <init-param>
  24. <param-name>forceEncoding</param-name>
  25. <param-value>true</param-value>
  26. </init-param>
  27. </filter>
  28. <filter-mapping>
  29. <filter-name>encodingFilter</filter-name>
  30. <url-pattern>/*</url-pattern>
  31. </filter-mapping>
  32. <!-- SpringMVC -->
  33. <servlet>
  34. <servlet-name>springmvc</servlet-name>
  35. <servlet-class>org.springframework.web.servlet.DispatcherServlet
  36. </servlet-class>
  37. <init-param>
  38. <param-name>contextConfigLocation</param-name>
  39. <param-value>classpath:spring/spring-mvc.xml</param-value>
  40. </init-param>
  41. <load-on-startup>1</load-on-startup>
  42. </servlet>
  43. <servlet-mapping>
  44. <servlet-name>springmvc</servlet-name>
  45. <url-pattern>/</url-pattern>
  46. </servlet-mapping>
  47. <session-config>
  48. <session-timeout>30</session-timeout>
  49. </session-config>
  50. </web-app>

复制代码

在web.xml里主要配置了一个spring的上下文listener,用来在启动时,自动扫描注入;一个spring的servlet,用来实现mvc路由;还有一个字符编码的filter,用来把请求数据转换成utf-8编码,防止出现乱码。

现在我们针对web.xml中Spring的上下文listener和servlet添加单独的配置。在resources目录下新建spring文件夹,并新建applicationContext.xml文件,applicationContext.xml主要配置spring需要扫描的包,并引入了数据源的配置文件。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:aop="http://www.springframework.org/schema/aop"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  7. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
  8. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
  9. <!-- 自动扫描bean -->
  10. <context:component-scan base-package="com.idlewow">
  11. <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
  12. </context:component-scan>
  13. <aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
  14. <!-- 扫描属性配置 -->
  15. <bean id="propertyConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  16. <property name="locations">
  17. <list>
  18. <value>classpath:/properties/jdbc.properties</value>
  19. </list>
  20. </property>
  21. </bean>
  22. <!-- 异步线程调度 -->
  23. <bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
  24. <!-- 核心线程数 -->
  25. <property name="corePoolSize" value="5"/>
  26. <!-- 最大线程数 -->
  27. <property name="maxPoolSize" value="50"/>
  28. <!-- 队列最大长度 -->
  29. <property name="queueCapacity" value="1000"/>
  30. <!-- 线程池维护线程所允许的空闲时间,默认为60s -->
  31. <property name="keepAliveSeconds" value="60"/>
  32. </bean>
  33. <!-- 数据源配置 -->
  34. <import resource="classpath:spring/dataSource.xml"/>
  35. </beans>

复制代码

在/resources/spring路径下,新建spring-mvc.xml文件,主要配置mvc的路由规则,并启动spring的mvc注解。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  6. http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
  7. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
  8. <context:component-scan base-package="com.idlewow.**.controller" />
  9. <!-- 启动mvc注解支持 -->
  10. <mvc:annotation-driven />
  11. <!-- 将无法mapping到Controller的path交给default servlet handler处理 -->
  12. <mvc:default-servlet-handler/>
  13. <!-- 视图解析 -->
  14. <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  15. <property name="order" value="2"></property>
  16. <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
  17. <property name="prefix" value="/WEB-INF/views/"></property>
  18. <property name="suffix" value=".jsp"></property>
  19. </bean>
  20. </beans>

复制代码

在/resources/spring路径下,新建dataSource.xml文件,主要配置数据库连接,连接池,启动spring的事务注解。并指定mybatis需要扫描的包。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:tx="http://www.springframework.org/schema/tx"
  5. xsi:schemaLocation="
  6. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  7. http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
  8. <!-- 数据源基本配置 -->
  9. <bean id="basicDataSource"  class="org.apache.commons.dbcp2.BasicDataSource"  destroy-method="close" abstract="true">
  10. <!-- 连接池启动时的连接数 -->
  11. <property name="initialSize" value="10" />
  12. <!-- 连接池的最大值 -->
  13. <property name="maxTotal" value="256" />
  14. <!--最大空闲值 -->
  15. <property name="maxIdle" value="20" />
  16. <!--最小空闲值 -->
  17. <property name="minIdle" value="10" />
  18. <property name="validationQuery" value="select 1"/>
  19. <property name="testOnBorrow" value="false"/>
  20. <property name="testWhileIdle" value="true"/>
  21. <!-- 运行判断连接超时任务的时间间隔 -->
  22. <property name="timeBetweenEvictionRunsMillis" value="1200000"/>
  23. <!-- 链接超时时间 -->
  24. <property name="minEvictableIdleTimeMillis" value="1800000"/>
  25. </bean>
  26. <!-- 写库连接 -->
  27. <bean id="writeConn" parent="basicDataSource">
  28. <property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />
  29. <property name="url" value="${writeConn.jdbcUrl}" />
  30. <property name="username" value="${writeConn.user}" />
  31. <property name="password" value="${writeConn.password}" />
  32. </bean>
  33. <!-- 读库连接 -->
  34. <bean id="readConn" parent="basicDataSource">
  35. <property name="driverClassName" value="com.mysql.jdbc.Driver" />
  36. <property name="url" value="${readConn.jdbcUrl}" />
  37. <property name="username" value="${readConn.user}" />
  38. <property name="password" value="${readConn.password}" />
  39. </bean>
  40. <!-- 配置spring的PlatformTransactionManager -->
  41. <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  42. <property name="dataSource" ref="writeConn" />
  43. </bean>
  44. <!--创建一个sql会话工厂bean,指定数据源 -->
  45. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  46. <!-- 指定数据源 -->
  47. <property name="dataSource" ref="writeConn" />
  48. </bean>
  49. <!--自动扫描映射接口 -->
  50. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  51. <!-- 指定sql会话工厂,在上面配置过的 -->
  52. <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
  53. <!-- 指定基础包,即自动扫描com.lyosaki.dao这个包以及它的子包下的所有映射接口类 -->
  54. <property name="basePackage" value="com.idlewow.**.mapper"></property>
  55. </bean>
  56. <!-- 开启事务控制的注解支持 -->
  57. <tx:annotation-driven />
  58. </beans>

复制代码

在resources目录下,新建properties文件夹,并新建文件jdbc.properties。具体定义了数据库连接的账号、密码等,供dataSource.xml使用。

  1. writeConn.jdbcUrl=jdbc:mysql://localhost:3306/idlewow?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC
  2. writeConn.user=admin
  3. writeConn.password=123456
  4. readConn.jdbcUrl=jdbc:mysql://localhost:3306/idlewow?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&flag=readonly&serverTimezone=UTC
  5. readConn.user=admin
  6. readConn.password=123456

复制代码

3.最简页面搭建

配置完毕,我们先搭建一个最简的管理员登陆页面和登陆后的首页,让整个项目能够跑起来。

这里我们直接使用一套网上开源免费的基于layui实现的前端框架xadmin,下载地址:http://x.xuebingsi.com/。下载后,把css,js,fonts,images,lib目录都拷贝到webapp目录下即可。

然后,手游转让我们写一个简单的登陆验证。这里,我规定数据库建表时,所有表均需包含id,create_user,update_user,create_time,update_time,is_delete,version几个字段。在facade模块中,新建一个包com.idlewow.common.model,并新建一个抽象类BaseModel,后面凡是数据库的实体类,均需继承此类。

  1. package com.idlewow.common.model;
  2. import lombok.Data;
  3. import java.io.Serializable;
  4. import java.util.Date;
  5. @Data
  6. public abstract class BaseModel implements Serializable {
  7. /**
  8. * 主键ID
  9. */
  10. private String id;
  11. /**
  12. * 创建人
  13. */
  14. private String createUser;
  15. /**
  16. * 修改人
  17. */
  18. private String updateUser;
  19. /**
  20. * 创建时间
  21. */
  22. private Date createTime;
  23. /**
  24. * 修改时间
  25. */
  26. private Date updateTime;
  27. /**
  28. * 是否删除 0-否 1-是
  29. */
  30. private Integer isDelete;
  31. /**
  32. * 版本号
  33. */
  34. private Integer version;
  35. }

复制代码

另外,再facade模块中,新建一个包com.idlewow.admin.model,并添加管理员类SysAdmin,

  1. package com.idlewow.admin.model;
  2. import com.idlewow.common.model.BaseModel;
  3. import lombok.Data;
  4. @Data
  5. public class SysAdmin extends BaseModel {
  6. private String username;
  7. private String password;
  8. }

复制代码

在rms模块中,新建包com.idlewow.rms.controller,并新建一个登陆认证的controller,在这里,我们直接写死账号admin可登陆,并自动添加密码123456,方便开发,

  1. 1 package com.idlewow.rms.controller;
  2. 2
  3. 3 import com.alibaba.fastjson.JSONObject;
  4. 4 import com.idlewow.admin.model.SysAdmin;
  5. 5 import org.apache.commons.lang3.StringUtils;
  6. 6 import org.springframework.beans.factory.annotation.Autowired;
  7. 7 import org.springframework.stereotype.Controller;
  8. 8 import org.springframework.web.bind.annotation.RequestMapping;
  9. 9 import org.springframework.web.bind.annotation.ResponseBody;
  10. 10
  11. 11 import javax.servlet.http.HttpSession;
  12. 12
  13. 13 @Controller
  14. 14 @RequestMapping("/authorize")
  15. 15 public class AuthorizeController {
  16. 16     @Autowired
  17. 17     HttpSession httpSession;
  18. 18
  19. 19     @ResponseBody
  20. 20     @RequestMapping("/login")
  21. 21     public Object longin(SysAdmin sysAdmin) {
  22. 22         String userName = sysAdmin.getUsername();
  23. 23         String password = sysAdmin.getPassword();
  24. 24         if (userName.equalsIgnoreCase("admin")) {
  25. 25             userName = "admin";
  26. 26             password = "123456";
  27. 27         }
  28. 28
  29. 29         JSONObject jsonObject = new JSONObject();
  30. 30         //验证用户名和密码不能为空
  31. 31         if (StringUtils.isBlank(userName) || StringUtils.isBlank(password)) {
  32. 32             jsonObject.put("status", false);
  33. 33             jsonObject.put("msg", "用户名和密码不能为空");
  34. 34             return jsonObject.toJSONString();
  35. 35         }
  36. 36
  37. 37         httpSession.setAttribute("loginuser", sysAdmin);
  38. 38         jsonObject.put("status", true);
  39. 39         jsonObject.put("msg", "登录成功");
  40. 40         return jsonObject;
  41. 41     }
  42. 42 }

复制代码

在webapp目录下,添加login.html登陆页面,这里直接使用xadmin提供的模板,对js稍作改动,

  1. 1 <!doctype html>
  2. 2 <html class="x-admin-sm">
  3. 3 <head>
  4. 4     <meta charset="UTF-8">
  5. 5     <title>后台登录</title>
  6. 6     <meta name="renderer" content="webkit|ie-comp|ie-stand">
  7. 7     <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  8. 8     <meta name="viewport"
  9. 9           content="width=device-width,user-scalable=yes, minimum-scale=0.4, initial-scale=0.8,target-densitydpi=low-dpi"/>
  10. 10     <meta http-equiv="Cache-Control" content="no-siteapp"/>
  11. 11     <link rel="stylesheet" href="/css/font.css">
  12. 12     <link rel="stylesheet" href="/css/login.css">
  13. 13     <link rel="stylesheet" href="/css/xadmin.css">
  14. 14     <script type="text/javascript" src="/lib/layui/layui.js"></script>
  15. 15     <script type="text/javascript" src="/js/jquery.min.js"></script>
  16. 16 </head>
  17. 17 <body class="login-bg">
  18. 18
  19. 19 <div class="login layui-anim layui-anim-up">
  20. 20     <div class="message">idlewow管理登录</div>
  21. 21     <div id="darkbannerwrap"></div>
  22. 22
  23. 23     <form id="login-form" method="post" class="layui-form">
  24. 24         <input name="username" placeholder="用户名" type="text" lay-verify="required" class="layui-input"
  25. 25                value="admin">
  26. 26         <hr class="hr15">
  27. 27         <input name="password" lay-verify="required" placeholder="密码" type="password" class="layui-input">
  28. 28         <hr class="hr15">
  29. 29         <input value="登录" lay-submit lay-filter="login" style="width:100%;" type="submit" id="loginBtn">
  30. 30         <hr class="hr20">
  31. 31     </form>
  32. 32 </div>
  33. 33
  34. 34 <script>
  35. 35     $(function () {
  36. 36         layui.use(['form', 'jquery'], function () {
  37. 37             var form = layui.form;
  38. 38             form.on('submit(login)', function (data) {
  39. 39                 $('#loginBtn').attr('disabled', "true");
  40. 40                 $.post('/authorize/login', $('#login-form').serialize(), function (rsp) {
  41. 41                     if (rsp.status) {
  42. 42                         window.location.href = "index.jsp";
  43. 43                     } else {
  44. 44                         alert(rsp.msg);
  45. 45                         $('#loginBtn').removeAttr("disabled");
  46. 46                     }
  47. 47                 }, 'JSON').fail(function () {
  48. 48                     alert('系统错误!');
  49. 49                     $('#loginBtn').removeAttr("disabled");
  50. 50                 });
  51. 51             });
  52. 52         });
  53. 53     })
  54. 54 </script>
  55. 55 </body>
  56. 56 </html>

复制代码

在webapp目录下,添加authorize.jsp,用来验证身份,后面所有需要登陆的页面,均需引用此页面,

  1. 1 <%@ page import="com.idlewow.admin.model.SysAdmin" %>
  2. 2 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  3. 3 <%
  4. 4     if (session.getAttribute("loginuser") == null) {
  5. 5         response.sendRedirect("login.html");
  6. 6         return;
  7. 7     }
  8. 8
  9. 9     SysAdmin sysAdmin = (SysAdmin)session.getAttribute("loginuser");
  10. 10     String path = request.getContextPath();
  11. 11     String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
  12. 12 %>

复制代码

在webapp目录下,添加index.jsp,作为登陆成功后的跳转首页,这个页面也直接使用xadmin提供的模板,

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <%@ include data-original="/authorize.jsp" %>
  3. <!DOCTYPE html>
  4. <html class="x-admin-sm">
  5. <head>
  6. <meta charset="UTF-8">
  7. <title>idlewow</title>
  8. <meta name="renderer" content="webkit|ie-comp|ie-stand">
  9. <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  10. <meta name="viewport"
  11. content="width=device-width,user-scalable=yes, minimum-scale=0.4, initial-scale=0.8,target-densitydpi=low-dpi"/>
  12. <meta http-equiv="Cache-Control" content="no-siteapp"/>
  13. <link rel="stylesheet" href="<%=path%>/css/font.css">
  14. <link rel="stylesheet" href="<%=path%>/css/xadmin.css">
  15. <script type="text/javascript" src="<%=path%>/lib/layui/layui.js"></script>
  16. <script type="text/javascript" src="<%=path%>/js/xadmin.js"></script>
  17. </head>
  18. <body class="index">
  19. <!-- 顶部开始 -->
  20. <div class="container">
  21. <div class="logo">
  22. <a href="./index.jsp">Idle WOW</a></div>
  23. <div class="left_open">
  24. <a><i title="展开左侧栏" class="iconfont"></i></a>
  25. </div>
  26. <ul class="layui-nav left fast-add" lay-filter="">
  27. <li class="layui-nav-item">
  28. <a href="javascript:;">+新增</a>
  29. <dl class="layui-nav-child">
  30. <!-- 二级菜单 -->
  31. <dd>
  32. <a οnclick="xadmin.open('最大化','http://www.baidu.com','','',true)">
  33. <i class="iconfont"></i>弹出最大化</a></dd>
  34. <dd>
  35. <a οnclick="xadmin.open('弹出自动宽高','http://www.baidu.com')">
  36. <i class="iconfont"></i>弹出自动宽高</a></dd>
  37. <dd>
  38. <a οnclick="xadmin.open('弹出指定宽高','http://www.baidu.com',500,300)">
  39. <i class="iconfont"></i>弹出指定宽高</a></dd>
  40. <dd>
  41. <a οnclick="xadmin.add_tab('在tab打开','member-list.html')">
  42. <i class="iconfont"></i>在tab打开</a></dd>
  43. <dd>
  44. <a οnclick="xadmin.add_tab('在tab打开刷新','member-del.html',true)">
  45. <i class="iconfont"></i>在tab打开刷新</a></dd>
  46. </dl>
  47. </li>
  48. </ul>
  49. <ul class="layui-nav right" lay-filter="">
  50. <li class="layui-nav-item">
  51. <a href="javascript:;">admin</a>
  52. <dl class="layui-nav-child">
  53. <!-- 二级菜单 -->
  54. <dd>
  55. <a οnclick="xadmin.open('个人信息','http://www.baidu.com')">个人信息</a></dd>
  56. <dd>
  57. <a οnclick="xadmin.open('切换帐号','http://www.baidu.com')">切换帐号</a></dd>
  58. <dd>
  59. <a href="./login.html">退出</a></dd>
  60. </dl>
  61. </li>
  62. <li class="layui-nav-item to-index">
  63. <a href="/">前台首页</a></li>
  64. </ul>
  65. </div>
  66. <!-- 顶部结束 -->
  67. <!-- 中部开始 -->
  68. <!-- 左侧菜单开始 -->
  69. <div class="left-nav">
  70. <div id="side-nav">
  71. <ul id="nav">
  72. <li>
  73. <a href="javascript:;">
  74. <i class="iconfont left-nav-li" lay-tips="会员管理"></i>
  75. <cite>会员管理</cite>
  76. <i class="iconfont nav_right"></i></a>
  77. <ul class="sub-menu">
  78. <li>
  79. <a οnclick="xadmin.add_tab('统计页面','welcome1.html')">
  80. <i class="iconfont"></i>
  81. <cite>统计页面</cite></a>
  82. </li>
  83. <li>
  84. <a οnclick="xadmin.add_tab('会员列表(静态表格)','member-list.html')">
  85. <i class="iconfont"></i>
  86. <cite>会员列表(静态表格)</cite></a>
  87. </li>
  88. <li>
  89. <a οnclick="xadmin.add_tab('会员列表(动态表格)','member-list1.html',true)">
  90. <i class="iconfont"></i>
  91. <cite>会员列表(动态表格)</cite></a>
  92. </li>
  93. <li>
  94. <a οnclick="xadmin.add_tab('会员删除','member-del.html')">
  95. <i class="iconfont"></i>
  96. <cite>会员删除</cite></a>
  97. </li>
  98. <li>
  99. <a href="javascript:;">
  100. <i class="iconfont"></i>
  101. <cite>会员管理</cite>
  102. <i class="iconfont nav_right"></i></a>
  103. <ul class="sub-menu">
  104. <li>
  105. <a οnclick="xadmin.add_tab('会员删除','member-del.html')">
  106. <i class="iconfont"></i>
  107. <cite>会员删除</cite></a>
  108. </li>
  109. <li>
  110. <a οnclick="xadmin.add_tab('等级管理','member-list1.html')">
  111. <i class="iconfont"></i>
  112. <cite>等级管理</cite></a>
  113. </li>
  114. </ul>
  115. </li>
  116. </ul>
  117. </li>
  118. <li>
  119. <a href="javascript:;">
  120. <i class="iconfont left-nav-li" lay-tips="订单管理"></i>
  121. <cite>订单管理</cite>
  122. <i class="iconfont nav_right"></i></a>
  123. <ul class="sub-menu">
  124. <li>
  125. <a οnclick="xadmin.add_tab('订单列表','order-list.html')">
  126. <i class="iconfont"></i>
  127. <cite>订单列表</cite></a>
  128. </li>
  129. <li>
  130. <a οnclick="xadmin.add_tab('订单列表1','order-list1.html')">
  131. <i class="iconfont"></i>
  132. <cite>订单列表1</cite></a>
  133. </li>
  134. </ul>
  135. </li>
  136. <li>
  137. <a href="javascript:;">
  138. <i class="iconfont left-nav-li" lay-tips="分类管理"></i>
  139. <cite>分类管理</cite>
  140. <i class="iconfont nav_right"></i></a>
  141. <ul class="sub-menu">
  142. <li>
  143. <a οnclick="xadmin.add_tab('多级分类','cate.html')">
  144. <i class="iconfont"></i>
  145. <cite>多级分类</cite></a>
  146. </li>
  147. </ul>
  148. </li>
  149. <li>
  150. <a href="javascript:;">
  151. <i class="iconfont left-nav-li" lay-tips="城市联动"></i>
  152. <cite>城市联动</cite>
  153. <i class="iconfont nav_right"></i></a>
  154. <ul class="sub-menu">
  155. <li>
  156. <a οnclick="xadmin.add_tab('三级地区联动','city.html')">
  157. <i class="iconfont"></i>
  158. <cite>三级地区联动</cite></a>
  159. </li>
  160. </ul>
  161. </li>
  162. <li>
  163. <a href="javascript:;">
  164. <i class="iconfont left-nav-li" lay-tips="管理员管理"></i>
  165. <cite>管理员管理</cite>
  166. <i class="iconfont nav_right"></i></a>
  167. <ul class="sub-menu">
  168. <li>
  169. <a οnclick="xadmin.add_tab('管理员列表','admin-list.html')">
  170. <i class="iconfont"></i>
  171. <cite>管理员列表</cite></a>
  172. </li>
  173. <li>
  174. <a οnclick="xadmin.add_tab('角色管理','admin-role.html')">
  175. <i class="iconfont"></i>
  176. <cite>角色管理</cite></a>
  177. </li>
  178. <li>
  179. <a οnclick="xadmin.add_tab('权限分类','admin-cate.html')">
  180. <i class="iconfont"></i>
  181. <cite>权限分类</cite></a>
  182. </li>
  183. <li>
  184. <a οnclick="xadmin.add_tab('权限管理','admin-rule.html')">
  185. <i class="iconfont"></i>
  186. <cite>权限管理</cite></a>
  187. </li>
  188. </ul>
  189. </li>
  190. <li>
  191. <a href="javascript:;">
  192. <i class="iconfont left-nav-li" lay-tips="系统统计"></i>
  193. <cite>系统统计</cite>
  194. <i class="iconfont nav_right"></i></a>
  195. <ul class="sub-menu">
  196. <li>
  197. <a οnclick="xadmin.add_tab('拆线图','echarts1.html')">
  198. <i class="iconfont"></i>
  199. <cite>拆线图</cite></a>
  200. </li>
  201. <li>
  202. <a οnclick="xadmin.add_tab('拆线图','echarts2.html')">
  203. <i class="iconfont"></i>
  204. <cite>拆线图</cite></a>
  205. </li>
  206. <li>
  207. <a οnclick="xadmin.add_tab('地图','echarts3.html')">
  208. <i class="iconfont"></i>
  209. <cite>地图</cite></a>
  210. </li>
  211. <li>
  212. <a οnclick="xadmin.add_tab('饼图','echarts4.html')">
  213. <i class="iconfont"></i>
  214. <cite>饼图</cite></a>
  215. </li>
  216. <li>
  217. <a οnclick="xadmin.add_tab('雷达图','echarts5.html')">
  218. <i class="iconfont"></i>
  219. <cite>雷达图</cite></a>
  220. </li>
  221. <li>
  222. <a οnclick="xadmin.add_tab('k线图','echarts6.html')">
  223. <i class="iconfont"></i>
  224. <cite>k线图</cite></a>
  225. </li>
  226. <li>
  227. <a οnclick="xadmin.add_tab('热力图','echarts7.html')">
  228. <i class="iconfont"></i>
  229. <cite>热力图</cite></a>
  230. </li>
  231. <li>
  232. <a οnclick="xadmin.add_tab('仪表图','echarts8.html')">
  233. <i class="iconfont"></i>
  234. <cite>仪表图</cite></a>
  235. </li>
  236. </ul>
  237. </li>
  238. <li>
  239. <a href="javascript:;">
  240. <i class="iconfont left-nav-li" lay-tips="图标字体"></i>
  241. <cite>图标字体</cite>
  242. <i class="iconfont nav_right"></i></a>
  243. <ul class="sub-menu">
  244. <li>
  245. <a οnclick="xadmin.add_tab('图标对应字体','unicode.html')">
  246. <i class="iconfont"></i>
  247. <cite>图标对应字体</cite></a>
  248. </li>
  249. </ul>
  250. </li>
  251. <li>
  252. <a href="javascript:;">
  253. <i class="iconfont left-nav-li" lay-tips="其它页面"></i>
  254. <cite>其它页面</cite>
  255. <i class="iconfont nav_right"></i></a>
  256. <ul class="sub-menu">
  257. <li>
  258. <a href="login.html" target="_blank">
  259. <i class="iconfont"></i>
  260. <cite>登录页面</cite></a>
  261. </li>
  262. <li>
  263. <a οnclick="xadmin.add_tab('错误页面','error.html')">
  264. <i class="iconfont"></i>
  265. <cite>错误页面</cite></a>
  266. </li>
  267. <li>
  268. <a οnclick="xadmin.add_tab('示例页面','demo.html')">
  269. <i class="iconfont"></i>
  270. <cite>示例页面</cite></a>
  271. </li>
  272. <li>
  273. <a οnclick="xadmin.add_tab('更新日志','log.html')">
  274. <i class="iconfont"></i>
  275. <cite>更新日志</cite></a>
  276. </li>
  277. </ul>
  278. </li>
  279. <li>
  280. <a href="javascript:;">
  281. <i class="iconfont left-nav-li" lay-tips="第三方组件"></i>
  282. <cite>layui第三方组件</cite>
  283. <i class="iconfont nav_right"></i></a>
  284. <ul class="sub-menu">
  285. <li>
  286. <a οnclick="xadmin.add_tab('滑块验证','https://fly.layui.com/extend/sliderVerify/')" target="">
  287. <i class="iconfont"></i>
  288. <cite>滑块验证</cite></a>
  289. </li>
  290. <li>
  291. <a οnclick="xadmin.add_tab('富文本编辑器','https://fly.layui.com/extend/layedit/')">
  292. <i class="iconfont"></i>
  293. <cite>富文本编辑器</cite></a>
  294. </li>
  295. <li>
  296. <a οnclick="xadmin.add_tab('eleTree 树组件','https://fly.layui.com/extend/eleTree/')">
  297. <i class="iconfont"></i>
  298. <cite>eleTree 树组件</cite></a>
  299. </li>
  300. <li>
  301. <a οnclick="xadmin.add_tab('图片截取','https://fly.layui.com/extend/croppers/')">
  302. <i class="iconfont"></i>
  303. <cite>图片截取</cite></a>
  304. </li>
  305. <li>
  306. <a οnclick="xadmin.add_tab('formSelects 4.x 多选框','https://fly.layui.com/extend/formSelects/')">
  307. <i class="iconfont"></i>
  308. <cite>formSelects 4.x 多选框</cite></a>
  309. </li>
  310. <li>
  311. <a οnclick="xadmin.add_tab('Magnifier 放大镜','https://fly.layui.com/extend/Magnifier/')">
  312. <i class="iconfont"></i>
  313. <cite>Magnifier 放大镜</cite></a>
  314. </li>
  315. <li>
  316. <a οnclick="xadmin.add_tab('notice 通知控件','https://fly.layui.com/extend/notice/')">
  317. <i class="iconfont"></i>
  318. <cite>notice 通知控件</cite></a>
  319. </li>
  320. </ul>
  321. </li>
  322. </ul>
  323. </div>
  324. </div>
  325. <!-- <div class="x-slide_left"></div> -->
  326. <!-- 左侧菜单结束 -->
  327. <!-- 右侧主体开始 -->
  328. <div class="page-content">
  329. <div class="layui-tab tab" lay-filter="xbs_tab" lay-allowclose="false">
  330. <ul class="layui-tab-title">
  331. <li class="home">
  332. <i class="layui-icon"></i>欢迎
  333. </li>
  334. </ul>
  335. <div class="layui-unselect layui-form-select layui-form-selected" id="tab_right">
  336. <dl>
  337. <dd data-type="this">关闭当前</dd>
  338. <dd data-type="other">关闭其它</dd>
  339. <dd data-type="all">关闭全部</dd>
  340. </dl>
  341. </div>
  342. <div class="layui-tab-content">
  343. <div class="layui-tab-item layui-show">
  344. <iframe src='/welcome.html' frameborder="0" scrolling="yes" class="x-iframe"></iframe>
  345. </div>
  346. </div>
  347. <div id="tab_show"></div>
  348. </div>
  349. </div>
  350. <div class="page-content-bg"></div>
  351. </body>
  352. </html>

复制代码

4.项目启动

这里,为了方便快捷,我们使用maven插件启动,在rms的pom中添加build节点如下,指定我们使用maven的tomcat7插件启动,好处是启动、热更新比较快,不用单独下载tocmat,缺点是内置的tomcat版本较低是7.0.47,并且不能调整。

  1. <build>
  2. <plugins>
  3. <plugin>
  4. <groupId>org.apache.tomcat.maven</groupId>
  5. <artifactId>tomcat7-maven-plugin</artifactId>
  6. <version>2.2</version>
  7. <configuration>
  8. <uriEncoding>UTF-8</uriEncoding>
  9. <port>20020</port>
  10. <path>/</path>
  11. </configuration>
  12. </plugin>
  13. <plugin>
  14. <groupId>org.apache.maven.plugins</groupId>
  15. <artifactId>maven-war-plugin</artifactId>
  16. <version>2.6</version>
  17. </plugin>
  18. </plugins>
  19. </build>

复制代码

和前面编辑打包命令类似,我们打开编译启动配置即“Build-- >Edit Confiruations",新建一个maven项,目录选择rms模块路径,命令输入:tomcat7:run,如下图:

点击OK后,使用此项配置,启动RMS项目即可。运行效果如图:

结语

本章对RMS模块进行了配置搭建,使整个网站能够运行起来。

从零开始实现放置游戏(三):后台管理系统搭建相关推荐

  1. vue后台管理系统搭建

    vue后台管理系统搭建 前提 安装node.js 控制台安装yarn:npm install -g yarn 查看yarn版本:yarn --version 注:-g表示的是全局安装 淘宝镜像安装:n ...

  2. 从零开始实现放置游戏(十一)——实现战斗挂机(2)注册登陆和游戏主界面

    本章主要实现注册登陆功能和游戏的主界面.有了游戏的界面,大家能有更直观的认识. 本章我们主要开发的是idlewow-game模块,其实就是游戏的客户端展示层.因为是放置游戏,为了方便,主要使用spri ...

  3. 从零开始实现放置游戏(一)——游戏设计

    想要做一款成功的游戏,离不开优秀的策划,设计,玩法,美术,等等等等.这其中需要学习的东西太多.然而多想无益,这些东西越学越多,只有先尽快做出成品,然后不断迭代,才能更加深入了了解.因此,这里我们直接参 ...

  4. tp6后台管理系统搭建

    项目介绍 一款 PHP 语言基于 ThinkPhp6.x + Layui + MySQL等框架精心打造的一款模块化.插件化.高性能的前后端分离架构敏捷开发框架,可用于快速搭建前后端分离后台管理系统,本 ...

  5. 从零开始实现放置游戏(前言)

      笔者从小学就开始打电脑游戏,大学选择软件工程专业,毕业后进入软件行业,涉及电商.金融等领域,却一直未曾开发过游戏.作为一名游戏爱好者,始终是心中的一个遗憾.   然而,随着时代的变迁,出现了越来越 ...

  6. java怎么制作放置游戏_从零开始实现放置游戏(前言)

    笔者从小学就开始打电脑游戏,大学读的是软件工程,毕业后工作内容涉及电商.金融.运维等领域,却一直未曾开发过游戏.作为一名游戏爱好者,始终是心中的一个遗憾. 然而,随着时代的变迁,出现了越来越多好用的工 ...

  7. java 游戏管理系统_从零开始实现放置游戏(三):后台管理系统搭建

    idlewow content="width=device-width,user-scalable=yes, minimum-scale=0.4, initial-scale=0.8,tar ...

  8. java怎么制作放置游戏_从零开始实现放置游戏(八)——实现后台管理系统(6)代码重构...

    前几张,我们主要实现了升级经验.人物等级属性.地图.地图怪物,这四种配置的增删查改以及Excel导入功能.我们主要以地图怪物为例,因此在文章末尾提供的源代码中只实现了地图怪物这部分的逻辑功能. 如果你 ...

  9. 从零开始入门创作游戏——Unity3d的环境搭建

    最近自己被裁了,闲着没事就跟朋友讨论说试一试做一下游戏(每个男人心里都有过的幻想),就此记录一下自己从零基础开始做第一个超简单的游戏. 入门的门,搭建环境 这就是我入门第一个坑. 首先进入下面的官网 ...

最新文章

  1. 有界阻塞队列ArrayBlockingQueue和无界阻塞队列LinkedBlockingQueue
  2. VSMFC程序显示命令行窗口
  3. 用C语言扩展Python的功能的实例
  4. 分布式事务方案这么多,到底应该如何选型?
  5. solver.prototxt参数解析
  6. python算法——冒泡排序
  7. 怎样修改美国的服务器节点,美国云服务器节点怎么
  8. android模拟器多点触摸,Windows 7 多点触摸开发模拟器和多点触摸驱动
  9. 高等数学张宇18讲 第十七讲 三重积分、第一型曲线曲面积分
  10. 雨夜深思——开发平台(二)
  11. 你真的了解活跃用户吗?
  12. 计算机毕业设计Android手机校园外卖订餐APP(源码+系统+mysql数据库+Lw文档)
  13. 这341句话,这么美,那么伤。
  14. 用Win10自带SSH实现免密登录Linux
  15. 优化算法之指数加权平均详解
  16. MongoDB分片(Sharding)技术
  17. 【Visual C++】游戏开发五十 浅墨DirectX教程十八 雪花飞扬 实现唯美的粒子系统
  18. doo14 视图和js的按钮上面的交互
  19. 学生成绩预测模型_逻辑回归实战练习——根据学生成绩预测是否被录取
  20. VUE 解决双击事件与单击事件冲突(单击模拟双击)

热门文章

  1. android 拨打多个电话号码,和多号如何使用副号打电话/发短信
  2. verilog并行数据转换为串行输出
  3. Day06-Python文件和数据格式化
  4. Python-文件存储
  5. IDEA debug 断点无效
  6. 使用三丰云主机搭建青龙面板保姆级教程
  7. 【web项目】任务倒计时网页
  8. css中a标签中去掉下划线注意事项
  9. 信息系统项目管理师EV、PV、AC、BAC、CV、SV、EAC、ETC、CPI、SPI概念说明
  10. React 不用eject下修改webpack配置实现alisa