当前位置: 移动技术网 > IT编程>开发语言>.net > 基于.net EF6 MVC5+WEB Api 的Web系统框架总结(2)-业务项目搭建

基于.net EF6 MVC5+WEB Api 的Web系统框架总结(2)-业务项目搭建

2019年08月30日  | 移动技术网IT编程  | 我要评论

李强演讲视频,你懂的 网站,夫妻乐园扎记

本节将介绍如何进行业务项目搭建。

本业务项目示例是简单的企业信息管理功能,业务项目采用code first方式,搭建包括:

  1. 创建实体项目
  2. 创建实体数据表映射
  3. 创建业务处理项目
  4. 创建业务web项目

搭建完项目效果:

1、创建实体项目-shiquan.company.entity

创建企业信息实体

示例中企业信息包括:编号、名称、负责人、联系人、联系电话、联系地址等

using system;
using system.collections.generic;
using system.componentmodel.dataannotations;
using system.linq;
using system.text;
using system.threading.tasks;

namespace shiquan.company.entity
{
    /// <summary>
    /// 企业信息
    /// </summary>
    public class companyinfoentity:basiccompanyentity
    {
        /// <summary>
        /// 编号
        /// </summary>
        [display(name = "编号"), maxlength(50)]
        public string code { get; set; }
        /// <summary>
        /// 编号
        /// </summary>
        [display(name = "编号"), maxlength(100)]
        public string name { get; set; }
        /// <summary>
        /// 负责人
        /// </summary>
        [display(name = "负责人"), maxlength(50)]
        public string leader { get; set; }
        /// <summary>
        /// 联系人
        /// </summary>
        [display(name = "联系人"), maxlength(50)]
        public string linkman { get; set; }
        /// <summary>
        /// 联系电话
        /// </summary>
        [display(name = "联系电话"), maxlength(50)]
        public string phone { get; set; }
        /// <summary>
        /// 联系地址
        /// </summary>
        [display(name = "联系地址"), maxlength(255)]
        public string address { get; set; }
        /// <summary>
        /// 备注说明
        /// </summary>
        [display(name = "备注说明"), maxlength(255)]
        public string remark { get; set; }
    }
}

 

2、创建实体数据表映射项目-shiquan.company.mapping

创建空数据库

创建项目

创建企业信息数据表映射

using shiquan.company.entity;
using system;
using system.collections.generic;
using system.data.entity.modelconfiguration;
using system.linq;
using system.text;
using system.threading.tasks;

namespace shiquan.company.mapping
{
    /// <summary>
    /// 实体数据映射
    /// </summary>
    public class companyinfomap : entitytypeconfiguration<companyinfoentity>
    {
        public companyinfomap()
        {
            #region 表、主键
            //表
            this.totable("companyinfo");
            //主键
            this.haskey(t => t.id);
            #endregion

            #region 配置关系
            #endregion
        }
    }
}

创建实体数据库上下文

选择空code first 模型

namespace shiquan.company.mapping
{
    using system;
    using system.data.entity;
    using system.data.entity.modelconfiguration.conventions;
    using system.linq;

    public class companydbcontext : dbcontext
    {
        //您的上下文已配置为从您的应用程序的配置文件(app.config 或 web.config)
        //使用“companydbcontext”连接字符串。默认情况下,此连接字符串针对您的 localdb 实例上的
        //“shiquan.company.mapping.companydbcontext”数据库。
        // 
        //如果您想要针对其他数据库和/或数据库提供程序,请在应用程序配置文件中修改“companydbcontext”
        //连接字符串。
        public companydbcontext()
            : base("name=companydbcontext")
        {
        }

        //为您要在模型中包含的每种实体类型都添加 dbset。有关配置和使用 code first  模型
        //的详细信息,请参阅 http://go.microsoft.com/fwlink/?linkid=390109。

        // public virtual dbset<myentity> myentities { get; set; }
        /// <summary>
        /// 重写数据型号创建,添加企业信息数据表映射
        /// </summary>
        /// <param name="modelbuilder"></param>
        protected override void onmodelcreating(dbmodelbuilder modelbuilder)
        {
            modelbuilder.conventions.remove<pluralizingtablenameconvention>();
            
            modelbuilder.configurations.add(new companyinfomap());

            base.onmodelcreating(modelbuilder);
        }
    }
}

 

配置数据库连接

  <connectionstrings>
    <add name="companydbcontext" connectionstring="server=127.0.0.1;initial catalog=vsd_companydb;user id=sa;password=123456*a" providername="system.data.sqlclient" />
  </connectionstrings>

配置数据库上下文允许进行更新升级

using system;
using system.collections.generic;
using system.data.entity.migrations;
using system.linq;
using system.text;
using system.threading.tasks;

namespace shiquan.company.mapping.migrations
{
    internal sealed class configuration : dbmigrationsconfiguration<companydbcontext>
    {
        public configuration()
        {
            //配置允许数据库更新升级
            automaticmigrationsenabled = true;
            automaticmigrationdatalossallowed = true;
        }

        protected override void seed(companydbcontext dbcontext)
        {
            
        }
    }
}

 

使用update-database 对数据库进行升级更新

 

3、创建企业信息管理业务处理项目-shiquan.company.business

创建企业信息库业务处理基础类,实现实体查询、删除和保存功能。

using learun.database.repository;
using learun.util;
using shiquan.company.entity;
using system;
using system.collections.generic;
using system.configuration;
using system.data;
using system.linq;
using system.linq.expressions;
using system.text;
using system.threading.tasks;

namespace shiquan.company.business
{
    /// <summary>
    /// 企业信息管理库业务处理基础类
    /// </summary>
    /// <typeparam name="t"></typeparam>
    public class basiccompanybll<t> : repositoryfactory<t> where t : class,new()
    {
        protected string dbconn = "";

        /// <summary>
        /// 构造函数
        /// </summary>
        public basiccompanybll()
        {
            //this.dbconn = configurationmanager.connectionstrings["companydbcontext"].connectionstring;
            this.dbconn = "companydbcontext";
        }
        #region 获取数据
        /// <summary>
        /// 获取列表
        /// </summary>
        /// <param name="pagination">分页</param>
        /// <param name="queryjson">查询参数</param>
        /// <returns>返回分页列表</returns>
        public virtual ienumerable<t> getpagelist(pagination pagination, string queryjson)
        {
            var expression = linqextensions.true<t>();
            expression = querystringtoexpression(expression, queryjson);
            return this.baserepository(dbconn).findlist(expression, pagination);
        }
        /// <summary>
        /// 获取列表
        /// </summary>
        /// <param name="pagination">分页</param>
        /// <param name="queryjson">查询参数</param>
        /// <returns>返回分页列表</returns>
        public virtual ienumerable<t> getpagelist(pagination pagination, expression<func<t, bool>> linq)
        {
            return this.baserepository(dbconn).findlist(linq, pagination);
        }
        /// <summary>
        /// 获取列表
        /// </summary>
        /// <param name="queryjson">查询参数</param>
        /// <returns>返回列表</returns>
        public virtual ienumerable<t> getlist(string queryjson)
        {
            var expression = linqextensions.true<t>();
            expression = querystringtoexpression(expression, queryjson);
            return this.baserepository(dbconn).iqueryable(expression);
        }
        /// <summary>
        /// 获取列表
        /// </summary>
        /// <param name="queryjson">查询参数</param>
        /// <returns>返回列表</returns>
        public virtual iqueryable<t> getlist(expression<func<t, bool>> linq)
        {
            return this.baserepository(dbconn).iqueryable(linq);
        }
        /// <summary>
        /// 获取实体
        /// </summary>
        /// <param name="keyvalue">主键值</param>
        /// <returns></returns>
        public virtual t getentity(string keyvalue)
        {
            return this.baserepository(dbconn).findentity(keyvalue);
        }

        /// <summary>
        /// 根据条件获取实体
        /// </summary>
        /// <param name="linq">linq条件</param>
        /// <returns></returns>
        public virtual t findentity(expression<func<t, bool>> linq)
        {
            return this.baserepository(dbconn).findentity(linq);
        }
        /// <summary>
        /// 获取数据
        /// </summary>
        /// <param name="queryjson"></param>
        /// <returns></returns>
        public virtual datatable gettable(string queryjson)
        {
            string sql = getsql(queryjson);
            return this.baserepository(dbconn).findtable(sql);
        }
        /// <summary>
        /// 获取数据
        /// </summary>
        /// <param name="sql"></param>
        /// <returns></returns>
        public virtual datatable gettablebysql(string sql)
        {
            //string sql = getsql(queryjson);
            return this.baserepository(dbconn).findtable(sql);
        }
        /// <summary>
        /// 获取分页列表,返回datatable
        /// </summary>
        /// <param name="queryjson">查询参数</param>
        /// <returns>返回列表</returns>
        public virtual datatable getpagetable(pagination pagination, string queryjson)
        {
            string sql = getsql(queryjson);
            return this.baserepository(dbconn).findtable(sql, pagination);
        }
        /// <summary>
        /// 获取分页列表,返回datatable
        /// </summary>
        /// <param name="sql">查询参数</param>
        /// <returns>返回列表</returns>
        public virtual datatable getpagetablebysql(pagination pagination, string sql)
        {
            //string sql = getsql(queryjson);
            return this.baserepository(dbconn).findtable(sql, pagination);
        }
        #endregion

        #region 提交数据
        /// <summary>
        /// 删除数据
        /// </summary>
        /// <param name="keyvalue">主键</param>
        public virtual void removeform(string keyvalue)
        {
            string[] dels = keyvalue.split(',');
            if (dels.length > 1)
            {
                irepository db = new repositoryfactory().baserepository(dbconn).begintrans();
                try
                {
                    foreach (var item in dels)
                    {
                        db.delete(item);
                    }
                    db.commit();
                }
                catch (exception)
                {
                    db.rollback();
                    throw;
                }
            }
            else
            {
                this.baserepository(dbconn).delete(keyvalue);
            }
        }
        /// <summary>
        /// 保存表单(新增、修改)
        /// </summary>
        /// <param name="keyvalue">主键值</param>
        /// <param name="entity">实体对象</param>
        /// <returns></returns>
        public virtual void saveform(string keyvalue, t entity)
        {
            if (!string.isnullorempty(keyvalue))
            {
                this.baserepository(dbconn).update(entity);
            }
            else
            {
                this.baserepository(dbconn).insert(entity);
            }
        }
        #endregion

        #region 帮助函数
        /// <summary>
        /// 生成查询表达式
        /// </summary>
        /// <param name="queryjson">查询对象</param>
        /// <returns></returns>
        protected virtual expression<func<t, bool>> querystringtoexpression(expression<func<t, bool>> expression, string queryjson)
        {
            if (string.isnullorempty(queryjson))
                return expression;
            var queryparam = queryjson.tojobject();
            if (!queryparam["condition"].isempty() && !queryparam["keyword"].isempty())
            {
                string condition = queryparam["condition"].tostring();
                string keyword = queryparam["keyword"].tostring();
                switch (condition)
                {
                    default: break;
                }
            }
            return expression;
        }
        /// <summary>
        /// 根据实体生成sql
        /// </summary>
        /// <param name="queryjson">查询对象</param>
        /// <returns></returns>
        protected virtual string getsql(string queryjson)
        {
            stringbuilder sb = new stringbuilder();
            var queryparam = queryjson.tojobject();
            if (!queryparam["condition"].isempty() && !queryparam["keyword"].isempty())
            {
                string condition = queryparam["condition"].tostring();
                string keyword = queryparam["keyword"].tostring();
                sb.append(" and " + condition + " like '%" + keyword + "%'");
            }
            return sb.tostring();
        }
        #endregion
    }
}

创建企业信息业务处理类,继承基础业务处理类,重写保存、过滤条件方法。

using shiquan.company.entity;
using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.threading.tasks;
using system.linq.expressions;
using learun.util;
using learun.util.operat;

namespace shiquan.company.business
{
    /// <summary>
    /// 实现企业信息管理业务处理,继承企业信息库基础业务处理
    /// </summary>
    public class companyinfobll : basiccompanybll<companyinfoentity>
    {
        /// <summary>
        /// 数据保存
        /// </summary>
        /// <param name="keyvalue"></param>
        /// <param name="entity"></param>
        public override void saveform(string keyvalue, companyinfoentity entity)
        {
            try
            {
                if (string.isnullorempty(keyvalue))
                {
                    entity.id = guid.newguid().tostring();
                }
                else
                    entity.id = keyvalue;

                base.saveform(keyvalue, entity);
            }
            catch (exception ex)
            {

                throw;
            }
        }
        /// <summary>
        /// 重写查询过滤条件
        /// </summary>
        /// <param name="expression"></param>
        /// <param name="queryjson"></param>
        /// <returns></returns>
        protected override expression<func<companyinfoentity, bool>> querystringtoexpression(expression<func<companyinfoentity, bool>> expression, string queryjson)
        {
            if (string.isnullorempty(queryjson))
                return expression;
            var queryparam = queryjson.tojobject();
            if (queryparam["code"].isempty() == false)
            {
                string keyword = queryparam["code"].tostring();
                expression = expression.and(my => my.code == keyword);
            }
            if (!queryparam["condition"].isempty() && !queryparam["keyword"].isempty())
            {
                string condition = queryparam["condition"].tostring();
                string keyword = queryparam["keyword"].tostring();
                switch (condition)
                {
                    default: break;
                }
            }
            return expression;
        }
    }
}

 

4、创建企业信息管理web项目-shiquan.company.web

创建空的企业信息管理控制器,实现列表、编辑视图,数据查询、删除、保存方法。

using learun.application.web;
using learun.util;
using shiquan.company.business;
using shiquan.company.entity;
using system;
using system.collections.generic;
using system.linq;
using system.web;
using system.web.mvc;

namespace shiquan.company.web.areas.companymanage.controllers
{
    /// <summary>
    /// 企业信息管理
    /// </summary>
    public class companyinfocontroller : mvccontrollerbase
    {
        // get: companymanage/companyinfo
        companyinfobll service = new companyinfobll();
        /// <summary>
        /// 列表视图
        /// </summary>
        /// <returns></returns>
        public actionresult companyinfoindex()
        {
            return view();
        }
        /// <summary>
        /// 编辑视图
        /// </summary>
        /// <returns></returns>
        public actionresult companyinfoform()
        {
            return view();
        }

        #region 获取数据
        /// <summary>
        /// 获取列表
        /// </summary>
        /// <param name="pagination">分页参数</param>
        /// <param name="queryjson">查询参数</param>
        /// <returns>返回分页列表json</returns>
        [httpget]
        public actionresult getpagelistjson(string pagination, string queryjson)
        {
            pagination paginationobj = pagination.toobject<pagination>();
            var watch = commonhelper.timerstart();
            var data = service.getpagelist(paginationobj, queryjson);
            var jsondata = new
            {
                rows = data,
                total = paginationobj.total,
                page = paginationobj.page,
                records = paginationobj.records,
                costtime = commonhelper.timerend(watch)
            };
            //return tojsonresult(jsondata);
            return success(jsondata);
        }
        /// <summary>
        /// 获取列表
        /// </summary>
        /// <param name="queryjson">查询参数</param>
        /// <returns>返回列表json</returns>
        [httpget]
        public actionresult getlistjson(string queryjson)
        {
            var data = service.getlist(queryjson);
            return tojsonresult(data);
        }
        /// <summary>
        /// 获取实体 
        /// </summary>
        /// <param name="keyvalue">主键值</param>
        /// <returns>返回对象json</returns>
        [httpget]
        public actionresult getformjson(string keyvalue)
        {
            var data = service.getentity(keyvalue);
            return tojsonresult(data);
        }
        #endregion

        #region 提交数据
        /// <summary>
        /// 删除数据
        /// </summary>
        /// <param name="keyvalue">主键值</param>
        /// <returns></returns>
        [httppost]
        [validateantiforgerytoken]
        [ajaxonly]
        public actionresult removeform(string keyvalue)
        {
            service.removeform(keyvalue);
            return success("删除成功。");
        }
        /// <summary>
        /// 保存表单(新增、修改)
        /// </summary>
        /// <param name="keyvalue">主键值</param>
        /// <param name="entity">实体对象</param>
        /// <returns></returns>
        [httppost]
        [validateantiforgerytoken]
        [ajaxonly]
        public actionresult saveform(string keyvalue, companyinfoentity entity)
        {
            service.saveform(keyvalue, entity);
            return success("操作成功。", entity);
        }
        #endregion
    }
}

创建列表界面

@{
    viewbag.title = "客户管理";
    layout = "~/views/shared/_index.cshtml";
}
<div class="lr-layout">
    <div class="lr-layout-center">
        <div class="lr-layout-wrap lr-layout-wrap-notitle">
            <div class="lr-layout-tool">
                <div class="lr-layout-tool-left">
                    <div class="lr-layout-tool-item">
                        <input id="txt_keyword" type="text" class="form-control" placeholder="请输查询关键字" />
                    </div>
                    <div class="lr-layout-tool-item">
                        <a id="btn_search" class="btn btn-primary btn-sm"><i class="fa fa-search"></i>&nbsp;<span class="lrlg">查询</span></a>
                    </div>
                </div>
                <div class="lr-layout-tool-right">
                    <div class="btn-group btn-group-sm">
                        <a id="btnreload" class="btn btn-default"><i class="fa fa-refresh"></i></a>
                    </div>
                    <div class="btn-group btn-group-sm" learun-authorize="yes">
                        <a id="btnadd" class="btn btn-default"><i class="fa fa-plus"></i>&nbsp;<span class="lrlg">新增</span></a>
                        <a id="btnedit" class="btn btn-default"><i class="fa fa-pencil-square-o"></i>&nbsp;<span class="lrlg">编辑</span></a>
                        <a id="btndelete" class="btn btn-default"><i class="fa fa-trash-o"></i>&nbsp;<span class="lrlg">删除</span></a>
                    </div>
                </div>
            </div>
            <div class="lr-layout-body" id="gridtable"></div>
        </div>
    </div>
</div>
<script type="text/javascript">
    var refreshgirddata; // 更新数据
    var selectedrow;
    var bootstrap = function ($, learun) {
        "use strict";
        var page = {
            init: function () {
                page.initgrid();
                page.bind();
            },
            bind: function () {
                // 查询
                $('#btn_search').on('click', function () {
                    var keyword = $('#txt_keyword').val();
                    page.search({ keyword: keyword });
                });
                // 刷新
                $('#btnreload').on('click', function () {
                    location.reload();
                });
                // 新增
                $('#btnadd').on('click', function () {
                    selectedrow = null;//新增前请清空已选中行
                    learun.layerform({
                        id: 'form',
                        title: '新增客户',
                        url: top.$.rooturl + '/companymanage/companyinfo/companyinfoform',
                        width: 600,
                        height: 400,
                        maxmin: true,
                        callback: function (id) {
                            return top[id].acceptclick(refreshgirddata);
                        }
                    });
                });
                // 编辑
                $('#btnedit').on('click', function () {
                    selectedrow = $('#gridtable').jfgridget('rowdata');
                    var keyvalue = $('#gridtable').jfgridvalue('id');
                    if (learun.checkrow(keyvalue)) {
                        learun.layerform({
                            id: 'form',
                            title: '编辑客户',
                            url: top.$.rooturl + '/companymanage/companyinfo/companyinfoform',
                            width: 600,
                            height: 400,
                            maxmin: true,
                            callback: function (id) {
                                return top[id].acceptclick(refreshgirddata);
                            }
                        });
                    }
                });
                // 删除
                $('#btndelete').on('click', function () {
                    var keyvalue = $('#gridtable').jfgridvalue('id');
                    if (learun.checkrow(keyvalue)) {
                        learun.layerconfirm('是否确认删除该项!', function (res) {
                            if (res) {
                                learun.deleteform(top.$.rooturl + '/companymanage/companyinfo/deleteform', { keyvalue: keyvalue }, function () {
                                    refreshgirddata();
                                });
                            }
                        });
                    }
                });
            },
            initgrid: function () {
                $('#gridtable').jfgrid({
                    url: top.$.rooturl + '/companymanage/companyinfo/getpagelistjson',
                    headdata: [
                        { label: '编号', name: 'code', width: 100, align: 'left' },
                        { label: '名称', name: 'name', width: 200, align: 'left' },
                        { label: '负责人', name: 'leader', width: 100, align: 'left' },
                        { label: '联系人', name: 'linkman', width: 100, align: 'left' },
                        { label: '联系电话', name: 'phone', width: 100, align: 'left' },
                        { label: '联系地址', name: 'address', width: 200, align: 'left' },
                        {
                            label: "最后更新", name: "modifydate", width: 140, align: "left",
                            formatter: function (cellvalue) {
                                return learun.formatdate(cellvalue, 'yyyy-mm-dd hh:mm');
                            }
                        },
                        { label: '备注', name: 'remark', width: 200, align: 'left' },
                    ],
                    mainid: 'id',
                    reloadselected: true,
                    ispage: true,
                    sidx: 'code'
                });
                page.search();
            },
            search: function (param) {
                $('#gridtable').jfgridset('reload', param);
            }
        };
        // 保存数据后回调刷新
        refreshgirddata = function () {
            page.search();
        }
        page.init();
    }
</script>

 

创建编辑界面

@{
    viewbag.title = "客户添加";
    layout = "~/views/shared/_form.cshtml";
}
<div class="lr-form-wrap" id="form">
    <div class="col-xs-12 lr-form-item">
        <div class="lr-form-item-title">编号<font face="宋体">*</font></div>
        <input id="code" type="text" class="form-control" isvalid="yes" checkexpession="notnull" />
    </div>
    <div class="col-xs-12 lr-form-item">
        <div class="lr-form-item-title">名称<font face="宋体">*</font></div>
        <input id="name" type="text" class="form-control" isvalid="yes" checkexpession="notnull" />
    </div>
    <div class="col-xs-12 lr-form-item">
        <div class="lr-form-item-title">负责人<font face="宋体">*</font></div>
        <input id="leader" type="text" class="form-control" isvalid="yes" checkexpession="notnull" />
    </div>
    <div class="col-xs-12 lr-form-item">
        <div class="lr-form-item-title">联系人</div>
        <input id="linkman" type="text" class="form-control" isvalid="no" checkexpession="notnull" />
    </div>
    <div class="col-xs-12 lr-form-item">
        <div class="lr-form-item-title">联系电话</div>
        <input id="phone" type="text" class="form-control" />
    </div>
    <div class="col-xs-12 lr-form-item">
        <div class="lr-form-item-title">联系地址</div>
        <input id="address" type="text" class="form-control" />
    </div>
    <div class="col-xs-12 lr-form-item">
        <div class="lr-form-item-title">备注</div>
        <textarea id="remark" class="form-control" style="height: 50px;"></textarea>
    </div>
</div>
<script type="text/javascript">
    var acceptclick;
    var keyvalue = '';
    var bootstrap = function ($, learun) {
        "use strict";
        var selectedrow = learun.frametab.currentiframe().selectedrow;
        var page = {
            init: function () {
                page.bind();
                page.initdata();
            },
            bind: function () {
                // 客户级别
                //$('#f_custlevelid').lrdataitemselect({ code: 'client_level', maxheight: 230 });
                //// 客户类别
                //$('#f_custtypeid').lrdataitemselect({ code: 'client_sort', maxheight: 230 });
                //// 客户程度
                //$('#f_custdegreeid').lrdataitemselect({ code: 'client_degree', maxheight: 230 });
                ////跟进人员
                //$('#f_traceuserid').lrformselect({
                //    layerurl: top.$.rooturl + '/lr_organizationmodule/user/selectform',
                //    layerurlw: 800,
                //    layerurlh: 520,
                //    dataurl: top.$.rooturl + '/lr_organizationmodule/user/getlistbyuserids'
                //});
                ////公司行业
                //$('#f_custindustryid').lrdataitemselect({ code: 'client_trade', maxheight: 230 });
            },
            initdata: function () {
                if (!!selectedrow) {
                    keyvalue = selectedrow.id;
                    $('#form').lrsetformdata(selectedrow);
                }
            }
        };
        // 保存数据
        acceptclick = function (callback) {
            if (!$('#form').lrvalidform()) {
                return false;
            }
            var postdata = $('#form').lrgetformdata(keyvalue);
            $.lrsaveform(top.$.rooturl + '/companymanage/companyinfo/saveform?keyvalue=' + keyvalue
                , postdata
                , function (res) {
                // 保存成功后才回调
                if (!!callback) {
                    callback();
                }
            });
        };
        page.init();
    }
</script>

 

业务项目,至此搭建完成,接下来,使用web项目进行引用,

配置业务项目数据表映射

  <!-- 实体类映射库名称 -->
  <add key="datamapper" value="learun.application.mapping.dll,shiquan.company.mapping.dll"/>

配置业务项目数据库连接,添加配置功能菜单

运行系统效果

更多精彩,且听下回分解!

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网