精华内容
下载资源
问答
  • 最近,对微信公众号有点兴趣,就自己研究了研究里面的一些内容,发现还挺... 我想,做微信公众号开发的,对于想获取关注了公众号的用户信息,或者说是当前与后台服务器进行交互的当前用户信息,这个功能是很重要...

        最近,对微信公众号有点兴趣,就自己研究了研究里面的一些内容,发现还挺有意思的,而且通过微信公众号可以调用一些比较有意思的接口,就比如百度开发服务平台 点击进入 里面的很有接口,就比较常见的翻译,语音识别,地理位置等等,都挺好的。好了,不多说,进入正题好了。

        我想,做微信公众号开发的,对于想获取关注了公众号的用户信息,或者说是当前与后台服务器进行交互的当前用户信息,这个功能是很重要的吧。因为,通过这个,可以直接获取到当前的用户信息,而不需要,每次都是进行自己输入信息,这个只会让用户感觉到很不适。。。所以,为了解决这个需求,那咱们来研究研究,如何获取微信的个人信息~!

    大家可以关注我的微信公众号:Java菜鸟进阶之路。便于日常阅读哦!   

     

    目录

     (一)思路

    (二)情况一:通过用户与服务器进行消息交互,来获取用户信息

    (三)情况二:通过点击按钮,来直接获取到用户信息

    Github仓库地址:

    彩蛋:


     (一)思路

    我们来研究一下,要想获取到个人信息,是如何一个流程呢?

    路线图:

    上面,画了一个简单的一个流程图,我想,看着这个应该觉得不难吧。是的,确实思路很简单,但是,,里面的坑也不少。接下来,我对两种情况都进行讲解。

    (二)情况一:通过用户与服务器进行消息交互,来获取用户信息

    思路:针对这种情况的话,比较简单,因为,我们在做用户与服务器进行消息交互的时候,我们可以知道,用户发送的内容是以XML的形式进行发送的,然后服务器,首先接受到XML,然后再把XML转为Map对象,再从Map对象中获取对应的内容即可。那么,发送的XML的字段是个怎么样呢?

    字段信息:

    ToUserName:发送给谁的ID
    FromUserName:发消息方的ID(其实也就是用户的OpenId)
    CreateTime:消息发送时间,时间戳
    MsgType:消息类似,有文本,图片,音频,视频,事件推送等
    Content:发送的内容

    通过这个,我想大家,再结合上面给的流程图,是不是发现了什么呢?是的,这个OpenId,我们已经获取了呀,那是不是可以直接获取到用户信息了呢?。。。。emmmmmm,这样说吧。差不多是可以的,那具体是怎么做呢?紧接着往下看,仔细看我其中的注释

    步骤:

    1:解析发送过来的XML信息格式,将其转为Map格式

    /**
         * XML格式转为map格式
         * @param request
         * @return
         */
        public static Map<String , String> xmlToMap(HttpServletRequest request){
            Map<String ,String> map = new HashMap<String , String>();
            try {
                InputStream inputStream =null;
                inputStream = request.getInputStream();
                SAXReader reader = new SAXReader();
                Document doc = reader.read(inputStream);
                Element rootElement = doc.getRootElement();
                List<Element> elements = rootElement.elements();
                for (Element el:elements) {
                    map.put(el.getName() , el.getText());
                }
                inputStream.close();
                return map ;
            } catch (Exception e) {
                e.printStackTrace();
                return null ;
            }
        }

    备注:记得导入相应的包哦。。比如dom4j还有xsreader。。

    2:获取用户的个人信息

    package com.hnu.scw.utils;
    
    import com.hnu.scw.model.AccessToken;
    import net.sf.json.JSONObject;
    
    /**
     * @author scw
     * @create 2018-01-18 16:42
     * @desc 用于获取微信用户的信息
     **/
    public class WeiXinUserInfoUtils {
        private static final String GET_USERINFO_URL = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
    
        /**
         * 获取微信用户账号的相关信息
         * @param opendID  用户的openId,这个通过当用户进行了消息交互的时候,才有
         * @return
         */
        public static String getUserInfo(String opendID){
            AccessToken accessToken = WeiXinUtils.getAccessToken();
            //获取access_token
            String token = accessToken.getToken();
            String url = GET_USERINFO_URL.replace("ACCESS_TOKEN" , token);
            url = url.replace("OPENID" ,opendID);
            JSONObject jsonObject = WeiXinUtils.doGetStr(url);
            return jsonObject.toString();
        }
    }

    备注:传入的参数就是咱们之前说过的,FromUserName的值,这个应该不用多解释吧。因为,对于传入的XML,我们已经存入了Map中,那么直接从Map取出对应的字段信息就可以了,

    String fromUserName = map.get("FromUserName");

    3:通过上面,我们就得到了具体的用户信息的Json格式了,当然,我上面的方法将Json内容转为了String,我这里只是用于查看是否获取到信息了而已,所以,你们就根据各自的需求进行处理就可以了,该解析的就解析即可。。

    总结:

    上面的这种方法是不是很简单,这个没什么难的,而且这个根据微信公众号的开发手册也可以分析出来。

    缺点:我们发现了,这种方法,只有当用户进行了消息交互,才会有FromUserName(这时候可以等价看成是OpenId),那么我们在实际开发中,肯定遇到了一种情况,就是用户没有进行消息交互,直接点击一个菜单按钮,然后就把用户信息自动显示到了一个页面中,那这样是怎么做,方法是一样吗?不多说,继续看下面~~~~~~~~~

    (三)情况二:通过点击按钮,来直接获取到用户信息

    思路:首先,点击菜单按钮,要先到网页授权的接口去请求(主要是获取Code,这是必须要的一个参数),然后再重定向到我们自己菜单按钮实际想去的URL,然后再获取OpenId,再通过OpenId,获取用户信息。。哇塞,咦,思路挺简单的嘛。。那么,我们开始工作。。

    步骤:

    1:创建菜单

    对于这个自定义菜单的话,不是主要介绍的了,这个如果做过微信公众号开发的,应该都明白吧。所以,我这就贴一点关键代码:

    ViewButton viewButton = new ViewButton();
            viewButton.setName("view菜单");
            viewButton.setType("view");
            //viewButton.setUrl("http://myjava.ngrok.xiaomiqiu.cn/tomainpage");
            viewButton.setUrl("https://open.weixin.qq.com/connect/oauth2/authorize?appid=XXXXXX&redirect_uri=http://myjava.ngrok.xiaomiqiu.cn/tologin/userinfo&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect");

    备注:大家,请注意,这个view菜单的URL,和我们平常的跳转的区别再哪里。。

     

    分析:

    知识点1:

    https://open.weixin.qq.com/connect/oauth2/authorize?appid=XXXX

    这个就是网页授权的接口地址,其中的appid就是我们自己微信公众号申请的时候,给我们的唯一值,这个大家去微信公众号查看即可。

     

    知识点2:

    redirect_uri=http://myjava.ngrok.xiaomiqiu.cn/tologin/userinfo&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect");

    这个就是我们实际想要点击按钮,跳转到的页面,这个就和咱们平常的跳转是一样的,所以一定要记住,要先去授权页面,再重定向回去(主要是为了获取code参数)。

     

    2:配置微信公众号的网页授权域名

    备注:这个是在自己微信公众号的开发管理模块里面的,而且,我这里用的是测试号进行的(当然,如果有企业号这更加好呀。界面也是一样)

    注意点:对添加的回调页面域名:首先,不能加入http://这个,对于平常的链接,我想都有这个,这个是请求协议,但这里千万不能加入;另外,只需要写总的域名地址,不需要精确到最内层。打个比方:

    一般的:

    http://myjava.ngrok.xiaomiqiu.cn/tologin/userinfo

    这里就配置就只需要:(其实就是配置我们的服务器域名即可)

    myjava.ngrok.xiaomiqiu.cn

    3:编写,相应的处理内容(关键代码,请仔细看)

    备注:我用的是SSH(SpringMVC+Spring+Hibernate)框架来进行开发的,当然,用Servlet也可以,用SSM(SpringMVC+Spring+Mybatis)或者用SSH(Struts+Spring+Hibernate)都可以,这个根据自己的需求即可相应的改变呢!!(另外,这个几个框架,我其他的文章都有很详细的介绍了,所以自己看看相应配置即可)

    Controller层代码:

    package com.hnu.scw.controller;
    import com.hnu.scw.bean.WeiXinUser;
    import com.hnu.scw.service.WeiXinUserInfoService;
    import com.hnu.scw.utils.WeiXinUtils;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;
    import java.util.HashMap;
    import java.util.Map;
    /**
     * @author scw
     * @create 2018-01-18 17:47
     * @desc 获取微信用户的所有信息,这个主要是为了不要用户自己填写个人信息
     **/
    @Controller
    public class WeiXinUserInfoController {
    
        @Autowired
        private WeiXinUserInfoService userService;
    
        /**
         * 进行网页授权,便于获取到用户的绑定的内容
         * @param request
         * @param session
         * @param map
         * @return
         */
        @RequestMapping("/tologin/userinfo")
        public String check(HttpServletRequest request , HttpSession session, Map<String, Object> map) {
            //首先判断一下session中,是否有保存着的当前用户的信息,有的话,就不需要进行重复请求信息
            WeiXinUser  weiXinUser = null ;
            if(session.getAttribute("currentUser") != null){
                weiXinUser = (WeiXinUser) session.getAttribute("currentUser");
            }else {
                /**
                 * 进行获取openId,必须的一个参数,这个是当进行了授权页面的时候,再重定向了我们自己的一个页面的时候,
                 * 会在request页面中,新增这个字段信息,要结合这个ProjectConst.Get_WEIXINPAGE_Code这个常量思考
                 */
                String code = request.getParameter("code");
                try {
                    //得到当前用户的信息(具体信息就看weixinUser这个javabean)
                    weiXinUser = getTheCode(session, code);
                    //将获取到的用户信息,放入到session中
                    session.setAttribute("currentUser", weiXinUser);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            map.put("weiXinUser", weiXinUser);
            return "hello";
        }
    
        /**
         * 获取用户的openId
         * @param session
         * @param code
         * @return 返回封装的微信用户的对象
         */
        private WeiXinUser getTheCode(HttpSession session, String code) {
            Map<String , String>  authInfo = new HashMap<>();
            String openId = "";
            if (code != null)
            {
                // 调用根据用户的code得到需要的授权信息
                authInfo= userService.getAuthInfo(code);
               //获取到openId
                openId = authInfo.get("Openid");
            }
            // 获取基础刷新的接口访问凭证(目前还没明白为什么用authInfo.get("AccessToken");这里面的access_token就不行)
            String accessToken = WeiXinUtils.getAccessToken().getToken();
            //获取到微信用户的信息
            WeiXinUser userinfo = userService.getUserInfo(accessToken ,openId);
    
            return userinfo;
        }
    }

    Service层接口:

    package com.hnu.scw.service;
    import com.hnu.scw.bean.WeiXinUser;
    import java.util.Map;
    /**
     * 用于进行微信用户个人信息的操作接口
     */
    public interface WeiXinUserInfoService {
         /**
          * 获取到微信个人用户的信息
          * @param accessToken
          * @param openId
          * @return
          */
         WeiXinUser getUserInfo(String accessToken, String openId);
    
         /**
          *用于获取网页授权后的信息字段,其中主要是获取openId
          * @param code  授权码
          * @return
          */
         Map<String , String > getAuthInfo(String code);
    
         /**
          * 进行网页授权的认证
          * @param code 授权码
          * @return
          */
         Map<String,String> oauth2GetOpenid(String code);
    }
    

    Service层实现:

     

    package com.hnu.scw.service.imp;
    import com.hnu.scw.bean.WeiXinUser;
    import com.hnu.scw.projectconst.ProjectConst;
    import com.hnu.scw.service.WeiXinUserInfoService;
    import com.hnu.scw.utils.WeiXinUtils;
    import net.sf.json.JSONObject;
    import org.springframework.stereotype.Service;
    import java.util.HashMap;
    import java.util.Map;
    /**
     * @author scw
     * @create 2018-01-18 17:51
     * @desc 用于获取微信用户的信息
     **/
    @Service
    public class WeiXinUserInfoImlp implements WeiXinUserInfoService {
        /**
         * 获取微信用户的信息
         * @param accessToken
         * @param openId
         * @return
         */
        @Override
        public WeiXinUser getUserInfo(String accessToken, String openId) {
            WeiXinUser weixinUserInfo = null;
            // 拼接获取用户信息接口的请求地址
            String requestUrl = ProjectConst.GET_WEIXIN_USER_URL.replace("ACCESS_TOKEN", accessToken).replace(
                    "OPENID", openId);
            // 获取用户信息(返回的是Json格式内容)
            JSONObject jsonObject = WeiXinUtils.doGetStr(requestUrl);
    
            if (null != jsonObject) {
                try {
                    //封装获取到的用户信息
                    weixinUserInfo = new WeiXinUser();
                    // 用户的标识
                    weixinUserInfo.setOpenId(jsonObject.getString("openid"));
                    // 昵称
                    weixinUserInfo.setNickname(jsonObject.getString("nickname"));
                    // 用户的性别(1是男性,2是女性,0是未知)
                    weixinUserInfo.setSex(jsonObject.getInt("sex"));
                    // 用户所在国家
                    weixinUserInfo.setCountry(jsonObject.getString("country"));
                    // 用户所在省份
                    weixinUserInfo.setProvince(jsonObject.getString("province"));
                    // 用户所在城市
                    weixinUserInfo.setCity(jsonObject.getString("city"));
                    // 用户头像
                    weixinUserInfo.setHeadImgUrl(jsonObject.getString("headimgurl"));
                } catch (Exception e) {
                    if (0 == weixinUserInfo.getSubscribe()) {
                        System.out.println("用户并没有关注本公众号");
                    } else {
                        int errorCode = jsonObject.getInt("errcode");
                        String errorMsg = jsonObject.getString("errmsg");
                        System.out.println("由于"+errorCode +"错误码;错误信息为:"+errorMsg+";导致获取用户信息失败");
                    }
                }
            }
            return weixinUserInfo;
        }
    
        /**
         * 进行用户授权,获取到需要的授权字段,比如openId
         * @param code 识别得到用户id必须的一个值
         * 得到网页授权凭证和用户id
         * @return
         */
        @Override
        public Map<String, String> oauth2GetOpenid(String code) {
            //自己的配置appid(公众号进行查阅)
            String appid = ProjectConst.PROJECT_APPID;
            //自己的配置APPSECRET;(公众号进行查阅)
            String appsecret = ProjectConst.PROJECT_APPSECRET;
            //拼接用户授权接口信息
            String requestUrl = ProjectConst.GET_WEBAUTH_URL.replace("APPID", appid).replace("SECRET", appsecret).replace("CODE", code);
            //存储获取到的授权字段信息
            Map<String, String> result = new HashMap<String, String>();
            try {
                JSONObject OpenidJSONO = WeiXinUtils.doGetStr(requestUrl);
                //OpenidJSONO可以得到的内容:access_token expires_in  refresh_token openid scope
                String Openid = String.valueOf(OpenidJSONO.get("openid"));
                String AccessToken = String.valueOf(OpenidJSONO.get("access_token"));
                //用户保存的作用域
                String Scope = String.valueOf(OpenidJSONO.get("scope"));
                String refresh_token = String.valueOf(OpenidJSONO.get("refresh_token"));
                result.put("Openid", Openid);
                result.put("AccessToken", AccessToken);
                result.put("scope", Scope);
                result.put("refresh_token", refresh_token);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return result;
        }
    
        /**
         * 获取到微信用户的唯一的OpendID
         * @param code  这是要获取OpendId的必须的一个参数
         * @return
         */
        @Override
        public Map<String , String> getAuthInfo(String code) {
            //进行授权验证,获取到OpenID字段等信息
            Map<String, String> result = oauth2GetOpenid(code);
            // 从这里可以得到用户openid
            String openId = result.get("Openid");
    
            return result;
        }
    }

    4:GET请求接口的代码:

    package com.hnu.scw.utils;
    import com.hnu.scw.menu.BaseButton;
    import com.hnu.scw.menu.ClickButton;
    import com.hnu.scw.menu.CustomeMenu;
    import com.hnu.scw.menu.ViewButton;
    import com.hnu.scw.model.AccessToken;
    import net.sf.json.JSONObject;
    import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.entity.StringEntity;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.util.EntityUtils;
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    
    /**
     * @author scw
     * @create 2018-01-17 14:13
     * @desc 用户获取access_token,众号调用各接口时都需使用access_token
     **/
    public class WeiXinUtils {
        /**
         * Get请求,方便到一个url接口来获取结果
         * @param url
         * @return
         */
        public static JSONObject doGetStr(String url){
            DefaultHttpClient defaultHttpClient = new DefaultHttpClient();
            HttpGet httpGet = new HttpGet(url);
            JSONObject jsonObject = null;
            try{
                HttpResponse response = defaultHttpClient.execute(httpGet);
                HttpEntity entity = response.getEntity();
                if(entity != null){
                    String result = EntityUtils.toString(entity, "UTF-8");
                    jsonObject = JSONObject.fromObject(result);
                }
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return jsonObject;
        }

    5:获取Access_Token代码:(这个就是在4中的类中的方法)

    /**
         * 获取access_token
         * @return
         */
        public static AccessToken getAccessToken(){
            AccessToken accessToken = new AccessToken();
            String url = ACCESS_TOKEN_URL.replace("APPID" ,APPID).replace("APPSECRET",APPSECRET);
            JSONObject jsonObject = doGetStr(url);
            if(jsonObject !=null){
                accessToken.setToken(jsonObject.getString("access_token"));
                accessToken.setExpireIn(jsonObject.getInt("expires_in"));
            }
            return accessToken;
        }

    6:Access_Token的实体类

    package com.hnu.scw.model;
    /**
     * @author scw
     * @create 2018-01-17 14:35
     * @desc 封装AccessToken的实体
     **/
    public class AccessToken {
        private String token;
        private int expireIn;
    
        public String getToken() {
            return token;
        }
        public void setToken(String token) {
            this.token = token;
        }
        public int getExpireIn() {
            return expireIn;
        }
        public void setExpireIn(int expireIn) {
            this.expireIn = expireIn;
        }
    }

    7:用户信息的实体类

    package com.hnu.scw.bean;
    /**
     * @author scw
     * @create 2018-01-18 17:11
     * @desc 对于微信用户本身存在的信息的一个javabean,不需要在数据库中进行处理
     **/
    public class WeiXinUser {
        // 用户的标识
        private String openId;
        // 关注状态(1是关注,0是未关注),未关注时获取不到其余信息
        private int subscribe;
        // 用户关注时间,为时间戳。如果用户曾多次关注,则取最后关注时间
        private String subscribeTime;
        // 昵称
        private String nickname;
        // 用户的性别(1是男性,2是女性,0是未知)
        private int sex;
        // 用户所在国家
        private String country;
        // 用户所在省份
        private String province;
        // 用户所在城市
        private String city;
        // 用户的语言,简体中文为zh_CN
        private String language;
        // 用户头像
        private String headImgUrl;
        public String getOpenId() {
            return openId;
        }
        public void setOpenId(String openId) {
            this.openId = openId;
        }
        public int getSubscribe() {
            return subscribe;
        }
        public void setSubscribe(int subscribe) {
            this.subscribe = subscribe;
        }
        public String getSubscribeTime() {
            return subscribeTime;
        }
        public void setSubscribeTime(String subscribeTime) {
            this.subscribeTime = subscribeTime;
        }
        public String getNickname() {
            return nickname;
        }
        public void setNickname(String nickname) {
            this.nickname = nickname;
        }
        public int getSex() {
            return sex;
        }
        public void setSex(int sex) {
            this.sex = sex;
        }
        public String getCountry() {
            return country;
        }
        public void setCountry(String country) {
            this.country = country;
        }
        public String getProvince() {
            return province;
        }
        public void setProvince(String province) {
            this.province = province;
        }
        public String getCity() {
            return city;
        }
        public void setCity(String city) {
            this.city = city;
        }
        public String getLanguage() {
            return language;
        }
        public void setLanguage(String language) {
            this.language = language;
        }
        public String getHeadImgUrl() {
            return headImgUrl;
        }
        public void setHeadImgUrl(String headImgUrl) {
            this.headImgUrl = headImgUrl;
        }
    }

    8:一些静态常量的接口地址:

    package com.hnu.scw.projectconst;
    
    /**
     * @author scw
     * @create 2018-01-18 15:31
     * @desc 项目相关的静态量
     **/
    public class ProjectConst {
        /**
         * 用于获取当前与微信公众号交互的用户信息的接口(一般是用第一个接口地址)
         */
        public static final String GET_WEIXIN_USER_URL = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID";
        public final static String GetPageUsersUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
    
        /**
         * 用于进行网页授权验证的接口URL,通过这个才可以得到opendID等字段信息
         */
        public final static String GET_WEBAUTH_URL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
    
        /**
         * 用于进行当点击按钮的时候,能够在网页授权之后获取到code,再跳转到自己设定的一个URL路径上的接口,这个主要是为了获取之后于
         * 获取openId的接口相结合
         * 注意:参数:toselfURL  表示的是当授权成功后,跳转到的自己设定的页面,所以这个要根据自己的需要进行修改
         */
        public final static String Get_WEIXINPAGE_Code = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=toselfURL&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect";
        /**
         * 获取access_token的URL
         */
        private static final String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
    
    }

    9:大功告成。。。。哇塞,完美解决。。

    总结:

    这种方式,相对于上面的话,好处就在于,不需要进行消息交互就可以获取到用户的信息,这样其实更符合我们的业务需求,相对于更加好。但是,第一种情况也是有实用价值的,所以,我们要客观的进行评价和使用~~~~当然,这里面还有很多的可以优化的地方,就是,比如获取Access_Token,我们一般都是弄到本地,因为微信公众号一天请求的次数有限制(2000),所以这可以进行优化哦。。。。其他的根据需求来就可以啦!!!!!!!!

         好了,这个就介绍这个多了,都是经过本人亲自测试通过后的代码,所以,大家可以放心的使用,有问题的话,可以进行留言交流哦。。。

    Github仓库地址:

    https:https://github.com/qq496616246/WeChatCode.git

    git:git@github.com:qq496616246/WeChatCode.git

    彩蛋

    如果你想利用闲暇零散的学习技术,那么不妨关注我的公众号阅读你想要的文章哦!

    公众号搜索:Java菜鸟进阶之路

    展开全文
  • 修改个人信息

    千次阅读 2019-06-24 17:50:19
    哈哈哈修改个人信息,我用了好久成功了 包含修改头像、昵称、性别、生日、收货地址 以下是我的代码块分享 …吼吼吼 <template> <view class="uni-all"> <view class="uni-back"> <hr ...

    哈哈哈修改个人信息,我用了好久成功了

    包含修改头像、昵称、性别、生日、收货地址

    以下是我的代码块分享 …吼吼吼

    <template>
    	<view class="uni-all">
    		<view class="uni-back">
    			<hr style="background: #e2e2e2;border: none;height: 0.2rem;" />
    			<view class="tou" v-if="avatar==null">
    				<view @tap="chooseimg">
    					<image :src="images"></image>
    				</view>
    				<view style="color: #acacac;">上传头像</view>
    			</view>
    			<view class="tou" v-if="avatar!=null">
    				<view @tap="excaimg">
    					<image :src="avatar"></image>
    				</view>
    				<view style="color: #acacac;">更改头像</view>
    			</view>
    			<hr style="background: #e2e2e2;border: none;height: 0.2rem;" />
    			<view class="hq" @click="name">
    				<view class="zi">昵称</view>
    				<view class="zi-tele" v-model="username">{{username}}</view>
    				<view class="iconfont">&#xe64d;</view>
    			</view>
    			<hr style="background: #e2e2e2;border: none;height:3upx;width: 90%;margin-left: 50upx;" />
    			<view class="hq" @click="sex">
    				<view class="zi">性别</view>
    				<view class="zi-tele" v-model="gender" v-if="gender==1"></view>
    				<view class="zi-tele" v-model="gender" v-if="gender==0"></view>
    				<view class="iconfont">&#xe64d;</view>
    			</view>
    			<hr style="background: #e2e2e2;border: none;height:3upx;width: 90%;margin-left: 50upx;" />
    			<view class="hq">
    				<view class="zi">生日</view>
    				<picker mode="date" :value="birthday" :start="startDate" :end="endDate" @change="bindDateChange">
    					<view class="uni-input" v-model="birthday">{{birthday}}</view>
    				</picker>
    				<view class="iconfont">&#xe64d;</view>
    			</view>
    			<hr style="background: #e2e2e2;border: none;height: 0.2rem; margin-left: 50upx;" />
    			<view class="hq" @tap="getAddress">
    				<view class="zi">收货地址</view>
    				<view class="iconfont">&#xe64d;</view>
    			</view>
    			<hr style="background: #e2e2e2;border: none;height: 0.2rem; margin-left: 50upx;" />
    			<view class="hq" @tap="exchangePwd">
    				<view class="zi">修改密码</view>
    				<view class="iconfont">&#xe64d;</view>
    			</view>
    			<hr style="background: #e2e2e2;border: none;height: 0.2rem; margin-left: 50upx;" />
    
    		</view>
    		<view class="uni-comment" @tap="comment">
    			确定提交
    		</view>
    		<!-- <view class="bg" v-if='all' @tap="yin"> -->
    		<view class="bg" v-if='all'>
    			<view class="bg-bei">
    				修改姓名
    				<input class="bg-input" type="text" v-model="nick" placeholder="请输入昵称" />
    				<view class="bg-comment" @tap="yin">
    					<view class="ok" @change="onKeyInput" @tap="mynick">
    						确定
    					</view>
    					<view class="quxiao" @tap="quxiao">
    						取消
    					</view>
    				</view>
    			</view>
    		</view>
    	</view>
    </template>
    
    <script>
    	import {
    		pathToBase64,
    		base64ToPath
    	} from '@/common/index.js'
    
    	function getDate(type) {
    		const birthday = new Date();
    
    		let year = birthday.getFullYear();
    		let month = birthday.getMonth() + 1;
    		let day = birthday.getDate();
    
    		if (type === 'start') {
    			year = year-40;
    		} else if (type === 'end') {
    			year = year;
    		}
    		month = month > 9 ? month : '0' + month;;
    		day = day > 9 ? day : '0' + day;
    
    		return `${year}-${month}-${day}`;
    	}
    	export default {
    		data() {
    			var that = this
    			return {
    				title: "个人信息界面",
    				stop: false,
    				images: '../../static/icc.png',
    				all: false,
    				username: '',
    				avatar: '../../static/icc.png',
    				gender: '',
    				birthday: getDate('end'),
    				startDate: getDate('start'),
    				endDate: getDate('end'),
    				nick: ''
    			}
    		},
    		methods: {
    			onKeyInput: function(event) {
    				this.nick = event.target.username
    			},
    			name() {
    				var that = this
    				that.all = true
    			},
    			yin() {
    				let that = this
    				that.all = false
    			},
    			sex() {
    				var that = this
    				uni.showActionSheet({
    					itemList: ['女', '男'],
    					success: function(res) {
    						// alert('选中了第' + (res.tapIndex + 1) + '个按钮');
    						that.gender = res.tapIndex
    					},
    					fail: function(res) {
    						console.log(res.errMsg);
    					}
    				});
    			},
    			bindDateChange: function(e) {
    				this.birthday = e.target.value
    				console.log(this.birthday)
    			}
    </style>
    
    

    看上去很乱,,,但是功能还是有的 、、、、、 哈哈哈哈

    展开全文
  • 近年,随着信息技术的快速发展和互联网应用的普及,越来越多的组织大量收集、使用个人信息,给人们生活带来便利的同时,也出现了对个人信息的非法收集、滥用、泄露等问题,个人信息安全面临严重威胁。本标准针对个人...

    GB/T 35273—2020《信息安全技术个人信息安全规范》

    2020年3月6日,国家市场监督管理总局国家标准化管理委员会正式发布 GB/T 35273—2020《信息安全技术个人信息安全规范》

    GB/T 35273—2020《信息安全技术个人信息安全规范》标准是按照GB/T
    1.1—2009给出的规则起草,2020年10月1日正式实施,届时将代替原GB/T 35273-2017《信息安全技术个人信息安全规范》标准

    GB/T 35273—2020 与 GB/T 35273-2017相比,主要有变化如下:

    • 增加了“多项业务功能的自主选择”
    • 修改了“征得授权同意的例外;
    • 增加了“用户画像的使用限制”
    • 增加了“个性化展示的使用”
    • 增加了“基于不同业务目所收集个人信息的汇聚融合”
    • 修改了“个人信息主体注销账户”
    • 增加了“第三方接入管理”(见9.7);
    • 修改了“明确责任部门与人员”;
    • 增加了“个人信息安全工程”;
    • 增加了“个人信息处理活动记录”;
    • 修改了“实现个人信息主体自主意愿的方法”

    附下载地址:download.csdn.net/download/weixin_46192679/12234069


    在这里插入图片描述

    展开全文
  • 个人信息修改模块

    万次阅读 2016-07-17 05:19:03
    个人信息修改模块

    个人信息修改模块

    展开全文
  • 一个基于C语言的学生成绩管理系统,适合大一学生设计C语言课程设计参考之用。...个人信息的新增 个人信息的删除 个人信息的修改 根据名字查找学生的信息 根据学号查找学生的信息 输出所有学生的信息 ...
  • 如何解决个人信息泄露问题

    千次阅读 2021-03-23 16:32:05
    今年的央视3·15晚会上,多家企业因通过公民个人信息谋利而被曝光。 随着信息化与经济社会的深度融合,利用个人信息侵扰群众生活的现象屡见不鲜,由此滋生的电信诈骗等各类违法犯罪活动愈演愈烈。个人信息保护...
  • Github地址:美食分享平台,欢迎star和fork 注:本文只包括活动的设计和头像组件的引用,不包括界面xml的设计,界面设计具体详见Android开发(3):个人信息界面设计 ...
  • python爬取个人信息

    千次阅读 2019-04-01 16:05:04
    功能是爬取制定网站的个人信息。属于硬生生爬的那种。正则还不会。等我的书回来好好看一下,觉得爬虫很帅,还要学习有灵魂的爬。 # -*- coding: utf-8 -*- import urllib import urllib2 import re # ----------...
  • html——个人信息网页

    万次阅读 2018-03-25 22:34:36
    今天花了一晚上的时间,使用html编写了一个简单的个人信息网页。注:不知道为什么代码上传的时候空格符&amp;nbsp都不见。&lt;html&gt; &lt;head&gt; &lt;meta charset=utf-8"&gt...
  • 个人信息安全管理条例解释

    千次阅读 2019-11-06 19:45:56
    给人们生活带来便利的同时,也出现了对个人信息的 非法收集、滥用、泄露 等问题,个人信息安全面临严重威胁。 为了保护公民个人隐私数据不被肆意收集、滥用、泄漏甚至非法售卖,各国政府纷纷出台相关法律政策文件,...
  • python爬取抖音用户个人信息

    千次阅读 2019-07-25 18:30:37
    公司最近有个需求,要求抖音网红入驻平台的时候获取到抖音网红的个人信息页面的数据: 粉丝数 关注数 点赞数 抖音昵称 抖音头像 抖音号 一开始的思路是抖音网红提供抖音号,通过appium自动化通过抖音号搜索获取...
  • 前言:初次尝试微信公众号的开发,对于学习方法的探索都是来源于网上的博客、问答,对于参差不齐的信息,自己也是有苦说不出,抽出一点时间写点文章,既是对自己的学习总结,也希望给予同是菜鸟的学渣一点帮助背景...
  • 微信小程序个人信息页面

    万次阅读 2018-05-11 08:02:28
    在微信小程序中我们要显示个人信息的页面,在个人信息页面中我们还需要修改一系列的信息,那么就来看看个人信息的页面该怎么搭建吧,以及获取信息内容。前台页面wxml的搭建&lt;!--pages/personal/personal.wxml-...
  • Python进阶(十八)-Python3爬虫小试牛刀之爬取CSDN博客个人信息  这篇文章主要介绍了如何使用Python3爬取csdn博客访问量的相关资料,在Python2已实现的基础上实现Python3爬虫,对比版本之间的差异所在,需要的朋友...
  • 利用html实现个人信息登录页面

    万次阅读 2019-06-02 14:59:15
    3、编写个人信息页面代码: (1)添加个性关键词: (2)个人信息: (3)页面背景图片和底部的个性词设置: 注:对信息中的地址添加相应的链接。点击后可以跳转到相应的地址页面,并可以进行浏览。 (4)实现...
  • 修改个人信息的实现

    千次阅读 2019-04-18 14:57:17
    修改个人信息的实现 首先要在界面上写出你的动作 编号 用户账号 密码 Email 性别 年龄 工作 爱好 备注 修改 ...
  • 831. 隐藏个人信息

    千次阅读 2019-06-17 08:15:25
    给你一条个人信息 string S,它可能是一个邮箱地址,也可能是一个电话号码。 我们将隐藏它的隐私信息,通过如下规则: <u>1. 电子邮箱</u> 定义名称 <name> 是长度大于等于 2 (length ≥ 2)...
  • 1.微信目前是需要点击按钮获取权限,然后个人信息(头像、昵称) 2.获取用户的openId更多信息 3.分享到群的时候,可以获得群的openGId,然后显示群的昵称 注意问题:app.js中通过后台获取用户更多的信息时,因为...
  • App个人信息保护管理暂行规定即将出台

    千次阅读 多人点赞 2021-02-14 13:45:53
    可在大数据时代,即使是「只言片语」,甚至是微信的好友关系,背后也包含着大量个人信息。在有心人手中,这些个人信息除了能用于定向广告,还有可能成为电信诈骗,甚至是恶性暴力犯罪滋生的「温床」。 所以近年来...
  • 你的个人信息安全吗?

    千次阅读 2020-01-25 14:27:18
    你的个人信息安全吗?前言规律个人信息QQ密码的穷举中国最发达的行业是 服务行业90% 的人都玩游戏现代人写字的习惯是 从左到右人们在为某件事物取名字时更加偏向于自己 最熟悉的信息人们在做大量重复性工作时会产生一...
  • Xposed获取微信个人信息

    千次阅读 2019-01-28 11:29:40
    微信有后台自启动权限,启动会读取个人信息哈~ 第一步:反编译微信 jadx查看代码(此处省略此步骤) 第二步:搜索Launcher,我们可以看到LancherUI.class  第三步:找到Oncreate,然后看到一个可疑字符串...
  • 豆瓣个人信息的爬取

    千次阅读 2018-08-21 15:04:16
    通过scrapy框架模拟登陆豆瓣并进入个人信息页面 # -*- coding: utf-8 -*- import scrapy from scrapy.http import Request,FormRequest import urllib.request class DbSpider(scrapy.Spider): name = 'db' ...
  • Git个人信息的配置

    千次阅读 2016-04-12 11:00:53
     在提交代码的时候最好让管理员看见提交代码人员的个人信息,如果提交代码有问题的话,管理员会通过邮件及时通知你。我在重新init工程后,个人信息丢失了。以下是解决办法:  在使用Git时,你的个人信息会保存在...
  • java如何获取支付宝的个人信息的花呗信息、借呗信息、芝麻信用分,是通过支付宝接口还是爬虫。 如果是接口是哪一个接口,是花费买的还是免费接口。
  • 个人信息安全现状及保护方法

    万次阅读 2017-04-02 23:21:02
    个人信息安全现状及保护方法 摘要 随着科技的高速发展,互联网,智能设备的日益普及,大数据处理技术和云计算技术的应用越来越多,普通用户的个人信息数据越来越多并且越来越完整的被各种信息系统收集,...
  • Google浏览器修改个人信息路径

    千次阅读 2020-05-03 16:07:06
    Google浏览器个人信息模块转移,释放C盘容量 1,找到上面路径下的谷歌,点进去,将其全部内容复制到C盘以外,你想放置的路径中。 2,点击Chrome\Application进去找到Google.exe文件,生成快捷...
  • PHP——个人信息管理系统

    万次阅读 多人点赞 2016-10-07 15:06:28
    楼主近来无事,做了一个个人信息管理系统,希望能给小白一点启发,大神不要吐槽,欢迎技术交流,文明批评。鞋鞋! 先贴上数据库结构图 表单中有id,用户名,昵称,性别,密码,注册时间,个性签名,头像,...
  • 近日,中央网信办公开发布《关于做好个人信息保护利用大数据支撑联防联控工作的通知》(以下简称《通知》),明确为疫情防控、疾病防治收集的个人信息,不得用于其他用途。任何单位和个人未经被收集者同意,不得公开...
  • Android开发(3):个人信息界面设计

    千次阅读 多人点赞 2020-02-18 20:05:42
    活动设计和后台可以参见Android开发(4):个人信息修改个人信息,修改头像设计 效果图 思路 这个界面可以分为三个部分:标题栏,头像栏,其他信息栏。 标题栏其他界面也可能用到,可以直接设计成一个widget 头像...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 87,705
精华内容 35,082
关键字:

个人信息