聊聊维护的那些事儿

本文讲述了作者从维护一个Python编写的网站遇到的挑战,最终决定使用Java重写整个网站的过程。文章详细介绍了重写过程中的技术难点及解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

刚刚加了一个功能,等待今晚的测试。空闲时间,写下这博客,随笔而已,写的比较散。

起因

事情要从两周前说起,11月10号的晚上,阴风阵阵,虽是冬季,但20多度的气温还是使人感到舒适。我在学习hadoop,忽然手机的微信一亮,有人给我发信息,拿起手机一看不妙。让我维护一个网站。是以前一个师兄用python写的学校网站,过两天客户要使用,要改一些内容。当时的想法是我是学java的,python不懂啊。不过,只是改改界面内容应该很简单,于是,我接了这活。

前期发展

维护的第一件事是定位到维护的点,前提是看得懂程序。于是第一天第二天在百度快速浏览了廖雪峰的python,第三天配置了环境,使网站在本地跑起来。前期的配置是基于环境上的,比较顺利。可是当真正写代码时却是寸步难行。文档写的跟别人写的代码区别还是很大,即使我知道它的结构,这个是路由配置文件,这个是处理数据库映射的文件,这是配置文件…可是却改不了,因为生疏!!!
第四天还是在看代码改代码,仍旧是困难重重,服务器是win server(装在学校机房里面),我本地是linux(fedora)。python是2.7的版本、django1.8,虽然号称跨平台,可还是会有编码问题。这问题调了一上午。到了下午,就改了一些界面样式,数据库的内容。后台代码还是难以改动(看不懂别人的代码)、注释又少,而且命名不规范,路由居然用数字命名!长见识了。就这样熬着。

蜕变

时间一分分的过去,而我还在一边骂着以前的师兄一边艰难地修改。到了4点半,我终于按捺不住心中的怒火,我决定用我的java重写这破网站(就像去年重写C#的网站一样)!!!说干就干,二话不说立刻搭建ssh环境、建好数据库、copy原先的前端界面、把自己封装的dao层和一些工具类(文件上传下载字符串操作…)搭号。到了6点多,就可以开始写逻辑了。然后,我跟室友去吃了火锅、冲凉。晚上8点回到实验室,便开始工作了。

进一步发展

网站比较简单,我分为4个模块:用户模块、考试系统、留言和交作业系统、内容展示模块。第4天晚上8点多开始敲到凌晨4点多,把用户模块和留言和交作业系统做完。第5天做内容展示模块,第6天做考试系统系统。到了第7天,把一些细节改改并部署上线,大体就完成了,当然是按照客户改动后的内容。就这样,4天时间把网站用java重写了一遍。做学校的网站有些特点,这里我讲将ppt和作业提交系统:
(1)ppt
后台管理有个上传ppt的功能,管理员上传的ppt在后台通过poi转成一张张图片,并且将这些图片放进以ppt的唯一标识命名的文件夹内。这样前台在展示时就可以动态的在唯一标识的文件夹读取图片。一共需要两张表,一张普通的news栏目表和一张存放ppt图片的表:

-- ----------------------------
-- Table structure for news
-- ----------------------------
DROP TABLE IF EXISTS `news`;
CREATE TABLE `news` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `newstypeId` int(11) NOT NULL,
  `content` longtext,
  `newsname` varchar(32) NOT NULL,
  `userId` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `newstypeId` (`newstypeId`),
  KEY `FK338AD32953DAE5` (`userId`),
  CONSTRAINT `FK338AD32953DAE5` FOREIGN KEY (`userId`) REFERENCES `user` (`id`),
  CONSTRAINT `news_ibfk_1` FOREIGN KEY (`newstypeId`) REFERENCES `newstype` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=65 DEFAULT CHARSET=utf8;

上面其实是一张导航的表,之要关注两个字段即可id是唯一标识,newsname是ppt的名称。

-- ----------------------------
-- Table structure for ppt
-- ----------------------------
DROP TABLE IF EXISTS `ppt`;
CREATE TABLE `ppt` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `url` varchar(256) DEFAULT NULL,
  `newsId` int(11) NOT NULL,
  `pptname` varchar(64) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `newsId` (`newsId`),
  CONSTRAINT `ppt_ibfk_1` FOREIGN KEY (`newsId`) REFERENCES `news` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

上面是存放ppt图片的表。上传ppt后,在后台的某个目录下会生成一个以news.id命名的文件夹,里面放该ppt生成的图片,前台页面的图片路径就可以这样写:ppt.news.id/{ppt.url}。

(2)作业提交系统
管理员在后台布置了作业,学生在作业提交界面提交word文档的作业,提交后,在后台将提交的文件名改成学号+班级+姓名+作业名+原文件名后缀的形式。然后,为每个放进以班级名命名的文件夹内。当学生提交完作业后,管理员验收作业,后台通过io流扫描作业文件夹下各个班级文件夹的名称并罗列出来,再提供一个标签,提供下载。当管理员点击某个班级的下载按纽时,后台把该以班级命名的文件夹下的所有文件打包成zip文件并下载。完成这个功能需要两段关键的代码,读取文件夹下子文件夹的代码和打包压缩代码。
读取文件夹下子文件夹:

package com.hsp.utils;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.apache.struts2.ServletActionContext;

public class FileOperation {

    public List<String> getFileNameInDirectory(String path){

        File file=new File(path);
        File[] tempList = file.listFiles();
        if(tempList!=null){
            List<String> directoryNameList=new ArrayList<String>();
            for (int i = 0; i < tempList.length; i++) {
               if (tempList[i].isDirectory()) {
                String classRoom=tempList[i].getName();
                directoryNameList.add(classRoom);
               }
              }
            return directoryNameList;
        }
        else{
            return null;
        }
    }

    public void clearFiles(String workspaceRootPath){
              File file = new File(workspaceRootPath);
              if(file.exists()){
                   deleteFile(file);
              }
         }
    public void deleteFile(File file){
              if(file.isDirectory()){
                   File[] files = file.listFiles();
                   for(int i=0; i<files.length; i++){
                        deleteFile(files[i]);
                   }
              }
              file.delete();
         }
}

打包压缩代码:

package com.hsp.utils;
import java.io.File;    

import org.apache.tools.ant.Project;    
import org.apache.tools.ant.taskdefs.Zip;    
import org.apache.tools.ant.types.FileSet;    


public class CompressZip {    

    private File zipFile;    

    /** 
     * 压缩文件构造函数 
     * @param pathName 最终压缩生成的压缩文件:目录+压缩文件名.zip 
     */  
    public CompressZip(String finalFile) {    
        zipFile = new File(finalFile);    
    }    

    /** 
     * 执行压缩操作 
     * @param srcPathName 需要被压缩的文件/文件夹 
     */  
    public void compressExe(String srcPathName) {    
        File srcdir = new File(srcPathName);    
        if (!srcdir.exists()){  
            throw new RuntimeException(srcPathName + "不存在!");    
        }   

        Project prj = new Project();    
        Zip zip = new Zip();    
        zip.setProject(prj);    
        zip.setDestFile(zipFile);    
        FileSet fileSet = new FileSet();    
        fileSet.setProject(prj);    
        fileSet.setDir(srcdir);    
        //fileSet.setIncludes("**/*.java"); //包括哪些文件或文件夹 eg:zip.setIncludes("*.java");    
        //fileSet.setExcludes(...); //排除哪些文件或文件夹    
        zip.addFileset(fileSet);    
        zip.execute();    
    }    
} 

这些都不难实现,但是要想得到。

波折

本以为到这就结束了,可是第9天早上,客户又说觉得某某大学的内容分类和界面风格不错,要改成类似的。没办法,进入了说一点改一点的三天。然后第12、13天无事,其间只加了一个用户注册要审核通过的功能。到了第15天,也就是今天的前天,又来需求,要把留言功能做成一个论坛,因为是java,改动没什么痛苦。改到今天早上,又来一些需求,内容的排放有问题,改啊改…改到现在。昨晚改的太晚发生了一点小插曲,12点回到宿舍,过了11.半的宵禁时间,宿管不给开门,又没带证件,结果打电话让亲爱的室友出来保释我。真系67!

尾声

网站的维护最多到下周三等考试一完,就解脱了。距离现在还有一周,未来是光明的!!!

总结

(1)真正的跨平台从来就只有java
(2)虽然linux做开发很流畅,但是办公确实不如windows,比如处理一些精细的word文档
(3)不要随随便便跨语言维护
(4)如果条件允许,重写是最快的维护方法

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值