仓酷云

标题: JAVA编程:JSP单页面网站文件办理器 [打印本页]

作者: 小魔女    时间: 2015-1-18 11:38
标题: JAVA编程:JSP单页面网站文件办理器
你希望java的IDE整合。这个是没有必要的,重要的是你理解java有多深以及怎么组织你的代码,即使没有IDE,代码照样能够编译运行的。js|页面<p>
这个文件的开辟的计划头脑是如许的。有的web网站,大概B/S软件的客户,在软件的安装调试阶段,常常对某些细节有特别请求,大概,是字体的调剂,大概是界面方面的小修改定见。面临如许的情形,假如用户没有开放FTP功效,则开辟和保护职员常常就必需亲临现场做一些很小的调试事情。即华侈了工夫,也华侈了人力物力。
在如许的情形下,我开辟了这个具有文件办理功效的JSP单页面文件。它供应了文件夹的新增,改名,删除;文件的修正,改名,删除和上传的功效。基础能满意在软件的安装调试阶段,小的修正事情。
为了平安缘故原由,该JSP页面供应了复杂的用户上岸功效。
利用前,把该文件置于网站文件,大概B/S产物的恣意目次下。开放文件安装目次的读写操纵权限。用户远程上岸该JSP页面,就能够利用办理功效。当安装保护阶段停止今后,请修正文件安装目次的读写权限,并删除该文件,以避免留下平安隐患。
缺省,上岸用户名为:admin暗码为:oddworld
开辟情况jakarta-tomcat-4.0.3.exe
注重:由于本软件的上传文件功效必需有smartupload组件撑持。请把smartupload置于tomcat对应文件夹web-inf下。假如你撑持上传的组件有所分歧,请自行调剂。
扼要开辟申明:由于本文件其实不庞大,加上自己自我感到,文档申明固然不标准,却也具体,以是只盘算扼要的关于一些小细节上做申明。
1.本文件举行文件目次操纵的时分,间接把目次当参数来传送,没有举行响应的转换。这是由于在java中,“英笔墨符”有大概会被以为是回心字符,而引发在字符处置过程当中呈现没法预期的成绩,以是我以为间接把目次来作为参数,在操纵上对照公道。
2.本文件在一些表单的提交方面,利用毗连,而不是按钮,是由于javascript处置带“”的字符串时,也会有处置回心字符的大概,以是,为了避免如许的情形,以是传送目次参数的提交,都利用毗连情势。
3.strStat,strErr两个字符串,贯串文件一直,前者为页面举行何种操纵的判别命令,后者为在一切操纵中堕落的信息提醒。
4.本文件有大概引发的平安大概别的方面的纠葛,自己不做任何注释。我只是把该文件作为一个收费的工具供应给人人参考,利用。
----------------------------------------------------------------
文件内容admin.jsp
<%--oddWorld网站文件办理体系(简体中文版)2003年10月10日
copyrightbyjoardAst

admin.jsp功效:网站文件背景办理页面。
--%>
<%@pagecontentType="text/html;charset=gb2312"%>
<%@pageimport="java.io.*"%>
<%@pageimport="java.util.Date"%>
<%@pageimport="com.jspsmart.upload.SmartUpload"%>
<%@pageimport="javax.servlet.http.HttpSession"%>
<%@pageimport="javax.servlet.http.HttpServletRequest"%>
<%@pageimport="java.lang.reflect.*"%>

<%//中笔墨符转换%>
<%!
publicstaticStringUnicodeToChinese(Strings){
try{
if(s==null||s.equals(""))return"";
Stringnewstring=null;
newstring=newString(s.getBytes("ISO8859_1"),"gb2312");
returnnewstring;
}
catch(UnsupportedEncodingExceptione)
{
returns;
}
}
publicstaticStringChineseToUnicode(Strings){
try{
if(s==null||s.equals(""))return"";
Stringnewstring=null;
newstring=newString(s.getBytes("gb2312"),"ISO8859_1");
returnnewstring;
}
catch(UnsupportedEncodingExceptione)
{
returns;
}
}
%>

<%
//革新成绩
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires",0);

//自界说上岸用暗码和用户名
//准确的用户名
Stringusername="admin"
//准确的暗码
Stringuserpass="oddworld";
//失掉体系路径
ServletContextapp=(ServletContext)pageContext.getServletContext();
StringstrSysPath=app.getRealPath("/");
//处置对象物理路径
StringstrDealPath="";
//显现毛病信息
StringstrErr="";
//代表页面的显现形态,login是显现上岸页面;show是一般的显现文件信息;edit是显现编纂文件的页面;editDo是编纂文件的写进操纵
;createF是显现创立文件夹的页面;createFDo是创立文件夹的操纵;renameFold是显现变动文件夹称号的页面;renameFoldDo是变动文
件夹称号的操纵;delFoldDo是删除文件夹的操纵;renameFile是显现变动文件称号的页面;renameFileDo是变动文件称号的操纵;
delFileDo是删除文件的操纵;uploadFile是显现上传文件的页面;uploadFileDo是上传文件的操纵;
StringstrStat="login";
//用于show形态下显现文件的数组
File[]fileArr=null;
//依据传送的路径参数失掉要处置对象的物理路径
if(request.getParameter("path")==null||request.getParameter("path").equals("")){
strDealPath=strSysPath;
}else{
//失掉路径参数
strDealPath=UnicodeToChinese(request.getParameter("path"));
}
//反省session的值是不是存在,假如不存在着显现毛病信息
//HttpSessionsession=request.getSession(false);
if(session.getValue("loginIn")==null||!session.getValue("loginIn").equals("pass"))
{
strStat="login";
strErr="你还没有上岸大概上岸超时,请从头上岸!";
}
//创立file对象,反省目次是不是存在
FilemyFile=newFile(strDealPath);
//查验文件夹是不是存在
if(!myFile.exists()){
strErr="你选择的文件夹不存在,请从头选择!";
}
//依据参数的分歧,举行对应的操纵
if(request.getParameter("act")==null||request.getParameter("act").equals("")||
request.getParameter("act").equals("login"))
{
if(request.getParameter("username")!=null&&request.getParameter("userpass")!=null)
{

//准确的经由MD5加密的暗码
//Stringuserpass="OEEO99107DC8C1EE2E06666B965601EF";

if(request.getParameter("username").equals(username)&&(request.getParameter("userpass")).equals(userpass))
{
session.putValue("loginIn","pass");
response.sendRedirect(request.getRequestURI()+"?act=show");
}
}
else{
strStat="login";
strErr="你还没有上岸大概上岸超时,请从头上岸!";
}
}elseif(request.getParameter("act").equals("show")){
//缺省,页面一般显现文件的信息statStat="show"
strStat="show";

//创立文件列表数组
fileArr=myFile.listFiles();

}elseif(request.getParameter("act").equals("edit"))
{
//编纂文件内容的页面
//依据是不是有request.getParameter("file"),和响应文件是不是存在,假如有,则举行编纂操纵,假如没有,则显现毛病提醒信息
if(!(request.getParameter("file")==null||request.getParameter("file").equals(""))){

FilefileEdit=new
File(UnicodeToChinese(request.getParameter("path"))+UnicodeToChinese(request.getParameter("file")));

if(fileEdit.exists())
//文件编纂操纵,实践就是变动页面的显现,用一个textarea显现文件的信息,来做编纂
strStat="edit";
else
//显现毛病信息
strErr="你选择的文件不存在,请从头选择!";

}else{
strErr="你没有选择要编纂的文件,请从头选择!";
}
}elseif(request.getParameter("act").equals("editDo"))
{
//把修正的内容写进文件,而且前往修正页面
if(!(request.getParameter("file")==null||request.getParameter("file").equals("")))
{
FilefileEdit=new
File(UnicodeToChinese(request.getParameter("path"))+UnicodeToChinese(request.getParameter("file")));

if(fileEdit.exists())
{
//文件编纂操纵,实践就是在修正文件内容今后,再于页面上用一个textarea显现文件的内容,持续来做编纂大概
检察修正的效果
if(!(request.getParameter("fileData")==null))
{

try{
PrintWriterpwEdit=null;
pwEdit=newPrintWriter(new
FileOutputStream(UnicodeToChinese(request.getParameter("path"))+UnicodeToChinese(request.getParameter("file"))));
pwEdit.println(UnicodeToChinese(request.getParameter("fileData")));
pwEdit.close();

response.sendRedirect(request.getRequestURI()+"?path="+
UnicodeToChinese(request.getParameter("path"))+"&file="+UnicodeToChinese(request.getParameter("file"))+"&act=edit");
return;
}catch(Exceptione){
strErr="文件写进毛病,请从头选择!";
}
}else{
strErr="短少修正文件内容的参数,请从头选择!";
}
}else
//显现毛病信息
strErr="你选择的文件不存在,请从头选择!";
}else{
strErr="你没有选择要编纂的文件,请从头选择!";
}
}elseif(request.getParameter("act").equals("createF"))
{
//创立新的文件夹的页面显现
strStat="createF";
}elseif(request.getParameter("act").equals("createFDo"))
{
//创立新的文件夹
StringstrFoldName=strDealPath+UnicodeToChinese(request.getParameter("foldName")).trim()+"";
//out.println(strFoldName);
//out.close();
FilefileCreateF=newFile(strFoldName);

if(!fileCreateF.exists())
{
try{
fileCreateF.mkdir();
response.sendRedirect(request.getRequestURI()+"?path="+strDealPath+"&act=show");
return;
}catch(Exceptione){
strErr="创立新文件夹失利!";
}
}
else

{
strErr="指定的文件夹称号和现有的文件夹称号反复,请从头指定一个新的文件夹称号!";
}
}elseif(request.getParameter("act").equals("delFoldDo"))
{
//删除操纵
try{
StringstrFileDelF=strDealPath+UnicodeToChinese(request.getParameter("fold"))+"";
FilefileDelF=newFile(strFileDelF);

if(fileDelF.exists()){
File[]fileArrCheck=fileDelF.listFiles();
if(!(fileArrCheck.length>0))
{
fileDelF.delete();
response.sendRedirect(request.getRequestURI()+"?path="+strDealPath+"&act=show");
return;
}else
{
strErr="文件夹上面还包括着文件,请把文件都删除,再删除文件夹";
}
}else{
strErr="要删除的文件夹不存在,请从头选择";
}

}catch(Exceptione)
{
strErr="文件夹删除操纵毛病!";
}
}elseif(request.getParameter("act").equals("renameFold"))
{
strStat="renameFold";
}elseif(request.getParameter("act").equals("renameFoldDo"))
{
//文件夹改名操纵
//依据参数判别是不是关于文件夹称号有变动举措产生
if(request.getParameter("changeDo").equals("true"))
{
//有文件名,改名产生
try{
StringstrFileRenameF=strDealPath+UnicodeToChinese(request.getParameter("fold"))+"";
FilefileRenameF=newFile(strFileRenameF);

StringstrFileRenameToF=strDealPath+UnicodeToChinese(request.getParameter("newFoldName"))+"";
FilefileRenameToF=newFile(strFileRenameToF);

//判别改名的文件夹是不是存在
if(fileRenameF.exists()){
//判别新的文件夹称号是不是与现存的文件夹重名
if(!fileRenameToF.exists())
{
fileRenameF.renameTo(fileRenameToF);
response.sendRedirect(request.getRequestURI()+"?path="+strDealPath+"&act=show");
return;
}else
{
strErr="指定的文件夹称号和现有的文件夹称号反复,请从头指定一个文件夹称号!";
}
}else{
strErr="要改名的文件夹不存在,请从头选择";
}

}catch(Exceptione)
{
strErr="文件夹改名操纵毛病!";
}
}
}elseif(request.getParameter("act").equals("renameFile"))
{
strStat="renameFile";
}elseif(request.getParameter("act").equals("renameFileDo"))
{
//文件改名操纵
//依据参数判别是不是关于文件称号有变动举措产生
if(request.getParameter("changeDo").equals("true"))
{
//有文件名,改名产生
try{
StringstrFileRenameFi=strDealPath+UnicodeToChinese(request.getParameter("file"));
FilefileRenameFi=newFile(strFileRenameFi);

StringstrFileRenameToFi=strDealPath+UnicodeToChinese(request.getParameter("newFileName"));
FilefileRenameToFi=newFile(strFileRenameToFi);

//判别改名的文件是不是存在
if(fileRenameFi.exists()){
//判别新的文件称号是不是与现存的文件重名
if(!fileRenameToFi.exists())
{
fileRenameFi.renameTo(fileRenameToFi);
response.sendRedirect(request.getRequestURI()+"?path="+strDealPath+"&act=show");
return;
}else
{
strErr="指定的文件称号和现有的文件称号反复,请从头指定一个文件称号!";
}
}else{
strErr="要改名的文件不存在,请从头选择";
}

}catch(Exceptione)
{
strErr="文件改名操纵毛病!";
}
}
}elseif(request.getParameter("act").equals("delFileDo"))
{
//删除操纵
try{
StringstrFileDelFi=strDealPath+UnicodeToChinese(request.getParameter("file"));
FilefileDelFi=newFile(strFileDelFi);

if(fileDelFi.exists())
{
fileDelFi.delete();
response.sendRedirect(request.getRequestURI()+"?path="+strDealPath+"&act=show");
return;
}else{
strErr="要删除的文件不存在,请从头选择";
}

}catch(Exceptione)
{
strErr="文件删除操纵毛病!";
}
}elseif(request.getParameter("act").equals("uploadFile"))
{
strStat="uploadFile";
}elseif(request.getParameter("act").equals("uploadFileDo"))
{
%>
<jsp:useBeanid="mySmartUpload"scope="page"class="com.jspsmart.upload.SmartUpload"/>
<%
//上传文件操纵
mySmartUpload.initialize(pageContext);
mySmartUpload.setTotalMaxFileSize(1000000);
try{
mySmartUpload.upload();
mySmartUpload.save(strDealPath);

response.sendRedirect(request.getRequestURI()+"?path="+strDealPath+"&act=show");
return;
}catch(Exceptione){
strErr="文件上传堕落,请反省是不是凌驾1M的文件巨细限定!";
}
}
%>
<%
out.println(strStat);
%>
<HTML><HEAD><TITLE>DirectoryListingFor/</TITLE>
<METAcontent="text/html;charset=utf-8"http-equiv=Content-Type>
<METAcontent="MSHTML5.00.2920.0"name=GENERATOR></HEAD>
<BODYbgColor=white>
<divalign="center">
<tableborder=0cellpadding=5cellspacing=0width="90%">
<tbody>
<tr>
<tdalign=leftbgcolor=#000066valign=bottom><fontcolor=#ffffffface=宋体
size=4Roman?New,?times><b>网站文件办理器</b></font></td>
<tdalign=rightbgcolor=#000066valign=bottom><fontcolor=#ffffffface=宋体
size=4Roman?New,?times><b><strong><%=request.getContextPath()%></strong></b></font></td>
</tr>
</tbody>
</table>
<tablewidth="90%"border="0"cellspacing="0"cellpadding="5">
<tr>
<td><fontsize="2"><b>物理路径:</b><%=strDealPath%></font></td>
</tr>
</table>
<br>
<%if(strStat.equals("login")){%>
<tablewidth="300"border="0"cellspacing="1"cellpadding="0">
<tr>
<tdheight="200"valign="top"align="center">
<palign="center">
<tablewidth="100%"border="0"cellspacing="1"cellpadding="5"bgcolor=#999999class=a9px>
<tr>
<tdbgcolor="#cccccc"><fontsize=+2>登录</font></td>
</tr>
<tr>
<tdbgcolor="#FFFFFF"valign="top"align="center">
<tablewidth="100%"border="0"cellspacing="0"cellpadding="0">
<formname=dataformmethod=postaction=<%=request.getRequestURI()%>?act=login>
<tr>
<tdwidth="100"><b><fontsize="-1">登录名:</font></b></td>
<td>
<inputmaxlength=16
name="username"value="">
</td>
</tr>
<tr>
<tdwidth="100"><b><fontsize="-1">暗码:</font></b></td>
<td>
<inputclass=steditmaxlength=16
name="userpass"value="">
</td>
</tr>
</form>
</table>
<br>
<tableborder=0cellpadding=0cellspacing=0>
<tbody>
<tr>
<td>
<inputname=updatetype=buttonvalue="登录">
</td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<br>
</td>
</tr>
</table>
</td>
</tr>
</table>
<%//毛病信息显现
}elseif(strErr!=""){
%>
<tablewidth="90%"border="0"cellspacing="0"cellpadding="5">
<tr>
<td><fontsize=+2><strong>操纵毛病</strong></font></td>
</tr>
</table>
<tablealign=centercellpadding=5cellspacing=0width="90%">
<formname=dataForm2
action="<%=request.getRequestURI()%>?path=<%=UnicodeToChinese(request.getParameter("path"))%>&fold=<%=UnicodeToChinese(reques
t.getParameter("fold"))%>&act=renameFoldDo"method="post">
<tbody>
<trbgcolor=#cccccc>
<tdalign=leftbgcolor="#cccccc"><strong><fontsize="-1">毛病缘故原由:</font></strong></td>
</tr>
<tr>
<tdalign=left><TT><fontcolor="red"><%=strErr%></font></TT>
</td>
</tr>
<tr>
<tdbgcolor=#ccccccalign="center"><TT>[<ahref="javascript:history.go(-1);">前往操纵</a>]</TT><tt>[<a
href="<%=request.getRequestURI()%>?path=<%=UnicodeToChinese(request.getParameter("path"))%>&act=show">前往目次</a>
]<inputtype=hiddenname="changeDo"value="false"></tt></td>
</tr>
</tbody>
</form>
</table>

<%
}elseif(strStat.equals("show")){
//一般显现页面
%>
<tablewidth="90%"border="0"cellspacing="0"cellpadding="5">
<tr>
<td><fontsize=+2><strong>目次列表:</strong></font></td>
</tr>
</table>
<tablealign=centercellpadding=5cellspacing=0width="90%">
<tbody>
<trbgcolor=#cccccc>
<tdalign=left><fontsize=+1><strong><fontsize="-1">称号</font></strong></font><TT>(单击进进响应目次)</TT></td>
<tdalign=center><fontsize=+1><strong><fontsize="-1">修正工夫</font></strong></font></td>
<tdalign=center><b><fontsize="-1">重定名</font></b></td>
<tdalign=center><b><fontsize="-1">删除</font></b></td>
</tr>
<%
//显现表格行的初始色彩
StringbgColor="";
//假如不是根目次,则显现一个回到下层目次的毗连
if(!(strDealPath.equals(strSysPath))){%>
<trbgcolor=<%=bgColor%>>
<tdalign=left><tt><fontcolor=#000066face=WingDings
size=4>0</font><atitle="单击进进下层目次"
href="<%=request.getRequestURI()%>?path=<%=(myFile.getParent())+"&act=show>"%>&act=show">下层目次</a></tt></td>
<tdalign=right></td>
<tdalign=center></td>
<tdalign=center></td>
</tr>
<%}
for(inti=0;i<fileArr.length;i++){
//假如是文件夹则显现
if(fileArr[i].isDirectory()){
//色彩隔行变更
bgColor=bgColor.equals("#eeeeee")?"":"#eeeeee";
%>
<trbgcolor=<%=bgColor%>>
<tdalign=left><tt><FONTcolor=#000066face=WingDings
size=4>0</FONT><atitle="单击进进响应目次"
<P>href="<%=request.getRequestURI()%>?path=<%=strDealPath+fileArr[i].getName()+"&act=show"><%=fileArr[i].getName()%>
作者: 若相依    时间: 2015-1-21 11:42
你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?
作者: 谁可相欹    时间: 2015-1-30 17:24
Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。
作者: 若天明    时间: 2015-2-1 20:56
任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言
作者: admin    时间: 2015-2-7 15:00
是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言
作者: 小妖女    时间: 2015-2-14 09:47
Java是一个纯的面向对象的程序设计语言,它继承了 C++语言面向对象技术的核心。Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)
作者: 简单生活    时间: 2015-3-4 05:26
Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。
作者: 金色的骷髅    时间: 2015-3-6 11:10
一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。
作者: 深爱那片海    时间: 2015-3-13 00:08
任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言
作者: 爱飞    时间: 2015-3-13 00:08
是一种突破用户端机器环境和CPU
作者: 海妖    时间: 2015-3-24 03:29
还好,SUN提供了Javabean可以把你的JSP中的 Java代码封装起来,便于调用也便于重用。
作者: 愤怒的大鸟    时间: 2015-3-24 21:38
是一种使网页(Web Page)产生生动活泼画面的语言
作者: 小魔女    时间: 2015-4-1 08:46
你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。
作者: 乐观    时间: 2015-4-5 23:51
你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。
作者: 飘灵儿    时间: 2015-4-10 23:08
你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?
作者: 柔情似水    时间: 2015-4-23 06:15
J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。
作者: 分手快乐    时间: 2015-4-23 11:19
那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!
作者: 莫相离    时间: 2015-5-9 23:33
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
作者: 仓酷云    时间: 2015-5-10 08:27
自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2