jeecms v5 系统安装设计和实现以及问题

     在jeecms v5的系统安装中,安装系统提示可以安装系统。

设计思路如下:

       提示用户安装并遵守协议-----》设置相关的系统参数信息----》创建数据库---》创建表---》导入初始化数据---》跟新数据库配置----》将数据库信息持久化xml---》更新web.xml文件---》提示安装成功。

   安装

<meta http-equiv="refresh" content="3;URL=install/index.html"/>

您还没有安装JEECMS3秒钟之后自动跳转到安装页面。<br/>

如果您的浏览器长时间没有反应,请直接点击<href="install/index.html">JEECMS安装</a>

 

install/index.html:一般是同意安装页

<script type="text/javascript">

function formSubmit() {

    if(document.getElementById('license_agree').checked==false){

       alert('请同意我们的协议');

       return false;

    }

    document.getElementById('license_form').submit();

}

</script>

<form id="license_form" action="install_params.jsp" method="post">

<input type="button" class="btn" onclick="formSubmit();" value="下一步>"/>

进入安装数据库和参数页:

<form action="install_setup.jsp" method="post" onsubmit="return formSubmit();">

<tr>

        <td height="30" align="right">域名:</td>

        <td align="left"><input name="domain" type="text" class="input"value="<%=request.getServerName()%>"/></td>

              <td align="left">系统已经检测出您的域名,请勿改动</td>

      </tr>

      <tr>

        <td height="30" align="right">部署路径:</td>

        <td align="left"><input name="cxtPath" type="text"class="input" value="<%=request.getContextPath()%>"/></td>

              <td align="left">系统已经检测出您的部署路径,请勿改动</td>

      </tr>

     

安装:

<%@page contentType="text/html; charset=gbk" language="java"import="com.jeecms.core.util.*,java.util.*"%>

<%

String dbFileName = "/install/db/jeecms-db-2.4.2-final.sql";

    String initFileName = "/install/db/jeecms-init-2.4.2-final.sql";

    //创建数据库

    if ("true".equals(isCreateDb)) {

       Install.createDb(dbHost, dbPort, dbName, dbUser, dbPassword);

    } else {

       Install.changeDbCharset(dbHost, dbPort, dbName, dbUser, dbPassword);

    }

    //创建表

    if ("true".equals(isCreateTable)) {

       String sqlPath = application.getRealPath(dbFileName);

       List<String> sqlList = Install.readSql(sqlPath);

       Install.createTable(dbHost, dbPort, dbName, dbUser, dbPassword,

              sqlList);

    }

    //初始化数据

    if ("true".equals(isInitData)) {

       String initPath = application.getRealPath(initFileName);

       List<String> initList = Install.readSql(initPath);

       Install.createTable(dbHost, dbPort, dbName, dbUser, dbPassword,

              initList);

    }

    //更新配置

    Install.updateConfig(dbHost, dbPort, dbName, dbUser, dbPassword,

           domain, cxtPath, port);

    //处理数据库配置文件

    String dbXmlPath = application.getRealPath(dbXmlFileName);

    Install

           .dbXml(dbXmlPath, dbHost, dbPort, dbName, dbUser,

                  dbPassword);

    //处理web.xml

    String webXmlFromPath = application.getRealPath(webXmlFrom);

    String webXmlToPath = application.getRealPath(webXmlTo);

    Install.webXml(webXmlFromPath, webXmlToPath);

//Util里面

/**

 * 安装类

 *

 * @author admin

 *

 */

public class Install {

    public static void dbXml(String fileName, String dbHost, String dbPort,

           String dbName, String dbUser, String dbPassword) throwsException {

       String s = FileUtils.readFileToString(new File(fileName));

       s = s.replaceFirst("DB_HOST", dbHost);

       s = s.replaceFirst("DB_PORT", dbPort);

       s = s.replaceFirst("DB_NAME", dbName);

       s = s.replaceFirst("DB_USER", dbUser);

       s = s.replaceFirst("DB_PASSWORD", dbPassword);

       FileUtils.writeStringToFile(new File(fileName), s);

    }

 

    public static Connection getConn(String dbHost, String dbPort,

           String dbName, String dbUser, String dbPassword) throwsException {

       Class.forName("com.mysql.jdbc.Driver").newInstance();

       String connStr = "jdbc:mysql://" + dbHost + ":" + dbPort + "/"+ dbName

              + "?user=" + dbUser + "&password=" + dbPassword

              + "&characterEncoding=GBK";

       Connection conn = DriverManager.getConnection(connStr);

       return conn;

    }

 

    public static void webXml(String fromFile, String toFile) throwsException {

       FileUtils.copyFile(new File(fromFile), new File(toFile));

    }

 

    /**

     * 创建数据库

     *

     * @param dbHost

     * @param dbName

     * @param dbPort

     * @param dbUser

     * @param dbPassword

     * @throws Exception

     */

    public static void createDb(String dbHost, String dbPort, String dbName,

           String dbUser, String dbPassword) throws Exception {

       Class.forName("com.mysql.jdbc.Driver").newInstance();;

       String connStr = "jdbc:mysql://" + dbHost + ":" + dbPort + "?user="

              + dbUser + "&password=" + dbPassword +"&characterEncoding=GBK";

       Connection conn = DriverManager.getConnection(connStr);

       Statement stat = conn.createStatement();

       String sql = "drop database if exists " + dbName;

       stat.execute(sql);

       sql = "create database " + dbName

              + " CHARACTER SET GBK";

       stat.execute(sql);

       stat.close();

        conn.close();

    }

 

    public static void changeDbCharset(String dbHost, String dbPort,

           String dbName, String dbUser, String dbPassword) throwsException {

       Connection conn = getConn(dbHost, dbPort, dbName, dbUser, dbPassword);

       Statement stat = conn.createStatement();

       String sql = "ALTER DATABASE " + dbName

              + " CHARACTER SET GBK";

       stat.execute(sql);

       stat.close();

       conn.close();

    }

 

    /**

     * 创建表

     *

     * @param dbHost

     * @param dbName

     * @param dbPort

     * @param dbUser

     * @param dbPassword

     * @param sqlList

     * @throws Exception

     */

    public static void createTable(String dbHost, String dbPort, String dbName,

           String dbUser, String dbPassword, List<String> sqlList)

           throws Exception {

       Connection conn = getConn(dbHost, dbPort, dbName, dbUser, dbPassword);

       Statement stat = conn.createStatement();

       for (String dllsql : sqlList) {

           stat.addBatch(dllsql);

       }

       stat.executeBatch();

       stat.close();

       conn.close();

    }

 

    /**

     * 更新配置

     *

     * @param dbHost

     * @param dbName

     * @param dbPort

     * @param dbUser

     * @param dbPassword

     * @param domain

     * @param cxtPath

     * @param port

     * @throws Exception

     */

    public static void updateConfig(String dbHost, String dbPort,

           String dbName, String dbUser, String dbPassword, String domain,

           String cxtPath, String port) throws Exception {

       Connection conn = getConn(dbHost, dbPort, dbName, dbUser, dbPassword);

       Statement stat = conn.createStatement();

       String sql = "update CORE_WEBSITE set DOMAIN='" + domain +"'";

       stat.executeUpdate(sql);

       sql = "update CORE_GLOBAL set CONTEXT_PATH='" + cxtPath +"',PORT="

              + port;

       stat.executeUpdate(sql);

       stat.close();

       conn.close();

    }

 

    /**

     * 读取sql语句。/*开头为注释,;sql结束。

     *

     * @param fileName

     *            sql文件地址

     * @return list of sql

     * @throws Exception

     */

    public static List<String> readSql(String fileName) throws Exception {

        BufferedReader br = new BufferedReader(new InputStreamReader(

                new FileInputStream(fileName), Constants.ENCODING));

        List<String> sqlList = new ArrayList<String>();

        StringBuilder sqlSb = new StringBuilder();

        String s = null;

        while ((s = br.readLine()) != null) {

            if (s.startsWith("/*")) {

                continue;

            }

            if (s.endsWith(";")) {

                sqlSb.append(s);

                sqlSb.setLength(sqlSb.length() - 1);

                sqlList.add(sqlSb.toString());

                sqlSb.setLength(0);

            } else {

                sqlSb.append(s);

            }

        }

        br.close();

        return sqlList;

    }

}

 

<!--EndFragment-->

问题:

      在系统安装过程中既然用户可以通过请求数据库文件修改数据库信息,如果安装的信息不删除,用户完全可以通过这种方式重置数据库或者破坏数据库信息。

     建议部署完毕采用手工删除install中文件的信息。

猜你喜欢

转载自topmanopensource.iteye.com/blog/2079459