网络营销企业网站建设_icp备案在哪里办理_精准推广引流5000客源_界面设计是什么意思 第 3 章 本科生毕业论文管理系统总体设计

在分析了项目开发的背景、意义以及其开发的可行性后,接下来就是探讨项目的功能划分,以及具体实现的时候对项目数据库各种表的设计,在本章会做一个系统的介绍。

3.1 系统功能模块设计

系功能模块的设计就是把系统具体要实现哪些功能,功能如何划分做一个系统的架构,以模块图的方式展示出来,方便我们进行功能得罗列以及涉及。在系统的功能方面,项目分成了管理员+学生两个模块,每个模块登录进去对应相应的功能,具体的功能模块图如图3.1所示。

图3.1 本科生毕业论文管理系统功能模块图

3.2 数据库设计

数据库的设计承载者系统的各种数据,在一个系统中各种数据都需要一个专门的容器,数据库就是这个容器,在建立数据库的时候,主要是数据库模型的设计以及各个数据库表的设计两部分。

3.2.1 数据库概念结构设计

本科生毕业论文管理系统的E-R图主要是根据学生以及管理员的实际需求设计的,学生登录以后可以查看课题任务,只有登录以后才可以进行问题交流、论文成绩等;管理员对整个系统的公告、学生用户、论文定稿、毕业资源、学生选题等进行综合管理。本科生毕业论文管理系统采用的是MYSQL的数据库进行存储的,数据库里面储存了很多的表信息,在此罗列出来一些主要的数据库E-R模型图。

图3.2 学生用户E-R关系图

图3.3 论文定稿E-R关系图

图3.4 问题交流E-R关系图

图3.5 通知公告信息E-R关系图

图3.6毕业资源E-R关系图

图3.8 课题任务E-R关系图

图3.9 学生选题E-R关系图

下面是整个本科生毕业论文管理系统中主要的数据库表总E-R实体关系图。

图3.9 本科生毕业论文管理系统总E-R关系图

3.2.2 数据库逻辑结构设计

通过前面E-R关系图可以看到项目需要创建很多个数据表。以下是项目中的主要数据库表的关系模型:

(1)表document_upload实体用来存放文档上传信息中的教师、教师姓名、课题名称、学号、学生姓名、班级名称、文档名称、文档、文档备注、教师批复等;

表3.1 文档上传信息document_upload表

编号

名称

数据类型

长度

小数位

允许空值

主键

默认值

说明

1

document_upload_id

int

10

0

N

Y

文档上传ID

2

teacher

int

10

0

Y

N

0

教师

3

teachers_name

varchar

64

0

Y

N

教师姓名

4

topic_name

varchar

64

0

Y

N

课题名称

5

student_id

int

10

0

Y

N

0

学号

6

student_name

varchar

64

0

Y

N

学生姓名

7

class_name

varchar

64

0

Y

N

班级名称

8

document_name

varchar

64

0

Y

N

文档名称

9

document

varchar

255

0

Y

N

文档

10

document_notes

text

65535

0

Y

N

文档备注

11

teachers_approval

longtext

2147483647

0

Y

N

教师批复

12

recommend

int

10

0

N

N

0

智能推荐

13

create_time

datetime

19

0

N

N

CURRENT_TIMESTAMP

创建时间

14

update_time

timestamp

19

0

N

N

CURRENT_TIMESTAMP

更新时间

(2)表finalized_paper实体用来存放论文定稿信息中的教师、教师姓名、课题名称、学号、学生姓名、论文等;

表3.2 论文定稿信息finalized_paper表

编号

名称

数据类型

长度

小数位

允许空值

主键

默认值

说明

1

finalized_paper_id

int

10

0

N

Y

论文定稿ID

2

teacher

int

10

0

Y

N

0

教师

3

teachers_name

varchar

64

0

Y

N

教师姓名

4

topic_name

varchar

64

0

Y

N

课题名称

5

student_id

int

10

0

Y

N

0

学号

6

student_name

varchar

64

0

Y

N

学生姓名

7

paper

varchar

255

0

Y

N

论文

8

recommend

int

10

0

N

N

0

智能推荐

9

create_time

datetime

19

0

N

N

CURRENT_TIMESTAMP

创建时间

10

update_time

timestamp

19

0

N

N

CURRENT_TIMESTAMP

更新时间

(3)表student_users实体用来存放用户信息中的姓名、学号、专业、班级名称等;

表3.3学生信息student_users表

编号

名称

数据类型

长度

小数位

允许空值

主键

默认值

说明

1

student_users_id

int

10

0

N

Y

学生用户ID

2

student_id

varchar

64

0

Y

N

学号

3

student_name

varchar

64

0

Y

N

学生姓名

4

major

varchar

64

0

Y

N

专业

5

class_name

varchar

64

0

Y

N

班级名称

6

examine_state

varchar

16

0

N

N

已通过

审核状态

7

recommend

int

10

0

N

N

0

智能推荐

8

user_id

int

10

0

N

N

0

用户ID

9

create_time

datetime

19

0

N

N

CURRENT_TIMESTAMP

创建时间

10

update_time

timestamp

19

0

N

N

CURRENT_TIMESTAMP

更新时间

(4)表graduation_project实体用来存放毕业课题中的教师、教师姓名、课题名称、课题类型、状态、研究内容等;

表3.4毕业课题graduation_project表

编号

名称

数据类型

长度

小数位

允许空值

主键

默认值

说明

1

graduation_project_id

int

10

0

N

Y

毕业课题ID

2

teacher

int

10

0

Y

N

0

教师

3

teachers_name

varchar

64

0

Y

N

教师姓名

4

topic_name

varchar

64

0

Y

N

课题名称

5

topic_type

varchar

64

0

Y

N

课题类型

6

state

varchar

64

0

Y

N

状态

7

research_contents

text

65535

0

Y

N

研究内容

8

recommend

int

10

0

N

N

0

智能推荐

9

create_time

datetime

19

0

N

N

CURRENT_TIMESTAMP

创建时间

10

update_time

timestamp

19

0

N

N

CURRENT_TIMESTAMP

更新时间

(5)表graduation_resources实体用来存放系统中毕业资源的资源名称、资源、备注等;

表3.5毕业资源信息graduation_resources表

编号

名称

数据类型

长度

小数位

允许空值

主键

默认值

说明

1

graduation_resources_id

int

10

0

N

Y

毕业资源ID

2

resource_name

varchar

64

0

Y

N

资源名称

3

resource

varchar

255

0

Y

N

资源

4

remarks

text

65535

0

Y

N

备注

5

recommend

int

10

0

N

N

0

智能推荐

6

create_time

datetime

19

0

N

N

CURRENT_TIMESTAMP

创建时间

7

update_time

timestamp

19

0

N

N

CURRENT_TIMESTAMP

更新时间

(6)表outstanding_graduates实体用来存放系统中优秀毕业生的信息,包含了学生姓名、教师、教师姓名、学号、成绩、成绩等级、申请原因等;

表3.6优秀毕业生outstanding_graduates表

编号

名称

数据类型

长度

小数位

允许空值

主键

默认值

说明

1

outstanding_graduates_id

int

10

0

N

Y

优秀毕业生ID

2

student_name

varchar

64

0

Y

N

学生姓名

3

teacher

int

10

0

Y

N

0

教师

4

teachers_name

varchar

64

0

Y

N

教师姓名

5

student_id

int

10

0

Y

N

0

学号

6

achievement

varchar

64

0

Y

N

成绩

7

grade_level

varchar

64

0

Y

N

成绩等级

8

reason_for_application

text

65535

0

Y

N

申请原因

9

examine_state

varchar

16

0

N

N

未审核

审核状态

10

examine_reply

varchar

16

0

Y

N

审核回复

11

recommend

int

10

0

N

N

0

智能推荐

12

create_time

datetime

19

0

N

N

CURRENT_TIMESTAMP

创建时间

13

update_time

timestamp

19

0

N

N

CURRENT_TIMESTAMP

更新时间

(7)表problem_communication实体用来存放系统中问题交流的信息,包含了教师、教师姓名、课题名称、学号、学生姓名、学生提问、教师回复等;

表3.7问题交流problem_communication表

编号

名称

数据类型

长度

小数位

允许空值

主键

默认值

说明

1

problem_communication_id

int

10

0

N

Y

问题交流ID

2

teacher

int

10

0

Y

N

0

教师

3

teachers_name

varchar

64

0

Y

N

教师姓名

4

topic_name

varchar

64

0

Y

N

课题名称

5

student_id

int

10

0

Y

N

0

学号

6

student_name

varchar

64

0

Y

N

学生姓名

7

student_questioning

text

65535

0

Y

N

学生提问

8

teacher_response

text

65535

0

Y

N

教师回复

9

recommend

int

10

0

N

N

0

智能推荐

10

create_time

datetime

19

0

N

N

CURRENT_TIMESTAMP

创建时间

教师11

update_time

timestamp

19

0

N

N

CURRENT_TIMESTAMP

更新时间

(8)表project_tasks实体用来存放系统中课题任务的信息,包含了教师、教师姓名、课题名称、学号、学生姓名、班级名称、相关附件、任务内容等;

表3.8课题任务project_tasks表

编号

名称

数据类型

长度

小数位

允许空值

主键

默认值

说明

1

project_tasks_id

int

10

0

N

Y

课题任务ID

2

teacher

int

10

0

Y

N

0

教师

3

teachers_name

varchar

64

0

Y

N

教师姓名

4

topic_name

varchar

64

0

Y

N

课题名称

5

student_id

int

10

0

Y

N

0

学号

6

student_name

varchar

64

0

Y

N

学生姓名

7

class_name

varchar

64

0

Y

N

班级名称

8

task_name

varchar

64

0

Y

N

任务名称

9

related_attachments

varchar

255

0

Y

N

相关附件

10

task_content

text

65535

0

Y

N

任务内容

11

recommend

int

10

0

N

N

0

智能推荐

12

create_time

datetime

19

0

N

N

CURRENT_TIMESTAMP

创建时间

13

update_time

timestamp

19

0

N

N

CURRENT_TIMESTAMP

更新时间

(9)表notice_announcement通知公告实体用来存放系统中通知公告的信息,包含了标题、发布人、发布时间、内容、相关附件等;

表3.8通知公告信息notice_announcement表

编号

名称

数据类型

长度

小数位

允许空值

主键

默认值

说明

1

notice_announcement_id

int

10

0

N

Y

通知公告ID

2

title

varchar

64

0

Y

N

标题

3

publisher

varchar

64

0

Y

N

发布人

4

published_on

date

10

0

Y

N

发布时间

5

relevant_attachments

varchar

255

0

Y

N

相关附件

6

content

text

65535

0

Y

N

内容

7

recommend

int

10

0

N

N

0

智能推荐

8

create_time

datetime

19

0

N

N

CURRENT_TIMESTAMP

创建时间

9

update_time

timestamp

19

0

N

N

CURRENT_TIMESTAMP

更新时间

(10)表student_topic_selection实体用来存放系统中学生选题的信息,包含了教师、教师姓名、课题名称、学号、学生姓名、班级名称、选题原因等;

表3.10学生选题student_topic_selection表

编号

名称

数据类型

长度

小数位

允许空值

主键

默认值

说明

1

student_topic_selection_id

int

10

0

N

Y

学生选题ID

2

teacher

int

10

0

Y

N

0

教师

3

teachers_name

varchar

64

0

Y

N

教师姓名

4

topic_name

varchar

64

0

Y

N

课题名称

5

student_id

int

10

0

Y

N

0

学号

6

student_name

varchar

64

0

Y

N

学生姓名

7

class_name

varchar

64

0

Y

N

班级名称

8

reason_for_selecting_the_topic

text

65535

0

Y

N

选题原因

9

examine_state

varchar

16

0

N

N

未审核

审核状态

10

examine_reply

varchar

16

0

Y

N

审核回复

11

recommend

int

10

0

N

N

0

智能推荐

12

create_time

datetime

19

0

N

N

CURRENT_TIMESTAMP

创建时间

13

update_time

timestamp

19

0

N

N

CURRENT_TIMESTAMP

更新时间

第 4 章 关键模块的设计与实现

4.1 登录模块

管理员、教师和学生在登录界面输入账号+密码,点击“登录”按钮,系统在用户数据库表中会对管理员和用户的账号进行匹配,账号+密码正确的话,就会登录到系统中各个用户的主管理界面,否则提示对应的信息,返回到登录的界面,其主界面展示如下图4.1所示。

图4.1 登录界面图

登录的逻辑代码如下所示。

/**

     * 登录

     * @param data

     * @param httpServletRequest

     * @return

     */

    @PostMapping("login")

    public Map<String, Object> login(@RequestBody Map<String, String> data, HttpServletRequest httpServletRequest) {

        log.info("[执行登录接口]");

        String username = data.get("username");

        String email = data.get("email");

        String phone = data.get("phone");

        String password = data.get("password");

        List resultList = null;

        QueryWrapper wrapper = new QueryWrapper<User>();

        Map<String, String> map = new HashMap<>();

        if(username != null && "".equals(username) == false){

            map.put("username", username);

            resultList = service.selectBaseList(service.select(map, new HashMap<>()));

        }

        else if(email != null && "".equals(email) == false){

            map.put("email", email);

            resultList = service.selectBaseList(service.select(map, new HashMap<>()));

        }

        else if(phone != null && "".equals(phone) == false){

            map.put("phone", phone);

            resultList = service.selectBaseList(service.select(map, new HashMap<>()));

        }else{

            return error(30000, "账号或密码不能为空");

        }

        if (resultList == null || password == null) {

            return error(30000, "账号或密码不能为空");

        }

        //判断是否有这个用户

        if (resultList.size()<=0){

            return error(30000,"用户不存在");

        }

        User byUsername = (User) resultList.get(0);

        Map<String, String> groupMap = new HashMap<>();

        groupMap.put("name",byUsername.getUserGroup());

        List groupList = userGroupService.selectBaseList(userGroupService.select(groupMap, new HashMap<>()));

        if (groupList.size()<1){

            return error(30000,"用户组不存在");

        }

        UserGroup userGroup = (UserGroup) groupList.get(0);

        //查询用户审核状态

        if (!StringUtils.isEmpty(userGroup.getSourceTable())){

            String res = service.selectExamineState(userGroup.getSourceTable(),byUsername.getUserId());

            if (res==null){

                return error(30000,"用户不存在");

            }

            if (!res.equals("已通过")){

                return error(30000,"该用户审核未通过");

            }

        }

        //查询用户状态

        if (byUsername.getState()!=1){

            return error(30000,"用户非可用状态,不能登录");

        }

        String md5password = service.encryption(password);

        if (byUsername.getPassword().equals(md5password)) {

            // 存储Token到数据库

            AccessToken accessToken = new AccessToken();

            accessToken.setToken(UUID.randomUUID().toString().replaceAll("-", ""));

            accessToken.setUser_id(byUsername.getUserId());

            tokenService.save(accessToken);

            // 返回用户信息

            JSONObject user = JSONObject.parseObject(JSONObject.toJSONString(byUsername));

            user.put("token", accessToken.getToken());

            JSONObject ret = new JSONObject();

            ret.put("obj",user);

            return success(ret);

        } else {

            return error(30000, "账号或密码不正确");

        }

}

    public String select(Map<String,String> query,Map<String,String> config){

        StringBuffer sql = new StringBuffer("select ");

        sql.append(config.get(FindConfig.FIELD) == null || "".equals(config.get(FindConfig.FIELD)) ? "*" : config.get(FindConfig.FIELD)).append(" ");

        sql.append("from ").append("`").append(table).append("`").append(toWhereSql(query, "0".equals(config.get(FindConfig.LIKE))));

        if (config.get(FindConfig.GROUP_BY) != null && !"".equals(config.get(FindConfig.GROUP_BY))){

            sql.append("group by ").append(config.get(FindConfig.GROUP_BY)).append(" ");

        }

        if (config.get(FindConfig.ORDER_BY) != null && !"".equals(config.get(FindConfig.ORDER_BY))){

            sql.append("order by ").append(config.get(FindConfig.ORDER_BY)).append(" ");

        }

        if (config.get(FindConfig.PAGE) != null && !"".equals(config.get(FindConfig.PAGE))){

            int page = config.get(FindConfig.PAGE) != null && !"".equals(config.get(FindConfig.PAGE)) ? Integer.parseInt(config.get(FindConfig.PAGE)) : 1;

            int limit = config.get(FindConfig.SIZE) != null && !"".equals(config.get(FindConfig.SIZE)) ? Integer.parseInt(config.get(FindConfig.SIZE)) : 10;

            sql.append(" limit ").append( (page-1)*limit ).append(" , ").append(limit);

        }

        log.info("[{}] - 查询操作,sql: {}",table,sql);

        return sql.toString();

}

    public List selectBaseList(String select) {

        List<Map<String,Object>> mapList = baseMapper.selectBaseList(select);

        List<E> list = new ArrayList<>();

        for (Map<String,Object> map:mapList) {

            list.add(JSON.parseObject(JSON.toJSONString(map),eClass));

        }

        return list;

}

4.2 用户管理模块

管理员可以对系统中所有的用户角色进行管控,包含了管理员、教师以及学生这三种角色,如果需要添加新的用户,点击页面中的“添加”按钮根据提示输入上用户信息,点击“提交”以后在对应的用户界面就可以查看到了,可以点击用户后面的“删除”按钮直接删除某一用户,这里以学生用户为例。界面如下图4.2所示。

图4.2 用户管理界面图

用户管理界面逻辑代码如下:

@PostMapping("/add")

    @Transactional

    public Map<String, Object> add(HttpServletRequest request) throws IOException {

        service.insert(service.readBody(request.getReader()));

        return success(1);

    }

    @Transactional

    public Map<String, Object> addMap(Map<String,Object> map){

        service.insert(map);

        return success(1);

}

4.3 毕业课题模块

点击“毕业课题”这个菜单,可以查看到系统中所有添加的毕业课题,支持通过教师姓名或者课题名称对毕业课题进行查询,如果想要了解某一毕业课题的详细信息,点击后面的“详情”会进入详情界面,学生和管理员如果想要选择某一毕业课题,点击“选题”按钮,根据提示填写对应的信息,点击“提交”按钮,信息没有错误在数据库就会提交成功,选题成功。界面如下图4.3所示。

图4.3 毕业课题界面图

4.4 课题任务模块

管理员和学生点击“课题任务”这个按钮可以查看到系统中的课题任务信息,支持通过教师姓名或者课题名称进行查询课题任务信息,如果想要添加新的课题任务信息,点击“添加”按钮然后根据提示输入课题任务信息,点击“提交”后,在课题任务界面就会显示新增的课题任务信息,可以点击某一课题任务信息查看课题任务信息的详情,也可以直接点击“删除”进行删除课题任务。界面如下图4.4所示。

图4.4 课题任务界面图

课题任务管理的逻辑代码如下:

  @RequestMapping("/get_obj")

    public Map<String, Object> obj(HttpServletRequest request) {

        List resultList = service.selectBaseList(service.select(service.readQuery(request), service.readConfig(request)));

        if (resultList.size() > 0) {

            JSONObject jsonObject = new JSONObject();

            jsonObject.put("obj",resultList.get(0));

            return success(jsonObject);

        } else {

            return success(null);

        }

}

4.5 毕业资源模块

管理员和学生点击“毕业资源”这个按钮可以查看到系统中的毕业资源信息,支持通过资源名称或者资源进行查询毕业资源信息,如果想要添加新的毕业资源信息,点击“添加”按钮然后根据提示输入毕业资源信息,点击“提交”后,在毕业资源界面就会显示新增的毕业资源信息,可以点击某一毕业资源信息查看毕业资源信息的详情,也可以直接点击“删除”进行删除毕业资源。界面如下图4.5所示。

图4.5 毕业资源界面图

毕业资源界面逻辑代码如下:

@RequestMapping(value = "/del")

    @Transactional

    public Map<String, Object> del(HttpServletRequest request) {

        service.delete(service.readQuery(request), service.readConfig(request));

        return success(1);

}

4.6 论文定稿模块

点击“论文定稿”这个按钮可以查看到自己提交的论文定稿,支持通过教师姓名或者课题名称进行查询论文定稿,如果想要了解某一论文定稿的详细信息,点击后面的“查看”会进入详情界面,也支持对自己选择的论文定稿进行删除;教师和管理员可以对学生提交的论文定稿进行成绩添加,选择某一论文定稿,点击后面的“成绩”按钮,根据提示输入对应的信息,点击“提交”后,成绩就录入成功了。界面如下图4.6所示。

图4.6 论文定稿界面图

4.7 论文成绩模块

点击“论文成绩”这个按钮可以查看到自己所有的论文的成绩,支持通过静教师姓名或者成绩等级进行查询论文成绩信息,管理员和教师可以对所添加的论文成绩进行删除。界面如下图4.7所示。

图4.7 论文成绩界面图

4.8 通知公告模块

点击“通知公告”这个菜单,可以查看到系统中所有添加的通知公告信息,支持通过标题或者发布时间对通知公告信息进行查询,只有管理员用户可以添加新的通知公告,点击“添加”按钮,根据提示输入通知公告信息,点击“提交”按钮,新的通知公告信息就在系统中显示出来了,也可以对添加的通知公告信息进行删除。界面如下图4.8所示。

图4.8 通知公告界面图

通知公告界面逻辑代码如下:

 @PostMapping("/add")

    @Transactional

    public Map<String, Object> add(HttpServletRequest request) throws IOException {

        service.insert(service.readBody(request.getReader()));

        return success(1);

    }

    @Transactional

    public Map<String, Object> addMap(Map<String,Object> map){

        service.insert(map);

        return success(1);

}

第 5 章 系统实验与结果分析

5.1 测试的目的

通过前面章节的介绍,我们可以看到本本科生毕业论文管理系统已经完成了,但是能不能投入使用还是未知,因为在每个项目正式使用之前必须对开发的项目进行测试,如果不进行测试一旦投入使用可能会出现很多未可知的问题,比如使用人数太多导致系统瘫痪,比如某一功能存在bug信息填写错误等等,这些错误将给使用者带来很多的困扰,甚至造成更大的损失,因此测试是项目投入使用的最后一步,为用户提供一个运行顺畅、完美的项目也就是我们进行最后测试的目的。

5.2 系统部分测试

用户登录功能测试:

表5.1 用户登录功能测试表

测试名称

测试功能

操作过程

预期结果

测试结果

用户登录模块测试

用户登录成功的情况

点击前登录界面输入账号和密码分别输入admin和admin后点击“登录”按钮。

登录成功并调整到用户界面

正确

文档上传信息添加功能测试:

表5.2 文档上传信息添加功能测试表

测试名称

测试功能

操作过程

预期结果

测试结果

文档上传添加模块测试

文档上传添加成功的情况

在文档上传的页面中将点击添加,输入文档上传关信息,输入正确的信息后然后点击“提交”按钮。

提示添加成功

正确

文档上传添加模块测试

文档上传添加失败的情况

在文档上传页面中不填写的教师、教师姓名,其他信息正常输入“提交”按钮。

提示“添加失败,信息不能为空”

正确

查询论文定稿信息功能模块测试:

表5.3 查询论文定稿信息功能测试表

测试名称

测试功能

操作过程

预期结果

测试结果

查询论文定稿信息功能测试

查询成功的情况

在论文定稿界面输入教师或者教师姓名进行查询

查询成功

正确

毕业课题信息添加功能测试:

表5.4 毕业课题添加功能测试表

测试名称

测试功能

操作过程

预期结果

测试结果

毕业课题添加模块测试

毕业课题添加成功的情况

在毕业课题的页面中将点击添加,输入毕业课题相关信息,输入正确的信息后然后点击“提交”按钮。

提示添加成功

正确

毕业课题添加模块测试

毕业课题添加失败的情况

在毕业课题页面中不填写的区域,其他信息正常输入“提交”按钮。

提示“添加失败,信息不能为空”

正确

5.3 系统测试结果

通过编写本科生毕业论文管理系统的测试用例,已经检测完毕用户的登录模块、文档上传信息添加模块、查询论文定稿模块、毕业课题添加模块的功能测试,在对以上功能得测试过程中,发现了系统中的很多漏送并进行了完善,经过多人在线进行测试,系统完全可以正常运行,当然在后期的维护中系统将不断完善。

第 6 章 结论

">

中国商标网入口

用手机怎么制作app、用html设计一个疫情网页代码、永久使用、不限域名、微信小程序是什么东西

武汉基础建设公司?

网络营销企业网站建设_icp备案在哪里办理_精准推广引流5000客源_界面设计是什么意思

    </#list>

国内做网站做的好的公司动漫培训学费一般多少南宁网页制作设计西安市建设工程信息网诚信信息平台美国亚马逊网站品牌查询官网入口泉州专业网站建设公司企业网银转账怎么操作室内装修设计软件app排行网页制作大宝库gif品质好房可月付深圳服装品牌公司大全通州网页设计安徽seo网站靠谱汕头排名推广国外虚拟主机快看点自媒体平台注册官网微信朋友圈产品推广语苏州模板建站软件上海园区免费注册地址南京事件最新消息广州品牌设计公司有哪些windows 网络服务启动6元虚拟主机合肥网络推广定制网页设计字体规范网站设计建设公司方案注册公司都需要什么费用可以赚钱的网站学网站建设与管理专业能做什么优秀摄影作品网站

猜你喜欢

  • 友情链接:
  • 网络平台维护包括哪些工作 企业管理系统化指什么 东南亚跨境电商平台排名 大连seo招聘 招聘网最新招聘2024 广告设计是什么专业