广告
返回顶部
首页 > 资讯 > 数据库 >mysql动态增添字段怎么实现
  • 408
分享到

mysql动态增添字段怎么实现

2023-07-06 13:07:13 408人浏览 独家记忆
摘要

今天小编给大家分享的是mysql动态增添字段怎么实现,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。目录数据库mybatis逆向工程新建SpringBoot项目遇到的问题总结数据库--

今天小编给大家分享的是mysql动态增添字段怎么实现,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。

目录

数据库

--用户表CREATE TABLE `users`  (  `id` int(11) NOT NULL AUTO_INCREMENT,  `account` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,  `passWord` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'E10ADC3949BA59ABBE56E057F20F883E',  `propertyId` int(11) NOT NULL DEFAULT -1,  PRIMARY KEY (`id`) USING BTREE) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;--属性表CREATE TABLE `property`  (  `id` int(11) NOT NULL AUTO_INCREMENT,  `uid` int(11) NOT NULL,  `key` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,  `value` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,  PRIMARY KEY (`id`) USING BTREE) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

mybatis逆向工程

1.使用idea新建maven项目,pom内容如下:

<?xml version="1.0" encoding="UTF-8"?><project xmlns="Http://Maven.apache.org/POM/4.0.0"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>    <groupId>top.changelife</groupId>    <artifactId>mybatis-generator</artifactId>    <version>1.0-SNAPSHOT</version>    <dependencies>        <dependency>            <groupId>org.mybatis.generator</groupId>            <artifactId>mybatis-generator-core</artifactId>            <version>1.3.6</version>        </dependency>        <dependency>            <groupId>Mysql</groupId>            <artifactId>mysql-connector-java</artifactId>            <version>5.1.35</version>        </dependency>    </dependencies>    <build>        <plugins>            <plugin>                <groupId>org.mybatis.generator</groupId>                <artifactId>mybatis-generator-maven-plugin</artifactId>                <version>1.3.6</version>                <configuration>                    <verbose>true</verbose>                    <overwrite>true</overwrite>                </configuration>            </plugin>        </plugins>    </build></project>

2.在src/main/resource目录下新建geoneratorConfig.xml文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE generatorConfiguration        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"><generatorConfiguration>    <classPathEntry            location="C:/Users/35152/.m2/repository/mysql/mysql-connector-java/5.1.35/mysql-connector-java-5.1.35.jar"/>    <context id="mysqlTables">        <plugin type="org.mybatis.generator.plugins.SerializablePlugin"></plugin>        <plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin"></plugin>        <plugin type="org.mybatis.generator.plugins.ToStringPlugin"></plugin>        <commentGenerator>            <!-- 是否去除自动生成的注释 true:是 : false:否 -->            <property name="suppressAllComments" value="true"/>        </commentGenerator>        <!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->        <jdbcConnection driverClass="com.mysql.jdbc.Driver"                        connectionURL="jdbc:mysql://localhost:3306/test" userId="root"                        password="123456">        </jdbcConnection>        <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和            NUMERIC 类型解析为java.math.BigDecimal -->        <javaTypeResolver>            <property name="forceBigDecimals" value="false"/>        </javaTypeResolver>        <!-- targetProject:生成PO类的位置 -->        <javaModelGenerator targetPackage="top.changelife.dynamicproperty.model"                            targetProject="./src/main/java">            <!-- enableSubPackages:是否让schema作为包的后缀 -->            <property name="enableSubPackages" value="false"/>            <!-- 从数据库返回的值被清理前后的空格 -->            <property name="trimStrings" value="true"/>        </javaModelGenerator>        <!-- targetProject:mapper映射文件生成的位置 -->        <sqlMapGenerator targetPackage="top.changelife.dynamicproperty.mapper"                         targetProject="./src/main/java">            <!-- enableSubPackages:是否让schema作为包的后缀 -->            <property name="enableSubPackages" value="false"/>        </sqlMapGenerator>        <!-- targetPackage:mapper接口生成的位置 -->        <javaClientGenerator type="XMLMAPPER"                             targetPackage="top.changelife.dynamicproperty.dao"                             targetProject="./src/main/java">            <!-- enableSubPackages:是否让schema作为包的后缀 -->            <property name="enableSubPackages" value="false"/>        </javaClientGenerator>        <!-- 指定数据库表 -->        <table tableName="users" domainObjectName="Users" schema="public" enableCountByExample="false"               enableDeleteByExample="false" enableUpdateByExample="false"               enableSelectByExample="false" selectByExampleQueryId="false"></table>    </context></generatorConfiguration>

这里需要重点注意的不是数据库的连接信息的填写,这个用过jdbc的你想必是没有问题的,重点要关注的是classPathEntry,不要以为在pom里面配置了连接mysql的jar包就万事大吉,这里一定要指定你电脑上jar包所在的绝对地址才行。

3.指定运行方式

工具Run&ndash;>Edit Configurations&ndash;>+&ndash;>Maven

mysql动态增添字段怎么实现

Command line : mybatis-generator:generate -e

设置完成后点OK,然后就可以运行了。

新建springboot项目

使用idea新建springboot项目 File&ndash;>New&ndash;>Project&ndash;>Spring Initializr&hellip;&hellip;这里比较简单,就不细说了。

在pom.xml中引入相关依赖:

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>    <groupId>top.changelife</groupId>    <artifactId>dynamic-property</artifactId>    <version>0.0.1-SNAPSHOT</version>    <packaging>jar</packaging>    <name>dynamic-property</name>    <description>mysql实现动态属性配置</description>    <parent>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-parent</artifactId>        <version>2.0.3.RELEASE</version>        <relativePath/>    </parent>    <properties>        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>        <java.version>1.8</java.version>    </properties>    <dependencies>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-WEB</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-test</artifactId>            <scope>test</scope>        </dependency>        <dependency>            <groupId>mysql</groupId>            <artifactId>mysql-connector-java</artifactId>            <version>5.1.35</version>        </dependency>        <dependency>            <groupId>org.mybatis.spring.boot</groupId>            <artifactId>mybatis-spring-boot-starter</artifactId>            <version>1.3.0</version>        </dependency>    </dependencies>    <build>        <plugins>            <plugin>                <groupId>org.springframework.boot</groupId>                <artifactId>spring-boot-maven-plugin</artifactId>            </plugin>        </plugins>    </build></project>

我这里使用mybatis连接数据库,需要在application.properties中进行配置:

spring.datasource.driverClassName=com.mysql.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:3306/test?username=rootspring.datasource.username=rootspring.datasource.password=1314mybatis.mapper-locations=classpath:mapper/*Mapper.xmlmybatis.config-location=classpath:mapper/config/sqlMapperConfig.xml

程序目录结构如下:

mysql动态增添字段怎么实现

下面陆续贴出相关代码,如对springboot和mybatis不甚了解,可查阅相关资料。

sqlMapperConfig.xml

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"        "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration>    <typeAliases>        <typeAlias alias="users" type="top.changelife.dynamicproperty.model.Users"/>        <typeAlias alias="property" type="top.changelife.dynamicproperty.model.Property"/>    </typeAliases></configuration>

PropertyMapper.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="top.changelife.dynamicproperty.dao.PropertyMapper">    <insert id="insert" keyProperty="id" useGeneratedKeys="true" parameterType="java.util.List">        insert into property (uid, property.key,property.value) values        <foreach collection="list" item="property" separator=",">            (#{property.uid,jdbcType=INTEGER},            #{property.key,jdbcType=VARCHAR}, #{property.value,jdbcType=VARCHAR})        </foreach>    </insert></mapper>

UsersMapper.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="top.changelife.dynamicproperty.dao.UsersMapper">    <resultMap id="UserResultMap" type="users">        <id property="id" column="id"/>        <result column="account" jdbcType="VARCHAR" property="account"/>        <result column="password" jdbcType="VARCHAR" property="password"/>        <result column="propertyId" jdbcType="INTEGER" property="propertyId"/>        <collection property="list" ofType="property">            <id column="property_id" jdbcType="INTEGER" property="id"/>            <result column="uid" jdbcType="INTEGER" property="uid"/>            <result column="key" jdbcType="VARCHAR" property="key"/>            <result column="value" jdbcType="VARCHAR" property="value"/>        </collection>    </resultMap>    <select id="selectAll" resultMap="UserResultMap">        SELECT         u.id AS id,u.account AS account,u.password AS PASSWORD,u.propertyId as propertyId,         p.id AS property_id,p.uid as uid,p.key AS 'key',p.value AS 'value'         FROM users u,property p WHERE u.propertyid = p.uid    </select>    <insert id="insert" keyProperty="id" useGeneratedKeys="true" parameterType="users">    insert into users (account, password, propertyId)    values (#{account,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}, #{propertyId,jdbcType=INTEGER})  </insert></mapper>

Users

package top.changelife.dynamicproperty.model;import java.io.Serializable;import java.util.List;public class Users implements Serializable {    private Integer id;    private String account;    private String password;    private Integer propertyId;    private List<Property> list;    private static final long serialVersionUID = 1L;    public Integer getId() {        return id;    }    public void setId(Integer id) {        this.id = id;    }    public String getAccount() {        return account;    }    public void setAccount(String account) {        this.account = account == null ? null : account.trim();    }    public String getPassword() {        return password;    }    public void setPassword(String password) {        this.password = password == null ? null : password.trim();    }    public Integer getPropertyId() {        return propertyId;    }    public void setPropertyId(Integer propertyId) {        this.propertyId = propertyId;    }    public List<Property> getList() {        return list;    }    public void setList(List<Property> list) {        this.list = list;    }    @Override    public boolean equals(Object that) {        if (this == that) {            return true;        }        if (that == null) {            return false;        }        if (getClass() != that.getClass()) {            return false;        }        Users other = (Users) that;        return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))                && (this.getAccount() == null ? other.getAccount() == null : this.getAccount().equals(other.getAccount()))                && (this.getPassword() == null ? other.getPassword() == null : this.getPassword().equals(other.getPassword()))                && (this.getPropertyId() == null ? other.getPropertyId() == null : this.getPropertyId().equals(other.getPropertyId()));    }    @Override    public int hashCode() {        final int prime = 31;        int result = 1;        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());        result = prime * result + ((getAccount() == null) ? 0 : getAccount().hashCode());        result = prime * result + ((getPassword() == null) ? 0 : getPassword().hashCode());        result = prime * result + ((getPropertyId() == null) ? 0 : getPropertyId().hashCode());        return result;    }    @Override    public String toString() {        StringBuilder sb = new StringBuilder();        sb.append(getClass().getSimpleName());        sb.append(" [");        sb.append("Hash = ").append(hashCode());        sb.append(", id=").append(id);        sb.append(", account=").append(account);        sb.append(", password=").append(password);        sb.append(", propertyid=").append(propertyId);        sb.append(", list=").append(list);        sb.append(", serialVersionUID=").append(serialVersionUID);        sb.append("]");        return sb.toString();    }}

Property

package top.changelife.dynamicproperty.model;import java.io.Serializable;public class Property implements Serializable {    private Integer id;    private Integer uid;    private String key;    private String value;    private static final long serialVersionUID = 1L;    public Integer getId() {        return id;    }    public void setId(Integer id) {        this.id = id;    }    public Integer getUid() {        return uid;    }    public void setUid(Integer uid) {        this.uid = uid;    }    public String geTKEy() {        return key;    }    public void setKey(String key) {        this.key = key == null ? null : key.trim();    }    public String getValue() {        return value;    }    public void setValue(String value) {        this.value = value == null ? null : value.trim();    }    @Override    public boolean equals(Object that) {        if (this == that) {            return true;        }        if (that == null) {            return false;        }        if (getClass() != that.getClass()) {            return false;        }        Property other = (Property) that;        return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))                && (this.getUid() == null ? other.getUid() == null : this.getUid().equals(other.getUid()))                && (this.getKey() == null ? other.getKey() == null : this.getKey().equals(other.getKey()))                && (this.getValue() == null ? other.getValue() == null : this.getValue().equals(other.getValue()));    }    @Override    public int hashCode() {        final int prime = 31;        int result = 1;        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());        result = prime * result + ((getUid() == null) ? 0 : getUid().hashCode());        result = prime * result + ((getKey() == null) ? 0 : getKey().hashCode());        result = prime * result + ((getValue() == null) ? 0 : getValue().hashCode());        return result;    }    @Override    public String toString() {        StringBuilder sb = new StringBuilder();        sb.append(getClass().getSimpleName());        sb.append(" [");        sb.append("Hash = ").append(hashCode());        sb.append(", id=").append(id);        sb.append(", uid=").append(uid);        sb.append(", key=").append(key);        sb.append(", value=").append(value);        sb.append(", serialVersionUID=").append(serialVersionUID);        sb.append("]");        return sb.toString();    }}

UserController

package top.changelife.dynamicproperty.controller;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RestController;import top.changelife.dynamicproperty.dao.PropertyMapper;import top.changelife.dynamicproperty.dao.UsersMapper;import top.changelife.dynamicproperty.model.Property;import top.changelife.dynamicproperty.model.Users;import java.util.List;@RestControllerpublic class UserController {    @Autowired    UsersMapper usersMapper;    @Autowired    PropertyMapper propertyMapper;    @GetMapping("/users")    public Object selectAllUsers() {        return usersMapper.selectAll();    }    @PostMapping("/users")    public Object insertUsers(@RequestBody Users user) {        List<Property> list = user.getList();//        System.out.println(list);        propertyMapper.insert(list);        usersMapper.insert(user);        return user;    }}

代码就这么多,下面启动项目进行测试,我这里使用Postman进行接口测试。

mysql动态增添字段怎么实现

前段可以随意增添list中的属性个数,达到动态增添字段的效果。

这里做得比较简单,实际使用中可以另建一张表,用来存储必备的字段,每次新增的时候都将必备的字段取出来让用户填写,然后其他的再自定义。

遇到的问题

在写这个demo以前,思路是很清晰的,没想到还是遇到不少的问题,首先就是application.properties中配置数据库出错,spring.datasource.username写错了,导致数据库连接获取不到,报错却为Access denied for user ''@'localhost',找了很久才发现原来是自己粗心导致。

还有就是无论何时,定义了带参数的构造函数,一定要将无参构造函数写上,免得后期出错。

关于mysql动态增添字段怎么实现就分享到这里了,希望以上内容可以对大家有一定的参考价值,可以学以致用。如果喜欢本篇文章,不妨把它分享出去让更多的人看到。

您可能感兴趣的文档:

--结束END--

本文标题: mysql动态增添字段怎么实现

本文链接: https://www.lsjlt.com/news/358575.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • mysql动态增添字段怎么实现
    今天小编给大家分享的是mysql动态增添字段怎么实现,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。目录数据库mybatis逆向工程新建springboot项目遇到的问题总结数据库--...
    99+
    2023-07-06
  • mysql之动态增添字段实现方式
    目录数据库mybatis逆向工程新建springboot项目遇到的问题总结数据库 --用户表 CREATE TABLE `users` ( `id` int(11) NOT N...
    99+
    2023-05-20
    mysql动态增添字段 mysql增添字段 mysql字段增添
  • java 动态添加字段 以及 动态新增字段注解
    本文是从别的文章作为基础进行创建的,方便自己进行相关操作。 引入依赖 javassist javassist 3.12.1.GA 我这里创建了一个空的对象 public class CitiesVo {} 创建...
    99+
    2023-08-22
    java 开发语言 spring
  • mysql怎样实现增加字段
    这篇文章主要为大家展示了“mysql怎样实现增加字段”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“mysql怎样实现增加字段”这篇文章吧。 ...
    99+
    2022-10-19
  • mysql怎么增加表字段
    要在MySQL中增加表字段,可以使用ALTER TABLE语句。 下面是一个示例,展示如何向表中添加一个名为new_column的字...
    99+
    2023-10-24
    mysql
  • JDBC怎么获取Mysql自动增长字段
    本篇内容介绍了“JDBC怎么获取Mysql自动增长字段”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! M...
    99+
    2022-10-18
  • MySQL中怎么添加字段
    这期内容当中小编将会给大家带来有关MySQL中怎么添加字段,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。  MySQL字段的长度有哪些  数值类型  列类型需要的存储量 ...
    99+
    2022-10-18
  • MySQL表怎么创建自增字段
    本篇内容介绍了“MySQL表怎么创建自增字段”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!注:如果使用新的...
    99+
    2022-10-19
  • redis集合字段递增怎么实现
    在 Redis 中,可以使用 `INCRBY` 命令来递增一个集合字段的值。但需要注意的是,Redis 中的集合是无序的,每个元素都...
    99+
    2023-09-04
    redis
  • mysql实现向某个字段前或后添加字符
    目录mysql向某个字段前或后添加字符mysql更新字段时,在末尾添加新字符串使用concat函数使用IFNULL函数补充其他concat的函数mysql向某个字段前或后添加字符 使用concat 方法即可。可以先尝试...
    99+
    2022-09-24
  • go结构体动态添加字段的方法是什么
    在Go语言中,结构体是一种固定字段的数据类型,无法动态添加字段。这是因为Go语言是静态类型语言,所有的变量和字段必须在编译时确定。如...
    99+
    2023-10-10
    go
  • mysql实现表内增加一个字段并赋值
    目录mysql表内增加一个字段并赋值mysql表加一字段并对现有记录赋值mysql表内增加一个字段并赋值 将spider增加source_pic字段并赋值为url字段 update spider a INNER...
    99+
    2022-09-24
  • AngularJS怎么实现动态添加Option
    这篇文章主要为大家展示了“AngularJS怎么实现动态添加Option”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“AngularJS怎么实现动态添加Opti...
    99+
    2022-10-19
  • golangjsoniterextension处理动态字段的实现方法
    目录1. 背景2. 可选项总结1. 背景 golang 原生 json 包,在处理 json 对象的字段的时候,是需要严格匹配类型的。但是,实际上,当我们与一些老系统或者脚本语言的系...
    99+
    2023-05-14
    go json动态字段 go 动态字段 go jsoniter extension
  • mysql数据表和字段怎么添加注释?
    mysql创建带解释的表并给表和字段添加注释的具体步骤:1、创建带解释的表CREATE TABLE test_table(   t_id INT(11) PRIMARY KEY AUTO_INCREMEN...
    99+
    2022-10-18
  • Vue怎么动态生成数据字段
    本篇内容主要讲解“Vue怎么动态生成数据字段”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue怎么动态生成数据字段”吧!动态生成数据字段实例1.父组件定义data里面的数据字段异步请求获取数据...
    99+
    2023-06-29
  • golang jsoniter extension怎么处理动态字段
    这篇文章主要讲解了“golang jsoniter extension怎么处理动态字段”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“golang jsonite...
    99+
    2023-07-05
  • mysql字段去重查询怎么实现
    要实现MySQL字段的去重查询,可以使用DISTINCT关键字。可以按照以下步骤进行操作:1. 使用SELECT语句查询需要...
    99+
    2023-09-13
    mysql
  • mysql创建表添加字段注释的实现方法
    直接po代码和案例 #创建表的时候写注释 CREATE TABLE userinfo( id INT COMMENT '编号', uname VARCHAR(40) COMMENT '用户名', a...
    99+
    2022-05-20
    mysql添加字段注释 mysql 字段注释
  • vue怎么实现动态添加el-input
    本文小编为大家详细介绍“vue怎么实现动态添加el-input”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue怎么实现动态添加el-input”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、效果图二、实现...
    99+
    2023-07-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作