聊聊维护的那些事儿

时间:2022-12-16 21:44:57

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

起因

事情要从两周前说起,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)如果条件允许,重写是最快的维护方法