温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

SSH如何实现信息发布管理

发布时间:2021-10-19 09:34:23 来源:亿速云 阅读:128 作者:小新 栏目:web开发

这篇文章主要介绍了SSH如何实现信息发布管理,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

信息发布的开发,还是遵循从entity->dao->service->action->config的方式进行。

这里面有几个知识点:

(1)对于表单中的大数据量文本域,在映射文件(*.hbm.xml)中其类型应使用text。

例如:Java文件中

private String content;

在Hibernate映射文件中

<property name="content" column="content" type="text"></property>

(2)对于Date、Calendar、Timstamp的理解

Java文件中

private Timestamp createTime;

在Hibernate映射文件中

<property name="createTime" column="create_time" type="java.sql.Timestamp"></property>

(3)抽取BaseService

(4)在新增页面,显示当前时间

Java代码

info = new Info();
info.setCreateTime(new Timestamp(new Date().getTime())); // 是为了在页面中显示出当前时间

在JSP页面中显示时间的struts标签

<s:date name="createTime" format="yyyy-MM-dd HH:mm"/>

(5)在HTML标签的id值 结合数据库中主键 的使用,使得HTML标签的id值不会重复

1、entity层

Info.java

package com.rk.tax.entity;

import java.io.Serializable;
import java.sql.Timestamp;
import java.util.HashMap;
import java.util.Map;

public class Info implements Serializable {
	private String infoId;
	private String type;
	private String source;
	private String title;
	private String content;
	private String memo;
	private String creator;
	private Timestamp createTime;
	private String state;
	
	//状态
	public static String INFO_STATE_PUBLIC = "1";//发布
	public static String INFO_STATE_STOP = "0";//停用
	
	//信息分类 
	public static String INFO_TYPE_TZGG = "tzgg";
	public static String INFO_TYPE_ZCSD = "zcsd";
	public static String INFO_TYPE_NSZD = "nszd";
	public static Map<String, String> INFO_TYPE_MAP;
	static{
		INFO_TYPE_MAP = new HashMap<String, String>();
		INFO_TYPE_MAP.put(INFO_TYPE_TZGG, "通知公告");
		INFO_TYPE_MAP.put(INFO_TYPE_ZCSD, "政策速递");
		INFO_TYPE_MAP.put(INFO_TYPE_NSZD, "纳税指导");
	}
	
	// {{
	public String getInfoId() {
		return infoId;
	}
	public void setInfoId(String infoId) {
		this.infoId = infoId;
	}
	public String getType() {
		return type;
	}
	public void setType(String type) {
		this.type = type;
	}
	public String getSource() {
		return source;
	}
	public void setSource(String source) {
		this.source = source;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	public String getMemo() {
		return memo;
	}
	public void setMemo(String memo) {
		this.memo = memo;
	}
	public String getCreator() {
		return creator;
	}
	public void setCreator(String creator) {
		this.creator = creator;
	}
	public Timestamp getCreateTime() {
		return createTime;
	}
	public void setCreateTime(Timestamp createTime) {
		this.createTime = createTime;
	}
	public String getState() {
		return state;
	}
	public void setState(String state) {
		this.state = state;
	}
	// }}
	
}

Info.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.rk.tax.entity" auto-import="true">
	<class name="Info" table="T_Info">
		<id name="infoId" column="info_id" type="java.lang.String" length="32">
			<generator class="uuid.hex"></generator>
		</id>
		<property name="type" column="type" type="java.lang.String" length="10"></property>
		<property name="source" column="source" type="java.lang.String" length="50"></property>
		<property name="title" column="title" type="java.lang.String" length="100"></property>
		<property name="content" column="content" type="text"></property>
		<property name="memo" column="memo" type="java.lang.String" length="200"></property>
		<property name="creator" column="creator" type="java.lang.String" length="10"></property>
		<property name="createTime" column="create_time" type="java.sql.Timestamp" length="19"></property>
		<property name="state" column="state" type="java.lang.String" length="1"></property>
	</class>

</hibernate-mapping>

2、dao层

InfoDao.java

package com.rk.tax.dao;

import com.rk.core.dao.BaseDao;
import com.rk.tax.entity.Info;

public interface InfoDao extends BaseDao<Info> {

}

InfoDaoImpl.java

package com.rk.tax.dao.impl;


import com.rk.core.dao.impl.BaseDaoImpl;
import com.rk.tax.dao.InfoDao;
import com.rk.tax.entity.Info;

public class InfoDaoImpl extends BaseDaoImpl<Info> implements InfoDao {

}

关于BaseDao和BaseDaoImpl可以查看 http://lsieun.blog.51cto.com/9210464/1835776

3、service层

这里要抽取一个通用的Service,即BaseService。

BaseService.java

package com.rk.core.service;

import java.io.Serializable;
import java.util.List;

public interface BaseService<T> {
	//新增
	public void save(T entity);
	//更新
	public void update(T entity);
	//根据id删除
	public void delete(Serializable id);
	//根据id查找
	public T findById(Serializable id);
	//查找列表
	public List<T> findAll();
}

BaseServiceImpl.java 这里虽然通过baseDao完成了相应的操作,但是还是应该给baseDao提供一个具体的实例变量才能执行操作,否则会报null异常。在这个项目中,所有的dao、service都是由Spring的IOC容器进行管理,那么应该如何让Spring的IOC容器为BaseServiceImpl注入baseDao呢?答案:通过BaseServiceImpl的子类完成注入。

package com.rk.core.service.Impl;

import java.io.Serializable;
import java.util.List;

import com.rk.core.dao.BaseDao;
import com.rk.core.service.BaseService;

public class BaseServiceImpl<T> implements BaseService<T> {
	private BaseDao<T> baseDao;
	public void setBaseDao(BaseDao<T> baseDao) {
		this.baseDao = baseDao;
	}
	
	public void save(T entity) {
		baseDao.save(entity);
	}

	public void update(T entity) {
		baseDao.update(entity);
	}

	public void delete(Serializable id) {
		baseDao.delete(id);
	}

	public T findById(Serializable id) {
		return baseDao.findById(id);
	}

	public List<T> findAll() {
		return baseDao.findAll();
	}

}

InfoService.java

package com.rk.tax.service;

import com.rk.core.service.BaseService;
import com.rk.tax.entity.Info;

public interface InfoService extends BaseService<Info> {

}

InfoServiceImpl.java 注意:这里通过对infoDao的注入,来同时完成baseDao的注入。

package com.rk.tax.service.impl;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import com.rk.core.service.Impl.BaseServiceImpl;
import com.rk.tax.dao.InfoDao;
import com.rk.tax.entity.Info;
import com.rk.tax.service.InfoService;

@Service("infoService")
public class InfoServiceImpl extends BaseServiceImpl<Info> implements InfoService {
	private InfoDao infoDao;
	
	@Resource
	public void setInfoDao(InfoDao infoDao) {
		setBaseDao(infoDao);
		this.infoDao = infoDao;
	}
}

4、action层

InfoAction.java

package com.rk.tax.action;

import java.sql.Timestamp;
import java.util.Date;
import java.util.List;

import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.ServletActionContext;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import com.opensymphony.xwork2.ActionContext;
import com.rk.core.action.BaseAction;
import com.rk.tax.entity.Info;
import com.rk.tax.service.InfoService;

@Controller("infoAction")
@Scope("prototype")
public class InfoAction extends BaseAction {
	
	/*****1、业务数据*****/
	private List<Info> infoList;
	private Info info;
	
	/*****2、业务实现类*****/
	@Resource
	private InfoService infoService;
	
	/*****3、响应JSP页面的操作*****/
	//列表页面
	public String listUI(){
		//加载分类集合
		ActionContext.getContext().getContextMap().put("infoTypeMap", Info.INFO_TYPE_MAP);
		infoList = infoService.findAll();
		return "listUI";
	}
	//跳转到新增页面
	public String addUI(){
		//加载分类集合
		ActionContext.getContext().getContextMap().put("infoTypeMap", Info.INFO_TYPE_MAP);
		info = new Info();
		info.setCreateTime(new Timestamp(new Date().getTime())); // 是为了在页面中显示出当前时间
		return "addUI";
	}
	
	//保存新增
	public String add(){
		if(info != null){
			infoService.save(info);
		}
		return "list";
	}
	
	//跳转到编辑页面
	public String editUI(){
		//加载分类集合
		ActionContext.getContext().getContextMap().put("infoTypeMap", Info.INFO_TYPE_MAP);
		if(info != null && info.getInfoId() != null){
			info = infoService.findById(info.getInfoId());
		}
		return "editUI";
	}
	
	//保存编辑
	public String edit(){
		if(info != null){
			infoService.update(info);
		}
		return "list";
	}
	
	//删除
	public String delete(){
		if(info != null && info.getInfoId() != null){
			infoService.delete(info.getInfoId());
		}
		return "list";
	}
	
	//批量删除
	public String deleteSelected(){
		if(selectedRow != null){
			for(String id : selectedRow){
				infoService.delete(id);
			}
		}
		return "list";
	}
	
	//异步发布信息
	public void publicInfo(){
		try {
			if(info != null && info.getInfoId()!= null){
				//1、更新信息状态
				Info temp = infoService.findById(info.getInfoId());
				temp.setState(info.getState());
				infoService.update(temp);
				
				//2、输出更新结果
				HttpServletResponse response = ServletActionContext.getResponse();
				response.setContentType("text/html");
				ServletOutputStream outputStream = response.getOutputStream();
				outputStream.write("更新状态成功".getBytes("utf-8"));
				outputStream.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	// {{
	public List<Info> getInfoList() {
		return infoList;
	}
	public void setInfoList(List<Info> infoList) {
		this.infoList = infoList;
	}
	public Info getInfo() {
		return info;
	}
	public void setInfo(Info info) {
		this.info = info;
	}
	// }}
}

5、config

(1)entity层配置

就是Hibernate的映射文件

(2)dao层配置,就是将dao注入到Spring的IOC容器中

<bean id="infoDao" class="com.rk.tax.dao.impl.InfoDaoImpl" parent="baseDao"></bean>

(3)service层配置,就是将service注入到Spring的IOC容器中

	<!-- 开启注解扫描 -->
	<context:component-scan base-package="com.rk.tax.service.impl"></context:component-scan>

(4)action层配置,一是将action注入到Spring的IOC容器中,二是将action在struts中进行url的映射

(5)最后保存所有的配置都汇总到applicationContext和struts.xml中

6、前台JSP页面

6.1、listUI.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <%@include file="/common/header.jsp"%>
    <title>信息发布管理</title>
    <script type="text/javascript">
      	//全选、全反选
		function doSelectAll(){
			// jquery 1.6 前
			//$("input[name=selectedRow]").attr("checked", $("#selAll").is(":checked"));
			//prop jquery 1.6+建议使用
			$("input[name=selectedRow]").prop("checked", $("#selAll").is(":checked"));		
		}
        //新增
        function doAdd(){
        	document.forms[0].action = "${basePath}/tax/info_addUI.action";
        	document.forms[0].submit();
        }
        //编辑
        function doEdit(id){
            document.forms[0].action = "${basePath}/tax/info_editUI.action?info.infoId="+id;
        	document.forms[0].submit();
        }
        //删除
        function doDelete(id){
        	document.forms[0].action = "${basePath}/tax/info_delete.action?info.infoId="+id;
        	document.forms[0].submit();
        }
        //批量删除
        function doDeleteAll(){
        	document.forms[0].action = "${basePath}/tax/info_deleteSelected.action";
        	document.forms[0].submit();
        }
        //异步发布信息,信息的id及将要改成的信息状态
  		function doPublic(infoId, state){
  			//1、更新信息状态
  			$.ajax({
  				url:"${basePath}/tax/info_publicInfo.action",
  				data:{"info.infoId":infoId,"info.state":state},
  				type:"post",
  				success:function(msg){
  					//2、更新状态栏、操作拦的显示值
  					if("更新状态成功" == msg){
  						if(state == 1){//说明信息状态已经被改成 发布,状态栏显示 发布,操作栏显示 停用
  							$('#show_'+infoId).html("发布");
  							$('#oper_'+infoId).html('<a href="javascript:doPublic(\''+infoId+'\',0)">停用</a>');
  						}
  						else{
  							$('#show_'+infoId).html("停用");
  							$('#oper_'+infoId).html('<a href="javascript:doPublic(\''+infoId+'\',1)">发布</a>');
  						}
  					}
  					else{
  						alert("更新信息状态失败!");
  					}
  				},
  				error:function(){
  					alert("更新信息状态失败!");
  				}
  			});
  		}
    </script>
</head>
<body class="rightBody">
<form name="form1" action="" method="post">
    <div class="p_d_1">
        <div class="p_d_1_1">
            <div class="content_info">
                <div class="c_crumbs"><div><b></b><strong>信息发布管理</strong></div> </div>
                <div class="search_art">
                    <li>
                        信息标题:<s:textfield name="info.title" cssClass="s_text" id="infoTitle"  cssStyle="width:160px;"/>
                    </li>
                    <li><input type="button" class="s_button" value="搜 索" onclick="doSearch()"/></li>
                    <li >
                        <input type="button" value="新增" class="s_button" onclick="doAdd()"/>&nbsp;
                        <input type="button" value="删除" class="s_button" onclick="doDeleteAll()"/>&nbsp;
                    </li>
                </div>

                <div class="t_list" >
                    <table width="100%" border="0">
                        <tr class="t_tit">
                            <td width="30" align="center"><input type="checkbox" id="selAll" onclick="doSelectAll()" /></td>
                            <td align="center">信息标题</td>
                            <td width="120" align="center">信息分类</td>
                            <td width="120" align="center">创建人</td>
                            <td width="140" align="center">创建时间</td>
                            <td width="80" align="center">状态</td>
                            <td width="120" align="center">操作</td>
                        </tr>
                        <s:iterator value="infoList" status="st">
                            <tr <s:if test="#st.odd"> bgcolor="f8f8f8" </s:if> >
                                <td align="center"><input type="checkbox" name="selectedRow" value="<s:property value='infoId'/>"/></td>
                                <td align="center"><s:property value="title"/></td>
                                <td align="center">
                                	<s:property value="#infoTypeMap[type]"/>	
                                </td>
                                <td align="center"><s:property value="creator"/></td>
                                <td align="center"><s:date name="createTime" format="yyyy-MM-dd HH:mm"/></td>
                                <td id="show_<s:property value='infoId'/>" align="center"><s:property value="state==1?'发布':'停用'"/></td>
                                <td align="center">
                                	<span id="oper_<s:property value="infoId"/>">
                                		<s:if test="state==1">
                                			<a href="javascript:doPublic('<s:property value="infoId" />',0)">停用</a>
                                		</s:if>
                                		<s:else>
                                			<a href="javascript:doPublic('<s:property value="infoId"/>',1)">发布</a>
                                		</s:else>
                                	</span>
                                    <a href="javascript:doEdit('<s:property value='infoId'/>')">编辑</a>
                                    <a href="javascript:doDelete('<s:property value='infoId'/>')">删除</a>
                                </td>
                            </tr>
                        </s:iterator>
                    </table>
                </div>
            </div>
        <div class="c_pate" >
		<table width="100%" class="pageDown" border="0" cellspacing="0"
			cellpadding="0">
			<tr>
				<td align="right">
                 	总共1条记录,当前第 1 页,共 1 页 &nbsp;&nbsp;
                            <a href="#">上一页</a>&nbsp;&nbsp;<a href="#">下一页</a>
					到&nbsp;<input type="text"  onkeypress="if(event.keyCode == 13){doGoPage(this.value);}" min="1"
					max="" value="1" /> &nbsp;&nbsp;
			    </td>
			</tr>
		</table>	
        </div>

        </div>
    </div>
</form>

</body>
</html>

知识点(1):struts中显示时间的标签

<s:date name="createTime" format="yyyy-MM-dd HH:mm"/>

知识点(2):判断与字符串相等

<s:property value="state==1?'发布':'停用'"/>

注意:state的在Java文件中是一个字符串类型

知识点(3):在异步“发布”和“停用”消息的Javascript和HTML标签中的id值

Javascript部分

        //异步发布信息,信息的id及将要改成的信息状态
  		function doPublic(infoId, state){
  			//1、更新信息状态
  			$.ajax({
  				url:"${basePath}/tax/info_publicInfo.action",
  				data:{"info.infoId":infoId,"info.state":state},
  				type:"post",
  				success:function(msg){
  					//2、更新状态栏、操作拦的显示值
  					if("更新状态成功" == msg){
  						if(state == 1){//说明信息状态已经被改成 发布,状态栏显示 发布,操作栏显示 停用
  							$('#show_'+infoId).html("发布");
  							$('#oper_'+infoId).html('<a href="javascript:doPublic(\''+infoId+'\',0)">停用</a>');
  						}
  						else{
  							$('#show_'+infoId).html("停用");
  							$('#oper_'+infoId).html('<a href="javascript:doPublic(\''+infoId+'\',1)">发布</a>');
  						}
  					}
  					else{
  						alert("更新信息状态失败!");
  					}
  				},
  				error:function(){
  					alert("更新信息状态失败!");
  				}
  			});
  		}

HTML部分

<td id="show_<s:property value='infoId'/>" align="center"><s:property value="state==1?'发布':'停用'"/></td>
<td align="center">
	<span id="oper_<s:property value="infoId"/>">
		<s:if test="state==1">
			<a href="javascript:doPublic('<s:property value="infoId" />',0)">停用</a>
		</s:if>
		<s:else>
			<a href="javascript:doPublic('<s:property value="infoId"/>',1)">发布</a>
		</s:else>
	</span>
    <a href="javascript:doEdit('<s:property value='infoId'/>')">编辑</a>
    <a href="javascript:doDelete('<s:property value='infoId'/>')">删除</a>
</td>

6.2、addUI.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <%@include file="/common/header.jsp"%>
    <title>信息发布管理</title>

    <script>
    	
    </script>
</head>
<body class="rightBody">
<form id="form" name="form" action="${basePath}/tax/info_add.action" method="post" enctype="multipart/form-data">
    <div class="p_d_1">
        <div class="p_d_1_1">
            <div class="content_info">
    <div class="c_crumbs"><div><b></b><strong>信息发布管理</strong>&nbsp;-&nbsp;新增信息</div></div>
    <div class="tableH2">新增信息</div>
    <table id="baseInfo" width="100%" align="center" class="list" border="0" cellpadding="0" cellspacing="0"  >
        <tr>
            <td class="tdBg" width="200px">信息分类:</td>
            <td><s:select name="info.type" list="#infoTypeMap"/></td>
            <td class="tdBg" width="200px">来源:</td>
            <td><s:textfield name="info.source"/></td>
        </tr>
        <tr>
            <td class="tdBg" width="200px">信息标题:</td>
            <td colspan="3"><s:textfield name="info.title" cssStyle="width:90%"/></td>
        </tr>
        <tr>
            <td class="tdBg" width="200px">信息内容:</td>
            <td colspan="3"><s:textarea id="editor" name="info.content" cssStyle="width:90%;height:160px;" /></td>
        </tr>
        <tr>
            <td class="tdBg" width="200px">备注:</td>
            <td colspan="3"><s:textarea name="info.memo" cols="90" rows="3"/></td>
        </tr>
        <tr>
            <td class="tdBg" width="200px">创建人:</td>
            <td>
            	<s:property value="#session.SYS_USER.name"/>
            	<s:hidden name="info.creator" value="%{#session.SYS_USER.name}"/>
            </td>
            <td class="tdBg" width="200px">创建时间:</td>
            <td>
             	<s:date name="info.createTime" format="yyyy-MM-dd HH:ss"/>
             	<s:hidden name="info.createTime"/>
            </td>
        </tr>
    </table>
    <!-- 默认信息状态为 发布 -->
    <s:hidden name="info.state" value="1"/>
    <div class="tc mt20">
        <input type="submit" class="btnB2" value="保存" />
        &nbsp;&nbsp;&nbsp;&nbsp;
        <input type="button"  onclick="javascript:history.go(-1)" class="btnB2" value="返回" />
    </div>
    </div></div></div>
</form>
</body>
</html>

知识点(1):时间的显示和隐藏字段

<s:property value="#session.SYS_USER.name"/>
<s:hidden name="info.creator" value="%{#session.SYS_USER.name}"/>

注意一点,在使用<s:hidden>时,我使用下面语句是错误的,只是因为没有加%{},因为我认为value中接受的值都是OGNL表达式,但是它没有正确显示出来(其实,我认为自己的理解是正确的,至于为什么没有显示出来,我不清楚)。

下面是错误的写法:

<s:hidden name="info.creator" value="#session.SYS_USER.name"/>

知识点(2):显示当前时间和隐藏时间字段

<s:date name="info.createTime" format="yyyy-MM-dd HH:ss"/>
<s:hidden name="info.createTime"/>

知识点(3):默认为“发布”状态

    <!-- 默认信息状态为 发布 -->
    <s:hidden name="info.state" value="1"/>

6.3、editUI.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <%@include file="/common/header.jsp"%>
    <title>信息发布管理</title>

    <script>
    	
    </script>
</head>
<body class="rightBody">
<form id="form" name="form" action="${basePath}/tax/info_edit.action" method="post" enctype="multipart/form-data">
    <div class="p_d_1">
        <div class="p_d_1_1">
            <div class="content_info">
    <div class="c_crumbs"><div><b></b><strong>信息发布管理</strong>&nbsp;-&nbsp;修改信息</div></div>
    <div class="tableH2">修改信息</div>
    <table id="baseInfo" width="100%" align="center" class="list" border="0" cellpadding="0" cellspacing="0"  >
        <tr>
            <td class="tdBg" width="200px">信息分类:</td>
            <td><s:select name="info.type" list="#infoTypeMap"/></td>
            <td class="tdBg" width="200px">来源:</td>
            <td><s:textfield name="info.source"/></td>
        </tr>
        <tr>
            <td class="tdBg" width="200px">信息标题:</td>
            <td colspan="3"><s:textfield name="info.title" cssStyle="width:90%"/></td>
        </tr>
        <tr>
            <td class="tdBg" width="200px">信息内容:</td>
            <td colspan="3"><s:textarea id="editor" name="info.content" cssStyle="width:90%;height:160px;" /></td>
        </tr>
        <tr>
            <td class="tdBg" width="200px">备注:</td>
            <td colspan="3"><s:textarea name="info.memo" cols="90" rows="3"/></td>
        </tr>
        <tr>
            <td class="tdBg" width="200px">创建人:</td>
            <td>
            	<s:property value="info.creator"/>
            	<s:hidden name="info.creator"/>            
            </td>
            <td class="tdBg" width="200px">创建时间:</td>
            <td>
              	<s:date name="info.createTime" format="yyyy-MM-dd HH:ss"/>
             	<s:hidden name="info.createTime"/>
            </td>
        </tr>
    </table>
    <s:hidden name="info.infoId"/>
    <s:hidden name="info.state"/>
    <div class="tc mt20">
        <input type="submit" class="btnB2" value="保存" />
        &nbsp;&nbsp;&nbsp;&nbsp;
        <input type="button"  onclick="javascript:history.go(-1)" class="btnB2" value="返回" />
    </div>
    </div></div></div>
</form>
</body>
</html>

知识点(1):在编辑页面,要注意隐藏原来的id和数据状态

    <s:hidden name="info.infoId"/>
    <s:hidden name="info.state"/>

感谢你能够认真阅读完这篇文章,希望小编分享的“SSH如何实现信息发布管理”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

ssh
AI