WebAPI项目搭建及其发布测试

news2024/11/17 5:35:43

目录

1.创建项目

2.配置

3.发布

4.测试页面


1.创建项目

(1)创建ASP.NET Web应用程式,如下图:

(2)选择Empty,勾选Web API,点击确定创建,如下图:

(3)创建完成,如下图:

(4)添加文件夹及类,如下图:      

  

 说明:BLL(存放数据库相关的类),TestController(接口类),Models(存放Models类),MPage(存放啟動頁面,沒有任何功能)

2.配置

(1)Web.config配置文件,配置数据库连接及跨域,代码如下:

<configuration>
  
  <appSettings>
    <!--配置数据库连接-->
    <!--数据库1-->  
    <add key="DBConnectionString1" value="Data Source=1.3.1.1;Initial Catalog=total;Persist Security Info=True;User ID=SC;Password=SCQSMPTD;MultipleActiveResultSets=true" />
    <!--数据库2-->
    <add key="DBConnectionString2" value="Data Source=1.3.1.3;Initial Catalog=SMT_PCP;Persist Security Info=True;User ID=micro;Password=micro;MultipleActiveResultSets=true" />
    <!--数据库3-->
    <add key="OraConn"
         value="Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=1.3.1.22)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=PACK)));User Id=e_re;Password=yhong;"/>   
  </appSettings>
 
    <httpProtocol>
      <!--跨域配置开始-->
      <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
        <!--支持全域名访问,不安全,部署后需要固定限制为客户端网址-->
        <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
        <!--支持的http 动作-->
        <add name="Access-Control-Allow-Headers" value="Content-Type,X-Requested-With,token,staffid,timestamp,nonce,signKey,signature" />
        <!--响应头 请按照自己需求添加 这里新加了token这个headers-->
        <add name="Access-Control-Request-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
        <!--允许请求的http 动作-->
      </customHeaders>
      <!--跨域配置结束-->
    </httpProtocol>
  </system.webServer>
 
</configuration>

 (2)在Global.asax文件中添加,下面代码:

  protected void Application_BeginRequest(object sender, EventArgs e)
        {
            var res = HttpContext.Current.Response;
            var req = HttpContext.Current.Request;

            //自定义header时进行处理
            if (req.HttpMethod == "OPTIONS")
            {
                res.AppendHeader("Access-Control-Allow-Headers", "Content-Type, X-CSRF-Token, X-Requested-With, Accept, Accept-Version, Content-Length, Content-MD5, Date, X-Api-Version, X-File-Name,Token,Cookie");
                res.AppendHeader("Access-Control-Allow-Methods", "POST,GET,PUT,PATCH,DELETE,OPTIONS");
                res.StatusCode = 200;
                res.End();
            }
        }

(3)啟動頁面:Hello.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Hello.aspx.cs" Inherits="WebAPI.MPage.Hello" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
      這個界面只是一個啟動頁面,沒有任何功能
    </div>
    </form>
</body>
</html>

(4)webapi设置默认返回json格式 ,WebApiConfig文件下Register方法下,添加代码:

   GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
            //默认返回 json  
            GlobalConfiguration.Configuration.Formatters.JsonFormatter.MediaTypeMappings.Add(
                new QueryStringMapping("datatype", "json", "application/json"));

            // 解决json序列化时的循环引用问题
            config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;

(5)BLL文件夹下创建一个SQLHelper类,用于连接数据库,代码:

using Oracle.ManagedDataAccess.Client;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Web;

namespace WebAPI.BLL
{
    /// <summary>
    /// 鏈接類別
    /// </summary>
    public enum DBConnList
    {
        DBConnStr1 = 0,
        DBConnStr2 = 1,
        QracleConnS = 2,
    }
    public static class SQLHelper
    {
        //数据库1
        public static string DBConnectionString1 = ConfigurationManager.AppSettings["DBConnectionString1"];
        //数据库2
        public static string DBConnectionString2 = ConfigurationManager.AppSettings["DBConnectionString2"];
        //Qracle数据库操作
        public static string QracleSring = ConfigurationManager.AppSettings["OraConn"];
      
        /// <summary>
        /// 獲得數據庫鏈接語句
        /// </summary>
        /// <param name="DBConnIndex">請求數據庫類別</param>
        /// <returns></returns>
        public static string GetConnectStr(DBConnList DBConnIndex)
        {
            var connstr = "";

            if (DBConnIndex == DBConnList.DBConnStr1)
            {
                connstr = DBConnectionString1;
            }
            else if (DBConnIndex == DBConnList.DBConnStr2)
            {
                connstr = DBConnectionString2;
            }
            else if (DBConnIndex == DBConnList.QracleConnS)
            {
                connstr = QracleSring;
            }

            return connstr;
        }
        //SQL 数据库操作
        #region
        /// <summary>
        /// 增刪改查,不涉及事物
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="DBConnIndex">請求數據庫類別</param>
        /// <returns></returns>
        public static int ExecuteSQL(string sql, DBConnList DBConnIndex)
        {
            var connstr = GetConnectStr(DBConnIndex);

            SqlConnection conn = new SqlConnection(connstr);

            SqlCommand cmd = new SqlCommand(sql, conn);

            conn.Open();

            int result = cmd.ExecuteNonQuery();

            conn.Close();

            return result;
        }

        /// <summary>
        /// 执行带SqlParameter的SQL语句
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="DBConnIndex">請求數據庫類別</param>
        /// <param name="sp">參數</param>
        /// <returns></returns>
        public static int ExecuteSQLAndSP(string sql, DBConnList DBConnIndex, List<SqlParameter> sp)
        {
            var connstr = GetConnectStr(DBConnIndex);

            SqlConnection connection = new SqlConnection(connstr);

            try
            {
                connection.Open();

                SqlCommand cmd = new SqlCommand(sql, connection);

                foreach (SqlParameter cur_sp in sp)
                {
                    if (cur_sp.Value != null)
                    {
                        cmd.Parameters.Add(cur_sp);
                    }
                }

                return cmd.ExecuteNonQuery();
            }
            finally
            {
                connection.Close();
            }
        }

        /// <summary>
        /// 執行多條SQL語句,實現數據庫事物
        /// </summary>
        /// <param name="SQLStringList">多條SQL語句</param>
        /// <param name="DBConnIndex">請求數據庫類別</param> 
        /// <param name="result">1 表示執行成功;2 表示出現錯誤了。</param>
        public static void ExecuteSQLTran(List<string> SQLStringList, DBConnList DBConnIndex, ref int result)
        {
            var connstr = GetConnectStr(DBConnIndex);

            using (SqlConnection conn = new SqlConnection(connstr))
            {
                conn.Open();
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = conn;
                SqlTransaction tx = conn.BeginTransaction();
                cmd.Transaction = tx;

                int curIndex = 0;

                try
                {
                    for (int n = 0; n < SQLStringList.Count; n++)
                    {
                        string strsql = SQLStringList[n].ToString();
                        if (strsql.Trim().Length > 1)
                        {
                            cmd.CommandText = strsql;
                            cmd.ExecuteNonQuery();

                            curIndex = curIndex + 1;
                        }
                    }
                    tx.Commit();

                    result = 1;
                }
                catch (SqlException ex)
                {
                    result = 2;

                    Add_Log("ExecuteSqlTran:" + SQLStringList[curIndex] + " \r\n Error:" + ex.Message);

                    tx.Rollback();
                    //throw new Exception(E.Message);
                }
            }
        }

        /// <summary>
        /// 查詢
        /// </summary>
        /// <param name="sql">需要執行的SQL語句</param>
        /// <param name="DBConnIndex">請求數據庫類別</param>
        /// <returns></returns>
        public static DataTable SearchSQL(string sql, DBConnList DBConnIndex)
        {
            var connstr = GetConnectStr(DBConnIndex);

            DataSet ds = new DataSet();

            SqlDataAdapter sda = new SqlDataAdapter(sql, connstr);

            sda.Fill(ds);

            return ds.Tables[0];
        }
        public static DataTable Only_Table1(string exec, DBConnList DBConnIndex)
        {
            var connstr = GetConnectStr(DBConnIndex);
            System.Data.DataTable dt_jdl = new DataTable();
            try
            {
                using (SqlConnection con = new SqlConnection(connstr))
                {
                    if (con.State == ConnectionState.Closed)
                    {
                        con.Open();
                    } if (con.State == ConnectionState.Open || con.State == ConnectionState.Connecting)
                    {
                        SqlDataAdapter sda2 = new SqlDataAdapter(exec, con);//全部通過寫存儲過程即可
                        DataSet ds2 = new DataSet();
                        sda2.Fill(ds2, "cxq");
                        dt_jdl = ds2.Tables["cxq"];
                        sda2.Dispose();
                        ds2.Dispose();
                    }
                    con.Close();
                }
                return dt_jdl;
            }
            catch (Exception EX)
            {
                return null;
            }
        }

        /// <summary>
        /// 增加日志
        /// </summary>
        /// <param name="msg"></param>
        public static void Add_Log(string msg)
        {
            //msg = msg.Replace("'", "");

            //StringBuilder sb = new StringBuilder();

            //sb.AppendLine("Insert into SimpHomeDB.dbo.SYS_LOG (msg)");

            //sb.AppendLine("Values(N'[SimploScreenAPI]" + msg + "')");

            //ExecuteSQL(sb.ToString(), DBConnList.DBConnStrTE);
        }
        #endregion
        //Qracle数据库操作
        #region
        
        /// <summary>
        ///  执行SQL语句,返回DataTable;只用来执行查询结果比较少的情况
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="DBConnIndex"></param>
        /// <param name="parameters"></param>
        /// <returns></returns>
        public static DataTable QracleExecuteDataTableSQL(string sql, DBConnList DBConnIndex,params OracleParameter[] parameters)
        {
            var connStr = GetConnectStr(DBConnIndex);
            using (OracleConnection conn = new OracleConnection(connStr))
            {
                conn.Open();
                using (OracleCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = sql;
                    cmd.Parameters.AddRange(parameters);
                    OracleDataAdapter adapter = new OracleDataAdapter(cmd);
                    DataTable datatable = new DataTable();
                    adapter.Fill(datatable);
                    return datatable;
                }
            }
        }
        /// <summary>
        /// 执行SQl语句(增、删、改)
        /// </summary>
        /// <param name="sql">要执行的SQl语句</param>
        /// <returns></returns>
        public static bool Qracle_EXCUTE(string sql, DBConnList DBConnIndex)
        {
            var connStr = GetConnectStr(DBConnIndex);
            try
            {
                OracleConnection connect = new OracleConnection(connStr);
                OracleCommand cmd = new OracleCommand();
                cmd.Connection = connect;
                cmd.CommandText = sql;
                connect.Open();
                cmd.ExecuteNonQuery();
                connect.Close();
                return true;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
        #endregion
    }
}

(6)Models文件下的类,例SysResponse类:

 /// <summary>
    /// 返回信息
    /// </summary>
    public class SysResponse
    {
        /// <summary>
        /// 状态码
        /// </summary>
        public string Code { get; set; }

        /// <summary>
        /// 描述信息
        /// </summary>
        public string Message { get; set; }

        /// <summary>
        /// 数据
        /// </summary>
        public object Data { get; set; }
           
       
    }

Common类

 public class Common
    {
         /// <summary>
        /// 轉化成Json
        /// </summary>
        /// <param name="obj">待轉換對象</param>
        /// <returns>轉換結果/returns>
        public static HttpResponseMessage ToJson(Object obj)
        {
            String str;
            if (obj is String || obj is Char)
            {
                str = obj.ToString();
            }
            else
            {
                JavaScriptSerializer serializer = new JavaScriptSerializer();
                str = serializer.Serialize(obj);
            }
            HttpResponseMessage result = new HttpResponseMessage { Content = new StringContent(str, Encoding.GetEncoding("UTF-8"), "application/json") };

            return result;
        }      
    }

(7)接口类TestController 

 public class TestController : ApiController
    {     
        [HttpGet]
        public HttpResponseMessage HelloOne(string Line)
        {
            SysResponse res = new SysResponse();
            try
            {
                //sql数据库
                var emp_dt = SQLHelper.SearchSQL("select * from pcp where Line = '" + Line + "'", DBConnList.DBConnStr1);
                //Qracle数据库
                //var emp_dt = SQLHelper.QracleExecuteDataTableSQL("select * from (select * from scqhp.cell_sort_info_by_customer) where ROWNUM<=10 ORDER BY ROWNUM asc", DBConnList.QracleConnS);

                //var GoodsNo = emp_dt.Rows[0]["CELL_SN"].ToString();
                var GoodsNo = emp_dt.Rows[0]["P_N"].ToString();
                res.Code = "01";
                res.Message = GoodsNo;
                res.Data = "001";
            }
            catch (Exception ex)
            {
                res.Code = "02";
                res.Message = "調用失敗Hello,Exception:" + ex.Message + Line;
                res.Data = "002";
            }

            return Common.ToJson(res);
        }
 
        
    }

说明:其中  [HttpGet]可以按照需求更改为  [HttpPost]  [HttpPut]  [HttpDelete]

3.发布

写好的接口需要发布到服务器或者本机的IIS进行测试,发布与发布网页一样

4.测试页面

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <script src="jquery-1.10.2.min.js"></script>
    <style>

    </style>
    <title>webapi测试</title>
</head>
<body>
    <div id="body">      
        <section>

            <br />
            <br />
            <h2>查询物料</h2>
            Line:<input id="line" type="text" value="PZ01"/><br /> 
            料号:<input id="GoodsNo" type="text" /><br />           
            <input id="showItem" type="button" value="查询" />                       
        </section>

    </div>

    <script>   
        //先根据Id查询记录  请求类型:GET  请求url:  /api/Products/Id
        //请求到ProductsController.cs中的 public Product GetProduct(int id) 方法
        $("#showItem").click(function () {
            var inputLine = $("#line").val();
            $.ajax({
                url: "http://10.20.32.73:8000//api/Test/HelloOne?Line=" + inputLine,
                type: "get",
                dataType: 'json',            
                success: function (data) {
                    $("#GoodsNo").val(data.Message);
                },
                error: function (XMLHttpRequest, textStatus, errorThrown) {
                    alert("请求失败,消息:" + textStatus + "  " + errorThrown);
                }
            });
        });
    </script>

</body>
</html>

说明:其中http://10.20.32.73:8000为发布webAPI的网址

总结:本文主要讲述了WebAPI项目的搭建及其配置,然后到发布及其测试整个过程。记录方便查阅。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/55514.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决Netty那些事儿之Reactor在Netty中的实现(创建篇)-上

本系列Netty源码解析文章基于 4.1.56.Final版本 在上篇文章深入讲解Netty那些事儿之从内核角度看IO模型中我们花了大量的篇幅来从内核角度详细讲述了五种IO模型的演进过程以及ReactorIO线程模型的底层基石IO多路复用技术在内核中的实现原理。 最后我们引出了netty中使用的主从…

代码随想录刷题day52 300.最长递增子序列;674. 最长连续递增序列;718. 最长重复子数组

代码随想录刷题day52 300.最长递增子序列&#xff1b;674. 最长连续递增序列&#xff1b;718. 最长重复子数组 二维dp的初次应用&#xff0c;关于子序列的一系列问题。 300.最长递增子序列 300. 最长递增子序列 - 力扣&#xff08;Leetcode&#xff09; 子序列的一个入门题…

java中set接口、哈希表、哈希值、HashSet、LinkedHashSet、方法的可变参数

set接口&#xff1a; set接口和list接口一样&#xff0c;都是继承于Collection接口&#xff0c;它与Collection接口中的方法基本一致。特点&#xff1a;不允许存储重复元素&#xff0c;元素没有索引。它主要有两个实现类&#xff1a;HashSet&#xff08;具有哈希表结构&#x…

微服务框架 SpringCloud微服务架构 9 初识 Docker 9.2 Docker 与虚拟机的差别

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构9 初识 Docker9.2 Docker 与虚拟机的差别9.2.1 Docker 与虚拟机9.2.2 总结…

基于Android的二维码识别系统的研究与实现(eclipse开发)

目 录 1 Android系统开发背景与意义 1 1.1 Android系统平台的出现 1 1.2 Android系统的发展 1 1.3 Android系统架构的介绍 1 1.4 Android开放系统 3 1.5 Android系统的特点 3 2 二维码识别系统背景介绍 3 2.1 二维码识别系统背景 3 2.1.1 二维码技术产生的背景 3 2.1.2 二维码分…

图像压缩原理-JPEG

搬来一个基础啊 给自己看~~ 非技术指正勿扰 图像的格式有很多种&#xff0c;比如PNG&#xff0c;JPEG等等&#xff0c;但当我们把一张图用工具变成各种其他格式时&#xff0c;其在计算机文件系统显示的文件大小各不一样&#xff0c;但是当你打开显示时&#xff0c;从视觉角度…

Android进阶之路 - Json解析异常

在App与H5交互时&#xff0c;有一个调原生分享的需求&#xff0c;交互方面没有问题&#xff0c;因为分享需要多值&#xff0c;所以采用json进行传递&#xff0c;在app接收进行解析时遇到了这个解析异常 Value &#xfeff; of type java.lang.String cannot be converted to JS…

【操作系统一】图解TCP/IP模型+实战

【操作系统一】OSI模型和TCP/IP模型一、OSI模型1、什么是OSI模型2、osi七层参考模型3、我更想介绍TCP/IP模型二、TCP/IP模型1、TCP/IP模型起源2、TCP/IP模型是五层还是四层&#xff1f;3、两层TCP/IP模型4、传输层&#xff08;也叫传输控制层&#xff09;4.1 TCP4.3、三次握手4…

【算法面试题汇总】LeetBook列表的算法面试题汇总---动态规划题目及答案

整理不易留个小心心呗&#x1f970; 如果有更好的或者是我有错的地方还请各位大佬指出哦 有些是copy的还望不要介意 动态规划至少有k个重复字符的最长子串二叉树中的最大路径和最长连续序列打家劫舍完全平方数最长上升子序列*零钱兑换矩阵中的最长递增路径至少有k个重复字符的最…

java计算机毕业设计ssm民宿管理系统设计7lky4(附源码、数据库)

java计算机毕业设计ssm民宿管理系统设计7lky4&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff0…

Linux服务器上Neo4j的安装、迁移

目录 1、环境 2、下载 3、修改配置 4、启动及其他命令 5、客户端访问&#xff1a; 6、数据迁移 1、环境 Neo4j是基于Java的图形数据库&#xff0c;运行Neo4j需要启动JVM进程&#xff0c;因此必须安装JAVA SE的JDK。 neo4j版本&#xff1a;neo4j-community-3.5.6 2、下…

使用 Learner Lab - 使用 API Gateway 触发 AWS Lambda

使用 Learner Lab - 使用 API Gateway 触发 AWS Lambda AWS Academy Learner Lab 是提供一个帐号让学生可以自行使用 AWS 的服务&#xff0c;让学生可以在 100 USD的金额下&#xff0c;自行练习所要使用的 AWS 服务&#xff0c;如何进入 Learner Lab 请参考 使用 Learner Lab …

第十三章 DFS与BFS(保姆级教学!!超级详细的图示!!)

第十三章 DFS与BFS一、深度优先搜索1、什么是DFS&#xff1f;2、DFS代码模板&#xff08;1&#xff09;问题&#xff1a;&#xff08;2&#xff09;分析&#xff1a;&#xff08;3&#xff09;模板&#xff1a;3、DFS代码分析二、广度优先搜索1、什么是BFS&#xff1f;2、BFS代…

就是把一个数组中相同类别数据,组成新的数组

效果图如上&#xff0c;就是把一个数组中相同类别数据&#xff0c;组成新的数组&#xff0c;每个数组最后加一个空对象&#xff0c;对象对应的格式要做些许改变 分店 品牌 业绩(元) 订单个数 单值(元) {{item.shopname}} {{item.shopname}} {{item.shopname}} {{item.shopname}…

《InnoDB引擎九》InnoDB关键特性-自适应哈希索引

InnoDB 关键特性 InnoDB存储引擎的关键特性包括&#xff1a; Insert Buffer (插入缓冲)Double Write (两次写)Adaptive Hash Index (自适应哈希索引)Async IO (异步IO)Flush Neighbor Page (刷新领接页) 这些特性为InnoDB存储引擎带来了更好的性能以及更高的可靠性。 自适应哈…

猿如意开发工具|emeditor

写在前面 昨天升了下系统&#xff0c;可以下载了&#xff0c;我就试了试 正文 在客户端里搜索我所需要的工具&#xff0c;就可以搜出来 这里我已经下好了&#xff0c;直接点开文件就好了 再点开文件 点击下一步&#xff0c;接下来还有几个步骤&#xff0c;都点下一步就可以了…

【HBuilder X】解决HBuilder X内置浏览器显示过大影响使用

1- 前言 不知道宝子们有没有遇到过这种情况&#xff0c;小媛发现自己的内置浏览器过大&#xff0c;很大&#xff0c;很丑&#xff0c;占了半个屏幕&#xff0c;像下图那样。 也试了几种方法&#xff0c;比如&#xff1a; 看自己的版本不是最新&#xff0c;或者和其他人的不一样…

嫁给程序员老公,我后悔了

01 在我还没长开的时候&#xff0c;就常听人说&#xff0c;有两种男人不能嫁&#xff1a;一种是兵哥哥&#xff0c;另一种是程序员。前者见不着&#xff0c;后者死的早。 一想到不等头发花白&#xff0c;就要踟蹰独行&#xff0c;我就害怕的厉害。所以&#xff0c;很长一段时…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java高校教室管理系统9y8cv

相信很多和我一样的同学&#xff0c;因为实习&#xff0c;因为考研和考公等等&#xff0c;来不及做毕业设计&#xff0c;双专业的话 到时肯定忙不过来。提前做好准备吧&#xff0c;能自己完成的尽量自己完成&#xff0c;尽量不要找别人。自己的毕业前的一次大作业。努力完成也有…

Java项目:ssm高校党员管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 高校党员信息管理系统&#xff0c;分为普通用户和管理员两种角色。 普通用户登录后主要功能有&#xff1a; 我的中心:首页、个人资料、修改密…