diff --git a/.hbuilderx/launch.json b/.hbuilderx/launch.json
index 15db785..c4f1072 100644
--- a/.hbuilderx/launch.json
+++ b/.hbuilderx/launch.json
@@ -2,8 +2,11 @@
"version" : "1.0",
"configurations" : [
{
+ "customPlaygroundType" : "device",
"playground" : "standard",
- "type" : "uni-app:app-ios"
+ "type" : "uni-app:app-android"
+ // "playground" : "standard",
+ // "type" : "uni-app:app-ios"
}
]
}
diff --git a/api/deepMate/deepMate.js b/api/deepMate/deepMate.js
index 1f07d1f..3adea61 100644
--- a/api/deepMate/deepMate.js
+++ b/api/deepMate/deepMate.js
@@ -20,7 +20,7 @@ export const getData = () => {
export const postIntent = (data) => {
return http({
method: 'POST',
- url: '/testApi/api/deepMate/dmFirst',
+ url: '/api/deepMate/dmFirst',
data
})
}
@@ -47,14 +47,22 @@ export const postStock = (data) => {
export const postHistory = (data) => {
return http({
method: 'POST',
- url: '/history',
+ url: '/api/deepMate/dmList',
data
})
}
/**
- *
+ * 历史记录详情
*/
+export const postHistoryDetail = (data) => {
+ return http({
+ method: 'POST',
+ url: '/api/deepMate/clickRecord',
+ data
+ })
+}
+
diff --git a/api/tcpConnection.js b/api/tcpConnection.js
new file mode 100644
index 0000000..6dcc539
--- /dev/null
+++ b/api/tcpConnection.js
@@ -0,0 +1,223 @@
+/**
+ * TCP连接工具类
+ * 用于处理TCP连接、发送消息和断开连接
+ */
+
+// 引用TCP插件
+const TCPSocket = uni.requireNativePlugin('Aimer-TCPPlugin');
+
+// TCP连接配置
+const TCP_CONFIG = {
+ ip: '192.168.1.9',
+ port: '8080',
+ channel: '1', // 可选 1~20
+ charsetname: 'UTF-8' // 默认UTF-8,可选GBK
+};
+
+/**
+ * TCP连接管理类
+ */
+class TCPConnection {
+ constructor() {
+ this.isConnected = false;
+ this.connectionCallbacks = [];
+ this.messageCallbacks = [];
+ }
+
+ /**
+ * TCP初始化连接
+ * @param {Object} config - 连接配置 {ip, port, channel, charsetname}
+ * @param {Function} callback - 连接状态回调函数
+ */
+ connect(config = {}, callback = null) {
+ const connectionConfig = {
+ channel: config.channel || TCP_CONFIG.channel,
+ ip: config.ip || TCP_CONFIG.ip,
+ port: config.port || TCP_CONFIG.port
+ };
+
+ // 如果指定了字符集,添加到配置中
+ if (config.charsetname || TCP_CONFIG.charsetname) {
+ connectionConfig.charsetname = config.charsetname || TCP_CONFIG.charsetname;
+ }
+
+ TCPSocket.connect(
+ connectionConfig,
+ result => {
+ /**
+ * status : 0 连接成功
+ * status : 1 断开连接
+ * receivedMsg : 服务器返回字符串(普通的字符串交互)
+ * receivedHexMsg : 服务器返回字节数组(单片机、智能家居等硬件数据交互)
+ */
+ if (result.status == '0') {
+ // TCP连接成功
+ this.isConnected = true;
+ console.log('TCP连接成功');
+ this._notifyConnectionCallbacks('connected', result);
+ } else if (result.status == '1') {
+ // TCP断开连接
+ this.isConnected = false;
+ console.log('TCP断开连接');
+ this._notifyConnectionCallbacks('disconnected', result);
+ }
+
+ if (result.receivedMsg) {
+ // 服务器返回字符串
+ console.log('收到字符串消息:', result.receivedMsg);
+ this._notifyMessageCallbacks('string', result.receivedMsg);
+ }
+
+ // if (result.receivedHexMsg) {
+ // // 硬件服务器返回16进制数据
+ // console.log('收到16进制消息:', result.receivedHexMsg);
+ // let msg = result.receivedHexMsg;
+ // let sum = msg.length / 2;
+ // let arr = [];
+ // for (let k = 0; k < sum; k++) {
+ // let i = msg.substring(k * 2, k * 2 + 2);
+ // arr.push(i);
+ // }
+ // console.log('解析后的16进制数组:', arr);
+ // this._notifyMessageCallbacks('hex', result.receivedHexMsg, arr);
+ // }
+
+ // 执行回调函数
+ if (callback && typeof callback === 'function') {
+ callback(result);
+ }
+ }
+ );
+ }
+
+ /**
+ * TCP发送消息(普通的字符串交互)
+ * @param {String|Object} message - 要发送的消息,如果是对象会自动转换为JSON字符串
+ * @param {Object} config - 发送配置 {channel, charsetname}
+ */
+ send(message, config = {}) {
+ if (!this.isConnected) {
+ console.warn('TCP未连接,无法发送消息');
+ return false;
+ }
+
+ // 如果message是对象,转换为JSON字符串
+ let messageStr = message;
+ if (typeof message === 'object') {
+ messageStr = JSON.stringify(message) + '\n';
+ }
+
+ const sendConfig = {
+ channel: config.channel || '1', // 注意:channel应该是字符串
+ message: messageStr
+ };
+
+ // 如果指定了字符编码,添加到配置中
+ if (config.charsetname) {
+ sendConfig.charsetname = config.charsetname;
+ }
+
+ TCPSocket.send(sendConfig);
+ console.log('js成功发送TCP消息:', messageStr);
+ return true;
+ }
+
+ /**
+ * TCP断开连接
+ * @param {Object} config - 断开配置 {channel}
+ */
+ disconnect(config = {}) {
+ const disconnectConfig = {
+ channel: config.channel || TCP_CONFIG.channel
+ };
+
+ TCPSocket.disconnect(disconnectConfig);
+ this.isConnected = false;
+ console.log('TCP连接已断开', disconnectConfig);
+ }
+
+ /**
+ * 添加连接状态监听器
+ * @param {Function} callback - 回调函数 (status, result) => {}
+ */
+ onConnectionChange(callback) {
+ if (typeof callback === 'function') {
+ this.connectionCallbacks.push(callback);
+ }
+ }
+
+ /**
+ * 添加消息监听器
+ * @param {Function} callback - 回调函数 (type, message, parsedArray) => {}
+ */
+ onMessage(callback) {
+ if (typeof callback === 'function') {
+ this.messageCallbacks.push(callback);
+ }
+ }
+
+ /**
+ * 移除连接状态监听器
+ * @param {Function} callback - 要移除的回调函数
+ */
+ removeConnectionListener(callback) {
+ const index = this.connectionCallbacks.indexOf(callback);
+ if (index > -1) {
+ this.connectionCallbacks.splice(index, 1);
+ }
+ }
+
+ /**
+ * 移除消息监听器
+ * @param {Function} callback - 要移除的回调函数
+ */
+ removeMessageListener(callback) {
+ const index = this.messageCallbacks.indexOf(callback);
+ if (index > -1) {
+ this.messageCallbacks.splice(index, 1);
+ }
+ }
+
+ /**
+ * 获取连接状态
+ * @returns {Boolean} 连接状态
+ */
+ getConnectionStatus() {
+ return this.isConnected;
+ }
+
+ /**
+ * 通知连接状态回调
+ * @private
+ */
+ _notifyConnectionCallbacks(status, result) {
+ this.connectionCallbacks.forEach(callback => {
+ try {
+ callback(status, result);
+ } catch (error) {
+ console.error('连接状态回调执行错误:', error);
+ }
+ });
+ }
+
+ /**
+ * 通知消息回调
+ * @private
+ */
+ _notifyMessageCallbacks(type, message, parsedArray = null) {
+ this.messageCallbacks.forEach(callback => {
+ try {
+ callback(type, message, parsedArray);
+ } catch (error) {
+ console.error('消息回调执行错误:', error);
+ }
+ });
+ }
+}
+
+// 创建TCP连接实例
+const tcpConnection = new TCPConnection();
+
+// 导出TCP连接实例和类
+export default tcpConnection;
+export { TCPConnection, TCP_CONFIG };
\ No newline at end of file
diff --git a/common/canvasMethod.js b/common/canvasMethod.js
new file mode 100644
index 0000000..b46cbea
--- /dev/null
+++ b/common/canvasMethod.js
@@ -0,0 +1,392 @@
+/**
+ * 功能:Canvas绘制方法。
+ * 作者:洪锡林
+ * 时间:2025年10月25日
+ *
+ * @format
+ */
+
+import { utils } from "./util.js";
+export const HCharts = {
+ // 清除画布
+ clearCanvas(ctx, width, height) {
+ ctx.clearRect(0, 0, width, height);
+ ctx.setFillStyle("#ffffff");
+ ctx.fillRect(0, 0, width, height);
+ },
+ // 设置画布颜色
+ setCanvasColor(ctx, width, height, color) {
+ ctx.clearRect(0, 0, width, height);
+ ctx.setFillStyle(color);
+ ctx.fillRect(0, 0, width, height);
+ },
+ // 绘制文本工具函数
+ drawText(ctx, text, x, y, fontSize = 12, color = "#333", align = "left") {
+ ctx.setFontSize(fontSize);
+ ctx.setFillStyle(color);
+ ctx.setTextAlign(align);
+ ctx.fillText(text, x, y);
+ },
+ /**
+ * 功能:绘制网格系统。
+ * 作者:洪锡林
+ * 时间:2025年10月25日
+ *
+ * grid:[{
+ * top:顶部距离
+ * bottom:底部距离
+ * left:左侧距离
+ * right:右侧距离
+ * lineColor:网格线颜色
+ * lineWidth:网格线宽度
+ * horizontalLineNum:水平网格线数量
+ * verticalLineNum:垂直网格线数量
+ * label:{
+ * fontSize:字体大小
+ * color:字体颜色
+ * onlyTwo:是否只有两个标签
+ * text:[{
+ * value:值标签
+ * ratio:比例标签
+ * },{
+ * value:值标签
+ * ratio:比例标签
+ * },...]
+ * },...]
+ */
+ // 绘制网格系统
+ drawGrid(ctx, width, height, grid, openTime, closeTime) {
+ // 测试数据
+ // const preClosePrice = prevClosePrice;
+ for (let i = 0; i < grid.length; ++i) {
+ const top = grid[i].top;
+ const bottom = grid[i].bottom;
+ const left = grid[i].left;
+ const right = grid[i].right;
+ const lineColor = grid[i].lineColor;
+ const lineWidth = grid[i].lineWidth;
+ const horizontalLineNum = grid[i].horizontalLineNum - 1;
+ const verticalLineNum = grid[i].verticalLineNum - 1;
+ let label;
+ if (grid[i].label) {
+ label = grid[i].label;
+ }
+ ctx.setStrokeStyle(lineColor);
+ ctx.setLineWidth(lineWidth);
+
+ // 画图底的开盘收盘时间
+ if (i == 0 && openTime && closeTime) {
+ HCharts.drawText(ctx, openTime, 6, height - bottom + 12, 14, "#686868", "left");
+ HCharts.drawText(ctx, closeTime, width - 6, height - bottom + 12, 14, "#686868", "right");
+ }
+ // 绘制水平网格线
+ for (let j = 0; j <= horizontalLineNum; j++) {
+ const y = top + (j * (height - bottom - top)) / horizontalLineNum;
+ ctx.beginPath();
+ if (label.lineStyle[j] == "dash") {
+ ctx.setLineDash([5, 5]);
+ }
+ ctx.moveTo(left, y);
+ ctx.lineTo(width - right, y);
+ ctx.stroke();
+ ctx.setLineDash([]);
+ }
+ // 绘制垂直网格线
+ for (let i = 0; i <= verticalLineNum; i++) {
+ const x = ((width - left - right) * i) / verticalLineNum;
+ ctx.beginPath();
+ ctx.moveTo(x + left, top);
+ ctx.lineTo(x + left, height - bottom);
+ ctx.stroke();
+ }
+ }
+ },
+ // 绘制价格标签
+ drawAxisLabels(ctx, width, height, grid) {
+ for (let i = 0; i < grid.length; ++i) {
+ const top = grid[i].top;
+ const bottom = grid[i].bottom;
+ const left = grid[i].left;
+ const right = grid[i].right;
+ const horizontalLineNum = grid[i].horizontalLineNum - 1;
+ let label;
+ if (grid[i].label) {
+ label = grid[i].label;
+ }
+ // 绘制水平网格线
+ for (let j = 0; j <= horizontalLineNum; j++) {
+ const y = top + (j * (height - bottom - top)) / horizontalLineNum;
+ // 价格标签
+ if (label) {
+ let valueXText = left + 1;
+ let ratioXText = width - right - 1;
+ let yText = y + 10;
+ if (j == horizontalLineNum) {
+ yText = y - 1;
+ }
+ let valueAlign = "left";
+ let ratioAlign = "right";
+ let fontSize = label.fontSize;
+ let textColor = label.color[j];
+ if (label.onlyTwo) {
+ if (j == 0) {
+ HCharts.drawText(ctx, label.text[0].value, valueXText, yText, fontSize, label.color[0], valueAlign);
+ } else if (j == horizontalLineNum) {
+ HCharts.drawText(ctx, label.text[1].value, valueXText, yText, fontSize, label.color[1], valueAlign);
+ }
+ } else {
+ HCharts.drawText(ctx, label.text[j].value, valueXText, yText, fontSize, textColor, valueAlign);
+ }
+
+ if (typeof label.text[j]?.ratio !== "undefined") {
+ HCharts.drawText(ctx, label.text[j].ratio, ratioXText, yText, fontSize, textColor, ratioAlign);
+ }
+ }
+ }
+ }
+ },
+ // 绘制价格曲线
+ drawPriceLine(ctx, width, height, data, grid, priceRange) {
+ if (!data.length) return;
+ // 上下边距1
+ const top = grid[0].top;
+ const bottom = grid[0].bottom;
+ const left = grid[0].left;
+ const right = grid[0].right;
+ const pointLen = 240;
+ const priceDiff = priceRange.max - priceRange.min;
+ // 绘制价格曲线
+ ctx.setStrokeStyle("#000");
+ ctx.setLineWidth(1);
+ ctx.beginPath();
+
+ data.forEach((item, index) => {
+ const x = left + (index * (width - left - right)) / pointLen;
+ const y = top + (height - top - bottom) * (1 - (item.price - priceRange.min) / priceDiff);
+ if (index === 0) {
+ ctx.moveTo(x, y);
+ } else {
+ // 使用贝塞尔曲线平滑连接
+ const prevPoint = data[index - 1];
+ const prevX = left + ((index - 1) * (width - left - right)) / pointLen;
+ const prevY = top + (height - top + -bottom) * (1 - (prevPoint.price - priceRange.min) / priceDiff);
+ const cp1x = (prevX + x) / 2;
+ const cp1y = prevY;
+ const cp2x = (prevX + x) / 2;
+ const cp2y = y;
+ ctx.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);
+ }
+ });
+ ctx.stroke();
+ // 绘制渐变背景
+ HCharts.drawGradientBackground(ctx, width, height, data, grid, priceRange);
+ },
+
+ // 绘制渐变背景
+ drawGradientBackground(ctx, width, height, data, grid, priceRange) {
+ // 上下边距1
+ const top = grid[0].top;
+ const bottom = grid[0].bottom;
+ const left = grid[0].left;
+ const right = grid[0].right;
+ const pointLen = 240;
+ const priceDiff = priceRange.max - priceRange.min;
+
+ const gradient = ctx.createLinearGradient(0, left, 0, height - top);
+ gradient.addColorStop(0, "rgba(0, 0, 0, 0.3)");
+ gradient.addColorStop(1, "rgba(0, 0, 0, 0.05)");
+
+ ctx.beginPath();
+
+ // 绘制价格曲线路径
+ data.forEach((item, index) => {
+ const x = left + (index * (width - left - right)) / pointLen;
+ const y = top + (height - top - bottom) * (1 - (item.price - priceRange.min) / priceDiff);
+
+ if (index === 0) {
+ ctx.moveTo(x, y);
+ } else {
+ const prevPoint = data[index - 1];
+ const prevX = left + ((index - 1) * (width - left - right)) / pointLen;
+ const prevY = top + (height - top - bottom) * (1 - (prevPoint.price - priceRange.min) / priceDiff);
+
+ const cp1x = (prevX + x) / 2;
+ const cp1y = prevY;
+ const cp2x = (prevX + x) / 2;
+ const cp2y = y;
+
+ ctx.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);
+ }
+ });
+
+ // 闭合路径
+ const lastX = left + ((data.length - 1) * (width - left - right)) / pointLen;
+ ctx.lineTo(lastX, height - bottom);
+ ctx.lineTo(left, height - bottom);
+ ctx.closePath();
+
+ ctx.setFillStyle(gradient);
+ ctx.fill();
+ },
+ // 绘制成交量
+ drawVolume(ctx, width, height, data, index, pointLen, grid, volumeRange, offset) {
+ if (!data.length) return;
+
+ const top = grid[index - 1].top;
+ const bottom = grid[index - 1].bottom;
+ const left = grid[index - 1].left;
+ const right = grid[index - 1].right;
+
+ data.forEach((item, index) => {
+ const x = offset + left + (index * (width - left - right)) / pointLen;
+ const barWidth = (width - left - right) / pointLen - 0.5;
+ const barHeight = (item.volume / volumeRange.max) * (height - bottom - top);
+ // 根据涨跌设置颜色
+ const isRise = index === 0 || item.price >= data[index - 1].price || item.close >= data[index - 1].close;
+ ctx.setFillStyle(isRise ? "green" : "red");
+
+ ctx.fillRect(x - barWidth / 2, height - bottom - barHeight, barWidth, barHeight);
+ });
+ },
+ // 字符宽度近似计算(避免使用 measureText)
+ getApproximateTextWidth(text, fontSize = 10) {
+ // 中文字符约等于 fontSize,英文字符约等于 fontSize * 0.6
+ let width = 0;
+ for (let char of text) {
+ // 判断是否为中文字符
+ if (char.match(/[\u4e00-\u9fa5]/)) {
+ width += fontSize;
+ } else {
+ width += fontSize * 0.6;
+ }
+ }
+ return width;
+ },
+ // 绘制顶部价格显示
+ drawTopPriceDisplay(ctx, grid, text) {
+ for (let i = 0; i < text.length; i++) {
+ let x = grid[i].left;
+ let y = grid[i].top - 4;
+ for (let j = 0; j < text[i].length; j++) {
+ ctx.setFillStyle(text[i][j].color);
+ ctx.setFontSize(10);
+ ctx.setTextAlign("left");
+ ctx.fillText(text[i][j].name + ":" + text[i][j].value, x, y);
+ x += HCharts.getApproximateTextWidth(text[i][j].name + ":" + text[i][j].value) + 5;
+ }
+ }
+ },
+ // 绘制坐标轴标签
+ drawCrosshairAxisLabels(ctx, width, height, grid, crosshair) {
+ const { x, y } = crosshair;
+ // X轴时间标签
+ if (crosshair.currentData && (crosshair.currentData.time || crosshair.currentData.date)) {
+ const timeText = crosshair.currentData.time || crosshair.currentData.date;
+ const xBoxWidth = crosshair.currentData.time ? 40 : 70;
+ const xBoxHeight = 15;
+ ctx.setFillStyle("#629AF5");
+
+ if (x - xBoxWidth / 2 <= grid[0].left) {
+ ctx.fillRect(grid[0].left, height - grid[0].bottom, xBoxWidth, xBoxHeight);
+ } else if (x + xBoxWidth / 2 < width - grid[0].right) {
+ ctx.fillRect(x - xBoxWidth / 2, height - grid[0].bottom, xBoxWidth, xBoxHeight);
+ } else {
+ ctx.fillRect(width - grid[0].right - xBoxWidth, height - grid[0].bottom, xBoxWidth, xBoxHeight);
+ }
+
+ ctx.setFillStyle("#fff");
+ ctx.setFontSize(12);
+ ctx.setTextAlign("center");
+
+ if (x - xBoxWidth / 2 <= grid[0].left) {
+ ctx.fillText(timeText, grid[0].left + xBoxWidth / 2, height - grid[0].bottom + 12);
+ } else if (x + xBoxWidth / 2 < width - grid[0].right) {
+ ctx.fillText(timeText, x, height - grid[0].bottom + 12);
+ } else {
+ ctx.fillText(timeText, width - grid[0].right - xBoxWidth / 2, height - grid[0].bottom + 12);
+ }
+ }
+
+ // Y轴价格标签
+ if (crosshair.currentData) {
+ const priceText = utils.formatPrice(crosshair.currentData.price);
+ const yBoxWidth = 50;
+ const yBoxHeight = 14;
+ ctx.setFillStyle("#629AF5");
+ if (x < grid[0].left + yBoxWidth + 5) {
+ ctx.fillRect(width - grid[0].right - yBoxWidth, y - yBoxHeight / 2, yBoxWidth, yBoxHeight);
+ } else {
+ ctx.fillRect(grid[0].left, y - yBoxHeight / 2, yBoxWidth, yBoxHeight);
+ }
+
+ ctx.setFillStyle("#fff");
+ ctx.setFontSize(11);
+ ctx.setTextAlign("center");
+ if (x < grid[0].left + yBoxWidth + 5) {
+ ctx.fillText(priceText, width - grid[0].right - yBoxWidth / 2, y + 3);
+ } else {
+ ctx.fillText(priceText, grid[0].left + yBoxWidth / 2, y + 3);
+ }
+ }
+ },
+ // 绘制十字准线
+ drawCrosshair(ctx, width, height, grid, crosshair, text) {
+ if (!ctx) return;
+ const { x, y } = crosshair;
+ if (crosshair.show) {
+ // 每次绘制前先清除整个画布
+ ctx.clearRect(0, 0, width, height);
+
+ // 绘制垂直准线1
+ ctx.setStrokeStyle("#000");
+ ctx.setLineWidth(1);
+ // ctx.setLineDash([5, 5]);
+
+ for (let i = 0; i < grid.length; i++) {
+ ctx.beginPath();
+ ctx.moveTo(x, grid[i].top);
+ ctx.lineTo(x, height - grid[i].bottom);
+ ctx.stroke();
+ }
+ // ctx.beginPath();
+ // ctx.moveTo(x, grid[0].top);
+ // ctx.lineTo(x, height - grid[0].bottom);
+ // ctx.stroke();
+
+ // // 绘制垂直准线2
+ // ctx.beginPath();
+ // ctx.moveTo(x, grid[1].top);
+ // ctx.lineTo(x, height - grid[1].bottom);
+ // ctx.stroke();
+
+ // 绘制水平准线
+ ctx.beginPath();
+ ctx.moveTo(grid[0].left, y);
+ ctx.lineTo(width - grid[0].right, y);
+ ctx.stroke();
+
+ ctx.setLineDash([]);
+
+ // 绘制焦点圆点 - 黑边白心(更小)
+ // 先绘制白色填充
+ ctx.setFillStyle("#ffffff");
+ ctx.beginPath();
+ ctx.arc(x, y, 2, 0, Math.PI * 2);
+ ctx.fill();
+
+ // 再绘制黑色边框
+ ctx.setStrokeStyle("#000000");
+ ctx.setLineWidth(1);
+ ctx.setLineDash([]);
+ ctx.beginPath();
+ ctx.arc(x, y, 2, 0, Math.PI * 2);
+ ctx.stroke();
+
+ // 绘制坐标轴标签
+ HCharts.drawCrosshairAxisLabels(ctx, width, height, grid, crosshair);
+ }
+ // 绘制顶部价格显示
+ HCharts.drawTopPriceDisplay(ctx, grid, text);
+ ctx.draw(false);
+ },
+};
diff --git a/common/stockTimeInformation.js b/common/stockTimeInformation.js
new file mode 100644
index 0000000..9302d27
--- /dev/null
+++ b/common/stockTimeInformation.js
@@ -0,0 +1,354 @@
+/** @format */
+
+export const prevClosePrice = 14.95; // 前一日收盘价(元)
+export const timeData = [
+ // 上午时段:9:30-11:30(共120个数据点)
+ { time: "09:30", price: 15.0, volume: 28500 }, // 开盘价15.00元,开盘放量
+ { time: "09:31", price: 15.08, volume: 25300 },
+ { time: "09:32", price: 15.12, volume: 22800 },
+ { time: "09:33", price: 15.09, volume: 19600 },
+ { time: "09:34", price: 15.15, volume: 17200 },
+ { time: "09:35", price: 15.18, volume: 15800 },
+ { time: "09:36", price: 15.16, volume: 14300 },
+ { time: "09:37", price: 15.2, volume: 13500 },
+ { time: "09:38", price: 15.17, volume: 12800 },
+ { time: "09:39", price: 15.22, volume: 12100 },
+ { time: "09:40", price: 15.25, volume: 11500 },
+ { time: "09:41", price: 15.23, volume: 10800 },
+ { time: "09:42", price: 15.26, volume: 10200 },
+ { time: "09:43", price: 15.24, volume: 9800 },
+ { time: "09:44", price: 15.28, volume: 9500 },
+ { time: "09:45", price: 15.3, volume: 9200 },
+ { time: "09:46", price: 15.27, volume: 8800 },
+ { time: "09:47", price: 15.29, volume: 8500 },
+ { time: "09:48", price: 15.32, volume: 8200 },
+ { time: "09:49", price: 15.3, volume: 7900 },
+ { time: "09:50", price: 15.33, volume: 7600 },
+ { time: "09:51", price: 15.31, volume: 7400 },
+ { time: "09:52", price: 15.34, volume: 7200 },
+ { time: "09:53", price: 15.32, volume: 7000 },
+ { time: "09:54", price: 15.35, volume: 6800 },
+ { time: "09:55", price: 15.33, volume: 6600 },
+ { time: "09:56", price: 15.36, volume: 6500 },
+ { time: "09:57", price: 15.34, volume: 6300 },
+ { time: "09:58", price: 15.37, volume: 6200 },
+ { time: "09:59", price: 15.35, volume: 6100 },
+ { time: "10:00", price: 15.38, volume: 6000 },
+ { time: "10:01", price: 15.36, volume: 5900 },
+ { time: "10:02", price: 15.39, volume: 5800 },
+ { time: "10:03", price: 15.37, volume: 5700 },
+ { time: "10:04", price: 15.4, volume: 5600 },
+ { time: "10:05", price: 15.38, volume: 5500 },
+ { time: "10:06", price: 15.41, volume: 15400 },
+ { time: "10:07", price: 15.39, volume: 5300 },
+ { time: "10:08", price: 15.42, volume: 5200 },
+ { time: "10:09", price: 15.4, volume: 5100 },
+ { time: "10:10", price: 15.43, volume: 5000 },
+ { time: "10:11", price: 15.41, volume: 5100 },
+ { time: "10:12", price: 15.44, volume: 5200 },
+ { time: "10:13", price: 15.42, volume: 5300 },
+ { time: "10:14", price: 15.45, volume: 5400 },
+ { time: "10:15", price: 15.43, volume: 5500 },
+ { time: "10:16", price: 15.46, volume: 5600 },
+ { time: "10:17", price: 15.44, volume: 5700 },
+ { time: "10:18", price: 15.47, volume: 5800 },
+ { time: "10:19", price: 15.45, volume: 5900 },
+ { time: "10:20", price: 15.48, volume: 6000 },
+ { time: "10:21", price: 15.46, volume: 6100 },
+ { time: "10:22", price: 15.49, volume: 6200 },
+ { time: "10:23", price: 15.47, volume: 6300 },
+ { time: "10:24", price: 15.5, volume: 6400 },
+ { time: "10:25", price: 15.48, volume: 6500 },
+ { time: "10:26", price: 15.51, volume: 6600 },
+ { time: "10:27", price: 15.49, volume: 6700 },
+ { time: "10:28", price: 15.52, volume: 6800 },
+ { time: "10:29", price: 15.5, volume: 6900 },
+ { time: "10:30", price: 15.53, volume: 7000 },
+ { time: "10:31", price: 15.51, volume: 7100 },
+ { time: "10:32", price: 15.54, volume: 7200 },
+ { time: "10:33", price: 15.52, volume: 7300 },
+ { time: "10:34", price: 15.55, volume: 7400 },
+ { time: "10:35", price: 15.53, volume: 7500 },
+ { time: "10:36", price: 15.56, volume: 7600 },
+ { time: "10:37", price: 15.54, volume: 7700 },
+ { time: "10:38", price: 15.57, volume: 7800 },
+ { time: "10:39", price: 15.55, volume: 7900 },
+ { time: "10:40", price: 15.58, volume: 8000 },
+ { time: "10:41", price: 15.56, volume: 8100 },
+ { time: "10:42", price: 15.59, volume: 8200 },
+ { time: "10:43", price: 15.57, volume: 8300 },
+ { time: "10:44", price: 15.6, volume: 8400 }, // 全天最高价15.60元
+ { time: "10:45", price: 15.58, volume: 8300 },
+ { time: "10:46", price: 15.56, volume: 8200 },
+ { time: "10:47", price: 15.54, volume: 8100 },
+ { time: "10:48", price: 15.52, volume: 8000 },
+ { time: "10:49", price: 15.5, volume: 7900 },
+ { time: "10:50", price: 15.48, volume: 7800 },
+ { time: "10:51", price: 15.46, volume: 7700 },
+ { time: "10:52", price: 15.44, volume: 7600 },
+ { time: "10:53", price: 15.42, volume: 7500 },
+ { time: "10:54", price: 15.4, volume: 7400 },
+ { time: "10:55", price: 15.38, volume: 7300 },
+ { time: "10:56", price: 15.36, volume: 7200 },
+ { time: "10:57", price: 15.34, volume: 7100 },
+ { time: "10:58", price: 15.32, volume: 7000 },
+ { time: "10:59", price: 15.3, volume: 6900 },
+ { time: "11:00", price: 15.28, volume: 6800 },
+ { time: "11:01", price: 15.26, volume: 6700 },
+ { time: "11:02", price: 15.24, volume: 6600 },
+ { time: "11:03", price: 15.22, volume: 6500 },
+ { time: "11:04", price: 15.2, volume: 6400 }, // 全天最低价15.20元
+ { time: "11:05", price: 15.22, volume: 6500 },
+ { time: "11:06", price: 15.24, volume: 6600 },
+ { time: "11:07", price: 15.26, volume: 6700 },
+ { time: "11:08", price: 15.28, volume: 6800 },
+ { time: "11:09", price: 15.3, volume: 6900 },
+ { time: "11:10", price: 15.32, volume: 7000 },
+ { time: "11:11", price: 15.34, volume: 7100 },
+ { time: "11:12", price: 15.36, volume: 7200 },
+ { time: "11:13", price: 15.38, volume: 7300 },
+ { time: "11:14", price: 15.4, volume: 7400 },
+ { time: "11:15", price: 15.42, volume: 7500 },
+ { time: "11:16", price: 15.44, volume: 7600 },
+ { time: "11:17", price: 15.46, volume: 7700 },
+ { time: "11:18", price: 15.48, volume: 7800 },
+ { time: "11:19", price: 15.5, volume: 7900 },
+ { time: "11:20", price: 15.45, volume: 8300 },
+ { time: "11:21", price: 15.47, volume: 8600 },
+ { time: "11:22", price: 15.43, volume: 9100 },
+ { time: "11:23", price: 15.46, volume: 9500 },
+ { time: "11:24", price: 15.49, volume: 10200 },
+ { time: "11:25", price: 15.5, volume: 11500 },
+ { time: "11:26", price: 15.48, volume: 12800 },
+ { time: "11:27", price: 15.52, volume: 14300 },
+ { time: "11:28", price: 15.5, volume: 16500 },
+ { time: "11:29", price: 15.53, volume: 19800 }, // 午盘收盘价15.53元
+
+ // 下午时段:13:00-15:00(共120个数据点)
+ { time: "13:00", price: 15.55, volume: 24600 }, // 午后开盘冲高
+ { time: "13:01", price: 15.58, volume: 21300 },
+ { time: "13:02", price: 15.6, volume: 18700 }, // 再次触及全天最高价
+ { time: "13:03", price: 15.57, volume: 16200 },
+ { time: "13:04", price: 15.55, volume: 14500 },
+ { time: "13:05", price: 15.52, volume: 12800 },
+ { time: "13:06", price: 15.5, volume: 11300 },
+ { time: "13:07", price: 15.48, volume: 10100 },
+ { time: "13:08", price: 15.5, volume: 9500 },
+ { time: "13:09", price: 15.47, volume: 8900 },
+ { time: "13:10", price: 15.45, volume: 8300 },
+ { time: "13:11", price: 15.43, volume: 7800 },
+ { time: "13:12", price: 15.46, volume: 7500 },
+ { time: "13:13", price: 15.44, volume: 7200 },
+ { time: "13:14", price: 15.42, volume: 6900 },
+ { time: "13:15", price: 15.45, volume: 6700 },
+ { time: "13:16", price: 15.43, volume: 6500 },
+ { time: "13:17", price: 15.4, volume: 6300 },
+ { time: "13:18", price: 15.42, volume: 6100 },
+ { time: "13:19", price: 15.39, volume: 5900 },
+ { time: "13:20", price: 15.41, volume: 5800 },
+ { time: "13:21", price: 15.39, volume: 5700 },
+ { time: "13:22", price: 15.42, volume: 5600 },
+ { time: "13:23", price: 15.4, volume: 5500 },
+ { time: "13:24", price: 15.43, volume: 5400 },
+ { time: "13:25", price: 15.41, volume: 5300 },
+ { time: "13:26", price: 15.44, volume: 5200 },
+ { time: "13:27", price: 15.42, volume: 5100 },
+ { time: "13:28", price: 15.45, volume: 5000 },
+ { time: "13:29", price: 15.43, volume: 5100 },
+ { time: "13:30", price: 15.46, volume: 5200 },
+ { time: "13:31", price: 15.44, volume: 5300 },
+ { time: "13:32", price: 15.47, volume: 5400 },
+ { time: "13:33", price: 15.45, volume: 5500 },
+ { time: "13:34", price: 15.48, volume: 5600 },
+ { time: "13:35", price: 15.46, volume: 5700 },
+ { time: "13:36", price: 15.49, volume: 5800 },
+ { time: "13:37", price: 15.47, volume: 5900 },
+ { time: "13:38", price: 15.5, volume: 6000 },
+ { time: "13:39", price: 15.48, volume: 6100 },
+ { time: "13:40", price: 15.51, volume: 6200 },
+ { time: "13:41", price: 15.49, volume: 6300 },
+ { time: "13:42", price: 15.52, volume: 6400 },
+ { time: "13:43", price: 15.5, volume: 6500 },
+ { time: "13:44", price: 15.53, volume: 6600 },
+ { time: "13:45", price: 15.51, volume: 6700 },
+ { time: "13:46", price: 15.54, volume: 6800 },
+ { time: "13:47", price: 15.52, volume: 6900 },
+ { time: "13:48", price: 15.55, volume: 7000 },
+ { time: "13:49", price: 15.53, volume: 7100 },
+ { time: "13:50", price: 15.56, volume: 7200 },
+ { time: "13:51", price: 15.54, volume: 7300 },
+ { time: "13:52", price: 15.57, volume: 7400 },
+ { time: "13:53", price: 15.55, volume: 7500 },
+ { time: "13:54", price: 15.58, volume: 7600 },
+ { time: "13:55", price: 15.56, volume: 7700 },
+ { time: "13:56", price: 15.59, volume: 7800 },
+ { time: "13:57", price: 15.57, volume: 7900 },
+ { time: "13:58", price: 15.6, volume: 8000 }, // 第三次触及全天最高价
+ { time: "13:59", price: 15.58, volume: 8100 },
+ { time: "14:00", price: 15.56, volume: 8200 },
+ { time: "14:01", price: 15.54, volume: 8300 },
+ { time: "14:02", price: 15.52, volume: 8400 },
+ { time: "14:03", price: 15.5, volume: 8300 },
+ { time: "14:04", price: 15.48, volume: 8200 },
+ { time: "14:05", price: 15.46, volume: 8100 },
+ { time: "14:06", price: 15.44, volume: 8000 },
+ { time: "14:07", price: 15.42, volume: 7900 },
+ { time: "14:08", price: 15.4, volume: 7800 },
+ { time: "14:09", price: 15.38, volume: 7700 },
+ { time: "14:10", price: 15.36, volume: 7600 },
+ { time: "14:11", price: 15.34, volume: 7500 },
+ { time: "14:12", price: 15.32, volume: 7400 },
+ { time: "14:13", price: 15.3, volume: 7300 },
+ { time: "14:14", price: 15.28, volume: 7200 },
+ { time: "14:15", price: 15.26, volume: 7100 },
+ { time: "14:16", price: 15.24, volume: 7000 },
+ { time: "14:17", price: 15.22, volume: 6900 },
+ { time: "14:18", price: 15.2, volume: 6800 }, // 再次触及全天最低价
+ { time: "14:19", price: 15.22, volume: 6700 },
+ { time: "14:20", price: 15.24, volume: 6600 },
+ { time: "14:21", price: 15.26, volume: 6500 },
+ { time: "14:22", price: 15.28, volume: 6400 },
+ { time: "14:23", price: 15.3, volume: 6300 },
+ { time: "14:24", price: 15.32, volume: 6200 },
+ { time: "14:25", price: 15.34, volume: 6100 },
+ { time: "14:26", price: 15.36, volume: 6000 },
+ { time: "14:27", price: 15.38, volume: 5900 },
+ { time: "14:28", price: 15.4, volume: 5800 },
+ { time: "14:29", price: 15.42, volume: 5700 },
+ { time: "14:30", price: 15.44, volume: 5600 },
+ { time: "14:31", price: 15.46, volume: 5500 },
+ { time: "14:32", price: 15.48, volume: 5400 },
+ { time: "14:33", price: 15.5, volume: 5300 },
+ { time: "14:34", price: 15.52, volume: 5200 },
+ { time: "14:35", price: 15.54, volume: 5100 },
+ { time: "14:36", price: 15.56, volume: 5000 },
+ { time: "14:37", price: 15.54, volume: 5100 },
+ { time: "14:38", price: 15.52, volume: 5200 },
+ { time: "14:39", price: 15.5, volume: 5300 },
+ { time: "14:40", price: 15.48, volume: 5400 },
+ { time: "14:41", price: 15.46, volume: 5500 },
+ { time: "14:42", price: 15.44, volume: 5600 },
+ { time: "14:43", price: 15.42, volume: 5700 },
+ { time: "14:44", price: 15.4, volume: 5800 },
+ { time: "14:45", price: 15.38, volume: 5900 },
+ { time: "14:46", price: 15.36, volume: 6000 },
+ { time: "14:47", price: 15.34, volume: 6100 },
+ { time: "14:48", price: 15.32, volume: 6200 },
+ { time: "14:49", price: 15.3, volume: 6300 },
+ { time: "14:50", price: 15.42, volume: 9800 }, // 尾盘开始放量
+ { time: "14:51", price: 15.45, volume: 11500 },
+ { time: "14:52", price: 15.43, volume: 13200 },
+ { time: "14:53", price: 15.46, volume: 15800 },
+ { time: "14:54", price: 15.44, volume: 18500 },
+ { time: "14:55", price: 15.47, volume: 21300 },
+ { time: "14:56", price: 15.45, volume: 24600 },
+ { time: "14:57", price: 15.48, volume: 27800 },
+ { time: "14:58", price: 15.46, volume: 31200 }, // 尾盘成交量峰值
+ { time: "14:59", price: 15.45, volume: 28500 }, // 当日收盘价15.45元
+];
+export const klineData = [
+ // 第1天(起始点,位于区间中部)
+ { date: "2015-10-11", open: 16.5, high: 16.8, low: 16.2, close: 16.6, volume: 185000 },
+ // 第2-90天(区间震荡:15.5-17.5元)
+ { date: "2015-10-12", open: 16.6, high: 16.9, low: 16.4, close: 16.7, volume: 192000 },
+ { date: "2015-10-13", open: 16.7, high: 17.0, low: 16.5, close: 16.6, volume: 188000 },
+ { date: "2015-10-14", open: 16.6, high: 16.8, low: 16.3, close: 16.4, volume: 175000 },
+ { date: "2015-10-15", open: 16.4, high: 16.7, low: 16.2, close: 16.5, volume: 181000 },
+ { date: "2015-10-16", open: 16.5, high: 16.9, low: 16.3, close: 16.8, volume: 195000 },
+ { date: "2015-10-17", open: 16.8, high: 17.1, low: 16.6, close: 16.7, volume: 202000 },
+ { date: "2015-10-18", open: 16.7, high: 16.9, low: 16.4, close: 16.5, volume: 183000 },
+ { date: "2015-10-19", open: 16.5, high: 16.7, low: 16.1, close: 16.3, volume: 172000 },
+ { date: "2015-10-20", open: 16.3, high: 16.6, low: 16.0, close: 16.4, volume: 178000 },
+ { date: "2015-10-21", open: 16.4, high: 16.8, low: 16.2, close: 16.6, volume: 189000 },
+ { date: "2015-10-22", open: 16.6, high: 17.0, low: 16.5, close: 16.9, volume: 205000 },
+ { date: "2015-10-23", open: 16.9, high: 17.2, low: 16.7, close: 16.8, volume: 212000 },
+ { date: "2015-10-24", open: 16.8, high: 17.0, low: 16.5, close: 16.6, volume: 193000 },
+ { date: "2015-10-25", open: 16.6, high: 16.8, low: 16.2, close: 16.3, volume: 176000 },
+ { date: "2015-10-26", open: 16.3, high: 16.6, low: 16.0, close: 16.5, volume: 184000 },
+ { date: "2015-10-27", open: 16.5, high: 16.9, low: 16.4, close: 16.7, volume: 196000 },
+ { date: "2015-10-28", open: 16.7, high: 17.1, low: 16.6, close: 16.9, volume: 208000 },
+ { date: "2015-10-29", open: 16.9, high: 17.3, low: 16.8, close: 17.0, volume: 215000 },
+ { date: "2015-10-30", open: 17.0, high: 17.2, low: 16.7, close: 16.8, volume: 201000 },
+ { date: "2015-10-31", open: 16.8, high: 17.0, low: 16.5, close: 16.6, volume: 189000 },
+ { date: "2015-11-01", open: 16.6, high: 16.8, low: 16.2, close: 16.4, volume: 175000 },
+ { date: "2015-11-02", open: 16.4, high: 16.7, low: 16.1, close: 16.3, volume: 171000 },
+ { date: "2015-11-03", open: 16.3, high: 16.6, low: 16.0, close: 16.5, volume: 182000 },
+ { date: "2015-11-04", open: 16.5, high: 16.9, low: 16.3, close: 16.7, volume: 194000 },
+ { date: "2015-11-05", open: 16.7, high: 17.1, low: 16.6, close: 16.8, volume: 203000 },
+ { date: "2015-11-06", open: 16.8, high: 17.0, low: 16.5, close: 16.6, volume: 190000 },
+ { date: "2015-11-07", open: 16.6, high: 16.8, low: 16.3, close: 16.4, volume: 178000 },
+ { date: "2015-11-08", open: 16.4, high: 16.7, low: 16.1, close: 16.3, volume: 173000 },
+ { date: "2015-11-09", open: 16.3, high: 16.6, low: 15.9, close: 16.2, volume: 168000 }, // 触及区间下沿
+ { date: "2015-11-10", open: 16.2, high: 16.5, low: 16.0, close: 16.4, volume: 176000 },
+ { date: "2015-11-11", open: 16.4, high: 16.8, low: 16.3, close: 16.6, volume: 187000 },
+ { date: "2015-11-12", open: 16.6, high: 17.0, low: 16.5, close: 16.8, volume: 198000 },
+ { date: "2015-11-13", open: 16.8, high: 17.2, low: 16.7, close: 16.9, volume: 206000 },
+ { date: "2015-11-14", open: 16.9, high: 17.3, low: 16.8, close: 17.1, volume: 218000 },
+ { date: "2015-11-15", open: 17.1, high: 17.4, low: 16.9, close: 17.0, volume: 212000 },
+ { date: "2015-11-16", open: 17.0, high: 17.2, low: 16.7, close: 16.8, volume: 197000 },
+ { date: "2015-11-17", open: 16.8, high: 17.0, low: 16.5, close: 16.6, volume: 185000 },
+ { date: "2015-11-18", open: 16.6, high: 16.8, low: 16.3, close: 16.4, volume: 177000 },
+ { date: "2015-11-19", open: 16.4, high: 16.7, low: 16.1, close: 16.3, volume: 172000 },
+ { date: "2015-11-20", open: 16.3, high: 16.6, low: 16.0, close: 16.5, volume: 183000 },
+ { date: "2015-11-21", open: 16.5, high: 16.9, low: 16.4, close: 16.7, volume: 195000 },
+ { date: "2015-11-22", open: 16.7, high: 17.1, low: 16.6, close: 16.9, volume: 204000 },
+ { date: "2015-11-23", open: 16.9, high: 17.2, low: 16.8, close: 17.0, volume: 213000 },
+ { date: "2015-11-24", open: 17.0, high: 17.3, low: 16.9, close: 17.1, volume: 221000 },
+ { date: "2015-11-25", open: 17.1, high: 17.4, low: 17.0, close: 17.2, volume: 228000 }, // 触及区间上沿
+ { date: "2015-11-26", open: 17.2, high: 17.3, low: 16.8, close: 16.9, volume: 215000 },
+ { date: "2015-11-27", open: 16.9, high: 17.1, low: 16.6, close: 16.7, volume: 199000 },
+ { date: "2015-11-28", open: 16.7, high: 16.9, low: 16.4, close: 16.5, volume: 186000 },
+ { date: "2015-11-29", open: 16.5, high: 16.7, low: 16.2, close: 16.3, volume: 175000 },
+ { date: "2015-11-30", open: 16.3, high: 16.6, low: 16.0, close: 16.4, volume: 179000 },
+ { date: "2015-12-01", open: 16.4, high: 16.8, low: 16.3, close: 16.6, volume: 188000 },
+ { date: "2015-12-02", open: 16.6, high: 17.0, low: 16.5, close: 16.8, volume: 199000 },
+ { date: "2015-12-03", open: 16.8, high: 17.2, low: 16.7, close: 16.9, volume: 207000 },
+ { date: "2015-12-04", open: 16.9, high: 17.1, low: 16.6, close: 16.7, volume: 193000 },
+ { date: "2015-12-05", open: 16.7, high: 16.9, low: 16.4, close: 16.5, volume: 182000 },
+ { date: "2015-12-06", open: 16.5, high: 16.7, low: 16.2, close: 16.3, volume: 173000 },
+ { date: "2015-12-07", open: 16.3, high: 16.6, low: 15.9, close: 16.1, volume: 167000 }, // 触及区间下沿
+ { date: "2015-12-08", open: 16.1, high: 16.4, low: 16.0, close: 16.3, volume: 174000 },
+ { date: "2015-12-09", open: 16.3, high: 16.7, low: 16.2, close: 16.5, volume: 185000 },
+ { date: "2015-12-10", open: 16.5, high: 16.9, low: 16.4, close: 16.7, volume: 196000 },
+ { date: "2015-12-11", open: 16.7, high: 17.1, low: 16.6, close: 16.9, volume: 205000 },
+ { date: "2015-12-12", open: 16.9, high: 17.3, low: 16.8, close: 17.0, volume: 214000 },
+ { date: "2015-12-13", open: 17.0, high: 17.2, low: 16.8, close: 16.9, volume: 203000 },
+ { date: "2015-12-14", open: 16.9, high: 17.1, low: 16.6, close: 16.7, volume: 191000 },
+ { date: "2015-12-15", open: 16.7, high: 16.9, low: 16.4, close: 16.5, volume: 180000 },
+ { date: "2015-12-16", open: 16.5, high: 16.7, low: 16.2, close: 16.3, volume: 172000 },
+ { date: "2015-12-17", open: 16.3, high: 16.6, low: 16.0, close: 16.4, volume: 178000 },
+ { date: "2015-12-18", open: 16.4, high: 16.8, low: 16.3, close: 16.6, volume: 189000 },
+ { date: "2015-12-19", open: 16.6, high: 17.0, low: 16.5, close: 16.8, volume: 200000 },
+ { date: "2015-12-20", open: 16.8, high: 17.2, low: 16.7, close: 16.9, volume: 208000 },
+ { date: "2015-12-21", open: 16.9, high: 17.3, low: 16.8, close: 17.1, volume: 219000 },
+ { date: "2015-12-22", open: 17.1, high: 17.4, low: 17.0, close: 17.2, volume: 226000 }, // 触及区间上沿
+ { date: "2015-12-23", open: 17.2, high: 17.3, low: 16.8, close: 16.9, volume: 213000 },
+ { date: "2015-12-24", open: 16.9, high: 17.1, low: 16.6, close: 16.7, volume: 198000 },
+ { date: "2015-12-25", open: 16.7, high: 16.9, low: 16.4, close: 16.5, volume: 185000 },
+ { date: "2015-12-26", open: 16.5, high: 16.7, low: 16.2, close: 16.3, volume: 174000 },
+ { date: "2015-12-27", open: 16.3, high: 16.6, low: 16.0, close: 16.5, volume: 183000 },
+ { date: "2015-12-28", open: 16.5, high: 16.9, low: 16.4, close: 16.7, volume: 195000 },
+ { date: "2015-12-29", open: 16.7, high: 17.1, low: 16.6, close: 16.9, volume: 204000 },
+ { date: "2015-12-30", open: 16.9, high: 17.2, low: 16.8, close: 17.0, volume: 212000 },
+ { date: "2015-12-31", open: 17.0, high: 17.3, low: 16.9, close: 17.1, volume: 220000 },
+ { date: "2016-01-01", open: 17.1, high: 17.2, low: 16.8, close: 16.9, volume: 207000 },
+ { date: "2016-01-02", open: 16.9, high: 17.1, low: 16.6, close: 16.7, volume: 193000 },
+ { date: "2016-01-03", open: 16.7, high: 16.9, low: 16.4, close: 16.5, volume: 181000 },
+ { date: "2016-01-04", open: 16.5, high: 16.7, low: 16.2, close: 16.3, volume: 172000 },
+ { date: "2016-01-05", open: 16.3, high: 16.6, low: 15.9, close: 16.2, volume: 168000 }, // 触及区间下沿
+ { date: "2016-01-06", open: 16.2, high: 16.5, low: 16.0, close: 16.4, volume: 175000 },
+ { date: "2016-01-07", open: 16.4, high: 16.8, low: 16.3, close: 16.6, volume: 186000 },
+ { date: "2016-01-08", open: 16.6, high: 17.0, low: 16.5, close: 16.8, volume: 197000 },
+ { date: "2016-01-09", open: 16.8, high: 17.2, low: 16.7, close: 16.9, volume: 206000 },
+ { date: "2016-01-10", open: 16.9, high: 17.3, low: 16.8, close: 17.1, volume: 217000 },
+ { date: "2016-01-11", open: 17.1, high: 17.4, low: 17.0, close: 17.2, volume: 225000 }, // 触及区间上沿
+ { date: "2016-01-12", open: 17.2, high: 17.3, low: 16.8, close: 16.9, volume: 212000 },
+ { date: "2016-01-13", open: 16.9, high: 17.1, low: 16.6, close: 16.7, volume: 197000 },
+ { date: "2016-01-14", open: 16.7, high: 16.9, low: 16.4, close: 16.5, volume: 184000 },
+ { date: "2016-01-15", open: 16.5, high: 16.7, low: 16.2, close: 16.4, volume: 175000 },
+ { date: "2016-01-16", open: 16.4, high: 16.7, low: 16.1, close: 16.3, volume: 171000 },
+ { date: "2016-01-17", open: 16.3, high: 16.6, low: 16.0, close: 16.5, volume: 182000 },
+ { date: "2016-01-18", open: 16.5, high: 16.9, low: 16.4, close: 16.7, volume: 194000 },
+ { date: "2016-01-19", open: 16.7, high: 17.1, low: 16.6, close: 16.9, volume: 203000 },
+ { date: "2016-01-20", open: 16.9, high: 17.2, low: 16.8, close: 17.0, volume: 212000 },
+];
diff --git a/common/util.js b/common/util.js
new file mode 100644
index 0000000..0058c56
--- /dev/null
+++ b/common/util.js
@@ -0,0 +1,142 @@
+var util = {}
+util.data = {}
+util.data.base_url = 'https://dbqb.nfdxy.net/devApi'
+// util.data.base_url = 'https://dbqb.nfdxy.net/prodApi'
+
+// AJAX 请求方法
+util.request = (url, callback, data = {}, failCallback) => {
+ url = util.data.base_url + url
+ console.log('请求该接口->', url, '请求参数为->', data);
+ uni.request({
+ url: url, //仅为示例,并非真实接口地址。
+ data,
+ method: 'post',
+ header: {
+ 'content-type': 'application/json',
+ 'version': uni.getSystemInfoSync().appVersion,
+ 'client': uni.getSystemInfoSync().platform == 'ios' ? 'ios' : 'android',
+ 'token': uni.getStorageSync('token')
+ },
+ sslVerify: false,
+ success: callback,
+ fail: failCallback
+ });
+}
+
+export default util
+
+// 画图需要用到的方法
+export const utils = {
+ // 格式化价格
+ formatPrice(price) {
+ return price.toFixed(2);
+ },
+ // 计算数据范围
+ calculateDataRange(data, key) {
+ if (!data || data.length === 0) {
+ return {
+ min: 0,
+ max: 0,
+ };
+ }
+ const values = data.map((item) => item[key]);
+ return {
+ min: Math.min(...values),
+ max: Math.max(...values),
+ };
+ },
+ // 计算标签
+ calculateLabel(data, type = 2, preClosePrice = 0, key, num) {
+ let label = [];
+ if (key === "price") {
+ // 分时价格区间
+ if (type == 1) {
+ const priceRange = utils.calculateDataRange(data, "price");
+ const theMost = Math.max(priceRange.max - preClosePrice, preClosePrice - priceRange.min);
+ const mid = (num - 1) / 2;
+ // 计算分时价格标签
+ label[mid] = {
+ value: utils.formatPrice(preClosePrice),
+ ratio: utils.formatPrice(0) + "%",
+ };
+ for (let i = 0; i < mid; i++) {
+ label[i] = {
+ value: utils.formatPrice(preClosePrice + (theMost * (mid - i)) / mid),
+ ratio: utils.formatPrice((100 * (theMost * (mid - i))) / mid / preClosePrice) + "%",
+ };
+
+ label[num - 1 - i] = {
+ value: utils.formatPrice(preClosePrice - (theMost * (mid - i)) / mid),
+ ratio: utils.formatPrice((-1 * 100 * (theMost * (mid - i))) / mid / preClosePrice) +
+ "%",
+ };
+ }
+ timeChartObject.value.max = preClosePrice + theMost;
+ timeChartObject.value.min = preClosePrice - theMost;
+ return label;
+ } else {
+ const highPriceRange = utils.calculateDataRange(data, "high");
+ const lowPriceRange = utils.calculateDataRange(data, "low");
+ const priceDiff = highPriceRange.max * 1.01 - lowPriceRange.min * 0.99;
+ for (let i = 0; i < num; ++i) {
+ label[i] = {
+ value: utils.formatPrice(highPriceRange.max - (i * priceDiff) / num),
+ };
+ }
+ return label;
+ }
+ } else if (key === "volume") {
+ const volumeRange = utils.calculateDataRange(data, "volume");
+ label[0] = {
+ value: utils.formatPrice(volumeRange.max),
+ };
+ label[1] = {
+ value: utils.formatPrice(0),
+ };
+ return label;
+ }
+ return null;
+ },
+ // 线性插值
+ lerp(start, end, factor) {
+ return start + (end - start) * factor;
+ },
+ // 股市数值格式化方法
+ formatStockNumber(value, decimalPlaces = 2) {
+ const num = Number(value);
+ if (isNaN(num)) return "0";
+
+ const absNum = Math.abs(num);
+ const sign = num < 0 ? "-" : "";
+
+ if (absNum >= 1000000000000) {
+ // 万亿级别
+ return sign + (absNum / 1000000000000).toFixed(decimalPlaces) + "万亿";
+ } else if (absNum >= 100000000) {
+ // 亿级别
+ return sign + (absNum / 100000000).toFixed(decimalPlaces) + "亿";
+ } else if (absNum >= 10000) {
+ // 万级别
+ return sign + (absNum / 10000).toFixed(decimalPlaces) + "万";
+ } else {
+ // 小于万的直接显示
+ return sign + absNum.toFixed(decimalPlaces);
+ }
+ },
+};
+
+// 防抖函数
+export const throttle = (fn, delay = 1000) => {
+ //距离上一次的执行时间
+ let lastTime = 0;
+ return function() {
+ let _this = this;
+ let _arguments = arguments;
+ let now = new Date().getTime();
+ //如果距离上一次执行超过了delay才能再次执行
+ if (now - lastTime > delay) {
+ fn.apply(_this, _arguments);
+ lastTime = now;
+ }
+ };
+};
\ No newline at end of file
diff --git a/components/DeepMate.vue b/components/DeepMate.vue
index e8cb349..5132a5d 100644
--- a/components/DeepMate.vue
+++ b/components/DeepMate.vue
@@ -195,4 +195,60 @@
width: 20px;
height: 20px;
}
+
+.icon-container {
+ position: relative;
+ width: 50px;
+ height: 50px;
+ border-radius: 50%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ background-color: #f0f8ff;
+}
+
+.deepmate-icon {
+ width: 40px;
+ height: 40px;
+ border-radius: 50%;
+}
+
+.ripple-effect {
+ position: absolute;
+ border-radius: 50%;
+ background: radial-gradient(circle, rgba(255, 0, 0, 0.4) 0%, rgba(255, 0, 0, 0.1) 70%);
+ animation-name: ripple;
+ animation-duration: 3s;
+ animation-timing-function: ease-out;
+ animation-iteration-count: infinite;
+}
+
+.ripple-1 {
+ width: 100%;
+ height: 100%;
+ animation-delay: 0s;
+}
+
+.ripple-2 {
+ width: 100%;
+ height: 100%;
+ animation-delay: 1s;
+}
+
+.ripple-3 {
+ width: 100%;
+ height: 100%;
+ animation-delay: 2s;
+}
+
+@keyframes ripple {
+ 0% {
+ transform: scale(0.8);
+ opacity: 1;
+ }
+ 100% {
+ transform: scale(1.5);
+ opacity: 0;
+ }
+}
\ No newline at end of file
diff --git a/components/IndexCard.vue b/components/IndexCard.vue
new file mode 100644
index 0000000..24d0e7e
--- /dev/null
+++ b/components/IndexCard.vue
@@ -0,0 +1,190 @@
+
+
+
+
+
+ {{ currentPrice }}
+
+ {{ changeAmount }}
+ {{ changePercent }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/main.js b/main.js
index c15ca46..4ef91b6 100644
--- a/main.js
+++ b/main.js
@@ -1,31 +1,32 @@
-import pinia from './stores/index.js'
-import App from './App.vue'
-// #ifdef H5
-import { createSSRApp } from 'vue'
-// 导入需要全局注册的组件
-import LoginPrompt from './components/login-prompt.vue'
+import pinia from './stores/index.js'
+// #ifndef VUE3
+import Vue from 'vue'
+import App from './App'
+import ElementPlus from 'element-plus'
+import 'element-plus/dist/index.css'
+import * as ElementPlusIconsVue from '@element-plus/icons-vue'
-export function createApp() {
- const app = createSSRApp(App)
- // 全局注册组件
- app.component('LoginPrompt', LoginPrompt)
+Vue.config.productionTip = false
- // 挂载 store
- app.use(pinia)
+App.mpType = 'app'
- return {
- app
- }
+const app = new Vue({
+ ...App,
+ pinia
+})
+app.use(ElementPlus)
+for (const [key, component] of Object.entries(ElementPlusIconsVue)){
+ app.component(key, component)
}
+app.$mount()
// #endif
-// #ifdef APP-PLUS
+// #ifdef VUE3
import { createSSRApp } from 'vue'
+import App from './App.vue'
import { createI18n } from 'vue-i18n'
-import LoginPrompt from './components/login-prompt.vue'
-
// 导入语言文件
import en from './static/language/en.js'
@@ -41,7 +42,7 @@ function getCurrentLocale() {
return uni.getStorageSync('languageData').code;
} else {
let language = uni.getSystemInfoSync().osLanguage;
- // language = 'zh_CN'
+ language = 'zh_CN'
if (language.indexOf('th') != -1) {
language = 'th'
uni.setStorageSync('languageData', {
@@ -56,7 +57,7 @@ function getCurrentLocale() {
})
console.log(language);
return language
- } else if (language.indexOf('zh') != -1) {
+ }else if (language.indexOf('zh') != -1) {
if (language.indexOf('CN') != -1) {
language = 'zh_CN'
uni.setStorageSync('languageData', {
@@ -98,27 +99,24 @@ function getCurrentLocale() {
}
// 创建 i18n 实例
const i18n = createI18n({
- locale: getCurrentLocale(),
- legacy: false, // 使用 Composition API 模式
- globalInjection: true, // 全局注入 $t 函数
- messages: {
- 'en': en,
- 'ms': ms,
- 'th': th,
- 'vi': vi,
- 'zh_CN': zh_CN,
- 'zh_HK': zh_HK
- }
+ locale: getCurrentLocale(),
+ legacy: false, // 使用 Composition API 模式
+ globalInjection: true, // 全局注入 $t 函数
+ messages: {
+ 'en': en,
+ 'ms': ms,
+ 'th': th,
+ 'vi': vi,
+ 'zh_CN': zh_CN,
+ 'zh_HK': zh_HK
+ }
})
export function createApp() {
- const app = createSSRApp(App)
- app.component('LoginPrompt', LoginPrompt)
- app.use(i18n)
- // 挂载 store
- app.use(pinia)
-
- return {
- app
- }
+ const app = createSSRApp(App)
+ app.use(pinia)
+ app.use(i18n)
+ return {
+ app
+ }
}
// #endif
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..310d170
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,726 @@
+{
+ "name": "deepChartVueApp",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "dependencies": {
+ "@dcloudio/uni-ui": "^1.5.11",
+ "@element-plus/icons-vue": "^2.3.2",
+ "element-plus": "^2.11.5",
+ "marked": "^2.0.1",
+ "pinia": "^3.0.3",
+ "pinia-plugin-persistedstate": "^4.5.0",
+ "vue-i18n": "^9.14.5"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.27.1",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.28.5",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.28.5",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/types": "^7.28.5"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.28.5",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.28.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@ctrl/tinycolor": {
+ "version": "3.6.1",
+ "resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz",
+ "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@dcloudio/uni-ui": {
+ "version": "1.5.11",
+ "resolved": "https://registry.npmmirror.com/@dcloudio/uni-ui/-/uni-ui-1.5.11.tgz",
+ "integrity": "sha512-DBtk046ofmeFd82zRI7d89SoEwrAxYzUN3WVPm1DIBkpLPG5F5QDNkHMnZGu2wNrMEmGBjBpUh3vqEY1L3jaMw==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/@element-plus/icons-vue": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.2.tgz",
+ "integrity": "sha512-OzIuTaIfC8QXEPmJvB4Y4kw34rSXdCJzxcD1kFStBvr8bK6X1zQAYDo0CNMjojnfTqRQCJ0I7prlErcoRiET2A==",
+ "license": "MIT",
+ "peerDependencies": {
+ "vue": "^3.2.0"
+ }
+ },
+ "node_modules/@floating-ui/core": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.7.3.tgz",
+ "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/utils": "^0.2.10"
+ }
+ },
+ "node_modules/@floating-ui/dom": {
+ "version": "1.7.4",
+ "resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.7.4.tgz",
+ "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/core": "^1.7.3",
+ "@floating-ui/utils": "^0.2.10"
+ }
+ },
+ "node_modules/@floating-ui/utils": {
+ "version": "0.2.10",
+ "resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.10.tgz",
+ "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==",
+ "license": "MIT"
+ },
+ "node_modules/@intlify/core-base": {
+ "version": "9.14.5",
+ "resolved": "https://registry.npmmirror.com/@intlify/core-base/-/core-base-9.14.5.tgz",
+ "integrity": "sha512-5ah5FqZG4pOoHjkvs8mjtv+gPKYU0zCISaYNjBNNqYiaITxW8ZtVih3GS/oTOqN8d9/mDLyrjD46GBApNxmlsA==",
+ "license": "MIT",
+ "dependencies": {
+ "@intlify/message-compiler": "9.14.5",
+ "@intlify/shared": "9.14.5"
+ },
+ "engines": {
+ "node": ">= 16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/kazupon"
+ }
+ },
+ "node_modules/@intlify/message-compiler": {
+ "version": "9.14.5",
+ "resolved": "https://registry.npmmirror.com/@intlify/message-compiler/-/message-compiler-9.14.5.tgz",
+ "integrity": "sha512-IHzgEu61/YIpQV5Pc3aRWScDcnFKWvQA9kigcINcCBXN8mbW+vk9SK+lDxA6STzKQsVJxUPg9ACC52pKKo3SVQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@intlify/shared": "9.14.5",
+ "source-map-js": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/kazupon"
+ }
+ },
+ "node_modules/@intlify/shared": {
+ "version": "9.14.5",
+ "resolved": "https://registry.npmmirror.com/@intlify/shared/-/shared-9.14.5.tgz",
+ "integrity": "sha512-9gB+E53BYuAEMhbCAxVgG38EZrk59sxBtv3jSizNL2hEWlgjBjAw1AwpLHtNaeda12pe6W20OGEa0TwuMSRbyQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/kazupon"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.5",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@popperjs/core": {
+ "name": "@sxzz/popperjs-es",
+ "version": "2.11.7",
+ "resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz",
+ "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/popperjs"
+ }
+ },
+ "node_modules/@types/lodash": {
+ "version": "4.17.20",
+ "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.17.20.tgz",
+ "integrity": "sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/lodash-es": {
+ "version": "4.17.12",
+ "resolved": "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.12.tgz",
+ "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/lodash": "*"
+ }
+ },
+ "node_modules/@types/web-bluetooth": {
+ "version": "0.0.16",
+ "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz",
+ "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==",
+ "license": "MIT"
+ },
+ "node_modules/@vue/compiler-core": {
+ "version": "3.5.22",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/parser": "^7.28.4",
+ "@vue/shared": "3.5.22",
+ "entities": "^4.5.0",
+ "estree-walker": "^2.0.2",
+ "source-map-js": "^1.2.1"
+ }
+ },
+ "node_modules/@vue/compiler-dom": {
+ "version": "3.5.22",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@vue/compiler-core": "3.5.22",
+ "@vue/shared": "3.5.22"
+ }
+ },
+ "node_modules/@vue/compiler-sfc": {
+ "version": "3.5.22",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/parser": "^7.28.4",
+ "@vue/compiler-core": "3.5.22",
+ "@vue/compiler-dom": "3.5.22",
+ "@vue/compiler-ssr": "3.5.22",
+ "@vue/shared": "3.5.22",
+ "estree-walker": "^2.0.2",
+ "magic-string": "^0.30.19",
+ "postcss": "^8.5.6",
+ "source-map-js": "^1.2.1"
+ }
+ },
+ "node_modules/@vue/compiler-ssr": {
+ "version": "3.5.22",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@vue/compiler-dom": "3.5.22",
+ "@vue/shared": "3.5.22"
+ }
+ },
+ "node_modules/@vue/devtools-api": {
+ "version": "7.7.7",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/devtools-kit": "^7.7.7"
+ }
+ },
+ "node_modules/@vue/devtools-kit": {
+ "version": "7.7.7",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/devtools-shared": "^7.7.7",
+ "birpc": "^2.3.0",
+ "hookable": "^5.5.3",
+ "mitt": "^3.0.1",
+ "perfect-debounce": "^1.0.0",
+ "speakingurl": "^14.0.1",
+ "superjson": "^2.2.2"
+ }
+ },
+ "node_modules/@vue/devtools-shared": {
+ "version": "7.7.7",
+ "license": "MIT",
+ "dependencies": {
+ "rfdc": "^1.4.1"
+ }
+ },
+ "node_modules/@vue/reactivity": {
+ "version": "3.5.22",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@vue/shared": "3.5.22"
+ }
+ },
+ "node_modules/@vue/runtime-core": {
+ "version": "3.5.22",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@vue/reactivity": "3.5.22",
+ "@vue/shared": "3.5.22"
+ }
+ },
+ "node_modules/@vue/runtime-dom": {
+ "version": "3.5.22",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@vue/reactivity": "3.5.22",
+ "@vue/runtime-core": "3.5.22",
+ "@vue/shared": "3.5.22",
+ "csstype": "^3.1.3"
+ }
+ },
+ "node_modules/@vue/server-renderer": {
+ "version": "3.5.22",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@vue/compiler-ssr": "3.5.22",
+ "@vue/shared": "3.5.22"
+ },
+ "peerDependencies": {
+ "vue": "3.5.22"
+ }
+ },
+ "node_modules/@vue/shared": {
+ "version": "3.5.22",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@vueuse/core": {
+ "version": "9.13.0",
+ "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-9.13.0.tgz",
+ "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/web-bluetooth": "^0.0.16",
+ "@vueuse/metadata": "9.13.0",
+ "@vueuse/shared": "9.13.0",
+ "vue-demi": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@vueuse/core/node_modules/vue-demi": {
+ "version": "0.14.10",
+ "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz",
+ "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "vue-demi-fix": "bin/vue-demi-fix.js",
+ "vue-demi-switch": "bin/vue-demi-switch.js"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "@vue/composition-api": "^1.0.0-rc.1",
+ "vue": "^3.0.0-0 || ^2.6.0"
+ },
+ "peerDependenciesMeta": {
+ "@vue/composition-api": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vueuse/metadata": {
+ "version": "9.13.0",
+ "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.13.0.tgz",
+ "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@vueuse/shared": {
+ "version": "9.13.0",
+ "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.13.0.tgz",
+ "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==",
+ "license": "MIT",
+ "dependencies": {
+ "vue-demi": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@vueuse/shared/node_modules/vue-demi": {
+ "version": "0.14.10",
+ "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz",
+ "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "vue-demi-fix": "bin/vue-demi-fix.js",
+ "vue-demi-switch": "bin/vue-demi-switch.js"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "@vue/composition-api": "^1.0.0-rc.1",
+ "vue": "^3.0.0-0 || ^2.6.0"
+ },
+ "peerDependenciesMeta": {
+ "@vue/composition-api": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/async-validator": {
+ "version": "4.2.5",
+ "resolved": "https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz",
+ "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==",
+ "license": "MIT"
+ },
+ "node_modules/birpc": {
+ "version": "2.6.1",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/copy-anything": {
+ "version": "4.0.5",
+ "license": "MIT",
+ "dependencies": {
+ "is-what": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mesqueeb"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.1.3",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/dayjs": {
+ "version": "1.11.18",
+ "license": "MIT"
+ },
+ "node_modules/deep-pick-omit": {
+ "version": "1.2.1",
+ "license": "MIT"
+ },
+ "node_modules/defu": {
+ "version": "6.1.4",
+ "license": "MIT"
+ },
+ "node_modules/destr": {
+ "version": "2.0.5",
+ "license": "MIT"
+ },
+ "node_modules/element-plus": {
+ "version": "2.11.5",
+ "resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.11.5.tgz",
+ "integrity": "sha512-O+bIVHQCjUDm4GiIznDXRoS8ar2TpWLwfOGnN/Aam0VXf5kbuc4SxdKKJdovWNxmxeqbcwjsSZPKgtXNcqys4A==",
+ "license": "MIT",
+ "dependencies": {
+ "@ctrl/tinycolor": "^3.4.1",
+ "@element-plus/icons-vue": "^2.3.2",
+ "@floating-ui/dom": "^1.0.1",
+ "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7",
+ "@types/lodash": "^4.17.20",
+ "@types/lodash-es": "^4.17.12",
+ "@vueuse/core": "^9.1.0",
+ "async-validator": "^4.2.5",
+ "dayjs": "^1.11.18",
+ "lodash": "^4.17.21",
+ "lodash-es": "^4.17.21",
+ "lodash-unified": "^1.0.3",
+ "memoize-one": "^6.0.0",
+ "normalize-wheel-es": "^1.2.0"
+ },
+ "peerDependencies": {
+ "vue": "^3.2.0"
+ }
+ },
+ "node_modules/entities": {
+ "version": "4.5.0",
+ "license": "BSD-2-Clause",
+ "peer": true,
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "2.0.2",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/hookable": {
+ "version": "5.5.3",
+ "license": "MIT"
+ },
+ "node_modules/is-what": {
+ "version": "5.5.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mesqueeb"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "license": "MIT"
+ },
+ "node_modules/lodash-es": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz",
+ "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==",
+ "license": "MIT"
+ },
+ "node_modules/lodash-unified": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/lodash-unified/-/lodash-unified-1.0.3.tgz",
+ "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/lodash-es": "*",
+ "lodash": "*",
+ "lodash-es": "*"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.21",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.5"
+ }
+ },
+ "node_modules/marked": {
+ "version": "2.0.1",
+ "license": "MIT",
+ "bin": {
+ "marked": "bin/marked"
+ },
+ "engines": {
+ "node": ">= 8.16.2"
+ }
+ },
+ "node_modules/memoize-one": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz",
+ "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==",
+ "license": "MIT"
+ },
+ "node_modules/mitt": {
+ "version": "3.0.1",
+ "license": "MIT"
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.11",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "peer": true,
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/normalize-wheel-es": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz",
+ "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/perfect-debounce": {
+ "version": "1.0.0",
+ "license": "MIT"
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "license": "ISC",
+ "peer": true
+ },
+ "node_modules/pinia": {
+ "version": "3.0.3",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/devtools-api": "^7.7.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/posva"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.4.4",
+ "vue": "^2.7.0 || ^3.5.11"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/pinia-plugin-persistedstate": {
+ "version": "4.5.0",
+ "license": "MIT",
+ "dependencies": {
+ "deep-pick-omit": "^1.2.1",
+ "defu": "^6.1.4",
+ "destr": "^2.0.5"
+ },
+ "peerDependencies": {
+ "@nuxt/kit": ">=3.0.0",
+ "@pinia/nuxt": ">=0.10.0",
+ "pinia": ">=3.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@nuxt/kit": {
+ "optional": true
+ },
+ "@pinia/nuxt": {
+ "optional": true
+ },
+ "pinia": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.6",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "nanoid": "^3.3.11",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/rfdc": {
+ "version": "1.4.1",
+ "license": "MIT"
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/speakingurl": {
+ "version": "14.0.1",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/superjson": {
+ "version": "2.2.3",
+ "license": "MIT",
+ "dependencies": {
+ "copy-anything": "^4"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/vue": {
+ "version": "3.5.22",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@vue/compiler-dom": "3.5.22",
+ "@vue/compiler-sfc": "3.5.22",
+ "@vue/runtime-dom": "3.5.22",
+ "@vue/server-renderer": "3.5.22",
+ "@vue/shared": "3.5.22"
+ },
+ "peerDependencies": {
+ "typescript": "*"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vue-i18n": {
+ "version": "9.14.5",
+ "resolved": "https://registry.npmmirror.com/vue-i18n/-/vue-i18n-9.14.5.tgz",
+ "integrity": "sha512-0jQ9Em3ymWngyiIkj0+c/k7WgaPO+TNzjKSNq9BvBQaKJECqn9cd9fL4tkDhB5G1QBskGl9YxxbDAhgbFtpe2g==",
+ "license": "MIT",
+ "dependencies": {
+ "@intlify/core-base": "9.14.5",
+ "@intlify/shared": "9.14.5",
+ "@vue/devtools-api": "^6.5.0"
+ },
+ "engines": {
+ "node": ">= 16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/kazupon"
+ },
+ "peerDependencies": {
+ "vue": "^3.0.0"
+ }
+ },
+ "node_modules/vue-i18n/node_modules/@vue/devtools-api": {
+ "version": "6.6.4",
+ "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.6.4.tgz",
+ "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==",
+ "license": "MIT"
+ }
+ }
+}
diff --git a/package.json b/package.json
index 295bace..6f2aeb3 100644
--- a/package.json
+++ b/package.json
@@ -1,10 +1,12 @@
{
"dependencies": {
- "json-server": "^1.0.0-beta.3",
+ "@dcloudio/uni-ui": "^1.5.11",
+ "@element-plus/icons-vue": "^2.3.2",
+ "element-plus": "^2.11.5",
+ "vue-i18n": "^9.14.5",
"marked": "^2.0.1",
"pinia": "^3.0.3",
- "pinia-plugin-persistedstate": "^4.5.0",
- "vue-i18n": "^11.1.12"
+ "pinia-plugin-persistedstate": "^4.5.0"
}
diff --git a/pages.json b/pages.json
index be5a306..b341734 100644
--- a/pages.json
+++ b/pages.json
@@ -1,4 +1,7 @@
{
+ "easycom": {
+ "^uni-(.*)": "@dcloudio/uni-ui/lib/uni-$1/uni-$1.vue"
+ },
"pages": [{
"path": "pages/start/startup/startup",
"style": {
@@ -150,10 +153,118 @@
}
},
{
- "path" : "pages/deepMate/scroll/scroll",
+ "path": "pages/setting/general",
+ "style": {
+ "navigationBarTitleText": "通用设置"
+ }
+ },
+ {
+ "path": "pages/setting/font",
+ "style": {
+ "navigationBarTitleText": "字体大小"
+ }
+ },
+ {
+ "path": "pages/setting/theme",
+ "style": {
+ "navigationBarTitleText": "主题切换"
+ }
+ },
+ {
+ "path": "pages/setting/message",
+ "style": {
+ "navigationBarTitleText": "消息推送"
+ }
+ },
+ {
+ "path": "pages/setting/push",
+ "style": {
+ "navigationBarTitleText": "推送设置"
+ }
+ },
+ {
+ "path": "pages/setting/server",
+ "style": {
+ "navigationBarTitleText": "选择服务器"
+ }
+ },
+ {
+ "path": "pages/setting/market",
+ "style": {
+ "navigationBarTitleText": "行情设置"
+ }
+ },
+ {
+ "path": "pages/setting/account",
+ "style": {
+ "navigationBarTitleText": "账号与安全"
+ }
+ },
+ {
+ "path": "pages/setting/newVersion",
+ "style": {
+ "navigationBarTitleText": "新版本更新"
+ }
+ },
+ {
+ "path": "pages/setting/about",
+ "style": {
+ "navigationBarTitleText": "关于DeepChart"
+ }
+ },
+ {
+ "path": "pages/setting/introduce",
+ "style": {
+ "navigationBarTitleText": "产品介绍"
+ }
+ },
+ {
+ "path": "pages/setting/bind",
+ "style": {
+ "navigationBarTitleText": "绑定账号"
+ }
+ },
+ {
+ "path": "pages/setting/phone",
+ "style": {
+ "navigationBarTitleText": "绑定账号"
+ // 其实是绑定手机号
+ }
+ },
+ {
+ "path": "pages/setting/email",
+ "style": {
+ "navigationBarTitleText": "绑定账号"
+ // 其实是绑定邮箱
+ }
+ },
+ {
+ "path": "pages/setting/password",
+ "style":
+ {
+ "navigationBarTitleText": "修改密码"
+ }
+ },
+ {
+ "path" : "pages/setting/nextPwd",
+ "style" :
+ {
+ "navigationBarTitleText" : "修改密码"
+ }
+ },
+ {
+ "path" : "pages/setting/share",
+ "style" :
+ {
+ "navigationBarTitleText" : "分享领取奖励"
+ }
+ },
+ {
+ "path" : "pages/home/marketCondition",
"style" :
{
- "navigationBarTitleText" : ""
+ "navigationBarTitleText" : "行情",
+ "navigationStyle": "custom"
}
}
],
diff --git a/pages/deepMate/deepMate.vue b/pages/deepMate/deepMate.vue
index b3e99e3..c75f4d3 100644
--- a/pages/deepMate/deepMate.vue
+++ b/pages/deepMate/deepMate.vue
@@ -3,18 +3,29 @@
-->
-
-
+
-->
+
+
+
+
+
+ 暂无历史记录
+
+
+ {{ section.title }}
+
+
+ 🇺🇸
+
+
+ {{ item.stockName }}
+ ({{ item.stockCode }})
+
+ {{ item.createdTime }}
+
+
+
+
@@ -206,7 +320,12 @@ import { ref, computed, onMounted, onUnmounted, watch, nextTick } from "vue";
import footerBar from "../../components/footerBar";
import marked from "marked"; // 引入 marked 库
import { onPageScroll } from "@dcloudio/uni-app";
-import { postStock, postIntent } from "../../api/deepMate/deepMate";
+import {
+ postStock,
+ postIntent,
+ postHistory,
+ postHistoryDetail,
+} from "../../api/deepMate/deepMate";
// 设置 marked 选项
marked.setOptions({
renderer: new marked.Renderer(),
@@ -237,6 +356,7 @@ const messages = ref([]);
const showHistoryDrawer = ref(false);
const drawerOffsetY = ref(0);
const searchHistory = ref([]);
+const historyList = ref([]);
const hotTopics = ref([
{
id: 1,
@@ -289,7 +409,7 @@ onMounted(() => {
// 缓存今天日期(YYYY-MM-DD)
const todayStr = new Date().toISOString().slice(0, 10);
- uni.setStorageSync('today_date', todayStr);
+ uni.setStorageSync("today_date", todayStr);
});
// 初始化 UUID
@@ -336,12 +456,26 @@ const goBlank = () => {
// 历史抽屉控制
const openHistoryDrawer = () => {
+ const res = postHistory({
+ model: 5,
+ });
+
+ if (res.code === 200) {
+ historyList.value = res.data;
+ }
+
+ console.log("historyList.value", historyList.value);
+
const hideDistance = uni.upx2px(900);
drawerOffsetY.value = hideDistance;
showHistoryDrawer.value = true;
- setTimeout(() => { drawerOffsetY.value = 0; }, 10);
+ setTimeout(() => {
+ drawerOffsetY.value = 0;
+ }, 10);
+};
+const closeHistoryDrawer = () => {
+ showHistoryDrawer.value = false;
};
-const closeHistoryDrawer = () => { showHistoryDrawer.value = false; };
const onDrawerBackClick = () => {
const hideDistance = uni.upx2px(900);
drawerOffsetY.value = hideDistance;
@@ -363,65 +497,65 @@ const formatTime = (t) => {
return `${y}-${m}-${day} ${hh}:${mm}`;
};
-// 历史分组(今天/昨天/近一周/按月)
-const groupedHistory = computed(() => {
- const sections = [];
-
- // 从缓存获取今天日期,如果没有则使用当前日期
- const cachedTodayStr = uni.getStorageSync('today_date');
- const now = cachedTodayStr ? new Date(cachedTodayStr + 'T00:00:00') : new Date();
-
- const startOfDay = (d) => new Date(d.getFullYear(), d.getMonth(), d.getDate());
- const isSameDay = (a, b) => startOfDay(a).getTime() === startOfDay(b).getTime();
- const isYesterday = (d) => {
- const y = new Date(now.getFullYear(), now.getMonth(), now.getDate() - 1);
- return isSameDay(d, y);
- };
- const isToday = (d) => isSameDay(d, now);
- const withinLast7Days = (d) => {
- const seven = new Date(now.getFullYear(), now.getMonth(), now.getDate() - 7);
- return d >= seven && !isToday(d) && !isYesterday(d);
- };
- const monthLabel = (d) => `${d.getMonth() + 1}月`;
-
- const today = [];
- const yesterday = [];
- const last7 = [];
- const byMonth = new Map();
-
- searchHistory.value.forEach((item) => {
- const dt = new Date(item.time);
- if (isToday(dt)) {
- today.push(item);
- } else if (isYesterday(dt)) {
- yesterday.push(item);
- } else if (withinLast7Days(dt)) {
- last7.push(item);
- } else {
- const year = dt.getFullYear();
- const month = dt.getMonth() + 1;
- const key = `${year}-${month}`;
- if (!byMonth.has(key)) byMonth.set(key, { title: `${month}月`, year, month, items: [] });
- byMonth.get(key).items.push(item);
- }
- });
-
- if (today.length) sections.push({ title: '今天', items: today });
- if (yesterday.length) sections.push({ title: '昨天', items: yesterday });
- if (last7.length) sections.push({ title: '近一周', items: last7 });
-
- const monthSections = Array.from(byMonth.values()).sort((a, b) => {
- if (a.year !== b.year) return b.year - a.year;
- return b.month - a.month; // 月份倒序,如 10月 在 9月 之前
- });
- sections.push(...monthSections);
-
- return sections;
-});
+// // 历史分组(今天/昨天/近一周/按月)
+// const groupedHistory = computed(() => {
+// const sections = [];
+
+// // 从缓存获取今天日期,如果没有则使用当前日期
+// const cachedTodayStr = uni.getStorageSync('today_date');
+// const now = cachedTodayStr ? new Date(cachedTodayStr + 'T00:00:00') : new Date();
+
+// const startOfDay = (d) => new Date(d.getFullYear(), d.getMonth(), d.getDate());
+// const isSameDay = (a, b) => startOfDay(a).getTime() === startOfDay(b).getTime();
+// const isYesterday = (d) => {
+// const y = new Date(now.getFullYear(), now.getMonth(), now.getDate() - 1);
+// return isSameDay(d, y);
+// };
+// const isToday = (d) => isSameDay(d, now);
+// const withinLast7Days = (d) => {
+// const seven = new Date(now.getFullYear(), now.getMonth(), now.getDate() - 7);
+// return d >= seven && !isToday(d) && !isYesterday(d);
+// };
+// const monthLabel = (d) => `${d.getMonth() + 1}月`;
+
+// const today = [];
+// const yesterday = [];
+// const last7 = [];
+// const byMonth = new Map();
+
+// searchHistory.value.forEach((item) => {
+// const dt = new Date(item.time);
+// if (isToday(dt)) {
+// today.push(item);
+// } else if (isYesterday(dt)) {
+// yesterday.push(item);
+// } else if (withinLast7Days(dt)) {
+// last7.push(item);
+// } else {
+// const year = dt.getFullYear();
+// const month = dt.getMonth() + 1;
+// const key = `${year}-${month}`;
+// if (!byMonth.has(key)) byMonth.set(key, { title: `${month}月`, year, month, items: [] });
+// byMonth.get(key).items.push(item);
+// }
+// });
+
+// if (today.length) sections.push({ title: '今天', items: today });
+// if (yesterday.length) sections.push({ title: '昨天', items: yesterday });
+// if (last7.length) sections.push({ title: '近一周', items: last7 });
+
+// const monthSections = Array.from(byMonth.values()).sort((a, b) => {
+// if (a.year !== b.year) return b.year - a.year;
+// return b.month - a.month; // 月份倒序,如 10月 在 9月 之前
+// });
+// sections.push(...monthSections);
+
+// return sections;
+// });
const clearAllHistory = () => {
searchHistory.value = [];
- uni.setStorageSync('search_history', []);
+ uni.setStorageSync("search_history", []);
};
// 发送消息
@@ -465,7 +599,6 @@ const simulateBotResponse = async (userMessage) => {
messages.value.push(botMsg);
- await new Promise((resolve) => setTimeout(resolve, 2000));
isSending.value = true;
// 首先进行意图识别
@@ -488,7 +621,6 @@ const simulateBotResponse = async (userMessage) => {
const parentId = res.data.parentId;
const stockId = res.data.stockId;
- await new Promise((resolve) => setTimeout(resolve, 2000));
// 获取股票信息
const StockInfo = await postStock({
language: 'cn',
@@ -550,8 +682,8 @@ const simulateBotResponse = async (userMessage) => {
const delay = slowPunct.test(ch)
? 220
: midPunct.test(ch)
- ? 120
- : baseDelay;
+ ? 120
+ : baseDelay;
setTimeout(typeWriter, delay);
} else {
const current = messages.value[botIndex];
@@ -698,6 +830,27 @@ const onBackTopClick = () => {
if (backTopDragging.value) return; // 拖拽时不触发点击回到顶部
scrollToTop();
};
+
+// 历史记录详情
+async function itemClick(item) {
+ const res = await postHistoryDetail({
+ recordId: item.id,
+ parentId: item.parentId,
+ model: 5,
+ });
+
+ if (res.code == 200) {
+ const message = res.data.wokeFlowData.One.markdown;
+ messages.value = [];
+ const botMsg = {
+ content: message,
+ isUser: false,
+ isTyping: false,
+ isThinking: false,
+ };
+ messages.value.push(botMsg);
+ }
+}
\ No newline at end of file
diff --git a/pages/home/globalIndex.vue b/pages/home/globalIndex.vue
new file mode 100644
index 0000000..f624da9
--- /dev/null
+++ b/pages/home/globalIndex.vue
@@ -0,0 +1,579 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/home/marketCondition.vue b/pages/home/marketCondition.vue
new file mode 100644
index 0000000..413d700
--- /dev/null
+++ b/pages/home/marketCondition.vue
@@ -0,0 +1,2046 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ stockInformation.stockName }}
+ {{ stockInformation.stockCode }}
+
+
+
+
+ ···
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.title }}
+
+
+ {{ item.value }}
+
+
+
+
+
+
+ {{ item.title }}
+
+
+ {{ item.value }}
+
+
+
+
+
+
+
+ {{ Number(stockInformation.currentPrice).toFixed(2) }}
+
+
+
+ {{ Number(stockInformation.currentValue).toFixed(2) }}
+
+ {{ Number(stockInformation.currentRatio).toFixed(2) }}%
+
+
+
+
+
+ 高
+
+ {{ Number(stockInformation.highPrice).toFixed(2) }}
+
+
+
+
+ 量
+
+ {{ utils.formatStockNumber(stockInformation.volume, 2) }}
+
+
+
+ 量比
+
+ {{ Number(stockInformation.volumeRatio).toFixed(2) }}
+
+
+
+
+
+ 低
+
+ {{ Number(stockInformation.lowPrice).toFixed(2) }}
+
+
+
+ 额
+
+ {{ utils.formatStockNumber(stockInformation.amount, 2) }}
+
+
+
+ 市盈
+
+ {{ Number(stockInformation.marketEarn).toFixed(2) }}
+
+
+
+
+
+ 开
+
+ {{ Number(stockInformation.openPrice).toFixed(2) }}
+
+
+
+ 换
+ {{ Number(stockInformation.turnoverRatio).toFixed(2) }}%
+
+
+ 市值
+
+ {{ utils.formatStockNumber(stockInformation.marketValue, 2) }}
+
+
+
+
+
+
+
+
+
+ 分时
+ 日K
+ 周K
+ 月K
+
+ 更多
+
+ {{ chooseTabName(klineTab) }}
+
+
+
+
+
+
+
+
+
+ {{ item.title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ K线图开发中...
+
+
+
+
+
+
+
+
+ 指标仓库
+
+
+
+ 功能
+
+
+
+ 加自选
+
+
+
+
+
+
+
+
diff --git a/pages/home/marketDetail.vue b/pages/home/marketDetail.vue
new file mode 100644
index 0000000..d3acf86
--- /dev/null
+++ b/pages/home/marketDetail.vue
@@ -0,0 +1,488 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ stock.stockName }}
+ {{ stock.stockCode }}
+
+
+
+ {{ typeof stock.price === "number" ? stock.price.toFixed(2) : stock.price }}
+
+
+
+
+ {{ stock.change || stock.changePercent }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/home/marketSituation.vue b/pages/home/marketSituation.vue
index b28b7f6..14f8b75 100644
--- a/pages/home/marketSituation.vue
+++ b/pages/home/marketSituation.vue
@@ -1,28 +1,920 @@
+
+
-
-
-
- 行情
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t("marketSituation.globalIndex") }}
+
+
+ {{ $t("marketSituation.globalIndexMore") }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t("marketSituation.warn") }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ country }}
+
+
+
+
+
\ No newline at end of file
+
diff --git a/pages/home/member.vue b/pages/home/member.vue
index 6851292..4805ac3 100644
--- a/pages/home/member.vue
+++ b/pages/home/member.vue
@@ -1,28 +1,294 @@
-
-
- 我的
+
+
+
+
+
+
+
+
+
+
+ {{ username }}
+
+
+ ID:{{ dccode }}
+
+
+
+ 签到
+
+
+
+
+
+
+ 行情设置
+
+
+
+ 通用设置
+
+
+
+
+
+
+
+
+
+
+ 账号与安全
+
+
+
+
+ 联系我们
+
+
+
+
+ 新版本更新
+ 有新版本可更新
+
+
+
+
+
+
+ 意见反馈
+
+
+
+
+ 关于DeepChart
+
+
+
\ No newline at end of file
diff --git a/pages/morningMarketAnalysis/morningMarketAnalysis.vue b/pages/morningMarketAnalysis/morningMarketAnalysis.vue
new file mode 100644
index 0000000..d6e5f63
--- /dev/null
+++ b/pages/morningMarketAnalysis/morningMarketAnalysis.vue
@@ -0,0 +1,22 @@
+
+
+ 早盘解析页面
+
+
+
+
+
+
diff --git a/pages/setting/about.vue b/pages/setting/about.vue
new file mode 100644
index 0000000..d8146b1
--- /dev/null
+++ b/pages/setting/about.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+ 产品介绍
+
+
+
+ 免责声明
+
+
+
+ 隐私政策
+
+
+
+ 服务协议
+
+
+
+ 鼓励一下
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/setting/account.vue b/pages/setting/account.vue
new file mode 100644
index 0000000..5dd5a60
--- /dev/null
+++ b/pages/setting/account.vue
@@ -0,0 +1,213 @@
+
+
+
+
+
+
+
+
+ 头像
+
+
+
+
+
+
+ 昵称
+
+ DeepChart
+
+
+
+
+ ID
+
+ {{ jwcode }}
+
+
+
+
+ 密码
+
+ qwertyuiop
+
+
+
+
+ 修改密码
+
+
+
+ 注销账号
+
+
+
+ 绑定账号
+
+
+
+
+
+
+
+ 退出登录
+
+
+
+
+ 是否退出登录
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/setting/bind.vue b/pages/setting/bind.vue
new file mode 100644
index 0000000..5a221cc
--- /dev/null
+++ b/pages/setting/bind.vue
@@ -0,0 +1,85 @@
+
+
+
+
+
+
+
+
+ 手机号
+
+ 未绑定
+
+
+
+
+
+ 邮箱
+
+ analsak@163.com
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/setting/email.vue b/pages/setting/email.vue
new file mode 100644
index 0000000..b3016f6
--- /dev/null
+++ b/pages/setting/email.vue
@@ -0,0 +1,142 @@
+
+
+
+
+
+
+
+
+
+
+ 已绑邮箱:{{ email }}
+
+
+
+
+
+
+ +86
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/setting/font.vue b/pages/setting/font.vue
new file mode 100644
index 0000000..357739f
--- /dev/null
+++ b/pages/setting/font.vue
@@ -0,0 +1,68 @@
+
+
+
+
+
+ 标准
+
+
+
+ 中号
+
+
+
+ 大号
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/setting/general.vue b/pages/setting/general.vue
new file mode 100644
index 0000000..cbf21c0
--- /dev/null
+++ b/pages/setting/general.vue
@@ -0,0 +1,165 @@
+
+
+
+
+
+ 语言
+ 中文(简体)
+
+
+
+ 字体大小
+
+
+
+ 主题切换
+
+
+
+
+
+
+
+ 消息推送
+
+
+
+
+
+
+ 切换服务器
+
+
+
+ 清理缓存
+ {{ cache }}M
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/setting/introduce.vue b/pages/setting/introduce.vue
new file mode 100644
index 0000000..ff98778
--- /dev/null
+++ b/pages/setting/introduce.vue
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+
+
+
+ 1.产品定位
+ DeepChart:全球最懂机构行为的AI(你的AI投资伙伴)强化"深度分析"
+ 的品牌标签(DeepChart=全球最懂机构行为的AI),主打"深度解读机构行为"的APP。
+
+ 2.产品介绍
+ DeepChart是一款以"Al智能体”为决策核心的智能投资分析平台,
+ 专注于深度研究机构行为,专为全球散户投资者量身打造。它重新定义了人与投资工具之间的关系,
+ 是一个真正懂投资、懂市场、更懂用户的AI投资伙伴。
+
+ 3.产品理念
+ 从“人找信息”到“AI智能体替你思考和管理”。
+
+ 4.功能定位——全景AI决策体系
+ 黄其振是大笨蛋
+ 李建霖是大笨蛋
+ double是大笨蛋
+ 张鲁平是大笨蛋
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/setting/market.vue b/pages/setting/market.vue
new file mode 100644
index 0000000..f25dcf7
--- /dev/null
+++ b/pages/setting/market.vue
@@ -0,0 +1,221 @@
+
+
+
+
+
+ 分时设计
+
+
+ A股竞价
+
+
+ 智能开启
+
+
+
+ 保持开启
+
+
+
+
+ 保持关闭
+
+
+
+
+ K线样式
+
+
+
+ 普通
+
+
+
+
+ 轮廓图
+
+
+
+
+ 折线图
+
+
+
+
+ 除权类型
+
+
+ 除权
+
+
+
+ 普通
+
+
+
+ 加权
+
+
+
+
+ 涨跌颜色
+
+
+
+
+
+ 绿涨红跌
+
+
+
+
+
+
+ 红涨绿跌
+
+
+
+
+ 副图指标个数
+
+
+ 1
+
+
+ 2
+
+
+ 3
+
+
+
+
+
+ 指标设置
+
+
+
+ {{ item }}
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/setting/message.vue b/pages/setting/message.vue
new file mode 100644
index 0000000..b40720b
--- /dev/null
+++ b/pages/setting/message.vue
@@ -0,0 +1,62 @@
+
+
+
+
+
+ 语言
+ 通知已开启
+ 通知未开启
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/setting/newVersion.vue b/pages/setting/newVersion.vue
new file mode 100644
index 0000000..95ac0e9
--- /dev/null
+++ b/pages/setting/newVersion.vue
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+ 已有新版本
+ 已是最新版本
+
+ {{ version }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/setting/nextPwd.vue b/pages/setting/nextPwd.vue
new file mode 100644
index 0000000..e55d771
--- /dev/null
+++ b/pages/setting/nextPwd.vue
@@ -0,0 +1,144 @@
+
+
+
+
+
+
+
+ 确认新密码
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 密码最少8位数
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/setting/password.vue b/pages/setting/password.vue
new file mode 100644
index 0000000..fec980a
--- /dev/null
+++ b/pages/setting/password.vue
@@ -0,0 +1,171 @@
+
+
+
+
+
+ 邮箱
+ 手机号
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/setting/phone.vue b/pages/setting/phone.vue
new file mode 100644
index 0000000..c33bddb
--- /dev/null
+++ b/pages/setting/phone.vue
@@ -0,0 +1,143 @@
+
+
+
+
+
+
+
+
+
+
+ 已绑手机号:{{ phone }}
+
+
+
+
+
+
+ +86
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/setting/push.vue b/pages/setting/push.vue
new file mode 100644
index 0000000..2aaecf4
--- /dev/null
+++ b/pages/setting/push.vue
@@ -0,0 +1,108 @@
+
+
+
+
+
+ 公共消息
+ 重大咨询、财经要闻等系统提醒
+
+
+
+ 字体大小
+
+
+
+
+
+
+ 盯盘预警
+
+
+
+ 订阅服务
+ 45.5M
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/setting/server.vue b/pages/setting/server.vue
new file mode 100644
index 0000000..044d6aa
--- /dev/null
+++ b/pages/setting/server.vue
@@ -0,0 +1,87 @@
+
+
+
+
+
+ 自动选择
+
+
+
+ 新加坡服务器
+
+
+
+ 香港服务器
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/setting/share.vue b/pages/setting/share.vue
new file mode 100644
index 0000000..78bf6f8
--- /dev/null
+++ b/pages/setting/share.vue
@@ -0,0 +1,111 @@
+
+
+
+
+
+
+
+
+ {{ jwcode }}
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/setting/theme.vue b/pages/setting/theme.vue
new file mode 100644
index 0000000..3752eab
--- /dev/null
+++ b/pages/setting/theme.vue
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/start/login/login.vue b/pages/start/login/login.vue
index 2cefada..670af71 100644
--- a/pages/start/login/login.vue
+++ b/pages/start/login/login.vue
@@ -308,7 +308,7 @@ function showCountryPicker() {
function goToIndex() {
// 返回上一页
uni.navigateTo({
- url: "/pages/start/index/index",
+ url: "/pages/home/home",
});
}
diff --git a/static/marketSituation-image/back.png b/static/marketSituation-image/back.png
new file mode 100644
index 0000000..a852107
Binary files /dev/null and b/static/marketSituation-image/back.png differ
diff --git a/static/marketSituation-image/bg.png b/static/marketSituation-image/bg.png
new file mode 100644
index 0000000..062b84d
Binary files /dev/null and b/static/marketSituation-image/bg.png differ
diff --git a/static/marketSituation-image/history.png b/static/marketSituation-image/history.png
new file mode 100644
index 0000000..82efc54
Binary files /dev/null and b/static/marketSituation-image/history.png differ
diff --git a/static/marketSituation-image/map.png b/static/marketSituation-image/map.png
new file mode 100644
index 0000000..90029ed
Binary files /dev/null and b/static/marketSituation-image/map.png differ
diff --git a/static/marketSituation-image/marketCondition-image/favorites.png b/static/marketSituation-image/marketCondition-image/favorites.png
new file mode 100644
index 0000000..0143bf6
Binary files /dev/null and b/static/marketSituation-image/marketCondition-image/favorites.png differ
diff --git a/static/marketSituation-image/marketCondition-image/function.png b/static/marketSituation-image/marketCondition-image/function.png
new file mode 100644
index 0000000..48cf5e0
Binary files /dev/null and b/static/marketSituation-image/marketCondition-image/function.png differ
diff --git a/static/marketSituation-image/marketCondition-image/index.png b/static/marketSituation-image/marketCondition-image/index.png
new file mode 100644
index 0000000..c422f41
Binary files /dev/null and b/static/marketSituation-image/marketCondition-image/index.png differ
diff --git a/static/marketSituation-image/marketCondition-image/setting2.png b/static/marketSituation-image/marketCondition-image/setting2.png
new file mode 100644
index 0000000..3e67210
Binary files /dev/null and b/static/marketSituation-image/marketCondition-image/setting2.png differ
diff --git a/static/marketSituation-image/menu.png b/static/marketSituation-image/menu.png
new file mode 100644
index 0000000..b515eb6
Binary files /dev/null and b/static/marketSituation-image/menu.png differ
diff --git a/static/marketSituation-image/more.png b/static/marketSituation-image/more.png
new file mode 100644
index 0000000..1334d4f
Binary files /dev/null and b/static/marketSituation-image/more.png differ
diff --git a/static/marketSituation-image/mySeclected.png b/static/marketSituation-image/mySeclected.png
new file mode 100644
index 0000000..8674930
Binary files /dev/null and b/static/marketSituation-image/mySeclected.png differ
diff --git a/static/marketSituation-image/search.png b/static/marketSituation-image/search.png
new file mode 100644
index 0000000..331c94a
Binary files /dev/null and b/static/marketSituation-image/search.png differ
diff --git a/static/marketSituation-image/warn.png b/static/marketSituation-image/warn.png
new file mode 100644
index 0000000..d59a5c0
Binary files /dev/null and b/static/marketSituation-image/warn.png differ
diff --git a/static/my/BlackTheme.png b/static/my/BlackTheme.png
new file mode 100644
index 0000000..b495312
Binary files /dev/null and b/static/my/BlackTheme.png differ
diff --git a/static/my/Check-in.png b/static/my/Check-in.png
new file mode 100644
index 0000000..a2230ef
Binary files /dev/null and b/static/my/Check-in.png differ
diff --git a/static/my/MarketSettings.png b/static/my/MarketSettings.png
new file mode 100644
index 0000000..43fc5ea
Binary files /dev/null and b/static/my/MarketSettings.png differ
diff --git a/static/my/QRcode.png b/static/my/QRcode.png
new file mode 100644
index 0000000..eac1373
Binary files /dev/null and b/static/my/QRcode.png differ
diff --git a/static/my/Settings.png b/static/my/Settings.png
new file mode 100644
index 0000000..1f9f721
Binary files /dev/null and b/static/my/Settings.png differ
diff --git a/static/my/about.png b/static/my/about.png
new file mode 100644
index 0000000..5fdf993
Binary files /dev/null and b/static/my/about.png differ
diff --git a/static/my/aboutDC.png b/static/my/aboutDC.png
new file mode 100644
index 0000000..8118e30
Binary files /dev/null and b/static/my/aboutDC.png differ
diff --git a/static/my/award.png b/static/my/award.png
new file mode 100644
index 0000000..a532dcb
Binary files /dev/null and b/static/my/award.png differ
diff --git a/static/my/bell.png b/static/my/bell.png
new file mode 100644
index 0000000..3d4c8de
Binary files /dev/null and b/static/my/bell.png differ
diff --git a/static/my/bindedEmail.png b/static/my/bindedEmail.png
new file mode 100644
index 0000000..45899c1
Binary files /dev/null and b/static/my/bindedEmail.png differ
diff --git a/static/my/bindedPhone.png b/static/my/bindedPhone.png
new file mode 100644
index 0000000..4f372e2
Binary files /dev/null and b/static/my/bindedPhone.png differ
diff --git a/static/my/changeBindPhone.png b/static/my/changeBindPhone.png
new file mode 100644
index 0000000..823c93b
Binary files /dev/null and b/static/my/changeBindPhone.png differ
diff --git a/static/my/changeEmail.png b/static/my/changeEmail.png
new file mode 100644
index 0000000..801e0a2
Binary files /dev/null and b/static/my/changeEmail.png differ
diff --git a/static/my/common.png b/static/my/common.png
new file mode 100644
index 0000000..ca6a8c7
Binary files /dev/null and b/static/my/common.png differ
diff --git a/static/my/connection.png b/static/my/connection.png
new file mode 100644
index 0000000..049d1cb
Binary files /dev/null and b/static/my/connection.png differ
diff --git a/static/my/editName.png b/static/my/editName.png
new file mode 100644
index 0000000..6ed705c
Binary files /dev/null and b/static/my/editName.png differ
diff --git a/static/my/greenBackground.png b/static/my/greenBackground.png
new file mode 100644
index 0000000..658fb02
Binary files /dev/null and b/static/my/greenBackground.png differ
diff --git a/static/my/greenRise.png b/static/my/greenRise.png
new file mode 100644
index 0000000..e313b65
Binary files /dev/null and b/static/my/greenRise.png differ
diff --git a/static/my/hideEye.png b/static/my/hideEye.png
new file mode 100644
index 0000000..cf3a11a
Binary files /dev/null and b/static/my/hideEye.png differ
diff --git a/static/my/invite.png b/static/my/invite.png
new file mode 100644
index 0000000..b547c5f
Binary files /dev/null and b/static/my/invite.png differ
diff --git a/static/my/menu.png b/static/my/menu.png
new file mode 100644
index 0000000..687e071
Binary files /dev/null and b/static/my/menu.png differ
diff --git a/static/my/myFriends.png b/static/my/myFriends.png
new file mode 100644
index 0000000..c5ef069
Binary files /dev/null and b/static/my/myFriends.png differ
diff --git a/static/my/openEye.png b/static/my/openEye.png
new file mode 100644
index 0000000..b2386f0
Binary files /dev/null and b/static/my/openEye.png differ
diff --git a/static/my/opinion.png b/static/my/opinion.png
new file mode 100644
index 0000000..4de5f40
Binary files /dev/null and b/static/my/opinion.png differ
diff --git a/static/my/outline.png b/static/my/outline.png
new file mode 100644
index 0000000..8c439d1
Binary files /dev/null and b/static/my/outline.png differ
diff --git a/static/my/polylines.png b/static/my/polylines.png
new file mode 100644
index 0000000..6a42e0e
Binary files /dev/null and b/static/my/polylines.png differ
diff --git a/static/my/redRise.png b/static/my/redRise.png
new file mode 100644
index 0000000..3a2a436
Binary files /dev/null and b/static/my/redRise.png differ
diff --git a/static/my/security.png b/static/my/security.png
new file mode 100644
index 0000000..c655f5e
Binary files /dev/null and b/static/my/security.png differ
diff --git a/static/my/setting.png b/static/my/setting.png
new file mode 100644
index 0000000..5799ac4
Binary files /dev/null and b/static/my/setting.png differ
diff --git a/static/my/share.png b/static/my/share.png
new file mode 100644
index 0000000..69029e6
Binary files /dev/null and b/static/my/share.png differ
diff --git a/static/my/shareBackground.png b/static/my/shareBackground.png
new file mode 100644
index 0000000..1e48fb7
Binary files /dev/null and b/static/my/shareBackground.png differ
diff --git a/static/my/shareFriends.png b/static/my/shareFriends.png
new file mode 100644
index 0000000..0977973
Binary files /dev/null and b/static/my/shareFriends.png differ
diff --git a/static/my/unlock.png b/static/my/unlock.png
new file mode 100644
index 0000000..0bdf2ba
Binary files /dev/null and b/static/my/unlock.png differ
diff --git a/static/my/update.png b/static/my/update.png
new file mode 100644
index 0000000..550d529
Binary files /dev/null and b/static/my/update.png differ
diff --git a/static/my/verification.png b/static/my/verification.png
new file mode 100644
index 0000000..96ea5cd
Binary files /dev/null and b/static/my/verification.png differ
diff --git a/static/my/whiteTheme.png b/static/my/whiteTheme.png
new file mode 100644
index 0000000..4cec8d7
Binary files /dev/null and b/static/my/whiteTheme.png differ
diff --git a/utils/http.js b/utils/http.js
index 6048348..a446baf 100644
--- a/utils/http.js
+++ b/utils/http.js
@@ -1,6 +1,6 @@
import { useUserStore } from "../stores/modules/userInfo"
-const baseURL = "https://hwjb.homilychart.com"
+const baseURL = "https://hwjb.homilychart.com/testApi"
const httpInterceptor = {