diff --git a/niucloud/app/api/controller/apiController/StaticResource.php b/niucloud/app/api/controller/apiController/StaticResource.php new file mode 100644 index 00000000..0f0b763c --- /dev/null +++ b/niucloud/app/api/controller/apiController/StaticResource.php @@ -0,0 +1,118 @@ +param('path', ''); // 资源路径,如:icon-img/home.png + + if (empty($resource_path)) { + return fail('资源路径不能为空'); + } + + // 基础URL配置 - 从配置文件或环境变量读取 + $baseUrl = $request->domain() ?: 'http://localhost:20080'; + + // 构建完整的静态资源URL + $resourceUrl = $baseUrl . '/static/resource/uniapp/' . $resource_path; + + return success([ + 'resource_url' => $resourceUrl, + 'base_url' => $baseUrl . '/static/resource/uniapp/', + 'path' => $resource_path + ]); + } + + /** + * 批量获取静态资源URL + */ + public function getBatchResourceUrls(Request $request) + { + $paths = $request->param('paths', []); // 资源路径数组 + + if (empty($paths) || !is_array($paths)) { + return fail('资源路径数组不能为空'); + } + + // 基础URL配置 + $baseUrl = $request->domain() ?: 'http://localhost:20080'; + $baseResourceUrl = $baseUrl . '/static/resource/uniapp/'; + + $results = []; + foreach ($paths as $path) { + $results[$path] = $baseResourceUrl . $path; + } + + return success([ + 'base_url' => $baseResourceUrl, + 'resources' => $results + ]); + } + + /** + * 获取所有可用的图标资源 + */ + public function getIconList(Request $request) + { + $baseUrl = $request->domain() ?: 'http://localhost:20080'; + $baseResourceUrl = $baseUrl . '/static/resource/uniapp/'; + + // 定义所有可用的图标 + $icons = [ + 'delete.png', + 'ding_wei.png', + 'empty.png', + 'guoqi.png', + 'home-active.png', + 'home.png', + 'kkry.png', + 'liu.png', + 'loading_white.png', + 'notice.png', + 'profile-active.png', + 'profile.png', + 'tou.png', + 'uploadImg.png', + 'used.png', + 'warn.png', + 'weixin.png' + ]; + + $iconUrls = []; + foreach ($icons as $icon) { + $iconUrls['icon-img/' . $icon] = $baseResourceUrl . 'icon-img/' . $icon; + } + + // 添加评分图标 + $iconUrls['rate/none.png'] = $baseResourceUrl . 'rate/none.png'; + + return success([ + 'base_url' => $baseResourceUrl, + 'icons' => $iconUrls, + 'count' => count($iconUrls) + ]); + } +} \ No newline at end of file diff --git a/niucloud/app/api/route/static_resource.php b/niucloud/app/api/route/static_resource.php new file mode 100644 index 00000000..55e51b0a --- /dev/null +++ b/niucloud/app/api/route/static_resource.php @@ -0,0 +1,30 @@ +middleware([ + app\api\middleware\ApiPersonnelCheckToken::class +]); \ No newline at end of file diff --git a/niucloud/app/listener/personnel/Student.php b/niucloud/app/listener/personnel/Student.php index 4e405473..7da20c3d 100644 --- a/niucloud/app/listener/personnel/Student.php +++ b/niucloud/app/listener/personnel/Student.php @@ -59,64 +59,15 @@ class Student } public function studentAdd($order_info){ - $student = new \app\model\student\Student(); $order = new OrderTable(); $cust = new CustomerResources(); $class_resources_rel = new ClassResourcesRel(); $course = new Course(); $studentCourses = new StudentCourses(); - $order_count = $order->where(['resource_id' => $order_info['resource_id']])->count(); - $cust_info = $cust->where(['id' => $order_info['resource_id']])->find(); - //创建学员关系逻辑 - if($order_count <= 1){ - $sex_arr = ['male' => 1, 'female' => 2, 'other' => 0]; - //首次支付创建学员 - $student_id = $student->insertGetId([ - 'name' => $cust_info['name'], - 'gender' => $sex_arr[$cust_info['gender']], - 'age' => $cust_info['age'], - 'campus_id' => $cust_info['campus'], - 'class_id' => $order_info['class_id'], - 'status' => 1, - 'user_id' => $order_info['resource_id'] - ]); - }else{ - $student_id = $student->where(['user_id' => $order_info['resource_id'],'class_id' => $order_info['class_id']])->value('id'); - } - - //学员课程逻辑 - $course_info = $course->where(['id' => $order_info['course_id']])->find(); - $studentCourses->insert([ - 'student_id' => $student_id, - 'course_id' => $order_info['course_id'], - 'total_hours' => $course_info['session_count'], - 'gift_hours' => $course_info['gift_session_count'], - 'start_date' => date("Y-m-d"), - 'end_date' => date("Y-m-d", strtotime("+30 days")), - 'single_session_count' => $course_info['single_session_count'], - 'resource_id'=> $order_info['resource_id'] - ]); - - //班级资源关系逻辑 - $is_rel = $class_resources_rel->where( - ['resource_id' => $order_info['resource_id'],'class_id' => $order_info['class_id']] - )->find(); - if($is_rel){ - $class_resources_rel->where(['id' => $is_rel['id']])->update(['status' => 2]); - }else{ - $class_resources_rel->insert([ - 'class_id' => $order_info['class_id'], - 'resource_id' => $order_info['resource_id'], - 'campus_id' => $cust_info['campus'], - 'source_type' => 'student', - 'join_time' => time(), - 'status' => 1, - 'create_time' => date("Y-m-d H:i:s"), - 'update_time' => date("Y-m-d H:i:s") - ]); - } + $cust_info = $cust->where(['id' => $order_info['resource_id']])->find(); + // 1. 检查课程关联的合同 $contract = new Contract(); $contract_info = $contract ->alias("a") @@ -125,13 +76,60 @@ class Student ->field("a.id,a.contract_template") ->find(); + // 2. 建立合同签订关系(同时设置personnel_id和student_id) + if ($contract_info) { + $contract_sign = new ContractSign(); + $contract_sign->insert([ + 'contract_id' => $contract_info['id'], + 'personnel_id' => $order_info['resource_id'], // 客户资源ID + 'student_id' => $order_info['student_id'], // 学员ID + 'sign_file' => $contract_info['contract_template'], + 'type' => 2 + ]); + } + + // 3. 获取课程信息 + $course_info = $course->where(['id' => $order_info['course_id']])->find(); + + // 4. 查询学员是否有有效的课程安排 + $existing_course = $studentCourses + ->where([ + 'student_id' => $order_info['student_id'], + 'status' => 1 // 假设1表示正常状态 + ]) + // 有效课程条件:总课时+赠送课时 - 已用总课时 - 已用赠送课时 > 0 且 结束时间 > 当前时间 + ->where('(total_hours + gift_hours - use_total_hours - use_gift_hours) > 0') + ->where('end_date > ?', [date('Y-m-d')]) + ->order('id', 'desc') // 按ID降序,取最新的一个 + ->find(); + + // 5. 计算开始时间和结束时间 + if ($existing_course) { + // 如果有有效课程,开始时间 = 最新课程的结束时间 + 1天,结束时间 = 开始时间 + duration天 + $start_date = date("Y-m-d", strtotime($existing_course['end_date'] . " +1 day")); + $end_date = date("Y-m-d", strtotime($start_date . " +" . $course_info['duration'] . " days")); + } else { + // 如果没有有效课程,开始时间 = 当前时间,结束时间 = 当前时间 + duration天 + $start_date = date("Y-m-d"); + $end_date = date("Y-m-d", strtotime("+" . $course_info['duration'] . " days")); + } + + // 6. 插入学员课程记录 + $student_course_id = $studentCourses->insertGetId([ + 'student_id' => $order_info['student_id'], + 'course_id' => $order_info['course_id'], + 'total_hours' => $course_info['session_count'], + 'gift_hours' => $course_info['gift_session_count'], + 'start_date' => $start_date, + 'end_date' => $end_date, + 'single_session_count' => $course_info['single_session_count'], + 'resource_id' => $order_info['resource_id'], + 'status' => 1 // 设置为正常状态 + ]); - $contract_sign = new ContractSign(); - $contract_sign->insert([ - 'contract_id' => $contract_info['id'], - 'personnel_id' => $order_info['resource_id'], - 'sign_file' => $contract_info['contract_template'], - 'type' => 2 + // 7. 更新订单表的course_plan_id + $order->where(['id' => $order_info['id']])->update([ + 'course_plan_id' => $student_course_id ]); } diff --git a/niucloud/app/service/api/apiService/ResourceSharingService.php b/niucloud/app/service/api/apiService/ResourceSharingService.php index ac791073..21094c89 100644 --- a/niucloud/app/service/api/apiService/ResourceSharingService.php +++ b/niucloud/app/service/api/apiService/ResourceSharingService.php @@ -250,11 +250,14 @@ class ResourceSharingService extends BaseApiService } // 过滤已分配的资源(只显示可再分配的资源) + // 注意:这里需要用子查询包装OR条件,避免与其他WHERE条件冲突 $model = $model->when($where['shared_by'] > 0, function ($query) use ($where) { - $query->where('shared_by', $where['shared_by'])->whereOr('user_id', $where['shared_by']); + $query->where(function ($subQuery) use ($where) { + $subQuery->where('shared_by', $where['shared_by'])->whereOr('user_id', $where['shared_by']); + }); }, function ($query) { - $query->where(function ($query) { - $query->where('shared_by', 0)->whereOr('shared_by', null); + $query->where(function ($subQuery) { + $subQuery->where('shared_by', 0)->whereOr('shared_by', null); }); }); diff --git a/niucloud/app/service/api/pay/PayService.php b/niucloud/app/service/api/pay/PayService.php index 2cc7f606..e9b6db80 100644 --- a/niucloud/app/service/api/pay/PayService.php +++ b/niucloud/app/service/api/pay/PayService.php @@ -178,7 +178,8 @@ class PayService extends BaseApiService ); $info = json_decode($decrypted, true); - $order->where(['payment_id' => $info['out_trade_no']])->update(['order_status' => 'paid','payment_time' => date("Y-m-d H:i:s")]); + $order->where(['payment_id' => $info['out_trade_no']]) + ->update(['order_status' => 'paid','payment_time' => date("Y-m-d H:i:s")]); $payModel = new Pay(); $payModel->where(['trade_id' => $order_id])->update([ diff --git a/niucloud/public/static/resource/uniapp/icon-img/boy.png b/niucloud/public/static/resource/uniapp/icon-img/boy.png new file mode 100644 index 00000000..36d4123f Binary files /dev/null and b/niucloud/public/static/resource/uniapp/icon-img/boy.png differ diff --git a/uniapp/static/icon-img/delete.png b/niucloud/public/static/resource/uniapp/icon-img/delete.png similarity index 100% rename from uniapp/static/icon-img/delete.png rename to niucloud/public/static/resource/uniapp/icon-img/delete.png diff --git a/uniapp/static/icon-img/ding_wei.png b/niucloud/public/static/resource/uniapp/icon-img/ding_wei.png similarity index 100% rename from uniapp/static/icon-img/ding_wei.png rename to niucloud/public/static/resource/uniapp/icon-img/ding_wei.png diff --git a/uniapp/static/icon-img/empty.png b/niucloud/public/static/resource/uniapp/icon-img/empty.png similarity index 100% rename from uniapp/static/icon-img/empty.png rename to niucloud/public/static/resource/uniapp/icon-img/empty.png diff --git a/niucloud/public/static/resource/uniapp/icon-img/girl.png b/niucloud/public/static/resource/uniapp/icon-img/girl.png new file mode 100644 index 00000000..00d6e5cc Binary files /dev/null and b/niucloud/public/static/resource/uniapp/icon-img/girl.png differ diff --git a/uniapp/static/icon-img/guoqi.png b/niucloud/public/static/resource/uniapp/icon-img/guoqi.png similarity index 100% rename from uniapp/static/icon-img/guoqi.png rename to niucloud/public/static/resource/uniapp/icon-img/guoqi.png diff --git a/niucloud/public/static/resource/uniapp/icon-img/home-active.png b/niucloud/public/static/resource/uniapp/icon-img/home-active.png new file mode 100644 index 00000000..64e2d136 Binary files /dev/null and b/niucloud/public/static/resource/uniapp/icon-img/home-active.png differ diff --git a/niucloud/public/static/resource/uniapp/icon-img/home.png b/niucloud/public/static/resource/uniapp/icon-img/home.png new file mode 100644 index 00000000..a24a7e57 Binary files /dev/null and b/niucloud/public/static/resource/uniapp/icon-img/home.png differ diff --git a/uniapp/static/icon-img/kkry.png b/niucloud/public/static/resource/uniapp/icon-img/kkry.png similarity index 100% rename from uniapp/static/icon-img/kkry.png rename to niucloud/public/static/resource/uniapp/icon-img/kkry.png diff --git a/uniapp/static/icon-img/liu.png b/niucloud/public/static/resource/uniapp/icon-img/liu.png similarity index 100% rename from uniapp/static/icon-img/liu.png rename to niucloud/public/static/resource/uniapp/icon-img/liu.png diff --git a/uniapp/static/icon-img/loading_white.png b/niucloud/public/static/resource/uniapp/icon-img/loading_white.png similarity index 100% rename from uniapp/static/icon-img/loading_white.png rename to niucloud/public/static/resource/uniapp/icon-img/loading_white.png diff --git a/uniapp/static/icon-img/notice.png b/niucloud/public/static/resource/uniapp/icon-img/notice.png similarity index 100% rename from uniapp/static/icon-img/notice.png rename to niucloud/public/static/resource/uniapp/icon-img/notice.png diff --git a/niucloud/public/static/resource/uniapp/icon-img/profile-active.png b/niucloud/public/static/resource/uniapp/icon-img/profile-active.png new file mode 100644 index 00000000..0a9915f7 Binary files /dev/null and b/niucloud/public/static/resource/uniapp/icon-img/profile-active.png differ diff --git a/niucloud/public/static/resource/uniapp/icon-img/profile.png b/niucloud/public/static/resource/uniapp/icon-img/profile.png new file mode 100644 index 00000000..bbd5a71b Binary files /dev/null and b/niucloud/public/static/resource/uniapp/icon-img/profile.png differ diff --git a/uniapp/static/icon-img/tou.png b/niucloud/public/static/resource/uniapp/icon-img/tou.png similarity index 100% rename from uniapp/static/icon-img/tou.png rename to niucloud/public/static/resource/uniapp/icon-img/tou.png diff --git a/uniapp/static/icon-img/uploadImg.png b/niucloud/public/static/resource/uniapp/icon-img/uploadImg.png similarity index 100% rename from uniapp/static/icon-img/uploadImg.png rename to niucloud/public/static/resource/uniapp/icon-img/uploadImg.png diff --git a/uniapp/static/icon-img/used.png b/niucloud/public/static/resource/uniapp/icon-img/used.png similarity index 100% rename from uniapp/static/icon-img/used.png rename to niucloud/public/static/resource/uniapp/icon-img/used.png diff --git a/uniapp/static/icon-img/warn.png b/niucloud/public/static/resource/uniapp/icon-img/warn.png similarity index 100% rename from uniapp/static/icon-img/warn.png rename to niucloud/public/static/resource/uniapp/icon-img/warn.png diff --git a/uniapp/static/icon-img/weixin.png b/niucloud/public/static/resource/uniapp/icon-img/weixin.png similarity index 100% rename from uniapp/static/icon-img/weixin.png rename to niucloud/public/static/resource/uniapp/icon-img/weixin.png diff --git a/niucloud/public/static/resource/uniapp/rate/none.png b/niucloud/public/static/resource/uniapp/rate/none.png new file mode 100644 index 00000000..4b8c50ea Binary files /dev/null and b/niucloud/public/static/resource/uniapp/rate/none.png differ diff --git a/uniapp/App.vue b/uniapp/App.vue index 4db626b0..a4d5a79f 100644 --- a/uniapp/App.vue +++ b/uniapp/App.vue @@ -42,6 +42,7 @@ \ No newline at end of file diff --git a/uniapp/common/util.js b/uniapp/common/util.js index 27497607..d6b12664 100644 --- a/uniapp/common/util.js +++ b/uniapp/common/util.js @@ -117,6 +117,13 @@ function img(img_path, params) { arr.push(suffix); img_path = arr.join("."); } + + // 处理静态资源路径的迁移 + if (img_path.startsWith('/static/')) { + // 将旧的 /static/ 路径转换为新的后端静态资源路径 + img_path = img_path.replace('/static/', 'static/resource/uniapp/'); + } + if (img_path.indexOf("http://") == -1 && img_path.indexOf("https://") == -1) { path = img_domian + "/" + img_path; } else { diff --git a/uniapp/components/schedule/ScheduleDetail.vue b/uniapp/components/schedule/ScheduleDetail.vue index 80bae2b5..5ab8bc30 100644 --- a/uniapp/components/schedule/ScheduleDetail.vue +++ b/uniapp/components/schedule/ScheduleDetail.vue @@ -181,7 +181,7 @@ - + {{ selectedStudent.name }} 当前状态:{{ selectedStudent.status_text }} diff --git a/uniapp/components/student-info-card/student-info-card.vue b/uniapp/components/student-info-card/student-info-card.vue index 9852cba3..dafb3147 100644 --- a/uniapp/components/student-info-card/student-info-card.vue +++ b/uniapp/components/student-info-card/student-info-card.vue @@ -23,13 +23,10 @@ - - {{ student.actionsExpanded ? '▲' : '▼' }} - - + 生日: {{ student.birthday || '' }} @@ -54,15 +51,6 @@ 课程到访情况: {{ student.course_visit_status || '' }} - - - 紧急联系人: - {{ student.emergency_contact }} - - - 联系电话: - {{ student.contact_phone }} - diff --git a/uniapp/pages.json b/uniapp/pages.json index 8233762f..dd2c0491 100644 --- a/uniapp/pages.json +++ b/uniapp/pages.json @@ -612,7 +612,7 @@ }, "tabBar": { "color": "#7A7E83", - "selectedColor": "#3cc51f", + "selectedColor": "#29d3b4", "borderStyle": "black", "backgroundColor": "#1a1a1a", "list": [ diff --git a/uniapp/pages/coach/home/index.vue b/uniapp/pages/coach/home/index.vue index b67f17d0..45cb70bb 100644 --- a/uniapp/pages/coach/home/index.vue +++ b/uniapp/pages/coach/home/index.vue @@ -64,7 +64,7 @@ - + 暂无课程数据 @@ -104,7 +104,7 @@ - + 暂无作业数据 @@ -132,7 +132,7 @@ - + 暂无服务数据 diff --git a/uniapp/pages/coach/my/due_soon.vue b/uniapp/pages/coach/my/due_soon.vue index 730e84c7..142c6a56 100644 --- a/uniapp/pages/coach/my/due_soon.vue +++ b/uniapp/pages/coach/my/due_soon.vue @@ -14,7 +14,7 @@ - + 即将到期 diff --git a/uniapp/pages/coach/schedule/sign_in.vue b/uniapp/pages/coach/schedule/sign_in.vue index 8a3c3640..91b1b1e1 100644 --- a/uniapp/pages/coach/schedule/sign_in.vue +++ b/uniapp/pages/coach/schedule/sign_in.vue @@ -35,7 +35,7 @@ - + 暂无学员数据 @@ -43,7 +43,7 @@ - + diff --git a/uniapp/pages/coach/student/student_list.vue b/uniapp/pages/coach/student/student_list.vue index 45bbb1b2..5b62fdb4 100644 --- a/uniapp/pages/coach/student/student_list.vue +++ b/uniapp/pages/coach/student/student_list.vue @@ -6,14 +6,14 @@ - + 暂无学员数据 - + {{item.name}} diff --git a/uniapp/pages/common/home/index.vue b/uniapp/pages/common/home/index.vue index 5a9c90d3..ce62375d 100644 --- a/uniapp/pages/common/home/index.vue +++ b/uniapp/pages/common/home/index.vue @@ -11,7 +11,7 @@ + + + + + {{ action.icon }} + + {{ action.text }} + + + 👤 diff --git a/uniapp/pages/market/clue/index.vue b/uniapp/pages/market/clue/index.vue index 8fd50481..d91f1c48 100644 --- a/uniapp/pages/market/clue/index.vue +++ b/uniapp/pages/market/clue/index.vue @@ -343,19 +343,12 @@ - - \ No newline at end of file diff --git a/uniapp/static/icon-img/home-active.png b/uniapp/static/icon-img/home-active.png index a954f74e..371844b1 100644 Binary files a/uniapp/static/icon-img/home-active.png and b/uniapp/static/icon-img/home-active.png differ diff --git a/uniapp/static/icon-img/home.png b/uniapp/static/icon-img/home.png index a954f74e..a24a7e57 100644 Binary files a/uniapp/static/icon-img/home.png and b/uniapp/static/icon-img/home.png differ diff --git a/uniapp/static/icon-img/profile-active.png b/uniapp/static/icon-img/profile-active.png index a954f74e..365a1d1b 100644 Binary files a/uniapp/static/icon-img/profile-active.png and b/uniapp/static/icon-img/profile-active.png differ diff --git a/uniapp/static/icon-img/profile.png b/uniapp/static/icon-img/profile.png index a954f74e..bbd5a71b 100644 Binary files a/uniapp/static/icon-img/profile.png and b/uniapp/static/icon-img/profile.png differ diff --git a/uniapp/utils/staticResource.js b/uniapp/utils/staticResource.js new file mode 100644 index 00000000..9272bdd2 --- /dev/null +++ b/uniapp/utils/staticResource.js @@ -0,0 +1,124 @@ +/** + * 静态资源URL工具类 + * 用于获取后端提供的静态资源URL + */ + +// 配置基础URL +const config = { + // 后端API基础URL,从环境变量或配置文件读取 + baseUrl: process.env.NODE_ENV === 'development' ? 'http://localhost:20080' : 'https://your-domain.com', + // 静态资源基础路径 + staticBasePath: '/static/resource/uniapp/' +} + +/** + * 获取静态资源的完整URL + * @param {string} resourcePath - 资源相对路径,如:'icon-img/home.png' + * @returns {string} 完整的资源URL + */ +export function getStaticResourceUrl(resourcePath) { + if (!resourcePath) { + console.warn('staticResource: resourcePath is empty') + return '' + } + + // 移除开头的 '/' 或 'static/' + const cleanPath = resourcePath.replace(/^(\/|static\/)?/, '') + + return config.baseUrl + config.staticBasePath + cleanPath +} + +/** + * 批量获取静态资源URL + * @param {Array} resourcePaths - 资源路径数组 + * @returns {Object} 路径到URL的映射对象 + */ +export function getBatchStaticResourceUrls(resourcePaths) { + if (!Array.isArray(resourcePaths)) { + console.warn('staticResource: resourcePaths must be an array') + return {} + } + + const results = {} + resourcePaths.forEach(path => { + results[path] = getStaticResourceUrl(path) + }) + + return results +} + +/** + * 获取图标资源URL的便捷方法 + * @param {string} iconName - 图标文件名,如:'home.png' + * @returns {string} 图标URL + */ +export function getIconUrl(iconName) { + return getStaticResourceUrl(`icon-img/${iconName}`) +} + +/** + * 获取评分图标URL + * @param {string} rateName - 评分图标名,如:'none.png' + * @returns {string} 评分图标URL + */ +export function getRateIconUrl(rateName) { + return getStaticResourceUrl(`rate/${rateName}`) +} + +/** + * 预定义的常用图标URL + */ +export const COMMON_ICONS = { + // 导航图标 + HOME: () => getIconUrl('home.png'), + HOME_ACTIVE: () => getIconUrl('home-active.png'), + PROFILE: () => getIconUrl('profile.png'), + PROFILE_ACTIVE: () => getIconUrl('profile-active.png'), + + // 功能图标 + EMPTY: () => getIconUrl('empty.png'), + DELETE: () => getIconUrl('delete.png'), + LOCATION: () => getIconUrl('ding_wei.png'), + NOTICE: () => getIconUrl('notice.png'), + WARNING: () => getIconUrl('warn.png'), + LOADING: () => getIconUrl('loading_white.png'), + + // 用户相关 + AVATAR: () => getIconUrl('tou.png'), + UPLOAD: () => getIconUrl('uploadImg.png'), + + // 其他 + EXPIRED: () => getIconUrl('guoqi.png'), + USED: () => getIconUrl('used.png'), + WECHAT: () => getIconUrl('weixin.png'), + + // 评分 + RATE_NONE: () => getRateIconUrl('none.png') +} + +/** + * 更新配置 + * @param {Object} newConfig - 新的配置对象 + */ +export function updateConfig(newConfig) { + Object.assign(config, newConfig) +} + +/** + * 获取当前配置 + * @returns {Object} 当前配置 + */ +export function getConfig() { + return { ...config } +} + +// 默认导出主要函数 +export default { + getStaticResourceUrl, + getBatchStaticResourceUrls, + getIconUrl, + getRateIconUrl, + COMMON_ICONS, + updateConfig, + getConfig +} \ No newline at end of file