diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 06f64d98..8339d832 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -379,8 +379,8 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; + CODE_SIGN_IDENTITY = "iPhone Distribution"; + CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 8; DEVELOPMENT_TEAM = R45ZDS6S92; ENABLE_BITCODE = NO; @@ -401,7 +401,7 @@ MARKETING_VERSION = 1.0.5; PRODUCT_BUNDLE_IDENTIFIER = "com.aku-new-community.bee"; PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; + PROVISIONING_PROFILE_SPECIFIER = dyb; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 1; @@ -523,8 +523,8 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; + CODE_SIGN_IDENTITY = "iPhone Distribution"; + CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 8; DEVELOPMENT_TEAM = R45ZDS6S92; ENABLE_BITCODE = NO; @@ -545,7 +545,7 @@ MARKETING_VERSION = 1.0.5; PRODUCT_BUNDLE_IDENTIFIER = "com.aku-new-community.bee"; PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; + PROVISIONING_PROFILE_SPECIFIER = dyb; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -561,8 +561,8 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; + CODE_SIGN_IDENTITY = "iPhone Distribution"; + CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 8; DEVELOPMENT_TEAM = R45ZDS6S92; ENABLE_BITCODE = NO; @@ -583,7 +583,7 @@ MARKETING_VERSION = 1.0.5; PRODUCT_BUNDLE_IDENTIFIER = "com.aku-new-community.bee"; PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; + PROVISIONING_PROFILE_SPECIFIER = dyb; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 1; diff --git a/lib/constants/new_api.dart b/lib/constants/new_api.dart new file mode 100644 index 00000000..fa79237f --- /dev/null +++ b/lib/constants/new_api.dart @@ -0,0 +1,17 @@ +class NEWAPI { + ///HOST + static const String host = 'http://127.0.0.1:8006'; + + ///接口基础地址 + static const String baseURL = '$host'; + //根分类 + static _Questionnaire questionnaire = _Questionnaire(); +} +class _Questionnaire { + ///查询所有的问卷调查 + String get list => '/app/user/questionnaire/list'; + ///根据问卷主键id查询问卷详情 + String get detail => '/app/user/questionnaire/findById'; + ///问卷调查提交 + String get submit => '/app/user/questionnaire/submit'; +} \ No newline at end of file diff --git a/lib/constants/saas_api.dart b/lib/constants/saas_api.dart index e3110241..659efe11 100644 --- a/lib/constants/saas_api.dart +++ b/lib/constants/saas_api.dart @@ -39,6 +39,8 @@ class SAASAPI { static _Balance balance = _Balance(); static _CommunityIntroduce communityIntroduce = _CommunityIntroduce(); static _ConveniencePhone conveniencePhone = _ConveniencePhone(); + static _CommitteeStaff committeeStaff = _CommitteeStaff(); + static _Advice advice = _Advice(); ///二级分类 static _ProfileApi profile = _ProfileApi(); @@ -352,3 +354,23 @@ class _ConveniencePhone { ///查询app便民电话 String get list => '/app/user/conveniencePhone/list'; } +class _CommitteeStaff { + ///查询业委会列表 + String get list => '/app/user/industryCommittee/list'; +} +class _Advice{ + ///查询所有投诉的列表 + String get list => '/app/user/advice/list'; + ///添加建议咨询/投诉表扬 信息 + String get insert => '/app/user/advice/insert'; + ///根据咨询建议/投诉表扬主键id 查询 咨询建议/投诉表扬信息 + String get find => '/app/user/advice/findById'; + ///继续提问 + String get reQuestion => '/app/user/advice/reQuestion'; + ///完成反馈 + String get complete => '/app/user/advice/complete'; + ///评价 + String get evaluate => '/app/user/advice/evaluate'; + ///批量删除咨询建议/投诉表扬信息 + String get delete => '/app/user/advice/delete'; +} \ No newline at end of file diff --git a/lib/model/manager/advice_detail_model.dart b/lib/model/manager/advice_detail_model.dart index 1ea5e6c9..6e73b5c4 100644 --- a/lib/model/manager/advice_detail_model.dart +++ b/lib/model/manager/advice_detail_model.dart @@ -3,79 +3,62 @@ import 'package:common_utils/common_utils.dart'; import 'package:aku_new_community/model/common/img_model.dart'; class AdviceDetailModel { - AppAdviceDetailVo? appAdviceDetailVo; + AppAdviceFBIDetailVo? appAdviceFBIDetailVo; + List? appAdviceFBIContentVos; - AdviceDetailModel({this.appAdviceDetailVo}); + AdviceDetailModel({this.appAdviceFBIDetailVo, this.appAdviceFBIContentVos}); AdviceDetailModel.fromJson(Map json) { - appAdviceDetailVo = json['appAdviceDetailVo'] != null - ? new AppAdviceDetailVo.fromJson(json['appAdviceDetailVo']) + appAdviceFBIDetailVo = json['appAdviceFBIDetailVo'] != null + ? new AppAdviceFBIDetailVo.fromJson(json['appAdviceFBIDetailVo']) : null; - } - - Map toJson() { - final Map data = new Map(); - if (this.appAdviceDetailVo != null) { - data['appAdviceDetailVo'] = this.appAdviceDetailVo!.toJson(); - } - return data; - } -} - -class AppAdviceDetailVo { - AppAdviceVo? appAdviceVo; - List? appAdviceContentVos; - - AppAdviceDetailVo({this.appAdviceVo, this.appAdviceContentVos}); - - AppAdviceDetailVo.fromJson(Map json) { - appAdviceVo = json['appAdviceVo'] != null - ? new AppAdviceVo.fromJson(json['appAdviceVo']) - : null; - if (json['appAdviceContentVos'] != null) { - appAdviceContentVos = []; - json['appAdviceContentVos'].forEach((v) { - appAdviceContentVos!.add(new AppAdviceContentVos.fromJson(v)); + if (json['appAdviceFBIContentVos'] != null) { + appAdviceFBIContentVos = []; + json['appAdviceFBIContentVos'].forEach((v) { + appAdviceFBIContentVos!.add(new AppAdviceFBIContentVos.fromJson(v)); }); } } Map toJson() { final Map data = new Map(); - if (this.appAdviceVo != null) { - data['appAdviceVo'] = this.appAdviceVo!.toJson(); + if (this.appAdviceFBIDetailVo != null) { + data['appAdviceFBIDetailVo'] = this.appAdviceFBIDetailVo!.toJson(); } - if (this.appAdviceContentVos != null) { - data['appAdviceContentVos'] = - this.appAdviceContentVos!.map((v) => v.toJson()).toList(); + if (this.appAdviceFBIContentVos != null) { + data['appAdviceFBIContentVos'] = + this.appAdviceFBIContentVos!.map((v) => v.toJson()).toList(); } return data; } } -class AppAdviceVo { +class AppAdviceFBIDetailVo { int? id; int? type; int? status; String? content; + int? score; String? createDate; List? imgUrls; DateTime? get date => DateUtil.getDateTime(createDate!); - AppAdviceVo( + AppAdviceFBIDetailVo( {this.id, this.type, this.status, this.content, + this.score, this.createDate, this.imgUrls}); - AppAdviceVo.fromJson(Map json) { + AppAdviceFBIDetailVo.fromJson(Map json) { id = json['id']; type = json['type']; status = json['status']; content = json['content']; + score = json['score']; createDate = json['createDate']; if (json['imgUrls'] != null) { imgUrls = []; @@ -91,6 +74,7 @@ class AppAdviceVo { data['type'] = this.type; data['status'] = this.status; data['content'] = this.content; + data['score'] = this.score; data['createDate'] = this.createDate; if (this.imgUrls != null) { data['imgUrls'] = this.imgUrls!.map((v) => v.toJson()).toList(); @@ -99,14 +83,14 @@ class AppAdviceVo { } } -class AppAdviceContentVos { +class AppAdviceFBIContentVos { int? id; int? createUserType; String? content; String? createDate; int? parentId; - AppAdviceContentVos( + AppAdviceFBIContentVos( {this.id, this.createUserType, this.content, @@ -115,7 +99,7 @@ class AppAdviceContentVos { DateTime? get date => DateUtil.getDateTime(createDate!); - AppAdviceContentVos.fromJson(Map json) { + AppAdviceFBIContentVos.fromJson(Map json) { id = json['id']; createUserType = json['createUserType']; content = json['content']; diff --git a/lib/model/manager/questinnaire_model.dart b/lib/model/manager/questinnaire_model.dart index 33e79eee..9a64ac11 100644 --- a/lib/model/manager/questinnaire_model.dart +++ b/lib/model/manager/questinnaire_model.dart @@ -10,6 +10,8 @@ class QuestionnaireModel { int? answerNum; List? imgUrls; List? headImgURls; + bool? answered; + bool? allowAnswer; QuestionnaireModel( {this.id, @@ -20,7 +22,10 @@ class QuestionnaireModel { this.status, this.answerNum, this.imgUrls, - this.headImgURls}); + this.headImgURls, + this.answered, + this.allowAnswer, + }); QuestionnaireModel.fromJson(Map json) { id = json['id']; @@ -44,6 +49,9 @@ class QuestionnaireModel { }); } else headImgURls = []; + answered = json['answered']; + allowAnswer = json['allowAnswer']; + } Map toJson() { @@ -61,6 +69,8 @@ class QuestionnaireModel { if (this.headImgURls != null) { data['headImgURls'] = this.headImgURls!.map((v) => v.toJson()).toList(); } + data['answered']=this.answered; + data['allowAnswer']=this.allowAnswer; return data; } } diff --git a/lib/model/manager/questionnaire_detail_model.dart b/lib/model/manager/questionnaire_detail_model.dart index 7556322a..6136971c 100644 --- a/lib/model/manager/questionnaire_detail_model.dart +++ b/lib/model/manager/questionnaire_detail_model.dart @@ -24,15 +24,15 @@ class QuestionnaireDetialModel { description = json['description']; beginDate = json['beginDate']; endDate = json['endDate']; - if (json['questionnaireTopicVoList'] != null) { + if (json['appQuestionnaireFBITopicVoList'] != null) { questionnaireTopicVoList = []; - json['questionnaireTopicVoList'].forEach((v) { + json['appQuestionnaireFBITopicVoList'].forEach((v) { questionnaireTopicVoList!.add(new QuestionnaireTopicVoList.fromJson(v)); }); } - if (json['voResourcesImgList'] != null) { + if (json['imgList'] != null) { voResourcesImgList = []; - json['voResourcesImgList'].forEach((v) { + json['imgList'].forEach((v) { voResourcesImgList!.add(new ImgModel.fromJson(v)); }); } else @@ -47,11 +47,11 @@ class QuestionnaireDetialModel { data['beginDate'] = this.beginDate; data['endDate'] = this.endDate; if (this.questionnaireTopicVoList != null) { - data['questionnaireTopicVoList'] = + data['appQuestionnaireFBITopicVoList'] = this.questionnaireTopicVoList!.map((v) => v.toJson()).toList(); } if (this.voResourcesImgList != null) { - data['voResourcesImgList'] = + data['imgList'] = this.voResourcesImgList!.map((v) => v.toJson()).toList(); } return data; @@ -71,9 +71,9 @@ class QuestionnaireTopicVoList { id = json['id']; type = json['type']; topic = json['topic']; - if (json['questionnaireChoiceVoList'] != null) { + if (json['appQuestionnaireFBITopicChoiceVoList'] != null) { questionnaireChoiceVoList = []; - json['questionnaireChoiceVoList'].forEach((v) { + json['appQuestionnaireFBITopicChoiceVoList'].forEach((v) { questionnaireChoiceVoList! .add(new QuestionnaireChoiceVoList.fromJson(v)); }); @@ -87,7 +87,7 @@ class QuestionnaireTopicVoList { data['type'] = this.type; data['topic'] = this.topic; if (this.questionnaireChoiceVoList != null) { - data['questionnaireChoiceVoList'] = + data['appQuestionnaireFBITopicChoiceVoList'] = this.questionnaireChoiceVoList!.map((v) => v.toJson()).toList(); } else questionnaireChoiceVoList = []; diff --git a/lib/model/manager/suggestion_or_complain_model.dart b/lib/model/manager/suggestion_or_complain_model.dart index c022b91c..81e6691e 100644 --- a/lib/model/manager/suggestion_or_complain_model.dart +++ b/lib/model/manager/suggestion_or_complain_model.dart @@ -36,16 +36,16 @@ class SuggestionOrComplainModel { } } -class ImgUrls { +class imgUrls { String? url; String? size; int? longs; int? paragraph; int? sort; - ImgUrls({this.url, this.size, this.longs, this.paragraph, this.sort}); + imgUrls({this.url, this.size, this.longs, this.paragraph, this.sort}); - ImgUrls.fromJson(Map json) { + imgUrls.fromJson(Map json) { url = json['url']; size = json['size']; longs = json['longs']; diff --git a/lib/model/user/committee_item_model.dart b/lib/model/user/committee_item_model.dart index bfc15d40..6565a1da 100644 --- a/lib/model/user/committee_item_model.dart +++ b/lib/model/user/committee_item_model.dart @@ -1,86 +1,53 @@ import 'package:aku_new_community/model/common/img_model.dart'; +import 'package:common_utils/common_utils.dart'; +import 'package:json_annotation/json_annotation.dart'; +@JsonSerializable() class CommitteeItemModel { - int? id; - int? positionId; - String? name; - int? sexId; - int? age; - int? educationId; - String? roomName; - String? profession; - String? roomNumber; - int? unitNo; - int? estateNo; - List? imgUrls; + final int? id; + final String? name; + final String? tel; + final String? industryCommitteeTypeName; + final String? buildingName; + final String? unitName; + final String? estateName; + final String? appointmentStartTime; + final String? appointmentEndTime; + final String? createDate; + final List? imgList; - String get sexValue { - if (sexId == 0 || sexId == null) return '未设置'; - if (sexId == 1) return '男'; - if (sexId == 2) return '女'; - return '未设置'; - } - - String get positionValue { - switch (positionId) { - case 1: - return '业委会主任'; - case 2: - return '业委会副主任'; - case 3: - return '业委会委员'; - default: - return ''; - } - } - - CommitteeItemModel({ - this.id, - this.positionId, - this.name, - this.sexId, - this.age, - this.educationId, - this.roomName, - this.profession, - this.roomNumber, - this.unitNo, - this.estateNo, - this.imgUrls, + factory CommitteeItemModel.fromJson(Map json) => + _$CommitteeItemModel(json); + DateTime? get appointmentStartDT => DateUtil.getDateTime(appointmentStartTime!); + DateTime? get appointmentEndDT => DateUtil.getDateTime(appointmentEndTime!); + DateTime? get createDateDT => DateUtil.getDateTime(createDate!); + const CommitteeItemModel({ + required this.id, + required this.name, + required this.tel, + required this.industryCommitteeTypeName, + required this.buildingName, + required this.unitName, + required this.estateName, + required this.appointmentStartTime, + required this.appointmentEndTime, + required this.createDate, + required this.imgList, }); - - CommitteeItemModel.fromJson(Map json) { - id = json['id']; - positionId = json['positionId']; - name = json['name']; - sexId = json['sexId']; - age = json['age']; - educationId = json['educationId']; - roomName = json['roomName']; - profession = json['profession']; - roomNumber = json['roomNumber']; - unitNo = json['unitNo']; - estateNo = json['estateNo']; - if (json['imgUrls'] != null) { - imgUrls = - (json['imgUrls'] as List).map((e) => ImgModel.fromJson(e)).toList(); - } else - imgUrls = []; - } - - Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['positionId'] = this.positionId; - data['name'] = this.name; - data['sexId'] = this.sexId; - data['age'] = this.age; - data['educationId'] = this.educationId; - data['roomName'] = this.roomName; - data['profession'] = this.profession; - data['roomNumber'] = this.roomNumber; - data['unitNo'] = this.unitNo; - data['estateNo'] = this.estateNo; - return data; - } } +CommitteeItemModel _$CommitteeItemModel(Map json) => + CommitteeItemModel( + id: json['id'] as int, + name: json['name'] as String, + tel: json['tel'] as String, + industryCommitteeTypeName: json['industryCommitteeTypeName'] as String, + buildingName: json['buildingName'] as String, + unitName: json['unitName'] as String, + estateName: json['estateName'] as String, + appointmentStartTime: json['appointmentStartTime'] as String, + appointmentEndTime: json['appointmentEndTime'] as String, + createDate: json['createDate'] as String, + imgList: (json['imgList'] as List) + .map((e) => ImgModel.fromJson(e as Map)) + .toList(), + ); \ No newline at end of file diff --git a/lib/pages/convenient_phone/convenient_phone_page.dart b/lib/pages/convenient_phone/convenient_phone_page.dart index 6c03a7ed..bcd20e2b 100644 --- a/lib/pages/convenient_phone/convenient_phone_page.dart +++ b/lib/pages/convenient_phone/convenient_phone_page.dart @@ -111,7 +111,7 @@ class _ConvenientPhonePageState extends State { CupertinoIcons.search, size: 42.w, ), - contentPadding: EdgeInsets.only(top: 14.w), + contentPadding: EdgeInsets.only(top: 3.w), // isDense: true, hintText: '搜索机构', hintStyle: diff --git a/lib/pages/industry_committee/industry_committee_page.dart b/lib/pages/industry_committee/industry_committee_page.dart index 63724928..745b43cf 100644 --- a/lib/pages/industry_committee/industry_committee_page.dart +++ b/lib/pages/industry_committee/industry_committee_page.dart @@ -9,12 +9,15 @@ import 'package:aku_new_community/utils/headers.dart'; import 'package:aku_new_community/utils/hive_store.dart'; import 'package:aku_new_community/utils/websocket/tips_dialog.dart'; import 'package:aku_new_community/widget/bee_scaffold.dart'; +import 'package:common_utils/common_utils.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_easyrefresh/easy_refresh.dart'; import 'package:get/get.dart'; import 'package:url_launcher/url_launcher.dart'; +import '../../utils/network/net_util.dart'; + class IndustryCommitteePage extends StatefulWidget { IndustryCommitteePage({Key? key}) : super(key: key); @@ -23,19 +26,20 @@ class IndustryCommitteePage extends StatefulWidget { } class _IndustryCommitteePageState extends State { + List _models = []; EasyRefreshController _refreshController = EasyRefreshController(); @override void initState() { super.initState(); - Future.delayed(Duration(milliseconds: 0), () async { - var agreement = - await HiveStore.appBox?.get('IndustryCommitteePage') ?? false; - if (!agreement) { - await TipsDialog.tipsDialog(); - HiveStore.appBox!.put('IndustryCommitteePage', true); - } - }); + // Future.delayed(Duration(milliseconds: 0), () async { + // var agreement = + // await HiveStore.appBox?.get('IndustryCommitteePage') ?? false; + // if (!agreement) { + // await TipsDialog.tipsDialog(); + // HiveStore.appBox!.put('IndustryCommitteePage', true); + // } + // }); } Widget _buildBottomNavi() { @@ -95,7 +99,7 @@ class _IndustryCommitteePageState extends State { borderRadius: BorderRadius.circular(4.w), child: FadeInImage.assetNetwork( placeholder: R.ASSETS_IMAGES_PLACEHOLDER_WEBP, - image: SAASAPI.image(ImgModel.first(model.imgUrls)), + image: SAASAPI.image(ImgModel.first(model.imgList)), height: 150.w, width: 150.w, fit: BoxFit.cover, @@ -112,9 +116,10 @@ class _IndustryCommitteePageState extends State { height: 44.w, padding: EdgeInsets.symmetric(horizontal: 22.w, vertical: 6.w), - child: model.positionValue.text + child: model.industryCommitteeTypeName!.text .size(24.sp) .color(ktextPrimary) + .bold .make(), decoration: BoxDecoration( color: Color(0xFFFFF3CD), @@ -123,17 +128,17 @@ class _IndustryCommitteePageState extends State { ), ), ].row(), - 6.hb, + 15.hb, ...[ - '住址:${model.roomName}' + '住址:${model.buildingName}幢${model.unitName}单元${model.estateName}房间' .text - .size(24.sp) + .size(23.sp) .color(ktextSubColor) .make(), // '任职期限:XXXXX'.text.size(24.sp).color(ktextSubColor).make(), - '从事岗位:${model.profession}' + '任职期限:${DateUtil.formatDate(model.appointmentStartDT, format: 'yyyy年MM月dd日')}-${DateUtil.formatDate(model.appointmentEndDT, format: 'yyyy年MM月dd日')}' .text - .size(24.sp) + .size(23.sp) .color(ktextSubColor) .make(), ].sepWidget(separate: 10.hb), @@ -148,23 +153,54 @@ class _IndustryCommitteePageState extends State { return BeeScaffold( title: '业委会', systemStyle: SystemStyle.genStyle(bottom: Color(0xFF2A2A2A)), - body: BeeListView( - path: API.manager.commiteeStaff, - convert: (model) { - return model.rows.map((e) => CommitteeItemModel.fromJson(e)).toList(); - }, - controller: _refreshController, - builder: (items) { - return ListView.separated( - padding: EdgeInsets.symmetric(horizontal: 32.w, vertical: 20.w), + body: Container( + child: EasyRefresh( + firstRefresh: true, + header: MaterialHeader(), + controller: _refreshController, + onRefresh: () async { + var base = await NetUtil().get(SAASAPI.committeeStaff.list); + if (base.success) { + print(base.success); + _models = (base.data as List) + .map((e) => CommitteeItemModel.fromJson(e)) + .toList(); + } + setState(() {}); + }, + child: ListView.separated( + padding: EdgeInsets.symmetric(horizontal: 32.w, vertical: 24.w), itemBuilder: (context, index) { - return _buildCard(items[index]); + return _buildCard(_models[index]); }, - separatorBuilder: (context, index) => 20.hb, - itemCount: items.length, - ); - }, + separatorBuilder: (context, index) { + return Divider( + thickness: 1.w, + height: 40.w, + color: Color(0xFFD8D8D8), + ); + }, + itemCount: _models.length, + ), + ), ), + // BeeListView( + // path: SAASAPI.committeeStaff.list, + // convert: (model) { + // return model.rows.map((e) => CommitteeItemModel.fromJson(e)).toList(); + // }, + // controller: _refreshController, + // builder: (items) { + // return ListView.separated( + // padding: EdgeInsets.symmetric(horizontal: 32.w, vertical: 20.w), + // itemBuilder: (context, index) { + // return _buildCard(items[index]); + // }, + // separatorBuilder: (context, index) => 20.hb, + // itemCount: items.length, + // ); + // }, + // ), bottomNavi: _buildBottomNavi(), ); } diff --git a/lib/pages/life_pay/life_pay_record_page.dart b/lib/pages/life_pay/life_pay_record_page.dart index ef51c6a8..917ad927 100644 --- a/lib/pages/life_pay/life_pay_record_page.dart +++ b/lib/pages/life_pay/life_pay_record_page.dart @@ -101,66 +101,74 @@ class _LifePayRecordPageState extends State { borderRadius: BorderRadius.circular(8.w), ), child: DateUtil.formatDate(DateUtil.getDateTime(model.createDate), - format: 'MM-dd HH-mm') + format: 'MM-dd HH:mm') .text .size(24.sp) .color(Colors.black.withOpacity(0.45)) .make(), ), - Row( + Column( children: [ - model.chargesName.text - .size(30.sp) - .color(ktextPrimary) - .bold - .make(), - Spacer(), - '${model.buildingName + '栋' + model.unitName + '单元' + model.estateName}' - .text - .size(24.sp) - .color(Color(0xFF999999)) - .make() - ], - ), - 16.w.heightBox, - Row( - children: [ - '缴纳金额'.text.color(ktextSubColor).size(28.sp).make(), - Spacer(), - '${model.payAmount}'.text.color(ktextPrimary).size(28.sp).make(), - ], - ), - Row( - children: [ - '付款方式'.text.color(ktextSubColor).size(28.sp).make(), - Spacer(), - '${getPayType[model.payType]}' - .text - .color(ktextPrimary) - .size(28.sp) - .make(), - ], - ), - Row( - children: [ - '流水号'.text.color(ktextSubColor).size(28.sp).make(), - Spacer(), - '${model.code}'.text.color(ktextPrimary).size(28.sp).make(), - ], - ), - Row( - children: [ - '流水号'.text.color(ktextSubColor).size(28.sp).make(), - Spacer(), - '${model.code}'.text.color(ktextPrimary).size(28.sp).make(), - ], - ), - ].sepWidget(separate: 24.w.heightBox), - ) - .box - .color(Colors.white) - .padding(EdgeInsets.symmetric(vertical: 32.w, horizontal: 20.w)) - .make(), + Row( + children: [ + model.chargesName.text + .size(30.sp) + .color(ktextPrimary) + .bold + .make(), + Spacer(), + '${model.buildingName + '栋' + model.unitName + '单元' + model.estateName}' + .text + .size(24.sp) + .color(Color(0xFF999999)) + .make() + ], + ), + 16.w.heightBox, + Row( + children: [ + '缴纳金额'.text.color(ktextSubColor).size(28.sp).make(), + Spacer(), + '${model.payAmount}' + .text + .color(ktextPrimary) + .size(28.sp) + .make(), + ], + ), + Row( + children: [ + '付款方式'.text.color(ktextSubColor).size(28.sp).make(), + Spacer(), + '${getPayType[model.payType]}' + .text + .color(ktextPrimary) + .size(28.sp) + .make(), + ], + ), + Row( + children: [ + '流水号'.text.color(ktextSubColor).size(28.sp).make(), + Spacer(), + '${model.code}'.text.color(ktextPrimary).size(28.sp).make(), + ], + ), + Row( + children: [ + '流水号'.text.color(ktextSubColor).size(28.sp).make(), + Spacer(), + '${model.code}'.text.color(ktextPrimary).size(28.sp).make(), + ], + ), + ].sepWidget(separate: 24.w.heightBox), + ) + .box + .color(Colors.white) + .padding(EdgeInsets.symmetric(vertical: 32.w, horizontal: 20.w)) + .make(), + ], + ), ); } } diff --git a/lib/pages/manager_func.dart b/lib/pages/manager_func.dart index cfdc7612..c311d0d4 100644 --- a/lib/pages/manager_func.dart +++ b/lib/pages/manager_func.dart @@ -1,4 +1,6 @@ import 'package:aku_new_community/constants/api.dart'; +import 'package:aku_new_community/constants/new_api.dart'; +import 'package:aku_new_community/constants/saas_api.dart'; import 'package:aku_new_community/model/manager/article_QR_code_model.dart'; import 'package:aku_new_community/model/manager/moving_company_model.dart'; import 'package:aku_new_community/model/manager/questionnaire_detail_model.dart'; @@ -229,7 +231,7 @@ class ManagerFunc { static Future questionnairefindById(int? id) async { BaseModel baseModel = await NetUtil().get( - API.manager.questionnairefindById, + NEWAPI.questionnaire.detail, params: { 'questionnaireId': id, }, @@ -241,7 +243,7 @@ class ManagerFunc { static Future questionnaireSubmit( int? id, List model) async { BaseModel baseModel = await NetUtil().post( - API.manager.questionnaireSubmit, + NEWAPI.questionnaire.submit, params: { 'id': id, 'appQuestionnaireAnswerSubmits': model, diff --git a/lib/pages/personal/address/address_list_page.dart b/lib/pages/personal/address/address_list_page.dart index 4f9300ea..588a7ca8 100644 --- a/lib/pages/personal/address/address_list_page.dart +++ b/lib/pages/personal/address/address_list_page.dart @@ -1,3 +1,4 @@ +import 'package:aku_new_community/widget/others/user_tool.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -86,8 +87,8 @@ class AddressListPageState extends State firstRefresh: true, header: MaterialHeader(), controller: _refreshController, - onRefresh: () async { - _addressModels = await Userfunc.getMyAddress(); + onRefresh: () async { await UserTool.appProvider.getMyAddress(); + _addressModels = UserTool.appProvider.addressModels; _onload = false; setState(() {}); }, diff --git a/lib/pages/personal/item_my_address.dart b/lib/pages/personal/item_my_address.dart index 7d2f6524..93330f29 100644 --- a/lib/pages/personal/item_my_address.dart +++ b/lib/pages/personal/item_my_address.dart @@ -68,6 +68,7 @@ class _MyAddressItemState extends State { if (result) { await appProvider.getMyAddress(); widget.refreshController!.callRefresh(); + Get.back(); } }, child: Container( diff --git a/lib/pages/setting_page/agreement_page/privacy_page.dart b/lib/pages/setting_page/agreement_page/privacy_page.dart index 3d30338c..4cae3f93 100644 --- a/lib/pages/setting_page/agreement_page/privacy_page.dart +++ b/lib/pages/setting_page/agreement_page/privacy_page.dart @@ -18,218 +18,381 @@ class _PrivacyPageState extends State { padding: EdgeInsets.all(16.sp), child: Text( ''' -最近更新日期:2022年03月25日 -本隐私政策的摘要主要向您说明:我们在必要范围内收集和使用您的个人信息类型和业务场景,以及我们处理您个人信息的基本规则。 -小蜜蜂深知个人信息对您的重要性,并会尽全力保护您的个人信息安全可靠。小蜜蜂承诺,我们将按业界成熟的安全标准,采取相应的安全保护措施来保护您的个人信息。 -若您想要了解我们收集和使用您的个人信息的详细内容,请仔细阅读并了解 《隐私政策》(尤其是加粗及下划线部分)。 -一、我们收集您哪些个人信息 -小蜜蜂仅会 出于必要的业务场景,收集和使用您的个人信息 ,以便向你提供对应的服务,若您不提供相关的个人信息,将无法享受相应的服务内容,以下为部分场景及其获取信息示例。 -产品功能: :在使用存储服务时,会获取一些必要信息。如:获取您的 手机号码 用于 注册 ;获取您的手机 存储状态 用于 创建本地目录 ;在使用 照片、视频、文件和通讯录 等备份功能时和 文件预览及传输 时,读取对应的 本地文件信息 ;查看 网络状态 用于 登录 和 绑定设备。 -系统权限: 为提供更好的服务体验,我们会向您申请一些系统权限。如:获取 存储权限 用于 传输文件 ;获取 相机权限 用于 拍照上传 和 扫一扫; 获取 麦克风权限 用于绑定对应设备的 语音对讲、录音发布。 -您的个人信息大部分是由您 主动向我们提供或授权 的,也有我们在您使用我们的产品或服务时 通过Cookies、SDK及类似技术获取 的。我们会采取一切合理可行的措施,保护您站点下用户的个人信息。 -二、我们如何共享您的信息 -为了向您提供全部的服务内容,我们需要同我们的合作伙伴一起为您提供服务,因此,在获取您的明确同意后,我们会 委托授权合作伙伴为您提供某些服务或代表我们履行职能 。我们仅会处于本隐私政策声明的合法、正当、必要、特定、明确的目的共享您的信息。我们会采取必要的技术和管理措施保护您的个人信息安全。 -三、您的权力 -在遵循相关法律、法规及标准的情况下,您有权 访问、更正、删除您的个人信息以及注销账户 ,有权 改变或撤回已授权同意的个人信息和权限。 -若进行上述操作时遇到问题,您可以联系我们,我们会在七个工作日内作出回复。为保障安全,您可能需要提供书面请求,或以其他方式证明您的身份。 -四、儿童个人信息保护 -我们的产品、网站和服务主要面向企业级用户,用户对象一般为成人。如果没有父母或监护人的同意,儿童不得创建自己的用户账户。 -我们将不满 14 周岁的任何人均视为儿童。对于经父母同意而收集儿童个人信息的情况,我们只会在受到法律允许、父母或监护人明确同意或者保护儿童所必要的情况下使用或公开披露此信息。 -五、如何联系我们 -如果您对本隐私政策有任何疑问、意见或建议,可发送邮件至kaidalai@163.com -也可以在线反馈等多种方式与我们联系。 -您反馈的信息我们将有专人跟进负责处理。我们将在十五个工作日内回复。 -如果您对我们的回复不满意,特别是我们的个人信息处理行为损害了您的合法权益,您还可以通过法律途径或前往行业自律协会等机构寻求解决方案。 -用户隐私政策 -最近更新日期:2022年03月25日 -版本生效日期:2022年03月27日 -如果您有任何疑问、意见或建议,请您把问题发送到邮箱:kaidalai@163.com,我们将在7个工作日内进行处理。 +版本更新日期:2022年4月20日 +  +【前言】欢迎使用“小蜜蜂”(包括小蜜蜂网站、App、小程序及其他移动应用程序,以下统称“小蜜蜂”)提供的产品和服务。深圳市凯达来科技有限公司(注册地址:深圳市龙岗区横岗街道沙荷路40-11号)及其关联公司作为小蜜蜂运营者(或简称“我们”)深知个人信息对使用我们的产品和服务(以下统称“小蜜蜂服务”)之用户(以下统称“用户”或“您”)的重要性,我们一向庄严承诺保护您的个人信息及隐私安全。您在使用小蜜蜂服务时,我们可能会收集和使用您的相关个人信息。我们希望通过《小蜜蜂隐私政策》(以下简称“本政策”)向您说明我们在收集和使用您相关个人信息时对应的处理规则,以及我们为您提供的访问、更正、删除和保护这些个人信息的方式,以便更好的保障您的权益。 +本政策适用于小蜜蜂提供的所有产品和服务,如与《小蜜蜂用户服务协议》条款之约定存在冲突的,以本政策为准。 +需要特别说明的是,本政策不适用于其他第三方向您提供的服务,第三方向您提供的服务适用其向您另行说明的隐私政策。 +  +【特别提示】请您在使用小蜜蜂服务前,仔细阅读(未成年人请在监护人陪同下阅读)并了解本政策(特别是加粗或下划线标注的内容),以做出适当选择。一旦您同意或在我们更新本政策后继续使用我们的产品或服务,即意味着您同意我们按照本政策处理您的相关个人信息。 +  +在阅读完本政策后,如您对本政策或与本政策相关的事宜有任何问题,您可通过本政策“如何联系我们”章节所列的反馈渠道联系我们,我们会尽快为您作出解答。 +  本政策将帮助您了解以下内容: -1、我们收集您哪些个人信息; -2、我们如何使用您的个人信息; -3、我们如何共享、转让、公开披露您的个人信息; -4、我们如何存储您的个人信息; -5、我们如何保护您的个人信息; -6、您的权利; -7、我们如何处理儿童的个人信息; -8、本政策如何更新; -9、如何联系我们; -小蜜蜂深知个人信息对您的重要性,并会尽全力保护您的个人信息安全可靠。我们致力于维持您对我们的信任,恪守以下原则,保护您的个人信息:权责一致原则、目的明确原则、选择同意原则、最少够用原则、确保安全原则、主体参与原则、公开透明原则等。同时,小蜜蜂承诺,我们将按业界成熟的安全标准,采取相应的安全保护措施来保护您的个人信息。 -为了便于您了解您在使用我们的服务时,我们需要收集的信息类型与用途,我们将结合具体服务向您逐一说明。请在使用我们的产品(或服务)前,仔细阅读并了解本《隐私政策》(尤其是加粗及下划线部分)。 -一、我们收集您哪些个人信息 -个人信息是指以电子或者其他方式记录的与已识别或者可识别的自然人有关的各种信息,不包括匿名化处理后的信息。 -敏感个人信息是指一旦泄露或者非法使用,容易导致自然人的人格尊严受到侵害或者人身、财产安全受到危害的个人信息,包括生物识别、宗教信仰、特定身份、医疗健康、金融账户、行踪轨迹等信息,以及不满十四周岁未成年人的个人信息。 -小蜜蜂仅会出于本政策所述的以下目的,收集和使用用户的个人信息: -(一)产品功能 -1、业务功能一:注册成为用户 -为完成创建账号,您需提供手机号码,用于小蜜蜂账号免密登录或短信验证注册。用户注册完成后,会默认使用您的手机号码作为小蜜蜂的用户名。如果不同意,将无法完成注册。 -此外在历史的客户端版本内(Android端V8.0.0及以下版本,iOS端V7.4.0及以下版本),您可以登录应用后访问【“我的”->点击头像进入“个人资料”页】进行查询和设置您的其他信息(包含姓名,昵称,性别等信息)。 -您提供的上述信息,将在您使用本服务期间持续授权我们使用。在您注销账号时,我们将停止使用并删除上述信息。 -我们使用的账号为小蜜蜂账号,以上用户账号相关的信息,均存储于小蜜蜂账号服务器中。上述信息将存储于中华人民共和国境内。如需跨境传输,我们将会单独征得您的授权同意。 -2、业务功能二:文件预览及传输 -小蜜蜂提供预览、传输功能,当加载文件列表或预览文件时,为了方便您下次可快速预览,会对文件数据进行临时缓存;当使用文件传输功能时(如上传、下载),需要 读取本机设备的文件,供您选择需要上传的文件,下载文件时,需要 获取手机存储状态,确认本地存储空间剩余容量,并将文件保存至本机设备内。 -3、业务功能三:联系人分享 -小蜜蜂提供文件分享功能,支持通过手机号分享文件,当使用这个功能时,需要您授权同意读取用户终端内的通讯录。如果不同意,将会无法使用联系人分享功能。 -4、业务功能四:文件下载 -小蜜蜂提供app下载pdf等格式文件功能,当使用这个功能时,需要您授权同意获取读写手机存储权限。如果不同意,将会无法使用文件下载功能。 -5、业务功能五:文件分享 -我们会从您的Android终端 读取应用列表,用于在分享文件时判断第三方应用是否已安装在本机,以及辅助检测小蜜蜂安卓客户端是否在前台显示。但如果您不提供这些信息,可能会影响您使用本功能。 -(二)其他信息 -1、活动运营: 小蜜蜂会开展运营活动,在您中奖时,会让您提供 姓名、联系方式、地址 用于奖品寄送。这些信息属于个人敏感信息,您可以拒绝提供,如果拒绝提供,您将可能无法参与运营活动或无法获得奖品,但不影响其他功能和服务的正常使用。 -2、信息推送: 为了更好为您提供服务,我们引入了第三方消息推送SDK和短信通道实现对您及时的信息推送服务,需要向您收集的信息仅包含 设备型号、设备MAC地址、应用名称与版本、设备APPlist、操作系统类型版本、设备型号与类型。 -3、计费收费: 小蜜蜂提供多档次、多功能的会员服务,您在订购不同会员的时候我们会通过终端设备采集产生的 日志信息(包括不限于订购手机号、订购套餐类型、订购费用、订购时间) 。订购信息及手机号用于用户管理和订单管理。问卷答复:我们可能会不定期向您投放用户体验改善的调查问卷,您如果参与问卷调查的话,可能会收集到您提供的信息内容。 -(三)权限说明 -业务功能 对应权限 调用权限目的 是否询问 可否关闭 -安装与卸载应用 创建桌面快捷方式的权限 安装小蜜蜂客户端时 部分Android终端需要使用您的创建桌面快捷方式的权限, 生成系统桌面图标。如果您卸载小蜜蜂客户端,卸载后我们不会在终端设备内保留您的用户信息。如果不同意,部分Android终端可能无法在终端主页面创建桌面快捷方式,需要您进入系统的抽屉式桌面才可访问小蜜蜂客户端。 否 否 -获取存储状态及记录功能配置信息 获取读写手机存储权限 当您启动小蜜蜂客户端时,需要获取 手机存储状态 加载配置信息,及创建用于存储缓存数据、crash日志信息的本地目录。 需要您授权同意获取读写手机存储权限 。如果不同意,将无法记录用户家庭配置信息、相册备份状态,无法写入日志。 是 是 -登录 安卓设备会使用到以下权限:查看网络连接(允许应用查看网络连接的相关信息),更改WLAN状态(允许应用程序连接到WLAN接入点以及WLAN接入点断开连接,并对配置的WLAN网络进行更改),更改网络连接性权限(允许该应用更改网络连接的状态) 小蜜蜂支持免密登录、账密登录、以及短信登录。在登录过程中需要检查您的网络环境(是移动网络还是在WiFi环境下),登录过程 安卓设备会使用到以下权限:查看网络连接(允许应用查看网络连接的相关信息),更改WLAN状态(允许应用程序连接到WLAN接入点以及WLAN接入点断开连接,并对配置的WLAN网络进行更改),更改网络连接性权限(允许该应用更改网络连接的状态)。 否 否 -退出 展开/收拢状态栏权限 小蜜蜂会在您的安卓终端设备内使用 展开/收拢状态栏权限, 当您在小蜜蜂退出账号时,用于清空保留在状态栏提示的消息。 否 否 -拍照上传 获取相机权限 小蜜蜂提供拍照上传功能, 此功能需要您同意获取相机权限 。如果不同意,将无法开启摄像头进行拍照上传。 是 是 -文件预览及传输 读取本机设备文件、获取手机存储状态、获取读写手机存储权限 当使用文件传输功能时(如上传、下载),需要 读取本机设备的文件 ,供您选择需要上传的文件,下载文件时,需要 获取手机存储状态 ,确认本地存储空间剩余容量,并将文件保存至本机设备内。这些功能 需要您授权同意获取读写手机存储权限 。如果不同意,将无法预览文件,无法加载文件列表或加载缓慢,无法上传、下载文件。 是 是 -相册备份 开机启动权限、防止手机休眠权限 在安卓终端设备内,为了不让应用进程被回收,导致相册备份失败,小蜜蜂会用到您的 开机启动权限和防止手机休眠权限 。iOS终端设备因系统原因,需要您手动打开后台备份,才支持后台自动备份。 是 是 -扫一扫 获取相机权限、控制振动权限 小蜜蜂提供扫一扫功能,您可以使用此功能进行扫描二维码登录PC端、TV端以及web门户,或扫描分享的文件二维码转存文件。 此功能需要您同意获取相机权限 ,如果不同意,将无法开启摄像头,最终无法执行上述操作。在您开启摄像头并扫描二维码后,小蜜蜂 安卓版会使用控制振动权限 ,扫描成功后进行振动反馈。 是 是 -应用备份与恢复(仅适用于安卓端v8.5.3及之前的版本) 读取应用列表信息权限 小蜜蜂提供应用备份与恢复功能,支持备份设备内已安装应用的记录,以及根据已备份至云端的应用列表清单执行下载操作恢复至您的移动终端设备内。此功能不会对应用内产生的数据备份至云端,仅备份应用列表清单,当用户选择恢复至本地设备时,仅对已备份的应用列表清单做下载应用操作。当使用应用备份与恢复功能时, 需要您授权同意读取应用列表信息权限 。如果不同意,将无法使用本功能。 是 是 -设备内的消息提示 检索正在运行的应用的权限 小蜜蜂在文件操作完成后,顶部会出现toast提示。安卓终端设备在实现此功能时,需要使用 检索正在运行的应用 的权限。 否 是 -推送通知 开机启动权限、同意开启通知权限 小蜜蜂支持向移动终端设备推送通知,方便您及时收到好友分享通知、优惠信息、系统公告,信息可能会按手机号码归属地分别推送。此功能会用到您的 开机启动权限 以及需要您授权同意 开启通知 ,如果您不同意,可在APP内【“我的”-“设置”- “接受消息推送”】进行关闭。 是 是 -指纹密码,指纹验证,面容ID解锁,面容ID验证 安卓终端设备内使用管理指纹(IFAA)权限、iOS终端设备内使用面容ID、指纹密码 如果您的终端设备支持指纹识别或人脸识别,小蜜蜂还提供 指纹密码,面容ID解锁(面容ID为小蜜蜂iOS端特有功能) 功能,用于登录小蜜蜂。您可以在小蜜蜂客户端内开启或关闭某项生物识别功能,即您可以分别选择开通或关闭指纹密码、面容ID解锁、指纹验证、面容ID验证中的一项或多项。 您的指纹特征和人脸特征由您录入指纹和录入人脸当时的载体(如手机或其他智能手持终端设备)及其系统保存,小蜜蜂不会保存您的指纹特征和人脸特征。 小蜜蜂会在您的 安卓终端设备内使用管理指纹(IFAA)权限、您的iOS终端设备内使用面容ID、指纹密码 ,用于验证登录及解锁APP。 是 是 -绑定设备 查看网络连接、查看WLAN状态、更改WLAN状态、更改网络连接性、完全的网络访问权限 小蜜蜂还提供了智能硬件设备服务,在给硬件设备配网时,我们需要 获取 Wi-Fi SSID ,除此以外,安卓设备还会使用到以下权限: 查看网络连接 (允许应用查看网络连接的相关信息), 查看WLAN状态 允许应用查看有关WLAN状态的信息), 更改WLAN状态 (允许应用程序连接到WLAN接入点以及WLAN接入点断开连接,并对配置的WLAN网络进行更改), 更改网络连接性 (允许该应用更改网络连接的状态), 完全的网络访问权限 允许应用创建网络套接字和使用自定义网络协议)。 否 否 -语音对讲 使用手机麦克风权限、更改用户音频设置权限 当您在小蜜蜂客户端内绑定了智能硬件设备后,部分智能硬件设备支持语音对讲功能, 您在使用此功能前,需要您授权同意使用手机麦克风 ,如果您不同意,将会导致无法与设备语音对讲。安卓设备还会使用到 更改您的音频设置权限 (允许应用修改全局音频设置),方便您控制音量或在遥控器中对小蜜蜂高清进行语音控制。 是 是 -连接蓝牙设备 使用大致位置权限 小蜜蜂支持特定的蓝牙设备通过小蜜蜂应用小程序连接到手机或其他智能手持终端设备。在您允许开启蓝牙服务且进行蓝牙设备连接操作时, 需要您授权同意使用大致位置权限 ,用于搜索周围的蓝牙设备,如果您不同意,将会导致Android系统版本6.0以上终端无法发现周围可连接的蓝牙设备,最终导致无法连接。 是 是 -查找并连接到本地网络上的设备 使用查找并连接到本地网络上的设备权限 小蜜蜂还提供了连接本地智能硬件设备服务,当您在小蜜蜂客户端内使用打印、投屏、动感影集小程序、我家硬盘小程序时, 需要您授权同意使用查找并连接到本地网络上的设备权限 ,用于应用使用 Bonjour发现兼容“隔空打印”的打印机,或发现兼容“隔空播放”的设备(如 Apple TV),如果您不同意,将无法发现本地网络中可连接的打印或投屏设备,最终导致无法连接本地硬件。 是 是 -安全管理 获取小蜜蜂安卓终端和iOS终端的设备型号 为了保障向您提供的服务的安全稳定运行,预防传输过程的风险(如识别是否常用设备登录,是否常用位置登录),我们会对您使用的 小蜜蜂Android终端、iOS终端的设备型号 进行记录。如果您不同意,可能无法完成风控验证。 是 是 -(四)SDK与代码使用 -在您使用小蜜蜂APP的功能或者服务时,在某些特定使用场景下,我们可能会使用具有相应业务资质及能力的第三方服务商提供的软件服务工具包(简称SDK)和代码来为您提供服务。 小蜜蜂无法获得您在使用该类SDK服务时产生的信息。但是,如果你已明示同意该SDK获得你的数据信息,该SDK将通过小蜜蜂接口获得你的数据信息 。关于第三方SDK具体调用的设备权限类型,以及如何收集、使用您的个人信息,建议您参考第三方SDK的相关服务协议及隐私政策。如果您希望进一步了解我们所接入的第三方SDK情况,请您阅读第三方SDK情况说明。 - -(五)我们如何使用Cookie 和同类技术 -1、Cookie -在您访问我们的网站时,我们会在您的计算机或移动设备中存储名为Cookie的小数据文件。Cookie通常包含了一些标识符,主要存储了用户标识(不涉及用户真实名称)、用户访问的时间以及用户访问页面的字符。借助Cookie标识,能够帮助网站统计用户的访问频次、访问页面偏好及接入网站的加载性能的数据,用于确保网站正常高效运转、保护您的数据安全。 -我们不会将 Cookie用于本政策所述目的之外的任何用途。您可根据自己的偏好管理或删除 Cookie。有关详情,请参见 AboutCookies.org。您可以清除计算机上保存的所有Cookie,大部分网络浏览器都设有阻止Cookie 的功能。但如果您这么做,则需要在每一次访问我们的网站时亲自更改用户设置。 -2、网站信标和像素标签 -除 Cookie 外,我们还会在网站上使用网站信标和像素标签及其他同类技术。由于小蜜蜂产品需要嵌入到第三方的网站中,受同源策略的影响,为了能准确发送统计结果,小蜜蜂使用了网站信标和像素标签及其他同类技术,如用户在访问了您的网站时,我们会通过像素标签的方式,将用户访问的页面信息、网站加载性能数据通过该技术去跨域发送到采集服务,以实现后续的运营指标及性能指标数据的统计、分析。所有通过网站信标及像素标签技术发起的请求,都通过HTTPS方式发送,SSL会对数据进行加密,您的数据都在加密协议下传输。 -3、本地存储器 -除上述技术外,小蜜蜂还启用了本地存储器的方式,对您网站的访问者的一些交互行为进行记录,这部分数据主要为了帮助您对网站的点击生成热力分布,方便运营决策者优化自己的网站结构,所有用户数据都存在用户自身的本地浏览器中。同时,数据在通过HTTPS发送到服务器后,小蜜蜂会对用户的本地数据进行清除,确保数据的安全性。 -4、Do Not Track(请勿追踪) -很多网络浏览器均设有 Do Not Track 功能,该功能可向网站发布 Do Not Track 请求。目前,主要互联网标准组织尚未设立相关政策来规定网站应如何应对此类请求。但如果您的浏览器启用了 Do Not Track,那么我们的所有网站都会尊重您的选择。 -(六)征得授权同意的例外 -您充分理解并同意,我们在以下情况下收集、使用您的个人信息无需您的授权同意,且我们可能不会响应您提出的更正/修改、删除、注销、撤回同意、索取信息的请求: +  +一、我们如何收集和使用您的个人信息 +二、我们如何使用 Cookies 和同类技术 +三、我们如何共享、转让、公开披露您的个人信息 +四、我们如何保护您的个人信息安全 +五、您如何管理您的个人信息 +六、第三方服务 +七、未成年人信息的保护 +八、通知和修订 +九、如何联系我们 +附件一:儿童个人信息收集使用规则 +附件二:第三类SDK类服务商目录 +  +一、我们如何收集和使用您的个人信息 +我们收集您的个人信息主要是为了您能够更容易和更满意地使用小蜜蜂服务。小蜜蜂的目标是向所有的互联网用户提供安全、舒适的购物体验。而这些信息有助于我们实现这一目标。 +  +(一)我们将通过以下途径收集和获得您的个人信息:                             +1、您提供的信息。 例如: +(1)您在注册小蜜蜂账号或使用小蜜蜂服务时,向我们提供的信息; +若您提供的信息中含有其他用户的个人信息,在向我们提供这些个人信息之前,您需确保您已经取得合法的授权。若涉及儿童个人信息的,您需在提供前取得该儿童监护人的同意。 +(2)您通过小蜜蜂服务向第三方提供的共享信息,以及您使用小蜜蜂服务时所存储的信息。 +请注意,如您在小蜜蜂服务中其他用户可见的公开区域内上传或发布的信息中、您对其他人上传或发布的信息作出的回应中公开您的信息,该等信息可能会被他人收集并加以使用。当您发现他人不正当地收集或使用您的信息时,可通过本政策“如何联系我们”章节所列的反馈渠道联系我们。 +2、第三方共享的您的信息。亦即第三方使用小蜜蜂服务时所提供有关您的共享信息。 +3、我们获取的您的信息。您在使用小蜜蜂服务时,我们经您授权后收集、汇总、记录的信息,例如日志信息、位置信息、设备信息。 +  +(二)我们会出于以下目的,收集和使用您以下类型的个人信息: +1、帮助您完成注册/登录 +为便于我们为您提供持续稳定的服务并保障您使用小蜜蜂服务的安全性,我们需要您提供您的手机号码进行注册,并创建您的用户名和密码。如果您仅需使用浏览、搜索等基本功能,您不需要创建账号及提供上述信息。 +如您选择以非小蜜蜂账户的第三方账户登录小蜜蜂的,我们可能会根据您的授权从第三方处获取您的第三方账户信息,并与您的小蜜蜂账户进行绑定,使您可通过第三方账户直接登录、使用小蜜蜂服务。 +在注册/登录过程中,如果您提供以下额外信息,将有助于我们给您提供个性化的商品推荐和更优的购物体验:您的昵称、性别、出生日期、头像以及您的实名认证等相关信息。但如果您不提供这些信息,并不会影响您使用小蜜蜂服务的基本功能。 +2、向您提供商品或服务信息展示及通知等基础功能 +为向您提供更契合您需求的页面展示和搜索结果、了解产品适配性、识别账号异常状态,我们可能会直接或者间接地收集关于您使用的服务以及使用方式的信息并将这些信息进行关联,这些信息包括: +   日志信息:当您使用我们的网站或客户端提供的产品或服务时,我们会自动收集您对我们服务的详细使用情况,作为有关网络日志保存。例如:您的浏览和搜索查询记录、收藏及分享、加购物车记录、IP地址、电信运营商、使用的语言、访问日期和时间。 +   设备信息:我们会根据您在软件安装及使用中的具体操作,接收并记录您所使用的设备相关信息。例如:设备型号、操作系统版本、MAC地址、设备设置、设备标识符(IMEI/Android ID/IDFA/OpenUDID/GUID/SIM 卡IMSI 信息)、移动应用列表等软硬件及设备环境信息、设备所在位置相关信息(包括IP 地址、GPS位置以及WLAN接入点、蓝牙和基站等传感器信息)和设备权限信息(包括存储权限),以确保设备操作环境的安全以及提供小蜜蜂服务所必需,防止恶意程序和反作弊。 +请注意,单独的设备信息、日志信息等是无法识别特定自然人身份的信息。如果我们将这类非个人信息与其他信息结合用于识别特定自然人身份,或者将其与个人信息结合使用,则在结合使用期间,这类非个人信息将被视为个人信息,除取得您授权或法律法规另有规定外,我们会将该类个人信息做匿名化、去标识化处理。 +3、为您提供一键报警功能 +在您使用小蜜蜂的过程中,如果您碰到了紧急情况,可以主动选择将当前定位信息发送至物业后台并提示警报,我们会收集包括您设备的定位信息用于实现上述功能及其他我们明确告知的目的。 +4、帮助您完成预定或下单及订单管理 +当您准备预定或下单购买小蜜蜂的商品或服务时,您至少需要向我们提供收货人姓名、收货地址及收货人联系电话;您在小蜜蜂购买跨境商品时,您还可能需要根据国家法律法规的要求提供您的实名信息,这些实名信息包括您的个人身份信息(身份证号和真实姓名)。 +为实现身份认证的目的,您同意并授权我们可能以自行或委托第三方向有关身份认证机构(如个人征信机构、政府部门等)提供、查询、核对您的前述身份信息。 +请注意,您的人个身份信息属于个人敏感信息,请您谨慎提供,如果拒绝提供您将可能无法获得相关服务,但不影响其他功能与服务的正常使用。 +您可以通过小蜜蜂为其他人订购商品或服务,您需要提供该实际订购人的前述个人信息。向小蜜蜂提供该实际订购人的前述个人信息之前,您需确保您已经取得其授权同意,如其中涉及儿童个人信息的,您需确保您已经取得该儿童的监护人的同意。 +为便于您对您的订单进行管理并保障交易安全,我们会收集您的订单信息向您展示;我们也会使用您的订单信息来进行身份核验、确定交易、支付结算、完成配送、订单查询、提供客服咨询与售后服务或用来判断您的交易是否存在异常以便保护您的交易安全。 +您在小蜜蜂上生成的订单中,将可能包含您的身份信息、联络信息、支付信息,这些都属于敏感信息,请您谨慎向他人展示或对外提供。我们也将会在展示订单信息时,在保证信息可用性的基础上尽量做去标识化处理(如对订单中收件人的手机号进行脱敏处理)。 +5、帮助您完成支付 +在您预定或下单后,您可以选择电子钱包余额或与我们合作的、以软件工具开发包(简称“SDK”)方式嵌入的第三方支付机构(包括支付宝、微信支付、银联支付通道,以下称“支付机构”)所提供的支付服务。在此过程中,根据相关法律法规规定,我们需要将您的小蜜蜂订单信息(如订单编号、订单金额、商品类型)同这些支付机构共享以实现其确认您的支付指令并完成支付。为确保我们及时获悉并确认您的支付进度及状态,您同意我们可自您所选择的支付机构或您选择的其他金融机构处收集与支付进度相关信息。 +6、向您完成商品或服务的交付 +在您下单并选择货到付款或在线完成支付后,与我们合作的第三方配送公司(包括顺丰、京东快递、EMS等,以下称“配送公司”)将为您完成订单的交付。您知晓并同意,我们会向配送公司披露订单相关配送信息(包括商品信息、收件地址、收件人和收件人手机号),且配送公司会在配送交付环节内使用您的订单信息以确保您订购的商品能够安全、准确送达。如果您拒绝共享此类信息,我们将无法完成相关交付服务。 +7、向您提供客服与售后服务 +当您与我们的客服取得联系时,我们的系统可能会记录您与客服之间的通讯记录及相关内容,并使用您的账号信息和订单信息用于核验身份;当您需要客服协助您修改有关信息(如配送地址、联系方式等)时,您可能还需要提供上述信息外的其他信息以便完成修改;当您需要我们提供与您账号或订单相关的客户服务时,我们可能会查询您的相关订单信息以便给予您适当的帮助和处理。 +为了提供服务及改进服务质量的合理需要,我们还可能使用的您的其他信息,包括您与客服联系时您提供的相关信息,您参与问卷调查时向我们发送的问卷答复信息。 +8、为您提供评论、晒单等信息发布功能 +您在使用小蜜蜂服务进行评价或上传、发布或回应其他内容(如短视频、图文分享等信息)时,我们将收集您上传、发布或回应的信息,并使用您的昵称、头像和发布内容以作展示。 +请注意,您公开发布的信息中可能包含您的个人信息或个人敏感信息,请您在发布前慎重考虑。如您发布的信息涉及到他人的个人信息的,您应当在发布前征得他人同意。 +9、余额提现 +当您使用余额提现功能时,我们将依照国家法律法规对您的提现账户进行实名管理并履行反洗钱职责,您需要因此提供您的真实姓名、身份证号、银行卡号、发卡银行、银行卡地区。 +10、保障您的使用安全 +为提高您使用小蜜蜂服务的安全性,更好地预防钓鱼网站、计算机病毒等安全风险,保护您或其他用户或公众的人身财产安全,更准确地识别违反法律法规或小蜜蜂相关协议规则的情况,我们可能整合您的个人信息、交易信息、设备信息、网络日志及其他第三方依法共享的信息来综合判断您账户及交易风险、进行身份验证、检测及防范安全事件,并依法采取必要的记录、审计、分析、处置措施。 +11、为您提供其他扩展服务 +为向您提供更符合您需求的产品及/或服务,提升您使用小蜜蜂的体验,我们在向您提供以下扩展服务时可能会基于您的授权收集和使用您的个人信息: +(1)基于位置信息的一键报警服务:我们会在您开启位置权限后访问获取您的位置信息,根据您的位置信息向您展示您当前所处位置。我们仅收集您当时所处的地理位置,但不会将您各时段的位置信息进行结合以判断您的行踪轨迹。如果您拒绝提供,您也可以不使用该服务。 +(2)基于相机的扩展服务:您可在开启相机/摄像头权限后使用该功能进行扫码用于商品识别,拍摄照片或视频用于售后、评价、分享。请您知晓,即使您已同意开启相机权限,我们也仅会在您主动点击客户端内相机图标或录制视频时通过相机获取照片信息。 +(3)基于相册(图片库/视频库)的图片/视频访问及上传的扩展服务:您可在开启相册权限后使用该功能上传您的照片/图片/视频,以实现更换头像、发表评论/分享、拍照、发布社区动态等功能。我们可能会通过您所上传的照片/图片来识别您需要购买的商品或服务,或使用包含您所上传照片或图片的评论信息。 +(4)基于麦克风的语音技术相关扩展服务:您可在开启麦克风权限后使用麦克风录制内容并置入于任务发布功能中,在该功能中我们会收集您的录音内容以补充您的任务要求、条件或描述等需求。请您知晓,即使您已同意开启麦克风权限,我们也仅会在您主动点击客户端内麦克风图标或录制视频时通过麦克风获取语音信息。 +您理解并同意,实现上述扩展服务需要您通过开启您设备中相应权限的方式授权我们访问您的相机、相册、麦克风、日历或获取您的位置信息。如您不提供该授权,不影响您对小蜜蜂服务基本功能的使用。当您需要取消授权时,您可以关闭您设备中的相应权限,具体方法请参考您的设备说明书或联系您设备的服务商或生产商。但是,您关闭权限的决定不会影响此前基于您的授权所进行的信息收集及使用。 +12、其他目的和用途 +请您注意,如果我们要将您的个人信息用于本政策中未载明的其他用途或额外收集未提及的其他个人信息,我们会通过页面提示、交互流程、网站公告或其他方式另行征得您的同意。一旦您同意,该等额外用途将视为本政策的一部分,该等额外信息也将适用本政策。 +  +(三)我们通过间接方式收集您个人信息的情形 +我们可能会从关联方、第三方合作伙伴获取您授权共享的相关信息。例如,当您通过第三方合作伙伴网站及其移动应用软件等下单时,您向其提供的订单信息可能会转交给我们,以便我们处理您的订单并保证服务的顺利完成;本条款前述您通过第三方账户登录小蜜蜂时,我们将根据您的授权从第三方合作伙伴获取您授权共享的相关信息(如用户名、头像、昵称,具体以您的授权内容为准),并将您的第三方账户与您的小蜜蜂账户绑定,使您可以通过第三方账户直接登录小蜜蜂。 +我们将在符合相关法律法规规定,并依据与关联方或第三方合作伙伴的约定、确定其提供的个人信息来源合法的前提下,在关联方或第三方合作伙伴已获得您授权同意的范围内收集并使用您的这些个人信息,如确需超出前述范围使用,将会另行征得您的同意。我们会使用不低于我们对自身用户个人信息同等的保护手段与措施对间接获取的个人信息进行保护。 +  +(四)征得授权同意的例外 +根据相关法律法规规定,以下情形中收集您的个人信息无需征得您的授权同意: 1、与国家安全、国防安全直接相关的; 2、与公共安全、公共卫生、重大公共利益直接相关的; -3、与犯罪侦查、起诉、审判和判决执行等直接相关的; +3、与刑事侦查、起诉、审判和判决执行等直接相关的; 4、出于维护您或其他个人的生命、财产等重大合法权益但又很难得到本人同意的; -5、您自行向社会公众公开的个人信息; +5、所收集的个人信息是您自行向社会公众公开的; 6、从合法公开披露的信息中收集个人信息的,如合法的新闻报道、政府信息公开等渠道; -7、根据与您签订和履行相关协议或其他书面文件所必需的; -8、用于维护所提供的产品及/或服务的安全稳定运行所必需的,包括但不限于发现、处置产品及/或服务的故障; -9、为合法的新闻报道所必需的; -10、学术研究机构基于公共利益开展统计或学术研究所必要,且对外提供学术研究或描述的结果时,对结果中所包含的个人信息进行去标识化处理的; +7、根据您的要求签订和履行合同所必需的; +8、维护小蜜蜂所提供的产品或服务的安全稳定运行所必需的,例如发现、处置产品或服务的故障; +9、开展合法的新闻报道所必需的; +10、出于公共利益开展统计或学术研究所必要,且对外提供学术研究或描述的结果时,对结果中所包含的个人信息进行去标识化处理的; 11、法律法规规定的其他情形。 -二、我们如何使用您的个人信息 -1、我们会保持您的个人数据及时更新;安全地存储或销毁它;最小化收集和保留我们需要为您提供服务所需的数据;保护个人信息免遭泄露、滥用、未经授权的访问和披露;采取适当的技术措施保护您个人信息的安全。 -2、我们将您的信息用于以下用途: -(1)根据我们与您签订的合同向您提供服务。 -(2)实现您的服务请求,包括履行订单;交付、激活或验证产品或服务;参加线上或线下活动;应您的要求进行变更或者提供您请求的信息(包括但不限于产品或服务的营销资料);以及提供技术支持。 -(3)向您发送有关您可能感兴趣的产品和服务的信息;邀请您参与商城活动(包括促销活动)、市场调查或满意度调查;或向您发送营销信息。 -(4) 按照我们收集信息时所述的要求提供其他您所要求的服务。 -(5)维持我们储存和处理您个人信息的数据技术系统的完整性和安全性。 -(6)执行或保护我们的协议或与您签订的合同。 -(7)检测和调查信息泄露、非法活动和欺诈行为。 -(8)联系您解决问题。 -(9)经过您许可的其它用途。 -3、需要注意的是,以上使用方式涵盖了我们使用您信息的主要方式。我们可能根据实际需要通过更新网站页面、APP、小程序或设备固件等方式,为用户提供更加多样化的服务。当我们要将信息用于本协议未载明的其他用途时,或要将基于特定目的收集而来的信息用于其他目的时,会以签署协议、弹窗提示、更新本协议等形式再次征求您的同意。 +您知悉并理解,在收集您的个人信息后,我们可能通过技术手段对数据进行去标识化处理,去标识化处理的信息将无法识别您的身份,在此情况下我们有权使用已经去标识化的信息,对用户数据库进行分析并予以商业化的利用,而无需另行获得您的同意。 +  +(五)有关个人敏感信息的提示 +个人敏感信息,是指一旦泄露、非法提供或滥用可能危害人身和财产安全,极易导致个人名誉、身心健康受到损害或歧视性待遇等的个人信息。以上由您提供或我们收集您的信息中,可能包含您的个人敏感信息,例如身份证件号码、个人生物识别信息(包括面部识别特征、声纹等)、银行账号、通信记录和内容、财产信息、征信信息、行踪轨迹、住宿信息、健康生理信息、交易信息。请您谨慎并留意个人敏感信息,您同意我们可以按本政策所述的目的和方式来处理您的个人敏感信息。 +二、我们如何使用 Cookies 和同类技术 +(一)Cookies +我们或我们的第三方合作伙伴可能通过Cookies或同类技术获取和使用您的信息,并将该等信息存储为日志信息。 +通过使用Cookies,我们向用户提供简单易行并富个性化的网络体验。一个Cookies是少量的数据,它们从一个网络服务器送至您的浏览器并存在计算机硬盘上。我们使用Cookies是为了让您可以受益,比如简化您重复登录的步骤、存储您的购物偏好或您购物车中的商品等数据进而为您提供购物的偏好设置、帮助您优化对广告的选择与互动、帮助判断您的登录状态以及账户或数据安全。 +  +(二) 网站信标等同类技术 +除 Cookies 外,我们还会在网站上使用网站信标和像素标签等其他同类技术。例如,我们向您发送的电子邮件可能含有链接至我们网站内容的地址链接,如果您点击该链接,我们会跟踪此次点击,帮助我们了解您的产品或服务偏好,以便于我们主动改善客户服务体验。网站信标通常是一种嵌入到网站或电子邮件中的透明图像。借助于电子邮件中的像素标签,我们能够获知电子邮件是否被打开。 +  +(三)Cookies及同类技术的使用 +我们使用Cookies或同类技术,可能用于以下用途: +1、记住您的身份。例如:Cookies或同类技术有助于我们辨认您作为我们的注册用户的身份,或保存您向我们提供有关您的喜好或其他信息,或协助判断您的登录状态是否正常、账号是否存在异常情况; +2、分析您使用我们服务的情况。我们可利用Cookies或同类技术来了解您使用小蜜蜂服务的什么功能、或哪些产品/服务最受欢迎; +3、广告优化。Cookies或同类技术有助于我们根据您的信息,向您提供与您相关的广告而非进行普遍的广告投放。 +我们为上述目的使用Cookies或同类技术的同时,可能将通过Cookies或同类技术收集的非个人身份信息汇总提供给广告商或其他合作伙伴,用于分析您和其他用户如何使用小蜜蜂服务并用于广告服务。 +您可根据自己的偏好管理或删除、退订 Cookies或同类技术。您通常可根据自己的需要来修改浏览器的设置以拒绝 Cookies或其他同类技术,或清除软件内保存的所有Cookies或同类技术,或根据相应的选择机制拒绝Cookies或同类技术的应用。但如果您这么做,您可能无法享受最佳的服务体验,如您可能需要在每一次访问小蜜蜂时亲自更改用户设置,而且您之前所记录的相应信息也均会被删除,某些服务也可能无法正常使用。 三、我们如何共享、转让、公开披露您的个人信息 (一)共享 -我们不会与任何公司、组织和个人分享您的个人信息,但以下情况除外: -1、我们可能会根据法律法规规定,或按政府主管部门的强制性要求, 对外共享您的个人信息(见本协议第一(一)、(二)条中描述需要收集您个人信息种类)。 -2、在获取明确同意的情况下共享:获取您的明确同意后,我们会与其它方共享您已明确同意的个人信息。 -3、与授权合作伙伴的共享 -我们可能委托授权合作伙伴为您提供某些服务或代表我们履行职能,我们仅会处于本隐私政策声明的合法、正当、必要、特定、明确的目的共享您的信息,授权合作伙伴只能接触到其履行职责所需信息(如您选择云冲印的照片提供给服务提供方,见本协议第一(四)条中描述需要向您请求访问云盘内的照片),且不得将此信息用于其他任何目的。 +我们不会与小蜜蜂运营者以外的公司、组织和个人共享您的个人信息,但以下情况除外: +1、在获取您授权同意的情况下共享:获得您授权同意后,我们会与第三方共享您的个人信息。 +2、在法定情形下共享:我们可能会根据法律法规规定、诉讼争议解决需要,或按行政、司法机关依法提出的要求,对外共享您的个人信息。 +3、为实现本政策第一条“我们如何收集和使用您的个人信息”部分所述目的的情形下共享。 +4、与我们的关联方共享:为便于我们基于统一的账号体系向您提供一致化服务、保障系统和账号安全,便于您进行统一管理,提升您的使用体验,我们可能会将您的个人信息与我们的关联方共享。但我们只会共享必要的个人信息,且受本政策中所声明目的的约束。如果我们的关联方改变个人信息的使用及处理目的,将再次征求您的授权同意。 +5、与授权合作伙伴共享:仅为实现本政策中声明的目的,我们可能会与授权合作伙伴共享您的订单信息、账户信息、设备信息、日志信息以及位置信息,以提供更好的客户服务和用户体验。我们仅会出于合法、正当、必要、特定、明确的目的共享您的个人信息,并且只会共享提供服务所必要的个人信息。我们的授权合作伙伴无权将共享的个人信息用于与小蜜蜂服务无关的其他用途。 目前,我们的授权合作伙伴包括以下类型: -供应商和服务提供商。我们将信息发送给支持我们服务的服务提供商,这些支持包括受我们委托向用户提供技术和基础硬件服务、分析我们服务的使用方式。 -我们会对授权合作伙伴获取有关信息的应用程序接口(API)、软件工具开发包(SDK)进行严格的安全检测,并于授权合作伙伴约定严格的数据保护措施,令其按照我们的委托目的、服务说明、本隐私政策以及其它相关的保密和安全措施来处理个人信息。 +(1)商品或服务的供应商。我们可能会将您的个人信息共享给支持我们业务的供应商、服务提供商。这些支持包括提供基础设施技术服务、物流配送服务、支付服务、提供客户服务、数据处理等。我们共享这些信息的目的是可以实现我们产品与/或服务的核心购物功能,比如我们必须与物流服务提供商共享您的订单信息才能安排送货;或者我们需要将您的订单编号、订单金额和商品类型与第三方支付机构共享以实现其确认您的支付指令并完成支付等。 +(2)第三方商家。如您在小蜜蜂购买第三方商家提供的产品或服务时,我们会将相应的订单信息及收货信息共享给对应的第三方商家以实现您向其购买产品或服务的需求,并促使其可以完成后续的售后服务。 +(3)广告、分析服务类的授权合作伙伴。除非得到您的许可,否则我们不会将您的个人身份信息(指可以识别您身份的信息,例如姓名或电子邮箱,通过这些信息可以联系到您或识别您的身份)与提供广告、分析服务的合作伙伴共享。我们会向这些合作伙伴提供有关其广告覆盖面和有效性的信息,而不会提供您的个人身份信息,或者我们将这些信息进行汇总,以便它不会识别您个人。这类合作伙伴可能将上述信息与他们合法获取的其他数据相结合,以衡量广告和服务的有效性或进行行业研究和调查。 +6、履行我们在本政策或我们与您达成的其他协议中的义务和行使我们的权利。 +对我们与之共享个人信息的公司、组织和个人,我们会与其签署严格的保密协议,要求他们按照我们的说明、本政策以及其他任何相关的保密和安全措施来处理个人信息。 +  (二)转让 我们不会将您的个人信息转让给任何公司、组织和个人,但以下情况除外: -在涉及合并、收购或破产清算时,如涉及到个人信息转让,我们会在要求新的持有您个人信息的公司、组织继续受此隐私政策的约束,否则我们将要求该公司、组织重新向您征求授权同意(见本协议第一(一)、(二)条中描述需要收集您个人信息种类)。在涉及兼并、重组或破产清算情形时,我们会要求新的承接您个人信息的公司、组织继续受本协议的约束,承接数据安全责任和义务,否则我们将要求该公司、组织和个人重新向您征求授权同意,没有数据承接方的,将对数据作销毁处理。 -(三)公开披露 -我们仅会在以下情况下,公开披露您的个人信息: -基于法律的披露:在法律、法律程序、诉讼或政府主管部门强制性要求的情况下,我们可能会公开披露您的个人信息(见本协议第一(一)、(二)条中描述需要收集您个人信息种类)。 -四、我们如何存储您的个人信息 -我们在中华人民共和国境内运营中收集和产生的个人信息,存储在中国境内。由于我们的产品不涉及跨境业务,您的数据不会涉及跨境传输。除非法律有另外规定,小蜜蜂将按照如下期限保存您的信息: -1、在您使用小蜜蜂产品或服务期间,我们将持续为您保存,将严格按照国家有关规定做好您数据存储工作,除非您主动删除或注销小蜜蜂帐号。 -2、我们将根据小蜜蜂的数据备份策略定期对收集的信息进行备份处理。 -3、我们仅为实现目的所必需的最短时间保留您的个人信息。但在下列情况下,我们有可能因需符合法律要求,更改个人信息的存储时间: -•为遵守适用的法律法规等有关规定; -•为遵守法院判决、裁定或其他法律程序的规定; -•为遵守相关政府机关或法定授权组织的要求; -•我们有理由确信需要遵守法律法规等有关规定; -•为执行相关服务协议或本政策、维护社会公共利益,为保护我们的客户、我们或我们的关联公司、其他用户或雇员的人身财产安全或其他合法权益所合理必需的用途。 -当我们要将信息用于本政策未载明的其它用途时,会事先征求您的同意。当我们要将基于特定目的收集而来的信息用于其他目的时,会事先征求您的同意。 -4、对于所收集的信息,我们将在法律规定的最短期限内保存,超出保存期限后,我们将对所收集的信息进行匿名化处理。您的个人信息经过匿名化与脱敏处理后将形成可以使用的流通数据,小蜜蜂对此数据的保存和使用无需另外征得您的同意。 -5、当您删除信息或注销小蜜蜂帐号后,小蜜蜂将停止对您个人信息的使用,并在一定期限内删除您的个人信息或匿名化处理。 -6、当我们停止运营其产品或服务时,我们将: -(1)及时停止继续收集您个人信息的活动。 -(2)将停止运营的通知以送达或公告的形式通知您。 -(3)对我们所持有的个人信息进行删除或匿名化处理。 -五、我们如何保护您的个人信息 -(一)我们已使用符合业界标准的安全防护措施保护您提供的个人信息, 防止数据遭到未经授权访问、公开披露、使用、修改、损坏或丢失。我们会采取一切合理可行的措施,保护您站点下用户的个人信息。在您站点用户的浏览器与“服务”之间交换数据(如采集用户访问频次、访问偏好及网站性能)时受 SSL加密保护;我们同时对小蜜蜂网站提供 https 安全浏览方式;我们会使用加密技术确保数据的保密性;我们会使用受信赖的保护机制防止数据遭到恶意攻击;我们会部署访问控制机制,确保只有授权人员才可访问个人信息;以及我们会举办安全和隐私保护培训课程,加强员工对于保护个人信息重要性的认识。 -(二)我们会采取一切合理可行的措施,确保未收集无关的个人信息。我们只会在达成本政策所述目的所需的期限内保留您的个人信息,除非需要延长保留期(详见一、(七)存储信息的期限)或受到法律的允许。 -(三)互联网并非绝对安全的环境,而且电子邮件、即时通讯、及与其他用户的交流方式并未加密,我们强烈建议您不要通过此类方式发送小蜜蜂账号信息。请使用复杂密码,协助我们保证您的账号安全。 -(四)互联网环境并非百分之百安全,我们将尽力确保或担保您发送给我们的任何信息的安全性。如果我们的物理、技术、或管理防护设施遭到破坏,导致信息被非授权访问、公开披露、篡改、或毁坏,导致您的合法权益受损,我们将承担相应的法律责任。 -(五)在不幸发生个人信息安全事件后,我们将按照法律法规的要求,及时向您告知:安全事件的基本情况和可能的影响、我们已采取或将要采取的处置措施、您可自主防范和降低风险的建议、对您的补救措施。我们将及时将事件相关情况以邮件、信函、电话、推送通知等方式告知您,难以逐一告知个人信息主体时,我们会采取合理、有效的方式发布公告。同时,我们还将按照监管部门要求,主动上报个人信息安全事件的处置情况。 -(六)对于所收集的信息,我们将在法律规定的最短期限内保存,超出保存期限后,我们将对所收集的信息进行匿名化处理。 -六、您的权利 -按照中国相关的法律、法规、标准,以及其他国家、地区的通行做法,我们保障您对自己的个人信息行使以下权利: -(一)访问您的个人信息 -您有权访问您的个人信息,法律法规规定的例外情况除外。如果您想行使数据访问权,可以通过以下方式自行访问: -账户信息——为了您的个人信息安全,您的手机号会进行脱敏显示。您可以通过【“我的”->点击“头像”-“个人资料”】查看您的用户头像、昵称、小蜜蜂账号(手机号)。目前APP内支持修改用户头像及昵称。如果您希望更改您的密码、添加安全信息或关闭您的账户,您也可以通过小蜜蜂APP内执行此类操作。如果您无法通过上述链接访问这些个人信息,请您把问题发送到邮箱:kaidalai@163.com,我们将在7个工作日内回复您的请求。 -(二)更正您的个人信息 -当您发现我们处理的关于您的个人信息有错误时,您有权要求我们做出更正。您可以通过“(一)访问您的个人信息”中罗列的方式提出更正申请。 -如果您无法通过上述链接更正这些个人信息,请您把问题发送到邮箱:kaidalai@163.com,我们将在7个工作日内回复您的更正请求。 -(三)删除您的个人信息 -您可以通过发送邮件到邮箱:kaidalai@163.com联系我们进行信息删除,我们将在七个工作日内做出答复。若我们决定响应您的删除请求,我们还将同时通知从我们获得您的个人信息的实体,要求其及时删除,除非法律法规另有规定,或这些实体获得您的独立授权。 -当您从我们的服务中删除信息后,我们可能不会立即备份系统中删除相应的信息,但会在备份更新时删除这些信息。 -(四)个人信息主体注销账户 -您随时可注销此前注册的账户,您可以通过以下方式自行操作: -1、手机端(安卓/iOS)在登录界面,进入【帮助->查看其它问题->我怎么注销账号】 -2、手机端(安卓/iOS)在【“我的”->点击头像进入“设置”页面->点击“安全中心”->“小蜜蜂账号注销”】 -在注销账户之后,我们将停止为您提供产品或服务,并依据您的要求,删除您的个人信息,法律法规另有规定的除外。 -(五)改变您授权同意的范围 -小蜜蜂业务功能可能需要一些基本的个人信息才能得以完成(见本协议中的第一条(一)、(二))。除此之外,对于额外个人信息的收集和使用,您可以与通过发送邮件以及联系个人信息保护相关负责人给予或撤回授权(联系方式见本协议第九条)。 -对于您已经授权同意我们收集和使用的终端设备权限信息,您可以通过在终端设备进行设置、改变或撤回您的授权同意,Android终端可点击【系统设置->应用与权限->应用权限管理】进行设置,iOS终端可点击【系统设置->小蜜蜂】进行设置。您也可以在本APP中【“我的”->点击头像进入“设置”页面->点击“安全中心”->“小蜜蜂账号注销”】的路径撤回授权同意。您改变或撤回授权同意后,可能无法使用相应的功能服务。 -当您收回同意后,我们将不再处理相应的个人信息。 但您收回同意的决定,不会影响此前基于您的授权而开展的个人信息处理。 +1、在获取授权同意的情况下转让:获得您的授权同意后,我们会向第三方转让您的个人信息; +2、随着我们业务的持续发展,我们有可能进行合并、收购、资产转让或类似的交易,而您的信息有可能作为此类交易的一部分而被转移。我们会要求新的持有您个人信息的公司、组织继续受本政策的约束,否则我们将要求该公司、组织重新向您征求授权同意。 +  +(三)披露 +我们仅会在以下情况下,且采取符合业界标准的安全防护措施的前提下,披露您的个人信息: +1、获得您授权同意或基于您的主动选择,我们可能会披露您的个人信息; +2、根据法律、法规的要求、强制性的行政执法或司法要求所必须提供您个人信息的情况下,我们可能会依据所要求的个人信息类型和披露方式披露您的个人信息。在符合法律法规的前提下,当我们收到上述披露信息的请求时,我们会要求接收方必须出具与之相应的法律文件,如传票或调查函。 +  +(四)共享、转让、披露个人信息时事先征得授权同意的例外 +以下情形中,共享、转让、披露您的个人信息无需事先征得您的授权同意: +1、与国家安全、国防安全直接相关的; +2、与公共安全、公共卫生、重大公共利益直接相关的; +3、与刑事侦查、起诉、审判和判决执行等直接相关的; +4、出于维护您或其他个人的生命、财产等重大合法权益但又很难得到您同意的; +5、您自行向社会公众公开的个人信息; +6、从合法公开披露的信息中收集个人信息的,如合法的新闻报道、政府信息公开等渠道; +7、基于法律法规规定履行法定义务; +8、与我们履行法律法规规定的义务相关的。 +根据法律规定,共享、转让经去标识化处理的个人信息,且确保数据接收方无法复原并重新识别个人信息主体的,不属于个人信息的对外共享、转让及披露行为,对此类数据的保存及处理将无需另行向您通知并征得您的同意。 +四、我们如何保护您的个人信息安全 +(一)除法律法规或监管部门另有规定外,我们仅在本政策所述目的所必需且最短时限内存储您的个人信息,除非法律法规或监管机关另有要求或延长保留期征得您的同意。当您的个人信息超出我们所保存的期限后,我们会对您的个人信息进行删除或匿名化处理。 +  +(二)如我们终止服务或运营,我们将及时停止继续收集您个人信息的活动,同时会遵守相关法律法规要求提前向您通知,并在终止服务或运营后对您的个人信息进行删除或匿名化处理,但法律法规或监管部门另有规定的除外。涉及儿童个人信息的,我们会将停止运营的通知及时告知儿童监护人。 +  +(三)我们在中华人民共和国境内运营中收集和产生的信息,均存储在中国境内,目前我们暂时不存在跨境存储您的个人信息或向境外提供个人信息的场景。如需跨境存储或向境外提供个人信息的,我们会单独向您明确告知并征得您的授权同意。 +  +(四)信息安全保障措施 +我们非常重视个人信息安全,成立了专门的安全团队,并采取一切合理可行的措施,保护您的个人信息。 +1、数据安全技术措施 +我们会采用符合业界标准、合理可行的安全防护措施保护您提供的个人信息,防止您的个人信息遭到未经授权访问、公开披露、使用、修改、损坏或丢失。 +(1)我们会采用加密技术确保数据的保密性。例如,在您的浏览器与服务器之间交换数据(如信用卡信息)时受 SSL(Secure Socket Layer)加密保护。 +(2)我们会采用数据脱敏技术增强个人信息在使用中安全性。 +(3)我们对小蜜蜂提供HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer)安全浏览方式。 +(4)我们会采用受信赖的保护机制防止数据遭到恶意攻击。 +(5)我们会采用严格的数据访问权限控制和多重身份认证技术保护个人信息,避免数据被违规使用。 +2、其他安全措施 +(1)我们有行业先进的以数据为核心,围绕数据生命周期进行的数据安全管理体系,从组织建设、制度设计、人员管理、产品技术等方面多维度提升整个系统的安全性。 +(2)我们通过建立数据分级制度、数据安全管理规范、数据安全开发规范来管理规范个人信息的存储和使用。 +(3)我们会部署访问控制机制,仅允许有必要知晓这些信息的员工、合作伙伴访问您的个人信息,并为此设置了严格的访问权限控制和监控机制。我们同时要求可能接触到您个人信息的所有人员履行相应的保密义务。如果未能履行这些义务,可能会被追究法律责任或被中止与我们的合作关系。 +(4)我们会举办安全和隐私保护培训课程,加强员工对于保护个人信息重要性的认识。 +(5)我们有行业先进的以数据为核心、围绕数据生命周期进行的数据安全管理体系,从组织建设、制度设计、人员管理、产品技术等方面多维度提升整个系统的安全性。 +(6)我们会采取一切合理可行的措施,确保未收集无关的个人信息。 +3、互联网环境并非百分之百安全,我们将尽力确保或担保您发送给我们的任何信息的安全性。如果我们的物理、技术、或管理防护设施遭到破坏,导致信息被非授权访问、公开披露、篡改、或毁坏,导致您的合法权益受损,我们将承担相应的法律责任。 +  +(五)安全提示 +1、在使用小蜜蜂服务进行沟通或购买商品及服务时,您不可避免地要向交易对方或潜在的交易对方披露自己的个人信息,如联络方式或联系地址。请您妥善保护自己的个人信息,仅在必要的情形下向他人提供。 +2、请注意,您在使用我们服务时自愿共享甚至公开分享的信息,可能会涉及您或他人的个人信息甚至个人敏感信息,如您在评价或分享晒单时选择上传包含个人信息的图片。请您更加谨慎地考虑,是否在使用我们的服务时共享甚至公开分享相关信息。若您公开分享的信息中涉及儿童个人信息的,您需在发布前征得该儿童监护人的同意。 +3、请您理解,由于技术的限制以及风险防范的局限,即便我们已经尽量加强安全措施,也无法始终保证信息百分之百的安全。您需要了解,您接入小蜜蜂服务所用的系统和通讯网络,有可能因我们可控范围外的情况而发生问题。 +  +(六)安全事件处置 +为应对个人信息泄露、损毁和丢失等可能出现的风险,我们制定了多项制度,明确安全事件、安全漏洞的分类分级标准及相应的处理流程。我们也为安全事件建立了专门的应急响应团队,按照安全事件处置规范要求,针对不同安全事件启动安全预案,进行止损、分析、定位、制定补救措施、联合相关部门进行溯源和打击。 +在不幸发生信息安全事件后,我们将按照法律法规的要求,及时向您告知:安全事件的基本情况和可能的影响、我们已采取或将要采取的处置措施、您可自主防范和降低风险的建议、对您的补救措施等。我们会及时将事件相关情况以邮件、信函、电话、推送通知等方式告知您,难以逐一告知个人信息主体时,我们会采取合理、有效的方式发布公告。同时,我们还将按照监管部门要求,主动上报信息安全事件的处置情况。 +五、您如何管理您的个人信息 +我们非常重视您对个人信息的关注,并尽全力保护您对于您个人信息访问、更正、删除以及撤回同意的权利,以使您拥有充分的能力保障您的隐私和安全。同时也请您理解,您更正、删除、撤回授权或注销账号的决定,并不影响我们此前基于您的授权而开展的个人信息处理。 +您可以通过以下方式来管理您的个人信息,但请您知悉,除法律法规另有规定,当您更正、删除您的个人信息或申请注销账号时,我们可能不会立即从备份系统中更正或删除部分特定信息,但会在备份更新时更正或删除这些信息。 +  +(一)访问、更正您的个人信息 +您有权随时访问、更正您的个人信息,法律法规另有规定的情况除外。您可以通过以下方式自行访问、更正您的个人信息: +1、您可以登录移动客户端账号,在底部点击“我的”进入个人页面,然后点击左上角的头像进入个人中心查询、更正您的个人信息及账户信息;点击“我的”中的“地址”查询、更正您的收货地址; +3、如果您无法通过上述路径访问、更正该等个人信息,您可以通过我们的在线客服与我们取得联系。对于您在使用小蜜蜂服务过程中产生的其他个人信息需要访问或更正,我们会根据本政策所列明的方式、期限及范围来响应您的请求。但出于安全性和身份识别的考虑,您可能无法修改注册时提交的某些初始注册信息。 +  +(二)删除您的个人信息 +1、您可以通过“(一)访问、更正您的个人信息”中列明的方式自主删除您的部分个人信息。在部分信息删除时,我们可能会要求您进行身份验证,以保障信息安全。 +2、在以下情形中,如您无法通过前述第1款所述方式自主删除您的个人信息,您可以向我们提出删除个人信息的请求: +(1)如果我们处理个人信息的行为违反法律法规; +(2)如果我们收集、使用您的个人信息,却未征得您的授权同意; +(3)如果我们处理个人信息的行为严重违反了与您的约定; +(4)如果我们不再为您提供小蜜蜂服务。 +若我们确认您的删除请求符合法律法规及其他公示的要求,我们还将同时尽可能通知从我们处获得您的个人信息的关联方及授权合作伙伴,要求其及时删除,除非法律法规另有规定,或这些实体获得您的独立授权。 +  +(三)改变您授权同意的范围或撤回您的授权 +请您理解,有些基本的个人信息是您使用小蜜蜂服务所必需的,但大多数其他个人信息的提供是由您决定的。您可以通过删除信息、关闭设备功能等方式改变您授权我们继续调用附加功能收集您个人信息的范围或撤回您的授权。当您撤回授权后,我们将无法继续为您提供您撤回授权所对应的服务,也不再处理您相应的个人信息。 +  +(四)注销您的账户 +您可以登录小蜜蜂移动客户端,通过“我的-设置-账户与安全-注销账户”申请注销您的账户。在您主动注销账户之后,我们将停止为您提供产品或服务,我们将根据适用法律的要求删除您的个人信息,或使其匿名化处理。 +  +(五)约束信息系统自动决策 +在某些业务功能中,我们可能仅依据信息系统、算法等在内的非人工自动决策机制做出决定。如果这些决定显著影响您的合法权益,您有权要求我们做出解释,我们也将在不侵害小蜜蜂商业秘密或其他用户权益、社会公共利益的前提下提供适当的救济方式。 +  (六)响应您的上述请求 为保障安全,您可能需要提供书面请求,或以其他方式证明您的身份。我们可能会先要求您验证自己的身份,然后再处理您的请求。 -我们将在七个工作日内做出答复。 -对于您合理的请求,我们原则上不收取费用,但对多次重复、超出合理限度的请求,我们将视情收取一定成本费用。对于那些无端重复、需要过多技术手段(需要开发新系统或从根本上改变现行惯例)、给他人合法权益带来风险或者非常不切实际(涉及备份磁带上存放的信息)的请求,我们可能会予以拒绝。 +一般情况下,我们将在十五日内做出答复。如您不满意,还可以通过本政策“如何联系我们”章节所列的反馈渠道与我们联系。 +对于您合理的请求,我们原则上会按照本政策约定进行响应,但对于无端重复、需要过多技术手段(例如,需要开发新系统或从根本上改变现行惯例)、给他人合法权益带来风险或者非常不切实际(例如,涉及备份磁带上存放的信息)的请求,我们可能会予以拒绝。 在以下情形中,按照法律法规要求,我们将无法响应您的请求: -1、与国家安全、国防安全直接相关的; -2、与公共安全、公共卫生、重大公共利益直接相关的; -3、与犯罪侦查、起诉、审判和判决执行等直接相关的; -4、有充分证据表明您存在主观恶意或滥用权利的; -5、响应您的请求将导致您或其他个人、组织的合法权益受到严重损害的; -6、涉及商业秘密的。 -七、我们如何处理儿童的个人信息 -我们的产品、网站和服务主要面向企业级用户,用户对象一般为成人。如果没有父母或监护人的同意,儿童不得创建自己的用户账户。 -对于经父母同意而收集儿童个人信息的情况,我们只会在受到法律允许、父母或监护人明确同意或者保护儿童所必要的情况下使用或公开披露此信息。 -尽管当地法律和习俗对儿童的定义不同,但我们将不满 14 周岁的任何人均视为儿童。如果我们发现自己在未事先获得可证实的父母同意的情况下收集了儿童的个人信息,则会设法尽快删除相关数据。 -八、本政策如何更新 -我们的隐私政策可能变更。 -未经您明确同意,我们不会削减您按照本隐私政策所应享有的权利。我们会在本页面上发布对本政策所做的任何变更。 -对于重大变更,我们还会提供更为显著的通知(包括对于某些服务, 我们会通过电子邮件发送通知,说明隐私政策的具体变更内容)。 -本政策所指的重大变更包括但不限于: -1、我们的服务模式发生重大变化。如处理个人信息的目的、处理的个人信息类型、个人信息的使用方式等; -2、我们在所有权结构、组织架构等方面发生重大变化。如业务调整、破产并购等引起的所有者变更等; -3、个人信息共享、转让或公开披露的主要对象发生变化; -4、您参与个人信息处理方面的权利及其行使方式发生重大变化; -5、我们负责处理个人信息安全的责任部门、联络方式及投诉渠道发生变化时; -6、个人信息安全影响评估报告表明存在高风险时。我们还会将本政策的旧版本存档,供您查阅。 +1、与我们履行法律法规规定的义务相关的; +2、与国家安全、国防安全直接相关的; +3、与公共安全、公共卫生、重大公共利益直接相关的; +4、与刑事侦查、起诉、审判和执行判决等直接相关的; +5、我们有充分证据表明您存在主观恶意或滥用权利的; +6、出于维护您或其他个人的生命、财产等重大合法权益但又很难得到本人同意的; +7、响应您的请求将导致您或其他个人、组织的合法权益受到严重损害的; +8、涉及商业秘密的。 +六、第三方服务 +小蜜蜂服务可能接入或链接至第三方提供的社交媒体或其他服务(包括网站或其他服务形式)。包括: +1、您可利用“分享”键将小蜜蜂上的某些内容分享给第三方产品,或您可利用第三方服务登录小蜜蜂服务。这些功能可能会收集您的信息(包括您的日志信息),并可能在您的设备内装置Cookies,从而正常运行上述功能; +2、我们通过广告或我们服务的其他方式向您提供链接,使您可以链接至第三方的服务或网站; +3、我们可能会接入第三方SDK或其他类似的应用程序服务(如以嵌入代码、插件等形式),您在小蜜蜂使用这类由第三方提供的服务时,该第三方可能会收集和处理您的部分信息。目前我们接入的第三方SDK或其他类似应用程序服务及相应的信息收集情况主要有: +(1)各类手机厂商的Push SDK可能会收集您的设备信息,用于推送/下发通知栏消息; +(2)高德地图SDK可能会在您授权后收集您的设备位置信息,用于预测产品的配送时限; +(3)支付类SDK可能会收集您的设备信息,用于判断支付环境是否安全;还可能会收集您的银行账户信息、实名认证信息用于交易行为核验及订单支付; +(4)运营商SDK可能会收集您的设备信息和手机号,用于快速便捷登录小蜜蜂; +(5)设备系统SDK可能会收集您的设备信息,用于监测系统运营安全性、诊断并解决系统故障。 +我们接入的部分第三方SDK或类似应用程序可能会收集您的个人信息,如您在我们的服务中使用这类由第三方提供的服务时,您同意将由其直接收集和处理您的信息。我们会评估这类第三方服务收集个人信息的合法性、正当性、必要性,要求该等第三方对您的个人信息采取保护措施,并严格遵守相关法律法规与监管要求。您可以查看《第三方SDK类服务商目录》,了解我们主要接入的第三方SDK基本情况。您也可以选择通过本政策“如何联系我们”章节所列的反馈渠道联系我们,我们会尽快为您作出解答。 +以上第三方服务由相关的第三方负责运营。您使用该等第三方服务(包括您向该等第三方提供的任何信息),须受第三方的服务条款及信息保护声明(而非本政策)约束。为了最大程度保障您的信息安全,我们强烈建议您在使用任何第三方服务前先行查看其隐私条款。我们会尽我们最大努力在接入第三方服务时进行安全检测并不定期进行审计,如发现第三方存在违规收集用户信息情形将及时切断接入,但我们无法对任何第三方使用由您提供的信息承担任何责任。如您发现这些第三方服务存在风险时,建议您终止相关操作并及时与我们联系以保护您的合法权益并及时与我们取得联系。 +七、未成年人信息的保护 +小蜜蜂服务主要面向具有完全民事行为能力的成年人。未经父母或者监护人同意,未满十四周岁的儿童不应创建小蜜蜂账户或者使用小蜜蜂服务。如您为未成年人,我们要求您请您的父母或其他监护人仔细阅读本政策及儿童个人信息收集使用规则,并在征得您的父母或其他监护人同意的前提下使用我们的服务或向我们提供信息。 +如果我们识别出您是儿童用户的,我们将通知您的监护人并要求您的监护人阅读并同意本政策及附件一《儿童个人信息收集使用规则》。对于经父母或其他监护人同意使用我们的产品或服务而收集儿童个人信息的情况,我们只会在法律法规允许、父母或其他监护人明确同意或者保护儿童所必要的情况下使用、共享、转让或披露此信息。若您是儿童的父母或其他监护人,请您关注您监护的儿童是否是在取得您的授权同意之后使用我们的服务的。如您对您所监护的儿童的个人信息有疑问,请通过“如何联系我们”章节中所列反馈渠道与我们联系。 +八、通知和修订 +(一)为了给您提供更好的服务,我们可能会根据小蜜蜂服务的更新情况及法律法规的相关要求适时修改本政策的条款,该等修改构成本政策的一部分。如该等更新造成您在本政策下权利的实质减少或重大变更(如收集和使用的个人信息类型、收集和使用方式发生重大变化),我们将在本政策生效前通过网站公告、推送通知、弹窗提示或其他方式来通知您,您如果不同意该等变更,可以选择停止使用小蜜蜂服务;如您仍然继续使用小蜜蜂服务的,即表示您已充分阅读、理解并同意受经修订的本政策的约束。 +我们的任何修改都会将您的满意度置于首位。我们鼓励您在每次使用小蜜蜂服务时都查阅我们的隐私政策。 +  +(二)我们可能在必需时(例如当我们由于系统维护而暂停某一项服务时)发出与服务有关的公告。您可能无法取消这些与服务有关、性质不属于推广的公告。 九、如何联系我们 -如果您对本隐私政策有任何疑问、意见或建议,也通过以下方式与我们联系: -电子邮箱:kaidalai@163.com -个人信息保护相关负责人联系方式:kaidalai@163.com -您反馈的信息我们将有专人跟进负责处理。我们将在十五个工作日内回复。 -如果您对我们的回复不满意,特别是我们的个人信息处理行为损害了您的合法权益,您还可以通过法律途径或前往行业自律协会等机构寻求解决方案。 -企业名称:深圳市凯达来科技有限公司 -地点:深圳市龙岗区横岗街道沙荷路40-11号 +我们设立了个人信息保护专职部门,将按照本政策保护您的个人信息。如您有关于网络信息安全的投诉和举报,或您对本政策、小蜜蜂的隐私措施、您的信息的相关事宜有任何问题、意见或建议,请与小蜜蜂的个人信息保护工作人员联系,可发送邮件至kaidalai@163.com或写信至以下地址:深圳市龙岗区横岗街道沙荷路40-11号 + 个人信息保护专员(收);邮编:518000。 +一般情况下,我们将在收到您的问题、意见或建议,并验证您的用户身份后的十五日内予以回复。 +  +  +  +  +  +附件一:儿童个人信息收集使用规则 +我们一直非常注重对未成年人的保护,致力于践行我们的企业社会责任。本《儿童个人信息收集使用规则》(以下也称“本规则”)旨在更详细的向监护人(以下也称“您”)和儿童(专指未满十四周岁的未成年人,下同)说明我们如何收集、使用、存储和处理儿童个人信息,以及我们为您与儿童提供的访问、更正、删除、保护这些信息的方式。请您仔细阅读、充分理解并决定选择是否同意本规则以及是否同意您监护的儿童使用小蜜蜂服务。 +  +一、适用范围 +本规则为《小蜜蜂隐私政策》的一部分;如在儿童个人信息收集和使用规则方面,本规则与《小蜜蜂隐私政策》正文存在不一致的,本规则优先适用,如本规则中未提及的,则适用《小蜜蜂隐私政策》。 +  +二、我们收集和使用儿童个人信息的规则 +我们会严格履行法律规定的儿童个人信息保护义务与责任,遵循正当必要、知情同意、目的明确、安全保障、依法利用的原则收集和使用儿童个人信息,在征得监护人的同意后收集和使用儿童个人信息,不会收集与我们提供的产品与/或服务无关的儿童个人信息,不会违反法律规定和我们与您的约定收集、使用儿童个人信息。 +1、在注册/登录过程中,用户可以填写出生日期;用户购买礼品卡超过1000元时,我们会要求用户进行实名认证。在前述场景下,我们可能会根据用户填写的信息识别该用户是否为儿童。 +2、当我们识别出用户为儿童时,我们可能会收集监护人的联系方式(例如手机号码、电子邮箱),联系监护人以验证其与儿童的监护关系,并在征得监护人同意后允许儿童使用小蜜蜂服务。在此过程中,为了更好地保护儿童的权益,我们还可能向监护人收集更多信息(例如姓名、身份证、户口本或其他监护关系证明),以便进一步验证监护人与儿童的监护关系。 +3、我们还可能收集由您或者其他用户主动上传的儿童个人信息,如在使用评价、晒单等功能分享商品相关信息时上传含有儿童个人信息的图片、视频或文字,我们会提示相关用户谨慎选择分享的信息内容,您作为监护人亦应当正确履行监护职责,保护儿童个人信息安全。 +4、在儿童使用小蜜蜂服务过程中,我们可能还会收集和使用其他儿童个人信息,具体请查阅《小蜜蜂隐私政策》“我们如何收集和使用个人信息”章节进行详细了解。如我们需要超出上述范围收集和使用儿童个人信息,我们将再次征得监护人的同意。 +5、有关儿童个人敏感信息的提示 +由儿童或监护人提供或我们收集的儿童信息中,可能包含儿童的个人敏感信息,例如身份证件号码、个人生物识别信息、征信信息、行踪轨迹、住宿信息、健康生理信息、交易信息。请监护人和儿童应谨慎并留意儿童个人敏感信息,监护人同意儿童相关个人敏感信息我们可以按本规则所述的目的和方式来处理。 +  +三、我们共享、转让、公开披露儿童个人信息的规则 +对于儿童个人信息,我们仅在《小蜜蜂隐私政策》所述的目的和范围内或依照法律要求进行共享,并遵循正当必要、知情同意、目的明确、安全保障、依法利用的原则转让、公开披露儿童个人信息,您可以查阅《小蜜蜂隐私政策》“我们如何共享、转让、公开披露您的个人信息”章节了解更多细节。 +  +四、您及/或儿童对儿童个人信息的管理规则 +(一) 查询和访问儿童个人信息 +您或儿童可以在小蜜蜂PC端“个人中心”及App端“个人”页面查询和访问儿童的相关个人信息,例如:账户信息、地址管理。 +  +(二) 更正/修改儿童个人信息 +您可以在小蜜蜂PC端“个人中心”及App端“个人”页面更正/修改儿童的相关个人信息,或您可以联系我们解决,我们会在经对您的身份进行验证,且不影响信息的客观性和准确性的情况下进行更正/修改。但出于安全性和身份识别的考虑,您可能无法修改注册时提交的某些初始注册信息。 +同时,如您或儿童发现我们收集、存储、使用、披露的儿童个人信息有错误且无法通过前述途径进行更正的,可以联系我们更正,我们会在完成身份验证和核实问题后及时采取措施予以更正。 +  +(三) 删除儿童个人信息 +您可以通过前述“(二)更正/修改儿童个人信息”中列明的途径自主删除您的部分个人信息。在部分信息删除时,我们可能会要求您进行身份验证,以保障信息安全。 +在以下情形下,您或儿童无法通过前述途径删除儿童个人信息的,可以直接向我们提出删除儿童个人信息的请求,我们会在完成身份验证和核实问题后及时采取措施予以删除,包括: +1、我们违反法律法规的规定或者与监护人和儿童的约定收集、存储、使用、转移、披露儿童个人信息的; +2、超出目的范围或者必要期限收集、存储、使用、转移、披露儿童个人信息的; +3、监护人撤回同意的; +4、监护人或儿童通过注销等方式终止使用小蜜蜂服务的; +5、法律法规等规定的其他情形。 +  +五、我们存储和保护儿童个人信息的规则 +我们依照法律法规的规定,仅将儿童个人信息存储于中华人民共和国境内。我们仅在《小蜜蜂隐私政策》所述目的所必需的最短时限内存储儿童个人信息,除非法律法规或监管机关另有要求。当儿童个人信息超出我们所保存的期限后,我们会对儿童个人信息进行删除或匿名化处理。 +我们采用了符合行业标准的安全技术措施及配套的管理体系等多层面保护措施来保护儿童个人信息;同时,我们遵循最小授权原则,对工作人员设定了严格的信息访问权限,控制儿童个人信息知悉范围;我们也采取了必要技术措施,避免违法复制、下载儿童个人信息。如您希望了解更多,请您查阅《小蜜蜂隐私政策》“我们如何保护您的个人信息安全”章节。 +  +六、如何联系我们 +我们设有个人信息保护专职部门并指定了专门的儿童个人信息保护负责人,将严格按照本规则保护儿童个人信息。如监护人和儿童有关于网络信息安全的投诉和举报,或对本规则、儿童个人信息保护措施等相关事宜有任何问题、意见或建议,请随时与我们联系,可以发送邮件至kaidalai@163.com或写信至以下地址:深圳市龙岗区横岗街道沙荷路40-11号;邮编:518000。 +一般情况下,我们将在收到问题、意见或建议,并验证监护人和/或儿童身份后的十五个工作日内予以回复。如监护人或儿童不满意我们的回复,还可以向消费者权益保护部门投诉或向有管辖权的法院提起诉讼。 +  +  +附件二:第三方SDK类服务商目录 +为保障小蜜蜂服务的相关功能的实现与应用安全稳定的运行,我们可能会接入由第三方提供的软件开发包(SDK)或类似应用程序实现相关目的。我们会对合作方获取信息的软件工具开发包(SDK)或类似应用程序进行严格的安全评估,以保护您的个人信息安全。以下是我们接入的主要的第三方服务商的信息: +  +小米推送SDK +使用目的:推送消息 +数据类型:设备标识信息 +官网链接:https://dev.mi.com/console/appservice/push.html +  +华为推送SDK +使用目的:推送消息 +数据类型:设备标识信息 +官网链接: https://developer.huawei.com/consumer/cn/service/hms/pushservice.html +  +VIVO推送SDK +使用目的:推送消息 +数据类型:设备标识信息 +官网链接:https://dev.vivo.com.cn/documentcenter/doc/233 +  +OPPO推送SDK +使用目的:推送消息 +数据类型:设备标识信息 +官网链接:https://open.oppomobile.com/wiki/doctid=10196 +  +Glide SDK +使用目的:在线加载图片 +数据类型:网络状态信息 +官网链接:https://github.com/ansen666/GlideTest +  +微信SDK +使用目的:用于微信账号登录小蜜蜂服务、帮助用户分享内容至微信客户端 +数据类型:设备标识信息 +官网链接:https://open.weixin.qq.com/ +   +QQ SDK +使用目的:用于QQ账号小蜜蜂服务、帮助用户分享内容至QQ客户端 +数据类型:设备标识信息 +官网链接:https://open.tencent.com/ +  +微信支付 +使用目的:帮助用户在应用内使用微信支付 +数据类型:设备标识信息 +官网链接:https://pay.weixin.qq.com/ +  +支付宝 +使用目的:帮助用户在应用内使用支付宝支付 +数据类型:设备标识信息 +官网链接:https://docs.open.alipay.com/ +  +银联手机支付控件SDK +使用目的:帮助用户在应用内使用云闪付支付 +数据类型:设备标识信息 +官网链接:https://open.unionpay.com/tjweb/index +     +高德定位SDK +使用目的:定位以及地图展示及poi查询 +数据类型:外部存储状态,最近一次地理位置信息,持续定位,网络类型,网络服务运营商,IMEI,MAC地址,WIFI信息 +官网链接:https://lbs.amap.com/ +隐私政策链接:https://lbs.amap.com/home/privacy/ +  +腾讯云播放器SDK +使用目的:直播回放和短视频播放 +数据类型:设备标识信息 +官网链接:https://cloud.tencent.com/document/product/584/44877 + +腾讯移动直播SDK +使用目的:直播推流,录制与播放 +数据类型:设备标识信息 +官网链接:https://cloud.tencent.com/document/product/454/41514 + +美洽SDK +使用目的:客服会话 +数据类型:设备标识信息 +官网链接:https://meiqia.com/help/development/dlu4mi + +二维码生成和扫描SDK +使用目的:生成商品分享二维码,扫描二维码识别商品 +数据类型:设备状态和身份 +官网链接:https://github.com/customPub/flutter_qr_reader ''', style: TextStyle( fontSize: 30.w, diff --git a/lib/provider/app_provider.dart b/lib/provider/app_provider.dart index 68f34fec..8a409a67 100644 --- a/lib/provider/app_provider.dart +++ b/lib/provider/app_provider.dart @@ -310,6 +310,8 @@ class AppProvider extends ChangeNotifier { ///保存默认收货地址 Future getMyAddress() async { BaseModel model = await NetUtil().get(SAASAPI.market.address.myAddress); + + print((model.data as List).length); if ((model.data as List).length == 0) { _addressModels.clear(); _defaultAddressModel=null; diff --git a/lib/saas_model/my_house/my_family_member_list_model.dart b/lib/saas_model/my_house/my_family_member_list_model.dart index 25f3c98a..81ccad45 100644 --- a/lib/saas_model/my_house/my_family_member_list_model.dart +++ b/lib/saas_model/my_house/my_family_member_list_model.dart @@ -1,5 +1,7 @@ import 'package:json_annotation/json_annotation.dart'; +import '../../model/common/img_model.dart'; + part 'my_family_member_list_model.g.dart'; @JsonSerializable() @@ -29,6 +31,7 @@ class Member { final int id; final String name; final int identity; + final List avatarImgList; factory Member.fromJson(Map json) => _$MemberFromJson(json); @@ -36,5 +39,6 @@ class Member { required this.id, required this.name, required this.identity, + required this.avatarImgList, }); } diff --git a/lib/saas_model/my_house/my_family_member_list_model.g.dart b/lib/saas_model/my_house/my_family_member_list_model.g.dart index 6eada3da..4448b7e5 100644 --- a/lib/saas_model/my_house/my_family_member_list_model.g.dart +++ b/lib/saas_model/my_house/my_family_member_list_model.g.dart @@ -23,4 +23,7 @@ Member _$MemberFromJson(Map json) => Member( id: json['id'] as int, name: json['name'] as String, identity: json['identity'] as int, + avatarImgList: (json['imgList'] as List) + .map((e) => ImgModel.fromJson(e as Map)) + .toList(), ); diff --git a/lib/ui/community/community_views/add_new_event_page.dart b/lib/ui/community/community_views/add_new_event_page.dart index 727b709a..dc6e0a17 100644 --- a/lib/ui/community/community_views/add_new_event_page.dart +++ b/lib/ui/community/community_views/add_new_event_page.dart @@ -14,7 +14,6 @@ import 'package:bot_toast/bot_toast.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; -import 'package:velocity_x/velocity_x.dart'; class AddNewEventPage extends StatefulWidget { final int? initTopic; @@ -229,20 +228,26 @@ class _AddNewEventPageState extends State { } } -class TopicWidgets extends StatelessWidget { - const TopicWidgets({ - Key? key, - this.hotTopicModels, - this.topicTags, - }) : assert(hotTopicModels != null || topicTags != null), - super(key: key); - +class TopicWidgets extends StatefulWidget { final List? hotTopicModels; final List? topicTags; List get models => hotTopicModels == null ? topicTags! : hotTopicModels!; + const TopicWidgets({Key? key,this.hotTopicModels, + this.topicTags,}) : super(key: key); + + @override + State createState() => _TopicWidgetsState(); +} + +class _TopicWidgetsState extends State { + bool _deleteTopic=false; + @override + void setState(VoidCallback fn) { + super.setState(fn); + } @override Widget build(BuildContext context) { return Wrap( @@ -251,21 +256,53 @@ class TopicWidgets extends StatelessWidget { runSpacing: 12.w, crossAxisAlignment: WrapCrossAlignment.start, children: [ - ...models - .map((e) => Container( + ...widget.models + .map( + (e) => GestureDetector( + onLongPress: () { + _deleteTopic = !_deleteTopic; + setState(() { }); + print(_deleteTopic); + }, + child: Stack( + children: [ + Container( padding: - EdgeInsets.symmetric(vertical: 8.w, horizontal: 16.w), + EdgeInsets.symmetric(vertical: 8.w, horizontal: 16.w), decoration: BoxDecoration( color: Color(0xFFF4F7FC).withOpacity(0.8), borderRadius: BorderRadius.circular(25.w)), - child: '# ${e.title}' + child:'# ${e.title}' .text .size(24.sp) .color(Color(0xFF547FC0)) .make(), - )) - .toList(), + ), + if (_deleteTopic) + Positioned( + top: 10.w, + right: 10.w, + child: GestureDetector( + onTap: () { + widget.models.remove(e); + setState(() { }); + }, + child: Material( + child: Icon( + CupertinoIcons.xmark_circle_fill, + size: 30.w, + color: Colors.red.withOpacity(0.60), + ), + ), + ), + ), + ], + ), + ), + ).toList(), ], ); } } + + diff --git a/lib/ui/manager/advice/advice_detail_page.dart b/lib/ui/manager/advice/advice_detail_page.dart index 8634d63f..3abb7dce 100644 --- a/lib/ui/manager/advice/advice_detail_page.dart +++ b/lib/ui/manager/advice/advice_detail_page.dart @@ -91,7 +91,7 @@ class _AdviceDetailPageState extends State { ); } - _buildAdviceContent(AppAdviceContentVos item) { + _buildAdviceContent(AppAdviceFBIContentVos item) { String type = ''; switch (item.createUserType) { case 1: @@ -127,13 +127,14 @@ class _AdviceDetailPageState extends State { children: [ '您的$adviceValue'.text.black.bold.size(38.sp).make(), 30.hb, - _model.appAdviceDetailVo!.appAdviceVo!.content!.text + _model.appAdviceFBIDetailVo!.content! + .text .color(ktextSubColor) .size(28.sp) .make(), 24.hb, DateUtil.formatDate( - _model.appAdviceDetailVo!.appAdviceVo!.date, + _model.appAdviceFBIDetailVo!.date, format: 'yyyy年MM月dd日 HH:mm', ).text.size(24.sp).color(Color(0xFF999999)).make(), ...widget.model!.imgUrls!.isEmpty @@ -154,7 +155,7 @@ class _AdviceDetailPageState extends State { color: Color(0xFFD8D8D8), ) ], - ..._model.appAdviceDetailVo!.appAdviceContentVos! + ..._model.appAdviceFBIContentVos! .map((e) => _buildAdviceContent(e)) .toList(), ], @@ -186,10 +187,10 @@ class _AdviceDetailPageState extends State { header: MaterialHeader(), onRefresh: () async { Response res = await NetUtil().dio!.get( - API.manager.adviceDetail, + SAASAPI.advice.find, queryParameters: {'adviceId': widget.model!.id}, ); - _model = AdviceDetailModel.fromJson(res.data); + _model = AdviceDetailModel.fromJson(res.data['data']); _loading = false; if (mounted) setState(() {}); }, @@ -219,7 +220,7 @@ class _AdviceDetailPageState extends State { child: BottomButton( onPressed: () async { BaseModel baseModel = - await NetUtil().get(API.manager.completeFeedBack, params: { + await NetUtil().get(SAASAPI.advice.complete, params: { "adviceId": widget.model!.id, }); if (baseModel.success) { @@ -229,7 +230,7 @@ class _AdviceDetailPageState extends State { }, child: '完成沟通'.text.bold.make(), ), - ) + ), ], ); } diff --git a/lib/ui/manager/advice/advice_page.dart b/lib/ui/manager/advice/advice_page.dart index bdd5d8e6..a2cd326c 100644 --- a/lib/ui/manager/advice/advice_page.dart +++ b/lib/ui/manager/advice/advice_page.dart @@ -111,7 +111,7 @@ class _AdvicePageState extends State with TickerProviderStateMixin { controller: _tabController, children: List.generate(2, (index) { return BeeListView( - path: API.manager.advice, + path: SAASAPI.advice.list, extraParams: {'adviceType': adviceValue(index)}, controller: _refreshController, convert: (model) => model.rows @@ -168,7 +168,7 @@ class _AdvicePageState extends State with TickerProviderStateMixin { firstChild: BottomButton( onPressed: () async { await NetUtil().post( - API.manager.deleteAdvice, + SAASAPI.advice.delete, params: {'ids': _selectedItems}, showMessage: true, ); diff --git a/lib/ui/manager/advice/new_advice_page.dart b/lib/ui/manager/advice/new_advice_page.dart index 40552b8c..fc88b739 100644 --- a/lib/ui/manager/advice/new_advice_page.dart +++ b/lib/ui/manager/advice/new_advice_page.dart @@ -11,7 +11,6 @@ import 'package:provider/provider.dart'; import 'package:velocity_x/velocity_x.dart'; import 'package:aku_new_community/const/resource.dart'; -import 'package:aku_new_community/constants/api.dart'; import 'package:aku_new_community/constants/app_theme.dart'; import 'package:aku_new_community/constants/saas_api.dart'; import 'package:aku_new_community/provider/app_provider.dart'; @@ -23,6 +22,9 @@ import 'package:aku_new_community/widget/bee_scaffold.dart'; import 'package:aku_new_community/widget/buttons/bottom_button.dart'; import 'package:aku_new_community/widget/picker/grid_image_picker.dart'; +import '../../../provider/user_provider.dart'; +import '../../../widget/others/user_tool.dart'; + class NewAdvicePage extends StatefulWidget { final AdviceType type; final int initType; @@ -97,9 +99,9 @@ class _NewAdvicePageState extends State { Future addAdvice(int type, List files, String content) async { VoidCallback cancel = BotToast.showLoading(); List urls = - await NetUtil().uploadFiles(files, API.upload.uploadAdvice); + await NetUtil().uploadFiles(files,SAASAPI.uploadFile.uploadImg); BaseModel baseModel = await NetUtil().post( - API.manager.addAdvice, + SAASAPI.advice.insert, params: { 'type': type, 'content': content, @@ -127,7 +129,7 @@ class _NewAdvicePageState extends State { @override Widget build(BuildContext context) { - final appProvider = Provider.of(context); + final userProvider = Provider.of(context); return BeeScaffold.white( systemStyle: SystemStyle.yellowBottomBar, title: title, @@ -143,7 +145,8 @@ class _NewAdvicePageState extends State { width: 60.w, ), 40.wb, - '${S.of(context)!.tempPlotName}\n${appProvider.selectedHouse!.roomName}' + '${userProvider.defaultHouse!.addressName}${userProvider.defaultHouse!.communityName}\n' + '${userProvider.defaultHouse!.buildingName}幢-${UserTool.userProvider.defaultHouse!.unitName}单元-${userProvider.defaultHouse!.estateName}室' .text .size(32.sp) .black diff --git a/lib/ui/manager/questionnaire/questionnaire_detail_page.dart b/lib/ui/manager/questionnaire/questionnaire_detail_page.dart index 5411d410..89f7d6ba 100644 --- a/lib/ui/manager/questionnaire/questionnaire_detail_page.dart +++ b/lib/ui/manager/questionnaire/questionnaire_detail_page.dart @@ -14,6 +14,7 @@ import 'package:aku_new_community/utils/network/base_model.dart'; import 'package:aku_new_community/widget/bee_divider.dart'; import 'package:aku_new_community/widget/bee_scaffold.dart'; import 'package:aku_new_community/widget/buttons/bottom_button.dart'; +import 'package:bot_toast/bot_toast.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_easyrefresh/easy_refresh.dart'; @@ -21,9 +22,9 @@ import 'package:get/get.dart'; class QuestionnaireDetailPage extends StatefulWidget { final int? id; - final int? status; + final bool? answered; - QuestionnaireDetailPage({Key? key, this.id, this.status}) : super(key: key); + QuestionnaireDetailPage({Key? key, this.id, this.answered}) : super(key: key); @override _QuestionnaireDetailPageState createState() => @@ -258,12 +259,14 @@ class _QuestionnaireDetailPageState extends State { bottomNavi: BottomButton( child: '确认提交' .text - .color(widget.status != 2 ? ktextSubColor : ktextPrimary) + .color(widget.answered! ? ktextSubColor : ktextPrimary) .size(32.sp) .bold .make(), - onPressed: widget.status != 2 - ? () {} + onPressed: widget.answered != 2 + ? () { + BotToast.showText(text: '该问卷已填写过'); + } : () async { BaseModel baseModel = await ManagerFunc.questionnaireSubmit( widget.id, _submitModels); diff --git a/lib/ui/manager/questionnaire/questionnaire_page.dart b/lib/ui/manager/questionnaire/questionnaire_page.dart index 29d6e5e5..cad4282b 100644 --- a/lib/ui/manager/questionnaire/questionnaire_page.dart +++ b/lib/ui/manager/questionnaire/questionnaire_page.dart @@ -1,5 +1,6 @@ import 'package:aku_new_community/base/base_style.dart'; import 'package:aku_new_community/constants/api.dart'; +import 'package:aku_new_community/constants/new_api.dart'; import 'package:aku_new_community/constants/saas_api.dart'; import 'package:aku_new_community/model/common/img_model.dart'; import 'package:aku_new_community/model/manager/questinnaire_model.dart'; @@ -10,6 +11,7 @@ import 'package:aku_new_community/utils/hive_store.dart'; import 'package:aku_new_community/utils/websocket/tips_dialog.dart'; import 'package:aku_new_community/widget/bee_scaffold.dart'; import 'package:aku_new_community/widget/others/stack_avatar.dart'; +import 'package:bot_toast/bot_toast.dart'; import 'package:common_utils/common_utils.dart'; import 'package:flutter/material.dart'; import 'package:flutter_easyrefresh/easy_refresh.dart'; @@ -40,12 +42,11 @@ class _QuestionnairePageState extends State { String _getButtonText(int? status) { switch (status) { case 1: + return '未开始'; case 2: - return '去投票'; + return '进行中'; case 3: return '已结束'; - case 4: - return '已投票'; default: return ''; } @@ -54,10 +55,14 @@ class _QuestionnairePageState extends State { Widget _buildCard(QuestionnaireModel model) { return GestureDetector( onTap: () { - Get.to(() => QuestionnaireDetailPage( - id: model.id, - status: model.status, - )); + if(model.status==2){ + Get.to(() => QuestionnaireDetailPage( + id: model.id, + answered: model.answered, + )); + }else{ + BotToast.showText(text: '该问卷已结束或未开始'); + } }, child: Container( decoration: BoxDecoration( @@ -142,6 +147,7 @@ class _QuestionnairePageState extends State { if (model.status == 2) { Get.to(() => QuestionnaireDetailPage( id: model.id, + answered: model.answered, )); } }, @@ -171,7 +177,7 @@ class _QuestionnairePageState extends State { return BeeScaffold( title: '问卷调查', body: BeeListView( - path: API.manager.questionnaireList, + path: NEWAPI.questionnaire.list, controller: _easyRefreshController, convert: (model) { return model.rows diff --git a/lib/ui/market/search/good_detail_page.dart b/lib/ui/market/search/good_detail_page.dart index 4b8bd85e..85480236 100644 --- a/lib/ui/market/search/good_detail_page.dart +++ b/lib/ui/market/search/good_detail_page.dart @@ -74,8 +74,9 @@ class _GoodDetailPageState extends State { if (appProvider.defaultAddressModel == null) { return '选择收货地址'; } else { - return (appProvider.defaultAddressModel!.locationName ?? '') + - (appProvider.defaultAddressModel!.addressDetail ?? ''); + return (_goodDetail!.stockStatus == 1) ? '有货' : '无货'; + // (appProvider.defaultAddressModel!.locationName ?? '') + + // (appProvider.defaultAddressModel!.addressDetail ?? ''); } } else { return (_addressModel!.locationName ?? '') + @@ -393,6 +394,7 @@ class _GoodDetailPageState extends State { var result = await Get.to(() => AddressListPage( canBack: true, )); + _addressModel = null; if (result != null) { _addressModel = result; _refreshController.callRefresh(); @@ -418,8 +420,9 @@ class _GoodDetailPageState extends State { width: 430.w, child: Text( receiveAddress, - style: - TextStyle(fontSize: 24.sp, color: ktextPrimary), + style: receiveAddress == '无货' + ? TextStyle(fontSize: 24.sp, color: kDangerColor) + : TextStyle(fontSize: 24.sp, color: ktextPrimary), maxLines: 1, overflow: TextOverflow.ellipsis, ), @@ -433,27 +436,27 @@ class _GoodDetailPageState extends State { 16.wb, ], ), - Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - 120.wb, - 20.hb, - Offstage( - offstage: receiveAddress == '选择收货地址', - child: (_goodDetail!.stockStatus == 1) - ? '有货' - .text - .color(Color(0xFFE52E2E)) - .size(28.sp) - .make() - : '无货' - .text - .color(Color(0xFFE52E2E)) - .size(28.sp) - .make(), - ) - ], - ), + // Row( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // 120.wb, + // 20.hb, + // Offstage( + // offstage: receiveAddress == '选择收货地址', + // child: (_goodDetail!.stockStatus == 1) + // ? '有货' + // .text + // .color(Color(0xFFE52E2E)) + // .size(28.sp) + // .make() + // : '无货' + // .text + // .color(Color(0xFFE52E2E)) + // .size(28.sp) + // .make(), + // ) + // ], + // ), ], ), ), @@ -668,7 +671,7 @@ class _GoodDetailPageState extends State { onTap: () async { var re = await SearchFunc.addGoodsCar(_goodDetail!.id); if (re) { - Get.back(); + BotToast.showText(text: '已添加进购物车'); } }, child: Container( @@ -779,5 +782,4 @@ class _GoodDetailPageState extends State { return count + '折'; } - } diff --git a/lib/ui/market/search/search_func.dart b/lib/ui/market/search/search_func.dart index a2925ed3..6eb48612 100644 --- a/lib/ui/market/search/search_func.dart +++ b/lib/ui/market/search/search_func.dart @@ -79,7 +79,7 @@ class SearchFunc { ///加入购物车 static Future addGoodsCar(int jcookGoodsId) async { BaseModel model = await NetUtil().get(SAASAPI.market.shopCart.insert, - params: {'appGoodsPushId': jcookGoodsId}, showMessage: true); + params: {'appGoodsPushId': jcookGoodsId}, showMessage: false); return model.success; } diff --git a/lib/ui/profile/new_house/certification/certification_success_page.dart b/lib/ui/profile/new_house/certification/certification_success_page.dart index ee1d571c..fb56d9fb 100644 --- a/lib/ui/profile/new_house/certification/certification_success_page.dart +++ b/lib/ui/profile/new_house/certification/certification_success_page.dart @@ -1,3 +1,4 @@ +import 'package:aku_new_community/ui/profile/house/add_house_page.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -30,7 +31,9 @@ class _CertificationSuccessPageState extends State { 34.w.heightBox, '提交成功'.text.size(40.sp).color(Colors.black).bold.make(), 94.w.heightBox, - AddHouseButton(text: '添加房屋', onTap: () {}), + AddHouseButton(text: '添加房屋', onTap: () { + Get.to(() => AddHousePage()); + }), 40.w.heightBox, AddHouseButton( text: '返回首页', diff --git a/lib/ui/profile/new_house/examine_view.dart b/lib/ui/profile/new_house/examine_view.dart index 2c27aca7..fb1dc657 100644 --- a/lib/ui/profile/new_house/examine_view.dart +++ b/lib/ui/profile/new_house/examine_view.dart @@ -54,8 +54,7 @@ class _ExamineViewState extends State { header: MaterialHeader(), footer: MaterialFooter(), onRefresh: () async { - var base = await NetUtil() - .get(SAASAPI.profile.family.myFamilyMember, params: { + var base = await NetUtil().get(SAASAPI.profile.family.myFamilyExamine, params: { 'status': _currentIndex, }); if (base.success) { diff --git a/lib/ui/profile/new_house/member_view.dart b/lib/ui/profile/new_house/member_view.dart index e8d82bdc..1a3e8347 100644 --- a/lib/ui/profile/new_house/member_view.dart +++ b/lib/ui/profile/new_house/member_view.dart @@ -12,6 +12,9 @@ import 'package:flutter_easyrefresh/easy_refresh.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:velocity_x/velocity_x.dart'; +import '../../../model/common/img_model.dart'; +import '../../../widget/bee_avatar_widget.dart'; + class MemberView extends StatefulWidget { const MemberView({Key? key}) : super(key: key); @@ -65,7 +68,7 @@ class _MemberViewState extends State { children: [ Padding( padding: EdgeInsets.symmetric(horizontal: 32.w, vertical: 24.w), - child: '${model.buildingName}${model.unitName}${model.estateName}' + child: '${model.buildingName}栋${model.unitName}单元${model.estateName}' .text .size(32.sp) .color(Colors.black.withOpacity(0.85)) @@ -79,7 +82,7 @@ class _MemberViewState extends State { crossAxisCount: 4, children: [ ...model.members - .map((e) => _avatar(Identify.values[e.identity], e.name)) + .map((e) => _avatar(e.avatarImgList,Identify.values[e.identity], e.name)) .toList() ], shrinkWrap: true, @@ -92,6 +95,7 @@ class _MemberViewState extends State { } Widget _avatar( + List imgModel, Identify identify, String name, ) { @@ -108,8 +112,11 @@ class _MemberViewState extends State { decoration: BoxDecoration( borderRadius: BorderRadius.circular(40.w), border: Border.all(color: kPrimaryColor, width: 4.w)), - child: Assets.newIcon.avatarPlaceholder - .image(width: 80.w, height: 80.w), + child: BeeAvatarWidget( + width: 80.w, + height: 80.w, + imgs: imgModel, + ), ), Positioned( bottom: -20.w, diff --git a/lib/utils/application_utils.dart b/lib/utils/application_utils.dart index 2b21d711..49a56e57 100644 --- a/lib/utils/application_utils.dart +++ b/lib/utils/application_utils.dart @@ -71,8 +71,6 @@ class ApplicationUtil { title: '业委会', imgPath: Assets.newIcon.icYwh.path, onTap: () { - BotToast.showText(text: '此功能暂未上线'); - return; Get.to(() => IndustryCommitteePage()); }), // AppElement('建议咨询', R.ASSETS_ICONS_FUNC_JYZX_PNG, @@ -103,16 +101,12 @@ class ApplicationUtil { title: '投诉表扬', imgPath: Assets.newIcon.icTsby.path, onTap: () { - BotToast.showText(text: '此功能暂未上线'); - return; Get.to(() => AdvicePage(type: AdviceType.COMPLAIN)); }), AppElement( title: '问卷调查', imgPath: Assets.newIcon.icWjdc.path, onTap: () { - BotToast.showText(text: '此功能暂未上线'); - return; Get.to(() => QuestionnairePage()); }), AppElement( diff --git a/lib/widget/others/stack_avatar.dart b/lib/widget/others/stack_avatar.dart index 9058c68b..efb01df8 100644 --- a/lib/widget/others/stack_avatar.dart +++ b/lib/widget/others/stack_avatar.dart @@ -26,6 +26,7 @@ class StackAvatar extends StatelessWidget { decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(22.w + 2.w), + border: Border.all(color: Colors.white,width: 1), // border: Border.all(color: Color(0xFF999999)), ), clipBehavior: Clip.antiAlias,