diff --git a/api/customerServicePlatform/customerServicePlatform.js b/api/customerServicePlatform/customerServicePlatform.js
new file mode 100644
index 0000000..0f20be0
--- /dev/null
+++ b/api/customerServicePlatform/customerServicePlatform.js
@@ -0,0 +1,46 @@
+import { http } from '@/utils/http.js'
+
+const baseURL = "http://39.101.133.168:8828"
+//图片上传
+export const uploadImageApi = (data) => {
+ return http({
+ method: 'POST',
+ url: baseURL +'/hljw/api/aws/upload',
+ data
+ })
+}
+
+//问题回答
+export const getAnswerApi = (data) => {
+ return http({
+ method: 'POST',
+ url: 'http://pbb6edde.natappfree.cc' +'/api/customer/askQuestion',
+ data
+ })
+}
+
+//获取随机5条猜你想问问题
+export const getQuestionApi = (data) => {
+ return http({
+ method: 'GET',
+ url: 'http://pbb6edde.natappfree.cc' +'/api/customer/getQuestion',
+ })
+}
+
+
+//反馈添加
+export const addFeedbackRecordApi = (data) => {
+ return http({
+ method: 'POST',
+ url: baseURL +'/link/third/dcFeedBack/feedback/add',
+ data
+ })
+}
+//反馈历史记录
+export const getFeedbackRecordsApi = (data) => {
+ return http({
+ method: 'POST',
+ url: baseURL+'/link/third/dcFeedBack/feedback/select',
+ data
+ })
+}
\ No newline at end of file
diff --git a/api/home/mySelections.js b/api/home/mySelections.js
new file mode 100644
index 0000000..6801ebc
--- /dev/null
+++ b/api/home/mySelections.js
@@ -0,0 +1,185 @@
+/**
+ * 我的自选股相关API接口封装
+ * 使用utils/http.js中的拦截器封装请求方法
+ */
+
+import { http } from '../../utils/http.js'
+
+/**
+ * 我的自选股API接口类
+ */
+class MySelectionsAPI {
+
+ /**
+ * 判断用户是否存在自选股分组
+ * @param {Function} successCallback - 成功回调函数
+ * @param {Function} failCallback - 失败回调函数
+ * @param {Object} data - 请求参数
+ * @returns {Promise}
+ */
+ static async checkExist(successCallback, failCallback = null, data = {}) {
+ const url = '/api/homePage/userStock/checkExist'
+
+ try {
+ const response = await http({
+ url: url,
+ method: 'POST',
+ data: data
+ })
+
+ console.log('检查用户自选股分组存在性 - 响应:', response)
+ if (successCallback && typeof successCallback === 'function') {
+ successCallback(response)
+ }
+ return response
+ } catch (error) {
+ console.error('检查用户自选股分组存在性 - 失败:', error)
+ if (failCallback && typeof failCallback === 'function') {
+ failCallback(error)
+ }
+ throw error
+ }
+ }
+
+ /**
+ * 查询用户所有自选股分组
+ * @param {Function} successCallback - 成功回调函数
+ * @param {Function} failCallback - 失败回调函数
+ * @param {Object} data - 请求参数
+ * @returns {Promise}
+ */
+ static async getUserStockGroupList(successCallback, failCallback = null, data = {}) {
+ const url = '/api/homePage/userStockGroup/list'
+
+ try {
+ const response = await http({
+ url: url,
+ method: 'POST',
+ data: data
+ })
+
+ console.log('查询用户自选股分组列表 - 响应:', response)
+ if (successCallback && typeof successCallback === 'function') {
+ successCallback(response)
+ }
+ return response
+ } catch (error) {
+ console.error('查询用户自选股分组列表 - 失败:', error)
+ if (failCallback && typeof failCallback === 'function') {
+ failCallback(error)
+ }
+ throw error
+ }
+ }
+
+ /**
+ * 分页查询某一个分组下的所有自选股
+ * @param {Function} successCallback - 成功回调函数
+ * @param {Function} failCallback - 失败回调函数
+ * @param {Object} data - 请求参数 {groupId, pageNum, pageSize, ...}
+ * @returns {Promise}
+ */
+ static async getUserStockList(successCallback, failCallback = null, data = {}) {
+ const url = '/api/homePage/userStock/list'
+
+ // 设置默认分页参数
+ const requestData = {
+ pageNum: 1,
+ pageSize: 20,
+ ...data
+ }
+
+ try {
+ const response = await http({
+ url: url,
+ method: 'POST',
+ data: requestData
+ })
+
+ console.log('分页查询分组自选股 - 响应:', response)
+ if (successCallback && typeof successCallback === 'function') {
+ successCallback(response)
+ }
+ return response
+ } catch (error) {
+ console.error('分页查询分组自选股 - 失败:', error)
+ if (failCallback && typeof failCallback === 'function') {
+ failCallback(error)
+ }
+ throw error
+ }
+ }
+
+ /**
+ * 查询默认自选股
+ * @param {Function} successCallback - 成功回调函数
+ * @param {Function} failCallback - 失败回调函数
+ * @param {Object} data - 请求参数
+ * @returns {Promise}
+ */
+ static async getUserOrDefault(successCallback, failCallback = null, data = {}) {
+ const url = '/api/homePage/userStock/getUserOrDefault'
+
+ try {
+ const response = await http({
+ url: url,
+ method: 'POST',
+ data: data
+ })
+
+ console.log('查询默认自选股 - 响应:', response)
+ if (successCallback && typeof successCallback === 'function') {
+ successCallback(response)
+ }
+ return response
+ } catch (error) {
+ console.error('查询默认自选股 - 失败:', error)
+ if (failCallback && typeof failCallback === 'function') {
+ failCallback(error)
+ }
+ throw error
+ }
+ }
+
+ /**
+ * 游客查询默认自选股
+ * @param {Function} successCallback - 成功回调函数
+ * @param {Function} failCallback - 失败回调函数
+ * @returns {Promise}
+ */
+ static async getDefaultStocks(successCallback, failCallback = null) {
+ const url = '/api/homePage/userStock/getDefaultStocks'
+
+ try {
+ const response = await http({
+ url: url,
+ method: 'POST',
+ data: {}
+ })
+
+ console.log('游客查询默认自选股 - 响应:', response)
+ if (successCallback && typeof successCallback === 'function') {
+ successCallback(response)
+ }
+ return response
+ } catch (error) {
+ console.error('游客查询默认自选股 - 失败:', error)
+ if (failCallback && typeof failCallback === 'function') {
+ failCallback(error)
+ }
+ throw error
+ }
+ }
+}
+
+// 导出API类
+export default MySelectionsAPI
+
+// 也可以导出单个方法供直接使用
+export const {
+ checkExist,
+ getUserStockGroupList,
+ getUserStockList,
+ getUserOrDefault,
+ getDefaultStocks
+} = MySelectionsAPI
\ No newline at end of file
diff --git a/api/marketSituation/marketSituation.js b/api/marketSituation/marketSituation.js
new file mode 100644
index 0000000..9452062
--- /dev/null
+++ b/api/marketSituation/marketSituation.js
@@ -0,0 +1,70 @@
+/** @format */
+
+import { http } from "../../utils/http";
+
+export const getData = () => {
+ return http({
+ method: "GET",
+ url: "/ka",
+ });
+};
+
+/**
+ * 获取全球指数
+ * POST /api/global/getGlobalIndex
+ */
+export const getGlobalIndexAPI = (data) => {
+ return http({
+ method: "POST",
+ url: "/api/global/getGlobalIndex",
+ data,
+ });
+};
+
+/**
+ * 获取地区分组列表
+ * POST /api/global/regionalGroup
+ */
+export const getRegionalGroupAPI = (data) => {
+ return http({
+ method: "POST",
+ url: "/api/global/regionalGroup",
+ data,
+ });
+};
+
+/**
+ * 获取地区详情
+ * POST /api/global/regionalGroupList
+ */
+export const getRegionalGroupListAPI = (data) => {
+ return http({
+ method: "POST",
+ url: "/api/global/regionalGroupList",
+ data,
+ });
+};
+
+/**
+ * 一次性查询所有Tab栏父子结构
+ * POST /api/homework/tab/getAll
+ */
+export const getAllTabsAPI = (data) => {
+ return http({
+ method: "POST",
+ url: "/api/homework/tab/getAll",
+ data,
+ });
+};
+
+/**
+ * 通用市场数据分页查询接口(默认1页20条)
+ * POST /api/market/data/page/query
+ */
+export const queryStockDataAPI = (data) => {
+ return http({
+ method: "POST",
+ url: "/api/market/data/page/query",
+ data,
+ });
+};
diff --git a/api/start/login.js b/api/start/login.js
index aecf0cf..699a30f 100644
--- a/api/start/login.js
+++ b/api/start/login.js
@@ -67,6 +67,36 @@ export const registerApi = (data) => {
})
}
+
+
+/**
+ * 忘记密码校验验证码
+ */
+
+export const verifyCodeApi = (data) => {
+ return http({
+ method: 'POST',
+ url: '/UserLogin/verifyCode',
+ data: data,
+ })
+}
+
+
+
+/**
+ * 忘记密码输入新的密码
+ */
+
+export const forgetApi = (data) => {
+ return http({
+ method: 'POST',
+ url: '/UserLogin/forget',
+ data: data,
+ })
+}
+
+
+
/**
* 修改密码
*
diff --git a/components/FeedbackModal.vue b/components/FeedbackModal.vue
new file mode 100644
index 0000000..a4bc5e4
--- /dev/null
+++ b/components/FeedbackModal.vue
@@ -0,0 +1,196 @@
+
+